aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--.travis.yml8
-rw-r--r--CHANGELOG98
-rw-r--r--Zotlabs/Access/PermissionLimits.php2
-rw-r--r--Zotlabs/Access/Permissions.php159
-rw-r--r--Zotlabs/Daemon/Cron.php3
-rw-r--r--Zotlabs/Daemon/Cron_daily.php3
-rwxr-xr-xZotlabs/Daemon/Importdoc.php14
-rw-r--r--Zotlabs/Daemon/Notifier.php158
-rw-r--r--Zotlabs/Extend/Hook.php9
-rw-r--r--Zotlabs/Lib/ActivityStreams2.php86
-rw-r--r--Zotlabs/Lib/Apps.php125
-rw-r--r--Zotlabs/Lib/Cache.php12
-rw-r--r--Zotlabs/Lib/Config.php2
-rw-r--r--Zotlabs/Lib/DB_Upgrade.php8
-rw-r--r--Zotlabs/Lib/Enotify.php11
-rw-r--r--Zotlabs/Lib/NativeWikiPage.php2
-rw-r--r--Zotlabs/Lib/PConfig.php2
-rw-r--r--Zotlabs/Lib/System.php16
-rw-r--r--Zotlabs/Lib/Techlevels.php12
-rw-r--r--Zotlabs/Lib/ThreadItem.php19
-rw-r--r--Zotlabs/Lib/ThreadStream.php3
-rw-r--r--Zotlabs/Module/Acl.php4
-rw-r--r--Zotlabs/Module/Admin.php25
-rw-r--r--Zotlabs/Module/Admin/Site.php10
-rw-r--r--Zotlabs/Module/Ap_probe.php38
-rw-r--r--Zotlabs/Module/Appman.php14
-rw-r--r--Zotlabs/Module/Apporder.php40
-rw-r--r--Zotlabs/Module/Authorize.php71
-rw-r--r--Zotlabs/Module/Block.php2
-rw-r--r--Zotlabs/Module/Bookmarks.php3
-rw-r--r--Zotlabs/Module/Cdav.php1209
-rw-r--r--Zotlabs/Module/Channel.php18
-rw-r--r--Zotlabs/Module/Chanview.php19
-rw-r--r--Zotlabs/Module/Chat.php6
-rw-r--r--Zotlabs/Module/Cloud.php7
-rw-r--r--Zotlabs/Module/Connections.php21
-rw-r--r--Zotlabs/Module/Connedit.php17
-rw-r--r--Zotlabs/Module/Directory.php4
-rw-r--r--Zotlabs/Module/Display.php4
-rw-r--r--Zotlabs/Module/Editpost.php5
-rw-r--r--Zotlabs/Module/Editwebpage.php2
-rw-r--r--Zotlabs/Module/Events.php2
-rw-r--r--Zotlabs/Module/Filestorage.php10
-rw-r--r--Zotlabs/Module/Getfile.php35
-rw-r--r--Zotlabs/Module/Group.php4
-rw-r--r--Zotlabs/Module/Hcard.php2
-rw-r--r--Zotlabs/Module/Help.php76
-rw-r--r--Zotlabs/Module/Import.php7
-rw-r--r--Zotlabs/Module/Invite.php6
-rw-r--r--Zotlabs/Module/Item.php44
-rw-r--r--Zotlabs/Module/Lang.php1
-rw-r--r--Zotlabs/Module/Like.php9
-rw-r--r--Zotlabs/Module/Mail.php76
-rw-r--r--Zotlabs/Module/Manage.php2
-rw-r--r--Zotlabs/Module/Moderate.php76
-rw-r--r--Zotlabs/Module/Mood.php8
-rw-r--r--Zotlabs/Module/Network.php13
-rw-r--r--Zotlabs/Module/New_channel.php2
-rw-r--r--Zotlabs/Module/Oembed.php2
-rw-r--r--Zotlabs/Module/Oep.php4
-rw-r--r--Zotlabs/Module/Page.php60
-rw-r--r--Zotlabs/Module/Photo.php4
-rw-r--r--Zotlabs/Module/Photos.php2
-rw-r--r--Zotlabs/Module/Poke.php34
-rw-r--r--Zotlabs/Module/Probe.php4
-rw-r--r--Zotlabs/Module/Profile.php2
-rw-r--r--Zotlabs/Module/Profile_photo.php2
-rw-r--r--Zotlabs/Module/Profiles.php2
-rw-r--r--Zotlabs/Module/Pubstream.php6
-rw-r--r--Zotlabs/Module/Randprof.php2
-rw-r--r--Zotlabs/Module/React.php4
-rw-r--r--Zotlabs/Module/Register.php10
-rw-r--r--Zotlabs/Module/Rpost.php2
-rw-r--r--Zotlabs/Module/Search.php13
-rw-r--r--Zotlabs/Module/Settings.php2
-rw-r--r--Zotlabs/Module/Settings/Account.php2
-rw-r--r--Zotlabs/Module/Settings/Channel.php3
-rw-r--r--Zotlabs/Module/Settings/Featured.php18
-rw-r--r--Zotlabs/Module/Setup.php42
-rw-r--r--Zotlabs/Module/Share.php2
-rw-r--r--Zotlabs/Module/Sharedwithme.php5
-rw-r--r--Zotlabs/Module/Siteinfo.php7
-rw-r--r--Zotlabs/Module/Siteinfo_json.php14
-rw-r--r--Zotlabs/Module/Suggest.php2
-rw-r--r--Zotlabs/Module/Token.php40
-rw-r--r--Zotlabs/Module/Wall_attach.php65
-rw-r--r--Zotlabs/Module/Webpages.php19
-rw-r--r--Zotlabs/Module/Wfinger.php2
-rw-r--r--Zotlabs/Module/Wiki.php20
-rw-r--r--Zotlabs/Module/Xrd.php19
-rw-r--r--Zotlabs/Storage/BasicAuth.php9
-rw-r--r--Zotlabs/Storage/Browser.php5
-rw-r--r--Zotlabs/Storage/File.php2
-rw-r--r--Zotlabs/Widget/Activity.php2
-rw-r--r--Zotlabs/Widget/Cdav.php176
-rw-r--r--Zotlabs/Widget/Conversations.php10
-rw-r--r--Zotlabs/Widget/Forums.php2
-rw-r--r--Zotlabs/Widget/Portfolio.php108
-rw-r--r--Zotlabs/Widget/Settings_menu.php12
-rw-r--r--Zotlabs/Widget/Tasklist.php4
-rw-r--r--Zotlabs/Widget/Wiki_pages.php10
-rw-r--r--Zotlabs/Zot/Auth.php2
-rw-r--r--app/caldav.apd6
-rw-r--r--app/carddav.apd6
-rw-r--r--app/photos.apd2
-rw-r--r--app/storage.apd2
-rwxr-xr-xboot.php127
-rw-r--r--composer.json9
-rw-r--r--composer.lock743
-rw-r--r--doc/about/about.bb (renamed from doc/about/about_hubzilla.bb)17
-rw-r--r--doc/about/project.bb (renamed from doc/about/hubzilla_project.bb)0
-rw-r--r--doc/addons.bb14
-rw-r--r--doc/admin/administrator_guide.md57
-rw-r--r--doc/bugs.bb21
-rw-r--r--doc/developer/api_zot.bb17
-rw-r--r--doc/hook/author_is_pmable.bb2
-rw-r--r--doc/hook/can_comment_on_post.bb13
-rw-r--r--doc/hook/connection_remove.bb9
-rw-r--r--doc/hook/legal_webbie.bb10
-rw-r--r--doc/hook/legal_webbie_text.bb7
-rw-r--r--doc/hooklist.bb12
-rw-r--r--doc/member/bbcode.html7
-rw-r--r--doc/member/member_guide.bb37
-rw-r--r--doc/toc.html6
-rw-r--r--doc/tutorials/personal_channel.html10
-rw-r--r--images/red-koala.jpgbin0 -> 15832 bytes
-rw-r--r--images/red-koala.pngbin0 -> 14669 bytes
-rw-r--r--images/red-koala.svg151
-rw-r--r--images/red-koala.xcfbin0 -> 21756 bytes
-rw-r--r--include/account.php104
-rw-r--r--include/api.php28
-rw-r--r--include/attach.php261
-rw-r--r--include/bbcode.php100
-rw-r--r--include/channel.php188
-rw-r--r--include/connections.php19
-rw-r--r--include/conversation.php51
-rwxr-xr-xinclude/dba/dba_driver.php26
-rwxr-xr-xinclude/dba/dba_pdo.php14
-rw-r--r--include/event.php72
-rw-r--r--include/features.php23
-rw-r--r--include/feedutils.php836
-rw-r--r--include/follow.php37
-rw-r--r--include/group.php3
-rw-r--r--include/help.php15
-rw-r--r--include/import.php24
-rwxr-xr-xinclude/items.php197
-rw-r--r--include/markdown.php530
-rw-r--r--include/message.php128
-rw-r--r--include/nav.php62
-rw-r--r--include/network.php851
-rw-r--r--include/oauth2.php23
-rwxr-xr-xinclude/oembed.php6
-rw-r--r--include/page_widgets.php52
-rw-r--r--include/permissions.php420
-rw-r--r--include/photo/photo_driver.php25
-rw-r--r--include/photos.php86
-rw-r--r--include/security.php1
-rw-r--r--include/socgraph.php81
-rw-r--r--include/statistics_fns.php20
-rw-r--r--include/taxonomy.php39
-rw-r--r--include/text.php206
-rw-r--r--include/zid.php2
-rw-r--r--include/zot.php60
-rwxr-xr-xinstall/htconfig.sample.php8
-rw-r--r--install/sample-nginx.conf2
-rw-r--r--install/schema_mysql.sql792
-rw-r--r--install/schema_postgres.sql312
-rw-r--r--install/update.php434
-rw-r--r--library/Text_Highlighter/README455
-rw-r--r--library/Text_Highlighter/TODO12
-rw-r--r--library/Text_Highlighter/Text/Highlighter.php398
-rw-r--r--library/Text_Highlighter/Text/Highlighter/ABAP.php519
-rw-r--r--library/Text_Highlighter/Text/Highlighter/AVRC.php894
-rw-r--r--library/Text_Highlighter/Text/Highlighter/CPP.php891
-rw-r--r--library/Text_Highlighter/Text/Highlighter/CSS.php437
-rw-r--r--library/Text_Highlighter/Text/Highlighter/DIFF.php384
-rw-r--r--library/Text_Highlighter/Text/Highlighter/DTD.php426
-rw-r--r--library/Text_Highlighter/Text/Highlighter/Generator.php1291
-rw-r--r--library/Text_Highlighter/Text/Highlighter/HTML.php234
-rw-r--r--library/Text_Highlighter/Text/Highlighter/JAVA.php802
-rw-r--r--library/Text_Highlighter/Text/Highlighter/JAVASCRIPT.php631
-rw-r--r--library/Text_Highlighter/Text/Highlighter/MYSQL.php434
-rw-r--r--library/Text_Highlighter/Text/Highlighter/PERL.php1352
-rw-r--r--library/Text_Highlighter/Text/Highlighter/PHP.php1107
-rw-r--r--library/Text_Highlighter/Text/Highlighter/PYTHON.php647
-rw-r--r--library/Text_Highlighter/Text/Highlighter/RUBY.php825
-rw-r--r--library/Text_Highlighter/Text/Highlighter/Renderer.php164
-rw-r--r--library/Text_Highlighter/Text/Highlighter/Renderer/Array.php202
-rw-r--r--library/Text_Highlighter/Text/Highlighter/Renderer/BB.php238
-rw-r--r--library/Text_Highlighter/Text/Highlighter/Renderer/Console.php208
-rw-r--r--library/Text_Highlighter/Text/Highlighter/Renderer/Html.php465
-rw-r--r--library/Text_Highlighter/Text/Highlighter/Renderer/HtmlTags.php187
-rw-r--r--library/Text_Highlighter/Text/Highlighter/Renderer/JSON.php86
-rw-r--r--library/Text_Highlighter/Text/Highlighter/Renderer/XML.php104
-rw-r--r--library/Text_Highlighter/Text/Highlighter/SH.php1225
-rw-r--r--library/Text_Highlighter/Text/Highlighter/SQL.php419
-rw-r--r--library/Text_Highlighter/Text/Highlighter/VBSCRIPT.php318
-rw-r--r--library/Text_Highlighter/Text/Highlighter/XML.php263
-rw-r--r--library/Text_Highlighter/abap.xml802
-rw-r--r--library/Text_Highlighter/avrc.xml316
-rw-r--r--library/Text_Highlighter/cpp.xml201
-rw-r--r--library/Text_Highlighter/css.xml368
-rw-r--r--library/Text_Highlighter/diff.xml45
-rw-r--r--library/Text_Highlighter/dtd.xml66
-rw-r--r--library/Text_Highlighter/generate171
-rw-r--r--library/Text_Highlighter/generate.bat188
-rw-r--r--library/Text_Highlighter/html.xml33
-rw-r--r--library/Text_Highlighter/java.xml2824
-rw-r--r--library/Text_Highlighter/javascript.xml174
-rw-r--r--library/Text_Highlighter/mysql.xml424
-rw-r--r--library/Text_Highlighter/perl.xml439
-rw-r--r--library/Text_Highlighter/php.xml194
-rw-r--r--library/Text_Highlighter/python.xml229
-rw-r--r--library/Text_Highlighter/release4
-rw-r--r--library/Text_Highlighter/ruby.xml141
-rw-r--r--library/Text_Highlighter/sample.css62
-rw-r--r--library/Text_Highlighter/sh.xml242
-rw-r--r--library/Text_Highlighter/sql.xml496
-rw-r--r--library/Text_Highlighter/vbscript.xml305
-rw-r--r--library/Text_Highlighter/xml.xml37
-rw-r--r--library/blueimp_upload/.gitignore3
-rw-r--r--library/blueimp_upload/.jshintrc81
-rw-r--r--library/blueimp_upload/CONTRIBUTING.md43
-rw-r--r--library/blueimp_upload/Gruntfile.js37
-rw-r--r--library/blueimp_upload/LICENSE20
-rw-r--r--library/blueimp_upload/README.md58
-rw-r--r--library/blueimp_upload/angularjs.html14
-rw-r--r--library/blueimp_upload/basic-plus.html14
-rw-r--r--library/blueimp_upload/basic.html14
-rw-r--r--library/blueimp_upload/blueimp-file-upload.jquery.json50
-rwxr-xr-xlibrary/blueimp_upload/bower-version-update.js16
-rw-r--r--library/blueimp_upload/bower.json29
-rw-r--r--library/blueimp_upload/cors/postmessage.html6
-rw-r--r--library/blueimp_upload/cors/result.html4
-rw-r--r--library/blueimp_upload/css/demo-ie8.css4
-rw-r--r--library/blueimp_upload/css/demo.css4
-rw-r--r--library/blueimp_upload/css/jquery.fileupload-noscript.css6
-rw-r--r--library/blueimp_upload/css/jquery.fileupload-ui-noscript.css4
-rw-r--r--library/blueimp_upload/css/jquery.fileupload-ui.css4
-rw-r--r--library/blueimp_upload/css/jquery.fileupload.css7
-rw-r--r--library/blueimp_upload/css/style.css4
-rw-r--r--library/blueimp_upload/index.html12
-rw-r--r--library/blueimp_upload/jquery-ui.html14
-rw-r--r--library/blueimp_upload/js/app.js8
-rw-r--r--library/blueimp_upload/js/cors/jquery.postmessage-transport.js17
-rw-r--r--library/blueimp_upload/js/cors/jquery.xdr-transport.js11
-rw-r--r--library/blueimp_upload/js/jquery.fileupload-angular.js50
-rw-r--r--library/blueimp_upload/js/jquery.fileupload-audio.js15
-rw-r--r--library/blueimp_upload/js/jquery.fileupload-image.js23
-rw-r--r--[-rwxr-xr-x]library/blueimp_upload/js/jquery.fileupload-jquery-ui.js19
-rw-r--r--library/blueimp_upload/js/jquery.fileupload-process.js18
-rw-r--r--library/blueimp_upload/js/jquery.fileupload-ui.js23
-rw-r--r--library/blueimp_upload/js/jquery.fileupload-validate.js16
-rw-r--r--library/blueimp_upload/js/jquery.fileupload-video.js15
-rw-r--r--library/blueimp_upload/js/jquery.fileupload.js71
-rw-r--r--library/blueimp_upload/js/jquery.iframe-transport.js22
-rw-r--r--library/blueimp_upload/js/main.js6
-rw-r--r--library/blueimp_upload/js/vendor/jquery.ui.widget.js44
-rw-r--r--library/blueimp_upload/package.json39
-rw-r--r--library/blueimp_upload/server/gae-go/app/main.go297
-rw-r--r--library/blueimp_upload/server/gae-python/app.yaml5
-rw-r--r--library/blueimp_upload/server/gae-python/main.py208
-rw-r--r--library/blueimp_upload/server/node/.gitignore2
-rw-r--r--library/blueimp_upload/server/node/package.json41
-rw-r--r--library/blueimp_upload/server/node/public/files/.gitignore2
-rwxr-xr-xlibrary/blueimp_upload/server/node/server.js292
-rw-r--r--library/blueimp_upload/server/node/tmp/.gitignore0
-rw-r--r--library/blueimp_upload/server/php/Dockerfile38
-rwxr-xr-xlibrary/blueimp_upload/server/php/UploadHandler.php250
-rw-r--r--library/blueimp_upload/server/php/docker-compose.yml6
-rw-r--r--library/blueimp_upload/server/php/files/.htaccess14
-rw-r--r--library/blueimp_upload/server/php/index.php4
-rw-r--r--library/blueimp_upload/test/index.html16
-rw-r--r--library/blueimp_upload/test/test.js10
-rw-r--r--library/bootstrap/css/bootstrap-grid.css2119
-rw-r--r--library/bootstrap/css/bootstrap-grid.css.map2
-rw-r--r--library/bootstrap/css/bootstrap-grid.min.css3
-rw-r--r--library/bootstrap/css/bootstrap-grid.min.css.map2
-rw-r--r--library/bootstrap/css/bootstrap-reboot.css27
-rw-r--r--library/bootstrap/css/bootstrap-reboot.css.map2
-rw-r--r--library/bootstrap/css/bootstrap-reboot.min.css3
-rw-r--r--library/bootstrap/css/bootstrap-reboot.min.css.map2
-rw-r--r--library/bootstrap/css/bootstrap.css4711
-rw-r--r--library/bootstrap/css/bootstrap.css.map2
-rw-r--r--library/bootstrap/css/bootstrap.min.css5
-rw-r--r--library/bootstrap/css/bootstrap.min.css.map2
-rw-r--r--library/bootstrap/js/bootstrap.js738
-rw-r--r--library/bootstrap/js/bootstrap.min.js5
-rw-r--r--library/oauth2/.gitignore5
-rw-r--r--library/oauth2/.travis.yml30
-rw-r--r--library/oauth2/CHANGELOG.md152
-rw-r--r--library/oauth2/LICENSE21
-rw-r--r--library/oauth2/README.md8
-rw-r--r--library/oauth2/phpunit.xml25
-rw-r--r--library/oauth2/src/OAuth2/Autoloader.php48
-rw-r--r--library/oauth2/src/OAuth2/ClientAssertionType/ClientAssertionTypeInterface.php15
-rw-r--r--library/oauth2/src/OAuth2/ClientAssertionType/HttpBasic.php123
-rw-r--r--library/oauth2/src/OAuth2/Controller/AuthorizeController.php388
-rw-r--r--library/oauth2/src/OAuth2/Controller/AuthorizeControllerInterface.php43
-rw-r--r--library/oauth2/src/OAuth2/Controller/ResourceController.php111
-rw-r--r--library/oauth2/src/OAuth2/Controller/ResourceControllerInterface.php26
-rw-r--r--library/oauth2/src/OAuth2/Controller/TokenController.php278
-rw-r--r--library/oauth2/src/OAuth2/Controller/TokenControllerInterface.php32
-rw-r--r--library/oauth2/src/OAuth2/Encryption/EncryptionInterface.php11
-rw-r--r--library/oauth2/src/OAuth2/Encryption/FirebaseJwt.php47
-rw-r--r--library/oauth2/src/OAuth2/Encryption/Jwt.php173
-rw-r--r--library/oauth2/src/OAuth2/GrantType/AuthorizationCode.php100
-rw-r--r--library/oauth2/src/OAuth2/GrantType/ClientCredentials.php67
-rw-r--r--library/oauth2/src/OAuth2/GrantType/GrantTypeInterface.php20
-rw-r--r--library/oauth2/src/OAuth2/GrantType/JwtBearer.php226
-rw-r--r--library/oauth2/src/OAuth2/GrantType/RefreshToken.php111
-rw-r--r--library/oauth2/src/OAuth2/GrantType/UserCredentials.php83
-rw-r--r--library/oauth2/src/OAuth2/OpenID/Controller/AuthorizeController.php106
-rw-r--r--library/oauth2/src/OAuth2/OpenID/Controller/AuthorizeControllerInterface.php10
-rw-r--r--library/oauth2/src/OAuth2/OpenID/Controller/UserInfoController.php58
-rw-r--r--library/oauth2/src/OAuth2/OpenID/Controller/UserInfoControllerInterface.php23
-rw-r--r--library/oauth2/src/OAuth2/OpenID/GrantType/AuthorizationCode.php33
-rw-r--r--library/oauth2/src/OAuth2/OpenID/ResponseType/AuthorizationCode.php60
-rw-r--r--library/oauth2/src/OAuth2/OpenID/ResponseType/AuthorizationCodeInterface.php27
-rw-r--r--library/oauth2/src/OAuth2/OpenID/ResponseType/CodeIdToken.php24
-rw-r--r--library/oauth2/src/OAuth2/OpenID/ResponseType/CodeIdTokenInterface.php9
-rw-r--r--library/oauth2/src/OAuth2/OpenID/ResponseType/IdToken.php124
-rw-r--r--library/oauth2/src/OAuth2/OpenID/ResponseType/IdTokenInterface.php29
-rw-r--r--library/oauth2/src/OAuth2/OpenID/ResponseType/IdTokenToken.php27
-rw-r--r--library/oauth2/src/OAuth2/OpenID/ResponseType/IdTokenTokenInterface.php9
-rw-r--r--library/oauth2/src/OAuth2/OpenID/Storage/AuthorizationCodeInterface.php37
-rw-r--r--library/oauth2/src/OAuth2/OpenID/Storage/UserClaimsInterface.php38
-rw-r--r--library/oauth2/src/OAuth2/Request.php213
-rw-r--r--library/oauth2/src/OAuth2/RequestInterface.php16
-rw-r--r--library/oauth2/src/OAuth2/Response.php369
-rw-r--r--library/oauth2/src/OAuth2/ResponseInterface.php24
-rw-r--r--library/oauth2/src/OAuth2/ResponseType/AccessToken.php194
-rw-r--r--library/oauth2/src/OAuth2/ResponseType/AccessTokenInterface.php34
-rw-r--r--library/oauth2/src/OAuth2/ResponseType/AuthorizationCode.php100
-rw-r--r--library/oauth2/src/OAuth2/ResponseType/AuthorizationCodeInterface.php30
-rw-r--r--library/oauth2/src/OAuth2/ResponseType/JwtAccessToken.php124
-rw-r--r--library/oauth2/src/OAuth2/ResponseType/ResponseTypeInterface.php8
-rw-r--r--library/oauth2/src/OAuth2/Scope.php103
-rw-r--r--library/oauth2/src/OAuth2/ScopeInterface.php40
-rw-r--r--library/oauth2/src/OAuth2/Server.php832
-rw-r--r--library/oauth2/src/OAuth2/Storage/AccessTokenInterface.php64
-rw-r--r--library/oauth2/src/OAuth2/Storage/AuthorizationCodeInterface.php86
-rw-r--r--library/oauth2/src/OAuth2/Storage/Cassandra.php480
-rw-r--r--library/oauth2/src/OAuth2/Storage/ClientCredentialsInterface.php49
-rw-r--r--library/oauth2/src/OAuth2/Storage/ClientInterface.php66
-rwxr-xr-xlibrary/oauth2/src/OAuth2/Storage/CouchbaseDB.php331
-rw-r--r--library/oauth2/src/OAuth2/Storage/DynamoDB.php540
-rw-r--r--library/oauth2/src/OAuth2/Storage/JwtAccessToken.php88
-rw-r--r--library/oauth2/src/OAuth2/Storage/JwtAccessTokenInterface.php14
-rw-r--r--library/oauth2/src/OAuth2/Storage/JwtBearerInterface.php74
-rw-r--r--library/oauth2/src/OAuth2/Storage/Memory.php381
-rw-r--r--library/oauth2/src/OAuth2/Storage/Mongo.php339
-rw-r--r--library/oauth2/src/OAuth2/Storage/Pdo.php553
-rw-r--r--library/oauth2/src/OAuth2/Storage/PublicKeyInterface.php16
-rw-r--r--library/oauth2/src/OAuth2/Storage/Redis.php321
-rw-r--r--library/oauth2/src/OAuth2/Storage/RefreshTokenInterface.php82
-rw-r--r--library/oauth2/src/OAuth2/Storage/ScopeInterface.php46
-rw-r--r--library/oauth2/src/OAuth2/Storage/UserCredentialsInterface.php52
-rw-r--r--library/oauth2/src/OAuth2/TokenType/Bearer.php130
-rw-r--r--library/oauth2/src/OAuth2/TokenType/Mac.php22
-rw-r--r--library/oauth2/src/OAuth2/TokenType/TokenTypeInterface.php21
-rw-r--r--library/oauth2/test/OAuth2/AutoloadTest.php16
-rw-r--r--library/oauth2/test/OAuth2/Controller/AuthorizeControllerTest.php492
-rw-r--r--library/oauth2/test/OAuth2/Controller/ResourceControllerTest.php175
-rw-r--r--library/oauth2/test/OAuth2/Controller/TokenControllerTest.php289
-rw-r--r--library/oauth2/test/OAuth2/Encryption/FirebaseJwtTest.php102
-rw-r--r--library/oauth2/test/OAuth2/Encryption/JwtTest.php102
-rw-r--r--library/oauth2/test/OAuth2/GrantType/AuthorizationCodeTest.php207
-rw-r--r--library/oauth2/test/OAuth2/GrantType/ClientCredentialsTest.php159
-rw-r--r--library/oauth2/test/OAuth2/GrantType/ImplicitTest.php143
-rw-r--r--library/oauth2/test/OAuth2/GrantType/JwtBearerTest.php360
-rw-r--r--library/oauth2/test/OAuth2/GrantType/RefreshTokenTest.php204
-rw-r--r--library/oauth2/test/OAuth2/GrantType/UserCredentialsTest.php172
-rw-r--r--library/oauth2/test/OAuth2/OpenID/Controller/AuthorizeControllerTest.php182
-rw-r--r--library/oauth2/test/OAuth2/OpenID/Controller/UserInfoControllerTest.php44
-rw-r--r--library/oauth2/test/OAuth2/OpenID/GrantType/AuthorizationCodeTest.php57
-rw-r--r--library/oauth2/test/OAuth2/OpenID/ResponseType/CodeIdTokenTest.php182
-rw-r--r--library/oauth2/test/OAuth2/OpenID/ResponseType/IdTokenTest.php184
-rw-r--r--library/oauth2/test/OAuth2/OpenID/ResponseType/IdTokenTokenTest.php91
-rw-r--r--library/oauth2/test/OAuth2/OpenID/Storage/AuthorizationCodeTest.php95
-rw-r--r--library/oauth2/test/OAuth2/OpenID/Storage/UserClaimsTest.php41
-rw-r--r--library/oauth2/test/OAuth2/RequestTest.php98
-rw-r--r--library/oauth2/test/OAuth2/ResponseTest.php17
-rw-r--r--library/oauth2/test/OAuth2/ResponseType/AccessTokenTest.php107
-rw-r--r--library/oauth2/test/OAuth2/ResponseType/JwtAccessTokenTest.php160
-rw-r--r--library/oauth2/test/OAuth2/ScopeTest.php42
-rw-r--r--library/oauth2/test/OAuth2/ServerTest.php684
-rw-r--r--library/oauth2/test/OAuth2/Storage/AccessTokenTest.php102
-rw-r--r--library/oauth2/test/OAuth2/Storage/AuthorizationCodeTest.php106
-rw-r--r--library/oauth2/test/OAuth2/Storage/ClientCredentialsTest.php28
-rw-r--r--library/oauth2/test/OAuth2/Storage/ClientTest.php110
-rw-r--r--library/oauth2/test/OAuth2/Storage/DynamoDBTest.php40
-rw-r--r--library/oauth2/test/OAuth2/Storage/JwtAccessTokenTest.php41
-rw-r--r--library/oauth2/test/OAuth2/Storage/JwtBearerTest.php25
-rw-r--r--library/oauth2/test/OAuth2/Storage/PdoTest.php39
-rw-r--r--library/oauth2/test/OAuth2/Storage/PublicKeyTest.php29
-rw-r--r--library/oauth2/test/OAuth2/Storage/RefreshTokenTest.php41
-rw-r--r--library/oauth2/test/OAuth2/Storage/ScopeTest.php53
-rw-r--r--library/oauth2/test/OAuth2/Storage/UserCredentialsTest.php40
-rw-r--r--library/oauth2/test/OAuth2/TokenType/BearerTest.php58
-rw-r--r--library/oauth2/test/bootstrap.php12
-rw-r--r--library/oauth2/test/cleanup.php15
-rw-r--r--library/oauth2/test/config/keys/id_rsa15
-rw-r--r--library/oauth2/test/config/keys/id_rsa.pub16
-rw-r--r--library/oauth2/test/config/storage.json181
-rw-r--r--library/oauth2/test/lib/OAuth2/Request/TestRequest.php61
-rwxr-xr-xlibrary/oauth2/test/lib/OAuth2/Storage/BaseTest.php34
-rwxr-xr-xlibrary/oauth2/test/lib/OAuth2/Storage/Bootstrap.php888
-rw-r--r--library/oauth2/test/lib/OAuth2/Storage/NullStorage.php32
-rw-r--r--library/popper/popper.min.js4
-rwxr-xr-xtests/travis/prepare_mysql.sh27
-rw-r--r--tests/unit/Access/PermissionsTest.php148
-rw-r--r--tests/unit/includes/MarkdownTest.php149
-rw-r--r--tests/unit/includes/TextTest.php20
-rw-r--r--util/hmessages.po4164
-rw-r--r--util/typo.php1
l---------vendor/bin/html-to-markdown1
-rw-r--r--vendor/composer/autoload_classmap.php37
-rw-r--r--vendor/composer/autoload_psr4.php3
-rw-r--r--vendor/composer/autoload_static.php53
-rw-r--r--vendor/composer/installed.json773
-rw-r--r--vendor/ezyang/htmlpurifier/NEWS8
-rw-r--r--vendor/ezyang/htmlpurifier/VERSION2
-rw-r--r--vendor/ezyang/htmlpurifier/WHATSNEW7
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier.includes.php2
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier.php6
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ChildDef/List.php4
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/Config.php4
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema.php14
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/Generator.php2
-rw-r--r--vendor/ezyang/htmlpurifier/library/HTMLPurifier/Lexer.php2
-rw-r--r--vendor/league/html-to-markdown/CHANGELOG.md214
-rw-r--r--vendor/league/html-to-markdown/CONDUCT.md22
-rw-r--r--vendor/league/html-to-markdown/LICENSE22
-rw-r--r--vendor/league/html-to-markdown/README.md196
-rwxr-xr-xvendor/league/html-to-markdown/bin/html-to-markdown108
-rw-r--r--vendor/league/html-to-markdown/composer.json48
-rw-r--r--vendor/league/html-to-markdown/src/Configuration.php60
-rw-r--r--vendor/league/html-to-markdown/src/ConfigurationAwareInterface.php11
-rw-r--r--vendor/league/html-to-markdown/src/Converter/BlockquoteConverter.php44
-rw-r--r--vendor/league/html-to-markdown/src/Converter/CodeConverter.php62
-rw-r--r--vendor/league/html-to-markdown/src/Converter/CommentConverter.php26
-rw-r--r--vendor/league/html-to-markdown/src/Converter/ConverterInterface.php20
-rw-r--r--vendor/league/html-to-markdown/src/Converter/DefaultConverter.php50
-rw-r--r--vendor/league/html-to-markdown/src/Converter/DivConverter.php45
-rw-r--r--vendor/league/html-to-markdown/src/Converter/EmphasisConverter.php57
-rw-r--r--vendor/league/html-to-markdown/src/Converter/HardBreakConverter.php41
-rw-r--r--vendor/league/html-to-markdown/src/Converter/HeaderConverter.php78
-rw-r--r--vendor/league/html-to-markdown/src/Converter/HorizontalRuleConverter.php26
-rw-r--r--vendor/league/html-to-markdown/src/Converter/ImageConverter.php35
-rw-r--r--vendor/league/html-to-markdown/src/Converter/LinkConverter.php52
-rw-r--r--vendor/league/html-to-markdown/src/Converter/ListBlockConverter.php26
-rw-r--r--vendor/league/html-to-markdown/src/Converter/ListItemConverter.php47
-rw-r--r--vendor/league/html-to-markdown/src/Converter/ParagraphConverter.php124
-rw-r--r--vendor/league/html-to-markdown/src/Converter/PreformattedConverter.php59
-rw-r--r--vendor/league/html-to-markdown/src/Converter/TextConverter.php46
-rw-r--r--vendor/league/html-to-markdown/src/Element.php257
-rw-r--r--vendor/league/html-to-markdown/src/ElementInterface.php80
-rw-r--r--vendor/league/html-to-markdown/src/Environment.php104
-rw-r--r--vendor/league/html-to-markdown/src/HtmlConverter.php231
-rw-r--r--vendor/pixel418/markdownify/CHANGELOG.md76
-rw-r--r--vendor/pixel418/markdownify/LICENSE504
-rw-r--r--vendor/pixel418/markdownify/README.md63
-rw-r--r--vendor/pixel418/markdownify/composer.json38
-rw-r--r--vendor/pixel418/markdownify/src/Converter.php1400
-rw-r--r--vendor/pixel418/markdownify/src/ConverterExtra.php573
-rw-r--r--vendor/pixel418/markdownify/src/Parser.php564
-rw-r--r--vendor/sabre/dav/.travis.yml7
-rw-r--r--vendor/sabre/dav/CHANGELOG.md56
-rw-r--r--vendor/sabre/dav/README.md2
-rwxr-xr-x[-rw-r--r--]vendor/sabre/dav/bin/build.php0
-rwxr-xr-x[-rw-r--r--]vendor/sabre/dav/bin/googlecode_upload.py0
-rwxr-xr-x[-rw-r--r--]vendor/sabre/dav/bin/migrateto20.php0
-rwxr-xr-x[-rw-r--r--]vendor/sabre/dav/bin/migrateto21.php0
-rwxr-xr-x[-rw-r--r--]vendor/sabre/dav/bin/migrateto30.php0
-rwxr-xr-x[-rw-r--r--]vendor/sabre/dav/bin/migrateto32.php0
-rwxr-xr-x[-rw-r--r--]vendor/sabre/dav/bin/sabredav.php0
-rw-r--r--vendor/sabre/dav/composer.json4
-rw-r--r--vendor/sabre/dav/lib/CalDAV/Backend/AbstractBackend.php6
-rw-r--r--vendor/sabre/dav/lib/CalDAV/Backend/NotificationSupport.php4
-rw-r--r--vendor/sabre/dav/lib/CalDAV/Backend/PDO.php68
-rw-r--r--vendor/sabre/dav/lib/CalDAV/Backend/SharingSupport.php6
-rw-r--r--vendor/sabre/dav/lib/CalDAV/Backend/SimplePDO.php14
-rw-r--r--vendor/sabre/dav/lib/CalDAV/Backend/SubscriptionSupport.php2
-rw-r--r--vendor/sabre/dav/lib/CalDAV/Calendar.php2
-rw-r--r--vendor/sabre/dav/lib/CalDAV/CalendarHome.php8
-rw-r--r--vendor/sabre/dav/lib/CalDAV/CalendarObject.php2
-rw-r--r--vendor/sabre/dav/lib/CalDAV/CalendarQueryValidator.php4
-rw-r--r--vendor/sabre/dav/lib/CalDAV/CalendarRoot.php2
-rw-r--r--vendor/sabre/dav/lib/CalDAV/Exception/InvalidComponentType.php2
-rw-r--r--vendor/sabre/dav/lib/CalDAV/ICSExportPlugin.php6
-rw-r--r--vendor/sabre/dav/lib/CalDAV/Notifications/Collection.php4
-rw-r--r--vendor/sabre/dav/lib/CalDAV/Notifications/INode.php8
-rw-r--r--vendor/sabre/dav/lib/CalDAV/Notifications/Node.php12
-rw-r--r--vendor/sabre/dav/lib/CalDAV/Notifications/Plugin.php4
-rw-r--r--vendor/sabre/dav/lib/CalDAV/Plugin.php10
-rw-r--r--vendor/sabre/dav/lib/CalDAV/Principal/ProxyRead.php4
-rw-r--r--vendor/sabre/dav/lib/CalDAV/Principal/ProxyWrite.php4
-rw-r--r--vendor/sabre/dav/lib/CalDAV/Schedule/IMipPlugin.php2
-rw-r--r--vendor/sabre/dav/lib/CalDAV/Schedule/Inbox.php6
-rw-r--r--vendor/sabre/dav/lib/CalDAV/Schedule/Outbox.php2
-rw-r--r--vendor/sabre/dav/lib/CalDAV/Schedule/Plugin.php33
-rw-r--r--vendor/sabre/dav/lib/CalDAV/Schedule/SchedulingObject.php2
-rw-r--r--vendor/sabre/dav/lib/CalDAV/SharingPlugin.php3
-rw-r--r--vendor/sabre/dav/lib/CalDAV/Subscriptions/Plugin.php2
-rw-r--r--vendor/sabre/dav/lib/CalDAV/Subscriptions/Subscription.php12
-rw-r--r--vendor/sabre/dav/lib/CalDAV/Xml/Filter/CalendarData.php8
-rw-r--r--vendor/sabre/dav/lib/CalDAV/Xml/Filter/CompFilter.php8
-rw-r--r--vendor/sabre/dav/lib/CalDAV/Xml/Filter/ParamFilter.php4
-rw-r--r--vendor/sabre/dav/lib/CalDAV/Xml/Filter/PropFilter.php8
-rw-r--r--vendor/sabre/dav/lib/CalDAV/Xml/Notification/Invite.php10
-rw-r--r--vendor/sabre/dav/lib/CalDAV/Xml/Notification/InviteReply.php6
-rw-r--r--vendor/sabre/dav/lib/CalDAV/Xml/Notification/NotificationInterface.php2
-rw-r--r--vendor/sabre/dav/lib/CalDAV/Xml/Notification/SystemStatus.php2
-rw-r--r--vendor/sabre/dav/lib/CalDAV/Xml/Property/AllowedSharingModes.php8
-rw-r--r--vendor/sabre/dav/lib/CalDAV/Xml/Property/EmailAddressSet.php4
-rw-r--r--vendor/sabre/dav/lib/CalDAV/Xml/Property/Invite.php13
-rw-r--r--vendor/sabre/dav/lib/CalDAV/Xml/Property/ScheduleCalendarTransp.php10
-rw-r--r--vendor/sabre/dav/lib/CalDAV/Xml/Property/SupportedCalendarComponentSet.php8
-rw-r--r--vendor/sabre/dav/lib/CalDAV/Xml/Property/SupportedCalendarData.php8
-rw-r--r--vendor/sabre/dav/lib/CalDAV/Xml/Property/SupportedCollationSet.php6
-rw-r--r--vendor/sabre/dav/lib/CalDAV/Xml/Request/CalendarMultiGetReport.php6
-rw-r--r--vendor/sabre/dav/lib/CalDAV/Xml/Request/CalendarQueryReport.php8
-rw-r--r--vendor/sabre/dav/lib/CalDAV/Xml/Request/FreeBusyQueryReport.php2
-rw-r--r--vendor/sabre/dav/lib/CalDAV/Xml/Request/InviteReply.php4
-rw-r--r--vendor/sabre/dav/lib/CalDAV/Xml/Request/MkCalendar.php6
-rw-r--r--vendor/sabre/dav/lib/CalDAV/Xml/Request/Share.php2
-rw-r--r--vendor/sabre/dav/lib/CardDAV/AddressBook.php2
-rw-r--r--vendor/sabre/dav/lib/CardDAV/AddressBookHome.php2
-rw-r--r--vendor/sabre/dav/lib/CardDAV/AddressBookRoot.php2
-rw-r--r--vendor/sabre/dav/lib/CardDAV/Backend/BackendInterface.php2
-rw-r--r--vendor/sabre/dav/lib/CardDAV/Backend/PDO.php6
-rw-r--r--vendor/sabre/dav/lib/CardDAV/Card.php2
-rw-r--r--vendor/sabre/dav/lib/CardDAV/Plugin.php19
-rw-r--r--vendor/sabre/dav/lib/CardDAV/VCFExportPlugin.php4
-rw-r--r--vendor/sabre/dav/lib/CardDAV/Xml/Filter/AddressData.php8
-rw-r--r--vendor/sabre/dav/lib/CardDAV/Xml/Filter/ParamFilter.php6
-rw-r--r--vendor/sabre/dav/lib/CardDAV/Xml/Filter/PropFilter.php6
-rw-r--r--vendor/sabre/dav/lib/CardDAV/Xml/Property/SupportedAddressData.php6
-rw-r--r--vendor/sabre/dav/lib/CardDAV/Xml/Property/SupportedCollationSet.php4
-rw-r--r--vendor/sabre/dav/lib/CardDAV/Xml/Request/AddressBookMultiGetReport.php2
-rw-r--r--vendor/sabre/dav/lib/CardDAV/Xml/Request/AddressBookQueryReport.php13
-rw-r--r--vendor/sabre/dav/lib/DAV/Auth/Backend/AbstractDigest.php2
-rw-r--r--vendor/sabre/dav/lib/DAV/Auth/Backend/PDO.php2
-rw-r--r--vendor/sabre/dav/lib/DAV/Auth/Plugin.php6
-rw-r--r--vendor/sabre/dav/lib/DAV/Browser/GuessContentType.php4
-rw-r--r--vendor/sabre/dav/lib/DAV/Browser/MapGetToPropFind.php2
-rw-r--r--vendor/sabre/dav/lib/DAV/Browser/Plugin.php62
-rw-r--r--vendor/sabre/dav/lib/DAV/Browser/PropFindAll.php2
-rw-r--r--vendor/sabre/dav/lib/DAV/Client.php6
-rw-r--r--vendor/sabre/dav/lib/DAV/Collection.php2
-rw-r--r--vendor/sabre/dav/lib/DAV/CorePlugin.php30
-rw-r--r--vendor/sabre/dav/lib/DAV/Exception/InvalidResourceType.php2
-rw-r--r--vendor/sabre/dav/lib/DAV/FS/Node.php2
-rw-r--r--vendor/sabre/dav/lib/DAV/File.php2
-rw-r--r--vendor/sabre/dav/lib/DAV/IFile.php4
-rw-r--r--vendor/sabre/dav/lib/DAV/IMoveTarget.php2
-rw-r--r--vendor/sabre/dav/lib/DAV/Locks/Backend/PDO.php4
-rw-r--r--vendor/sabre/dav/lib/DAV/Locks/Plugin.php6
-rw-r--r--vendor/sabre/dav/lib/DAV/MkCol.php1
-rw-r--r--vendor/sabre/dav/lib/DAV/Mount/Plugin.php2
-rw-r--r--vendor/sabre/dav/lib/DAV/Node.php4
-rw-r--r--vendor/sabre/dav/lib/DAV/PartialUpdate/Plugin.php2
-rw-r--r--vendor/sabre/dav/lib/DAV/PropFind.php2
-rw-r--r--vendor/sabre/dav/lib/DAV/PropertyStorage/Backend/BackendInterface.php2
-rw-r--r--vendor/sabre/dav/lib/DAV/PropertyStorage/Backend/PDO.php2
-rw-r--r--vendor/sabre/dav/lib/DAV/PropertyStorage/Plugin.php13
-rw-r--r--vendor/sabre/dav/lib/DAV/Server.php101
-rw-r--r--vendor/sabre/dav/lib/DAV/Sharing/Plugin.php4
-rw-r--r--vendor/sabre/dav/lib/DAV/Sync/Plugin.php2
-rw-r--r--vendor/sabre/dav/lib/DAV/TemporaryFileFilterPlugin.php8
-rw-r--r--vendor/sabre/dav/lib/DAV/Version.php2
-rw-r--r--vendor/sabre/dav/lib/DAV/Xml/Element/Prop.php6
-rw-r--r--vendor/sabre/dav/lib/DAV/Xml/Element/Response.php2
-rw-r--r--vendor/sabre/dav/lib/DAV/Xml/Element/Sharee.php4
-rw-r--r--vendor/sabre/dav/lib/DAV/Xml/Property/Complex.php2
-rw-r--r--vendor/sabre/dav/lib/DAV/Xml/Property/GetLastModified.php8
-rw-r--r--vendor/sabre/dav/lib/DAV/Xml/Property/Href.php10
-rw-r--r--vendor/sabre/dav/lib/DAV/Xml/Property/Invite.php6
-rw-r--r--vendor/sabre/dav/lib/DAV/Xml/Property/LocalHref.php4
-rw-r--r--vendor/sabre/dav/lib/DAV/Xml/Property/ResourceType.php4
-rw-r--r--vendor/sabre/dav/lib/DAV/Xml/Property/ShareAccess.php6
-rw-r--r--vendor/sabre/dav/lib/DAV/Xml/Property/SupportedLock.php8
-rw-r--r--vendor/sabre/dav/lib/DAV/Xml/Property/SupportedMethodSet.php4
-rw-r--r--vendor/sabre/dav/lib/DAV/Xml/Property/SupportedReportSet.php4
-rw-r--r--vendor/sabre/dav/lib/DAV/Xml/Request/Lock.php2
-rw-r--r--vendor/sabre/dav/lib/DAV/Xml/Request/MkCol.php6
-rw-r--r--vendor/sabre/dav/lib/DAV/Xml/Request/PropFind.php2
-rw-r--r--vendor/sabre/dav/lib/DAV/Xml/Request/PropPatch.php10
-rw-r--r--vendor/sabre/dav/lib/DAV/Xml/Request/ShareResource.php4
-rw-r--r--vendor/sabre/dav/lib/DAV/Xml/Request/SyncCollectionReport.php8
-rw-r--r--vendor/sabre/dav/lib/DAV/Xml/Response/MultiStatus.php2
-rw-r--r--vendor/sabre/dav/lib/DAVACL/Exception/NotRecognizedPrincipal.php2
-rw-r--r--vendor/sabre/dav/lib/DAVACL/FS/Collection.php4
-rw-r--r--vendor/sabre/dav/lib/DAVACL/FS/File.php2
-rw-r--r--vendor/sabre/dav/lib/DAVACL/FS/HomeCollection.php2
-rw-r--r--vendor/sabre/dav/lib/DAVACL/Plugin.php38
-rw-r--r--vendor/sabre/dav/lib/DAVACL/Principal.php2
-rw-r--r--vendor/sabre/dav/lib/DAVACL/PrincipalBackend/BackendInterface.php2
-rw-r--r--vendor/sabre/dav/lib/DAVACL/PrincipalBackend/PDO.php8
-rw-r--r--vendor/sabre/dav/lib/DAVACL/PrincipalCollection.php2
-rw-r--r--vendor/sabre/dav/lib/DAVACL/Xml/Property/Acl.php6
-rw-r--r--vendor/sabre/dav/lib/DAVACL/Xml/Property/AclRestrictions.php6
-rw-r--r--vendor/sabre/dav/lib/DAVACL/Xml/Property/CurrentUserPrivilegeSet.php6
-rw-r--r--vendor/sabre/dav/lib/DAVACL/Xml/Property/Principal.php4
-rw-r--r--vendor/sabre/dav/lib/DAVACL/Xml/Property/SupportedPrivilegeSet.php11
-rw-r--r--vendor/sabre/dav/lib/DAVACL/Xml/Request/AclPrincipalPropSetReport.php6
-rw-r--r--vendor/sabre/dav/lib/DAVACL/Xml/Request/ExpandPropertyReport.php2
-rw-r--r--vendor/sabre/dav/lib/DAVACL/Xml/Request/PrincipalMatchReport.php6
-rw-r--r--vendor/sabre/dav/lib/DAVACL/Xml/Request/PrincipalPropertySearchReport.php4
-rw-r--r--vendor/sabre/dav/lib/DAVACL/Xml/Request/PrincipalSearchPropertySetReport.php4
-rw-r--r--vendor/sabre/dav/tests/Sabre/CalDAV/Backend/AbstractPDOTest.php14
-rw-r--r--vendor/sabre/dav/tests/Sabre/CalDAV/Backend/Mock.php2
-rw-r--r--vendor/sabre/dav/tests/Sabre/CalDAV/CalendarObjectTest.php2
-rw-r--r--vendor/sabre/dav/tests/Sabre/CalDAV/CalendarQueryValidatorTest.php3
-rw-r--r--vendor/sabre/dav/tests/Sabre/CalDAV/FreeBusyReportTest.php4
-rw-r--r--vendor/sabre/dav/tests/Sabre/CalDAV/ICSExportPluginTest.php2
-rw-r--r--vendor/sabre/dav/tests/Sabre/CalDAV/PluginTest.php6
-rw-r--r--vendor/sabre/dav/tests/Sabre/CalDAV/SharingPluginTest.php4
-rw-r--r--vendor/sabre/dav/tests/Sabre/CardDAV/AddressBookQueryTest.php51
-rw-r--r--vendor/sabre/dav/tests/Sabre/CardDAV/AddressBookTest.php6
-rw-r--r--vendor/sabre/dav/tests/Sabre/CardDAV/Backend/Mock.php13
-rw-r--r--vendor/sabre/dav/tests/Sabre/CardDAV/MultiGetTest.php2
-rw-r--r--vendor/sabre/dav/tests/Sabre/CardDAV/SogoStripContentTypeTest.php2
-rw-r--r--vendor/sabre/dav/tests/Sabre/CardDAV/ValidateFilterTest.php5
-rw-r--r--vendor/sabre/dav/tests/Sabre/CardDAV/ValidateVCardTest.php10
-rw-r--r--vendor/sabre/dav/tests/Sabre/DAV/Auth/Backend/Mock.php2
-rw-r--r--vendor/sabre/dav/tests/Sabre/DAV/Auth/PluginTest.php2
-rw-r--r--vendor/sabre/dav/tests/Sabre/DAV/ClientTest.php6
-rw-r--r--vendor/sabre/dav/tests/Sabre/DAV/Exception/LockedTest.php2
-rw-r--r--vendor/sabre/dav/tests/Sabre/DAV/Issue33Test.php2
-rw-r--r--vendor/sabre/dav/tests/Sabre/DAV/Locks/MSWordTest.php8
-rw-r--r--vendor/sabre/dav/tests/Sabre/DAV/Locks/PluginTest.php6
-rw-r--r--vendor/sabre/dav/tests/Sabre/DAV/Mock/Collection.php3
-rw-r--r--vendor/sabre/dav/tests/Sabre/DAV/Mock/File.php7
-rw-r--r--vendor/sabre/dav/tests/Sabre/DAV/PartialUpdate/SpecificationTest.php5
-rw-r--r--vendor/sabre/dav/tests/Sabre/DAV/ServerEventsTest.php8
-rw-r--r--vendor/sabre/dav/tests/Sabre/DAV/ServerRangeTest.php2
-rw-r--r--vendor/sabre/dav/tests/Sabre/DAV/StringUtilTest.php7
-rw-r--r--vendor/sabre/dav/tests/Sabre/DAV/TreeTest.php5
-rw-r--r--vendor/sabre/dav/tests/Sabre/DAVACL/PrincipalBackend/Mock.php2
-rw-r--r--vendor/sabre/http/.travis.yml4
-rw-r--r--vendor/sabre/http/CHANGELOG.md14
-rw-r--r--vendor/sabre/http/LICENSE2
-rw-r--r--vendor/sabre/http/composer.json1
-rw-r--r--vendor/sabre/http/lib/Message.php12
-rw-r--r--vendor/sabre/http/lib/MessageDecoratorTrait.php7
-rw-r--r--vendor/sabre/http/lib/MessageInterface.php3
-rw-r--r--vendor/sabre/http/lib/Request.php2
-rw-r--r--vendor/sabre/http/lib/Response.php3
-rw-r--r--vendor/sabre/http/lib/ResponseInterface.php2
-rw-r--r--vendor/sabre/http/lib/Sapi.php10
-rw-r--r--vendor/sabre/http/lib/URLUtil.php2
-rw-r--r--vendor/sabre/http/lib/Util.php2
-rw-r--r--vendor/sabre/http/lib/Version.php2
-rw-r--r--vendor/sabre/http/lib/functions.php4
-rw-r--r--vendor/sabre/uri/.travis.yml2
-rw-r--r--vendor/sabre/uri/CHANGELOG.md23
-rw-r--r--vendor/sabre/uri/LICENSE2
-rw-r--r--vendor/sabre/uri/README.md8
-rw-r--r--vendor/sabre/uri/composer.json4
-rw-r--r--vendor/sabre/uri/lib/InvalidUriException.php17
-rw-r--r--vendor/sabre/uri/lib/Version.php2
-rw-r--r--vendor/sabre/uri/lib/functions.php99
-rw-r--r--vendor/sabre/vobject/.travis.yml3
-rw-r--r--vendor/sabre/vobject/CHANGELOG.md18
-rwxr-xr-xvendor/sabre/vobject/bin/fetch_windows_zones.php2
-rw-r--r--vendor/sabre/vobject/composer.json4
-rw-r--r--vendor/sabre/vobject/lib/BirthdayCalendarGenerator.php8
-rw-r--r--vendor/sabre/vobject/lib/Component/VAlarm.php4
-rw-r--r--vendor/sabre/vobject/lib/Component/VCalendar.php112
-rw-r--r--vendor/sabre/vobject/lib/Component/VCard.php44
-rw-r--r--vendor/sabre/vobject/lib/DateTimeParser.php14
-rw-r--r--vendor/sabre/vobject/lib/FreeBusyGenerator.php6
-rw-r--r--vendor/sabre/vobject/lib/Parameter.php2
-rw-r--r--vendor/sabre/vobject/lib/Parser/Json.php2
-rw-r--r--vendor/sabre/vobject/lib/Parser/MimeDir.php4
-rw-r--r--vendor/sabre/vobject/lib/Parser/XML.php22
-rw-r--r--vendor/sabre/vobject/lib/Property/ICalendar/Duration.php2
-rw-r--r--vendor/sabre/vobject/lib/Property/ICalendar/Period.php2
-rw-r--r--vendor/sabre/vobject/lib/Property/ICalendar/Recur.php48
-rw-r--r--vendor/sabre/vobject/lib/Property/Text.php4
-rw-r--r--vendor/sabre/vobject/lib/Property/Uri.php2
-rw-r--r--vendor/sabre/vobject/lib/Property/VCard/DateAndOrTime.php24
-rw-r--r--vendor/sabre/vobject/lib/Recur/EventIterator.php6
-rw-r--r--vendor/sabre/vobject/lib/Recur/RRuleIterator.php93
-rw-r--r--vendor/sabre/vobject/lib/TimeZoneUtil.php10
-rw-r--r--vendor/sabre/vobject/lib/Version.php2
-rw-r--r--vendor/sabre/vobject/lib/timezonedata/lotuszones.php158
-rw-r--r--vendor/sabre/vobject/lib/timezonedata/windowszones.php32
-rw-r--r--view/css/bootstrap-red.css9
-rw-r--r--view/css/cdav_addressbook.css103
-rw-r--r--view/css/cdav_calendar.css22
-rw-r--r--view/css/conversation.css6
-rw-r--r--view/css/mod_help.css8
-rw-r--r--view/css/mod_manage.css12
-rw-r--r--view/css/mod_setup.css40
-rw-r--r--view/de/hmessages.po4434
-rw-r--r--view/de/hstrings.php366
-rw-r--r--view/de/htconfig.tpl7
-rw-r--r--view/en-au/htconfig.tpl7
-rw-r--r--view/en-gb/htconfig.tpl8
-rw-r--r--view/en/htconfig.tpl9
-rw-r--r--view/es-es/hmessages.po4432
-rw-r--r--view/es-es/hstrings.php298
-rw-r--r--view/fr/htconfig.tpl9
-rw-r--r--view/it/htconfig.tpl8
-rw-r--r--view/js/main.js20
-rw-r--r--view/nb-no/htconfig.tpl8
-rw-r--r--view/pdl/mod_cdav.pdl3
-rw-r--r--view/php/default.php2
-rw-r--r--view/php/full.php2
-rw-r--r--view/php/mod_import.php2
-rw-r--r--view/php/mod_setup.php2
-rw-r--r--view/php/theme_init.php1
-rw-r--r--view/pt-br/htconfig.tpl8
-rw-r--r--view/ru/htconfig.tpl7
-rw-r--r--view/sv/htconfig.tpl7
-rw-r--r--view/theme/redbasic/css/style.css44
-rw-r--r--view/theme/redbasic/js/redbasic.js14
-rw-r--r--view/theme/redbasic/php/style.php4
-rw-r--r--view/theme/redbasic/php/theme.php2
-rw-r--r--view/theme/redbasic/php/theme_init.php1
-rw-r--r--view/theme/redbasic/schema/bluegrid.css515
-rw-r--r--view/theme/redbasic/schema/bluegrid.php28
-rw-r--r--view/theme/redbasic/schema/dark.css4
-rwxr-xr-xview/tpl/abook_edit.tpl6
-rw-r--r--view/tpl/admin_account_edit.tpl5
-rwxr-xr-xview/tpl/admin_site.tpl3
-rwxr-xr-xview/tpl/admin_summary.tpl4
-rw-r--r--view/tpl/app.tpl12
-rw-r--r--view/tpl/apporder.tpl7
-rwxr-xr-xview/tpl/atom_feed.tpl7
-rw-r--r--view/tpl/cdav_addressbook.tpl462
-rw-r--r--view/tpl/cdav_calendar.tpl349
-rw-r--r--view/tpl/cdav_widget_addressbook.tpl67
-rw-r--r--view/tpl/cdav_widget_calendar.tpl121
-rwxr-xr-xview/tpl/channel.tpl6
-rw-r--r--view/tpl/chatrooms.tpl2
-rwxr-xr-xview/tpl/comment_item.tpl8
-rwxr-xr-xview/tpl/connection_template.tpl4
-rwxr-xr-xview/tpl/contact_slider.tpl6
-rwxr-xr-xview/tpl/conv_item.tpl106
-rwxr-xr-xview/tpl/conv_list.tpl102
-rw-r--r--view/tpl/diaspora_vcard.tpl69
-rwxr-xr-xview/tpl/install.tpl20
-rwxr-xr-xview/tpl/install_checks.tpl49
-rwxr-xr-xview/tpl/install_db.tpl59
-rwxr-xr-xview/tpl/install_settings.tpl57
-rw-r--r--view/tpl/item_binary.tpl3
-rw-r--r--view/tpl/item_categories.tpl2
-rwxr-xr-xview/tpl/jot-header.tpl172
-rwxr-xr-xview/tpl/jot.tpl3
-rwxr-xr-xview/tpl/mail_list.tpl2
-rwxr-xr-xview/tpl/msg-header.tpl53
-rwxr-xr-xview/tpl/nav.tpl35
-rwxr-xr-xview/tpl/photo_album.tpl5
-rwxr-xr-xview/tpl/photo_album_portfolio.tpl11
-rwxr-xr-xview/tpl/photo_albums.tpl2
-rwxr-xr-xview/tpl/photo_portfolio.tpl13
-rwxr-xr-xview/tpl/photos_recent.tpl5
-rwxr-xr-xview/tpl/profile_vcard.tpl9
-rwxr-xr-xview/tpl/profile_vcard_short.tpl4
-rwxr-xr-xview/tpl/prv_message.tpl1
-rwxr-xr-xview/tpl/search_item.tpl11
-rwxr-xr-xview/tpl/settings.tpl9
-rwxr-xr-xview/tpl/settings_account.tpl2
-rw-r--r--view/tpl/webpagelist.tpl2
-rw-r--r--view/tpl/xrd_diaspora.tpl3
-rwxr-xr-xview/tpl/xrd_person.tpl7
770 files changed, 23829 insertions, 60246 deletions
diff --git a/.travis.yml b/.travis.yml
index 53a0f73f7..41b480cf9 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -81,6 +81,12 @@ matrix:
dist: precise
services:
- mysql
+ # MySQL 5.7 with Docker container
+ - php: '7.1'
+ env: DB=mysql MYSQL_VERSION=5.7
+ sudo: required
+ services:
+ - docker
# Excludes from default matrix combinations
# exclude:
# - php: hhvm
@@ -100,6 +106,8 @@ cache:
before_install:
- travis_retry composer self-update
+ # Start MySQL 5.7 Docker container, needs some time to come up
+ - if [[ "$MYSQL_VERSION" == "5.7" ]]; then sudo service mysql stop; docker run -d -p 3306:3306 -e MYSQL_ALLOW_EMPTY_PASSWORD=yes mysql:5.7 && sleep 25 && docker ps; fi
# Install composer dev libs
install:
diff --git a/CHANGELOG b/CHANGELOG
index b263bcfe5..fa9ea8812 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -1,5 +1,99 @@
-Hubzilla 2.4.1 (2017-07-06)
- - Fix the wiki bug preventing page list display to observers other than the channel owner
+Hubzilla 2.6 (2017-08-16)
+ - Upgrade to bootstrap-4 beta
+ - Consolidate disable_discover_tab config
+ - Fix some bbcode to markdown conversion issues
+ - Improved finding of recursive attachment permissions
+ - Smaller line-height for notification badges
+ - Bluegrid schema removed - will be added again if someone is willing to maintain it
+ - Improved file_activity()
+ - DB - add index for item.obj_type
+ - Add options flag to bb_to_markdown() so we can distinguish between diaspora use and other use and therefore filter and adjust content selectively
+ - Close the apps-menu if the notifications-menu is open and vice versa
+ - Remove redundant call to jquery ready function in photo albums view
+ - Remove borders from navbar toggler in mobile view
+ - Improve the formatting of shares when converting from bbcode to markdown
+ - Suppress fopen errors from dav
+ - Make local channel (not our own) nav menus appear similar to what we are used from remote channels
+ - Indicate the selected channel in the dropdown menu if the feature is enabled
+ - Provide a mechanism to mark apps active in the app tray
+ - Allow wildcard tag and category searches
+ - Improved installer
+ - Update some addon docs and ensure we only generate statistics once a day
+ - Turn url requests where argv[0] is something.xyz into module='something' and $_REQUEST['module_format'] = 'xyz'; But leave modules beginning with . (like .well_known) alone (convert the initial . to _ and then strip it)
+ - Turn platform name and std_version into config variables
+ - Implement chunked uploads on the wall
+ - Prevent expiration of conversations you are involved with
+ - Update htmlpurifier to version 4.9.3
+ - Update sabre/http to version 4.2.3
+ - Add optimize-autoloader to composer config
+ - Missing abook_{my,their}_perms in pg schema and missing keys in mysql schema
+ - Provide a gender icon on the profile sidebar within reason
+ - Provide more comprehensible information on the admin summary page
+ - Upgrade blueimp from 9.8 to 9.18
+ - Chanview - if already connected, bypass the chanview intermediary page and go straight to the remote profile.
+ - Allow poke by xchan_hash
+ - guess_image_type() - ignore scheme when checking for urls
+ - Remove unused page_widgets.php include and provide a general function for loading sql from file
+ - Migrate cdav from addons to core
+ - Address several mail issues
+ - Add files and photos to featured apps by default
+ - import_author_zot() fixes
+ - Remove deprecated app parameter from conversation()
+ - Implement anonymous comments (like wordpress)
+ - Add rel=noopener to all external target _blank links
+ - Add 'can_comment_on_post' hook so we can better deal with the complications of Diaspora policy
+ - Added Portfolio widget (requires foundation)
+ - Convert schema_mysql engine to InnoDB and charset utf8mb4
+ - Put unreachable federated connections in the archived tab of the connections list page
+ - Indicate on connections page if a federated connection from another network is unavailable from the current location
+ - Make authenticated oembeds optional, default to false.
+ - Remove text_highlight css load from core
+ - Numerous ostatus feed improvements (mastodon, gnu-social)
+ - Provide hook when deleting a connection - we need this to clean up dangling PuSH subscriptions
+ - Move code syntax highlighting to plugin
+ - Oembed: ensure that width and height are returned as type int and not float
+ - Rewrite wiki pages widget - no need for ajax on pageload, show the pages to not authenticated people.
+ - Convert randprof to use chanlink_hash() instead of chanlink_url() and filter sys channels by xchan.xchan_system instead of xchan_addr != sys@%
+ - Update Sabre libraries
+ - Only provide "connected apps" on the settings menu if techlevel > 0.
+ - Provide ability to search webpage
+ - Move disapora xrd stuff to plugin
+ - Deprecate server_role
+ - Introduce automatic language selection for help, webpages, and wiki content
+ - Provide ability to order apps in app-tray
+ - Replace Markdownify library with html-to-markdown library
+
+ Bugfixes
+ - Fix channel manager and nav channel select visible if in a delegate session
+ - Fix wrong wiki pages in the sidebar github issue #841
+ - Fix a bug where if multiple channels uploaded the same file to the same folder, the uploaded file would end up with an incremental number added to the filename for each upload even if the file did not exist yet in the channels folder
+ - Fix privacy groups not syncing across clones properly (github issue #832)
+ - Fix an issue where the ability to use a portion of the message-id to display a message wasn't honoured in all cases
+ - Fix minor issues in the bs-default schema
+ - Fix backward compatibility for album links generated in earlier times before the ambiguity of photo album names was solved (github issue #827)
+ - Fix photo item comments not ported to bs4
+ - Fix incorrect album link
+ - Fix incorrect follow url in webfinger
+ - Fix regression - allow position attributes in oembedable zcards
+ - Fix affinitiy slider settings were being updated on any submit of of settings/featured
+ - Fix minor weirdness in zot finger results after deleting a clone from a channel that was on a site which was previously migrated from http to https and still had the old hubloc
+ - Fix cloud headers already sent issue
+ - Partial fix for failure to sync photos - appears to be memory exhaustion and dependent on filesize although an unrelated issue was found with directory creation during file sync (we didn't check ownership when looking for duplicates)
+ - Fix github issue #810
+ - Don't allow negative age in directory listings
+ - Fix allow setting a default schema for the hub (github issue #797) and allow selecting of focus (hubzilla default) schema if a default is set
+ - Fix update_r1189() for mysql and postgres
+
+ Plugins/Addon
+ Diaspora: Rewrite the addon to implemented Diaspora Version 2 federation protocol
+ GNU-Social: GNU-Social and Mastodon compatibility was greatly increased and a "fetch conversations" feature added to try and locate missing contextual references and maintain conversations in posts from those networks
+ Rename statistics_json to statistics and implement nodeinfo v2
+ New authchoose addon to restrict what sites you authenticate to by default
+ Cdav addon moved to core
+ head_add_css() needs a preceding '/' to find files in the addons dir
+ New addon code syntax highlighting (moved from core to addon)
+ Pubsubhubbub: specify a minimum number of records - otherwise it defaults to zero
+
Hubzilla 2.4 (2017-05-31)
- Silence php warning during install
diff --git a/Zotlabs/Access/PermissionLimits.php b/Zotlabs/Access/PermissionLimits.php
index 909b654d5..8caeedb91 100644
--- a/Zotlabs/Access/PermissionLimits.php
+++ b/Zotlabs/Access/PermissionLimits.php
@@ -10,7 +10,7 @@ class PermissionLimits {
$perms = Permissions::Perms();
$limits = array();
foreach($perms as $k => $v) {
- if(strstr($k,'view'))
+ if(strstr($k,'view') || $k === 'post_comments')
$limits[$k] = PERMS_PUBLIC;
else
$limits[$k] = PERMS_SPECIFIC;
diff --git a/Zotlabs/Access/Permissions.php b/Zotlabs/Access/Permissions.php
index d51e4d0ea..62c4af0ff 100644
--- a/Zotlabs/Access/Permissions.php
+++ b/Zotlabs/Access/Permissions.php
@@ -1,45 +1,52 @@
<?php
-
namespace Zotlabs\Access;
use Zotlabs\Lib as Zlib;
+/**
+ * @brief Extensible permissions.
+ *
+ * To add new permissions, add to the list of $perms below, with a simple description.
+ *
+ * Also visit PermissionRoles.php and add to the $ret['perms_connect'] property for any role
+ * if this permission should be granted to new connections.
+ *
+ * Next look at PermissionRoles::new_custom_perms() and provide a handler for updating custom
+ * permission roles. You will want to set a default PermissionLimit for each channel and also
+ * provide a sane default for any existing connections. You may or may not wish to provide a
+ * default auto permission. If in doubt, leave this alone as custom permissions by definition
+ * are the responsibility of the channel owner to manage. You just don't want to create any
+ * suprises or break things so you have an opportunity to provide sane settings.
+ *
+ * Update the version here and in PermissionRoles.
+ *
+ *
+ * Permissions with 'view' in the name are considered read permissions. Anything
+ * else requires authentication. Read permission limits are PERMS_PUBLIC and anything else
+ * is given PERMS_SPECIFIC.
+ *
+ * PermissionLimits::Std_limits() retrieves the standard limits. A permission role
+ * MAY alter an individual setting after retrieving the Std_limits if you require
+ * something different for a specific permission within the given role.
+ *
+ */
class Permissions {
- /**
- * Extensible permissions.
- * To add new permissions, add to the list of $perms below, with a simple description.
- *
- * Also visit PermissionRoles.php and add to the $ret['perms_connect'] property for any role
- * if this permission should be granted to new connections.
- *
- * Next look at PermissionRoles::new_custom_perms() and provide a handler for updating custom
- * permission roles. You will want to set a default PermissionLimit for each channel and also
- * provide a sane default for any existing connections. You may or may not wish to provide a
- * default auto permission. If in doubt, leave this alone as custom permissions by definition
- * are the responsibility of the channel owner to manage. You just don't want to create any
- * suprises or break things so you have an opportunity to provide sane settings.
- *
- * Update the version here and in PermissionRoles
- *
- *
- * Permissions with 'view' in the name are considered read permissions. Anything
- * else requires authentication. Read permission limits are PERMS_PUBLIC and anything else
- * is given PERMS_SPECIFIC.
- *
- * PermissionLimits::Std_limits() retrieves the standard limits. A permission role
- * MAY alter an individual setting after retrieving the Std_limits if you require
- * something different for a specific permission within the given role.
- *
- */
-
static public function version() {
// This must match the version in PermissionRoles.php before permission updates can run.
return 2;
}
-
+ /**
+ * @brief Return an array with Permissions.
+ *
+ * @hooks permissions_list
+ * * \e array \b permissions
+ * * \e string \b filter
+ * @param string $filter (optional) only passed to hook permission_list
+ * @return Associative array with permissions and short description.
+ */
static public function Perms($filter = '') {
$perms = [
@@ -63,18 +70,27 @@ class Permissions {
'delegate' => t('Can administer my channel')
];
- $x = array('permissions' => $perms, 'filter' => $filter);
- call_hooks('permissions_list',$x);
- return($x['permissions']);
+ $x = [
+ 'permissions' => $perms,
+ 'filter' => $filter
+ ];
+ call_hooks('permissions_list', $x);
+ return($x['permissions']);
}
+ /**
+ * @brief Perms from the above list that are blocked from anonymous observers.
+ *
+ * e.g. you must be authenticated.
+ *
+ * @hooks write_perms
+ * * \e array \b permissions
+ * @return Associative array with permissions and short description.
+ */
static public function BlockedAnonPerms() {
- // Perms from the above list that are blocked from anonymous observers.
- // e.g. you must be authenticated.
-
- $res = array();
+ $res = [];
$perms = PermissionLimits::Std_limits();
foreach($perms as $perm => $limit) {
if($limit != PERMS_PUBLIC) {
@@ -82,17 +98,22 @@ class Permissions {
}
}
- $x = array('permissions' => $res);
- call_hooks('write_perms',$x);
- return($x['permissions']);
+ $x = ['permissions' => $res];
+ call_hooks('write_perms', $x);
+ return($x['permissions']);
}
- // converts [ 0 => 'view_stream', ... ]
- // to [ 'view_stream' => 1 ]
- // for any permissions in $arr;
- // Undeclared permissions are set to 0
-
+ /**
+ * @brief Converts indexed perms array to associative perms array.
+ *
+ * Converts [ 0 => 'view_stream', ... ]
+ * to [ 'view_stream' => 1 ] for any permissions in $arr;
+ * Undeclared permissions which exist in Perms() are added and set to 0.
+ *
+ * @param array $arr
+ * @return array
+ */
static public function FilledPerms($arr) {
if(is_null($arr)) {
btlogger('FilledPerms: null');
@@ -101,15 +122,26 @@ class Permissions {
$everything = self::Perms();
$ret = [];
foreach($everything as $k => $v) {
- if(in_array($k,$arr))
+ if(in_array($k, $arr))
$ret[$k] = 1;
else
$ret[$k] = 0;
}
- return $ret;
+ return $ret;
}
+ /**
+ * @brief Convert perms array to indexed array.
+ *
+ * Converts [ 'view_stream' => 1 ] for any permissions in $arr
+ * to [ 0 => ['name' => 'view_stream', 'value' => 1], ... ]
+ *
+ * @param array $arr associative perms array 'view_stream' => 1
+ * @return Indexed array with elements that look like
+ * * \e string \b name the perm name (e.g. view_stream)
+ * * \e int \b value the value of the perm (e.g. 1)
+ */
static public function OPerms($arr) {
$ret = [];
if($arr) {
@@ -120,7 +152,12 @@ class Permissions {
return $ret;
}
-
+ /**
+ * @brief
+ *
+ * @param int $channel_id
+ * @return boolean|array
+ */
static public function FilledAutoperms($channel_id) {
if(! intval(get_pconfig($channel_id,'system','autoperms')))
return false;
@@ -137,16 +174,34 @@ class Permissions {
return $arr;
}
- static public function PermsCompare($p1,$p2) {
+ /**
+ * @brief Compares that all Permissions from $p1 exist also in $p2.
+ *
+ * @param array $p1 The perms that have to exist in $p2
+ * @param array $p2 The perms to compare against
+ * @return boolean true if all perms from $p1 exist also in $p2
+ */
+ static public function PermsCompare($p1, $p2) {
foreach($p1 as $k => $v) {
- if(! array_key_exists($k,$p2))
+ if(! array_key_exists($k, $p2))
return false;
+
if($p1[$k] != $p2[$k])
return false;
}
+
return true;
}
+ /**
+ * @brief
+ *
+ * @param int $channel_id A channel id
+ * @return associative array
+ * * \e array \b perms Permission array
+ * * \e int \b automatic 0 or 1
+ */
+
static public function connect_perms($channel_id) {
$my_perms = [];
@@ -155,7 +210,7 @@ class Permissions {
// If a default permcat exists, use that
- $pc = ((feature_enabled($channel_id,'permcats')) ? get_pconfig($channel_id,'system','default_permcat') : 'default');
+ $pc = ((feature_enabled($channel_id,'permcats')) ? get_pconfig($channel_id,'system','default_permcat') : 'default');
if(! in_array($pc, [ '','default' ])) {
$pcp = new Zlib\Permcat($channel_id);
$permcat = $pcp->fetch($pc);
@@ -167,7 +222,7 @@ class Permissions {
}
// look up the permission role to see if it specified auto-connect
- // and if there was no permcat or a default permcat, set the perms
+ // and if there was no permcat or a default permcat, set the perms
// from the role
$role = get_pconfig($channel_id,'system','permissions_role');
@@ -195,7 +250,7 @@ class Permissions {
}
// If we reached this point with no permissions, the channel is using
- // custom perms but they are not automatic. They will be stored in abconfig with
+ // custom perms but they are not automatic. They will be stored in abconfig with
// the channel's channel_hash (the 'self' connection).
if(! $my_perms) {
diff --git a/Zotlabs/Daemon/Cron.php b/Zotlabs/Daemon/Cron.php
index c84708ba4..65edbedfa 100644
--- a/Zotlabs/Daemon/Cron.php
+++ b/Zotlabs/Daemon/Cron.php
@@ -174,7 +174,8 @@ class Cron {
// pull in some public posts
- if(! get_config('system','disable_discover_tab'))
+ $disable_discover_tab = get_config('system','disable_discover_tab') || get_config('system','disable_discover_tab') === false;
+ if(! $disable_discover_tab)
Master::Summon(array('Externals'));
$generation = 0;
diff --git a/Zotlabs/Daemon/Cron_daily.php b/Zotlabs/Daemon/Cron_daily.php
index 038790572..f0351fcdd 100644
--- a/Zotlabs/Daemon/Cron_daily.php
+++ b/Zotlabs/Daemon/Cron_daily.php
@@ -51,6 +51,7 @@ class Cron_daily {
update_channels_active_halfyear_stat();
update_channels_active_monthly_stat();
update_local_posts_stat();
+ update_local_comments_stat();
// expire old delivery reports
@@ -87,7 +88,7 @@ class Cron_daily {
call_hooks('cron_daily',datetime_convert());
- set_config('system','last_expire_day',$d2);
+ set_config('system','last_expire_day',intval(datetime_convert('UTC','UTC','now','d')));
/**
* End Cron Daily
diff --git a/Zotlabs/Daemon/Importdoc.php b/Zotlabs/Daemon/Importdoc.php
index 3109a5d86..0ca589e4a 100755
--- a/Zotlabs/Daemon/Importdoc.php
+++ b/Zotlabs/Daemon/Importdoc.php
@@ -21,12 +21,18 @@ class Importdoc {
$files = glob("$d/$f");
if($files) {
foreach($files as $fi) {
- if($fi === 'doc/html')
+ if($fi === 'doc/html') {
continue;
- if(is_dir($fi))
+ }
+ if(is_dir($fi)) {
self::update_docs_dir("$fi/*");
- else
- store_doc_file($fi);
+ }
+ else {
+ // don't update media content
+ if(strpos(z_mime_content_type($fi),'text') === 0) {
+ store_doc_file($fi);
+ }
+ }
}
}
}
diff --git a/Zotlabs/Daemon/Notifier.php b/Zotlabs/Daemon/Notifier.php
index 3afe1a5dc..6bca22025 100644
--- a/Zotlabs/Daemon/Notifier.php
+++ b/Zotlabs/Daemon/Notifier.php
@@ -64,8 +64,6 @@ require_once('include/bbcode.php');
* purge_all channel_id
* expire channel_id
* relay item_id (item was relayed to owner, we will deliver it as owner)
- * single_activity item_id (deliver to a singleton network from the appropriate clone)
- * single_mail mail_id (deliver to a singleton network from the appropriate clone)
* location channel_id
* request channel_id xchan_hash message_id
* rating xlink_id
@@ -105,7 +103,7 @@ class Notifier {
$normal_mode = true;
$packet_type = 'undefined';
- if($cmd === 'mail' || $cmd === 'single_mail') {
+ if($cmd === 'mail') {
$normal_mode = false;
$mail = true;
$private = true;
@@ -270,7 +268,8 @@ class Notifier {
// Check for non published items, but allow an exclusion for transmitting hidden file activities
- if(intval($target_item['item_unpublished']) || intval($target_item['item_delayed']) ||
+ if(intval($target_item['item_unpublished']) || intval($target_item['item_delayed']) ||
+ intval($target_item['item_blocked']) ||
( intval($target_item['item_hidden']) && ($target_item['obj_type'] !== ACTIVITY_OBJ_FILE))) {
logger('notifier: target item not published, so not forwardable', LOGGER_DEBUG);
return;
@@ -391,7 +390,6 @@ class Notifier {
return;
}
}
-
}
$walltowall = (($top_level_post && $channel['xchan_hash'] === $target_item['author_xchan']) ? true : false);
@@ -408,7 +406,7 @@ class Notifier {
if(! $recipients)
return;
-// logger('notifier: recipients: ' . print_r($recipients,true), LOGGER_NORMAL, LOG_DEBUG);
+ // logger('notifier: recipients: ' . print_r($recipients,true), LOGGER_NORMAL, LOG_DEBUG);
$env_recips = (($private) ? array() : null);
@@ -421,40 +419,40 @@ class Notifier {
foreach($details as $d) {
$recip_list[] = $d['xchan_addr'] . ' (' . $d['xchan_hash'] . ')';
- if($private)
- $env_recips[] = array('guid' => $d['xchan_guid'],'guid_sig' => $d['xchan_guid_sig'],'hash' => $d['xchan_hash']);
-
- if($d['xchan_network'] === 'mail' && $normal_mode) {
- $delivery_options = get_xconfig($d['xchan_hash'],'system','delivery_mode');
- if(! $delivery_options)
- format_and_send_email($channel,$d,$target_item);
+ if($private) {
+ $env_recips[] = [
+ 'guid' => $d['xchan_guid'],
+ 'guid_sig' => $d['xchan_guid_sig'],
+ 'hash' => $d['xchan_hash']
+ ];
}
}
}
- $narr = array(
- 'channel' => $channel,
- 'upstream' => $upstream,
- 'env_recips' => $env_recips,
- 'packet_recips' => $packet_recips,
- 'recipients' => $recipients,
- 'item' => $item,
- 'target_item' => $target_item,
+ $narr = [
+ 'channel' => $channel,
+ 'upstream' => $upstream,
+ 'env_recips' => $env_recips,
+ 'packet_recips' => $packet_recips,
+ 'recipients' => $recipients,
+ 'item' => $item,
+ 'target_item' => $target_item,
+ 'parent_item' => $parent_item,
'top_level_post' => $top_level_post,
- 'private' => $private,
+ 'private' => $private,
'relay_to_owner' => $relay_to_owner,
- 'uplink' => $uplink,
- 'cmd' => $cmd,
- 'mail' => $mail,
- 'single' => (($cmd === 'single_mail' || $cmd === 'single_activity') ? true : false),
- 'location' => $location,
- 'request' => $request,
- 'normal_mode' => $normal_mode,
- 'packet_type' => $packet_type,
- 'walltowall' => $walltowall,
- 'queued' => array()
- );
+ 'uplink' => $uplink,
+ 'cmd' => $cmd,
+ 'mail' => $mail,
+ 'single' => false,
+ 'location' => $location,
+ 'request' => $request,
+ 'normal_mode' => $normal_mode,
+ 'packet_type' => $packet_type,
+ 'walltowall' => $walltowall,
+ 'queued' => []
+ ];
call_hooks('notifier_process', $narr);
if($narr['queued']) {
@@ -491,8 +489,6 @@ class Notifier {
$hubs = $r;
-
-
/**
* Reduce the hubs to those that are unique. For zot hubs, we need to verify uniqueness by the sitekey,
* since it may have been a re-install which has not yet been detected and pruned.
@@ -523,49 +519,48 @@ class Notifier {
if($hub['hubloc_network'] == 'zot') {
if(! in_array($hub['hubloc_sitekey'],$keys)) {
$hublist[] = $hub['hubloc_host'];
- $dhubs[] = $hub;
- $keys[] = $hub['hubloc_sitekey'];
+ $dhubs[] = $hub;
+ $keys[] = $hub['hubloc_sitekey'];
}
}
else {
if(! in_array($hub['hubloc_url'],$urls)) {
$hublist[] = $hub['hubloc_host'];
- $dhubs[] = $hub;
- $urls[] = $hub['hubloc_url'];
+ $dhubs[] = $hub;
+ $urls[] = $hub['hubloc_url'];
}
}
}
logger('notifier: will notify/deliver to these hubs: ' . print_r($hublist,true), LOGGER_DEBUG, LOG_DEBUG);
-
foreach($dhubs as $hub) {
if($hub['hubloc_network'] !== 'zot') {
-
- $narr = array(
- 'channel' => $channel,
- 'upstream' => $upstream,
- 'env_recips' => $env_recips,
- 'packet_recips' => $packet_recips,
- 'recipients' => $recipients,
- 'item' => $item,
- 'target_item' => $target_item,
- 'hub' => $hub,
+ $narr = [
+ 'channel' => $channel,
+ 'upstream' => $upstream,
+ 'env_recips' => $env_recips,
+ 'packet_recips' => $packet_recips,
+ 'recipients' => $recipients,
+ 'item' => $item,
+ 'target_item' => $target_item,
+ 'parent_item' => $parent_item,
+ 'hub' => $hub,
'top_level_post' => $top_level_post,
- 'private' => $private,
+ 'private' => $private,
'relay_to_owner' => $relay_to_owner,
- 'uplink' => $uplink,
- 'cmd' => $cmd,
- 'mail' => $mail,
- 'single' => (($cmd === 'single_mail' || $cmd === 'single_activity') ? true : false),
- 'location' => $location,
- 'request' => $request,
- 'normal_mode' => $normal_mode,
- 'packet_type' => $packet_type,
- 'walltowall' => $walltowall,
- 'queued' => array()
- );
+ 'uplink' => $uplink,
+ 'cmd' => $cmd,
+ 'mail' => $mail,
+ 'single' => false,
+ 'location' => $location,
+ 'request' => $request,
+ 'normal_mode' => $normal_mode,
+ 'packet_type' => $packet_type,
+ 'walltowall' => $walltowall,
+ 'queued' => []
+ ];
call_hooks('notifier_hub',$narr);
@@ -577,21 +572,6 @@ class Notifier {
}
- // singleton deliveries by definition 'not got zot'.
- // Single deliveries are other federated networks (plugins) and we're essentially
- // delivering only to those that have this site url in their abook_instance
- // and only from within a sync operation. This means if you post from a clone,
- // and a connection is connected to one of your other clones; assuming that hub
- // is running it will receive a sync packet. On receipt of this sync packet it
- // will invoke a delivery to those connections which are connected to just that
- // hub instance.
-
- if($cmd === 'single_mail' || $cmd === 'single_activity') {
- continue;
- }
-
- // default: zot protocol
-
$hash = random_string();
$packet = null;
@@ -617,14 +597,16 @@ class Notifier {
else {
$env = (($hub_env && $hub_env[$hub['hubloc_host'] . $hub['hubloc_sitekey']]) ? $hub_env[$hub['hubloc_host'] . $hub['hubloc_sitekey']] : '');
$packet = zot_build_packet($channel,'notify',$env,(($private) ? $hub['hubloc_sitekey'] : null), $hub['site_crypto'],$hash);
- queue_insert(array(
- 'hash' => $hash,
- 'account_id' => $target_item['aid'],
- 'channel_id' => $target_item['uid'],
- 'posturl' => $hub['hubloc_callback'],
- 'notify' => $packet,
- 'msg' => json_encode($encoded_item)
- ));
+ queue_insert(
+ [
+ 'hash' => $hash,
+ 'account_id' => $target_item['aid'],
+ 'channel_id' => $target_item['uid'],
+ 'posturl' => $hub['hubloc_callback'],
+ 'notify' => $packet,
+ 'msg' => json_encode($encoded_item)
+ ]
+ );
// only create delivery reports for normal undeleted items
if(is_array($target_item) && array_key_exists('postopts',$target_item) && (! $target_item['item_deleted']) && (! get_config('system','disable_dreport'))) {
@@ -645,9 +627,9 @@ class Notifier {
if($normal_mode) {
$x = q("select * from hook where hook = 'notifier_normal'");
- if($x)
- Master::Summon(array('Deliver_hooks',$target_item['id']));
-
+ if($x) {
+ Master::Summon( [ 'Deliver_hooks', $target_item['id'] ] );
+ }
}
if($deliveries)
diff --git a/Zotlabs/Extend/Hook.php b/Zotlabs/Extend/Hook.php
index fef3ebe9b..c6f9ea850 100644
--- a/Zotlabs/Extend/Hook.php
+++ b/Zotlabs/Extend/Hook.php
@@ -40,6 +40,15 @@ class Hook {
return $r;
}
+ static public function register_array($file,$arr) {
+ if($arr) {
+ foreach($arr as $k => $v) {
+ self::register($k,$file,$v);
+ }
+ }
+ }
+
+
static public function unregister($hook,$file,$function,$version = 1,$priority = 0) {
if(is_array($function)) {
$function = serialize($function);
diff --git a/Zotlabs/Lib/ActivityStreams2.php b/Zotlabs/Lib/ActivityStreams2.php
new file mode 100644
index 000000000..904782bf7
--- /dev/null
+++ b/Zotlabs/Lib/ActivityStreams2.php
@@ -0,0 +1,86 @@
+<?php
+
+namespace Zotlabs\Lib;
+
+
+class ActivityStreams2 {
+
+ public $data;
+ public $valid = false;
+ public $id = '';
+ public $type = '';
+ public $actor = null;
+ public $obj = null;
+ public $tgt = null;
+
+ function __construct($string) {
+
+ $this->data = json_decode($string,true);
+ if($this->data) {
+ $this->valid = true;
+ }
+
+ if($this->is_valid()) {
+ $this->id = $this->get_property_obj('id');
+ $this->type = $this->get_primary_type();
+ $this->actor = $this->get_compound_property('actor');
+ $this->obj = $this->get_compound_property('object');
+ $this->tgt = $this->get_compound_property('target');
+ }
+ }
+
+ function is_valid() {
+ return $this->valid;
+ }
+
+ function get_property_obj($property,$base = '') {
+ if(! $base) {
+ $base = $this->data;
+ }
+ return $base[$property];
+ }
+
+ function fetch_property($url) {
+ $redirects = 0;
+ $x = z_fetch_url($url,true,$redirects,
+ ['headers' => [ 'Accept: application/ld+json; profile="https://www.w3.org/ns/activitystreams"']]);
+ if($x['success'])
+ return json_decode($x['body'],true);
+ return null;
+ }
+
+ function get_compound_property($property,$base = '') {
+ $x = $this->get_property_obj($property,$base);
+ if($this->is_url($x)) {
+ $x = $this->fetch_property($x);
+ }
+ return $x;
+ }
+
+ function is_url($url) {
+ if(($url) && (! is_array($url)) && (strpos($url,'http') === 0)) {
+ return true;
+ }
+ return false;
+ }
+
+ function get_primary_type($base = '') {
+ if(! $base)
+ $base = $this->data;
+ $x = $this->get_property_obj('type',$base);
+ if(is_array($x)) {
+ foreach($x as $y) {
+ if(strpos($y,':') === false) {
+ return $y;
+ }
+ }
+ }
+ return $x;
+ }
+
+ function debug() {
+ $x = var_export($this,true);
+ return $x;
+ }
+
+} \ No newline at end of file
diff --git a/Zotlabs/Lib/Apps.php b/Zotlabs/Lib/Apps.php
index 2ace361ca..68587df49 100644
--- a/Zotlabs/Lib/Apps.php
+++ b/Zotlabs/Lib/Apps.php
@@ -209,6 +209,7 @@ class Apps {
static public function translate_system_apps(&$arr) {
$apps = array(
+ 'Apps' => t('Apps'),
'Site Admin' => t('Site Admin'),
'Report Bug' => t('Report Bug'),
'View Bookmarks' => t('View Bookmarks'),
@@ -371,6 +372,7 @@ class Apps {
'$feature' => (($papp['embed']) ? false : true),
'$featured' => ((strpos($papp['categories'], 'nav_featured_app') === false) ? false : true),
'$navapps' => (($mode == 'nav') ? true : false),
+ '$order' => (($mode == 'nav-order') ? true : false),
'$add' => t('Add to app-tray'),
'$remove' => t('Remove from app-tray')
));
@@ -539,6 +541,129 @@ class Apps {
return($r);
}
+ static public function app_order($uid,$apps) {
+
+ if(! $apps)
+ return $apps;
+
+ $x = (($uid) ? get_pconfig($uid,'system','app_order') : get_config('system','app_order'));
+ if(($x) && (! is_array($x))) {
+ $y = explode(',',$x);
+ $y = array_map('trim',$y);
+ $x = $y;
+ }
+
+ if(! (is_array($x) && ($x)))
+ return $apps;
+
+ $ret = [];
+ foreach($x as $xx) {
+ $y = self::find_app_in_array($xx,$apps);
+ if($y) {
+ $ret[] = $y;
+ }
+ }
+ foreach($apps as $ap) {
+ if(! self::find_app_in_array($ap['name'],$ret)) {
+ $ret[] = $ap;
+ }
+ }
+ return $ret;
+
+ }
+
+ static function find_app_in_array($name,$arr) {
+ if(! $arr)
+ return false;
+ foreach($arr as $x) {
+ if($x['name'] === $name) {
+ return $x;
+ }
+ }
+ return false;
+ }
+
+ static function moveup($uid,$guid) {
+ $syslist = array();
+ $list = self::app_list($uid, false, 'nav_featured_app');
+ if($list) {
+ foreach($list as $li) {
+ $syslist[] = self::app_encode($li);
+ }
+ }
+ self::translate_system_apps($syslist);
+
+ usort($syslist,'self::app_name_compare');
+
+ $syslist = self::app_order($uid,$syslist);
+
+ if(! $syslist)
+ return;
+
+ $newlist = [];
+
+ foreach($syslist as $k => $li) {
+ if($li['guid'] === $guid) {
+ $position = $k;
+ break;
+ }
+ }
+ if(! $position)
+ return;
+ $dest_position = $position - 1;
+ $saved = $syslist[$dest_position];
+ $syslist[$dest_position] = $syslist[$position];
+ $syslist[$position] = $saved;
+
+ $narr = [];
+ foreach($syslist as $x) {
+ $narr[] = $x['name'];
+ }
+
+ set_pconfig($uid,'system','app_order',implode(',',$narr));
+
+ }
+
+ static function movedown($uid,$guid) {
+ $syslist = array();
+ $list = self::app_list($uid, false, 'nav_featured_app');
+ if($list) {
+ foreach($list as $li) {
+ $syslist[] = self::app_encode($li);
+ }
+ }
+ self::translate_system_apps($syslist);
+
+ usort($syslist,'self::app_name_compare');
+
+ $syslist = self::app_order($uid,$syslist);
+
+ if(! $syslist)
+ return;
+
+ $newlist = [];
+
+ foreach($syslist as $k => $li) {
+ if($li['guid'] === $guid) {
+ $position = $k;
+ break;
+ }
+ }
+ if($position >= count($syslist) - 1)
+ return;
+ $dest_position = $position + 1;
+ $saved = $syslist[$dest_position];
+ $syslist[$dest_position] = $syslist[$position];
+ $syslist[$position] = $saved;
+
+ $narr = [];
+ foreach($syslist as $x) {
+ $narr[] = $x['name'];
+ }
+
+ set_pconfig($uid,'system','app_order',implode(',',$narr));
+
+ }
static public function app_decode($s) {
$x = base64_decode(str_replace(array('<br />',"\r","\n",' '),array('','','',''),$s));
diff --git a/Zotlabs/Lib/Cache.php b/Zotlabs/Lib/Cache.php
index f211269be..cea075659 100644
--- a/Zotlabs/Lib/Cache.php
+++ b/Zotlabs/Lib/Cache.php
@@ -9,10 +9,10 @@ namespace Zotlabs\Lib;
class Cache {
public static function get($key) {
- $key = substr($key,0,254);
+ $hash = hash('whirlpool',$key);
$r = q("SELECT v FROM cache WHERE k = '%s' limit 1",
- dbesc($key)
+ dbesc($hash)
);
if ($r)
@@ -22,20 +22,20 @@ class Cache {
public static function set($key,$value) {
- $key = substr($key,0,254);
+ $hash = hash('whirlpool',$key);
$r = q("SELECT * FROM cache WHERE k = '%s' limit 1",
- dbesc($key)
+ dbesc($hash)
);
if($r) {
q("UPDATE cache SET v = '%s', updated = '%s' WHERE k = '%s'",
dbesc($value),
dbesc(datetime_convert()),
- dbesc($key));
+ dbesc($hash));
}
else {
q("INSERT INTO cache ( k, v, updated) VALUES ('%s','%s','%s')",
- dbesc($key),
+ dbesc($hash),
dbesc($value),
dbesc(datetime_convert()));
}
diff --git a/Zotlabs/Lib/Config.php b/Zotlabs/Lib/Config.php
index 5625a3f79..6e042feba 100644
--- a/Zotlabs/Lib/Config.php
+++ b/Zotlabs/Lib/Config.php
@@ -53,7 +53,7 @@ class Config {
$dbvalue = ((is_array($value)) ? serialize($value) : $value);
$dbvalue = ((is_bool($dbvalue)) ? intval($dbvalue) : $dbvalue);
- if(get_config($family, $key) === false || (! self::get_from_storage($family, $key))) {
+ if(self::Get($family, $key) === false || (! self::get_from_storage($family, $key))) {
$ret = q("INSERT INTO config ( cat, k, v ) VALUES ( '%s', '%s', '%s' ) ",
dbesc($family),
dbesc($key),
diff --git a/Zotlabs/Lib/DB_Upgrade.php b/Zotlabs/Lib/DB_Upgrade.php
index bb72e7a05..8f0488f6f 100644
--- a/Zotlabs/Lib/DB_Upgrade.php
+++ b/Zotlabs/Lib/DB_Upgrade.php
@@ -10,15 +10,17 @@ class DB_Upgrade {
function __construct($db_revision) {
- $update_file = 'install/' . PLATFORM_NAME . '/update.php';
+ $platform_name = System::get_platform_name();
+
+ $update_file = 'install/' . $platform_name . '/update.php';
if(! file_exists($update_file)) {
$update_file = 'install/update.php';
$this->config_name = 'db_version';
$this->func_prefix = 'update_r';
}
else {
- $this->config_name = PLATFORM_NAME . '_db_version';
- $this->func_prefix = PLATFORM_NAME . '_update_';
+ $this->config_name = $platform_name . '_db_version';
+ $this->func_prefix = $platform_name . '_update_';
}
$build = get_config('system', $this->config_name, 0);
diff --git a/Zotlabs/Lib/Enotify.php b/Zotlabs/Lib/Enotify.php
index a10675a87..9f3347d19 100644
--- a/Zotlabs/Lib/Enotify.php
+++ b/Zotlabs/Lib/Enotify.php
@@ -170,6 +170,7 @@ class Enotify {
xchan_query($p);
+ $moderated = (($p[0]['item_blocked'] == ITEM_MODERATED) ? true : false);
$item_post_type = item_post_type($p[0]);
// $private = $p[0]['item_private'];
@@ -208,13 +209,21 @@ class Enotify {
// Before this we have the name of the replier on the subject rendering
// differents subjects for messages on the same thread.
- $subject = sprintf( t('[$Projectname:Notify] Comment to conversation #%1$d by %2$s'), $parent_id, $sender['xchan_name']);
+ if($moderated)
+ $subject = sprintf( t('[$Projectname:Notify] Moderated Comment to conversation #%1$d by %2$s'), $parent_id, $sender['xchan_name']);
+ else
+ $subject = sprintf( t('[$Projectname:Notify] Comment to conversation #%1$d by %2$s'), $parent_id, $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>');
+ if($moderated) {
+ $tsitelink .= "\n\n" . sprintf( t('Please visit %s to approve or reject this comment.'), z_root() . '/moderate' );
+ $hsitelink .= "<br><br>" . sprintf( t('Please visit %s to approve or reject this comment.'), '<a href="' . z_root() . '/moderate">' . z_root() . '/moderate</a>' );
+ }
+
}
if ($params['type'] == NOTIFY_LIKE) {
diff --git a/Zotlabs/Lib/NativeWikiPage.php b/Zotlabs/Lib/NativeWikiPage.php
index ed3df436c..78b54ebda 100644
--- a/Zotlabs/Lib/NativeWikiPage.php
+++ b/Zotlabs/Lib/NativeWikiPage.php
@@ -44,7 +44,7 @@ class NativeWikiPage {
$pages[] = [
'resource_id' => $resource_id,
'title' => escape_tags($title),
- 'url' => urlencode(urlencode($title)),
+ 'url' => str_replace('%2F','/',urlencode(str_replace('%2F','/',urlencode($title)))),
'link_id' => 'id_' . substr($resource_id, 0, 10) . '_' . $page_item['id']
];
}
diff --git a/Zotlabs/Lib/PConfig.php b/Zotlabs/Lib/PConfig.php
index d70697fbc..25478e764 100644
--- a/Zotlabs/Lib/PConfig.php
+++ b/Zotlabs/Lib/PConfig.php
@@ -119,7 +119,7 @@ class PConfig {
$dbvalue = ((is_array($value)) ? serialize($value) : $value);
$dbvalue = ((is_bool($dbvalue)) ? intval($dbvalue) : $dbvalue);
- if(get_pconfig($uid, $family, $key) === false) {
+ if(self::Get($uid, $family, $key) === false) {
if(! array_key_exists($uid, \App::$config))
\App::$config[$uid] = array();
if(! array_key_exists($family, \App::$config[$uid]))
diff --git a/Zotlabs/Lib/System.php b/Zotlabs/Lib/System.php
index 306c90f4a..a5790fb07 100644
--- a/Zotlabs/Lib/System.php
+++ b/Zotlabs/Lib/System.php
@@ -19,6 +19,9 @@ class System {
static public function get_project_version() {
if(is_array(\App::$config) && is_array(\App::$config['system']) && \App::$config['system']['hide_version'])
return '';
+ if(is_array(\App::$config) && is_array(\App::$config['system']) && array_key_exists('std_version',\App::$config['system']))
+ return \App::$config['system']['std_version'];
+
return self::get_std_version();
}
@@ -54,12 +57,8 @@ class System {
return 'https://github.com/redmatrix/hubzilla';
}
-
-
static public function get_server_role() {
- if(is_array(\App::$config) && is_array(\App::$config['system']) && \App::$config['system']['server_role'])
- return \App::$config['system']['server_role'];
- return 'standard';
+ return 'pro';
}
static public function get_std_version() {
@@ -72,11 +71,8 @@ class System {
if(get_directory_realm() != DIRECTORY_REALM)
return true;
-
- foreach(['hubzilla','zap'] as $t) {
- if(stristr($p,$t))
- return true;
- }
+ if(in_array(strtolower($p),['hubzilla','zap','red']))
+ return true;
return false;
}
}
diff --git a/Zotlabs/Lib/Techlevels.php b/Zotlabs/Lib/Techlevels.php
index 6a8c36fb3..380901678 100644
--- a/Zotlabs/Lib/Techlevels.php
+++ b/Zotlabs/Lib/Techlevels.php
@@ -7,12 +7,12 @@ class Techlevels {
static public function levels() {
$techlevels = [
- '0' => t('Beginner/Basic'),
- '1' => t('Novice - not skilled but willing to learn'),
- '2' => t('Intermediate - somewhat comfortable'),
- '3' => t('Advanced - very comfortable'),
- '4' => t('Expert - I can write computer code'),
- '5' => t('Wizard - I probably know more than you do')
+ '0' => t('0. Beginner/Basic'),
+ '1' => t('1. Novice - not skilled but willing to learn'),
+ '2' => t('2. Intermediate - somewhat comfortable'),
+ '3' => t('3. Advanced - very comfortable'),
+ '4' => t('4. Expert - I can write computer code'),
+ '5' => t('5. Wizard - I probably know more than you do')
];
return $techlevels;
}
diff --git a/Zotlabs/Lib/ThreadItem.php b/Zotlabs/Lib/ThreadItem.php
index 5910ea672..17d65dbc7 100644
--- a/Zotlabs/Lib/ThreadItem.php
+++ b/Zotlabs/Lib/ThreadItem.php
@@ -153,7 +153,7 @@ class ThreadItem {
$response_verbs[] = 'attendyes';
$response_verbs[] = 'attendno';
$response_verbs[] = 'attendmaybe';
- if($this->is_commentable()) {
+ if($this->is_commentable() && $observer) {
$isevent = true;
$attend = array( t('I will attend'), t('I will not attend'), t('I might attend'));
}
@@ -164,7 +164,7 @@ class ThreadItem {
$response_verbs[] = 'agree';
$response_verbs[] = 'disagree';
$response_verbs[] = 'abstain';
- if($this->is_commentable()) {
+ if($this->is_commentable() && $observer) {
$conlabels = array( t('I agree'), t('I disagree'), t('I abstain'));
$canvote = true;
}
@@ -251,8 +251,6 @@ class ThreadItem {
);
}
- $server_role = get_config('system','server_role');
-
$has_bookmarks = false;
if(is_array($item['term'])) {
foreach($item['term'] as $t) {
@@ -265,7 +263,7 @@ class ThreadItem {
if(($item['obj_type'] === ACTIVITY_OBJ_EVENT) && $conv->get_profile_owner() == local_channel())
$has_event = true;
- if($this->is_commentable()) {
+ if($this->is_commentable() && $observer) {
$like = array( t("I like this \x28toggle\x29"), t("like"));
$dislike = array( t("I don't like this \x28toggle\x29"), t("dislike"));
}
@@ -371,7 +369,7 @@ class ThreadItem {
'has_tags' => $has_tags,
'reactions' => $this->reactions,
// Item toolbar buttons
- 'emojis' => (($this->is_toplevel() && $this->is_commentable() && feature_enabled($conv->get_profile_owner(),'emojis')) ? '1' : ''),
+ 'emojis' => (($this->is_toplevel() && $this->is_commentable() && $observer && feature_enabled($conv->get_profile_owner(),'emojis')) ? '1' : ''),
'like' => $like,
'dislike' => ((feature_enabled($conv->get_profile_owner(),'dislike')) ? $dislike : ''),
'share' => $share,
@@ -714,7 +712,6 @@ class ThreadItem {
call_hooks('comment_buttons',$arr);
$comment_buttons = $arr['comment_buttons'];
-
$comment_box = replace_macros($template,array(
'$return_path' => '',
'$threaded' => $this->is_threaded(),
@@ -743,8 +740,12 @@ class ThreadItem {
'$feature_encrypt' => ((feature_enabled($conv->get_profile_owner(),'content_encrypt')) ? true : false),
'$encrypt' => t('Encrypt text'),
'$cipher' => $conv->get_cipher(),
- '$sourceapp' => \App::$sourcename
-
+ '$sourceapp' => \App::$sourcename,
+ '$observer' => get_observer_hash(),
+ '$anoncomments' => (($conv->get_mode() === 'channel' && perm_is_allowed($conv->get_profile_owner(),'','post_comments')) ? true : false),
+ '$anonname' => [ 'anonname', t('Your full name (required)'),'','','','onBlur="commentCloseUI(this,\'' . $this->get_id() . '\')"' ],
+ '$anonmail' => [ 'anonmail', t('Your email address (required)'),'','','','onBlur="commentCloseUI(this,\'' . $this->get_id() . '\')"' ],
+ '$anonurl' => [ 'anonurl', t('Your website URL (optional)'),'','','','onBlur="commentCloseUI(this,\'' . $this->get_id() . '\')"' ]
));
return $comment_box;
diff --git a/Zotlabs/Lib/ThreadStream.php b/Zotlabs/Lib/ThreadStream.php
index beb626f31..35ccf4fdb 100644
--- a/Zotlabs/Lib/ThreadStream.php
+++ b/Zotlabs/Lib/ThreadStream.php
@@ -18,6 +18,7 @@ class ThreadStream {
private $observer = null;
private $writable = false;
private $commentable = false;
+ private $uploadable = false;
private $profile_owner = 0;
private $preview = false;
private $prepared_item = '';
@@ -158,7 +159,7 @@ class ThreadStream {
if(intval($item->get_data_value('item_nocomment'))) {
$item->set_commentable(false);
}
- elseif(($this->observer) && (! $item->is_commentable())) {
+ elseif(! $item->is_commentable()) {
if((array_key_exists('owner',$item->data)) && intval($item->data['owner']['abook_self']))
$item->set_commentable(perm_is_allowed($this->profile_owner,$ob_hash,'post_comments'));
else
diff --git a/Zotlabs/Module/Acl.php b/Zotlabs/Module/Acl.php
index c3c50cac2..83fafbdff 100644
--- a/Zotlabs/Module/Acl.php
+++ b/Zotlabs/Module/Acl.php
@@ -412,10 +412,12 @@ class Acl extends \Zotlabs\Web\Controller {
$directory = find_upstream_directory($dirmode);
$url = $directory['url'] . '/dirsearch';
}
+
+ $token = get_config('system','realm_token');
$count = (x($_REQUEST,'count') ? $_REQUEST['count'] : 100);
if($url) {
- $query = $url . '?f=' ;
+ $query = $url . '?f=' . (($token) ? '&t=' . urlencode($token) : '');
$query .= '&name=' . urlencode($search) . "&limit=$count" . (($address) ? '&address=' . urlencode($search) : '');
$x = z_fetch_url($query);
diff --git a/Zotlabs/Module/Admin.php b/Zotlabs/Module/Admin.php
index 536d85dde..30f3dfa48 100644
--- a/Zotlabs/Module/Admin.php
+++ b/Zotlabs/Module/Admin.php
@@ -52,6 +52,8 @@ class Admin extends \Zotlabs\Web\Controller {
* Page content
*/
+ nav_set_selected('Admin');
+
$o = '';
if(argc() > 1) {
@@ -91,10 +93,10 @@ class Admin extends \Zotlabs\Web\Controller {
intval(ACCOUNT_BLOCKED)
);
if ($r) {
- $accounts['total'] = array('label' => t('# Accounts'), 'val' => $r[0]['total']);
- $accounts['blocked'] = array('label' => t('# blocked accounts'), 'val' => $r[0]['blocked']);
- $accounts['expired'] = array('label' => t('# expired accounts'), 'val' => $r[0]['expired']);
- $accounts['expiring'] = array('label' => t('# expiring accounts'), 'val' => $r[0]['expiring']);
+ $accounts['total'] = array('label' => t('Accounts'), 'val' => $r[0]['total']);
+ $accounts['blocked'] = array('label' => t('Blocked accounts'), 'val' => $r[0]['blocked']);
+ $accounts['expired'] = array('label' => t('Expired accounts'), 'val' => $r[0]['expired']);
+ $accounts['expiring'] = array('label' => t('Expiring accounts'), 'val' => $r[0]['expiring']);
}
// pending registrations
@@ -105,9 +107,9 @@ class Admin extends \Zotlabs\Web\Controller {
$channels = array();
$r = q("SELECT COUNT(*) AS total, COUNT(CASE WHEN channel_primary = 1 THEN 1 ELSE NULL END) AS main, COUNT(CASE WHEN channel_primary = 0 THEN 1 ELSE NULL END) AS clones FROM channel WHERE channel_removed = 0");
if ($r) {
- $channels['total'] = array('label' => t('# Channels'), 'val' => $r[0]['total']);
- $channels['main'] = array('label' => t('# primary'), 'val' => $r[0]['main']);
- $channels['clones'] = array('label' => t('# clones'), 'val' => $r[0]['clones']);
+ $channels['total'] = array('label' => t('Channels'), 'val' => $r[0]['total']);
+ $channels['main'] = array('label' => t('Primary'), 'val' => $r[0]['main']);
+ $channels['clones'] = array('label' => t('Clones'), 'val' => $r[0]['clones']);
}
// We can do better, but this is a quick queue status
@@ -118,14 +120,11 @@ class Admin extends \Zotlabs\Web\Controller {
// If no plugins active return 0, otherwise list of plugin names
$plugins = (count(\App::$plugins) == 0) ? count(\App::$plugins) : \App::$plugins;
+ if(is_array($plugins))
+ sort($plugins);
+
// Could be extended to provide also other alerts to the admin
$alertmsg = '';
- // annoy admin about upcoming unsupported PHP version
- if (version_compare(PHP_VERSION, '5.4', '<')) {
- $alertmsg = 'Your PHP version ' . PHP_VERSION . ' will not be supported with the next major release of $Projectname. You are strongly urged to upgrade to a current version.'
- . '<br>PHP 5.3 has reached its <a href="http://php.net/eol.php" class="alert-link">End of Life (EOL)</a> in August 2014.'
- . ' A list about current PHP versions can be found <a href="http://php.net/supported-versions.php" class="alert-link">here</a>.';
- }
$vmaster = get_repository_version('master');
$vdev = get_repository_version('dev');
diff --git a/Zotlabs/Module/Admin/Site.php b/Zotlabs/Module/Admin/Site.php
index d05e70aa9..4c5b82e78 100644
--- a/Zotlabs/Module/Admin/Site.php
+++ b/Zotlabs/Module/Admin/Site.php
@@ -17,7 +17,6 @@ class Site {
check_form_security_token_redirectOnErr('/admin/site', 'admin_site');
$sitename = ((x($_POST,'sitename')) ? notags(trim($_POST['sitename'])) : '');
- $server_role = ((x($_POST,'server_role')) ? notags(trim($_POST['server_role'])) : 'standard');
$banner = ((x($_POST,'banner')) ? trim($_POST['banner']) : false);
@@ -68,7 +67,6 @@ class Site {
if(array_key_exists('techlevel', $_POST))
$techlevel = intval($_POST['techlevel']);
- set_config('system', 'server_role', $server_role);
set_config('system', 'feed_contacts', $feed_contacts);
set_config('system', 'delivery_interval', $delivery_interval);
set_config('system', 'delivery_batch_count', $delivery_batch_count);
@@ -254,12 +252,6 @@ class Site {
// now invert the logic for the setting.
$discover_tab = (1 - $discover_tab);
- $server_roles = [
- 'basic' => t('Basic/Minimal Social Networking'),
- 'standard' => t('Standard Configuration (default)'),
- 'pro' => t('Professional')
- ];
-
$techlevels = [
'0' => t('Beginner/Basic'),
'1' => t('Novice - not skilled but willing to learn'),
@@ -286,8 +278,6 @@ class Site {
// name, label, value, help string, extra data...
'$sitename' => array('sitename', t("Site name"), htmlspecialchars(get_config('system','sitename'), ENT_QUOTES, 'UTF-8'),''),
- '$server_role' => array('server_role', t("Server Configuration/Role"), get_config('system','server_role'),'',$server_roles),
-
'$techlevel' => [ 'techlevel', t('Site default technical skill level'), get_config('system','techlevel'), t('Used to provide a member experience matched to technical comfort level'), $techlevels ],
'$techlock' => [ 'techlock', t('Lock the technical skill level setting'), get_config('system','techlevel_lock'), t('Members can set their own technical comfort level by default') ],
diff --git a/Zotlabs/Module/Ap_probe.php b/Zotlabs/Module/Ap_probe.php
new file mode 100644
index 000000000..769cd4c4e
--- /dev/null
+++ b/Zotlabs/Module/Ap_probe.php
@@ -0,0 +1,38 @@
+<?php
+namespace Zotlabs\Module;
+
+require_once('include/zot.php');
+
+
+class Ap_probe extends \Zotlabs\Web\Controller {
+
+ function get() {
+
+ $o .= '<h3>ActivityPub Probe Diagnostic</h3>';
+
+ $o .= '<form action="ap_probe" method="get">';
+ $o .= 'Lookup URI: <input type="text" style="width: 250px;" name="addr" value="' . $_GET['addr'] .'" /><br>';
+ $o .= 'Request Signed version: <input type=checkbox name="magenv" value="1" ><br>';
+ $o .= '<input type="submit" name="submit" value="Submit" /></form>';
+
+ $o .= '<br /><br />';
+
+ if(x($_GET,'addr')) {
+ $addr = $_GET['addr'];
+
+ if($_GET['magenv']) {
+ $headers = 'Accept: application/magic-envelope+json, application/ld+json; profile="https://www.w3.org/ns/activitystreams"';
+ }
+ else {
+ $headers = 'Accept: application/ld+json; profile="https://www.w3.org/ns/activitystreams"';
+ }
+
+ $redirects = 0;
+ $x = z_fetch_url($addr,true,$redirects, [ 'headers' => [ $headers ]]);
+ if($x['success'])
+ $o .= '<pre>' . str_replace(['\\n','\\'],["\n",''],jindent($x['body'])) . '</pre>';
+ }
+ return $o;
+ }
+
+}
diff --git a/Zotlabs/Module/Appman.php b/Zotlabs/Module/Appman.php
index 70cc7e44b..5c0667357 100644
--- a/Zotlabs/Module/Appman.php
+++ b/Zotlabs/Module/Appman.php
@@ -84,6 +84,20 @@ class Appman extends \Zotlabs\Web\Controller {
}
$channel = \App::get_channel();
+
+ if(argc() > 2) {
+ if(argv(2) === 'moveup') {
+ Zlib\Apps::moveup(local_channel(),argv(1));
+ }
+ if(argv(2) === 'movedown') {
+ Zlib\Apps::movedown(local_channel(),argv(1));
+ }
+ goaway(z_root() . '/apporder');
+ }
+
+
+
+
$app = null;
$embed = null;
if($_REQUEST['appid']) {
diff --git a/Zotlabs/Module/Apporder.php b/Zotlabs/Module/Apporder.php
new file mode 100644
index 000000000..1097a01eb
--- /dev/null
+++ b/Zotlabs/Module/Apporder.php
@@ -0,0 +1,40 @@
+<?php
+
+namespace Zotlabs\Module;
+
+use \Zotlabs\Lib as Zlib;
+
+class Apporder extends \Zotlabs\Web\Controller {
+
+ function post() {
+
+ }
+
+ function get() {
+ $syslist = array();
+ $list = Zlib\Apps::app_list(local_channel(), false, 'nav_featured_app');
+ if($list) {
+ foreach($list as $li) {
+ $syslist[] = Zlib\Apps::app_encode($li);
+ }
+ }
+ Zlib\Apps::translate_system_apps($syslist);
+
+ usort($syslist,'Zotlabs\\Lib\\Apps::app_name_compare');
+
+ $syslist = Zlib\Apps::app_order(local_channel(),$syslist);
+
+ foreach($syslist as $app) {
+ $nav_apps[] = Zlib\Apps::app_render($app,'nav-order');
+
+ }
+
+ return replace_macros(get_markup_template('apporder.tpl'),
+ [
+ '$header' => t('Change Order of Navigation Apps'),
+ '$desc' => t('Use arrows to move the corresponding app up or down in the display list'),
+ '$nav_apps' => $nav_apps
+ ]
+ );
+ }
+}
diff --git a/Zotlabs/Module/Authorize.php b/Zotlabs/Module/Authorize.php
new file mode 100644
index 000000000..06f66c456
--- /dev/null
+++ b/Zotlabs/Module/Authorize.php
@@ -0,0 +1,71 @@
+<?php
+
+namespace Zotlabs\Module;
+
+
+class Authorize extends \Zotlabs\Web\Controller {
+
+
+ function get() {
+
+
+ // 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;
+ }
+ }
+
+
+
+
+ require_once('include/oauth2.php');
+
+ $request = \OAuth2\Request::createFromGlobals();
+ $response = new \OAuth2\Response();
+
+ // validate the authorize request
+ if (! $oauth2_server->validateAuthorizeRequest($request, $response)) {
+ $response->send();
+ killme();
+ }
+
+ // display an authorization form
+ if (empty($_POST)) {
+
+ return '
+<form method="post">
+ <label>Do You Authorize TestClient?</label><br />
+ <input type="submit" name="authorized" value="yes">
+ <input type="submit" name="authorized" value="no">
+</form>';
+ }
+
+ // print the authorization code if the user has authorized your client
+ $is_authorized = ($_POST['authorized'] === 'yes');
+ $oauth2_server->handleAuthorizeRequest($request, $response, $is_authorized);
+ if ($is_authorized) {
+ // this is only here so that you get to see your code in the cURL request. Otherwise,
+ // we'd redirect back to the client
+ $code = substr($response->getHttpHeader('Location'), strpos($response->getHttpHeader('Location'), 'code=')+5, 40);
+ echo("SUCCESS! Authorization Code: $code");
+
+ }
+
+ $response->send();
+ killme();
+ }
+
+} \ No newline at end of file
diff --git a/Zotlabs/Module/Block.php b/Zotlabs/Module/Block.php
index e671730f6..d0fed44fe 100644
--- a/Zotlabs/Module/Block.php
+++ b/Zotlabs/Module/Block.php
@@ -3,8 +3,6 @@ namespace Zotlabs\Module;
require_once('include/items.php');
require_once('include/conversation.php');
-require_once('include/page_widgets.php');
-
class Block extends \Zotlabs\Web\Controller {
diff --git a/Zotlabs/Module/Bookmarks.php b/Zotlabs/Module/Bookmarks.php
index 682f8e76c..e62f5ce96 100644
--- a/Zotlabs/Module/Bookmarks.php
+++ b/Zotlabs/Module/Bookmarks.php
@@ -7,6 +7,9 @@ class Bookmarks extends \Zotlabs\Web\Controller {
function init() {
if(! local_channel())
return;
+
+ nav_set_selected(t('View Bookmarks'));
+
$item_id = intval($_REQUEST['item']);
$burl = trim($_REQUEST['burl']);
diff --git a/Zotlabs/Module/Cdav.php b/Zotlabs/Module/Cdav.php
new file mode 100644
index 000000000..d0619ef0b
--- /dev/null
+++ b/Zotlabs/Module/Cdav.php
@@ -0,0 +1,1209 @@
+<?php
+namespace Zotlabs\Module;
+
+require_once('include/event.php');
+
+class Cdav extends \Zotlabs\Web\Controller {
+
+ function init() {
+
+ if((argv(1) !== 'calendar') && (argv(1) !== 'addressbook')) {
+
+ // 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;
+ }
+ }
+
+ /**
+ * This server combines both CardDAV and CalDAV functionality into a single
+ * server. It is assumed that the server runs at the root of a HTTP domain (be
+ * that a domainname-based vhost or a specific TCP port.
+ *
+ * This example also assumes that you're using SQLite and the database has
+ * already been setup (along with the database tables).
+ *
+ * You may choose to use MySQL instead, just change the PDO connection
+ * statement.
+ */
+
+ /**
+ * UTC or GMT is easy to work with, and usually recommended for any
+ * application.
+ */
+ date_default_timezone_set('UTC');
+
+ /**
+ * 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 = '/cdav/';
+
+ /**
+ * Database
+ *
+ */
+
+ $pdo = \DBA::$dba->db;
+
+ // Autoloader
+ require_once 'vendor/autoload.php';
+
+ /**
+ * The backends. Yes we do really need all of them.
+ *
+ * This allows any developer to subclass just any of them and hook into their
+ * own backend systems.
+ */
+
+ $auth = new \Zotlabs\Storage\BasicAuth();
+ $auth->setRealm(ucfirst(\Zotlabs\Lib\System::get_platform_name()) . 'CalDAV/CardDAV');
+
+ if (local_channel()) {
+ logger('loggedin');
+ $channel = \App::get_channel();
+ $auth->setCurrentUser($channel['channel_address']);
+ $auth->channel_id = $channel['channel_id'];
+ $auth->channel_hash = $channel['channel_hash'];
+ $auth->channel_account_id = $channel['channel_account_id'];
+ if($channel['channel_timezone'])
+ $auth->setTimezone($channel['channel_timezone']);
+ $auth->observer = $channel['channel_hash'];
+
+ $principalUri = 'principals/' . $channel['channel_address'];
+ if(!cdav_principal($principalUri)) {
+ $this->activate($pdo, $channel);
+ if(!cdav_principal($principalUri)) {
+ return;
+ }
+ }
+
+ }
+
+
+ $principalBackend = new \Sabre\DAVACL\PrincipalBackend\PDO($pdo);
+ $carddavBackend = new \Sabre\CardDAV\Backend\PDO($pdo);
+ $caldavBackend = new \Sabre\CalDAV\Backend\PDO($pdo);
+
+ /**
+ * The directory tree
+ *
+ * Basically this is an array which contains the 'top-level' directories in the
+ * WebDAV server.
+ */
+
+ $nodes = [
+ // /principals
+ new \Sabre\CalDAV\Principal\Collection($principalBackend),
+ // /calendars
+ new \Sabre\CalDAV\CalendarRoot($principalBackend, $caldavBackend),
+ // /addressbook
+ 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);
+
+ if(isset($baseUri))
+ $server->setBaseUri($baseUri);
+
+ // Plugins
+ $server->addPlugin(new \Sabre\DAV\Auth\Plugin($auth));
+ //$server->addPlugin(new \Sabre\DAV\Browser\Plugin());
+ $server->addPlugin(new \Sabre\DAV\Sync\Plugin());
+ $server->addPlugin(new \Sabre\DAV\Sharing\Plugin());
+ $server->addPlugin(new \Sabre\DAVACL\Plugin());
+
+ // CalDAV plugins
+ $server->addPlugin(new \Sabre\CalDAV\Plugin());
+ $server->addPlugin(new \Sabre\CalDAV\SharingPlugin());
+ //$server->addPlugin(new \Sabre\CalDAV\Schedule\Plugin());
+ $server->addPlugin(new \Sabre\CalDAV\ICSExportPlugin());
+
+ // CardDAV plugins
+ $server->addPlugin(new \Sabre\CardDAV\Plugin());
+ $server->addPlugin(new \Sabre\CardDAV\VCFExportPlugin());
+
+ // And off we go!
+ $server->exec();
+
+ killme();
+
+ }
+
+ }
+
+ function post() {
+ if(! local_channel())
+ return;
+
+ $channel = \App::get_channel();
+ $principalUri = 'principals/' . $channel['channel_address'];
+
+ if(!cdav_principal($principalUri))
+ return;
+
+ $pdo = \DBA::$dba->db;
+
+ require_once 'vendor/autoload.php';
+
+ if(argc() == 2 && argv(1) === 'calendar') {
+
+ $caldavBackend = new \Sabre\CalDAV\Backend\PDO($pdo);
+ $calendars = $caldavBackend->getCalendarsForUser($principalUri);
+
+ //create new calendar
+ if($_REQUEST['{DAV:}displayname'] && $_REQUEST['create']) {
+ do {
+ $duplicate = false;
+ $calendarUri = random_string(40);
+
+ $r = q("SELECT uri FROM calendarinstances WHERE principaluri = '%s' AND uri = '%s' LIMIT 1",
+ dbesc($principalUri),
+ dbesc($calendarUri)
+ );
+
+ if (count($r))
+ $duplicate = true;
+ } while ($duplicate == true);
+
+ $properties = [
+ '{DAV:}displayname' => $_REQUEST['{DAV:}displayname'],
+ '{http://apple.com/ns/ical/}calendar-color' => $_REQUEST['color'],
+ '{urn:ietf:params:xml:ns:caldav}calendar-description' => $channel['channel_name']
+ ];
+
+ $id = $caldavBackend->createCalendar($principalUri, $calendarUri, $properties);
+
+ // set new calendar to be visible
+ set_pconfig(local_channel(), 'cdav_calendar' , $id[0], 1);
+ }
+
+ //create new calendar object via ajax request
+ if($_REQUEST['submit'] === 'create_event' && $_REQUEST['title'] && $_REQUEST['target'] && $_REQUEST['dtstart']) {
+
+ $id = explode(':', $_REQUEST['target']);
+
+ if(!cdav_perms($id[0],$calendars,true))
+ return;
+
+ $title = $_REQUEST['title'];
+ $dtstart = new \DateTime($_REQUEST['dtstart']);
+ if($_REQUEST['dtend'])
+ $dtend = new \DateTime($_REQUEST['dtend']);
+ $description = $_REQUEST['description'];
+ $location = $_REQUEST['location'];
+
+ do {
+ $duplicate = false;
+ $objectUri = random_string(40) . '.ics';
+
+ $r = q("SELECT uri FROM calendarobjects WHERE calendarid = %s AND uri = '%s' LIMIT 1",
+ intval($id[0]),
+ dbesc($objectUri)
+ );
+
+ if (count($r))
+ $duplicate = true;
+ } while ($duplicate == true);
+
+
+ $vcalendar = new \Sabre\VObject\Component\VCalendar([
+ 'VEVENT' => [
+ 'SUMMARY' => $title,
+ 'DTSTART' => $dtstart
+ ]
+ ]);
+ if($dtend)
+ $vcalendar->VEVENT->add('DTEND', $dtend);
+ if($description)
+ $vcalendar->VEVENT->add('DESCRIPTION', $description);
+ if($location)
+ $vcalendar->VEVENT->add('LOCATION', $location);
+
+ $calendarData = $vcalendar->serialize();
+
+ $caldavBackend->createCalendarObject($id, $objectUri, $calendarData);
+
+ killme();
+ }
+
+ //edit calendar name and color
+ if($_REQUEST['{DAV:}displayname'] && $_REQUEST['edit'] && $_REQUEST['id']) {
+
+ $id = explode(':', $_REQUEST['id']);
+
+ if(! cdav_perms($id[0],$calendars))
+ return;
+
+ $mutations = [
+ '{DAV:}displayname' => $_REQUEST['{DAV:}displayname'],
+ '{http://apple.com/ns/ical/}calendar-color' => $_REQUEST['color']
+ ];
+
+ $patch = new \Sabre\DAV\PropPatch($mutations);
+
+ $caldavBackend->updateCalendar($id, $patch);
+
+ $patch->commit();
+
+ }
+
+ //edit calendar object via ajax request
+ if($_REQUEST['submit'] === 'update_event' && $_REQUEST['uri'] && $_REQUEST['title'] && $_REQUEST['target'] && $_REQUEST['dtstart']) {
+
+ $id = explode(':', $_REQUEST['target']);
+
+ if(!cdav_perms($id[0],$calendars,true))
+ return;
+
+ $uri = $_REQUEST['uri'];
+ $title = $_REQUEST['title'];
+ $dtstart = new \DateTime($_REQUEST['dtstart']);
+ $dtend = $_REQUEST['dtend'] ? new \DateTime($_REQUEST['dtend']) : '';
+ $description = $_REQUEST['description'];
+ $location = $_REQUEST['location'];
+
+ $object = $caldavBackend->getCalendarObject($id, $uri);
+
+ $vcalendar = \Sabre\VObject\Reader::read($object['calendardata']);
+
+ if($title)
+ $vcalendar->VEVENT->SUMMARY = $title;
+ if($dtstart)
+ $vcalendar->VEVENT->DTSTART = $dtstart;
+ if($dtend)
+ $vcalendar->VEVENT->DTEND = $dtend;
+ else
+ unset($vcalendar->VEVENT->DTEND);
+ if($description)
+ $vcalendar->VEVENT->DESCRIPTION = $description;
+ if($location)
+ $vcalendar->VEVENT->LOCATION = $location;
+
+ $calendarData = $vcalendar->serialize();
+
+ $caldavBackend->updateCalendarObject($id, $uri, $calendarData);
+
+ killme();
+ }
+
+ //delete calendar object via ajax request
+ if($_REQUEST['delete'] && $_REQUEST['uri'] && $_REQUEST['target']) {
+
+ $id = explode(':', $_REQUEST['target']);
+
+ if(!cdav_perms($id[0],$calendars,true))
+ return;
+
+ $uri = $_REQUEST['uri'];
+
+ $caldavBackend->deleteCalendarObject($id, $uri);
+
+ killme();
+ }
+
+ //edit calendar object date/timeme via ajax request (drag and drop)
+ if($_REQUEST['update'] && $_REQUEST['id'] && $_REQUEST['uri']) {
+
+ $id = [$_REQUEST['id'][0], $_REQUEST['id'][1]];
+
+ if(!cdav_perms($id[0],$calendars,true))
+ return;
+
+ $uri = $_REQUEST['uri'];
+ $dtstart = new \DateTime($_REQUEST['dtstart']);
+ $dtend = $_REQUEST['dtend'] ? new \DateTime($_REQUEST['dtend']) : '';
+
+ $object = $caldavBackend->getCalendarObject($id, $uri);
+
+ $vcalendar = \Sabre\VObject\Reader::read($object['calendardata']);
+
+ if($dtstart) {
+ $vcalendar->VEVENT->DTSTART = $dtstart;
+ }
+ if($dtend) {
+ $vcalendar->VEVENT->DTEND = $dtend;
+ }
+ else {
+ unset($vcalendar->VEVENT->DTEND);
+ }
+
+ $calendarData = $vcalendar->serialize();
+
+ $caldavBackend->updateCalendarObject($id, $uri, $calendarData);
+
+ killme();
+ }
+
+ //share a calendar - this only works on local system (with channels on the same server)
+ if($_REQUEST['sharee'] && $_REQUEST['share']) {
+
+ $id = [intval($_REQUEST['calendarid']), intval($_REQUEST['instanceid'])];
+
+ if(! cdav_perms($id[0],$calendars))
+ return;
+
+ $hash = $_REQUEST['sharee'];
+
+ $sharee_arr = channelx_by_hash($hash);
+
+ $sharee = new \Sabre\DAV\Xml\Element\Sharee();
+
+ $sharee->href = 'mailto:' . $sharee_arr['xchan_addr'];
+ $sharee->principal = 'principals/' . $sharee_arr['channel_address'];
+ $sharee->access = intval($_REQUEST['access']);
+ $sharee->properties = ['{DAV:}displayname' => $channel['channel_name']];
+
+ $caldavBackend->updateInvites($id, [$sharee]);
+ }
+ }
+
+ if(argc() >= 2 && argv(1) === 'addressbook') {
+
+ $carddavBackend = new \Sabre\CardDAV\Backend\PDO($pdo);
+ $addressbooks = $carddavBackend->getAddressBooksForUser($principalUri);
+
+ //create new addressbook
+ if($_REQUEST['{DAV:}displayname'] && $_REQUEST['create']) {
+ do {
+ $duplicate = false;
+ $addressbookUri = random_string(20);
+
+ $r = q("SELECT uri FROM addressbooks WHERE principaluri = '%s' AND uri = '%s' LIMIT 1",
+ dbesc($principalUri),
+ dbesc($addressbookUri)
+ );
+
+ if (count($r))
+ $duplicate = true;
+ } while ($duplicate == true);
+
+ $properties = ['{DAV:}displayname' => $_REQUEST['{DAV:}displayname']];
+
+ $carddavBackend->createAddressBook($principalUri, $addressbookUri, $properties);
+ }
+
+ //edit addressbook
+ if($_REQUEST['{DAV:}displayname'] && $_REQUEST['edit'] && intval($_REQUEST['id'])) {
+
+ $id = $_REQUEST['id'];
+
+ if(! cdav_perms($id,$addressbooks))
+ return;
+
+ $mutations = [
+ '{DAV:}displayname' => $_REQUEST['{DAV:}displayname']
+ ];
+
+ $patch = new \Sabre\DAV\PropPatch($mutations);
+
+ $carddavBackend->updateAddressBook($id, $patch);
+
+ $patch->commit();
+ }
+
+ //create addressbook card
+ if($_REQUEST['create'] && $_REQUEST['target'] && $_REQUEST['fn']) {
+ $id = $_REQUEST['target'];
+
+ do {
+ $duplicate = false;
+ $uri = random_string(40) . '.vcf';
+
+ $r = q("SELECT uri FROM cards WHERE addressbookid = %s AND uri = '%s' LIMIT 1",
+ intval($id),
+ dbesc($uri)
+ );
+
+ if (count($r))
+ $duplicate = true;
+ } while ($duplicate == true);
+
+ //TODO: this mostly duplictes the procedure in update addressbook card. should move this part to a function to avoid duplication
+ $fn = $_REQUEST['fn'];
+
+ $vcard = new \Sabre\VObject\Component\VCard([
+ 'FN' => $fn,
+ 'N' => array_reverse(explode(' ', $fn))
+ ]);
+
+ $org = $_REQUEST['org'];
+ if($org) {
+ $vcard->ORG = $org;
+ }
+
+ $title = $_REQUEST['title'];
+ if($title) {
+ $vcard->TITLE = $title;
+ }
+
+ $tel = $_REQUEST['tel'];
+ $tel_type = $_REQUEST['tel_type'];
+ if($tel) {
+ $i = 0;
+ foreach($tel as $item) {
+ if($item) {
+ $vcard->add('TEL', $item, ['type' => $tel_type[$i]]);
+ }
+ $i++;
+ }
+ }
+
+ $email = $_REQUEST['email'];
+ $email_type = $_REQUEST['email_type'];
+ if($email) {
+ $i = 0;
+ foreach($email as $item) {
+ if($item) {
+ $vcard->add('EMAIL', $item, ['type' => $email_type[$i]]);
+ }
+ $i++;
+ }
+ }
+
+ $impp = $_REQUEST['impp'];
+ $impp_type = $_REQUEST['impp_type'];
+ if($impp) {
+ $i = 0;
+ foreach($impp as $item) {
+ if($item) {
+ $vcard->add('IMPP', $item, ['type' => $impp_type[$i]]);
+ }
+ $i++;
+ }
+ }
+
+ $url = $_REQUEST['url'];
+ $url_type = $_REQUEST['url_type'];
+ if($url) {
+ $i = 0;
+ foreach($url as $item) {
+ if($item) {
+ $vcard->add('URL', $item, ['type' => $url_type[$i]]);
+ }
+ $i++;
+ }
+ }
+
+ $adr = $_REQUEST['adr'];
+ $adr_type = $_REQUEST['adr_type'];
+
+ if($adr) {
+ $i = 0;
+ foreach($adr as $item) {
+ if($item) {
+ $vcard->add('ADR', $item, ['type' => $adr_type[$i]]);
+ }
+ $i++;
+ }
+ }
+
+ $note = $_REQUEST['note'];
+ if($note) {
+ $vcard->NOTE = $note;
+ }
+
+ $cardData = $vcard->serialize();
+
+ $carddavBackend->createCard($id, $uri, $cardData);
+
+ }
+
+ //edit addressbook card
+ if($_REQUEST['update'] && $_REQUEST['uri'] && $_REQUEST['target']) {
+
+ $id = $_REQUEST['target'];
+
+ if(!cdav_perms($id,$addressbooks))
+ return;
+
+ $uri = $_REQUEST['uri'];
+
+ $object = $carddavBackend->getCard($id, $uri);
+ $vcard = \Sabre\VObject\Reader::read($object['carddata']);
+
+ $fn = $_REQUEST['fn'];
+ if($fn) {
+ $vcard->FN = $fn;
+ $vcard->N = array_reverse(explode(' ', $fn));
+ }
+
+ $org = $_REQUEST['org'];
+ if($org) {
+ $vcard->ORG = $org;
+ }
+ else {
+ unset($vcard->ORG);
+ }
+
+ $title = $_REQUEST['title'];
+ if($title) {
+ $vcard->TITLE = $title;
+ }
+ else {
+ unset($vcard->TITLE);
+ }
+
+ $tel = $_REQUEST['tel'];
+ $tel_type = $_REQUEST['tel_type'];
+ if($tel) {
+ $i = 0;
+ unset($vcard->TEL);
+ foreach($tel as $item) {
+ if($item) {
+ $vcard->add('TEL', $item, ['type' => $tel_type[$i]]);
+ }
+ $i++;
+ }
+ }
+ else {
+ unset($vcard->TEL);
+ }
+
+ $email = $_REQUEST['email'];
+ $email_type = $_REQUEST['email_type'];
+ if($email) {
+ $i = 0;
+ unset($vcard->EMAIL);
+ foreach($email as $item) {
+ if($item) {
+ $vcard->add('EMAIL', $item, ['type' => $email_type[$i]]);
+ }
+ $i++;
+ }
+ }
+ else {
+ unset($vcard->EMAIL);
+ }
+
+ $impp = $_REQUEST['impp'];
+ $impp_type = $_REQUEST['impp_type'];
+ if($impp) {
+ $i = 0;
+ unset($vcard->IMPP);
+ foreach($impp as $item) {
+ if($item) {
+ $vcard->add('IMPP', $item, ['type' => $impp_type[$i]]);
+ }
+ $i++;
+ }
+ }
+ else {
+ unset($vcard->IMPP);
+ }
+
+ $url = $_REQUEST['url'];
+ $url_type = $_REQUEST['url_type'];
+ if($url) {
+ $i = 0;
+ unset($vcard->URL);
+ foreach($url as $item) {
+ if($item) {
+ $vcard->add('URL', $item, ['type' => $url_type[$i]]);
+ }
+ $i++;
+ }
+ }
+ else {
+ unset($vcard->URL);
+ }
+
+ $adr = $_REQUEST['adr'];
+ $adr_type = $_REQUEST['adr_type'];
+ if($adr) {
+ $i = 0;
+ unset($vcard->ADR);
+ foreach($adr as $item) {
+ if($item) {
+ $vcard->add('ADR', $item, ['type' => $adr_type[$i]]);
+ }
+ $i++;
+ }
+ }
+ else {
+ unset($vcard->ADR);
+ }
+
+ $note = $_REQUEST['note'];
+ if($note) {
+ $vcard->NOTE = $note;
+ }
+ else {
+ unset($vcard->NOTE);
+ }
+
+ $cardData = $vcard->serialize();
+
+ $carddavBackend->updateCard($id, $uri, $cardData);
+ }
+
+ //delete addressbook card
+ if($_REQUEST['delete'] && $_REQUEST['uri'] && $_REQUEST['target']) {
+
+ $id = $_REQUEST['target'];
+
+ if(!cdav_perms($id,$addressbooks))
+ return;
+
+ $uri = $_REQUEST['uri'];
+
+ $carddavBackend->deleteCard($id, $uri);
+ }
+ }
+
+ //Import calendar or addressbook
+ if(($_FILES) && array_key_exists('userfile',$_FILES) && intval($_FILES['userfile']['size']) && $_REQUEST['target']) {
+
+ $src = @file_get_contents($_FILES['userfile']['tmp_name']);
+
+ if($src) {
+
+ if($_REQUEST['c_upload']) {
+ $id = explode(':', $_REQUEST['target']);
+ $ext = 'ics';
+ $table = 'calendarobjects';
+ $column = 'calendarid';
+ $objects = new \Sabre\VObject\Splitter\ICalendar($src);
+ $profile = \Sabre\VObject\Node::PROFILE_CALDAV;
+ $backend = new \Sabre\CalDAV\Backend\PDO($pdo);
+ }
+
+ if($_REQUEST['a_upload']) {
+ $id[] = intval($_REQUEST['target']);
+ $ext = 'vcf';
+ $table = 'cards';
+ $column = 'addressbookid';
+ $objects = new \Sabre\VObject\Splitter\VCard($src);
+ $profile = \Sabre\VObject\Node::PROFILE_CARDDAV;
+ $backend = new \Sabre\CardDAV\Backend\PDO($pdo);
+ }
+
+ while ($object = $objects->getNext()) {
+
+ if($_REQUEST['a_upload']) {
+ $object = $object->convert(\Sabre\VObject\Document::VCARD40);
+ }
+
+ $ret = $object->validate($profile & \Sabre\VObject\Node::REPAIR);
+
+ //level 3 Means that the document is invalid,
+ //level 2 means a warning. A warning means it's valid but it could cause interopability issues,
+ //level 1 means that there was a problem earlier, but the problem was automatically repaired.
+
+ if($ret[0]['level'] < 3) {
+ do {
+ $duplicate = false;
+ $objectUri = random_string(40) . '.' . $ext;
+
+ $r = q("SELECT uri FROM $table WHERE $column = %d AND uri = '%s' LIMIT 1",
+ dbesc($id[0]),
+ dbesc($objectUri)
+ );
+
+ if (count($r))
+ $duplicate = true;
+ } while ($duplicate == true);
+
+ if($_REQUEST['c_upload']) {
+ $backend->createCalendarObject($id, $objectUri, $object->serialize());
+ }
+
+ if($_REQUEST['a_upload']) {
+ $backend->createCard($id[0], $objectUri, $object->serialize());
+ }
+ }
+ else {
+ if($_REQUEST['c_upload']) {
+ notice( '<strong>' . t('INVALID EVENT DISMISSED!') . '</strong>' . EOL .
+ '<strong>' . t('Summary: ') . '</strong>' . (($object->VEVENT->SUMMARY) ? $object->VEVENT->SUMMARY : t('Unknown')) . EOL .
+ '<strong>' . t('Date: ') . '</strong>' . (($object->VEVENT->DTSTART) ? $object->VEVENT->DTSTART : t('Unknown')) . EOL .
+ '<strong>' . t('Reason: ') . '</strong>' . $ret[0]['message'] . EOL
+ );
+ }
+
+ if($_REQUEST['a_upload']) {
+ notice( '<strong>' . t('INVALID CARD DISMISSED!') . '</strong>' . EOL .
+ '<strong>' . t('Name: ') . '</strong>' . (($object->FN) ? $object->FN : t('Unknown')) . EOL .
+ '<strong>' . t('Reason: ') . '</strong>' . $ret[0]['message'] . EOL
+ );
+ }
+ }
+ }
+ }
+ @unlink($src);
+ }
+ }
+
+ function get() {
+
+ if(!local_channel())
+ return;
+
+ $channel = \App::get_channel();
+ $principalUri = 'principals/' . $channel['channel_address'];
+
+ $pdo = \DBA::$dba->db;
+
+ require_once 'vendor/autoload.php';
+
+ head_add_css('cdav.css');
+
+ if(!cdav_principal($principalUri)) {
+ $this->activate($pdo, $channel);
+ if(!cdav_principal($principalUri)) {
+ return;
+ }
+ }
+
+ if(argv(1) === 'calendar') {
+ nav_set_selected(t('CalDAV'));
+ $caldavBackend = new \Sabre\CalDAV\Backend\PDO($pdo);
+ $calendars = $caldavBackend->getCalendarsForUser($principalUri);
+ }
+
+ //Display calendar(s) here
+ if(argc() == 2 && argv(1) === 'calendar') {
+
+ head_add_css('/library/fullcalendar/fullcalendar.css');
+ head_add_css('cdav_calendar.css');
+
+ head_add_js('/library/moment/moment.min.js', 1);
+ head_add_js('/library/fullcalendar/fullcalendar.min.js', 1);
+ head_add_js('/library/fullcalendar/locale-all.js', 1);
+
+ foreach($calendars as $calendar) {
+ $editable = (($calendar['share-access'] == 2) ? 'false' : 'true'); // false/true must be string since we're passing it to javascript
+ $color = (($calendar['{http://apple.com/ns/ical/}calendar-color']) ? $calendar['{http://apple.com/ns/ical/}calendar-color'] : '#3a87ad');
+ $sharer = (($calendar['share-access'] == 3) ? $calendar['{urn:ietf:params:xml:ns:caldav}calendar-description'] : '');
+ $switch = get_pconfig(local_channel(), 'cdav_calendar', $calendar['id'][0]);
+ if($switch) {
+ $sources .= '{
+ url: \'/cdav/calendar/json/' . $calendar['id'][0] . '/' . $calendar['id'][1] . '\',
+ color: \'' . $color . '\'
+ }, ';
+ }
+
+ if($calendar['share-access'] != 2) {
+ $writable_calendars[] = [
+ 'displayname' => $calendar['{DAV:}displayname'],
+ 'sharer' => $sharer,
+ 'id' => $calendar['id']
+ ];
+ }
+ }
+
+ $sources = rtrim($sources, ', ');
+
+ $first_day = get_pconfig(local_channel(),'system','cal_first_day');
+ $first_day = (($first_day) ? $first_day : 0);
+
+ $title = ['title', t('Event title')];
+ $dtstart = ['dtstart', t('Start date and time'), '', t('Example: YYYY-MM-DD HH:mm')];
+ $dtend = ['dtend', t('End date and time'), '', t('Example: YYYY-MM-DD HH:mm')];
+ $description = ['description', t('Description')];
+ $location = ['location', t('Location')];
+
+ $o .= replace_macros(get_markup_template('cdav_calendar.tpl'), [
+ '$sources' => $sources,
+ '$color' => $color,
+ '$lang' => \App::$language,
+ '$first_day' => $first_day,
+ '$prev' => t('Previous'),
+ '$next' => t('Next'),
+ '$today' => t('Today'),
+ '$month' => t('Month'),
+ '$week' => t('Week'),
+ '$day' => t('Day'),
+ '$list_month' => t('List month'),
+ '$list_week' => t('List week'),
+ '$list_day' => t('List day'),
+ '$title' => $title,
+ '$writable_calendars' => $writable_calendars,
+ '$dtstart' => $dtstart,
+ '$dtend' => $dtend,
+ '$description' => $description,
+ '$location' => $location,
+ '$more' => t('More'),
+ '$less' => t('Less'),
+ '$calendar_select_label' => t('Select calendar'),
+ '$delete' => t('Delete'),
+ '$delete_all' => t('Delete all'),
+ '$cancel' => t('Cancel'),
+ '$recurrence_warning' => t('Sorry! Editing of recurrent events is not yet implemented.')
+ ]);
+
+ return $o;
+
+ }
+
+ //Provide json data for calendar
+ if(argc() == 5 && argv(1) === 'calendar' && argv(2) === 'json' && intval(argv(3)) && intval(argv(4))) {
+
+ $id = [argv(3), argv(4)];
+
+ if(! cdav_perms($id[0],$calendars))
+ killme();
+
+ if (x($_GET,'start'))
+ $start = new \DateTime($_GET['start']);
+ if (x($_GET,'end'))
+ $end = new \DateTime($_GET['end']);
+
+ $filters['name'] = 'VCALENDAR';
+ $filters['prop-filters'][0]['name'] = 'VEVENT';
+ $filters['comp-filters'][0]['name'] = 'VEVENT';
+ $filters['comp-filters'][0]['time-range']['start'] = $start;
+ $filters['comp-filters'][0]['time-range']['end'] = $end;
+
+ $uris = $caldavBackend->calendarQuery($id, $filters);
+ if($uris) {
+
+ $objects = $caldavBackend->getMultipleCalendarObjects($id, $uris);
+
+ foreach($objects as $object) {
+
+ $vcalendar = \Sabre\VObject\Reader::read($object['calendardata']);
+
+ if(isset($vcalendar->VEVENT->RRULE))
+ $vcalendar = $vcalendar->expand($start, $end);
+
+ foreach($vcalendar->VEVENT as $vevent) {
+ $title = (string)$vevent->SUMMARY;
+ $dtstart = (string)$vevent->DTSTART;
+ $dtend = (string)$vevent->DTEND;
+ $description = (string)$vevent->DESCRIPTION;
+ $location = (string)$vevent->LOCATION;
+
+ $rw = ((cdav_perms($id[0],$calendars,true)) ? true : false);
+ $recurrent = ((isset($vevent->{'RECURRENCE-ID'})) ? true : false);
+
+ $editable = $rw ? true : false;
+
+ if($recurrent)
+ $editable = false;
+
+ $allDay = false;
+
+ // allDay event rules
+ if(!strpos($dtstart, 'T') && !strpos($dtend, 'T'))
+ $allDay = true;
+ if(strpos($dtstart, 'T000000') && strpos($dtend, 'T000000'))
+ $allDay = true;
+
+ $events[] = [
+ 'calendar_id' => $id,
+ 'uri' => $object['uri'],
+ 'title' => $title,
+ 'start' => $dtstart,
+ 'end' => $dtend,
+ 'description' => $description,
+ 'location' => $location,
+ 'allDay' => $allDay,
+ 'editable' => $editable,
+ 'recurrent' => $recurrent,
+ 'rw' => $rw
+ ];
+ }
+ }
+ json_return_and_die($events);
+ }
+ else {
+ killme();
+ }
+ }
+
+ //enable/disable calendars
+ if(argc() == 5 && argv(1) === 'calendar' && argv(2) === 'switch' && intval(argv(3)) && (argv(4) == 1 || argv(4) == 0)) {
+ $id = argv(3);
+
+ if(! cdav_perms($id,$calendars))
+ killme();
+
+ set_pconfig(local_channel(), 'cdav_calendar' , argv(3), argv(4));
+ killme();
+ }
+
+ //drop calendar
+ if(argc() == 5 && argv(1) === 'calendar' && argv(2) === 'drop' && intval(argv(3)) && intval(argv(4))) {
+ $id = [argv(3), argv(4)];
+
+ if(! cdav_perms($id[0],$calendars))
+ killme();
+
+ $caldavBackend->deleteCalendar($id);
+ killme();
+ }
+
+ //drop sharee
+ if(argc() == 6 && argv(1) === 'calendar' && argv(2) === 'dropsharee' && intval(argv(3)) && intval(argv(4))) {
+
+ $id = [argv(3), argv(4)];
+ $hash = argv(5);
+
+ if(! cdav_perms($id[0],$calendars))
+ killme();
+
+ $sharee_arr = channelx_by_hash($hash);
+
+ $sharee = new \Sabre\DAV\Xml\Element\Sharee();
+
+ $sharee->href = 'mailto:' . $sharee_arr['xchan_addr'];
+ $sharee->principal = 'principals/' . $sharee_arr['channel_address'];
+ $sharee->access = 4;
+ $caldavBackend->updateInvites($id, [$sharee]);
+
+ killme();
+ }
+
+
+ if(argv(1) === 'addressbook') {
+ nav_set_selected(t('CardDAV'));
+ $carddavBackend = new \Sabre\CardDAV\Backend\PDO($pdo);
+ $addressbooks = $carddavBackend->getAddressBooksForUser($principalUri);
+ }
+
+ //Display Adressbook here
+ if(argc() == 3 && argv(1) === 'addressbook' && intval(argv(2))) {
+
+ $id = argv(2);
+
+ $displayname = cdav_perms($id,$addressbooks);
+
+ if(!$displayname)
+ return;
+
+ head_add_css('cdav_addressbook.css');
+
+ $o = '';
+
+ $sabrecards = $carddavBackend->getCards($id);
+ foreach($sabrecards as $sabrecard) {
+ $uris[] = $sabrecard['uri'];
+ }
+
+ if($uris) {
+ $objects = $carddavBackend->getMultipleCards($id, $uris);
+
+ foreach($objects as $object) {
+ $vcard = \Sabre\VObject\Reader::read($object['carddata']);
+
+ $photo = '';
+ if($vcard->PHOTO) {
+ $photo_value = strtolower($vcard->PHOTO->getValueType()); // binary or uri
+ if($photo_value === 'binary') {
+ $photo_type = strtolower($vcard->PHOTO['TYPE']); // mime jpeg, png or gif
+ $photo = 'data:image/' . $photo_type . ';base64,' . base64_encode((string)$vcard->PHOTO);
+ }
+ else {
+ $url = parse_url((string)$vcard->PHOTO);
+ $photo = 'data:' . $url['path'];
+ }
+ }
+
+ $fn = '';
+ if($vcard->FN) {
+ $fn = (string)$vcard->FN;
+ }
+
+ $org = '';
+ if($vcard->ORG) {
+ $org = (string)$vcard->ORG;
+ }
+
+ $title = '';
+ if($vcard->TITLE) {
+ $title = (string)$vcard->TITLE;
+ }
+
+ $tels = [];
+ if($vcard->TEL) {
+ foreach($vcard->TEL as $tel) {
+ $type = (($tel['TYPE']) ? translate_type((string)$tel['TYPE']) : '');
+ $tels[] = [
+ 'type' => $type,
+ 'nr' => (string)$tel
+ ];
+ }
+ }
+
+ $emails = [];
+ if($vcard->EMAIL) {
+ foreach($vcard->EMAIL as $email) {
+ $type = (($email['TYPE']) ? translate_type((string)$email['TYPE']) : '');
+ $emails[] = [
+ 'type' => $type,
+ 'address' => (string)$email
+ ];
+ }
+ }
+
+ $impps = [];
+ if($vcard->IMPP) {
+ foreach($vcard->IMPP as $impp) {
+ $type = (($impp['TYPE']) ? translate_type((string)$impp['TYPE']) : '');
+ $impps[] = [
+ 'type' => $type,
+ 'address' => (string)$impp
+ ];
+ }
+ }
+
+ $urls = [];
+ if($vcard->URL) {
+ foreach($vcard->URL as $url) {
+ $type = (($url['TYPE']) ? translate_type((string)$url['TYPE']) : '');
+ $urls[] = [
+ 'type' => $type,
+ 'address' => (string)$url
+ ];
+ }
+ }
+
+ $adrs = [];
+ if($vcard->ADR) {
+ foreach($vcard->ADR as $adr) {
+ $type = (($adr['TYPE']) ? translate_type((string)$adr['TYPE']) : '');
+ $adrs[] = [
+ 'type' => $type,
+ 'address' => $adr->getParts()
+ ];
+ }
+ }
+
+ $note = '';
+ if($vcard->NOTE) {
+ $note = (string)$vcard->NOTE;
+ }
+
+ $cards[] = [
+ 'id' => $object['id'],
+ 'uri' => $object['uri'],
+
+ 'photo' => $photo,
+ 'fn' => $fn,
+ 'org' => $org,
+ 'title' => $title,
+ 'tels' => $tels,
+ 'emails' => $emails,
+ 'impps' => $impps,
+ 'urls' => $urls,
+ 'adrs' => $adrs,
+ 'note' => $note
+ ];
+ }
+
+ usort($cards, function($a, $b) { return strcasecmp($a['fn'], $b['fn']); });
+ }
+
+ $o .= replace_macros(get_markup_template('cdav_addressbook.tpl'), [
+ '$id' => $id,
+ '$cards' => $cards,
+ '$displayname' => $displayname,
+ '$name_label' => t('Name'),
+ '$org_label' => t('Organisation'),
+ '$title_label' => t('Title'),
+ '$tel_label' => t('Phone'),
+ '$email_label' => t('Email'),
+ '$impp_label' => t('Instant messenger'),
+ '$url_label' => t('Website'),
+ '$adr_label' => t('Address'),
+ '$note_label' => t('Note'),
+ '$mobile' => t('Mobile'),
+ '$home' => t('Home'),
+ '$work' => t('Work'),
+ '$other' => t('Other'),
+ '$add_card' => t('Add Contact'),
+ '$add_field' => t('Add Field'),
+ '$create' => t('Create'),
+ '$update' => t('Update'),
+ '$delete' => t('Delete'),
+ '$cancel' => t('Cancel'),
+ '$po_box' => t('P.O. Box'),
+ '$extra' => t('Additional'),
+ '$street' => t('Street'),
+ '$locality' => t('Locality'),
+ '$region' => t('Region'),
+ '$zip_code' => t('ZIP Code'),
+ '$country' => t('Country')
+ ]);
+
+ return $o;
+ }
+
+ //delete addressbook
+ if(argc() > 3 && argv(1) === 'addressbook' && argv(2) === 'drop' && intval(argv(3))) {
+ $id = argv(3);
+
+ if(! cdav_perms($id,$addressbooks))
+ return;
+
+ $carddavBackend->deleteAddressBook($id);
+ killme();
+ }
+
+ }
+
+ function activate($pdo, $channel) {
+
+ if(! $channel)
+ return;
+
+ $uri = 'principals/' . $channel['channel_address'];
+
+
+ $r = q("select * from principals where uri = '%s' limit 1",
+ dbesc($uri)
+ );
+ if($r) {
+ $r = q("update principals set email = '%s', displayname = '%s' where uri = '%s' ",
+ dbesc($channel['xchan_addr']),
+ dbesc($channel['channel_name']),
+ dbesc($uri)
+ );
+ }
+ else {
+ $r = q("insert into principals ( uri, email, displayname ) values('%s','%s','%s') ",
+ dbesc($uri),
+ dbesc($channel['xchan_addr']),
+ dbesc($channel['channel_name'])
+ );
+
+ //create default calendar
+ $caldavBackend = new \Sabre\CalDAV\Backend\PDO($pdo);
+ $properties = [
+ '{DAV:}displayname' => t('Default Calendar'),
+ '{http://apple.com/ns/ical/}calendar-color' => '#3a87ad',
+ '{urn:ietf:params:xml:ns:caldav}calendar-description' => $channel['channel_name']
+ ];
+
+ $id = $caldavBackend->createCalendar($uri, 'default', $properties);
+ set_pconfig(local_channel(), 'cdav_calendar' , $id[0], 1);
+
+ //create default addressbook
+ $carddavBackend = new \Sabre\CardDAV\Backend\PDO($pdo);
+ $properties = ['{DAV:}displayname' => t('Default Addressbook')];
+ $carddavBackend->createAddressBook($uri, $default, $properties);
+
+ }
+ }
+
+
+}
diff --git a/Zotlabs/Module/Channel.php b/Zotlabs/Module/Channel.php
index 61df35a60..a44984c97 100644
--- a/Zotlabs/Module/Channel.php
+++ b/Zotlabs/Module/Channel.php
@@ -94,7 +94,7 @@ class Channel extends \Zotlabs\Web\Controller {
}
else {
if(\App::$profile['profile_uid'] == local_channel()) {
- nav_set_selected('home');
+ nav_set_selected(t('Channel Home'));
}
}
@@ -217,10 +217,10 @@ class Channel extends \Zotlabs\Web\Controller {
else {
if(x($category)) {
- $sql_extra .= protect_sprintf(term_query('item', $category, TERM_CATEGORY));
+ $sql_extra2 .= protect_sprintf(term_item_parent_query(\App::$profile['profile_uid'],'item', $category, TERM_CATEGORY));
}
if(x($hashtags)) {
- $sql_extra .= protect_sprintf(term_query('item', $hashtags, TERM_HASHTAG, TERM_COMMUNITYTAG));
+ $sql_extra2 .= protect_sprintf(term_item_parent_query(\App::$profile['profile_uid'],'item', $hashtags, TERM_HASHTAG, TERM_COMMUNITYTAG));
}
if($datequery) {
@@ -236,9 +236,9 @@ class Channel extends \Zotlabs\Web\Controller {
if($load || ($checkjs->disabled())) {
if($mid) {
- $r = q("SELECT parent AS item_id from item where mid = '%s' and uid = %d $item_normal
+ $r = q("SELECT parent AS item_id from item where mid like '%s' and uid = %d $item_normal
AND item_wall = 1 $sql_extra limit 1",
- dbesc($mid),
+ dbesc($mid . '%'),
intval(\App::$profile['profile_uid'])
);
if (! $r) {
@@ -325,8 +325,8 @@ class Channel extends \Zotlabs\Web\Controller {
'$order' => '',
'$list' => ((x($_REQUEST,'list')) ? intval($_REQUEST['list']) : 0),
'$file' => '',
- '$cats' => (($category) ? $category : ''),
- '$tags' => (($hashtags) ? $hashtags : ''),
+ '$cats' => (($category) ? urlencode($category) : ''),
+ '$tags' => (($hashtags) ? urlencode($hashtags) : ''),
'$mid' => $mid,
'$verb' => '',
'$dend' => $datequery,
@@ -365,10 +365,10 @@ class Channel extends \Zotlabs\Web\Controller {
if($checkjs->disabled()) {
- $o .= conversation($a,$items,'channel',$update,'traditional');
+ $o .= conversation($items,'channel',$update,'traditional');
}
else {
- $o .= conversation($a,$items,'channel',$update,$page_mode);
+ $o .= conversation($items,'channel',$update,$page_mode);
}
if((! $update) || ($checkjs->disabled())) {
diff --git a/Zotlabs/Module/Chanview.php b/Zotlabs/Module/Chanview.php
index 01ee74d5a..24ab9b022 100644
--- a/Zotlabs/Module/Chanview.php
+++ b/Zotlabs/Module/Chanview.php
@@ -102,27 +102,32 @@ class Chanview extends \Zotlabs\Web\Controller {
}
$is_zot = false;
+ $connected = false;
if (\App::$poi) {
$url = \App::$poi['xchan_url'];
if(\App::$poi['xchan_network'] === 'zot') {
$is_zot = true;
}
+ if(local_channel()) {
+ $c = q("select abook_id from abook where abook_channel = %d and abook_xchan = '%s' limit 1",
+ intval(local_channel()),
+ dbesc(\App::$poi['xchan_hash'])
+ );
+ if($c)
+ $connected = true;
+ }
}
-
+
// We will load the chanview template if it's a foreign network,
// just so that we can provide a connect button along with a profile
// photo. Chances are we can't load the remote profile into an iframe
// because of cross-domain security headers. So provide a link to
// the remote profile.
-
+ // If we are already connected, just go to the profile.
// Zot channels will usually have a connect link.
- // If it isn't zot, 'pro' members won't be able to use the connect
- // button as it is a foreign network so just send them to the remote
- // profile.
-
- if($is_zot || \Zotlabs\Lib\System::get_server_role() === 'pro') {
+ if($is_zot || $connected) {
if($is_zot && $observer) {
$url = zid($url);
}
diff --git a/Zotlabs/Module/Chat.php b/Zotlabs/Module/Chat.php
index 23a3e65da..138ca1cb5 100644
--- a/Zotlabs/Module/Chat.php
+++ b/Zotlabs/Module/Chat.php
@@ -89,9 +89,11 @@ class Chat extends \Zotlabs\Web\Controller {
function get() {
- if(local_channel())
+ if(local_channel()) {
$channel = \App::get_channel();
-
+ nav_set_selected(t('My Chatrooms'));
+ }
+
$ob = \App::get_observer();
$observer = get_observer_hash();
if(! $observer) {
diff --git a/Zotlabs/Module/Cloud.php b/Zotlabs/Module/Cloud.php
index 7370eeda3..75191a279 100644
--- a/Zotlabs/Module/Cloud.php
+++ b/Zotlabs/Module/Cloud.php
@@ -86,12 +86,13 @@ class Cloud extends \Zotlabs\Web\Controller {
// require_once('\Zotlabs\Storage/QuotaPlugin.php');
// $server->addPlugin(new \Zotlabs\Storage\\QuotaPlugin($auth));
- ob_start();
+// ob_start();
// All we need to do now, is to fire up the server
$server->exec();
- ob_end_flush();
-
+// ob_end_flush();
+ if($browser->build_page)
+ construct_page();
killme();
}
diff --git a/Zotlabs/Module/Connections.php b/Zotlabs/Module/Connections.php
index b079ae860..6ad1e9528 100644
--- a/Zotlabs/Module/Connections.php
+++ b/Zotlabs/Module/Connections.php
@@ -19,7 +19,7 @@ class Connections extends \Zotlabs\Web\Controller {
}
- function get() {
+ function get() {
$sort_type = 0;
$o = '';
@@ -29,6 +29,8 @@ class Connections extends \Zotlabs\Web\Controller {
notice( t('Permission denied.') . EOL);
return login();
}
+
+ nav_set_selected(t('Connections'));
$blocked = false;
$hidden = false;
@@ -63,15 +65,14 @@ class Connections extends \Zotlabs\Web\Controller {
$hidden = true;
break;
case 'archived':
- $search_flags = " and abook_archived = 1 ";
- $head = t('Archived');
+ $search_flags = " and ( abook_archived = 1 OR abook_not_here = 1) ";
+ $head = t('Archived/Unreachable');
$archived = true;
break;
case 'pending':
$search_flags = " and abook_pending = 1 ";
$head = t('New');
$pending = true;
- nav_set_selected('intros');
break;
case 'ifpending':
$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 abook_pending = 1 and abook_self = 0 and abook_ignored = 0 and xchan_deleted = 0 and xchan_orphan = 0 ",
@@ -81,7 +82,6 @@ class Connections extends \Zotlabs\Web\Controller {
$search_flags = " and abook_pending = 1 ";
$head = t('New');
$pending = true;
- nav_set_selected('intros');
\App::$argv[1] = 'pending';
}
else {
@@ -91,7 +91,6 @@ class Connections extends \Zotlabs\Web\Controller {
\App::$argc = 1;
unset(\App::$argv[1]);
}
- nav_set_selected('intros');
break;
// case 'unconnected':
// $search_flags = " and abook_unconnected = 1 ";
@@ -168,10 +167,10 @@ class Connections extends \Zotlabs\Web\Controller {
),
'archived' => array(
- 'label' => t('Archived'),
+ 'label' => t('Archived/Unreachable'),
'url' => z_root() . '/connections/archived',
'sel' => ($archived) ? 'active' : '',
- 'title' => t('Only show archived connections'),
+ 'title' => t('Only show archived/unreachable connections'),
),
'hidden' => array(
@@ -243,7 +242,8 @@ class Connections extends \Zotlabs\Web\Controller {
((intval($rr['abook_archived'])) ? t('Archived') : ''),
((intval($rr['abook_hidden'])) ? t('Hidden') : ''),
((intval($rr['abook_ignored'])) ? t('Ignored') : ''),
- ((intval($rr['abook_blocked'])) ? t('Blocked') : '')
+ ((intval($rr['abook_blocked'])) ? t('Blocked') : ''),
+ ((intval($rr['abook_not_here'])) ? t('Not connected at this location') : '')
);
foreach($status as $str) {
@@ -257,11 +257,12 @@ class Connections extends \Zotlabs\Web\Controller {
$contacts[] = array(
'img_hover' => sprintf( t('%1$s [%2$s]'),$rr['xchan_name'],$rr['xchan_url']),
'edit_hover' => t('Edit connection'),
+ 'edit' => t('Edit'),
'delete_hover' => t('Delete connection'),
'id' => $rr['abook_id'],
'thumb' => $rr['xchan_photo_m'],
'name' => $rr['xchan_name'],
- 'classes' => (intval($rr['abook_archived']) ? 'archived' : ''),
+ 'classes' => ((intval($rr['abook_archived']) || intval($rr['abook_not_here'])) ? 'archived' : ''),
'link' => z_root() . '/connedit/' . $rr['abook_id'],
'deletelink' => z_root() . '/connedit/' . intval($rr['abook_id']) . '/drop',
'delete' => t('Delete'),
diff --git a/Zotlabs/Module/Connedit.php b/Zotlabs/Module/Connedit.php
index 484e69b52..d301c2d45 100644
--- a/Zotlabs/Module/Connedit.php
+++ b/Zotlabs/Module/Connedit.php
@@ -842,6 +842,22 @@ class Connedit extends \Zotlabs\Web\Controller {
}
else
$locstr = t('none');
+
+ $clone_warn = '';
+ $clonable = (in_array($contact['xchan_network'],['zot','rss']) ? true : false);
+ if(! $clonable) {
+ $clone_warn = '<strong>';
+ $clone_warn .= ((intval($contact['abook_not_here']))
+ ? t('This connection is unreachable from this location.')
+ : t('This connection may be unreachable from other channel locations.')
+ );
+ $clone_warn .= '</strong><br>' . t('Location independence is not supported by their network.');
+ }
+
+
+
+ if(intval($contact['abook_not_here']) && $unclonable)
+ $not_here = t('This connection is unreachable from this location. Location independence is not supported by their network.');
$o .= replace_macros($tpl, [
'$header' => (($self) ? t('Connection Default Permissions') : sprintf( t('Connection: %s'),$contact['xchan_name'])),
@@ -856,6 +872,7 @@ class Connedit extends \Zotlabs\Web\Controller {
'$addr_text' => t('This connection\'s primary address is'),
'$loc_text' => t('Available locations:'),
'$locstr' => $locstr,
+ '$unclonable' => $clone_warn,
'$notself' => (($self) ? '' : '1'),
'$self' => (($self) ? '1' : ''),
'$autolbl' => t('The permissions indicated on this page will be applied to all new connections.'),
diff --git a/Zotlabs/Module/Directory.php b/Zotlabs/Module/Directory.php
index edcf43cd6..6268e99c6 100644
--- a/Zotlabs/Module/Directory.php
+++ b/Zotlabs/Module/Directory.php
@@ -77,7 +77,7 @@ class Directory extends \Zotlabs\Web\Controller {
$pubforums = get_directory_setting($observer, 'pubforums');
$o = '';
- nav_set_selected('directory');
+ nav_set_selected(t('Directory'));
if(x($_POST,'search'))
$search = notags(trim($_POST['search']));
@@ -233,7 +233,7 @@ class Directory extends \Zotlabs\Web\Controller {
$age = '';
if(strlen($rr['birthday'])) {
- if(($years = age($rr['birthday'],'UTC','')) != 0)
+ if(($years = age($rr['birthday'],'UTC','')) > 0)
$age = $years;
}
diff --git a/Zotlabs/Module/Display.php b/Zotlabs/Module/Display.php
index 815672091..df3cb1e2b 100644
--- a/Zotlabs/Module/Display.php
+++ b/Zotlabs/Module/Display.php
@@ -308,12 +308,12 @@ class Display extends \Zotlabs\Web\Controller {
if ($checkjs->disabled()) {
- $o .= conversation($a, $items, 'display', $update, 'traditional');
+ $o .= conversation($items, 'display', $update, 'traditional');
if ($items[0]['title'])
\App::$page['title'] = $items[0]['title'] . " - " . \App::$page['title'];
}
else {
- $o .= conversation($a, $items, 'display', $update, 'client');
+ $o .= conversation($items, 'display', $update, 'client');
}
if($updateable) {
diff --git a/Zotlabs/Module/Editpost.php b/Zotlabs/Module/Editpost.php
index 629bdd3fd..a54c42e7f 100644
--- a/Zotlabs/Module/Editpost.php
+++ b/Zotlabs/Module/Editpost.php
@@ -39,6 +39,11 @@ class Editpost extends \Zotlabs\Web\Controller {
return;
}
+ if($itm[0]['resource_type'] === 'photo' && $itm[0]['resource_id']) {
+ notice( t('Item is not editable') . EOL);
+ return;
+ }
+
if($itm[0]['resource_type'] === 'event' && $itm[0]['resource_id']) {
goaway(z_root() . '/events/' . $itm[0]['resource_id'] . '?expandform=1');
}
diff --git a/Zotlabs/Module/Editwebpage.php b/Zotlabs/Module/Editwebpage.php
index db33cd1db..da536a729 100644
--- a/Zotlabs/Module/Editwebpage.php
+++ b/Zotlabs/Module/Editwebpage.php
@@ -112,7 +112,7 @@ class Editwebpage extends \Zotlabs\Web\Controller {
intval($itm[0]['id'])
);
if($item_id)
- $page_title = $item_id[0]['v'];
+ $page_title = urldecode($item_id[0]['v']);
$mimetype = $itm[0]['mimetype'];
diff --git a/Zotlabs/Module/Events.php b/Zotlabs/Module/Events.php
index edc6dd3f0..0541f5e9b 100644
--- a/Zotlabs/Module/Events.php
+++ b/Zotlabs/Module/Events.php
@@ -272,7 +272,7 @@ class Events extends \Zotlabs\Web\Controller {
return;
}
- nav_set_selected('all_events');
+ nav_set_selected(t('Events'));
if((argc() > 2) && (argv(1) === 'ignore') && intval(argv(2))) {
$r = q("update event set dismissed = 1 where id = %d and uid = %d",
diff --git a/Zotlabs/Module/Filestorage.php b/Zotlabs/Module/Filestorage.php
index 785dff394..d6f363e77 100644
--- a/Zotlabs/Module/Filestorage.php
+++ b/Zotlabs/Module/Filestorage.php
@@ -5,14 +5,6 @@ namespace Zotlabs\Module;
*
*/
-require_once('include/attach.php');
-
-
-/**
- *
- * @param object &$a
- */
-
class Filestorage extends \Zotlabs\Web\Controller {
function post() {
@@ -36,7 +28,7 @@ class Filestorage extends \Zotlabs\Web\Controller {
$channel = \App::get_channel();
$acl = new \Zotlabs\Access\AccessList($channel);
- $acl->set_from_array($_REQUEST);
+ $acl->set_from_array($_POST);
$x = $acl->get();
$cloudPath = get_parent_cloudpath($channel_id, $channel['channel_address'], $resource);
diff --git a/Zotlabs/Module/Getfile.php b/Zotlabs/Module/Getfile.php
index 3d859d94b..0b05d78a4 100644
--- a/Zotlabs/Module/Getfile.php
+++ b/Zotlabs/Module/Getfile.php
@@ -35,6 +35,7 @@ class Getfile extends \Zotlabs\Web\Controller {
$sig = $_POST['signature'];
$resource = $_POST['resource'];
$revision = intval($_POST['revision']);
+ $resolution = (-1);
if(! $hash)
killme();
@@ -46,6 +47,11 @@ class Getfile extends \Zotlabs\Web\Controller {
killme();
}
+ if(substr($resource,-2,1) == '-') {
+ $resolution = intval(substr($resource,-1,1));
+ $resource = substr($resource,0,-2);
+ }
+
$slop = intval(get_pconfig($channel['channel_id'],'system','getfile_time_slop'));
if($slop < 1)
$slop = 3;
@@ -63,6 +69,35 @@ class Getfile extends \Zotlabs\Web\Controller {
killme();
}
+
+ if($resolution > 0) {
+ $r = q("select * from photo where resource_id = '%s' and uid = %d limit 1",
+ dbesc($resource),
+ intval($channel['channel_id'])
+ );
+ if($r) {
+ header('Content-type: ' . $r[0]['mimetype']);
+
+ if(intval($r[0]['os_storage'])) {
+ $fname = dbunescbin($r[0]['content']);
+ if(strpos($fname,'store') !== false)
+ $istream = fopen($fname,'rb');
+ else
+ $istream = fopen('store/' . $channel['channel_address'] . '/' . $fname,'rb');
+ $ostream = fopen('php://output','wb');
+ if($istream && $ostream) {
+ pipe_streams($istream,$ostream);
+ fclose($istream);
+ fclose($ostream);
+ }
+ }
+ else {
+ echo dbunescbin($r[0]['content']);
+ }
+ }
+ killme();
+ }
+
$r = attach_by_hash($resource,$channel['channel_hash'],$revision);
if(! $r['success']) {
diff --git a/Zotlabs/Module/Group.php b/Zotlabs/Module/Group.php
index 646310356..93a089d02 100644
--- a/Zotlabs/Module/Group.php
+++ b/Zotlabs/Module/Group.php
@@ -56,6 +56,7 @@ class Group extends \Zotlabs\Web\Controller {
);
if($r)
info( t('Privacy group updated.') . EOL );
+ build_sync_packet(local_channel(),null,true);
}
goaway(z_root() . '/group/' . argv(1) . '/' . argv(2));
@@ -63,7 +64,8 @@ class Group extends \Zotlabs\Web\Controller {
return;
}
- function get() {
+ function get() {
+
$change = false;
logger('mod_group: ' . \App::$cmd,LOGGER_DEBUG);
diff --git a/Zotlabs/Module/Hcard.php b/Zotlabs/Module/Hcard.php
index 13097939e..912c84fd2 100644
--- a/Zotlabs/Module/Hcard.php
+++ b/Zotlabs/Module/Hcard.php
@@ -14,6 +14,8 @@ class Hcard extends \Zotlabs\Web\Controller {
return;
}
+ logger('hcard_request: ' . $which, LOGGER_DEBUG);
+
$profile = '';
$channel = \App::get_channel();
diff --git a/Zotlabs/Module/Help.php b/Zotlabs/Module/Help.php
index e247416d9..e98cb9d4d 100644
--- a/Zotlabs/Module/Help.php
+++ b/Zotlabs/Module/Help.php
@@ -15,7 +15,7 @@ require_once('include/help.php');
class Help extends \Zotlabs\Web\Controller {
function get() {
- nav_set_selected('help');
+ nav_set_selected(t('Help'));
if($_REQUEST['search']) {
$o .= '<div id="help-content" class="generic-content-wrapper">';
@@ -44,42 +44,42 @@ class Help extends \Zotlabs\Web\Controller {
return $o;
}
-
-
- if(argc() > 2 && argv(argc()-2) === 'assets') {
- $path = '';
- for($x = 1; $x < argc(); $x ++) {
- if(strlen($path))
- $path .= '/';
- $path .= argv($x);
- }
- $realpath = 'doc/' . $path;
- //Set the content-type header as appropriate
- $imageInfo = getimagesize($realpath);
- switch ($imageInfo[2]) {
- case IMAGETYPE_JPEG:
- header("Content-Type: image/jpeg");
- break;
- case IMAGETYPE_GIF:
- header("Content-Type: image/gif");
- break;
- case IMAGETYPE_PNG:
- header("Content-Type: image/png");
- break;
- default:
- break;
- }
- header("Content-Length: " . filesize($realpath));
+
+
+ if(argc() > 2 && argv(argc()-2) === 'assets') {
+ $path = '';
+ for($x = 1; $x < argc(); $x ++) {
+ if(strlen($path))
+ $path .= '/';
+ $path .= argv($x);
+ }
+ $realpath = 'doc/' . $path;
+ //Set the content-type header as appropriate
+ $imageInfo = getimagesize($realpath);
+ switch ($imageInfo[2]) {
+ case IMAGETYPE_JPEG:
+ header("Content-Type: image/jpeg");
+ break;
+ case IMAGETYPE_GIF:
+ header("Content-Type: image/gif");
+ break;
+ case IMAGETYPE_PNG:
+ header("Content-Type: image/png");
+ break;
+ default:
+ break;
+ }
+ header("Content-Length: " . filesize($realpath));
- // dump the picture and stop the script
- readfile($realpath);
- killme();
- }
+ // dump the picture and stop the script
+ readfile($realpath);
+ killme();
+ }
$headings = [
- 'about' => t('About'),
- 'member' => t('Members'),
- 'admin' => t('Administrators'),
+ 'about' => t('About'),
+ 'member' => t('Members'),
+ 'admin' => t('Administrators'),
'developer' => t('Developers'),
'tutorials' => t('Tutorials')
];
@@ -87,13 +87,13 @@ class Help extends \Zotlabs\Web\Controller {
if(array_key_exists(argv(1), $headings))
$heading = $headings[argv(1)];
- $content = get_help_content();
+ $content = get_help_content();
return replace_macros(get_markup_template('help.tpl'), array(
- '$title' => t('$Projectname Documentation'),
+ '$title' => t('$Projectname Documentation'),
'$tocHeading' => t('Contents'),
- '$content' => $content,
- '$heading' => $heading
+ '$content' => $content,
+ '$heading' => $heading
));
}
diff --git a/Zotlabs/Module/Import.php b/Zotlabs/Module/Import.php
index ce3fd469a..40ce8f6d1 100644
--- a/Zotlabs/Module/Import.php
+++ b/Zotlabs/Module/Import.php
@@ -121,8 +121,7 @@ class Import extends \Zotlabs\Web\Controller {
$t = sprintf( t('Warning: Database versions differ by %1$d updates.'), $v2 - $v1 );
notice($t);
}
- if(array_key_exists('server_role',$data['compatibility']) && $data['compatibility']['server_role'] == 'basic')
- $moving = true;
+
}
if($moving)
@@ -333,6 +332,10 @@ class Import extends \Zotlabs\Web\Controller {
$abook['abook_feed'] = (($abook['abook_flags'] & 0x0100 ) ? 1 : 0);
}
+ if(array_key_exists('abook_instance',$abook) && $abook['abook_instance'] && strpos($abook['abook_instance'],z_root()) === false) {
+ $abook['abook_not_here'] = 1;
+ }
+
if($abook['abook_self']) {
$role = get_pconfig($channel['channel_id'],'system','permissions_role');
if(($role === 'forum') || ($abook['abook_my_perms'] & PERMS_W_TAGWALL)) {
diff --git a/Zotlabs/Module/Invite.php b/Zotlabs/Module/Invite.php
index 6b6f80a31..bbd98150d 100644
--- a/Zotlabs/Module/Invite.php
+++ b/Zotlabs/Module/Invite.php
@@ -49,7 +49,7 @@ class Invite extends \Zotlabs\Web\Controller {
if(! $recip)
continue;
- if(! valid_email($recip)) {
+ if(! validate_email($recip)) {
notice( sprintf( t('%s : Not a valid email address.'), $recip) . EOL);
continue;
}
@@ -88,12 +88,14 @@ class Invite extends \Zotlabs\Web\Controller {
}
- function get() {
+ function get() {
if(! local_channel()) {
notice( t('Permission denied.') . EOL);
return;
}
+
+ nav_set_selected(t('Invite'));
$tpl = get_markup_template('invite.tpl');
$invonly = false;
diff --git a/Zotlabs/Module/Item.php b/Zotlabs/Module/Item.php
index ec36c22d8..5e7a3fbc0 100644
--- a/Zotlabs/Module/Item.php
+++ b/Zotlabs/Module/Item.php
@@ -33,7 +33,7 @@ class Item extends \Zotlabs\Web\Controller {
// This will change. Figure out who the observer is and whether or not
// they have permission to post here. Else ignore the post.
- if((! local_channel()) && (! remote_channel()) && (! x($_REQUEST,'commenter')))
+ if((! local_channel()) && (! remote_channel()) && (! x($_REQUEST,'anonname')))
return;
$uid = local_channel();
@@ -77,7 +77,7 @@ class Item extends \Zotlabs\Web\Controller {
call_hooks('post_local_start', $_REQUEST);
- // logger('postvars ' . print_r($_REQUEST,true), LOGGER_DATA);
+ // logger('postvars ' . print_r($_REQUEST,true), LOGGER_DATA);
$api_source = ((x($_REQUEST,'api_source') && $_REQUEST['api_source']) ? true : false);
@@ -205,10 +205,29 @@ class Item extends \Zotlabs\Web\Controller {
$route = $parent_item['route'];
}
+
+ $moderated = false;
- if(! $observer)
+ if(! $observer) {
$observer = \App::get_observer();
+ if(! $observer) {
+ $observer = anon_identity_init($_REQUEST);
+ if($observer) {
+ $moderated = true;
+ $remote_xchan = $remote_observer = $observer;
+ }
+ }
+ }
+ if(! $observer) {
+ notice( t('Permission denied.') . EOL) ;
+ if($api_source)
+ return ( [ 'success' => false, 'message' => 'permission denied' ] );
+ if(x($_REQUEST,'return'))
+ goaway(z_root() . "/" . $return_path );
+ killme();
+ }
+
if($parent) {
logger('mod_item: item_post parent=' . $parent);
$can_comment = false;
@@ -312,7 +331,7 @@ class Item extends \Zotlabs\Web\Controller {
$walltowall = false;
$walltowall_comment = false;
- if($remote_xchan)
+ if($remote_xchan && ! $moderated)
$observer = $remote_observer;
if($observer) {
@@ -615,7 +634,7 @@ class Item extends \Zotlabs\Web\Controller {
$attach_link = '';
$hash = substr($mtch,0,strpos($mtch,','));
$rev = intval(substr($mtch,strpos($mtch,',')));
- $r = attach_by_hash_nodata($hash,$rev);
+ $r = attach_by_hash_nodata($hash, $observer['xchan_hash'], $rev);
if($r['success']) {
$attachments[] = array(
'href' => z_root() . '/attach/' . $r['data']['hash'],
@@ -799,7 +818,7 @@ class Item extends \Zotlabs\Web\Controller {
$datarray['owner'] = $owner_xchan;
$datarray['author'] = $observer;
$datarray['attach'] = json_encode($datarray['attach']);
- $o = conversation($a,array($datarray),'search',false,'preview');
+ $o = conversation(array($datarray),'search',false,'preview');
// logger('preview: ' . $o, LOGGER_DEBUG);
echo json_encode(array('preview' => $o));
killme();
@@ -842,8 +861,8 @@ class Item extends \Zotlabs\Web\Controller {
}
- if(mb_strlen($datarray['title']) > 255)
- $datarray['title'] = mb_substr($datarray['title'],0,255);
+ if(mb_strlen($datarray['title']) > 191)
+ $datarray['title'] = mb_substr($datarray['title'],0,191);
if($webpage) {
Zlib\IConfig::Set($datarray,'system', webpage_to_namespace($webpage),
@@ -909,6 +928,11 @@ class Item extends \Zotlabs\Web\Controller {
if($parent) {
+ // prevent conversations which you are involved from being expired
+
+ if(local_channel())
+ retain_item($parent);
+
// only send comment notification if this is a wall-to-wall comment,
// otherwise it will happen during delivery
@@ -996,6 +1020,10 @@ class Item extends \Zotlabs\Web\Controller {
\Zotlabs\Daemon\Master::Summon(array('Notifier', $notify_type, $post_id));
logger('post_complete');
+
+ if($moderated) {
+ info(t('Your comment is awaiting approval.') . EOL);
+ }
// figure out how to return, depending on from whence we came
diff --git a/Zotlabs/Module/Lang.php b/Zotlabs/Module/Lang.php
index 69f10fe6d..84776c3ea 100644
--- a/Zotlabs/Module/Lang.php
+++ b/Zotlabs/Module/Lang.php
@@ -5,6 +5,7 @@ namespace Zotlabs\Module;
class Lang extends \Zotlabs\Web\Controller {
function get() {
+ nav_set_selected(t('Language'));
return lang_selector();
}
diff --git a/Zotlabs/Module/Like.php b/Zotlabs/Module/Like.php
index 5ce8ec7f0..c995079ce 100644
--- a/Zotlabs/Module/Like.php
+++ b/Zotlabs/Module/Like.php
@@ -373,6 +373,10 @@ class Like extends \Zotlabs\Web\Controller {
$links = array(array('rel' => 'alternate','type' => 'text/html', 'href' => $item['plink']));
$objtype = (($item['resource_type'] === 'photo') ? ACTIVITY_OBJ_PHOTO : ACTIVITY_OBJ_NOTE );
+
+ if($objtype === ACTIVITY_OBJ_NOTE && (! intval($item['item_thread_top'])))
+ $objtype = ACTIVITY_OBJ_COMMENT;
+
$body = $item['body'];
@@ -500,6 +504,11 @@ class Like extends \Zotlabs\Web\Controller {
$post = item_store($arr);
$post_id = $post['item_id'];
+
+ // save the conversation from expiration
+
+ if(local_channel() && array_key_exists('item',$post) && (intval($post['item']['id']) != intval($post['item']['parent'])))
+ retain_item($post['item']['parent']);
$arr['id'] = $post_id;
diff --git a/Zotlabs/Module/Mail.php b/Zotlabs/Module/Mail.php
index d605a78a9..e5509961a 100644
--- a/Zotlabs/Module/Mail.php
+++ b/Zotlabs/Module/Mail.php
@@ -22,32 +22,40 @@ class Mail extends \Zotlabs\Web\Controller {
$recipient = ((x($_REQUEST,'messageto')) ? notags(trim($_REQUEST['messageto'])) : '');
$rstr = ((x($_REQUEST,'messagerecip')) ? notags(trim($_REQUEST['messagerecip'])) : '');
$preview = ((x($_REQUEST,'preview')) ? intval($_REQUEST['preview']) : 0);
- $expires = ((x($_REQUEST,'expires')) ? datetime_convert(date_default_timezone_get(),'UTC', $_REQUEST['expires']) : NULL_DATE);
+ $expires = ((x($_REQUEST,'expires')) ? datetime_convert(date_default_timezone_get(),'UTC', $_REQUEST['expires']) : NULL_DATE);
+ $raw = ((x($_REQUEST,'raw')) ? intval($_REQUEST['raw']) : 0);
+ $mimetype = ((x($_REQUEST,'mimetype')) ? notags(trim($_REQUEST['mimetype'])) : 'text/bbcode');
if($preview) {
- $body = cleanup_bbcode($body);
- $results = linkify_tags($a, $body, local_channel());
+ if($raw) {
+ $body = mail_prepare_binary(['id' => 'M0']);
+ echo json_encode(['preview' => $body]);
+ }
+ else {
+ $body = cleanup_bbcode($body);
+ $results = linkify_tags($a, $body, local_channel());
- 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,get_observer_hash(),$rev);
- if($r['success']) {
- $attachments[] = array(
- 'href' => z_root() . '/attach/' . $r['data']['hash'],
- 'length' => $r['data']['filesize'],
- 'type' => $r['data']['filetype'],
- 'title' => urlencode($r['data']['filename']),
- 'revision' => $r['data']['revision']
- );
+ 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,get_observer_hash(),$rev);
+ if($r['success']) {
+ $attachments[] = array(
+ 'href' => z_root() . '/attach/' . $r['data']['hash'],
+ 'length' => $r['data']['filesize'],
+ 'type' => $r['data']['filetype'],
+ 'title' => urlencode($r['data']['filename']),
+ 'revision' => $r['data']['revision']
+ );
+ }
+ $body = trim(str_replace($match[1],'',$body));
}
- $body = trim(str_replace($match[1],'',$body));
}
+ echo json_encode(['preview' => zidify_links(smilies(bbcode($body)))]);
}
- echo json_encode(['preview' => zidify_links(smilies(bbcode($body)))]);
killme();
}
@@ -102,36 +110,10 @@ class Mail extends \Zotlabs\Web\Controller {
}
}
- // if(feature_enabled(local_channel(),'richtext')) {
- // $body = fix_mce_lf($body);
- // }
-
require_once('include/text.php');
linkify_tags($a, $body, local_channel());
- // I don't think this is used any more.
-
- if($preview) {
- $mail = [
- 'mailbox' => 'outbox',
- 'id' => 0,
- 'mid' => 'M0',
- 'from_name' => $channel['xchan_name'],
- 'from_url' => $channel['xchan_url'],
- 'from_photo' => $channel['xchan_photo_s'],
- 'subject' => zidify_links(smilies(bbcode($subject))),
- 'body' => zidify_links(smilies(bbcode($body))),
- 'attachments' => '',
- 'can_recall' => false,
- 'is_recalled' => '',
- 'date' => datetime_convert('UTC',date_default_timezone_get(),$message['created'], 'c')
- ];
-
- echo replace_macros(get_markup_template('mail_conv.tpl'), [ '$mail' => $mail ] );
- killme();
- }
-
if(! $recipient) {
notice('No recipient found.');
\App::$argc = 2;
@@ -141,7 +123,7 @@ class Mail extends \Zotlabs\Web\Controller {
// We have a local_channel, let send_message use the session channel and save a lookup
- $ret = send_message(0, $recipient, $body, $subject, $replyto, $expires);
+ $ret = send_message(0, $recipient, $body, $subject, $replyto, $expires, $mimetype, $raw);
if($ret['success']) {
xchan_mail_query($ret['mail']);
@@ -158,7 +140,7 @@ class Mail extends \Zotlabs\Web\Controller {
function get() {
$o = '';
- nav_set_selected('messages');
+ nav_set_selected(t('Mail'));
if(! local_channel()) {
notice( t('Permission denied.') . EOL);
diff --git a/Zotlabs/Module/Manage.php b/Zotlabs/Module/Manage.php
index e541ee077..2d8f39ded 100644
--- a/Zotlabs/Module/Manage.php
+++ b/Zotlabs/Module/Manage.php
@@ -10,6 +10,8 @@ class Manage extends \Zotlabs\Web\Controller {
notice( t('Permission denied.') . EOL);
return;
}
+
+ nav_set_selected('Manage');
require_once('include/security.php');
diff --git a/Zotlabs/Module/Moderate.php b/Zotlabs/Module/Moderate.php
new file mode 100644
index 000000000..9af43420d
--- /dev/null
+++ b/Zotlabs/Module/Moderate.php
@@ -0,0 +1,76 @@
+<?php
+
+namespace Zotlabs\Module;
+
+require_once('include/conversation.php');
+
+
+class Moderate extends \Zotlabs\Web\Controller {
+
+
+ function get() {
+ if(! local_channel()) {
+ notice( t('Permission denied.') . EOL);
+ return;
+ }
+
+
+ if(argc() > 2) {
+ $post_id = intval(argv(1));
+ if(! $post_id)
+ goaway(z_root() . '/moderate');
+
+ $action = argv(2);
+
+ $r = q("select * from item where uid = %d and id = %d and item_blocked = %d limit 1",
+ intval(local_channel()),
+ intval($post_id),
+ intval(ITEM_MODERATED)
+ );
+
+ if($r) {
+ if($action === 'approve') {
+ q("update item set item_blocked = 0 where uid = %d and id = %d",
+ intval(local_channel()),
+ intval($post_id)
+ );
+ notice( t('Comment approved') . EOL);
+ }
+ elseif($action === 'drop') {
+ drop_item($post_id,false);
+ notice( t('Comment deleted') . EOL);
+ }
+
+ $r = q("select * from item where id = %d",
+ intval($post_id)
+ );
+ if($r) {
+ xchan_query($r);
+ $sync_item = fetch_post_tags($r);
+ build_sync_packet(local_channel(),array('item' => array(encode_item($sync_item[0],true))));
+ }
+ if($action === 'approve') {
+ \Zotlabs\Daemon\Master::Summon(array('Notifier', 'comment-new', $post_id));
+ }
+ goaway(z_root() . '/moderate');
+ }
+ }
+ $r = q("select item.id as item_id, item.* from item where item.uid = %d and item_blocked = %d and item_deleted = 0 order by created desc limit 60",
+ intval(local_channel()),
+ intval(ITEM_MODERATED)
+ );
+
+ if($r) {
+ xchan_query($r);
+ $items = fetch_post_tags($r,true);
+ }
+ else {
+ $items = array();
+ }
+
+ $o = conversation($items,'moderate',false,'traditional');
+ return $o;
+
+ }
+
+} \ No newline at end of file
diff --git a/Zotlabs/Module/Mood.php b/Zotlabs/Module/Mood.php
index eeb050040..85c8a3042 100644
--- a/Zotlabs/Module/Mood.php
+++ b/Zotlabs/Module/Mood.php
@@ -110,17 +110,17 @@ class Mood extends \Zotlabs\Web\Controller {
- function get() {
+ function get() {
if(! local_channel()) {
notice( t('Permission denied.') . EOL);
return;
}
-
+
+ nav_set_selected(t('Mood'));
+
$parent = ((x($_GET,'parent')) ? intval($_GET['parent']) : '0');
-
-
$verbs = get_mood_verbs();
$shortlist = array();
diff --git a/Zotlabs/Module/Network.php b/Zotlabs/Module/Network.php
index 1c7c70019..e5c059af5 100644
--- a/Zotlabs/Module/Network.php
+++ b/Zotlabs/Module/Network.php
@@ -154,7 +154,7 @@ class Network extends \Zotlabs\Web\Controller {
));
}
- nav_set_selected('network');
+ nav_set_selected(t('Activity'));
$channel_acl = array(
'allow_cid' => $channel['channel_allow_cid'],
@@ -325,8 +325,8 @@ class Network extends \Zotlabs\Web\Controller {
'$xchan' => $xchan,
'$order' => $order,
'$file' => $file,
- '$cats' => $category,
- '$tags' => $hashtags,
+ '$cats' => urlencode($category),
+ '$tags' => urlencode($hashtags),
'$dend' => $datequery,
'$mid' => '',
'$verb' => $verb,
@@ -409,8 +409,9 @@ class Network extends \Zotlabs\Web\Controller {
}
$abook_uids = " and abook.abook_channel = " . local_channel() . " ";
-
- if($firehose && (! get_config('system','disable_discover_tab'))) {
+
+ $disable_discover_tab = get_config('system','disable_discover_tab') || get_config('system','disable_discover_tab') === false;
+ if($firehose && (! $disable_discover_tab)) {
require_once('include/channel.php');
$sys = get_sys_channel();
$uids = " and item.uid = " . intval($sys['channel_id']) . " ";
@@ -551,7 +552,7 @@ class Network extends \Zotlabs\Web\Controller {
$mode = (($nouveau) ? 'network-new' : 'network');
- $o .= conversation($a,$items,$mode,$update,$page_mode);
+ $o .= conversation($items,$mode,$update,$page_mode);
if(($items) && (! $update))
$o .= alt_pager($a,count($items));
diff --git a/Zotlabs/Module/New_channel.php b/Zotlabs/Module/New_channel.php
index 8e6fd1d37..cfd45e909 100644
--- a/Zotlabs/Module/New_channel.php
+++ b/Zotlabs/Module/New_channel.php
@@ -134,7 +134,7 @@ class New_channel extends \Zotlabs\Web\Controller {
$name = array('name', t('Name or caption'), ((x($_REQUEST,'name')) ? $_REQUEST['name'] : ''), t('Examples: "Bob Jameson", "Lisa and her Horses", "Soccer", "Aviation Group"'), "*");
$nickhub = '@' . \App::get_hostname();
$nickname = array('nickname', t('Choose a short nickname'), ((x($_REQUEST,'nickname')) ? $_REQUEST['nickname'] : ''), sprintf( t('Your nickname will be used to create an easy to remember channel address e.g. nickname%s'), $nickhub), "*");
- $role = array('permissions_role' , t('Channel role and privacy'), ($privacy_role) ? $privacy_role : 'social', t('Select a channel role with your privacy requirements.') . ' <a href="help/roles" target="_blank">' . t('Read more about roles') . '</a>',$perm_roles);
+ $role = array('permissions_role' , t('Channel role and privacy'), ($privacy_role) ? $privacy_role : 'social', t('Select a channel role with your privacy requirements.') . ' <a href="help/member/member_guide#Account_Permission_Roles" target="_blank">' . t('Read more about roles') . '</a>',$perm_roles);
$o = replace_macros(get_markup_template('new_channel.tpl'), array(
'$title' => t('Create Channel'),
diff --git a/Zotlabs/Module/Oembed.php b/Zotlabs/Module/Oembed.php
index 9394e5942..aee5ea079 100644
--- a/Zotlabs/Module/Oembed.php
+++ b/Zotlabs/Module/Oembed.php
@@ -22,7 +22,7 @@ class Oembed extends \Zotlabs\Web\Controller {
}
else {
- echo "<html><head><base target=\"_blank\" /></head><body>";
+ echo "<html><head><base target=\"_blank\" rel=\"nofollow noopener\" /></head><body>";
$src = base64url_decode(argv(1));
$j = oembed_fetch_url($src);
echo $j['html'];
diff --git a/Zotlabs/Module/Oep.php b/Zotlabs/Module/Oep.php
index dc0547a42..9c05f5e3f 100644
--- a/Zotlabs/Module/Oep.php
+++ b/Zotlabs/Module/Oep.php
@@ -108,7 +108,7 @@ class Oep extends \Zotlabs\Web\Controller {
$ret['type'] = 'rich';
$w = (($maxwidth) ? $maxwidth : 640);
- $h = (($maxheight) ? $maxheight : $w * 2 / 3);
+ $h = (($maxheight) ? $maxheight : intval($w * 2 / 3));
$ret['html'] = '<div style="width: ' . $w . '; height: ' . $h . '; font-family: sans-serif,arial,freesans;" >' . $o . '</div>';
@@ -167,7 +167,7 @@ class Oep extends \Zotlabs\Web\Controller {
$ret['type'] = 'rich';
$w = (($maxwidth) ? $maxwidth : 640);
- $h = (($maxheight) ? $maxheight : $w * 2 / 3);
+ $h = (($maxheight) ? $maxheight : intval($w * 2 / 3));
$ret['html'] = '<div style="width: ' . $w . '; height: ' . $h . '; font-family: sans-serif,arial,freesans;" >' . $o . '</div>';
diff --git a/Zotlabs/Module/Page.php b/Zotlabs/Module/Page.php
index 6ef285dd0..c142afe77 100644
--- a/Zotlabs/Module/Page.php
+++ b/Zotlabs/Module/Page.php
@@ -3,7 +3,6 @@ namespace Zotlabs\Module;
require_once('include/items.php');
require_once('include/conversation.php');
-require_once('include/page_widgets.php');
class Page extends \Zotlabs\Web\Controller {
@@ -43,11 +42,31 @@ class Page extends \Zotlabs\Web\Controller {
$channel_address = argv(1);
+ // Always look first for the page name prefixed by the observer language; for instance page/nickname/de/foo
+ // followed by page/nickname/foo if that is not found.
+ // If your browser language is de and you want to access the default in this case,
+ // use page/nickname/-/foo to over-ride the language and access only the page with pagelink of 'foo'
+
+ $page_name = '';
+ $ignore_language = false;
+
+ for($x = 2; $x < argc(); $x ++) {
+ if($page_name === '' && argv($x) === '-') {
+ $ignore_language = true;
+ continue;
+ }
+ if($page_name)
+ $page_name .= '/';
+ $page_name .= argv($x);
+ }
+
+
// The page link title was stored in a urlencoded format
// php or the browser may/will have decoded it, so re-encode it for our search
- $page_id = urlencode(argv(2));
-
+ $page_id = urlencode($page_name);
+ $lang_page_id = urlencode(\App::$language . '/' . $page_name);
+
$u = q("select channel_id from channel where channel_address = '%s' limit 1",
dbesc($channel_address)
);
@@ -64,16 +83,31 @@ class Page extends \Zotlabs\Web\Controller {
require_once('include/security.php');
$sql_options = item_permissions_sql($u[0]['channel_id']);
-
- $r = q("select item.* from item left join iconfig on item.id = iconfig.iid
- where item.uid = %d and iconfig.cat = 'system' and iconfig.v = '%s' and item.item_delayed = 0
- and (( iconfig.k = 'WEBPAGE' and item_type = %d )
- OR ( iconfig.k = 'PDL' AND item_type = %d )) $sql_options $revision limit 1",
- intval($u[0]['channel_id']),
- dbesc($page_id),
- intval(ITEM_TYPE_WEBPAGE),
- intval(ITEM_TYPE_PDL)
- );
+
+ $r = null;
+
+ if(! $ignore_language) {
+ $r = q("select item.* from item left join iconfig on item.id = iconfig.iid
+ where item.uid = %d and iconfig.cat = 'system' and iconfig.v = '%s' and item.item_delayed = 0
+ and (( iconfig.k = 'WEBPAGE' and item_type = %d )
+ OR ( iconfig.k = 'PDL' AND item_type = %d )) $sql_options $revision limit 1",
+ intval($u[0]['channel_id']),
+ dbesc($lang_page_id),
+ intval(ITEM_TYPE_WEBPAGE),
+ intval(ITEM_TYPE_PDL)
+ );
+ }
+ if(! $r) {
+ $r = q("select item.* from item left join iconfig on item.id = iconfig.iid
+ where item.uid = %d and iconfig.cat = 'system' and iconfig.v = '%s' and item.item_delayed = 0
+ and (( iconfig.k = 'WEBPAGE' and item_type = %d )
+ OR ( iconfig.k = 'PDL' AND item_type = %d )) $sql_options $revision limit 1",
+ intval($u[0]['channel_id']),
+ dbesc($page_id),
+ intval(ITEM_TYPE_WEBPAGE),
+ intval(ITEM_TYPE_PDL)
+ );
+ }
if(! $r) {
// Check again with no permissions clause to see if it is a permissions issue
diff --git a/Zotlabs/Module/Photo.php b/Zotlabs/Module/Photo.php
index dc4ae670e..8a110f925 100644
--- a/Zotlabs/Module/Photo.php
+++ b/Zotlabs/Module/Photo.php
@@ -154,7 +154,9 @@ class Photo extends \Zotlabs\Web\Controller {
intval($resolution)
);
- if($r && $r[0]['photo_usage'] == PHOTO_COVER)
+ // viewing cover photos is allowed unless a plugin chooses to block it.
+
+ if($r && intval($r[0]['photo_usage']) === PHOTO_COVER && $resolution >= PHOTO_RES_COVER_1200)
$allowed = 1;
$d = [ 'imgscale' => $resolution, 'resource_id' => $photo, 'photo' => $r, 'allowed' => $allowed ];
diff --git a/Zotlabs/Module/Photos.php b/Zotlabs/Module/Photos.php
index 18d7abc48..0f80f46a5 100644
--- a/Zotlabs/Module/Photos.php
+++ b/Zotlabs/Module/Photos.php
@@ -554,6 +554,8 @@ class Photos extends \Zotlabs\Web\Controller {
$sql_item = item_permissions_sql($owner_uid,get_observer_hash());
$sql_extra = permissions_sql($owner_uid,get_observer_hash(),'photo');
$sql_attach = permissions_sql($owner_uid,get_observer_hash(),'attach');
+
+ nav_set_selected(t('Photos'));
$o = "";
diff --git a/Zotlabs/Module/Poke.php b/Zotlabs/Module/Poke.php
index cf8d83023..0bd1187c7 100644
--- a/Zotlabs/Module/Poke.php
+++ b/Zotlabs/Module/Poke.php
@@ -41,7 +41,10 @@ class Poke extends \Zotlabs\Web\Controller {
$activity = ACTIVITY_POKE . '#' . urlencode($verbs[$verb][0]);
$contact_id = intval($_REQUEST['cid']);
- if(! $contact_id)
+
+ $xchan = trim($_REQUEST['xchan']);
+
+ if(! ($contact_id || $xchan))
return;
$parent = ((x($_REQUEST,'parent')) ? intval($_REQUEST['parent']) : 0);
@@ -49,13 +52,20 @@ class Poke extends \Zotlabs\Web\Controller {
logger('poke: verb ' . $verb . ' contact ' . $contact_id, LOGGER_DEBUG);
- $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($contact_id) {
+ $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($xchan) {
+ $r = q("SELECT * FROM xchan where xchan_hash like ( '%s' ) LIMIT 1",
+ dbesc($xchan . '%')
+ );
+ }
+
if(! $r) {
- logger('poke: no target ' . $contact_id);
+ logger('poke: no target.');
return;
}
@@ -79,7 +89,7 @@ class Poke extends \Zotlabs\Web\Controller {
$deny_gid = $r[0]['deny_gid'];
}
}
- else {
+ elseif($contact_id) {
$item_private = ((x($_GET,'private')) ? intval($_GET['private']) : 0);
@@ -92,9 +102,11 @@ class Poke extends \Zotlabs\Web\Controller {
$arr = array();
+
+
$arr['item_wall'] = 1;
$arr['owner_xchan'] = (($parent_item) ? $parent_item['owner_xchan'] : $channel['channel_hash']);
- $arr['parent_mid'] = (($parent_mid) ? $parent_mid : $mid);
+ $arr['parent_mid'] = (($parent_mid) ? $parent_mid : '');
$arr['title'] = '';
$arr['allow_cid'] = $allow_cid;
$arr['allow_gid'] = $allow_gid;
@@ -131,12 +143,14 @@ class Poke extends \Zotlabs\Web\Controller {
- function get() {
+ function get() {
if(! local_channel()) {
notice( t('Permission denied.') . EOL);
return;
}
+
+ nav_set_selected(t('Poke'));
$name = '';
$id = '';
diff --git a/Zotlabs/Module/Probe.php b/Zotlabs/Module/Probe.php
index 7fc0e8ff5..859bed315 100644
--- a/Zotlabs/Module/Probe.php
+++ b/Zotlabs/Module/Probe.php
@@ -7,7 +7,9 @@ require_once('include/zot.php');
class Probe extends \Zotlabs\Web\Controller {
function get() {
-
+
+ nav_set_selected(t('Remote Diagnostics'));
+
$o .= '<h3>Probe Diagnostic</h3>';
$o .= '<form action="probe" method="get">';
diff --git a/Zotlabs/Module/Profile.php b/Zotlabs/Module/Profile.php
index ab349b05d..6930d50ca 100644
--- a/Zotlabs/Module/Profile.php
+++ b/Zotlabs/Module/Profile.php
@@ -21,6 +21,8 @@ class Profile extends \Zotlabs\Web\Controller {
\App::$error = 404;
return;
}
+
+ nav_set_selected('Profile');
$profile = '';
$channel = \App::get_channel();
diff --git a/Zotlabs/Module/Profile_photo.php b/Zotlabs/Module/Profile_photo.php
index e8f0e5186..47b627015 100644
--- a/Zotlabs/Module/Profile_photo.php
+++ b/Zotlabs/Module/Profile_photo.php
@@ -190,7 +190,7 @@ class Profile_photo extends \Zotlabs\Web\Controller {
build_sync_packet($channel['channel_id'],array('file' => array($sync)));
- // Similarly, tell the nav bar to bypass the cache and update the avater image.
+ // Similarly, tell the nav bar to bypass the cache and update the avatar image.
$_SESSION['reload_avatar'] = true;
info( t('Shift-reload the page or clear browser cache if the new photo does not display immediately.') . EOL);
diff --git a/Zotlabs/Module/Profiles.php b/Zotlabs/Module/Profiles.php
index f6e8b11ed..b1cf9596c 100644
--- a/Zotlabs/Module/Profiles.php
+++ b/Zotlabs/Module/Profiles.php
@@ -9,7 +9,7 @@ class Profiles extends \Zotlabs\Web\Controller {
function init() {
- nav_set_selected('profiles');
+ nav_set_selected('Profiles');
if(! local_channel()) {
return;
diff --git a/Zotlabs/Module/Pubstream.php b/Zotlabs/Module/Pubstream.php
index 46210abb1..42aa2b51b 100644
--- a/Zotlabs/Module/Pubstream.php
+++ b/Zotlabs/Module/Pubstream.php
@@ -16,8 +16,8 @@ class Pubstream extends \Zotlabs\Web\Controller {
return login();
}
-
- if(get_config('system','disable_discover_tab'))
+ $disable_discover_tab = get_config('system','disable_discover_tab') || get_config('system','disable_discover_tab') === false;
+ if($disable_discover_tab)
return;
$item_normal = item_normal();
@@ -167,7 +167,7 @@ class Pubstream extends \Zotlabs\Web\Controller {
// fake it
$mode = ('network');
- $o .= conversation($a,$items,$mode,$update,$page_mode);
+ $o .= conversation($items,$mode,$update,$page_mode);
if(($items) && (! $update))
$o .= alt_pager($a,count($items));
diff --git a/Zotlabs/Module/Randprof.php b/Zotlabs/Module/Randprof.php
index dc2e925fe..94ec095cb 100644
--- a/Zotlabs/Module/Randprof.php
+++ b/Zotlabs/Module/Randprof.php
@@ -8,7 +8,7 @@ class Randprof extends \Zotlabs\Web\Controller {
function init() {
$x = random_profile();
if($x)
- goaway(chanlink_url($x));
+ goaway(chanlink_hash($x));
/** FIXME this doesn't work at the moment as a fallback */
goaway(z_root() . '/profile');
diff --git a/Zotlabs/Module/React.php b/Zotlabs/Module/React.php
index ed4f87e7e..6cd79c952 100644
--- a/Zotlabs/Module/React.php
+++ b/Zotlabs/Module/React.php
@@ -39,6 +39,10 @@ class React extends \Zotlabs\Web\Controller {
$n['author_xchan'] = $channel['channel_hash'];
$x = item_store($n);
+
+ if(local_channel())
+ retain_item($postid);
+
if($x['success']) {
$nid = $x['item_id'];
\Zotlabs\Daemon\Master::Summon(array('Notifier','like',$nid));
diff --git a/Zotlabs/Module/Register.php b/Zotlabs/Module/Register.php
index 1d8944d8e..d4573156c 100644
--- a/Zotlabs/Module/Register.php
+++ b/Zotlabs/Module/Register.php
@@ -151,7 +151,7 @@ class Register extends \Zotlabs\Web\Controller {
$new_channel = false;
$next_page = 'new_channel';
- if(get_config('system','auto_channel_create') || get_config('system','server_role') == 'basic') {
+ if(get_config('system','auto_channel_create')) {
$new_channel = auto_channel_create($result['account']['account_id']);
if($new_channel['success']) {
$channel_id = $new_channel['channel']['channel_id'];
@@ -237,14 +237,12 @@ class Register extends \Zotlabs\Web\Controller {
$name = array('name', t('Name or caption'), ((x($_REQUEST,'name')) ? $_REQUEST['name'] : ''), t('Examples: "Bob Jameson", "Lisa and her Horses", "Soccer", "Aviation Group"'));
$nickhub = '@' . str_replace(array('http://','https://','/'), '', get_config('system','baseurl'));
$nickname = array('nickname', t('Choose a short nickname'), ((x($_REQUEST,'nickname')) ? $_REQUEST['nickname'] : ''), sprintf( t('Your nickname will be used to create an easy to remember channel address e.g. nickname%s'), $nickhub));
- $role = array('permissions_role' , t('Channel role and privacy'), ($privacy_role) ? $privacy_role : 'social', t('Select a channel role with your privacy requirements.') . ' <a href="help/roles" target="_blank">' . t('Read more about roles') . '</a>',$perm_roles);
+ $role = array('permissions_role' , t('Channel role and privacy'), ($privacy_role) ? $privacy_role : 'social', t('Select a channel role with your privacy requirements.') . ' <a href="help/member/member_guide#Account_Permission_Roles" target="_blank">' . t('Read more about roles') . '</a>',$perm_roles);
$tos = array('tos', $label_tos, '', '', array(t('no'),t('yes')));
- $server_role = get_config('system','server_role');
-
- $auto_create = (($server_role == 'basic') || (get_config('system','auto_channel_create')) ? true : false);
- $default_role = (($server_role == 'basic') ? 'social' : get_config('system','default_permissions_role'));
+ $auto_create = (get_config('system','auto_channel_create') ? true : false);
+ $default_role = get_config('system','default_permissions_role');
require_once('include/bbcode.php');
diff --git a/Zotlabs/Module/Rpost.php b/Zotlabs/Module/Rpost.php
index 1349cd1c5..731eab82e 100644
--- a/Zotlabs/Module/Rpost.php
+++ b/Zotlabs/Module/Rpost.php
@@ -59,6 +59,8 @@ class Rpost extends \Zotlabs\Web\Controller {
}
return login();
}
+
+ nav_set_selected(t('Post'));
// If we have saved rpost session variables, but nothing in the current $_REQUEST, recover the saved variables
diff --git a/Zotlabs/Module/Search.php b/Zotlabs/Module/Search.php
index aacdc88e7..e1d35b879 100644
--- a/Zotlabs/Module/Search.php
+++ b/Zotlabs/Module/Search.php
@@ -15,14 +15,14 @@ class Search extends \Zotlabs\Web\Controller {
if((get_config('system','block_public')) || (get_config('system','block_public_search'))) {
if ((! local_channel()) && (! remote_channel())) {
notice( t('Public access denied.') . EOL);
- return;
+ return;
}
}
if($load)
$_SESSION['loadtime'] = datetime_convert();
- nav_set_selected('search');
+ nav_set_selected(t('Search'));
require_once("include/bbcode.php");
require_once('include/security.php');
@@ -81,11 +81,12 @@ class Search extends \Zotlabs\Web\Controller {
return $o;
if($tag) {
- $sql_extra = sprintf(" AND item.id IN (select oid from term where otype = %d and ttype in ( %d , %d) and term = '%s') ",
+ $wildtag = str_replace('*','%',$search);
+ $sql_extra = sprintf(" AND item.id IN (select oid from term where otype = %d and ttype in ( %d , %d) and term like '%s') ",
intval(TERM_OBJ_POST),
intval(TERM_HASHTAG),
intval(TERM_COMMUNITYTAG),
- dbesc(protect_sprintf($search))
+ dbesc(protect_sprintf($wildtag))
);
}
else {
@@ -144,7 +145,7 @@ class Search extends \Zotlabs\Web\Controller {
}
- $item_normal = item_normal();
+ $item_normal = item_normal_search();
$pub_sql = public_permissions_sql($observer_hash);
require_once('include/channel.php');
@@ -225,7 +226,7 @@ class Search extends \Zotlabs\Web\Controller {
else
$o .= '<h2>' . sprintf( t('Search results for: %s'),htmlspecialchars($search, ENT_COMPAT,'UTF-8')) . '</h2>';
- $o .= conversation($a,$items,'search',$update,'client');
+ $o .= conversation($items,'search',$update,'client');
$o .= '</div>';
diff --git a/Zotlabs/Module/Settings.php b/Zotlabs/Module/Settings.php
index 76794e21c..79031c98f 100644
--- a/Zotlabs/Module/Settings.php
+++ b/Zotlabs/Module/Settings.php
@@ -53,7 +53,7 @@ class Settings extends \Zotlabs\Web\Controller {
function get() {
- nav_set_selected('settings');
+ nav_set_selected('Settings');
if((! local_channel()) || ($_SESSION['delegate'])) {
notice( t('Permission denied.') . EOL );
diff --git a/Zotlabs/Module/Settings/Account.php b/Zotlabs/Module/Settings/Account.php
index ec176797d..18890e89f 100644
--- a/Zotlabs/Module/Settings/Account.php
+++ b/Zotlabs/Module/Settings/Account.php
@@ -16,7 +16,7 @@ class Account {
$account = \App::get_account();
if($email != $account['account_email']) {
- if(! valid_email($email))
+ if(! validate_email($email))
$errs[] = t('Not valid email.');
$adm = trim(get_config('system','admin_email'));
if(($adm) && (strcasecmp($email,$adm) == 0)) {
diff --git a/Zotlabs/Module/Settings/Channel.php b/Zotlabs/Module/Settings/Channel.php
index 56a7d0d8e..3e6adcf8d 100644
--- a/Zotlabs/Module/Settings/Channel.php
+++ b/Zotlabs/Module/Settings/Channel.php
@@ -324,7 +324,7 @@ class Channel {
foreach($global_perms as $k => $perm) {
$options = array();
foreach($perm_opts as $opt) {
- if((! strstr($k,'view')) && $opt[1] == PERMS_PUBLIC)
+ if(((! strstr($k,'view')) && $k !== 'post_comments') && $opt[1] == PERMS_PUBLIC)
continue;
$options[$opt[1]] = $opt[0];
}
@@ -489,7 +489,6 @@ class Channel {
'$h_prv' => t('Security and Privacy Settings'),
'$permissions_set' => $permissions_set,
- '$server_role' => \Zotlabs\Lib\System::get_server_role(),
'$perms_set_msg' => t('Your permissions are already configured. Click to view/adjust'),
'$hide_presence' => array('hide_presence', t('Hide my online presence'),$hide_presence, t('Prevents displaying in your profile that you are online'), $yes_no),
diff --git a/Zotlabs/Module/Settings/Featured.php b/Zotlabs/Module/Settings/Featured.php
index 4885abd1d..ebe2996d3 100644
--- a/Zotlabs/Module/Settings/Featured.php
+++ b/Zotlabs/Module/Settings/Featured.php
@@ -10,14 +10,16 @@ class Featured {
call_hooks('feature_settings_post', $_POST);
- if(intval($_POST['affinity_cmax'])) {
- set_pconfig(local_channel(),'affinity','cmax',intval($_POST['affinity_cmax']));
- }
- if(intval($_POST['affinity_cmin'])) {
- set_pconfig(local_channel(),'affinity','cmin',intval($_POST['affinity_cmin']));
- }
- if(intval($_POST['affinity_cmax']) || intval($_POST['affinity_cmin'])) {
- info( t('Affinity Slider settings updated.') . EOL);
+ if($_POST['affinity_slider-submit']) {
+ if(intval($_POST['affinity_cmax'])) {
+ set_pconfig(local_channel(),'affinity','cmax',intval($_POST['affinity_cmax']));
+ }
+ if(intval($_POST['affinity_cmin'])) {
+ set_pconfig(local_channel(),'affinity','cmin',intval($_POST['affinity_cmin']));
+ }
+ if(intval($_POST['affinity_cmax']) || intval($_POST['affinity_cmin'])) {
+ info( t('Affinity Slider settings updated.') . EOL);
+ }
}
build_sync_packet();
diff --git a/Zotlabs/Module/Setup.php b/Zotlabs/Module/Setup.php
index d4c31fd4e..2134288d6 100644
--- a/Zotlabs/Module/Setup.php
+++ b/Zotlabs/Module/Setup.php
@@ -73,9 +73,6 @@ class Setup extends \Zotlabs\Web\Controller {
$phpath = trim($_POST['phpath']);
$adminmail = trim($_POST['adminmail']);
$siteurl = trim($_POST['siteurl']);
- $server_role = trim($_POST['server_role']);
- if(! $server_role)
- $server_role = 'standard';
// $siteurl should not have a trailing slash
@@ -103,9 +100,6 @@ class Setup extends \Zotlabs\Web\Controller {
$timezone = trim($_POST['timezone']);
$adminmail = trim($_POST['adminmail']);
$siteurl = trim($_POST['siteurl']);
- $server_role = trim($_POST['server_role']);
- if(! $server_role)
- $server_role = 'standard';
if($siteurl != z_root()) {
$test = z_fetch_url($siteurl."/setup/testrewrite");
@@ -134,7 +128,7 @@ class Setup extends \Zotlabs\Web\Controller {
'$dbpass' => $dbpass,
'$dbdata' => $dbdata,
'$dbtype' => $dbtype,
- '$server_role' => $server_role,
+ '$server_role' => 'pro',
'$timezone' => $timezone,
'$siteurl' => $siteurl,
'$site_id' => random_string(),
@@ -192,14 +186,17 @@ class Setup extends \Zotlabs\Web\Controller {
}
$db_return_text = '';
if(x(\App::$data, 'db_installed')) {
- $txt = '<p style="font-size: 130%;">';
- $txt .= t('Your site database has been installed.') . EOL;
+ $pass = 'Installation succeeded!';
+ $icon = 'check';
+ $txt = t('Your site database has been installed.') . EOL;
$db_return_text .= $txt;
}
if(x(\App::$data, 'db_failed')) {
+ $pass = 'Database install failed!';
+ $icon = 'exclamation-triangle';
$txt = t('You may need to import the file "install/schema_xxx.sql" manually using a database client.') . EOL;
$txt .= t('Please see the file "install/INSTALL.txt".') . EOL ."<hr>" ;
- $txt .= "<pre>".\App::$data['db_failed'] . "</pre>". EOL ;
+ $txt .= "<pre>" . \App::$data['db_failed'] . "</pre>". EOL ;
$db_return_text .= $txt;
}
if(\DBA::$dba && \DBA::$dba->connected) {
@@ -223,8 +220,10 @@ class Setup extends \Zotlabs\Web\Controller {
$tpl = get_markup_template('install.tpl');
return replace_macros($tpl, array(
'$title' => $install_title,
- '$pass' => '',
- '$text' => $db_return_text . $this->what_next(),
+ '$icon' => $icon,
+ '$pass' => $pass,
+ '$text' => $db_return_text,
+ '$what_next' => $this->what_next()
));
}
@@ -324,11 +323,6 @@ class Setup extends \Zotlabs\Web\Controller {
$siteurl = trim($_POST['siteurl']);
$timezone = ((x($_POST,'timezone')) ? ($_POST['timezone']) : 'America/Los_Angeles');
- $server_roles = [
- 'basic' => t('Basic/Minimal Social Networking'),
- 'standard' => t('Standard Configuration (default)'),
- 'pro' => t('Professional')
- ];
$tpl = get_markup_template('install_settings.tpl');
$o .= replace_macros($tpl, array(
@@ -348,8 +342,6 @@ class Setup extends \Zotlabs\Web\Controller {
'$siteurl' => array('siteurl', t('Website URL'), z_root(), t('Please use SSL (https) URL if available.')),
- '$server_role' => array('server_role', t("Server Configuration/Role"), 'standard','',$server_roles),
-
'$timezone' => array('timezone', t('Please select a default timezone for your website'), $timezone, '', get_timezones()),
'$baseurl' => z_root(),
@@ -408,7 +400,7 @@ class Setup extends \Zotlabs\Web\Controller {
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.') . EOL;
- $help .= EOL . EOL ;
+ $help .= EOL;
$tpl = get_markup_template('field_input.tpl');
$help .= replace_macros($tpl, array(
'$field' => array('phpath', t('PHP executable path'), $phpath, t('Enter full path to php executable. You can leave this blank to continue the installation.')),
@@ -456,7 +448,7 @@ class Setup extends \Zotlabs\Web\Controller {
userReadableSize($result['max_upload_filesize']),
$result['max_file_uploads']
);
- $help .= '<br>' . t('You can adjust these settings in the server php.ini file.');
+ $help .= '<br><br>' . t('You can adjust these settings in the server php.ini file.');
$this->check_add($checks, t('PHP upload limits'), true, false, $help);
}
@@ -748,12 +740,12 @@ class Setup extends \Zotlabs\Web\Controller {
$baseurl = z_root();
return
- t('<h1>What next</h1>')
- ."<p>".t('IMPORTANT: You will need to [manually] setup a scheduled task for the poller.')
+ t('<h1>What next?</h1>')
+ ."<div class=\"alert alert-info\">".t('IMPORTANT: You will need to [manually] setup a scheduled task for the poller.').EOL
.t('Please see the file "install/INSTALL.txt".')
- ."</p><p>"
+ ."</div><div>"
.t("Go to your new hub <a href='$baseurl/register'>registration page</a> and register as new member. Remember to use the same email you have entered as administrator email. This will allow you to enter the site admin panel.")
- ."</p>";
+ ."</div>";
}
/**
diff --git a/Zotlabs/Module/Share.php b/Zotlabs/Module/Share.php
index fcc2486ba..5c4811c59 100644
--- a/Zotlabs/Module/Share.php
+++ b/Zotlabs/Module/Share.php
@@ -76,7 +76,7 @@ class Share extends \Zotlabs\Web\Controller {
$observer = \App::get_observer();
$parsed = $observer['xchan_url'];
if($parsed) {
- $post_url = $parsed['scheme'] . ':' . $parsed['host'] . (($parsed['port']) ? ':' . $parsed['port'] : '')
+ $post_url = $parsed['scheme'] . '://' . $parsed['host'] . (($parsed['port']) ? ':' . $parsed['port'] : '')
. '/rpost';
/**
diff --git a/Zotlabs/Module/Sharedwithme.php b/Zotlabs/Module/Sharedwithme.php
index 5d6d0f7da..2c97e9726 100644
--- a/Zotlabs/Module/Sharedwithme.php
+++ b/Zotlabs/Module/Sharedwithme.php
@@ -4,6 +4,11 @@ require_once('include/conversation.php');
require_once('include/text.php');
+/**
+ * @file Zotlabs/Module/Sharedwithme.php
+ *
+ */
+
class Sharedwithme extends \Zotlabs\Web\Controller {
function get() {
diff --git a/Zotlabs/Module/Siteinfo.php b/Zotlabs/Module/Siteinfo.php
index 7c3918425..fafd51f65 100644
--- a/Zotlabs/Module/Siteinfo.php
+++ b/Zotlabs/Module/Siteinfo.php
@@ -5,14 +5,13 @@ namespace Zotlabs\Module;
class Siteinfo extends \Zotlabs\Web\Controller {
function init() {
- if (argv(1) === 'json') {
+logger(print_r($_REQUEST,true));
+ if (argv(1) === 'json' || $_REQUEST['module_format'] === 'json') {
$data = get_site_info();
json_return_and_die($data);
}
}
-
-
-
+
function get() {
$siteinfo = replace_macros(get_markup_template('siteinfo.tpl'),
diff --git a/Zotlabs/Module/Siteinfo_json.php b/Zotlabs/Module/Siteinfo_json.php
deleted file mode 100644
index 99c22610f..000000000
--- a/Zotlabs/Module/Siteinfo_json.php
+++ /dev/null
@@ -1,14 +0,0 @@
-<?php
-namespace Zotlabs\Module;
-
-
-class Siteinfo_json extends \Zotlabs\Web\Controller {
-
- function init() {
-
- $data = get_site_info();
- json_return_and_die($data);
-
- }
-
-}
diff --git a/Zotlabs/Module/Suggest.php b/Zotlabs/Module/Suggest.php
index 2a69145ed..c3f4a6d5a 100644
--- a/Zotlabs/Module/Suggest.php
+++ b/Zotlabs/Module/Suggest.php
@@ -28,6 +28,8 @@ class Suggest extends \Zotlabs\Web\Controller {
notice( t('Permission denied.') . EOL);
return;
}
+
+ nav_set_selected(t('Suggest Channels'));
$_SESSION['return_url'] = z_root() . '/' . \App::$cmd;
diff --git a/Zotlabs/Module/Token.php b/Zotlabs/Module/Token.php
new file mode 100644
index 000000000..e0d9d74d7
--- /dev/null
+++ b/Zotlabs/Module/Token.php
@@ -0,0 +1,40 @@
+<?php
+
+namespace Zotlabs\Module;
+
+
+class Token extends \Zotlabs\Web\Controller {
+
+
+ function get() {
+
+
+ // 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;
+ }
+ }
+
+
+
+
+ require_once('include/oauth2.php');
+ $oauth2_server->handleTokenRequest(\OAuth2\Request::createFromGlobals())->send();
+
+ killme();
+ }
+
+} \ No newline at end of file
diff --git a/Zotlabs/Module/Wall_attach.php b/Zotlabs/Module/Wall_attach.php
index c6fe7518e..03d4cb37b 100644
--- a/Zotlabs/Module/Wall_attach.php
+++ b/Zotlabs/Module/Wall_attach.php
@@ -2,16 +2,25 @@
namespace Zotlabs\Module;
require_once('include/attach.php');
-require_once('include/channel.php');
require_once('include/photos.php');
-
class Wall_attach extends \Zotlabs\Web\Controller {
+ function init() {
+ logger('request_method: ' . $_SERVER['REQUEST_METHOD'],LOGGER_DATA,LOG_INFO);
+ logger('wall_attach: ' . print_r($_REQUEST,true),LOGGER_DEBUG,LOG_INFO);
+ logger('wall_attach files: ' . print_r($_FILES,true),LOGGER_DEBUG,LOG_INFO);
+ // for testing without actually storing anything
+ // http_status_exit(200,'OK');
+ }
+
+
function post() {
$using_api = false;
-
+
+ $result = [];
+
if($_REQUEST['api_source'] && array_key_exists('media',$_FILES)) {
$using_api = true;
}
@@ -28,7 +37,46 @@ class Wall_attach extends \Zotlabs\Web\Controller {
if(! $channel)
killme();
-
+
+ $matches = [];
+ $partial = false;
+
+ $x = preg_match('/bytes (\d*)\-(\d*)\/(\d*)/',$_SERVER['HTTP_CONTENT_RANGE'],$matches);
+ if($x) {
+ // logger('Content-Range: ' . print_r($matches,true));
+ $partial = true;
+ }
+
+ if($partial) {
+ $x = save_chunk($channel,$matches[1],$matches[2],$matches[3]);
+ if($x['partial']) {
+ header('Range: bytes=0-' . (($x['length']) ? $x['length'] - 1 : 0));
+ json_return_and_die($result);
+ }
+ else {
+ header('Range: bytes=0-' . (($x['size']) ? $x['size'] - 1 : 0));
+
+ $_FILES['userfile'] = [
+ 'name' => $x['name'],
+ 'type' => $x['type'],
+ 'tmp_name' => $x['tmp_name'],
+ 'error' => $x['error'],
+ 'size' => $x['size']
+ ];
+ }
+ }
+ else {
+ if(! array_key_exists('userfile',$_FILES)) {
+ $_FILES['userfile'] = [
+ 'name' => $_FILES['files']['name'],
+ 'type' => $_FILES['files']['type'],
+ 'tmp_name' => $_FILES['files']['tmp_name'],
+ 'error' => $_FILES['files']['error'],
+ 'size' => $_FILES['files']['size']
+ ];
+ }
+ }
+
$observer = \App::get_observer();
@@ -51,10 +99,11 @@ class Wall_attach extends \Zotlabs\Web\Controller {
if($using_api)
return $s;
-
- echo $s;
- killme();
-
+
+ $result['message'] = $s;
+ json_return_and_die($result);
+
}
+
}
diff --git a/Zotlabs/Module/Webpages.php b/Zotlabs/Module/Webpages.php
index 5e3091dfa..e449a790f 100644
--- a/Zotlabs/Module/Webpages.php
+++ b/Zotlabs/Module/Webpages.php
@@ -34,7 +34,9 @@ class Webpages extends \Zotlabs\Web\Controller {
\App::$error = 404;
return;
}
-
+
+ nav_set_selected(t('Webpages'));
+
$which = argv(1);
$_SESSION['return_url'] = \App::$query_string;
@@ -179,11 +181,8 @@ class Webpages extends \Zotlabs\Web\Controller {
// so just list titles and an edit link.
- /** @TODO - this should be replaced with pagelist_widget */
-
$sql_extra = item_permissions_sql($owner);
-
$r = q("select * from iconfig left join item on iconfig.iid = item.id
where item.uid = %d and iconfig.cat = 'system' and iconfig.k = 'WEBPAGE' and item_type = %d
$sql_extra order by item.created desc",
@@ -191,12 +190,6 @@ class Webpages extends \Zotlabs\Web\Controller {
intval(ITEM_TYPE_WEBPAGE)
);
-// $r = q("select * from item_id left join item on item_id.iid = item.id
-// where item_id.uid = %d and service = 'WEBPAGE' and item_type = %d $sql_extra order by item.created desc",
-// intval($owner),
-// intval(ITEM_TYPE_WEBPAGE)
-// );
-
if(! $r)
$x['pagetitle'] = 'home';
@@ -218,13 +211,15 @@ class Webpages extends \Zotlabs\Web\Controller {
'created' => $rr['created'],
'edited' => $rr['edited'],
'mimetype' => $rr['mimetype'],
- 'pagetitle' => $rr['v'],
+ 'pageurl' => str_replace('%2f','/',$rr['v']),
+ 'pagetitle' => urldecode($rr['v']),
'mid' => $rr['mid'],
'layout_mid' => $rr['layout_mid']
);
$pages[$rr['iid']][] = array(
'url' => $rr['iid'],
- 'pagetitle' => $rr['v'],
+ 'pageurl' => str_replace('%2f','/',$rr['v']),
+ 'pagetitle' => urldecode($rr['v']),
'title' => $rr['title'],
'created' => datetime_convert('UTC',date_default_timezone_get(),$rr['created']),
'edited' => datetime_convert('UTC',date_default_timezone_get(),$rr['edited']),
diff --git a/Zotlabs/Module/Wfinger.php b/Zotlabs/Module/Wfinger.php
index 9623a676b..07a7b7735 100644
--- a/Zotlabs/Module/Wfinger.php
+++ b/Zotlabs/Module/Wfinger.php
@@ -117,7 +117,7 @@ class Wfinger extends \Zotlabs\Web\Controller {
[
'rel' => 'http://ostatus.org/schema/1.0/subscribe',
- 'template' => z_root() . '/follow/url={uri}',
+ 'template' => z_root() . '/follow?f=&url={uri}',
],
[
diff --git a/Zotlabs/Module/Wiki.php b/Zotlabs/Module/Wiki.php
index f879e221a..4dc11c683 100644
--- a/Zotlabs/Module/Wiki.php
+++ b/Zotlabs/Module/Wiki.php
@@ -42,7 +42,7 @@ class Wiki extends \Zotlabs\Web\Controller {
if(! feature_enabled(\App::$profile_uid,'wiki')) {
notice( t('Not found') . EOL);
- return;
+ return;
}
@@ -76,6 +76,8 @@ class Wiki extends \Zotlabs\Web\Controller {
$wiki_owner = true;
+ nav_set_selected(t('Wiki'));
+
// Obtain the default permission settings of the channel
$owner_acl = array(
'allow_cid' => $owner['channel_allow_cid'],
@@ -192,6 +194,7 @@ class Wiki extends \Zotlabs\Web\Controller {
goaway(z_root() . '/' . argv(0) . '/' . argv(1) . '/' . $wikiUrlName . '/Home');
case 4:
+ default:
// GET /wiki/channel/wiki/page
// Fetch the wiki info and determine observer permissions
@@ -243,9 +246,15 @@ class Wiki extends \Zotlabs\Web\Controller {
$wikiheaderPage = urldecode($pageUrlName);
$renamePage = (($wikiheaderPage === 'Home') ? '' : t('Rename page'));
+ $p = [];
- $p = Zlib\NativeWikiPage::get_page_content(array('channel_id' => $owner['channel_id'], 'observer_hash' => $observer_hash, 'resource_id' => $resource_id, 'pageUrlName' => $pageUrlName));
- if(! $p['success']) {
+ if(! $ignore_language) {
+ $p = Zlib\NativeWikiPage::get_page_content(array('channel_id' => $owner['channel_id'], 'observer_hash' => $observer_hash, 'resource_id' => $resource_id, 'pageUrlName' => $langPageUrlName));
+ }
+ if(! ($p && $p['success'])) {
+ $p = Zlib\NativeWikiPage::get_page_content(array('channel_id' => $owner['channel_id'], 'observer_hash' => $observer_hash, 'resource_id' => $resource_id, 'pageUrlName' => $pageUrlName));
+ }
+ if(! ($p && $p['success'])) {
notice( t('Error retrieving page content') . EOL);
goaway(z_root() . '/' . argv(0) . '/' . argv(1) );
}
@@ -267,8 +276,8 @@ class Wiki extends \Zotlabs\Web\Controller {
}
$showPageControls = $wiki_editor;
break;
- default: // Strip the extraneous URL components
- goaway('/' . argv(0) . '/' . argv(1) . '/' . $wikiUrlName . '/' . $pageUrlName);
+// default: // Strip the extraneous URL components
+// goaway('/' . argv(0) . '/' . argv(1) . '/' . $wikiUrlName . '/' . $pageUrlName);
}
@@ -348,6 +357,7 @@ class Wiki extends \Zotlabs\Web\Controller {
$html = Zlib\NativeWikiPage::convert_links(zidify_links(smilies(bbcode($content))),$wikiURL);
}
else {
+
$bb = Zlib\NativeWikiPage::bbcode($content);
$x = new ZLib\MarkdownSoap($bb);
$md = $x->clean();
diff --git a/Zotlabs/Module/Xrd.php b/Zotlabs/Module/Xrd.php
index 7b36576e0..64e5042cb 100644
--- a/Zotlabs/Module/Xrd.php
+++ b/Zotlabs/Module/Xrd.php
@@ -9,6 +9,7 @@ class Xrd extends \Zotlabs\Web\Controller {
function init() {
$uri = urldecode(notags(trim($_GET['uri'])));
+ $subject = $uri;
logger('xrd: ' . $uri,LOGGER_DEBUG);
$resource = $uri;
@@ -30,13 +31,7 @@ class Xrd extends \Zotlabs\Web\Controller {
);
if(! $r)
killme();
-
- $dspr = replace_macros(get_markup_template('xrd_diaspora.tpl'),array(
- '$baseurl' => z_root(),
- '$dspr_guid' => $r[0]['channel_guid'] . str_replace('.','',\App::get_hostname()),
- '$dspr_key' => base64_encode(pemtorsa($r[0]['channel_pubkey']))
- ));
-
+
$salmon_key = salmon_key($r[0]['channel_pubkey']);
header('Access-Control-Allow-Origin: *');
@@ -49,11 +44,11 @@ class Xrd extends \Zotlabs\Web\Controller {
if($aliases[$x] === $resource)
unset($aliases[$x]);
}
-
-
+
$o = replace_macros(get_markup_template('xrd_person.tpl'), array(
'$nick' => $r[0]['channel_address'],
'$accturi' => $resource,
+ '$subject' => $subject,
'$aliases' => $aliases,
'$profile_url' => z_root() . '/channel/' . $r[0]['channel_address'],
'$hcard_url' => z_root() . '/hcard/' . $r[0]['channel_address'],
@@ -61,12 +56,8 @@ class Xrd extends \Zotlabs\Web\Controller {
'$zot_post' => z_root() . '/post/' . $r[0]['channel_address'],
'$poco_url' => z_root() . '/poco/' . $r[0]['channel_address'],
'$photo' => z_root() . '/photo/profile/l/' . $r[0]['channel_id'],
- '$dspr' => $dspr,
- // '$salmon' => z_root() . '/salmon/' . $r[0]['channel_address'],
- // '$salmen' => z_root() . '/salmon/' . $r[0]['channel_address'] . '/mention',
'$modexp' => 'data:application/magic-public-key,' . $salmon_key,
- '$subscribe' => z_root() . '/follow?url={uri}',
- '$bigkey' => salmon_key($r[0]['channel_pubkey'])
+ '$subscribe' => z_root() . '/follow?f=&url={uri}',
));
diff --git a/Zotlabs/Storage/BasicAuth.php b/Zotlabs/Storage/BasicAuth.php
index 0ff9fad13..ad2582bb2 100644
--- a/Zotlabs/Storage/BasicAuth.php
+++ b/Zotlabs/Storage/BasicAuth.php
@@ -188,13 +188,10 @@ class BasicAuth extends DAV\Auth\Backend\AbstractBasic {
protected function check_module_access($channel_id) {
if($channel_id && \App::$module === 'cdav') {
- $x = get_pconfig($channel_id,'cdav','enabled');
- if(! $x) {
- $this->module_disabled = true;
- return false;
- }
+ return true;
}
- return true;
+ $this->module_disabled = true;
+ return false;
}
/**
diff --git a/Zotlabs/Storage/Browser.php b/Zotlabs/Storage/Browser.php
index 7162161ef..3af9fcab1 100644
--- a/Zotlabs/Storage/Browser.php
+++ b/Zotlabs/Storage/Browser.php
@@ -17,6 +17,7 @@ use Sabre\DAV;
*/
class Browser extends DAV\Browser\Plugin {
+ public $build_page = false;
/**
* @see set_writeable()
* @see \\Sabre\\DAV\\Auth\\Backend\\BackendInterface
@@ -243,6 +244,8 @@ class Browser extends DAV\Browser\Plugin {
$a = false;
+ nav_set_selected(t('Files'));
+
\App::$page['content'] = $html;
load_pdl();
@@ -257,7 +260,7 @@ class Browser extends DAV\Browser\Plugin {
}
}
$this->server->httpResponse->setHeader('Content-Security-Policy', "script-src 'self' 'unsafe-inline' 'unsafe-eval'; style-src 'self' 'unsafe-inline'");
- construct_page();
+ $this->build_page = true;
}
/**
diff --git a/Zotlabs/Storage/File.php b/Zotlabs/Storage/File.php
index 1475241ab..7a102134f 100644
--- a/Zotlabs/Storage/File.php
+++ b/Zotlabs/Storage/File.php
@@ -265,7 +265,7 @@ class File extends DAV\Node implements DAV\IFile {
$f = 'store/' . $this->auth->owner_nick . '/' . (($this->os_path) ? $this->os_path . '/' : '') . $x;
else
$f = $x;
- return fopen($f, 'rb');
+ return @fopen($f, 'rb');
}
return dbunescbin($r[0]['content']);
}
diff --git a/Zotlabs/Widget/Activity.php b/Zotlabs/Widget/Activity.php
index 7264a3360..04e9fc4b1 100644
--- a/Zotlabs/Widget/Activity.php
+++ b/Zotlabs/Widget/Activity.php
@@ -50,7 +50,7 @@ class Activity {
$o .= '<h3>' . t('Activity','widget') . '</h3><ul class="nav nav-pills flex-column">';
foreach($arr as $rv) {
- $o .= '<li class="nav-item"><a class="nav-link" href="network?f=&xchan=' . urlencode($rv['author_xchan']) . '" ><span class="badge badge-default float-right">' . ((intval($rv['total'])) ? intval($rv['total']) : '') . '</span><img src="' . $rv['author']['xchan_photo_s'] . '" class="menu-img-1" /> ' . $rv['author']['xchan_name'] . '</a></li>';
+ $o .= '<li class="nav-item"><a class="nav-link" href="network?f=&xchan=' . urlencode($rv['author_xchan']) . '" ><span class="badge badge-secondary float-right">' . ((intval($rv['total'])) ? intval($rv['total']) : '') . '</span><img src="' . $rv['author']['xchan_photo_s'] . '" class="menu-img-1" /> ' . $rv['author']['xchan_name'] . '</a></li>';
}
$o .= '</ul></div>';
}
diff --git a/Zotlabs/Widget/Cdav.php b/Zotlabs/Widget/Cdav.php
new file mode 100644
index 000000000..60a860f93
--- /dev/null
+++ b/Zotlabs/Widget/Cdav.php
@@ -0,0 +1,176 @@
+<?php
+
+namespace Zotlabs\Widget;
+
+
+
+class Cdav {
+
+ function widget() {
+ if(!local_channel())
+ return;
+
+ $channel = \App::get_channel();
+ $principalUri = 'principals/' . $channel['channel_address'];
+
+ if(!cdav_principal($principalUri))
+ return;
+
+ $pdo = \DBA::$dba->db;
+
+ require_once 'vendor/autoload.php';
+
+ $o = '';
+
+ if(argc() == 2 && argv(1) === 'calendar') {
+
+ $caldavBackend = new \Sabre\CalDAV\Backend\PDO($pdo);
+
+ $sabrecals = $caldavBackend->getCalendarsForUser($principalUri);
+
+ //TODO: we should probably also check for permission to send stream here
+ $local_channels = q("SELECT * FROM channel LEFT JOIN abook ON abook_xchan = channel_hash WHERE channel_system = 0 AND channel_removed = 0 AND channel_hash != '%s' AND abook_channel = %d",
+ dbesc($channel['channel_hash']),
+ intval($channel['channel_id'])
+ );
+
+ $sharee_options .= '<option value="">' . t('Select Channel') . '</option>' . "\r\n";
+ foreach($local_channels as $local_channel) {
+ $sharee_options .= '<option value="' . $local_channel['channel_hash'] . '">' . $local_channel['channel_name'] . '</option>' . "\r\n";
+ }
+
+ $access_options = '<option value="3">' . t('Read-write') . '</option>' . "\r\n";
+ $access_options .= '<option value="2">' . t('Read-only') . '</option>' . "\r\n";
+
+ //list calendars
+ foreach($sabrecals as $sabrecal) {
+ if($sabrecal['share-access'] == 1)
+ $access = '';
+ if($sabrecal['share-access'] == 2)
+ $access = 'read';
+ if($sabrecal['share-access'] == 3)
+ $access = 'read-write';
+
+ $invites = $caldavBackend->getInvites($sabrecal['id']);
+
+ $json_source = '/cdav/calendar/json/' . $sabrecal['id'][0] . '/' . $sabrecal['id'][1];
+
+ $switch = get_pconfig(local_channel(), 'cdav_calendar', $sabrecal['id'][0]);
+
+ $color = (($sabrecal['{http://apple.com/ns/ical/}calendar-color']) ? $sabrecal['{http://apple.com/ns/ical/}calendar-color'] : '#3a87ad');
+
+ $editable = (($sabrecal['share-access'] == 2) ? 'false' : 'true'); // false/true must be string since we're passing it to javascript
+
+ $sharees = [];
+ $share_displayname = [];
+ foreach($invites as $invite) {
+ if(strpos($invite->href, 'mailto:') !== false) {
+ $sharee = channelx_by_hash(substr($invite->href, 7));
+ $sharees[] = [
+ 'name' => $sharee['channel_name'],
+ 'access' => (($invite->access == 3) ? ' (RW)' : ' (R)'),
+ 'hash' => $sharee['channel_hash']
+ ];
+ }
+ }
+
+ if(!$access) {
+ $my_calendars[] = [
+ 'ownernick' => $channel['channel_address'],
+ 'uri' => $sabrecal['uri'],
+ 'displayname' => $sabrecal['{DAV:}displayname'],
+ 'calendarid' => $sabrecal['id'][0],
+ 'instanceid' => $sabrecal['id'][1],
+ 'json_source' => $json_source,
+ 'color' => $color,
+ 'editable' => $editable,
+ 'switch' => $switch,
+ 'sharees' => $sharees
+ ];
+ }
+ else {
+ $shared_calendars[] = [
+ 'ownernick' => $channel['channel_address'],
+ 'uri' => $sabrecal['uri'],
+ 'displayname' => $sabrecal['{DAV:}displayname'],
+ 'calendarid' => $sabrecal['id'][0],
+ 'instanceid' => $sabrecal['id'][1],
+ 'json_source' => $json_source,
+ 'color' => $color,
+ 'editable' => $editable,
+ 'switch' => $switch,
+ 'sharer' => $sabrecal['{urn:ietf:params:xml:ns:caldav}calendar-description'],
+ 'access' => $access
+ ];
+ }
+
+ if(!$access || $access === 'read-write') {
+ $writable_calendars[] = [
+ 'displayname' => ((!$access) ? $sabrecal['{DAV:}displayname'] : $share_displayname[0]),
+ 'id' => $sabrecal['id']
+ ];
+ }
+ }
+
+ $o .= replace_macros(get_markup_template('cdav_widget_calendar.tpl'), [
+ '$my_calendars_label' => t('My Calendars'),
+ '$my_calendars' => $my_calendars,
+ '$shared_calendars_label' => t('Shared Calendars'),
+ '$shared_calendars' => $shared_calendars,
+ '$sharee_options' => $sharee_options,
+ '$access_options' => $access_options,
+ '$share_label' => t('Share this calendar'),
+ '$share' => t('Share'),
+ '$edit_label' => t('Calendar name and color'),
+ '$edit' => t('Edit'),
+ '$create_label' => t('Create new calendar'),
+ '$create' => t('Create'),
+ '$create_placeholder' => t('Calendar Name'),
+ '$tools_label' => t('Calendar Tools'),
+ '$import_label' => t('Import calendar'),
+ '$import_placeholder' => t('Select a calendar to import to'),
+ '$upload' => t('Upload'),
+ '$writable_calendars' => $writable_calendars
+ ]);
+
+ return $o;
+
+ }
+
+ if(argc() >= 2 && argv(1) === 'addressbook') {
+
+ $carddavBackend = new \Sabre\CardDAV\Backend\PDO($pdo);
+
+ $sabreabooks = $carddavBackend->getAddressBooksForUser($principalUri);
+
+ //list addressbooks
+ foreach($sabreabooks as $sabreabook) {
+ $addressbooks[] = [
+ 'ownernick' => $channel['channel_address'],
+ 'uri' => $sabreabook['uri'],
+ 'displayname' => $sabreabook['{DAV:}displayname'],
+ 'id' => $sabreabook['id']
+
+ ];
+ }
+
+ $o .= replace_macros(get_markup_template('cdav_widget_addressbook.tpl'), [
+ '$addressbooks_label' => t('Addressbooks'),
+ '$addressbooks' => $addressbooks,
+ '$edit_label' => t('Addressbook name'),
+ '$edit' => t('Edit'),
+ '$create_label' => t('Create new addressbook'),
+ '$create_placeholder' => t('Addressbook Name'),
+ '$create' => t('Create'),
+ '$tools_label' => t('Addressbook Tools'),
+ '$import_label' => t('Import addressbook'),
+ '$import_placeholder' => t('Select an addressbook to import to'),
+ '$upload' => t('Upload')
+ ]);
+
+ return $o;
+
+ }
+
+ }
+} \ No newline at end of file
diff --git a/Zotlabs/Widget/Conversations.php b/Zotlabs/Widget/Conversations.php
index 27e517c02..56510750f 100644
--- a/Zotlabs/Widget/Conversations.php
+++ b/Zotlabs/Widget/Conversations.php
@@ -12,10 +12,6 @@ class Conversations {
if(argc() > 1) {
switch(argv(1)) {
- case 'combined':
- $mailbox = 'combined';
- $header = t('Conversations');
- break;
case 'inbox':
$mailbox = 'inbox';
$header = t('Received Messages');
@@ -44,6 +40,8 @@ class Conversations {
foreach($r as $rr) {
+ $selected = ((argc() == 3) ? intval(argv(2)) == intval($rr['id']) : $r[0]['id'] == $rr['id']);
+
$messages[] = array(
'mailbox' => $mailbox,
'id' => $rr['id'],
@@ -58,7 +56,7 @@ class Conversations {
'body' => $rr['body'],
'date' => datetime_convert('UTC',date_default_timezone_get(),$rr['created'], 'c'),
'seen' => $rr['seen'],
- 'selected' => ((argv(2)) ? (argv(2) == $rr['id']) : ($r[0]['id'] == $rr['id']))
+ 'selected' => ((argv(1) != 'new') ? $selected : '')
);
}
@@ -71,4 +69,6 @@ class Conversations {
}
return $o;
}
+
}
+
diff --git a/Zotlabs/Widget/Forums.php b/Zotlabs/Widget/Forums.php
index 67e498b24..002c0ee21 100644
--- a/Zotlabs/Widget/Forums.php
+++ b/Zotlabs/Widget/Forums.php
@@ -87,7 +87,7 @@ class Forums {
foreach($r1 as $rr) {
if($unseen && (! intval($rr['unseen'])))
continue;
- $o .= '<li class="nav-item"><a class="nav-link" href="network?f=&pf=1&cid=' . $rr['abook_id'] . '" ><span class="badge badge-default float-right">' . ((intval($rr['unseen'])) ? intval($rr['unseen']) : '') . '</span><img class ="menu-img-1" src="' . $rr['xchan_photo_s'] . '" /> ' . $rr['xchan_name'] . '</a></li>';
+ $o .= '<li class="nav-item"><a class="nav-link" href="network?f=&pf=1&cid=' . $rr['abook_id'] . '" ><span class="badge badge-secondary float-right">' . ((intval($rr['unseen'])) ? intval($rr['unseen']) : '') . '</span><img class ="menu-img-1" src="' . $rr['xchan_photo_s'] . '" /> ' . $rr['xchan_name'] . '</a></li>';
}
$o .= '</ul></div>';
}
diff --git a/Zotlabs/Widget/Portfolio.php b/Zotlabs/Widget/Portfolio.php
new file mode 100644
index 000000000..216ca952c
--- /dev/null
+++ b/Zotlabs/Widget/Portfolio.php
@@ -0,0 +1,108 @@
+<?php
+
+namespace Zotlabs\Widget;
+
+require_once('include/attach.php');
+
+class Portfolio {
+
+ function widget($args) {
+
+
+ $owner_uid = \App::$profile_uid;
+ $sql_extra = permissions_sql($owner_uid);
+
+
+ if(! perm_is_allowed($owner_uid,get_observer_hash(),'view_storage'))
+ return '';
+
+ if($args['album'])
+ $album = $args['album'];
+ if($args['title'])
+ $title = $args['title'];
+
+ /**
+ * This may return incorrect permissions if you have multiple directories of the same name.
+ * It is a limitation of the photo table using a name for a photo album instead of a folder hash
+ */
+
+ if($album) {
+ $x = q("select hash from attach where filename = '%s' and uid = %d limit 1",
+ dbesc($album),
+ intval($owner_uid)
+ );
+ if($x) {
+ $y = attach_can_view_folder($owner_uid,get_observer_hash(),$x[0]['hash']);
+ if(! $y)
+ return '';
+ }
+ }
+
+ $order = 'DESC';
+
+ $r = q("SELECT p.resource_id, p.id, p.filename, p.mimetype, p.imgscale, p.description, p.created FROM photo p INNER JOIN
+ (SELECT resource_id, max(imgscale) imgscale FROM photo WHERE uid = %d AND album = '%s' AND imgscale <= 4 AND photo_usage IN ( %d, %d ) $sql_extra GROUP BY resource_id) ph
+ ON (p.resource_id = ph.resource_id AND p.imgscale = ph.imgscale)
+ ORDER BY created $order ",
+ intval($owner_uid),
+ dbesc($album),
+ intval(PHOTO_NORMAL),
+ intval(PHOTO_PROFILE)
+ );
+
+ //edit album name
+ $album_edit = null;
+
+ $photos = array();
+ if($r) {
+ $twist = 'rotright';
+ foreach($r as $rr) {
+
+ if($twist == 'rotright')
+ $twist = 'rotleft';
+ else
+ $twist = 'rotright';
+
+ $ext = $phototypes[$rr['mimetype']];
+
+ $imgalt_e = $rr['filename'];
+ $desc_e = $rr['description'];
+
+ $imagelink = (z_root() . '/photos/' . \App::$profile['channel_address'] . '/image/' . $rr['resource_id']);
+
+
+ $photos[] = array(
+ 'id' => $rr['id'],
+ 'twist' => ' ' . $twist . rand(2,4),
+ 'link' => $imagelink,
+ 'title' => t('View Photo'),
+ 'src' => z_root() . '/photo/' . $rr['resource_id'] . '-' . $rr['imgscale'] . '.' .$ext,
+ 'fullsrc' => z_root() . '/photo/' . $rr['resource_id'] . '-' . '1' . '.' .$ext,
+ 'resource_id' => $rr['resource_id'],
+ 'alt' => $imgalt_e,
+ 'desc'=> $desc_e,
+ 'ext' => $ext,
+ 'hash'=> $rr['resource_id'],
+ 'unknown' => t('Unknown')
+ );
+ }
+ }
+
+
+ $tpl = get_markup_template('photo_album_portfolio.tpl');
+ $o .= replace_macros($tpl, array(
+ '$photos' => $photos,
+ '$album' => (($title) ? $title : $album),
+ '$album_id' => rand(),
+ '$album_edit' => array(t('Edit Album'), $album_edit),
+ '$can_post' => false,
+ '$upload' => array(t('Upload'), z_root() . '/photos/' . \App::$profile['channel_address'] . '/upload/' . bin2hex($album)),
+ '$order' => false,
+ '$upload_form' => $upload_form,
+ '$usage' => $usage_message
+ ));
+
+ return $o;
+ }
+}
+
diff --git a/Zotlabs/Widget/Settings_menu.php b/Zotlabs/Widget/Settings_menu.php
index 753390c23..c15ad0980 100644
--- a/Zotlabs/Widget/Settings_menu.php
+++ b/Zotlabs/Widget/Settings_menu.php
@@ -79,11 +79,13 @@ class Settings_menu {
'selected' => ''
);
- $tabs[] = array(
- 'label' => t('Connected apps'),
- 'url' => z_root() . '/settings/oauth',
- 'selected' => ((argv(1) === 'oauth') ? 'active' : ''),
- );
+ if(get_account_techlevel() > 0) {
+ $tabs[] = array(
+ 'label' => t('Connected apps'),
+ 'url' => z_root() . '/settings/oauth',
+ 'selected' => ((argv(1) === 'oauth') ? 'active' : ''),
+ );
+ }
if(get_account_techlevel() > 2) {
$tabs[] = array(
diff --git a/Zotlabs/Widget/Tasklist.php b/Zotlabs/Widget/Tasklist.php
index 6f7a8aaed..3961eecce 100644
--- a/Zotlabs/Widget/Tasklist.php
+++ b/Zotlabs/Widget/Tasklist.php
@@ -8,8 +8,8 @@ class Tasklist {
function widget($arr) {
- if (! local_channel())
- return;
+ if (! local_channel())
+ return;
$o .= '<script>var tasksShowAll = 0; $(document).ready(function() { tasksFetch(); $("#tasklist-new-form").submit(function(event) { event.preventDefault(); $.post( "tasks/new", $("#tasklist-new-form").serialize(), function(data) { tasksFetch(); $("#tasklist-new-summary").val(""); } ); return false; } )});</script>';
$o .= '<script>function taskComplete(id) { $.post("tasks/complete/"+id, function(data) { tasksFetch();}); }
diff --git a/Zotlabs/Widget/Wiki_pages.php b/Zotlabs/Widget/Wiki_pages.php
index 53966b06f..a07c348ff 100644
--- a/Zotlabs/Widget/Wiki_pages.php
+++ b/Zotlabs/Widget/Wiki_pages.php
@@ -11,14 +11,8 @@ class Wiki_pages {
return;
if(! $arr['resource_id']) {
-
- $c = \App::get_channel();
-
- if(! $c)
- $c = channelx_by_nick(argv(1));
-
+ $c = channelx_by_nick(argv(1));
$w = \Zotlabs\Lib\NativeWiki::exists_by_name($c['channel_id'],argv(2));
-
$arr = array(
'resource_id' => $w['resource_id'],
'channel_id' => $c['channel_id'],
@@ -29,6 +23,8 @@ class Wiki_pages {
$wikiname = '';
+ $wikiname = '';
+
$pages = array();
$p = \Zotlabs\Lib\NativeWikiPage::page_list($arr['channel_id'],get_observer_hash(),$arr['resource_id']);
diff --git a/Zotlabs/Zot/Auth.php b/Zotlabs/Zot/Auth.php
index d4d3bee1d..92b0fff78 100644
--- a/Zotlabs/Zot/Auth.php
+++ b/Zotlabs/Zot/Auth.php
@@ -176,7 +176,7 @@ class Auth {
return false;
}
- $this->Debug('auth check request returned .' . print_r($j, true));
+ $this->Debug('auth check request returned ' . print_r($j, true));
if(! $j['success'])
return false;
diff --git a/app/caldav.apd b/app/caldav.apd
new file mode 100644
index 000000000..a5839fd6e
--- /dev/null
+++ b/app/caldav.apd
@@ -0,0 +1,6 @@
+version: 1
+url: $baseurl/cdav/calendar
+requires: local_channel
+name: CalDAV
+photo: icon:calendar
+categories: Productivity, Personal
diff --git a/app/carddav.apd b/app/carddav.apd
new file mode 100644
index 000000000..3b60ebcfe
--- /dev/null
+++ b/app/carddav.apd
@@ -0,0 +1,6 @@
+version: 1
+url: $baseurl/cdav/addressbook
+requires: local_channel
+name: CardDAV
+photo: icon:vcard-o
+categories: Productivity, Personal
diff --git a/app/photos.apd b/app/photos.apd
index 7a7a4b7b6..048e623bb 100644
--- a/app/photos.apd
+++ b/app/photos.apd
@@ -3,4 +3,4 @@ url: $baseurl/photos/$nick
requires: local_channel
name: Photos
photo: icon:photo
-categories: Multimedia
+categories: nav_featured_app, Multimedia
diff --git a/app/storage.apd b/app/storage.apd
index 7dcbcc089..cafcf81e8 100644
--- a/app/storage.apd
+++ b/app/storage.apd
@@ -3,4 +3,4 @@ url: $baseurl/cloud/$nick
requires: local_channel
name: Files
photo: icon:folder-open
-categories: Productivity
+categories: nav_featured_app, Productivity
diff --git a/boot.php b/boot.php
index 4d4c02268..cd0768439 100755
--- a/boot.php
+++ b/boot.php
@@ -48,12 +48,11 @@ require_once('include/xchan.php');
require_once('include/hubloc.php');
require_once('include/attach.php');
-
define ( 'PLATFORM_NAME', 'hubzilla' );
-define ( 'STD_VERSION', '2.4.2' );
+define ( 'STD_VERSION', '2.6' );
define ( 'ZOT_REVISION', '1.2' );
-define ( 'DB_UPDATE_VERSION', 1191 );
+define ( 'DB_UPDATE_VERSION', 1193 );
define ( 'PROJECT_BASE', __DIR__ );
@@ -82,7 +81,6 @@ define ( 'DIRECTORY_REALM', 'RED_GLOBAL');
define ( 'DIRECTORY_FALLBACK_MASTER', 'https://gravizot.de');
$DIRECTORY_FALLBACK_SERVERS = array(
- //'https://hubzilla.site',
'https://hubzilla.zottel.net',
'https://my.federated.social',
'https://hubzilla.nl',
@@ -162,14 +160,6 @@ define ( 'LOGGER_ALL', 4 );
/**
- * Server roles
- */
-
-define ( 'SERVER_ROLE_BASIC', 0x0001 );
-define ( 'SERVER_ROLE_STANDARD', 0x0002 );
-define ( 'SERVER_ROLE_PRO', 0x0004 );
-
-/**
* registration policies
*/
@@ -465,6 +455,8 @@ define ( 'NAMESPACE_YMEDIA', 'http://search.yahoo.com/mrss/' );
* activity stream defines
*/
+define ( 'ACTIVITY_PUBLIC_INBOX', 'https://www.w3.org/ns/activitystreams#Public' );
+
define ( 'ACTIVITY_REACT', NAMESPACE_ZOT . '/activity/react' );
define ( 'ACTIVITY_LIKE', NAMESPACE_ACTIVITY_SCHEMA . 'like' );
define ( 'ACTIVITY_DISLIKE', NAMESPACE_ZOT . '/activity/dislike' );
@@ -499,6 +491,7 @@ define ( 'ACTIVITY_POKE', NAMESPACE_ZOT . '/activity/poke' );
define ( 'ACTIVITY_MOOD', NAMESPACE_ZOT . '/activity/mood' );
define ( 'ACTIVITY_OBJ_COMMENT', NAMESPACE_ACTIVITY_SCHEMA . 'comment' );
+define ( 'ACTIVITY_OBJ_ACTIVITY',NAMESPACE_ACTIVITY_SCHEMA . 'activity' );
define ( 'ACTIVITY_OBJ_NOTE', NAMESPACE_ACTIVITY_SCHEMA . 'note' );
define ( 'ACTIVITY_OBJ_PERSON', NAMESPACE_ACTIVITY_SCHEMA . 'person' );
define ( 'ACTIVITY_OBJ_PHOTO', NAMESPACE_ACTIVITY_SCHEMA . 'photo' );
@@ -599,29 +592,20 @@ function sys_boot() {
$a->convert();
- if(defined('UNO')) {
- if(UNO)
- App::$config['system']['server_role'] = 'basic';
- else
- App::$config['system']['server_role'] = 'standard';
- }
-
- if(! (array_key_exists('server_role',App::$config['system']) && App::$config['system']['server_role']))
- App::$config['system']['server_role'] = 'standard';
+ App::$config['system']['server_role'] = 'pro';
App::$timezone = ((App::$config['system']['timezone']) ? App::$config['system']['timezone'] : 'UTC');
date_default_timezone_set(App::$timezone);
if(! defined('DEFAULT_PLATFORM_ICON')) {
- define( 'DEFAULT_PLATFORM_ICON', '/images/hz-32.png' );
+ define( 'DEFAULT_PLATFORM_ICON', '/images/rm-32.png' );
}
if(! defined('DEFAULT_NOTIFY_ICON')) {
- define( 'DEFAULT_NOTIFY_ICON', '/images/hz-white-32.png' );
+ define( 'DEFAULT_NOTIFY_ICON', '/images/rm-32.png' );
}
-
/*
* Try to open the database;
*/
@@ -732,7 +716,6 @@ class miniApp {
class App {
public static $install = false; // true if we are installing the software
- public static $role = 0; // server role (constant, not the string)
public static $account = null; // account record of the logged-in account
public static $channel = null; // channel record of the current channel of the logged-in account
public static $observer = null; // xchan record of the page observer
@@ -918,6 +901,11 @@ class App {
self::$argv = explode('/', self::$cmd);
self::$argc = count(self::$argv);
if ((array_key_exists('0', self::$argv)) && strlen(self::$argv[0])) {
+ if(strpos(self::$argv[0],'.')) {
+ $_REQUEST['module_format'] = substr(self::$argv[0],strpos(self::$argv[0],'.')+1);
+ self::$argv[0] = substr(self::$argv[0],0,strpos(self::$argv[0],'.'));
+ }
+
self::$module = str_replace(".", "_", self::$argv[0]);
self::$module = str_replace("-", "_", self::$module);
if(strpos(self::$module,'_') === 0)
@@ -1007,36 +995,10 @@ class App {
}
}
- public static function get_role() {
- if(! self::$role)
- return self::set_role();
- return self::$role;
- }
-
- public static function set_role() {
- $role_str = \Zotlabs\Lib\System::get_server_role();
- switch($role_str) {
- case 'basic':
- $role = SERVER_ROLE_BASIC;
- break;
- case 'pro':
- $role = SERVER_ROLE_PRO;
- break;
- case 'standard':
- default:
- $role = SERVER_ROLE_STANDARD;
- break;
- }
- self::$role = $role;
- return $role;
- }
-
-
public static function get_scheme() {
return self::$scheme;
}
-
public static function get_hostname() {
return self::$hostname;
}
@@ -1150,24 +1112,25 @@ class App {
* since the code added by the modules frequently depends on it
* being first
*/
- $tpl = get_markup_template('head.tpl');
- self::$page['htmlhead'] = replace_macros($tpl, array(
- '$preload_images' => $preload_images,
- '$user_scalable' => $user_scalable,
- '$query' => urlencode(self::$query_string),
- '$baseurl' => self::get_baseurl(),
- '$local_channel' => local_channel(),
- '$metas' => self::$meta->get(),
- '$plugins' => $x['header'],
- '$update_interval' => $interval,
- 'osearch' => sprintf( t('Search %1$s (%2$s)','opensearch'), Zotlabs\Lib\System::get_site_name(), t('$Projectname','opensearch')),
- '$head_css' => head_get_css(),
- '$head_js' => head_get_js(),
- '$linkrel' => head_get_links(),
- '$js_strings' => js_strings(),
- '$zid' => get_my_address(),
- '$channel_id' => self::$profile['uid'],
- )) . self::$page['htmlhead'];
+
+ self::$page['htmlhead'] = replace_macros(get_markup_template('head.tpl'),
+ [
+ '$preload_images' => $preload_images,
+ '$user_scalable' => $user_scalable,
+ '$query' => urlencode(self::$query_string),
+ '$baseurl' => self::get_baseurl(),
+ '$local_channel' => local_channel(),
+ '$metas' => self::$meta->get(),
+ '$plugins' => $x['header'],
+ '$update_interval' => $interval,
+ '$head_css' => head_get_css(),
+ '$head_js' => head_get_js(),
+ '$linkrel' => head_get_links(),
+ '$js_strings' => js_strings(),
+ '$zid' => get_my_address(),
+ '$channel_id' => self::$profile['uid']
+ ]
+ ) . self::$page['htmlhead'];
// always put main.js at the end
self::$page['htmlhead'] .= head_get_main_js();
@@ -1180,11 +1143,13 @@ class App {
* @param string $name
*/
public static function register_template_engine($class, $name = '') {
- if ($name === ""){
- $v = get_class_vars( $class );
- if(x($v, "name")) $name = $v['name'];
+ if(! $name) {
+ $v = get_class_vars($class);
+ if(x($v, "name")) {
+ $name = $v['name'];
+ }
}
- if ($name === ""){
+ if (! $name) {
echo "template engine <tt>$class</tt> cannot be registered without a name.\n";
killme();
}
@@ -1200,19 +1165,21 @@ class App {
* @return object Template Engine instance
*/
public static function template_engine($name = ''){
- if ($name !== "") {
+ if($name !== '') {
$template_engine = $name;
- } else {
+ }
+ else {
$template_engine = 'smarty3';
- if (x(self::$theme, 'template_engine')) {
+ if(x(self::$theme, 'template_engine')) {
$template_engine = self::$theme['template_engine'];
}
}
- if (isset(self::$template_engines[$template_engine])){
+ if(isset(self::$template_engines[$template_engine])){
if(isset(self::$template_engine_instance[$template_engine])){
return self::$template_engine_instance[$template_engine];
- } else {
+ }
+ else {
$class = self::$template_engines[$template_engine];
$obj = new $class;
self::$template_engine_instance[$template_engine] = $obj;
@@ -1220,7 +1187,8 @@ class App {
}
}
- echo "template engine <tt>$template_engine</tt> is not registered!\n"; killme();
+ echo "template engine <tt>$template_engine</tt> is not registered!\n";
+ killme();
}
/**
@@ -2335,6 +2303,7 @@ function cert_bad_email() {
)
]
);
+
}
diff --git a/composer.json b/composer.json
index 44606ff2b..e6bdba61c 100644
--- a/composer.json
+++ b/composer.json
@@ -30,14 +30,14 @@
"ext-openssl" : "*",
"sabre/dav" : "~3.2",
"michelf/php-markdown" : "^1.7",
- "pixel418/markdownify": "^2.2",
"bshaffer/oauth2-server-php": "^1.9",
"ezyang/htmlpurifier": "^4.9",
- "simplepie/simplepie": "~1.5"
+ "simplepie/simplepie": "~1.5",
+ "league/html-to-markdown": "^4.4"
},
"require-dev" : {
"php" : ">=7.0",
- "phpunit/phpunit" : "^6.0",
+ "phpunit/phpunit" : "^6.1",
"behat/behat" : "@stable",
"behat/mink-extension": "@stable",
"behat/mink-goutte-driver": "@stable",
@@ -56,7 +56,8 @@
},
"minimum-stability" : "stable",
"config" : {
- "notify-on-install" : false
+ "notify-on-install" : false,
+ "optimize-autoloader" : true
},
"repositories": [{
"type": "vcs",
diff --git a/composer.lock b/composer.lock
index bd902f197..f31a719c3 100644
--- a/composer.lock
+++ b/composer.lock
@@ -4,7 +4,7 @@
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file",
"This file is @generated automatically"
],
- "content-hash": "21511c39f481ecdc20210f885d840787",
+ "content-hash": "4a78983d966b7641fd532909d625c21a",
"packages": [
{
"name": "bshaffer/oauth2-server-php",
@@ -64,16 +64,16 @@
},
{
"name": "ezyang/htmlpurifier",
- "version": "v4.9.2",
+ "version": "v4.9.3",
"source": {
"type": "git",
"url": "https://github.com/ezyang/htmlpurifier.git",
- "reference": "6d50e5282afdfdfc3e0ff6d192aff56c5629b3d4"
+ "reference": "95e1bae3182efc0f3422896a3236e991049dac69"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/ezyang/htmlpurifier/zipball/6d50e5282afdfdfc3e0ff6d192aff56c5629b3d4",
- "reference": "6d50e5282afdfdfc3e0ff6d192aff56c5629b3d4",
+ "url": "https://api.github.com/repos/ezyang/htmlpurifier/zipball/95e1bae3182efc0f3422896a3236e991049dac69",
+ "reference": "95e1bae3182efc0f3422896a3236e991049dac69",
"shasum": ""
},
"require": {
@@ -107,114 +107,122 @@
"keywords": [
"html"
],
- "time": "2017-03-13T06:30:53+00:00"
+ "time": "2017-06-03T02:28:16+00:00"
},
{
- "name": "michelf/php-markdown",
- "version": "1.7.0",
+ "name": "league/html-to-markdown",
+ "version": "4.4.1",
"source": {
"type": "git",
- "url": "https://github.com/michelf/php-markdown.git",
- "reference": "1f51cc520948f66cd2af8cbc45a5ee175e774220"
+ "url": "https://github.com/thephpleague/html-to-markdown.git",
+ "reference": "82ea375b5b2b1da1da222644c0565c695bf88186"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/michelf/php-markdown/zipball/1f51cc520948f66cd2af8cbc45a5ee175e774220",
- "reference": "1f51cc520948f66cd2af8cbc45a5ee175e774220",
+ "url": "https://api.github.com/repos/thephpleague/html-to-markdown/zipball/82ea375b5b2b1da1da222644c0565c695bf88186",
+ "reference": "82ea375b5b2b1da1da222644c0565c695bf88186",
"shasum": ""
},
"require": {
- "php": ">=5.3.0"
+ "ext-dom": "*",
+ "ext-xml": "*",
+ "php": ">=5.3.3"
+ },
+ "require-dev": {
+ "mikehaertl/php-shellcommand": "~1.1.0",
+ "phpunit/phpunit": "4.*",
+ "scrutinizer/ocular": "~1.1"
},
+ "bin": [
+ "bin/html-to-markdown"
+ ],
"type": "library",
"extra": {
"branch-alias": {
- "dev-lib": "1.4.x-dev"
+ "dev-master": "4.5-dev"
}
},
"autoload": {
- "psr-0": {
- "Michelf": ""
+ "psr-4": {
+ "League\\HTMLToMarkdown\\": "src/"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
- "BSD-3-Clause"
+ "MIT"
],
"authors": [
{
- "name": "Michel Fortin",
- "email": "michel.fortin@michelf.ca",
- "homepage": "https://michelf.ca/",
- "role": "Developer"
+ "name": "Colin O'Dell",
+ "email": "colinodell@gmail.com",
+ "homepage": "http://www.colinodell.com",
+ "role": "Lead Developer"
},
{
- "name": "John Gruber",
- "homepage": "https://daringfireball.net/"
+ "name": "Nick Cernis",
+ "email": "nick@cern.is",
+ "homepage": "http://modernnerd.net",
+ "role": "Original Author"
}
],
- "description": "PHP Markdown",
- "homepage": "https://michelf.ca/projects/php-markdown/",
+ "description": "An HTML-to-markdown conversion helper for PHP",
+ "homepage": "https://github.com/thephpleague/html-to-markdown",
"keywords": [
+ "html",
"markdown"
],
- "time": "2016-10-29T18:58:20+00:00"
+ "time": "2017-03-16T00:45:59+00:00"
},
{
- "name": "pixel418/markdownify",
- "version": "v2.2.1",
+ "name": "michelf/php-markdown",
+ "version": "1.7.0",
"source": {
"type": "git",
- "url": "https://github.com/Elephant418/Markdownify.git",
- "reference": "0160677f04c784550dd10fd72fdf3994967db848"
+ "url": "https://github.com/michelf/php-markdown.git",
+ "reference": "1f51cc520948f66cd2af8cbc45a5ee175e774220"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/Elephant418/Markdownify/zipball/0160677f04c784550dd10fd72fdf3994967db848",
- "reference": "0160677f04c784550dd10fd72fdf3994967db848",
+ "url": "https://api.github.com/repos/michelf/php-markdown/zipball/1f51cc520948f66cd2af8cbc45a5ee175e774220",
+ "reference": "1f51cc520948f66cd2af8cbc45a5ee175e774220",
"shasum": ""
},
"require": {
"php": ">=5.3.0"
},
- "require-dev": {
- "phpunit/phpunit": "^4.8"
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-lib": "1.4.x-dev"
+ }
},
- "type": "lib",
"autoload": {
- "psr-4": {
- "Markdownify\\": "src",
- "Test\\Markdownify\\": "test"
+ "psr-0": {
+ "Michelf": ""
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
- "LGPL"
+ "BSD-3-Clause"
],
"authors": [
{
- "name": "Peter Kruithof",
- "email": "pkruithof@gmail.com",
- "homepage": "http://pkruithof.tumblr.com/"
- },
- {
- "name": "Milian Wolff",
- "email": "mail@milianw.de",
- "homepage": "http://milianw.de"
+ "name": "Michel Fortin",
+ "email": "michel.fortin@michelf.ca",
+ "homepage": "https://michelf.ca/",
+ "role": "Developer"
},
{
- "name": "Thomas Zilliox",
- "email": "hello@tzi.fr",
- "homepage": "http://tzi.fr"
+ "name": "John Gruber",
+ "homepage": "https://daringfireball.net/"
}
],
- "description": "The HTML to Markdown converter for PHP ",
- "homepage": "https://github.com/elephant418/Markdownify",
+ "description": "PHP Markdown",
+ "homepage": "https://michelf.ca/projects/php-markdown/",
"keywords": [
- "markdown",
- "markdownify"
+ "markdown"
],
- "time": "2016-09-21T13:01:43+00:00"
+ "time": "2016-10-29T18:58:20+00:00"
},
{
"name": "psr/log",
@@ -265,16 +273,16 @@
},
{
"name": "sabre/dav",
- "version": "3.2.0",
+ "version": "3.2.2",
"source": {
"type": "git",
"url": "https://github.com/fruux/sabre-dav.git",
- "reference": "5b9737cc2f0182e368d14c80df7f6b2d77dc1457"
+ "reference": "e987775e619728f12205606c9cc3ee565ffb1516"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/fruux/sabre-dav/zipball/5b9737cc2f0182e368d14c80df7f6b2d77dc1457",
- "reference": "5b9737cc2f0182e368d14c80df7f6b2d77dc1457",
+ "url": "https://api.github.com/repos/fruux/sabre-dav/zipball/e987775e619728f12205606c9cc3ee565ffb1516",
+ "reference": "e987775e619728f12205606c9cc3ee565ffb1516",
"shasum": ""
},
"require": {
@@ -298,8 +306,8 @@
"require-dev": {
"evert/phpdoc-md": "~0.1.0",
"monolog/monolog": "^1.18",
- "phpunit/phpunit": "> 4.8, <=6.0.0",
- "sabre/cs": "~0.0.5"
+ "phpunit/phpunit": "> 4.8, <6.0.0",
+ "sabre/cs": "^1.0.0"
},
"suggest": {
"ext-curl": "*",
@@ -344,7 +352,7 @@
"framework",
"iCalendar"
],
- "time": "2016-06-28T02:44:05+00:00"
+ "time": "2017-02-15T03:06:08+00:00"
},
{
"name": "sabre/event",
@@ -405,19 +413,20 @@
},
{
"name": "sabre/http",
- "version": "4.2.1",
+ "version": "4.2.3",
"source": {
"type": "git",
"url": "https://github.com/fruux/sabre-http.git",
- "reference": "2e93bc8321524c67be4ca5b8415daebd4c8bf85e"
+ "reference": "0295f9a3ee39be97e0898592fc19e42421e0cd93"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/fruux/sabre-http/zipball/2e93bc8321524c67be4ca5b8415daebd4c8bf85e",
- "reference": "2e93bc8321524c67be4ca5b8415daebd4c8bf85e",
+ "url": "https://api.github.com/repos/fruux/sabre-http/zipball/0295f9a3ee39be97e0898592fc19e42421e0cd93",
+ "reference": "0295f9a3ee39be97e0898592fc19e42421e0cd93",
"shasum": ""
},
"require": {
+ "ext-ctype": "*",
"ext-mbstring": "*",
"php": ">=5.4",
"sabre/event": ">=1.0.0,<4.0.0",
@@ -456,28 +465,28 @@
"keywords": [
"http"
],
- "time": "2016-01-06T23:00:08+00:00"
+ "time": "2017-06-12T07:53:04+00:00"
},
{
"name": "sabre/uri",
- "version": "1.1.0",
+ "version": "1.2.1",
"source": {
"type": "git",
"url": "https://github.com/fruux/sabre-uri.git",
- "reference": "9012116434d84ef6e5e37a89dfdbfbe2204a8704"
+ "reference": "ada354d83579565949d80b2e15593c2371225e61"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/fruux/sabre-uri/zipball/9012116434d84ef6e5e37a89dfdbfbe2204a8704",
- "reference": "9012116434d84ef6e5e37a89dfdbfbe2204a8704",
+ "url": "https://api.github.com/repos/fruux/sabre-uri/zipball/ada354d83579565949d80b2e15593c2371225e61",
+ "reference": "ada354d83579565949d80b2e15593c2371225e61",
"shasum": ""
},
"require": {
"php": ">=5.4.7"
},
"require-dev": {
- "phpunit/phpunit": "*",
- "sabre/cs": "~0.0.1"
+ "phpunit/phpunit": ">=4.0,<6.0",
+ "sabre/cs": "~1.0.0"
},
"type": "library",
"autoload": {
@@ -507,30 +516,30 @@
"uri",
"url"
],
- "time": "2016-03-08T02:29:27+00:00"
+ "time": "2017-02-20T19:59:28+00:00"
},
{
"name": "sabre/vobject",
- "version": "4.1.1",
+ "version": "4.1.2",
"source": {
"type": "git",
"url": "https://github.com/fruux/sabre-vobject.git",
- "reference": "a3a59b06947f122af2d45d52b72172cdc1efd68f"
+ "reference": "d0fde2fafa2a3dad1f559c2d1c2591d4fd75ae3c"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/fruux/sabre-vobject/zipball/a3a59b06947f122af2d45d52b72172cdc1efd68f",
- "reference": "a3a59b06947f122af2d45d52b72172cdc1efd68f",
+ "url": "https://api.github.com/repos/fruux/sabre-vobject/zipball/d0fde2fafa2a3dad1f559c2d1c2591d4fd75ae3c",
+ "reference": "d0fde2fafa2a3dad1f559c2d1c2591d4fd75ae3c",
"shasum": ""
},
"require": {
"ext-mbstring": "*",
"php": ">=5.5",
- "sabre/xml": "~1.1"
+ "sabre/xml": ">=1.5 <3.0"
},
"require-dev": {
"phpunit/phpunit": "*",
- "sabre/cs": "~0.0.3"
+ "sabre/cs": "^1.0.0"
},
"suggest": {
"hoa/bench": "If you would like to run the benchmark scripts"
@@ -604,7 +613,7 @@
"xCal",
"xCard"
],
- "time": "2016-07-15T19:52:17+00:00"
+ "time": "2016-12-06T04:14:09+00:00"
},
{
"name": "sabre/xml",
@@ -736,21 +745,21 @@
"packages-dev": [
{
"name": "behat/behat",
- "version": "v3.3.0",
+ "version": "v3.3.1",
"source": {
"type": "git",
"url": "https://github.com/Behat/Behat.git",
- "reference": "15a3a1857457eaa29cdf41564a5e421effb09526"
+ "reference": "44a58c1480d6144b2dc2c2bf02b9cef73c83840d"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/Behat/Behat/zipball/15a3a1857457eaa29cdf41564a5e421effb09526",
- "reference": "15a3a1857457eaa29cdf41564a5e421effb09526",
+ "url": "https://api.github.com/repos/Behat/Behat/zipball/44a58c1480d6144b2dc2c2bf02b9cef73c83840d",
+ "reference": "44a58c1480d6144b2dc2c2bf02b9cef73c83840d",
"shasum": ""
},
"require": {
"behat/gherkin": "^4.4.4",
- "behat/transliterator": "~1.0",
+ "behat/transliterator": "^1.2",
"container-interop/container-interop": "^1.1",
"ext-mbstring": "*",
"php": ">=5.3.3",
@@ -814,7 +823,7 @@
"symfony",
"testing"
],
- "time": "2016-12-25T13:43:52+00:00"
+ "time": "2017-05-15T16:49:16+00:00"
},
{
"name": "behat/gherkin",
@@ -1105,25 +1114,29 @@
},
{
"name": "behat/transliterator",
- "version": "v1.1.0",
+ "version": "v1.2.0",
"source": {
"type": "git",
"url": "https://github.com/Behat/Transliterator.git",
- "reference": "868e05be3a9f25ba6424c2dd4849567f50715003"
+ "reference": "826ce7e9c2a6664c0d1f381cbb38b1fb80a7ee2c"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/Behat/Transliterator/zipball/868e05be3a9f25ba6424c2dd4849567f50715003",
- "reference": "868e05be3a9f25ba6424c2dd4849567f50715003",
+ "url": "https://api.github.com/repos/Behat/Transliterator/zipball/826ce7e9c2a6664c0d1f381cbb38b1fb80a7ee2c",
+ "reference": "826ce7e9c2a6664c0d1f381cbb38b1fb80a7ee2c",
"shasum": ""
},
"require": {
"php": ">=5.3.3"
},
+ "require-dev": {
+ "chuyskywalker/rolling-curl": "^3.1",
+ "php-yaoi/php-yaoi": "^1.0"
+ },
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "1.1-dev"
+ "dev-master": "1.2-dev"
}
},
"autoload": {
@@ -1141,7 +1154,7 @@
"slug",
"transliterator"
],
- "time": "2015-09-28T16:26:35+00:00"
+ "time": "2017-04-04T11:38:05+00:00"
},
{
"name": "container-interop/container-interop",
@@ -1279,16 +1292,16 @@
},
{
"name": "guzzlehttp/guzzle",
- "version": "6.2.3",
+ "version": "6.3.0",
"source": {
"type": "git",
"url": "https://github.com/guzzle/guzzle.git",
- "reference": "8d6c6cc55186db87b7dc5009827429ba4e9dc006"
+ "reference": "f4db5a78a5ea468d4831de7f0bf9d9415e348699"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/guzzle/guzzle/zipball/8d6c6cc55186db87b7dc5009827429ba4e9dc006",
- "reference": "8d6c6cc55186db87b7dc5009827429ba4e9dc006",
+ "url": "https://api.github.com/repos/guzzle/guzzle/zipball/f4db5a78a5ea468d4831de7f0bf9d9415e348699",
+ "reference": "f4db5a78a5ea468d4831de7f0bf9d9415e348699",
"shasum": ""
},
"require": {
@@ -1298,9 +1311,12 @@
},
"require-dev": {
"ext-curl": "*",
- "phpunit/phpunit": "^4.0",
+ "phpunit/phpunit": "^4.0 || ^5.0",
"psr/log": "^1.0"
},
+ "suggest": {
+ "psr/log": "Required for using the Log middleware"
+ },
"type": "library",
"extra": {
"branch-alias": {
@@ -1337,7 +1353,7 @@
"rest",
"web service"
],
- "time": "2017-02-28T22:50:30+00:00"
+ "time": "2017-06-22T18:50:49+00:00"
},
{
"name": "guzzlehttp/promises",
@@ -1392,16 +1408,16 @@
},
{
"name": "guzzlehttp/psr7",
- "version": "1.4.1",
+ "version": "1.4.2",
"source": {
"type": "git",
"url": "https://github.com/guzzle/psr7.git",
- "reference": "0d6c7ca039329247e4f0f8f8f6506810e8248855"
+ "reference": "f5b8a8512e2b58b0071a7280e39f14f72e05d87c"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/guzzle/psr7/zipball/0d6c7ca039329247e4f0f8f8f6506810e8248855",
- "reference": "0d6c7ca039329247e4f0f8f8f6506810e8248855",
+ "url": "https://api.github.com/repos/guzzle/psr7/zipball/f5b8a8512e2b58b0071a7280e39f14f72e05d87c",
+ "reference": "f5b8a8512e2b58b0071a7280e39f14f72e05d87c",
"shasum": ""
},
"require": {
@@ -1453,20 +1469,20 @@
"uri",
"url"
],
- "time": "2017-02-27T10:51:17+00:00"
+ "time": "2017-03-20T17:10:46+00:00"
},
{
"name": "myclabs/deep-copy",
- "version": "1.6.0",
+ "version": "1.6.1",
"source": {
"type": "git",
"url": "https://github.com/myclabs/DeepCopy.git",
- "reference": "5a5a9fc8025a08d8919be87d6884d5a92520cefe"
+ "reference": "8e6e04167378abf1ddb4d3522d8755c5fd90d102"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/5a5a9fc8025a08d8919be87d6884d5a92520cefe",
- "reference": "5a5a9fc8025a08d8919be87d6884d5a92520cefe",
+ "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/8e6e04167378abf1ddb4d3522d8755c5fd90d102",
+ "reference": "8e6e04167378abf1ddb4d3522d8755c5fd90d102",
"shasum": ""
},
"require": {
@@ -1495,7 +1511,109 @@
"object",
"object graph"
],
- "time": "2017-01-26T22:05:40+00:00"
+ "time": "2017-04-12T18:52:22+00:00"
+ },
+ {
+ "name": "phar-io/manifest",
+ "version": "1.0.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/phar-io/manifest.git",
+ "reference": "2df402786ab5368a0169091f61a7c1e0eb6852d0"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/phar-io/manifest/zipball/2df402786ab5368a0169091f61a7c1e0eb6852d0",
+ "reference": "2df402786ab5368a0169091f61a7c1e0eb6852d0",
+ "shasum": ""
+ },
+ "require": {
+ "ext-dom": "*",
+ "ext-phar": "*",
+ "phar-io/version": "^1.0.1",
+ "php": "^5.6 || ^7.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.0.x-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Arne Blankerts",
+ "email": "arne@blankerts.de",
+ "role": "Developer"
+ },
+ {
+ "name": "Sebastian Heuer",
+ "email": "sebastian@phpeople.de",
+ "role": "Developer"
+ },
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de",
+ "role": "Developer"
+ }
+ ],
+ "description": "Component for reading phar.io manifest information from a PHP Archive (PHAR)",
+ "time": "2017-03-05T18:14:27+00:00"
+ },
+ {
+ "name": "phar-io/version",
+ "version": "1.0.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/phar-io/version.git",
+ "reference": "a70c0ced4be299a63d32fa96d9281d03e94041df"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/phar-io/version/zipball/a70c0ced4be299a63d32fa96d9281d03e94041df",
+ "reference": "a70c0ced4be299a63d32fa96d9281d03e94041df",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^5.6 || ^7.0"
+ },
+ "type": "library",
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Arne Blankerts",
+ "email": "arne@blankerts.de",
+ "role": "Developer"
+ },
+ {
+ "name": "Sebastian Heuer",
+ "email": "sebastian@phpeople.de",
+ "role": "Developer"
+ },
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de",
+ "role": "Developer"
+ }
+ ],
+ "description": "Library for handling version information and constraints",
+ "time": "2017-03-05T17:38:23+00:00"
},
{
"name": "php-mock/php-mock",
@@ -1873,16 +1991,16 @@
},
{
"name": "phpunit/php-code-coverage",
- "version": "5.0.2",
+ "version": "5.2.1",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/php-code-coverage.git",
- "reference": "531553c4795a1df54114342d68ca337d5d81c8a0"
+ "reference": "dc421f9ca5082a0c0cb04afb171c765f79add85b"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/531553c4795a1df54114342d68ca337d5d81c8a0",
- "reference": "531553c4795a1df54114342d68ca337d5d81c8a0",
+ "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/dc421f9ca5082a0c0cb04afb171c765f79add85b",
+ "reference": "dc421f9ca5082a0c0cb04afb171c765f79add85b",
"shasum": ""
},
"require": {
@@ -1893,20 +2011,21 @@
"phpunit/php-text-template": "^1.2",
"phpunit/php-token-stream": "^1.4.11 || ^2.0",
"sebastian/code-unit-reverse-lookup": "^1.0",
- "sebastian/environment": "^2.0",
- "sebastian/version": "^2.0"
+ "sebastian/environment": "^3.0",
+ "sebastian/version": "^2.0",
+ "theseer/tokenizer": "^1.1"
},
"require-dev": {
"ext-xdebug": "^2.5",
"phpunit/phpunit": "^6.0"
},
"suggest": {
- "ext-xdebug": "^2.5.1"
+ "ext-xdebug": "^2.5.3"
},
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "5.0.x-dev"
+ "dev-master": "5.2.x-dev"
}
},
"autoload": {
@@ -1932,7 +2051,7 @@
"testing",
"xunit"
],
- "time": "2017-03-01T09:14:18+00:00"
+ "time": "2017-04-21T08:03:57+00:00"
},
{
"name": "phpunit/php-file-iterator",
@@ -2122,16 +2241,16 @@
},
{
"name": "phpunit/phpunit",
- "version": "6.0.8",
+ "version": "6.2.3",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/phpunit.git",
- "reference": "47ee3fa1bca5c50f1d25105201eb20df777bd7b6"
+ "reference": "fa5711d0559fc4b64deba0702be52d41434cbcb7"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/47ee3fa1bca5c50f1d25105201eb20df777bd7b6",
- "reference": "47ee3fa1bca5c50f1d25105201eb20df777bd7b6",
+ "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/fa5711d0559fc4b64deba0702be52d41434cbcb7",
+ "reference": "fa5711d0559fc4b64deba0702be52d41434cbcb7",
"shasum": ""
},
"require": {
@@ -2141,19 +2260,21 @@
"ext-mbstring": "*",
"ext-xml": "*",
"myclabs/deep-copy": "^1.3",
+ "phar-io/manifest": "^1.0.1",
+ "phar-io/version": "^1.0",
"php": "^7.0",
- "phpspec/prophecy": "^1.6.2",
- "phpunit/php-code-coverage": "^5.0",
+ "phpspec/prophecy": "^1.7",
+ "phpunit/php-code-coverage": "^5.2",
"phpunit/php-file-iterator": "^1.4",
"phpunit/php-text-template": "^1.2",
"phpunit/php-timer": "^1.0.6",
"phpunit/phpunit-mock-objects": "^4.0",
- "sebastian/comparator": "^1.2.4 || ^2.0",
- "sebastian/diff": "^1.2",
- "sebastian/environment": "^2.0",
- "sebastian/exporter": "^2.0 || ^3.0",
+ "sebastian/comparator": "^2.0",
+ "sebastian/diff": "^1.4.3 || ^2.0",
+ "sebastian/environment": "^3.0.2",
+ "sebastian/exporter": "^3.1",
"sebastian/global-state": "^1.1 || ^2.0",
- "sebastian/object-enumerator": "^2.0 || ^3.0",
+ "sebastian/object-enumerator": "^3.0.2",
"sebastian/resource-operations": "^1.0",
"sebastian/version": "^2.0"
},
@@ -2174,7 +2295,7 @@
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "6.0.x-dev"
+ "dev-master": "6.2.x-dev"
}
},
"autoload": {
@@ -2200,20 +2321,20 @@
"testing",
"xunit"
],
- "time": "2017-03-02T15:24:03+00:00"
+ "time": "2017-07-03T15:54:24+00:00"
},
{
"name": "phpunit/phpunit-mock-objects",
- "version": "4.0.1",
+ "version": "4.0.2",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/phpunit-mock-objects.git",
- "reference": "eabce450df194817a7d7e27e19013569a903a2bf"
+ "reference": "d8833b396dce9162bb2eb5d59aee5a3ab3cfa5b4"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/phpunit-mock-objects/zipball/eabce450df194817a7d7e27e19013569a903a2bf",
- "reference": "eabce450df194817a7d7e27e19013569a903a2bf",
+ "url": "https://api.github.com/repos/sebastianbergmann/phpunit-mock-objects/zipball/d8833b396dce9162bb2eb5d59aee5a3ab3cfa5b4",
+ "reference": "d8833b396dce9162bb2eb5d59aee5a3ab3cfa5b4",
"shasum": ""
},
"require": {
@@ -2259,7 +2380,7 @@
"mock",
"xunit"
],
- "time": "2017-03-03T06:30:20+00:00"
+ "time": "2017-06-30T08:15:21+00:00"
},
{
"name": "psr/container",
@@ -2471,23 +2592,23 @@
},
{
"name": "sebastian/diff",
- "version": "1.4.1",
+ "version": "1.4.3",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/diff.git",
- "reference": "13edfd8706462032c2f52b4b862974dd46b71c9e"
+ "reference": "7f066a26a962dbe58ddea9f72a4e82874a3975a4"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/13edfd8706462032c2f52b4b862974dd46b71c9e",
- "reference": "13edfd8706462032c2f52b4b862974dd46b71c9e",
+ "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/7f066a26a962dbe58ddea9f72a4e82874a3975a4",
+ "reference": "7f066a26a962dbe58ddea9f72a4e82874a3975a4",
"shasum": ""
},
"require": {
- "php": ">=5.3.3"
+ "php": "^5.3.3 || ^7.0"
},
"require-dev": {
- "phpunit/phpunit": "~4.8"
+ "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.0"
},
"type": "library",
"extra": {
@@ -2519,32 +2640,32 @@
"keywords": [
"diff"
],
- "time": "2015-12-08T07:14:41+00:00"
+ "time": "2017-05-22T07:24:03+00:00"
},
{
"name": "sebastian/environment",
- "version": "2.0.0",
+ "version": "3.1.0",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/environment.git",
- "reference": "5795ffe5dc5b02460c3e34222fee8cbe245d8fac"
+ "reference": "cd0871b3975fb7fc44d11314fd1ee20925fce4f5"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/5795ffe5dc5b02460c3e34222fee8cbe245d8fac",
- "reference": "5795ffe5dc5b02460c3e34222fee8cbe245d8fac",
+ "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/cd0871b3975fb7fc44d11314fd1ee20925fce4f5",
+ "reference": "cd0871b3975fb7fc44d11314fd1ee20925fce4f5",
"shasum": ""
},
"require": {
- "php": "^5.6 || ^7.0"
+ "php": "^7.0"
},
"require-dev": {
- "phpunit/phpunit": "^5.0"
+ "phpunit/phpunit": "^6.1"
},
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "2.0.x-dev"
+ "dev-master": "3.1.x-dev"
}
},
"autoload": {
@@ -2569,20 +2690,20 @@
"environment",
"hhvm"
],
- "time": "2016-11-26T07:53:53+00:00"
+ "time": "2017-07-01T08:51:00+00:00"
},
{
"name": "sebastian/exporter",
- "version": "3.0.0",
+ "version": "3.1.0",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/exporter.git",
- "reference": "b82d077cb3459e393abcf4867ae8f7230dcb51f6"
+ "reference": "234199f4528de6d12aaa58b612e98f7d36adb937"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/b82d077cb3459e393abcf4867ae8f7230dcb51f6",
- "reference": "b82d077cb3459e393abcf4867ae8f7230dcb51f6",
+ "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/234199f4528de6d12aaa58b612e98f7d36adb937",
+ "reference": "234199f4528de6d12aaa58b612e98f7d36adb937",
"shasum": ""
},
"require": {
@@ -2596,7 +2717,7 @@
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "3.0.x-dev"
+ "dev-master": "3.1.x-dev"
}
},
"autoload": {
@@ -2636,27 +2757,27 @@
"export",
"exporter"
],
- "time": "2017-03-03T06:25:06+00:00"
+ "time": "2017-04-03T13:19:02+00:00"
},
{
"name": "sebastian/global-state",
- "version": "1.1.1",
+ "version": "2.0.0",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/global-state.git",
- "reference": "bc37d50fea7d017d3d340f230811c9f1d7280af4"
+ "reference": "e8ba02eed7bbbb9e59e43dedd3dddeff4a56b0c4"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/bc37d50fea7d017d3d340f230811c9f1d7280af4",
- "reference": "bc37d50fea7d017d3d340f230811c9f1d7280af4",
+ "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/e8ba02eed7bbbb9e59e43dedd3dddeff4a56b0c4",
+ "reference": "e8ba02eed7bbbb9e59e43dedd3dddeff4a56b0c4",
"shasum": ""
},
"require": {
- "php": ">=5.3.3"
+ "php": "^7.0"
},
"require-dev": {
- "phpunit/phpunit": "~4.2"
+ "phpunit/phpunit": "^6.0"
},
"suggest": {
"ext-uopz": "*"
@@ -2664,7 +2785,7 @@
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "1.0-dev"
+ "dev-master": "2.0-dev"
}
},
"autoload": {
@@ -2687,24 +2808,25 @@
"keywords": [
"global state"
],
- "time": "2015-10-12T03:26:01+00:00"
+ "time": "2017-04-27T15:39:26+00:00"
},
{
"name": "sebastian/object-enumerator",
- "version": "3.0.0",
+ "version": "3.0.2",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/object-enumerator.git",
- "reference": "de6e32f7192dfea2e4bedc892434f4830b5c5794"
+ "reference": "31dd3379d16446c5d86dec32ab1ad1f378581ad8"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/de6e32f7192dfea2e4bedc892434f4830b5c5794",
- "reference": "de6e32f7192dfea2e4bedc892434f4830b5c5794",
+ "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/31dd3379d16446c5d86dec32ab1ad1f378581ad8",
+ "reference": "31dd3379d16446c5d86dec32ab1ad1f378581ad8",
"shasum": ""
},
"require": {
"php": "^7.0",
+ "sebastian/object-reflector": "^1.0",
"sebastian/recursion-context": "^3.0"
},
"require-dev": {
@@ -2733,7 +2855,52 @@
],
"description": "Traverses array structures and object graphs to enumerate all referenced objects",
"homepage": "https://github.com/sebastianbergmann/object-enumerator/",
- "time": "2017-03-03T06:21:01+00:00"
+ "time": "2017-03-12T15:17:29+00:00"
+ },
+ {
+ "name": "sebastian/object-reflector",
+ "version": "1.1.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/object-reflector.git",
+ "reference": "773f97c67f28de00d397be301821b06708fca0be"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/object-reflector/zipball/773f97c67f28de00d397be301821b06708fca0be",
+ "reference": "773f97c67f28de00d397be301821b06708fca0be",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^6.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.1-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de"
+ }
+ ],
+ "description": "Allows reflection of object attributes, including inherited and non-public ones",
+ "homepage": "https://github.com/sebastianbergmann/object-reflector/",
+ "time": "2017-03-29T09:07:27+00:00"
},
{
"name": "sebastian/recursion-context",
@@ -2875,16 +3042,16 @@
},
{
"name": "symfony/browser-kit",
- "version": "v3.2.4",
+ "version": "v3.3.4",
"source": {
"type": "git",
"url": "https://github.com/symfony/browser-kit.git",
- "reference": "394a2475a3a89089353fde5714a7f402fbb83880"
+ "reference": "3a4435e79a8401746e8525e98039199d0924b4e5"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/browser-kit/zipball/394a2475a3a89089353fde5714a7f402fbb83880",
- "reference": "394a2475a3a89089353fde5714a7f402fbb83880",
+ "url": "https://api.github.com/repos/symfony/browser-kit/zipball/3a4435e79a8401746e8525e98039199d0924b4e5",
+ "reference": "3a4435e79a8401746e8525e98039199d0924b4e5",
"shasum": ""
},
"require": {
@@ -2901,7 +3068,7 @@
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "3.2-dev"
+ "dev-master": "3.3-dev"
}
},
"autoload": {
@@ -2928,20 +3095,20 @@
],
"description": "Symfony BrowserKit Component",
"homepage": "https://symfony.com",
- "time": "2017-01-31T21:49:23+00:00"
+ "time": "2017-06-24T09:29:48+00:00"
},
{
"name": "symfony/class-loader",
- "version": "v3.2.4",
+ "version": "v3.3.4",
"source": {
"type": "git",
"url": "https://github.com/symfony/class-loader.git",
- "reference": "2847d56f518ad5721bf85aa9174b3aa3fd12aa03"
+ "reference": "386a294d621576302e7cc36965d6ed53b8c73c4f"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/class-loader/zipball/2847d56f518ad5721bf85aa9174b3aa3fd12aa03",
- "reference": "2847d56f518ad5721bf85aa9174b3aa3fd12aa03",
+ "url": "https://api.github.com/repos/symfony/class-loader/zipball/386a294d621576302e7cc36965d6ed53b8c73c4f",
+ "reference": "386a294d621576302e7cc36965d6ed53b8c73c4f",
"shasum": ""
},
"require": {
@@ -2957,7 +3124,7 @@
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "3.2-dev"
+ "dev-master": "3.3-dev"
}
},
"autoload": {
@@ -2984,27 +3151,33 @@
],
"description": "Symfony ClassLoader Component",
"homepage": "https://symfony.com",
- "time": "2017-01-21T17:06:35+00:00"
+ "time": "2017-06-02T09:51:43+00:00"
},
{
"name": "symfony/config",
- "version": "v3.2.4",
+ "version": "v3.3.4",
"source": {
"type": "git",
"url": "https://github.com/symfony/config.git",
- "reference": "9f99453e77771e629af8a25eeb0a6c4ed1e19da2"
+ "reference": "a094618deb9a3fe1c3cf500a796e167d0495a274"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/config/zipball/9f99453e77771e629af8a25eeb0a6c4ed1e19da2",
- "reference": "9f99453e77771e629af8a25eeb0a6c4ed1e19da2",
+ "url": "https://api.github.com/repos/symfony/config/zipball/a094618deb9a3fe1c3cf500a796e167d0495a274",
+ "reference": "a094618deb9a3fe1c3cf500a796e167d0495a274",
"shasum": ""
},
"require": {
"php": ">=5.5.9",
"symfony/filesystem": "~2.8|~3.0"
},
+ "conflict": {
+ "symfony/dependency-injection": "<3.3",
+ "symfony/finder": "<3.3"
+ },
"require-dev": {
+ "symfony/dependency-injection": "~3.3",
+ "symfony/finder": "~3.3",
"symfony/yaml": "~3.0"
},
"suggest": {
@@ -3013,7 +3186,7 @@
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "3.2-dev"
+ "dev-master": "3.3-dev"
}
},
"autoload": {
@@ -3040,20 +3213,20 @@
],
"description": "Symfony Config Component",
"homepage": "https://symfony.com",
- "time": "2017-02-14T16:27:43+00:00"
+ "time": "2017-06-16T12:40:34+00:00"
},
{
"name": "symfony/console",
- "version": "v3.2.4",
+ "version": "v3.3.4",
"source": {
"type": "git",
"url": "https://github.com/symfony/console.git",
- "reference": "0e5e6899f82230fcb1153bcaf0e106ffaa44b870"
+ "reference": "a97e45d98c59510f085fa05225a1acb74dfe0546"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/console/zipball/0e5e6899f82230fcb1153bcaf0e106ffaa44b870",
- "reference": "0e5e6899f82230fcb1153bcaf0e106ffaa44b870",
+ "url": "https://api.github.com/repos/symfony/console/zipball/a97e45d98c59510f085fa05225a1acb74dfe0546",
+ "reference": "a97e45d98c59510f085fa05225a1acb74dfe0546",
"shasum": ""
},
"require": {
@@ -3061,10 +3234,16 @@
"symfony/debug": "~2.8|~3.0",
"symfony/polyfill-mbstring": "~1.0"
},
+ "conflict": {
+ "symfony/dependency-injection": "<3.3"
+ },
"require-dev": {
"psr/log": "~1.0",
+ "symfony/config": "~3.3",
+ "symfony/dependency-injection": "~3.3",
"symfony/event-dispatcher": "~2.8|~3.0",
"symfony/filesystem": "~2.8|~3.0",
+ "symfony/http-kernel": "~2.8|~3.0",
"symfony/process": "~2.8|~3.0"
},
"suggest": {
@@ -3076,7 +3255,7 @@
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "3.2-dev"
+ "dev-master": "3.3-dev"
}
},
"autoload": {
@@ -3103,20 +3282,20 @@
],
"description": "Symfony Console Component",
"homepage": "https://symfony.com",
- "time": "2017-02-16T14:07:22+00:00"
+ "time": "2017-07-03T13:19:36+00:00"
},
{
"name": "symfony/css-selector",
- "version": "v3.2.4",
+ "version": "v3.3.4",
"source": {
"type": "git",
"url": "https://github.com/symfony/css-selector.git",
- "reference": "f0e628f04fc055c934b3211cfabdb1c59eefbfaa"
+ "reference": "4d882dced7b995d5274293039370148e291808f2"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/css-selector/zipball/f0e628f04fc055c934b3211cfabdb1c59eefbfaa",
- "reference": "f0e628f04fc055c934b3211cfabdb1c59eefbfaa",
+ "url": "https://api.github.com/repos/symfony/css-selector/zipball/4d882dced7b995d5274293039370148e291808f2",
+ "reference": "4d882dced7b995d5274293039370148e291808f2",
"shasum": ""
},
"require": {
@@ -3125,7 +3304,7 @@
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "3.2-dev"
+ "dev-master": "3.3-dev"
}
},
"autoload": {
@@ -3156,20 +3335,20 @@
],
"description": "Symfony CssSelector Component",
"homepage": "https://symfony.com",
- "time": "2017-01-02T20:32:22+00:00"
+ "time": "2017-05-01T15:01:29+00:00"
},
{
"name": "symfony/debug",
- "version": "v3.2.4",
+ "version": "v3.3.4",
"source": {
"type": "git",
"url": "https://github.com/symfony/debug.git",
- "reference": "9b98854cb45bc59d100b7d4cc4cf9e05f21026b9"
+ "reference": "63b85a968486d95ff9542228dc2e4247f16f9743"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/debug/zipball/9b98854cb45bc59d100b7d4cc4cf9e05f21026b9",
- "reference": "9b98854cb45bc59d100b7d4cc4cf9e05f21026b9",
+ "url": "https://api.github.com/repos/symfony/debug/zipball/63b85a968486d95ff9542228dc2e4247f16f9743",
+ "reference": "63b85a968486d95ff9542228dc2e4247f16f9743",
"shasum": ""
},
"require": {
@@ -3180,13 +3359,12 @@
"symfony/http-kernel": ">=2.3,<2.3.24|~2.4.0|>=2.5,<2.5.9|>=2.6,<2.6.2"
},
"require-dev": {
- "symfony/class-loader": "~2.8|~3.0",
"symfony/http-kernel": "~2.8|~3.0"
},
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "3.2-dev"
+ "dev-master": "3.3-dev"
}
},
"autoload": {
@@ -3213,43 +3391,50 @@
],
"description": "Symfony Debug Component",
"homepage": "https://symfony.com",
- "time": "2017-02-16T16:34:18+00:00"
+ "time": "2017-07-05T13:02:37+00:00"
},
{
"name": "symfony/dependency-injection",
- "version": "v3.2.4",
+ "version": "v3.3.4",
"source": {
"type": "git",
"url": "https://github.com/symfony/dependency-injection.git",
- "reference": "130aa55b8ed7e6d0d75b0ed37256cec687a22f41"
+ "reference": "986a633c92220ecb22ad06820a1df126c7a4f9eb"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/130aa55b8ed7e6d0d75b0ed37256cec687a22f41",
- "reference": "130aa55b8ed7e6d0d75b0ed37256cec687a22f41",
+ "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/986a633c92220ecb22ad06820a1df126c7a4f9eb",
+ "reference": "986a633c92220ecb22ad06820a1df126c7a4f9eb",
"shasum": ""
},
"require": {
- "php": ">=5.5.9"
+ "php": ">=5.5.9",
+ "psr/container": "^1.0"
},
"conflict": {
- "symfony/yaml": "<3.2"
+ "symfony/config": "<3.3.1",
+ "symfony/finder": "<3.3",
+ "symfony/yaml": "<3.3"
+ },
+ "provide": {
+ "psr/container-implementation": "1.0"
},
"require-dev": {
- "symfony/config": "~2.8|~3.0",
+ "symfony/config": "~3.3",
"symfony/expression-language": "~2.8|~3.0",
- "symfony/yaml": "~3.2"
+ "symfony/yaml": "~3.3"
},
"suggest": {
"symfony/config": "",
"symfony/expression-language": "For using expressions in service container configuration",
+ "symfony/finder": "For using double-star glob patterns or when GLOB_BRACE portability is required",
"symfony/proxy-manager-bridge": "Generate service proxies to lazy load them",
"symfony/yaml": ""
},
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "3.2-dev"
+ "dev-master": "3.3-dev"
}
},
"autoload": {
@@ -3276,20 +3461,20 @@
],
"description": "Symfony DependencyInjection Component",
"homepage": "https://symfony.com",
- "time": "2017-02-16T22:46:52+00:00"
+ "time": "2017-06-20T14:01:46+00:00"
},
{
"name": "symfony/dom-crawler",
- "version": "v3.2.4",
+ "version": "v3.3.4",
"source": {
"type": "git",
"url": "https://github.com/symfony/dom-crawler.git",
- "reference": "b814b41373fc4e535aff8c765abe39545216f391"
+ "reference": "fc2c588ce376e9fe04a7b8c79e3ec62fe32d95b1"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/dom-crawler/zipball/b814b41373fc4e535aff8c765abe39545216f391",
- "reference": "b814b41373fc4e535aff8c765abe39545216f391",
+ "url": "https://api.github.com/repos/symfony/dom-crawler/zipball/fc2c588ce376e9fe04a7b8c79e3ec62fe32d95b1",
+ "reference": "fc2c588ce376e9fe04a7b8c79e3ec62fe32d95b1",
"shasum": ""
},
"require": {
@@ -3305,7 +3490,7 @@
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "3.2-dev"
+ "dev-master": "3.3-dev"
}
},
"autoload": {
@@ -3332,29 +3517,32 @@
],
"description": "Symfony DomCrawler Component",
"homepage": "https://symfony.com",
- "time": "2017-01-21T17:14:11+00:00"
+ "time": "2017-05-25T23:10:31+00:00"
},
{
"name": "symfony/event-dispatcher",
- "version": "v3.2.4",
+ "version": "v3.3.4",
"source": {
"type": "git",
"url": "https://github.com/symfony/event-dispatcher.git",
- "reference": "9137eb3a3328e413212826d63eeeb0217836e2b6"
+ "reference": "67535f1e3fd662bdc68d7ba317c93eecd973617e"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/9137eb3a3328e413212826d63eeeb0217836e2b6",
- "reference": "9137eb3a3328e413212826d63eeeb0217836e2b6",
+ "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/67535f1e3fd662bdc68d7ba317c93eecd973617e",
+ "reference": "67535f1e3fd662bdc68d7ba317c93eecd973617e",
"shasum": ""
},
"require": {
"php": ">=5.5.9"
},
+ "conflict": {
+ "symfony/dependency-injection": "<3.3"
+ },
"require-dev": {
"psr/log": "~1.0",
"symfony/config": "~2.8|~3.0",
- "symfony/dependency-injection": "~2.8|~3.0",
+ "symfony/dependency-injection": "~3.3",
"symfony/expression-language": "~2.8|~3.0",
"symfony/stopwatch": "~2.8|~3.0"
},
@@ -3365,7 +3553,7 @@
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "3.2-dev"
+ "dev-master": "3.3-dev"
}
},
"autoload": {
@@ -3392,20 +3580,20 @@
],
"description": "Symfony EventDispatcher Component",
"homepage": "https://symfony.com",
- "time": "2017-01-02T20:32:22+00:00"
+ "time": "2017-06-09T14:53:08+00:00"
},
{
"name": "symfony/filesystem",
- "version": "v3.2.4",
+ "version": "v3.3.4",
"source": {
"type": "git",
"url": "https://github.com/symfony/filesystem.git",
- "reference": "a0c6ef2dc78d33b58d91d3a49f49797a184d06f4"
+ "reference": "311fa718389efbd8b627c272b9324a62437018cc"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/filesystem/zipball/a0c6ef2dc78d33b58d91d3a49f49797a184d06f4",
- "reference": "a0c6ef2dc78d33b58d91d3a49f49797a184d06f4",
+ "url": "https://api.github.com/repos/symfony/filesystem/zipball/311fa718389efbd8b627c272b9324a62437018cc",
+ "reference": "311fa718389efbd8b627c272b9324a62437018cc",
"shasum": ""
},
"require": {
@@ -3414,7 +3602,7 @@
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "3.2-dev"
+ "dev-master": "3.3-dev"
}
},
"autoload": {
@@ -3441,20 +3629,20 @@
],
"description": "Symfony Filesystem Component",
"homepage": "https://symfony.com",
- "time": "2017-01-08T20:47:33+00:00"
+ "time": "2017-06-24T09:29:48+00:00"
},
{
"name": "symfony/polyfill-mbstring",
- "version": "v1.3.0",
+ "version": "v1.4.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/polyfill-mbstring.git",
- "reference": "e79d363049d1c2128f133a2667e4f4190904f7f4"
+ "reference": "f29dca382a6485c3cbe6379f0c61230167681937"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/e79d363049d1c2128f133a2667e4f4190904f7f4",
- "reference": "e79d363049d1c2128f133a2667e4f4190904f7f4",
+ "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/f29dca382a6485c3cbe6379f0c61230167681937",
+ "reference": "f29dca382a6485c3cbe6379f0c61230167681937",
"shasum": ""
},
"require": {
@@ -3466,7 +3654,7 @@
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "1.3-dev"
+ "dev-master": "1.4-dev"
}
},
"autoload": {
@@ -3500,20 +3688,20 @@
"portable",
"shim"
],
- "time": "2016-11-14T01:06:16+00:00"
+ "time": "2017-06-09T14:24:12+00:00"
},
{
"name": "symfony/translation",
- "version": "v3.2.4",
+ "version": "v3.3.4",
"source": {
"type": "git",
"url": "https://github.com/symfony/translation.git",
- "reference": "d6825c6bb2f1da13f564678f9f236fe8242c0029"
+ "reference": "35dd5fb003c90e8bd4d8cabdf94bf9c96d06fdc3"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/translation/zipball/d6825c6bb2f1da13f564678f9f236fe8242c0029",
- "reference": "d6825c6bb2f1da13f564678f9f236fe8242c0029",
+ "url": "https://api.github.com/repos/symfony/translation/zipball/35dd5fb003c90e8bd4d8cabdf94bf9c96d06fdc3",
+ "reference": "35dd5fb003c90e8bd4d8cabdf94bf9c96d06fdc3",
"shasum": ""
},
"require": {
@@ -3521,13 +3709,14 @@
"symfony/polyfill-mbstring": "~1.0"
},
"conflict": {
- "symfony/config": "<2.8"
+ "symfony/config": "<2.8",
+ "symfony/yaml": "<3.3"
},
"require-dev": {
"psr/log": "~1.0",
"symfony/config": "~2.8|~3.0",
- "symfony/intl": "~2.8|~3.0",
- "symfony/yaml": "~2.8|~3.0"
+ "symfony/intl": "^2.8.18|^3.2.5",
+ "symfony/yaml": "~3.3"
},
"suggest": {
"psr/log": "To use logging capability in translator",
@@ -3537,7 +3726,7 @@
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "3.2-dev"
+ "dev-master": "3.3-dev"
}
},
"autoload": {
@@ -3564,20 +3753,20 @@
],
"description": "Symfony Translation Component",
"homepage": "https://symfony.com",
- "time": "2017-02-16T22:46:52+00:00"
+ "time": "2017-06-24T16:45:30+00:00"
},
{
"name": "symfony/yaml",
- "version": "v3.2.4",
+ "version": "v3.3.4",
"source": {
"type": "git",
"url": "https://github.com/symfony/yaml.git",
- "reference": "9724c684646fcb5387d579b4bfaa63ee0b0c64c8"
+ "reference": "1f93a8d19b8241617f5074a123e282575b821df8"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/yaml/zipball/9724c684646fcb5387d579b4bfaa63ee0b0c64c8",
- "reference": "9724c684646fcb5387d579b4bfaa63ee0b0c64c8",
+ "url": "https://api.github.com/repos/symfony/yaml/zipball/1f93a8d19b8241617f5074a123e282575b821df8",
+ "reference": "1f93a8d19b8241617f5074a123e282575b821df8",
"shasum": ""
},
"require": {
@@ -3592,7 +3781,7 @@
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "3.2-dev"
+ "dev-master": "3.3-dev"
}
},
"autoload": {
@@ -3619,7 +3808,47 @@
],
"description": "Symfony Yaml Component",
"homepage": "https://symfony.com",
- "time": "2017-02-16T22:46:52+00:00"
+ "time": "2017-06-15T12:58:50+00:00"
+ },
+ {
+ "name": "theseer/tokenizer",
+ "version": "1.1.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/theseer/tokenizer.git",
+ "reference": "cb2f008f3f05af2893a87208fe6a6c4985483f8b"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/theseer/tokenizer/zipball/cb2f008f3f05af2893a87208fe6a6c4985483f8b",
+ "reference": "cb2f008f3f05af2893a87208fe6a6c4985483f8b",
+ "shasum": ""
+ },
+ "require": {
+ "ext-dom": "*",
+ "ext-tokenizer": "*",
+ "ext-xmlwriter": "*",
+ "php": "^7.0"
+ },
+ "type": "library",
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Arne Blankerts",
+ "email": "arne@blankerts.de",
+ "role": "Developer"
+ }
+ ],
+ "description": "A small library for converting tokenized PHP source code into XML and potentially other formats",
+ "time": "2017-04-07T12:08:54+00:00"
},
{
"name": "webmozart/assert",
diff --git a/doc/about/about_hubzilla.bb b/doc/about/about.bb
index e9485ffa6..b927e80c0 100644
--- a/doc/about/about_hubzilla.bb
+++ b/doc/about/about.bb
@@ -1,7 +1,7 @@
-[h3]What is Hubzilla?[/h3]
+[h3]What is $Projectname?[/h3]
$Projectname is a [b]free and open source[/b] set of web applications and services running on a special kind of web server, called a "hub", that can connect to other hubs in a decentralised network we like to call "the grid", providing sophisticated communications, identity, and access control services which work together seamlessly across domains and independent websites. It allows anybody to publicly or [b]privately[/b] publish content via "channels", which are the fundamental, cryptographically secured identities that provide authentication independently of the hubs which host them. This revolutionary liberation of online identity from individual servers and domains is called "nomadic identity", and it is powered by the Zot protocol, a new framework for decentralised access control with fine-grained, extensible permissions.
-[h3]Right... so what is Hubzilla?[/h3]
+[h3]Right... so what is $Projectname?[/h3]
From the practical perspective of hub members who use the software, $Projectname offers a variety of familiar, integrated web apps and services, including:
[ul]
[li]social networking discussion threads[/li]
@@ -15,14 +15,9 @@ While all of these apps and services can be found in other software packages, on
[h3]Software Stack[/h3]
The $Projectname software stack is a relatively standard webserver application written primarily in PHP/MySQL and [url=https://github.com/redmatrix/hubzilla/blob/master/install/INSTALL.txt]requiring little more than a web server, a MySQL-compatible database, and the PHP scripting language[/url]. It is designed to be easily installable by those with basic website administration skills on typical shared hosting platforms with a broad range of computing hardware. It is also easily extended via plugins and themes and other third-party tools.
-[h3]Additional Resources and Links[/h3]
-[list][*][url=http://hubzilla.org]Hubzilla project website[/url]
-[*][url=https://github.com/redmatrix/hubzilla]Hubzilla core code repository[/url]
-[*][url=https://github.com/redmatrix/hubzilla-addons]Hubzilla official addons repository[/url][/list]
-
[h3]Glossary[/h3]
[dl terms="b"]
-[*= hub] An instance of the Hubzilla software running on a standard web server
+[*= hub] An instance of this software running on a standard web server
[*= grid] The global network of hubs that exchange information with each other using the Zot protocol.
@@ -115,7 +110,7 @@ Posts and messages may be created with an expiration date, at which time they wi
[h4]Service Federation[/h4]
-In addition to addon "cross-post connectors" to a variety of alternate networks, there is native support for importation of content from RSS/Atom feeds and using this to create special channels. Also, an experimental but working implementation of the Diaspora protocol allows communication with people on the Friendica and Diaspora decentralised social networks. This is currently marked experimental because these networks do not have the same level of privacy and encryption features and abilities as $Projectname and may present privacy risks.
+In addition to addon "cross-post connectors" to a variety of alternate networks, there is native support for importation of content from RSS/Atom feeds and using this to create special channels. Plugins are also available to communicate with others using the Diaspora and GNU-Social (OStatus) protocols. These networks do not support nomadic identity or cross-domain access control; however basic communications are supported to/from Diaspora, Friendica, GNU-Social, Mastodon and other providers which use these protocols.
There is also experimental support for OpenID authentication which may be used in Access Control Lists. This is a work in progress. Your $Projectname hub may be used as an OpenID provider to authenticate you to external services which use this technology.
@@ -195,7 +190,7 @@ Any content created in $Projectname remains under the control of the member (or
Similar to any other modern blogging system, social network, or a micro-blogging service, $Projectname supports the uploading of files, embedding of videos, linking web pages.
[h4]Previewing/Editing[/h4]
-Post can be previewed prior to sending and edited after sending.
+Posts and comments can be previewed prior to sending and edited after sending.
[h4]Voting/Consensus[/h4]
Posts can be turned into "consensus" items which allows readers to offer feedback, which is collated into "agree", "disagree", and "abstain" counters. This lets you gauge interest for ideas and create informal surveys.
@@ -206,4 +201,4 @@ $Projectname can be extended in a number of ways, through site customisation, pe
[h4]API[/h4]
-An API is available for use by third-party services. This is based originally on the early Twitter API (for which hundreds of third-party tools exist). It is currently being extended to provide access to facilities and abilities which are specific to $Projectname. Access may be provided by login/password or OAuth and client registration of OAuth applications is provided.
+An API is available for use by third-party services. A plugin also provides a basic implementation of the Twitter API (for which hundreds of third-party tools exist). Access may be provided by login/password or OAuth, and client registration of OAuth applications is provided.
diff --git a/doc/about/hubzilla_project.bb b/doc/about/project.bb
index f9bc920f8..f9bc920f8 100644
--- a/doc/about/hubzilla_project.bb
+++ b/doc/about/project.bb
diff --git a/doc/addons.bb b/doc/addons.bb
index 6fa9510f5..85bb2dca3 100644
--- a/doc/addons.bb
+++ b/doc/addons.bb
@@ -2,12 +2,12 @@
[list=1]
[*] abcjsplugin - Create musical scores in your posts
[*] adultphotoflag - prevents nsfw photos from being displayed in public albums
+[*] authchoose - only send identity assertions to sites of friends
[*] b2tbtn - provide button to go directly to top of page if you are scrolled a long way down
[*] bbmath - use complex math expressions in your posts
[*] bookmarker - replace #^ with bookmark link in posts
[*] buglink - provide a bug reporting icon in the lower-left corner of every page
[*] calc - a scientific calculator
-[*] cdav - CalDAV/CardDAV server
[*] chess - cross domain identity aware interactive chess games
[*] chords - generate fingering charts and alternatives for every known guitar chord
[*] custom_home - set a custom page as the hub start page
@@ -15,15 +15,19 @@
[*] dirstats - show some interesting statistics generated by the directory server
[*] docs - alternate documentation pages
[*] donate - provides a project donation page
+[*] dreamhost - provide a more reliable service on Dreamhost shared hosting
[*] dwpost - crosspost to Dreamwidth
+[*] emojione - allow emojis as emoticons
[*] extcron - use an external cron service to run your hub's scheduled tasks
+[*] firefox - provide a link to install the Firefox Sharing API
[*] flattrwidget - provides a "Flattr Us" button
[*] flip - create upside down text
[*] fortunate - displays random quote (fortune cookie). Requires setting up a fortune server.
[*] friendica - Friendica (DFRN) protocol. Under development.
[*] frphotos - import photo albums from Friendica
[*] gnusoc - GNU-Social (OStatus) protocol. Under development.
-[*] hexit - headecimal conversion tool
+[*] hexit - hexadecimal conversion tool
+[*] hilite - allow language-specific highlighted code blocks in posts
[*] hubwall - send an admin email to all hub accounts
[*] ijpost - crosspost to Insanejournal
[*] irc - connect to IRC chatrooms
@@ -50,6 +54,7 @@
[*] nsfw - Highly recommended plugin to collpase posts with inappropriate content
[*] openclipatar - choose a profile photo from hundreds of royalty free images
[*] openid - OpenID authentication and OpenID server. Your OpenID URL is [observer.baseurl]/id/[observer.webname]
+[*] opensearch - allow your site to become a browser search provider
[*] openstreetmap - render locations and maps using OpenStreetMap
[*] pageheader - display text at the top of every page on the site
[*] phpmailer - alternate mail delivery system with more configurability
@@ -71,7 +76,7 @@
[*] smiley_pack - extend the built-in smilie (emoticon) support
[*] smileybutton - provides a smiley selector on the post window
[*] startpage - set a personal preferred page to redirect after logging in.
-[*] statistics_json - Diaspora statistics generator
+[*] statistics - Diaspora statistics generator
[*] statusnet - GNU-social and StatusNet crosspost [zrl=[baseurl]/help/addons_gnusocial]Posting To Gnu Social[/zrl]
[*] std_embeds - allow unfiltered embeds for popular providers like youtube, vimeo and soundcloud
[*] superblock - Highly recommended - completely block an offensive channel from your stream
@@ -79,9 +84,12 @@
[*] tictac - 3D tic-tac-toe
[*] torch - flashlight app
[*] tour - feature tour for new members
+[*] tripleaes - demo plugin for providing custom encryption algorithms
[*] twitter - crosspost to Twitter
+[*] twitter_api - Twitter/Statusnet compatible API
[*] upload_limits - discover what server setting (there are a few) may be causing large photo uploads to fail
[*] visage - show visitors to your channel
+[*] webmention - process webmentions
[*] wholikesme - provides a page to display what connections have 'liked' your posts the most
[*] webRTC - use an external server (mayfirst.org) to negotiate webRTC hookups
[*] wppost - crosspost to WordPress (or other wordpress XMLRPC service)
diff --git a/doc/admin/administrator_guide.md b/doc/admin/administrator_guide.md
index c233d8564..9e0ee3c59 100644
--- a/doc/admin/administrator_guide.md
+++ b/doc/admin/administrator_guide.md
@@ -150,7 +150,7 @@ web-based administrative tools to function:
#### Official addons
##### Installation
-Navigate to your webThen you should clone the addon repository (separately). We'll give this repository a nickname of 'hzaddons'. You can pull in other hubzilla addon repositories by giving them different nicknames::
+Navigate to your website. Then you should clone the addon repository (separately). We'll give this repository a nickname of 'hzaddons'. You can pull in other hubzilla addon repositories by giving them different nicknames::
cd mywebsite
util/add_addon_repo https://github.com/redmatrix/hubzilla-addons.git hzaddons
@@ -162,7 +162,7 @@ For keeping the addon tree updated, you should be on your top level website dire
util/update_addon_repo hzaddons
Create searchable representations of the online documentation. You may do this
- any time that the documentation is updated :
+any time that the documentation is updated :
cd mywebsite
util/importdoc
@@ -196,59 +196,35 @@ The installation script was originally designed for a small hardware server behi
1. `service apache2 reload`
1. Open your domain with a browser and step throught the initial configuration of $Projectname.
-### Server Roles
+### Recommended Addons
-$Projectname can be configured in many different ways. One of the configurations available at installation is to select a 'server role'. There are currently three server roles. We highly recommend that you use 'standard' unless you have special needs.
+We recommend the following addons be installed on all public sites:
+ nsfw - hide inappropriate posts/comments
+ superblock - block content from offensive channels
-#### Basic
+### Federation Addons
-The 'basic' server role is designed to be relatively simple, and it doesn't present options
-or complicated features. The hub admin may configure additional features at a site level.
-This role is designed for simple social networking and social network federation. Many features
-which do not federate easily have been removed, including (and this is somewhat important)
-"nomadic identity". You may move a channel to or from a basic server, but you may not clone
-it. Once moved, it becomes read-only on the origination site. No updates of any kind will be
-provided. It is recommended that after the move, the original channel be deleted - as it is
-no longer useable. The data remains only in case there are issues making a copy of the data.
+Several web communities have begun to converge using common protocols. The protocols involved are somewhat limited in their abilities. The GNU-Social protocol for instance offers no privacy modes, and the Diaspora protocol is somewhat restrictive in what kinds of communications are allowed. All comments must be signed in a very unique manner by the original author. The ActivityPub protocol is also being considered and may be supported at a future date. No other existing protocol supports nomadic location as used by this project. This presents some support challenges as some features work with some networks and don't work with others. Nevertheless the federation protocols allow connections to be made to a much larger community of people worldwide. They are provided as addons.
-This role is supported by the hubzilla community.
+> diaspora - The Diaspora Protocol used by Diaspora and Friendica. You should enable 'Diaspora Statistics' (statistics) first to enable all the available features.
-#### Standard
+> gnusoc - The GNU-Social Protocol, used by GNU-Social, Mastodon and several other communities. This addon requires you first install the 'pubsubhubbub' service (also an addon).
+Each member of your site must choose whether or not to allow these protocols individually as they may conflict with several desirable core features and abilities of this software (such as channel migration and cloning). They do this from their 'Settings -> Feature/Addon Settings' page. The administrator may also set the following:
-The 'standard' server role is recommended for most sites. All features of the software are
-available to everybody unless locked by the hub administrator. Some features will not federate
-easily with other networks, so there is often an increased support burden explaining why
-sharing events with Diaspora (for instance) presents a different experience on that network.
-Additionally any member can enable "advanced" or "expert" features, and these may be beyond
-their technical skill level. This may also result in an increased support burden.
+ util/config system.diaspora_allowed 1
+ util/config system.gnusoc_allowed 1
-This role is supported by the hubzilla community.
+and enable these protocols automatically for all newly created channels.
-#### Pro
-The 'pro' server role is primarily designed for communities which want to present a uniform
-experience and be relieved of many federation support issues. In this role there is
-**no federation with other networks**. Additional features **may** be provided, such
-as channel ratings, premium channels, and e-commerce.
-By default a channel may set a "techlevel" appropriate to their technical skill. Higher
-levels provide more features. Everybody starts with techlevel 0 (similar to the 'basic'
-role) where all complicated features are hidden from view. Increasing the techlevel provides
-more advanced or complex features.
+
-The hub admin may also lock individual channels or their entire site at a defined techlevel
-which provides an installation with a selection of advanced features consistent with the
-perceived technical skills of the members. For instance, a community for horse racing might
-have a different techlevel than a community for Linux kernel developers.
-
-This role is not supported by the hubzilla community.
### Techlevels
-Techlevels is a unique feature of Hubzilla 'pro'. It is not available in other server_roles, although it expands on the concepts introduced in $Projectname 'basic'.
-
We've implemented several different mechanisms in order to reduce the apparent complexity and learning curve presented to new members. At the same time, we do not wish to limit any functionality for people who are able to grasp some slightly advanced technical technical features. The first mechanism was to move several features to an optional 'Features' page where they could be enabled at will; with the default interface kept somewhat lean.
The problem we had now is that the number of features began to grow dramatically, and the Feature page is daunting in possibilities. There are also features present which probably should not be available to all members, but may be extremely useful to those with technical backgrounds.
@@ -257,8 +233,7 @@ The techlevels seeeks to remedy this by grouping features within different level
When a new member registers, their account is provided a techlevel setting of 0. On the account settings page they may change this to any available level. A higher level opens more advanced features and possible interactions.
-The account administrator may also lock a particular level, lock a maximum level, or change/re-arrange the features available to any level. Those with the minimum level are typically not very exploratory and are unlikely to discover the advanced modes. This is by design. Those that look around and desire more interactions will find them. In the absence of administrator defaults they may choose any level. As they look at the features available to the level in question, it is generally expected that they will discover some features are beyond their comprehension and it is hoped they will back off to a level where the interface and features are comfortable to their skill level. This is somewhat experimental at present and for that reason is not part of the 'standard' server role. The standard server role is preset to level '5', and the basic server role is preset to level '0', with no possibility of change. Members in these roles may find themselves overwhelmed or underwhelmed by the feature set and complexity.
-
+The account administrator may also lock a particular level, lock a maximum level, or change/re-arrange the features available to any level. Those with the minimum level are typically not very exploratory and are unlikely to discover the advanced modes. This is by design. Those that look around and desire more interactions will find them. In the absence of administrator defaults they may choose any level. As they look at the features available to the level in question, it is generally expected that they will discover some features are beyond their comprehension and it is hoped they will back off to a level where the interface and features are comfortable to their skill level.
### Service Classes
diff --git a/doc/bugs.bb b/doc/bugs.bb
index f50337648..cc1ea3a20 100644
--- a/doc/bugs.bb
+++ b/doc/bugs.bb
@@ -1,31 +1,32 @@
[h2]Bugs, Issues, and things that go bump in the night...[/h2]
[h3]Something went wrong! Who is charge of fixing it?[/h3]
-[b]Hubzilla Community Server[/b]
+[b]$Projectname Community Server[/b]
-Hubzilla Community Server is open source software which is maintained by "the community" - essentially unpaid volunteers.
+$Projectname Community Server is open source software which is maintained by "the community" - essentially unpaid volunteers. Nobody is in charge of fixing bugs. We work together to keep the software and network running smoothly and error free. You are a member of this community, so we also require your help to provide quality software. There are no mythical "developers" who magically fix everything. It's up to all of us to pitch in and help.
The first thing you need to do is talk to your hub administrator - the person who runs and manages your site. They are in the unique position of having access to the internal software and database and [b]logfiles[/b] and will need to be involved in fixing your problem. Other people "on the net" can't really help with this. The first thing the hub administrator needs to do is look at their logs and/or try to reproduce the problem. So try to be as helpful and courteous as possible in helping them look into the problem.
-To find your hub administrator (if you don't know who they are) please look at [url=[baseurl]/siteinfo]this page[/url]. If they have not provided any contact info on that page or provided an "Impressum" there, see [url=[baseurl]/siteinfo/json]this site info summary[/url] under the heading "admin:".
+To find your hub administrator (if you don't know who they are) please look at [url=[baseurl]/siteinfo]this page[/url]. If they have not provided any contact info on that page or provided an "Impressum" there, see [url=[baseurl]/siteinfo.json]this site info summary[/url] under the heading "admin:".
+
+It is highly recommended that bug reports be filed by hub administrators so that they can include the relevant logfile and database information relevant to the issue and be available to try workarounds and followup tests. Without this level of cooperation it may not be possible to fix the problem.
[h3]I'm a hub administrator; what do I do?[/h3]
-The software instructions which provide this server are open source and are available for your inspection. If an error message was reported, often one can do a search on the source files for that error message and find out what triggered it. With this information and the site logfiles it may be possible to figure out the sequence of events leading to the error. There could also be other sites involved, and the problem may not even be on your site but elsewhere in the network. Try to pin down the communication endpoints (hubs or sites) involved in the problem and contact the administrator of that site or those sites. Please try and provide an event time of when things went wrong so it can be found in the logs. Work with the other administrator(s) to try and find the cause of the problem. Logfiles are your friend. When something happens in the software that we didn't expect, it is nearly always logged.
+The software instructions which provide this web service are open source and are available for your inspection. We encourage everybody to read it and see how everything works and verify that we aren't doing anything evil or negligent with your personal communications. If an error message was reported, often one can do a search on the source files for that error message and find out what triggered it. With this information and the site logfiles it may be possible to figure out the sequence of events leading to the error. There could also be other sites involved, and the problem may not even be on your site but elsewhere in the network. Try to pin down the communication endpoints (hubs or sites) involved in the problem and contact the administrator of that site or those sites. Please try and provide an event time of when things went wrong so it can be found in the logs. Work with the other administrator(s) to try and find the cause of the problem. Logfiles are your friend. When something happens in the software that we didn't expect, it is nearly always logged.
[h3]The white screen of death[/h3]
-If you get a blank white screen when doing something, this is almost always a code or syntax error. There are instructions in your .htconfig.php file for enabling syntax logging. We recommend all sites use this. With syntax logging enabled repeat the sequence which led to the error and it should log the offending line of code. Hopefully you will be able to fix the problem with this information. When you do, please submit the fix "upstream" so that we can share the fix with the rest of the project members and other communities. This is a key benefit of using open source software - we share with each other and everybody benefits.
+If you get a blank white screen when doing something, this is almost always a code or syntax error. There are instructions in the site .htconfig.php file which will allow the site administrator to enabling syntax logging. We recommend all sites use this. With syntax logging enabled repeat the sequence which led to the error and it should log the offending line of code. Hopefully you will be able to fix the problem with this information. When you do, please submit the fix "upstream" so that we can share the fix with the rest of the project members and other communities. This is a key benefit of using open source software - we share with each other and everybody benefits.
[h3]I'm stumped. I can't figure out what is wrong.[/h3]
-At this point it might be worthwhile discussing the issue on one of the online forums. There may be several of these and some may be more suited to your spoken language. As a last resort, try "Channel One", which is in English.
+At this point it might be worthwhile discussing the issue on one of the online forums. There may be several of these and some may be more suited to your spoken language. At this time, the 'Hubzilla Support' channel (support@gravizot.de) is the recommended forum for discussing bugs.
-If the community developers can't help you right away, understand that they are volunteers and may have a lot of other work and demands on their time. At this point you need to file a bug report. You will need an account on github.com to do this. So register, and then visit https://github.com/redmatrix/hubzilla/issues
-. Create an issue here and provide all the same information that you provided online. Don't leave out anything.
+If community members with software engineering training/expertise can't help you right away, understand that they are volunteers and may have a lot of other work and demands on their time. At this point you need to file a bug report. You will need an account on github.com to do this. So register, and then visit https://github.com/redmatrix/hubzilla/issues . Create an issue here and provide all the same information that you provided online. Don't leave out anything.
-Then you wait. If it's a high profile issue, it may get fixed quickly. But nobody is in charge of fixing bugs. If it lingers without resolution, please spend some more time investigating the problem. Ask about anything you don't understand related to the behaviour. You will learn more about how the software works and quite possibly figure out why it isn't working now. Ultimately it is somebody in the community who is going to fix this and you are a member of the community; and this is how the open source process works.
+Then you wait. If it's a high profile issue, it may get fixed quickly. But nobody is in charge of fixing bugs. If it lingers without resolution, please spend some more time investigating the problem. Ask about anything you don't understand related to the behaviour. You will learn more about how the software works and quite possibly figure out why it isn't working now. Ultimately it is somebody in the community who is going to fix this and you are a member of the community; and this is how the open source process works.
-Other developers working to fix the problem may need to find out more, so do your homework and document what is happening and everything you've tried. Don't say "I did xyz and it didn't work." That doesn't tell us anything. Tell us precisely what steps you took and what you expected the result to be, and precisely what happened as a result. If there were any error messages, don't say "there was an error message". Tell us exactly what the message said. Tell us what version you're running and any other details that may be unique about your site configuration.
+Other people working to fix the problem may need to find out more, so do your homework and document what is happening and everything you've tried. Don't say "I did xyz and it didn't work." That doesn't tell us anything. Tell us precisely what steps you took and what you expected the result to be, and precisely what happened as a result. What page/URL were you looking at or what form were you filling in? If there were any error messages, don't say "there was an error message". Tell us exactly what the message said. Also tell us what hub you are using, what software version you're running and any other details that may be unique about your site configuration. It is understood that you might wish to keep some information and your connections private, however if you aren't willing to share the information other people need to reproduce/fix the problem, it may not get fixed.
\ No newline at end of file
diff --git a/doc/developer/api_zot.bb b/doc/developer/api_zot.bb
index ddca65b4d..b2c19d7a1 100644
--- a/doc/developer/api_zot.bb
+++ b/doc/developer/api_zot.bb
@@ -4,7 +4,20 @@ The API endpoints detailed below are relative to [code]api/z/1.0[/code], meaning
[h3]channel/export/basic[/h3]
-Export channel data
+Export basic channel data
+
+Options:
+ - sections
+ comma-separated list of data types to export
+
+ - posts
+ if true, return default sections plus 3 months of posts
+
+ If no sections are requested, the following sections are returned:
+ channel, connections, config, apps, chatrooms, events, webpages, mail, wikis
+
+ Files and large collections of posts may run into memory limits; these must generally be
+ requested separately.
[h3]channel/stream[/h3]
@@ -608,7 +621,7 @@ Optional:
application or network name to display with item
-- categories
+- category
comma separated categories for this item
diff --git a/doc/hook/author_is_pmable.bb b/doc/hook/author_is_pmable.bb
index 708350673..11d1185f3 100644
--- a/doc/hook/author_is_pmable.bb
+++ b/doc/hook/author_is_pmable.bb
@@ -6,7 +6,7 @@ By default author_is_pmable() returns true for 'zot' xchans, and false for all o
The plugin is passed an array
- [ 'xchan' => $author_xchan, 'result' => 'unset' ]
+ [ 'xchan' => $author_xchan, 'abook' => abook record, 'result' => 'unset' ]
A plugin which sets the 'result' to something besides 'unset' will over-ride the default behaviour. A value of true will enable the 'send mail' link and the private mail recipient will be set to the author's xchan_hash. A value of false will disable the 'send mail' link.
diff --git a/doc/hook/can_comment_on_post.bb b/doc/hook/can_comment_on_post.bb
new file mode 100644
index 000000000..2cfd3b2da
--- /dev/null
+++ b/doc/hook/can_comment_on_post.bb
@@ -0,0 +1,13 @@
+[h3]can_comment_on_post[/h3]
+
+Called when deciding whether or not to display a comment box for a post.
+
+
+Hook data (array):
+ observer_hash => xchan_hash of current observer
+ item => posted item
+ allowed => 'unset'
+
+
+To over-ride the default behaviour, change allowed to true or false
+
diff --git a/doc/hook/connection_remove.bb b/doc/hook/connection_remove.bb
new file mode 100644
index 000000000..bd13ae5f2
--- /dev/null
+++ b/doc/hook/connection_remove.bb
@@ -0,0 +1,9 @@
+[h3]connection_remove[/h3]
+
+Called when deleting a connection.
+
+
+Passed parameter array:
+
+ 'channel_id' => channel_id of the channel removing the connection
+ 'abook_id' => abook_id of the connection being removed
diff --git a/doc/hook/legal_webbie.bb b/doc/hook/legal_webbie.bb
new file mode 100644
index 000000000..8c7d32d56
--- /dev/null
+++ b/doc/hook/legal_webbie.bb
@@ -0,0 +1,10 @@
+[h2]legal_webbie[/h2]
+
+Called when validating a channel address. By default the valid characters are
+a-z,0-9,-,_, and . Uppercase ASCII characters are folded to lower and any invalid characters are stripped.
+
+Some federated networks require more restrictive rules.
+
+The hook is called with an array [ 'input' => (supplied text), 'output' => (validated text) ]
+
+A plugin will generally perform a regex filter or text operation on 'input' and provide the results in 'output'. \ No newline at end of file
diff --git a/doc/hook/legal_webbie_text.bb b/doc/hook/legal_webbie_text.bb
new file mode 100644
index 000000000..32c74c93b
--- /dev/null
+++ b/doc/hook/legal_webbie_text.bb
@@ -0,0 +1,7 @@
+[h2]legal_webbie_text[/h2]
+
+Returns a string describing the text rules applied to legal_webbie().
+
+Called with an array [ 'text' => (descriptive text describing text character limitations) ]
+
+A plugin should return the description of the allowed characters and operation performed in the 'legal_webbie' hook to assist people when creating a new channel. \ No newline at end of file
diff --git a/doc/hooklist.bb b/doc/hooklist.bb
index 6933edad2..da4d9596b 100644
--- a/doc/hooklist.bb
+++ b/doc/hooklist.bb
@@ -82,6 +82,9 @@ Hooks allow plugins/addons to "hook into" the code at many points and alter the
[zrl=[baseurl]/help/hook/build_pagehead]build_pagehead[/zrl]
Called when creating the HTML page header
+[zrl=[baseurl]/help/hook/can_comment_on_post]can_comment_on_post[/zrl]
+ Called when deciding whether or not to present a comment box for a post
+
[zrl=[baseurl]/help/hook/change_channel]change_channel[/zrl]
Called when logging in to a channel (either during login or afterward through the channel manager)
@@ -118,6 +121,9 @@ Hooks allow plugins/addons to "hook into" the code at many points and alter the
[zrl=[baseurl]/help/hook/connect_premium]connect_premium[/zrl]
Called when connecting to a premium channel
+[zrl=[baseurl]/help/hook/connection_remove]connection_remove[/zrl]
+ Called when deleting/removing a connection
+
[zrl=[baseurl]/help/hook/connector_settings]connector_settings[/zrl]
Called when posting to the features/addon settings page
@@ -317,6 +323,12 @@ Hooks allow plugins/addons to "hook into" the code at many points and alter the
[zrl=[baseurl]/help/hook/jot_tool]jot_tool[/zrl]
Deprecated and possibly obsolete. Allows one to add action buttons to the post editor.
+[zrl=[baseurl]/help/hook/legal_webbie]legal_webbie[/zrl]
+ Called to validate a channel address
+
+[zrl=[baseurl]/help/hook/legal_webbie_text]legal_webbie_text[/zrl]
+ Provides an explanation of text/character restrictions for legal_webbie()
+
[zrl=[baseurl]/help/hook/load_pdl]load_pdl[/zrl]
Called when we load a PDL file or description
diff --git a/doc/member/bbcode.html b/doc/member/bbcode.html
index a4bc813d8..9b7080a32 100644
--- a/doc/member/bbcode.html
+++ b/doc/member/bbcode.html
@@ -26,6 +26,9 @@
<td><code>[color=red]red[/color]</code></td><td><span style="color: red;">red</span></td>
</tr>
<tr>
+ <td><code>[hl]highlighted[/hl]</code></td><td><span style="background-color: yellow;">highlighted</span></td>
+ </tr>
+ <tr>
<td><code>[font=courier]some text[/font] </code></td><td><span style="font-family: courier;">some text</span></td>
</tr>
<tr>
@@ -61,8 +64,10 @@ text</code></td><td>
</table>
<h3>Code blocks</h3>
-Code can be rendered generically in a block or inline format (depending on if there are new line characters in the text), or you can specify a supported language for enhanced syntax highlighting. Supported languages include <strong>php, css, mysql, sql, abap, diff, html, perl, ruby, vbscript, avrc, dtd, java, xml, cpp, python, javascript, js, json, sh </strong>.
+Code can be rendered generically in a block or inline format (depending on if there are new line characters in the text), or you can specify a supported language for enhanced syntax highlighting. Syntax highlighting requires a suitable rendering plugin such as <strong>hilite</strong>. Supported languages with the hilite plugin include <strong>php, css, mysql, sql, abap, diff, html, perl, ruby, vbscript, avrc, dtd, java, xml, cpp, python, javascript, js, json, sh </strong>.
<br><br>
+If a rendering plugin is not installed or an unsupported language is specified, the output for syntax highlighted code blocks is the same as the block format code tag.
+<br><br>
<table class="table table-responsive table-bordered">
<tbody>
<tr>
diff --git a/doc/member/member_guide.bb b/doc/member/member_guide.bb
index 50f0b581b..0a2d11a88 100644
--- a/doc/member/member_guide.bb
+++ b/doc/member/member_guide.bb
@@ -174,19 +174,29 @@ You can also delegate control of your channels' posts and connections, but not i
[h3]Connecting To Channels[/h3]
-Connections in $Projectname 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?
+Connections in $Projectname can take on a great many different meanings. A connection is more accurately defined as a set of permissions that you have granted to somebody else. In traditional social network applications, all connections are granted the same permissions; or at most there two levels (friends and 'followers'). In $Projectname, a range of separate permissions may be set/adjusted depending on the siutation and relationship you have with the other channel. You can allow somebody to view your posts but not your photos. You can also deny them permission to comment on your posts or send private mail to you. 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 &quot;Can send me their channel stream and posts&quot; permission to &quot;Anybody in this network&quot; 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 $Projectname 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.
+The next thing you can do is look at the Directory. The directory is available on every $Projectname 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.
+
+If you already know somebody's 'webbie' you can connect with them directly. A webbie looks just like an email address (for instance bob@example.com) but refers to somebody in the open social web. In order to connect they must be using a compatible network protocol. By default, this software supports the 'zot' protocol, however additional protocols may be provided through plugins/addons. See below for more information on connecting to channels on other networks.
To connect with other $Projectname 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 &quot;connect&quot;. 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, &quot;Full Sharing&quot; 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 &quot;Submit&quot;.
+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 &quot;connect&quot;. 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 wish to make any changes.
+
+You may also connect with any channel by visiting the &quot;Connections&quot; page of your site or the Directory and typing their &quot;webbie&quot; into the &quot;Add New Connection&quot; field. Use this method if somebody tells you their webbie and you wish to connect with them. The process is the same as connecting via the &quot;Connect&quot; button - you will then be taken to the connection editor to set permissions.
+
+To connect with channels on other networks:
+
+The process for connecting to channels on other networks (such as GNU-Social, Mastodon, and Diaspora) is similar - type their &quot;webbie&quot; into the &quot;Add New Connections&quot; box on the &quot;Connections&quot; page. Before you do this however, please visit your Settings page (Feature/Addon Settings) and ensure that the relevant protocol (Diaspora or GNU-Social) is provided on your hub and [b][i]activated[/i] for your channel[/b]. These networks/protocols do not support account migration and location independence so if you move location or clone your channel elsewhere, communications with these connections may fail. For this reason these protocols are not activated by default, but only through your consent. Activating these protocols involves an important decision between communicating with friends on these networks or providing fail-safe account resilience if your server fails.
+
+To connect with RSS feeds:
-You may also connect with any channel by visiting the &quot;Connections&quot; page of your site or the Directory and typing their &quot;webbie&quot; into the &quot;Add New Connection&quot; 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 &quot;bob@example.com&quot;. The process is the same as connecting via the &quot;Connect&quot; button - you will then be taken to the connection editor to set permissions.
+Your hub admin may allow connecting to RSS feeds. The process for connecting to an RSS feed is the same, exept type (or paste) the URL of the feed into the &quot;Add New Connection&quot; box. Feeds are only processed once or twice per day and your hub admin may impose limits on how many feeds you may add.
-[h4] Block/Ignore/Archive/Hide channels [/h4]
+[h4]Block/Ignore/Archive/Hide channels [/h4]
Channels in your address book can have statuses such as [i]blocked[/i], [i]ignored[/i], [i]archived[/i] and [i]hidden[/i]. From your connections page you can see tabs that display the channels with those statuses. From your edit connection pages you can change the statuses of a channel.
@@ -279,7 +289,7 @@ We highly recommend that you use the "typical social network" settings when you
[i]Note:[/i]
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 &quot;only those I specifically allow&quot;, you may specify indivudal permissions on the connnection edit screen.
+If you have set any of these permissions to &quot;only those I specifically allow&quot;, you may specify individual permissions on the connnection edit screen.
[h4]Affinity[/h4]
@@ -348,7 +358,7 @@ Topical tags are indicated by preceding the tag name with the # character. This
Topical tags are also not linked if they are purely numeric, e.g. #1. If you wish to use a numeric hashtag, please add some descriptive text such as #2012-elections.
[h4]Bookmarks[/h4]
-Bookmarks indicate a link which can be saved to your bookmark folder. They use the sequence #^ followed by the link. Often these are generatd automatically. If the 'bookmarker' addon is installed, this sequence will be converted to a bookmark icon when viewing the post or comment online and clicking the icon will save the bookmark. If the bookmarker addon is not installed, the post 'dropdown menu' contains a link for saving the bookmark or bookmarks.
+Bookmarks indicate a link which can be saved to your bookmark folder. They use the sequence #^ followed by the link. Often these are generated automatically. If the 'bookmarker' addon is installed, this sequence will be converted to a bookmark icon when viewing the post or comment online and clicking the icon will save the bookmark. If the bookmarker addon is not installed, the post 'dropdown menu' contains a link for saving the bookmark or bookmarks.
[h4]Spaces in Tags and Mentions[/h4]
Where possible please use the auto-complete window to select tag and mention recipients, because it will generate a coded tag which uniquely identifies one channel. Names are sometimes ambiguous. However, you can "manually" tag a channel by matching the channel name or address.
@@ -687,14 +697,8 @@ This places a block named &quot;contributors&quot; in this region. Additionally
The variable [var=wrap]none[/var] in a block removes the wrapping div element from the block.
[h4]Widgets[/h4]
-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
+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. System widgets are listed [url=help/Widgets]here[/url]. Widgets can also ve created by plugins, themes, or your site administrator to provide additional functionality.
-[code]
- 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
-
-[/code]
Widgets and arguments are specified with the 'widget' and 'var' tags.
[code]
@@ -995,7 +999,7 @@ The saved search widget will provide autocompletion of channels (the results are
[h4]Remove Channel[/h4]
-Go to the bottom of your channel settings page or visit the URL:
+Select the 'Remove Channel' link on your channel settings page or visit the URL:
[baseurl]/removeme
@@ -1007,7 +1011,7 @@ If you have identity clones on other hubs this only removes by default the chan
[h4]Remove Account[/h4]
-Go to the bottom of your account settings page or visit the URL:
+Select 'Remove Account' from your account settings page or visit the URL:
[baseurl]/removeaccount
@@ -1016,3 +1020,4 @@ You will need to confirm your password and the account you are currently logged
[hl][i][b]This is irreversible.[/b][/i][/hl]
All your channels will be deleted. If you have identity clones on other hubs this only removes by default the channels instances which exists on this hub.
+
diff --git a/doc/toc.html b/doc/toc.html
index 11635930e..4da01d55d 100644
--- a/doc/toc.html
+++ b/doc/toc.html
@@ -7,8 +7,8 @@
</div>
<div id="about" class="doco-section">
<div class="flex-column">
- <a class="nav-link" href="/help/about/about_hubzilla">About Hubzilla</a>
- <a class="nav-link" href="/help/about/hubzilla_project">Hubzilla project</a>
+ <a class="nav-link" href="/help/about/about">About</a>
+ <a class="nav-link" href="/help/about/project">Project</a>
<a class="nav-link" href="/help/about/about_hub">About this hub</a>
</div>
</div>
@@ -23,6 +23,7 @@
<div class="flex-column">
<a class="nav-link" href="/help/member/member_guide">Guide</a>
<a class="nav-link" href="/help/member/bbcode">BBcode Reference</a>
+ <a class="nav-link" href="/help/bugs">Reporting Bugs</a>
<a class="nav-link" href="/help/member/member_faq">FAQ</a>
</div>
</div>
@@ -84,6 +85,7 @@
tocUl.removeClass(); // Classes are automatically added to <ul> elements by something else
tocUl.toc({content: "#doco-content", headings: "h3"});
tocUl.addClass('toc-content');
+ tocUl.addClass('list-unstyled');
tocUl.attr('id', 'doco-side-toc');
}
diff --git a/doc/tutorials/personal_channel.html b/doc/tutorials/personal_channel.html
index f2ad87077..9dbc2aaec 100644
--- a/doc/tutorials/personal_channel.html
+++ b/doc/tutorials/personal_channel.html
@@ -6,7 +6,7 @@ to a personal channel in a natural way.</p>
<h3 id="Create_a_new_channel">Create a new channel</h3>
<p>When you log in for the first time after registering, you must create a channel.
-(Alternatively you can load https://grid.reticu.li/new_channel)</p>
+(Alternatively you can visit https://your_website/new_channel)</p>
<p><img class="img-responsive" src="/help/tutorials/assets/c9a880cc82ffa1f7c2f460397bb083bf7dc2a2b8f065e64da598b45b4a2b.png" alt="image"></p>
@@ -76,7 +76,7 @@ so you can specify exactly who can access this post.</p>
<h3 id="Use_an_uploaded_image_as_a_channel_cover_photo">Use an uploaded image as a channel cover photo</h3>
<p>One way to add some pizzazz your channel is to add a cover photo that visitors will
-see when they load your channel page. Hubzilla's integrated cloud file system
+see when they load your channel page. The integrated cloud file system
allows you to choose an existing photo for this purpose.</p>
<p>Visit your photos in the <strong>Photos</strong> app</p>
@@ -99,9 +99,9 @@ channel page will fade in as you scroll down.</p>
<h3 id="Make_a_connection">Make a connection</h3>
-<p>Making connections between channels to share things is what Hubzilla is all about.
+<p>Making connections between channels to share things is what social communications are all about.
Making a connection is simple. If you do not already know how to reach a channel's home
-page, you might try a directory search by opening the <strong>Directory</strong> link on the right
+page, you might try a directory search by opening the <strong>Directory</strong> link from the menu on the right
side of the top navbar.</p>
<p><img class="img-responsive" src="/help/tutorials/assets/ef78bc6aa3fafebd46f353514c907b3fdfe019918fc5553bb3f31388a36f.png" alt="image"></p>
@@ -160,4 +160,4 @@ editor by pressing the edit button beside the <strong>Delete</strong> button.</p
<p><img class="img-responsive" src="/help/tutorials/assets/c4cad3e4c356dd2a227df79bd4dc6d47edf1b66ea243f005b6b452ec366b.png" alt="image"></p>
- \ No newline at end of file
+
diff --git a/images/red-koala.jpg b/images/red-koala.jpg
new file mode 100644
index 000000000..4cbedd264
--- /dev/null
+++ b/images/red-koala.jpg
Binary files differ
diff --git a/images/red-koala.png b/images/red-koala.png
new file mode 100644
index 000000000..005a37fe2
--- /dev/null
+++ b/images/red-koala.png
Binary files differ
diff --git a/images/red-koala.svg b/images/red-koala.svg
new file mode 100644
index 000000000..f303b32dd
--- /dev/null
+++ b/images/red-koala.svg
@@ -0,0 +1,151 @@
+<?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:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ version="1.1"
+ width="744.09448"
+ height="1052.3622"
+ id="svg2"
+ inkscape:version="0.48.2 r9819"
+ sodipodi:docname="red-koala.svg">
+ <sodipodi:namedview
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1"
+ objecttolerance="10"
+ gridtolerance="10"
+ guidetolerance="10"
+ inkscape:pageopacity="0"
+ inkscape:pageshadow="2"
+ inkscape:window-width="640"
+ inkscape:window-height="480"
+ id="namedview26"
+ showgrid="false"
+ inkscape:zoom="0.50332378"
+ inkscape:cx="476.12273"
+ inkscape:cy="572.78569"
+ inkscape:window-x="38"
+ inkscape:window-y="616"
+ inkscape:window-maximized="0"
+ inkscape:current-layer="svg2" />
+ <defs
+ id="defs4" />
+ <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></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ id="layer1"
+ transform="translate(0.17560932,-0.17560932)">
+ <path
+ d=""
+ id="path6167"
+ style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.08838835;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ inkscape:connector-curvature="0" />
+ <path
+ d="m 497.9857,1088.5424 c 0,-16.225 0.13752,-22.8625 0.30561,-14.75 0.16808,8.1125 0.16808,21.3875 0,29.5 -0.16809,8.1125 -0.30561,1.475 -0.30561,-14.75 z m 290.93182,18.5 c -0.002,-6.05 0.1606,-8.6539 0.36191,-5.7865 0.2013,2.8674 0.20315,7.8174 0.004,11 -0.19905,3.1826 -0.36376,0.8365 -0.36601,-5.2135 z m 17.08867,-37.5 c 0,-26.675 0.12889,-37.5875 0.28641,-24.25 0.15752,13.3375 0.15752,35.1625 0,48.5 -0.15752,13.3375 -0.28641,2.425 -0.28641,-24.25 z m 27.96202,27 c 0,-11.825 0.14466,-16.6625 0.32145,-10.75 0.1768,5.9125 0.1768,15.5875 0,21.5 -0.17679,5.9125 -0.32145,1.075 -0.32145,-10.75 z m -495.42476,10.5 c 1.29175,-1.375 2.57363,-2.5 2.84863,-2.5 0.275,0 -0.55688,1.125 -1.84863,2.5 -1.29175,1.375 -2.57363,2.5 -2.84863,2.5 -0.275,0 0.55688,-1.125 1.84863,-2.5 z m 68.27083,-7.1042 c 0.33229,-0.3322 1.19479,-0.3678 1.91667,-0.079 0.79773,0.3193 0.56078,0.5562 -0.60417,0.6042 -1.05416,0.043 -1.64479,-0.1929 -1.3125,-0.5252 z m 376.47917,-3.0581 c 0.6875,-0.2774 1.8125,-0.2774 2.5,0 0.6875,0.2774 0.125,0.5044 -1.25,0.5044 -1.375,0 -1.9375,-0.227 -1.25,-0.5044 z m -462.75,-2.8377 c 0.68469,-0.825 1.46989,-1.5 1.74489,-1.5 0.275,0 -0.0602,0.675 -0.74489,1.5 -0.68469,0.825 -1.46989,1.5 -1.74489,1.5 -0.275,0 0.0602,-0.675 0.74489,-1.5 z m 303.07895,-3.9167 c -0.0434,-1.0541 0.19293,-1.6447 0.52522,-1.3125 0.33229,0.3323 0.36781,1.1948 0.0789,1.9167 -0.31922,0.7977 -0.55618,0.5608 -0.60416,-0.6042 z m -281.80812,-4.1875 c 0.33229,-0.3322 1.19479,-0.3678 1.91667,-0.079 0.79773,0.3193 0.56078,0.5562 -0.60417,0.6042 -1.05416,0.043 -1.64479,-0.1929 -1.3125,-0.5252 z m 20.80812,-11.8125 c -0.0434,-1.0541 0.19292,-1.6447 0.52522,-1.3125 0.33229,0.3323 0.36781,1.1948 0.0789,1.9167 -0.31922,0.7977 -0.55618,0.5608 -0.60416,-0.6042 z m 0.0789,-7.5833 c 0,-1.375 0.22698,-1.9375 0.50439,-1.25 0.27741,0.6875 0.27741,1.8125 0,2.5 -0.27741,0.6875 -0.50439,0.125 -0.50439,-1.25 z m 477.84211,-13.5 c 0.68469,-0.825 1.46989,-1.5 1.74489,-1.5 0.275,0 -0.0602,0.675 -0.74489,1.5 -0.68469,0.825 -1.46989,1.5 -1.74489,1.5 -0.275,0 0.0602,-0.675 0.74489,-1.5 z m -588.60544,-20 c 0.002,-7.7 0.15853,-10.7178 0.34883,-6.7062 0.1903,4.0115 0.18902,10.3115 -0.003,14 -0.19189,3.6884 -0.34759,0.4062 -0.34603,-7.2938 z m 606,0 c 0.002,-7.7 0.15853,-10.7178 0.34883,-6.7062 0.1903,4.0115 0.18902,10.3115 -0.003,14 -0.19169,3.6884 -0.34739,0.4062 -0.34583,-7.2938 z m -585.39456,-1 c 1.29175,-1.375 2.57363,-2.5 2.84863,-2.5 0.275,0 -0.55688,1.125 -1.84863,2.5 -1.29175,1.375 -2.57363,2.5 -2.84863,2.5 -0.275,0 0.55688,-1.125 1.84863,-2.5 z m 454.75,-11.2322 c 2.3375,-0.2105 6.1625,-0.2105 8.5,0 2.3375,0.2105 0.425,0.3828 -4.25,0.3828 -4.675,0 -6.5875,-0.1723 -4.25,-0.3828 z m 43.96349,0 c 2.86742,-0.2013 7.81742,-0.2032 11,0 3.18258,0.1991 0.83651,0.3638 -5.21349,0.366 -6.05,0 -8.65393,-0.1606 -5.78651,-0.3619 z m 106.03651,-9.0063 c 3.9875,-0.1898 10.5125,-0.1898 14.5,0 3.9875,0.1898 0.725,0.3451 -7.25,0.3451 -7.975,0 -11.2375,-0.1553 -7.25,-0.3451 z M 454.81581,605.54241 c 0,-2.475 0.19502,-3.4875 0.43337,-2.25 0.23836,1.2375 0.23836,3.2625 0,4.5 -0.23835,1.2375 -0.43337,0.225 -0.43337,-2.25 z m -16.34805,-45.75 -2.42431,-2.75 2.75,2.42431 c 1.5125,1.33338 2.75,2.57088 2.75,2.75 0,0.78428 -0.8098,0.14598 -3.07569,-2.42431 z m 130.82569,-1.99507 c 5.0875,-0.18149 13.4125,-0.18149 18.5,0 5.0875,0.18149 0.925,0.32999 -9.25,0.32999 -10.175,0 -14.3375,-0.1485 -9.25,-0.32999 z m 159.5,-0.004 c 14.1625,-0.15649 37.3375,-0.15649 51.5,0 14.1625,0.15649 2.575,0.28452 -25.75,0.28452 -28.325,0 -39.9125,-0.12803 -25.75,-0.28452 z m 208.5,3e-5 c 13.8875,-0.15682 36.6125,-0.15682 50.5,0 13.88755,0.15682 2.525,0.28513 -25.25,0.28513 -27.775,0 -39.1375,-0.12831 -25.25,-0.28513 z M 388.81428,541.93824 c 0.33229,-0.33229 1.19479,-0.36781 1.91667,-0.0789 0.79773,0.31922 0.56078,0.55618 -0.60417,0.60416 -1.05416,0.0434 -1.64479,-0.19293 -1.3125,-0.52522 z"
+ id="path6242"
+ style="fill:#5f5b5b"
+ inkscape:connector-curvature="0" />
+ <path
+ d="m 552.98651,1088.0424 c -4.5e-4,-16.5 0.13655,-23.3903 0.30444,-15.3118 0.16789,8.0785 0.16826,21.5785 8.2e-4,30 -0.16745,8.4215 -0.30481,1.8118 -0.30526,-14.6882 z m 54.80912,26 c -0.0111,-2.2 0.18461,-3.2177 0.4349,-2.2617 0.25029,0.9561 0.25937,2.7561 0.0202,4 -0.23919,1.244 -0.44398,0.4617 -0.45508,-1.7383 z m -105.25218,-86 c 0.68469,-0.825 1.46989,-1.5 1.74489,-1.5 0.275,0 -0.0602,0.675 -0.74489,1.5 -0.68469,0.825 -1.46989,1.5 -1.74489,1.5 -0.275,0 0.0602,-0.675 0.74489,-1.5 z m 41.40499,-0.75 -1.90499,-2.25 2.25,1.905 c 2.11444,1.7902 2.70524,2.595 1.90499,2.595 -0.18976,0 -1.20226,-1.0125 -2.25,-2.25 z m 117.86584,-7.3542 c 0.33229,-0.3322 1.19479,-0.3678 1.91667,-0.079 0.79773,0.3193 0.56078,0.5562 -0.60417,0.6042 -1.05416,0.043 -1.64479,-0.1929 -1.3125,-0.5252 z M 545.72943,857.7944 c 9.17729,-0.16487 24.47729,-0.16517 34,-6.6e-4 9.52271,0.16451 2.01402,0.29941 -16.68598,0.29977 -18.7,3.6e-4 -26.49131,-0.13424 -17.31402,-0.29911 z m 183.06402,-10e-4 c 14.1625,-0.15649 37.3375,-0.15649 51.5,0 14.1625,0.15649 2.575,0.28452 -25.75,0.28452 -28.325,0 -39.9125,-0.12803 -25.75,-0.28452 z m 208.5,3e-5 c 13.8875,-0.15682 36.6125,-0.15682 50.5,0 13.88745,0.15682 2.525,0.28513 -25.25,0.28513 -27.775,0 -39.1375,-0.12831 -25.25,-0.28513 z M 382.78179,541.85533 c 0.95609,-0.25029 2.75609,-0.25937 4,-0.0202 1.24391,0.23919 0.46166,0.44398 -1.73834,0.45508 -2.2,0.0111 -3.21775,-0.18461 -2.26166,-0.4349 z m 139.26166,-55.31292 c -1.5808,-1.65 -2.64918,-3 -2.37418,-3 0.275,0 1.79338,1.35 3.37418,3 1.5808,1.65 2.64918,3 2.37418,3 -0.275,0 -1.79338,-1.35 -3.37418,-3 z"
+ id="path6236"
+ style="fill:#292222"
+ inkscape:connector-curvature="0" />
+ <g
+ id="g6312">
+ <g
+ id="g6286">
+ <g
+ transform="translate(43.475438,27.243334)"
+ id="g6190">
+ <g
+ id="g6035"
+ style="stroke:#000000;stroke-width:0.69999999;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none">
+ <path
+ d="m 230.00007,643.07523 c -3.43799,-0.73575 -5.99718,-1.74825 -5.68708,-2.25 0.3101,-0.50175 0.12499,-0.91227 -0.41135,-0.91227 -1.48706,0 -8.54066,-7.1481 -10.08081,-10.21587 -0.74992,-1.49373 -1.69468,-2.51118 -2.09947,-2.26101 -0.40479,0.25017 -1.34946,-0.32769 -2.09928,-1.28413 -1.2337,-1.57367 -1.19694,-1.60851 0.38669,-0.36655 1.82477,1.43109 2.46942,0.24698 0.78342,-1.43902 -0.99993,-0.99993 -5.85993,-14.40317 -6.50264,-17.93342 -0.20026,-1.1 -0.42292,-2 -0.49479,-2 -0.80622,0 -0.75379,-10.80804 0.0645,-13.29479 0.5963,-1.81214 1.42743,-5.63714 1.84696,-8.5 1.01816,-6.94791 1.28046,-7.7525 3.17755,-9.74688 0.89375,-0.93958 1.79375,-2.12857 2,-2.64219 0.6726,-1.67498 11.51235,-9.31614 13.21587,-9.31614 0.91252,0 1.65913,-0.46973 1.65913,-1.04384 0,-0.57411 0.5625,-0.95313 1.25,-0.84228 0.6875,0.11086 2.03333,-0.14096 2.99074,-0.5596 0.9574,-0.41863 3.9949,-0.56502 6.75,-0.32531 2.75509,0.23972 5.00926,0.0613 5.00926,-0.39656 0,-0.45783 0.47656,-0.83241 1.05902,-0.83241 0.58246,0 0.79485,0.42742 0.47199,0.94983 -0.51182,0.82814 2.33166,3.05017 3.90325,3.05017 1.48687,0 0.34183,-2.0101 -1.18426,-2.07895 -0.9625,-0.0434 -1.2463,-0.28632 -0.63067,-0.53977 0.80908,-0.3331 0.75814,-1.5092 -0.1838,-4.2432 -1.6748,-4.86113 -1.58978,-22.34502 0.14495,-29.80756 0.72638,-3.12478 1.11621,-6.01227 0.86629,-6.41664 -0.45531,-0.73672 3.57389,-13.97353 4.53969,-14.91388 0.28245,-0.275 1.38572,-2.21316 2.45172,-4.30703 1.066,-2.09387 2.94358,-4.89187 4.17239,-6.21777 1.22881,-1.32591 2.51101,-3.28292 2.84934,-4.3489 0.7171,-2.25937 11.83409,-14.1263 13.23359,-14.1263 0.52178,0 3.06923,-2.03183 5.661,-4.51518 l 4.7123,-4.51517 -3.47612,-3.57925 c -1.91186,-1.96858 -3.94674,-3.28838 -4.52194,-2.93288 -0.58125,0.35923 -0.84131,0.068 -0.58544,-0.65558 0.60298,-1.70518 -1.691,-4.6672 -3.5363,-4.56613 -5.13701,0.28137 -7.97051,-0.4819 -10.09204,-2.71853 -1.29523,-1.3655 -2.7246,-2.4905 -3.17639,-2.5 -1.88718,-0.0397 -8.08561,-8.54966 -7.23261,-9.92984 0.31483,-0.50941 -0.10671,-1.60534 -0.93677,-2.43539 -0.83005,-0.83006 -1.50919,-2.11633 -1.50919,-2.85838 0,-0.74205 -0.7875,-2.06805 -1.75,-2.94666 -5.45757,-4.98188 -7.84532,-8.79242 -10.76413,-17.17818 -2.03246,-5.83926 -2.92733,-9.89511 -2.46426,-11.16883 0.39992,-1.1 0.3336,-2.75804 -0.14738,-3.68453 -1.00661,-1.93897 0.14895,-5.54804 3.06731,-9.57991 1.08904,-1.50456 2.22871,-4.91121 2.53261,-7.57033 0.30389,-2.65913 1.24741,-5.52965 2.0967,-6.37894 0.8493,-0.84929 1.31621,-2.13823 1.03759,-2.8643 -0.32214,-0.83947 0.021,-1.11767 0.94249,-0.76407 0.98287,0.37716 1.44907,-0.12181 1.44907,-1.55093 0,-1.2555 0.63987,-2.10699 1.58333,-2.10699 0.87084,0 1.39046,-0.5625 1.15471,-1.25 -0.62048,-1.80954 5.44327,-8.54821 9.59822,-10.66652 3.70647,-1.88967 7.8224,-1.93142 20.16374,-0.20452 3.3,0.46176 6.15761,0.70779 6.35024,0.54673 0.19263,-0.16106 2.79027,1.02727 5.77254,2.64074 2.98226,1.61346 6.06164,2.93357 6.84306,2.93357 0.78141,0 2.09306,0.95986 2.91478,2.13302 0.99008,1.41354 2.17361,1.95531 3.50876,1.60616 1.1081,-0.28978 2.16007,-0.0908 2.33771,0.44209 0.19299,0.57898 3.38657,0.2344 7.93498,-0.85616 5.60405,-1.34367 9.90949,-1.69322 16.32165,-1.32511 4.79031,0.275 8.94555,0.11745 9.23386,-0.35012 0.73918,-1.19874 13.76024,0.44069 18.84022,2.37209 1.43552,0.54579 3.03342,0.73067 3.55089,0.41085 0.51748,-0.31981 0.81721,-0.0717 0.66609,0.55133 -0.15113,0.62304 1.41272,1.72847 3.47522,2.45649 2.0625,0.72803 3.75,1.09661 3.75,0.81908 0,-0.27754 0.675,0.0556 1.5,0.74028 1.03636,0.8601 1.5,0.89795 1.5,0.12244 0,-0.61734 0.6794,-1.12244 1.50979,-1.12244 0.83038,0 2.28039,-0.9 3.22224,-2 0.94185,-1.1 2.43486,-2 3.3178,-2 0.88295,0 4.49544,-1.18497 8.02776,-2.63327 8.46052,-3.46892 14.63942,-3.97669 17.37205,-1.42762 1.1277,1.05195 3.3242,2.22889 4.88112,2.61544 1.55692,0.38654 3.06757,1.3199 3.35699,2.07413 0.28943,0.75422 1.12457,1.37132 1.85588,1.37132 0.75838,0 1.46428,1.353 1.64301,3.14915 0.1875,1.88431 1.11665,3.5913 2.31336,4.25 1.1,0.60547 2.22893,1.40174 2.50874,1.7695 0.2798,0.36775 2.0798,0.81775 4,1 2.27368,0.21579 3.50048,0.85448 3.51769,1.83135 0.0145,0.825 0.35938,2.03141 0.76631,2.6809 0.40694,0.6495 0.2487,1.48447 -0.35163,1.8555 -0.71159,0.43978 -0.31705,1.49898 1.13348,3.043 1.98819,2.11632 2.04669,2.43683 0.54968,3.01128 -1.38588,0.53182 -1.45495,0.90995 -0.39979,2.18872 1.03517,1.25456 1.03212,1.62774 -0.0162,1.98047 -0.99232,0.33388 -1.02188,0.75978 -0.12755,1.83738 0.73955,0.8911 0.82539,1.85868 0.23535,2.65275 -0.51086,0.6875 -0.88128,2.57782 -0.82317,4.20072 0.0581,1.6229 -0.67967,3.73606 -1.63952,4.69591 -1.26468,1.26468 -1.59142,2.69275 -1.1867,5.1867 0.42623,2.6266 0.078,3.92203 -1.47076,5.47076 -1.11608,1.11608 -1.77762,2.28087 -1.47008,2.58841 0.30755,0.30754 0.0263,1.20128 -0.62507,1.98609 -0.91938,1.10779 -0.89534,1.54346 0.1075,1.94803 0.83366,0.33632 0.93712,0.81408 0.29174,1.34725 -0.55,0.45437 -1.13902,1.72613 -1.30894,2.82613 -0.16991,1.1 -1.10266,3.125 -2.07278,4.5 -0.97011,1.375 -2.40344,3.9625 -3.18517,5.75 -1.03908,2.37593 -2.09527,3.27123 -3.92722,3.32895 -1.37824,0.0434 -1.94339,0.30592 -1.25589,0.58333 1.88994,0.76261 1.50594,2.12802 -1,3.55578 -1.2375,0.70507 -2.25,1.95694 -2.25,2.78194 0,0.825 -0.675,1.41017 -1.5,1.30038 -0.825,-0.1098 -2.43628,1.2402 -3.58062,3 -1.14434,1.75979 -2.61936,3.08295 -3.27782,2.94034 -1.08968,-0.23598 -1.45305,0.37488 -2.74933,4.6219 -0.32054,1.05021 -0.73669,1.0964 -1.81504,0.20145 -0.99034,-0.82192 -1.59437,-0.84529 -2.06734,-0.08 -0.44576,0.72125 -1.76948,0.40055 -3.97628,-0.96333 -3.11614,-1.92587 -7.17568,-1.86871 -5.96881,0.084 0.3043,0.49237 0.14557,0.89522 -0.35273,0.89522 -1.51282,0 -5.22477,3.65392 -4.47432,4.40437 0.38573,0.38574 -0.0725,0.40441 -1.01819,0.0415 -1.24342,-0.47714 -1.72376,-0.14568 -1.73483,1.19715 -0.0131,1.58573 -0.17028,1.63788 -1.07613,0.35699 -0.94295,-1.33333 -1.01588,-1.33333 -0.65636,0 0.22245,0.825 1.38171,1.6438 2.57613,1.81955 1.19442,0.17575 2.17167,0.73825 2.17167,1.25 0,0.51175 0.70156,0.93045 1.55902,0.93045 0.85746,0 1.31241,0.39901 1.01101,0.88669 -0.30141,0.48768 0.12204,1.44278 0.94098,2.12245 1.00214,0.8317 1.48899,0.87575 1.48899,0.13474 0,-1.50115 4.95297,0.59164 7.16029,3.02546 0.91316,1.00687 1.92566,1.83066 2.25,1.83066 1.34484,0 4.72208,4.29595 7.25599,9.22983 1.48864,2.89859 3.52272,6.34336 4.52017,7.65503 0.99745,1.31167 1.81355,3.07624 1.81355,3.92126 0,0.84502 0.72,2.33199 1.6,3.30438 0.88,0.97239 1.6,3.43675 1.6,5.47636 0,2.03962 0.76793,5.10446 1.70651,6.81077 0.93858,1.7063 1.61471,4.79182 1.50251,6.85671 -0.1122,2.06489 0.20721,4.00848 0.7098,4.3191 0.50259,0.31061 0.67661,0.94855 0.3867,1.41762 -0.2899,0.46908 -0.76403,3.92549 -1.05361,7.68091 -0.28959,3.75541 -0.71708,8.48392 -0.94998,10.50777 -0.2329,2.02386 0.003,3.82386 0.5249,4 0.52709,0.178 0.28756,1.5926 -0.53924,3.18457 -0.81817,1.57537 -1.48759,3.61274 -1.48759,4.52749 0,0.91475 -0.70052,2.66332 -1.5567,3.88569 -0.87255,1.24574 -1.0923,2.22251 -0.5,2.22251 0.58118,0 1.0567,-0.5051 1.0567,-1.12244 0,-0.792 0.42748,-0.76768 1.45201,0.0826 0.79861,0.66279 2.29858,0.93638 3.33327,0.60798 1.03469,-0.3284 3.81286,0.0844 6.17371,0.91738 2.36086,0.83296 6.23433,1.51447 8.60772,1.51447 2.37339,0 4.61956,0.49238 4.99149,1.09417 0.37193,0.60179 1.76406,0.88622 3.09363,0.63206 1.32956,-0.25417 2.23378,-0.27851 2.00937,-0.0541 -0.2244,0.22441 1.91928,2.75397 4.76374,5.62125 6.91688,6.97236 6.84708,6.79218 7.96086,20.54842 0.37147,4.58799 0.71492,8.63799 0.76322,9 0.0483,0.36201 0.0337,0.79697 -0.10711,1.1582 -0.80187,2.05678 -1.31054,4.99435 -1.34682,7.77778 -0.0235,1.80277 -0.41672,1.48669 -0.74391,2.14323 -0.15813,0.31731 0.25315,0.79264 -0.63886,0.98195 -0.37621,0.60872 -0.45106,0.16598 -0.58513,0.9003 -0.0521,0.28524 -0.25816,0.17907 -0.74263,0.68717 -0.43248,0.45357 -0.35784,-0.0516 -0.66596,0.89743 -0.31216,0.96149 -0.20602,0.77316 -0.22528,1.16979 -0.0334,0.68828 -0.15481,0.85715 0.19242,2.05829 0.143,0.49469 -0.42203,1.27822 -0.89555,2.24755 -0.88043,1.80233 -0.25484,1.80931 -2.10364,2.00505 -0.26599,0.0282 0.44276,-0.20257 -1.17031,0.10247 -0.97461,0.1843 -1.19198,1.67998 -0.96659,2.29972 0.22539,0.61973 -1.01695,0.42266 -2.90511,3.15273 -2.25936,3.26679 -3.52602,1.58301 -4.03544,3.64173 -0.54849,2.21667 0.58003,0.14982 -0.11326,1.62782 -1.05669,2.25269 -0.47931,1.15177 -0.88709,1.80055 0,0 -0.22285,0.54501 -0.88857,0.87087 -0.44625,0.21842 1.17998,-0.12796 -2.60139,0.47671 -0.63646,0.29734 -0.46202,-0.80807 -3.19227,1.72224 l -2.76552,2.563 -22.1305,-0.23761 c -15.88014,-0.1705 -23.06085,-0.62092 -25.42453,-1.59481 -1.81171,-0.74645 -3.73536,-1.08443 -4.27478,-0.75105 -0.53941,0.33338 -0.8571,0.0102 -0.70598,-0.71819 0.16117,-0.77676 -0.44879,-1.20284 -1.47522,-1.03049 -0.9625,0.16161 -1.75,-0.25089 -1.75,-0.91667 0,-0.66578 -0.27444,-0.93607 -0.60986,-0.60064 -0.78027,0.78026 -7.41837,-3.39567 -10.84536,-6.82266 -1.44854,-1.44854 -3.25963,-2.39353 -4.02464,-2.09997 -0.76501,0.29356 -1.5575,0.034 -1.76109,-0.57674 -0.20359,-0.61077 -1.78787,-1.11049 -3.52062,-1.11049 -1.73275,0 -2.90921,-0.39034 -2.61436,-0.86741 0.29485,-0.47708 -0.35864,-1.51606 -1.91518,-1.22854 -1.55654,0.28751 -11.53389,1.69766 -21.70889,2.05337 -14.52324,0.50772 -19.12609,-3.02326 -21.87373,-1.66976 -1.925,0.94825 -7.96545,6.36524 -12.49725,8.6425 -4.53181,2.27733 -8.72086,4.14055 -9.30903,4.14055 -0.58816,0 -0.1631,1.70754 0.17292,2.25124 0.3629,0.58718 -0.0858,0.72119 -1.10503,0.33006 -1.25638,-0.48212 -1.49674,-0.30375 -0.89743,0.66596 0.5495,0.88911 0.43265,1.08594 -0.3555,0.59884 -1.02239,-0.63187 -5.26154,0.26637 -10.13496,2.1475 -3.07686,1.18766 -31.55601,0.75877 -37.7587,-0.56864 z"
+ id="path3028"
+ style="fill:#ff0000;fill-opacity:1;stroke:#000000;stroke-width:0.69999999;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cssssssssssssssscsssssscssscsssssscsssssssssssssssssssscssssssscsscsccsssssssssscssssscscssssssssssccssssscssscscsssscssccssssscsssssssssssccsscssssssssssscsssssscsssasssssssscscscssscsscsscssssscsscssssc" />
+ <path
+ d="m 335.35714,412.00504 c 7.82838,2.22626 13.55258,9.07397 16.11064,16.58597 1.77331,5.10242 2.2904,10.63429 1.66409,15.98751 -0.69791,5.10295 -3.46584,10.04442 -8.00784,12.65844 -7.35888,4.77106 -18.18995,4.75934 -24.65496,-1.57547 -4.82902,-5.00061 -6.04119,-12.54296 -4.81793,-19.19027 1.46182,-8.18673 6.2227,-15.59326 12.57325,-20.87012 2.41956,-1.79458 5.22351,-3.69025 8.38275,-3.41755"
+ id="path3800"
+ style="fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:0.69999999;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ inkscape:connector-curvature="0" />
+ <path
+ d="m 310.53571,412.36218 c -1.40641,-1.17116 -3.58861,-1.66135 -5.16196,-0.51893 -2.22395,1.52051 -3.19556,4.27879 -3.55744,6.84075 -0.33384,2.53795 0.27807,5.51425 2.44186,7.10488 1.90236,1.39111 4.56075,0.65579 6.25684,-0.72054 1.97274,-1.54803 3.35558,-4.07045 3.02805,-6.62562 0.37908,-2.01145 -0.015,-4.50186 -1.88689,-5.65872 -0.34622,-0.20237 -0.72717,-0.34426 -1.12046,-0.42182 z"
+ id="path3843"
+ style="fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:0.69999999;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ inkscape:connector-curvature="0" />
+ <path
+ d="m 362.32143,415.04075 c 1.82028,-0.2869 3.79491,0.35598 4.9485,1.82847 1.8159,2.28393 2.02126,5.56951 0.97481,8.2301 -0.74786,1.96459 -2.45847,3.56523 -4.53699,3.99866 -2.04621,0.51877 -4.27055,-0.27745 -5.67674,-1.81667 -2.21845,-2.35017 -3.09901,-6.10321 -1.64239,-9.07066 0.7981,-1.56589 2.2933,-2.80679 4.01266,-3.20954 0.63251,-0.12753 1.2939,-0.11857 1.92015,0.0396 z"
+ id="path3860"
+ style="fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:0.69999999;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ inkscape:connector-curvature="0" />
+ <path
+ d="m 313.21429,418.25504 c -0.65312,0.86871 -1.78813,1.29333 -2.8566,1.15862 -1.51532,-0.1724 -2.94976,-1.09631 -3.68229,-2.44106 -0.48041,-0.86232 -0.47858,-1.97724 0.0673,-2.80913 0.63734,-1.05476 1.94102,-1.71218 3.16653,-1.43208 1.54168,0.34032 2.74335,1.63795 3.2515,3.09573 0.26622,0.77734 0.31965,1.64275 0.0536,2.42792 z"
+ id="path3876"
+ style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:0.69999999;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ inkscape:connector-curvature="0" />
+ <path
+ d="m 368.21429,421.46932 c -0.55015,0.72499 -1.45802,1.18031 -2.37461,1.09864 -1.30459,-0.10649 -2.47133,-0.95018 -3.16425,-2.03402 -0.49974,-0.77749 -0.73307,-1.82753 -0.25762,-2.67243 0.38894,-0.68396 1.10834,-1.14173 1.85648,-1.33873 0.96656,-0.2404 1.98591,0.18488 2.64956,0.89186 0.93289,0.98053 1.46507,2.36797 1.3435,3.72376 -0.012,0.11111 -0.0295,0.22166 -0.0531,0.33092 z"
+ id="path3895"
+ style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:0.69999999;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ inkscape:connector-curvature="0" />
+ <path
+ d="m 303.04576,597.66727 c 0.89898,4.35249 2.17849,8.87576 1.08581,13.31695 -0.98289,3.59314 -0.74817,7.37439 -1.46656,11.01441 -0.0643,0.90932 -0.11707,1.84689 -0.50302,2.68838"
+ id="path6133"
+ style="fill:none;stroke:#000000;stroke-width:0.69999999;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ inkscape:connector-curvature="0" />
+ <path
+ d="m 349.51278,594.76308 c -1.58181,2.33253 -1.39144,5.56411 -3.53003,7.56876 -0.74878,3.62541 -0.71177,7.35102 -1.21455,11.00843 -0.10351,3.82135 -0.0162,7.71947 1.08376,11.4103"
+ id="path6143"
+ style="fill:none;stroke:#000000;stroke-width:0.69999999;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ inkscape:connector-curvature="0" />
+ </g>
+ <path
+ d="m 409.49059,562.817 c -6.67512,0.0141 -12.72539,2.68679 -18.37595,5.87319 -5.33515,2.18172 -7.45099,7.69796 -12.7301,9.94852 -4.12835,4.17446 -7.57404,7.9756 -11.12192,12.52392 -2.6138,5.46222 -7.29966,10.95705 -13.63968,6.46078 -4.52118,-3.54734 -10.14186,-6.62102 -12.94899,-11.82544 -2.65925,-5.83356 -3.26085,-12.84467 -1.90417,-19.32125 0.65245,-6.59597 4.3386,-12.21307 7.7841,-17.72679 2.52977,-5.2597 6.29469,-8.24419 7.64728,-13.87964 2.44434,-5.87935 2.40037,-12.09314 2.93216,-18.33486 0.0486,-2.55913 0.45478,-5.2273 -0.67574,-7.63532"
+ id="path6125"
+ style="fill:none;stroke:#000000;stroke-width:0.69999999;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ inkscape:connector-curvature="0" />
+ <path
+ d="m 247.99245,560.54416 c 6.76369,0.22082 13.24135,2.3829 18.17002,6.74782 3.36251,5.76075 8.86908,9.4273 12.13456,15.223 3.40989,5.65472 7.64278,11.01568 10.16352,16.76182 5.33282,4.95503 12.09713,-2.9069 18.35687,-2.90228 3.07966,-5.12791 6.1634,-10.09309 10.89959,-13.65497 3.57662,-4.51201 1.53442,-12.1972 3.96354,-17.84779 0.65412,-6.29983 -5.71452,-10.1283 -7.74494,-15.55479 -5.11189,-5.20658 -9.57769,-10.17315 -13.01542,-16.77188 -3.03275,-6.36273 -3.86358,-13.67482 -2.19127,-20.51204 1.29002,-1.18262 1.10017,-2.57287 1.53892,-3.89055"
+ id="path6127"
+ style="fill:none;stroke:#000000;stroke-width:0.69999999;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ inkscape:connector-curvature="0" />
+ <path
+ d="m 264.49757,451.68163 c -0.83348,-0.36325 -1.85626,-1.07502 -2.27284,-1.58172 -0.41658,-0.5067 -1.7802,-1.5663 -3.03026,-2.35468 -2.64376,-1.66732 -6.90902,-7.0392 -7.34147,-9.24618 -0.59726,-3.04812 -3.54506,-8.15921 -6.60743,-11.45641 -4.03542,-4.34485 -6.20805,-8.31132 -8.70689,-15.89577 -1.7921,-5.43936 -2.03866,-6.78071 -2.18289,-11.87582 l -0.1626,-5.74387 2.14733,-3.61858 c 1.49005,-2.51097 2.45643,-4.98256 3.15715,-8.07469 0.5554,-2.45086 1.46859,-5.37083 2.02932,-6.48881 l 1.01951,-2.0327 6.17741,-0.24014 c 3.39757,-0.13208 8.19146,-0.18277 10.65308,-0.11265 4.44806,0.12672 11.48416,1.5513 13.68386,2.77053 0.63259,0.35063 2.29197,1.25362 3.68752,2.00665 3.98522,2.1504 4.30748,2.61329 3.37531,4.84826 -0.42755,1.0251 -1.42299,2.54567 -2.2121,3.37904 -1.43662,1.51721 -3.05975,6.05037 -3.05975,8.54542 0,0.72538 -0.68185,2.52705 -1.51523,4.00371 -0.83337,1.47666 -1.51523,3.19279 -1.51523,3.81363 0,0.62083 -0.27818,1.62523 -0.61819,2.232 -0.58367,1.04162 -1.16789,5.63751 -2.41505,18.9987 -0.45164,4.83847 -0.70286,5.88848 -1.551,6.48254 -0.89587,0.62749 -0.97423,1.0664 -0.68253,3.8228 0.18125,1.71265 0.64492,3.6173 1.03039,4.23256 0.38547,0.61526 0.70085,2.16071 0.70085,3.43435 0,1.27363 0.31405,2.92943 0.69789,3.67957 0.38384,0.75013 0.85915,2.33434 1.05624,3.52046 0.19709,1.18612 0.69477,2.49301 1.10595,2.90419 0.66009,0.66009 0.40341,0.74529 -2.19266,0.72783 -1.61715,-0.0109 -3.62221,-0.31697 -4.45569,-0.68022 l 0,0 z"
+ id="path6163"
+ style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.35355338;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ inkscape:connector-curvature="0" />
+ <path
+ d="m 396.41236,460.39021 c -0.50626,-0.28797 -1.47514,-0.38438 -2.15306,-0.21422 -0.97746,0.24532 -5.45503,-1.12035 -6.703,-2.04444 -0.099,-0.0733 0.62934,-0.96678 1.61864,-1.98543 1.35515,-1.39535 1.87342,-2.4304 2.10166,-4.19725 0.16662,-1.28984 0.76652,-4.0498 1.3331,-6.13324 0.56659,-2.08344 1.5235,-5.60635 2.12647,-7.82868 0.85499,-3.15121 1.06501,-5.15235 0.95413,-9.09137 -0.24568,-8.72732 -0.64405,-14.10608 -1.12226,-15.15229 -0.25394,-0.55559 -0.53774,-2.64127 -0.63065,-4.63486 -0.11344,-2.43421 -0.43818,-3.92719 -0.98873,-4.54568 -0.58913,-0.66183 -0.91354,-2.41327 -1.15292,-6.22429 l -0.3331,-5.3033 1.6724,-2.61886 c 0.91982,-1.44037 2.52021,-3.145 3.55641,-3.78807 1.0362,-0.64307 2.0247,-1.58971 2.19666,-2.10365 0.17195,-0.51394 1.30987,-1.37556 2.5287,-1.9147 1.21883,-0.53915 2.45435,-1.42554 2.74561,-1.96975 0.39448,-0.73711 1.07253,-0.99386 2.65836,-1.00663 1.17084,-0.009 3.03794,-0.45628 4.14911,-0.99301 1.11116,-0.53674 2.62785,-0.98359 3.37041,-0.99302 0.79847,-0.0101 1.94627,-0.6133 2.80919,-1.47622 l 1.45909,-1.45909 1.98903,1.20358 c 1.09397,0.66197 3.29507,1.4616 4.89135,1.77697 2.77989,0.5492 2.9243,0.65506 3.42363,2.50943 0.28673,1.06482 0.376,2.51507 0.19837,3.22277 -0.23988,0.95577 0.0373,1.75897 1.07743,3.12273 1.2757,1.67252 1.32566,1.89062 0.56112,2.44967 -0.98074,0.71713 -1.09884,2.31355 -0.23507,3.17733 0.46889,0.46888 0.40779,0.74782 -0.2728,1.24548 -0.81374,0.59502 -0.81889,0.75778 -0.0714,2.25615 0.54968,1.10185 0.65784,1.90156 0.34048,2.51733 -0.25581,0.49636 -0.62128,2.15254 -0.81214,3.6804 -0.20022,1.60272 -0.86987,3.5746 -1.58291,4.66112 -1.00727,1.53485 -1.23588,2.52258 -1.23588,5.3396 0,3.05151 -0.17585,3.68879 -1.50118,5.4404 -0.82565,1.0912 -1.5075,2.3088 -1.51523,2.70576 -0.008,0.39697 -0.29148,1.48898 -0.63057,2.4267 -0.5085,1.40624 -0.49207,1.78186 0.0938,2.14394 0.51371,0.31749 0.56277,0.62439 0.17726,1.10883 -0.29318,0.36842 -0.80141,1.50347 -1.12941,2.52235 -0.54409,1.69015 -3.63547,7.55893 -5.93115,11.25991 -0.6016,0.96988 -1.5138,1.61512 -2.59487,1.83549 -2.15117,0.43849 -2.32413,0.65034 -1.54695,1.89481 0.56684,0.90765 0.47994,1.16021 -0.72534,2.10829 -2.14287,1.68558 -2.87911,2.52914 -2.87911,3.29881 0,0.39155 -0.57263,0.85563 -1.27252,1.03129 -0.69989,0.17566 -2.31849,1.5437 -3.59689,3.04008 -1.32232,1.5478 -2.7445,2.7207 -3.29893,2.7207 -0.65584,0 -1.22039,0.61945 -1.72618,1.89404 -1.49574,3.76925 -1.40087,3.64682 -2.39016,3.08409 l 0,0 z"
+ id="path6165"
+ style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.35355338;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ inkscape:connector-curvature="0" />
+ </g>
+ <path
+ d="m 327.4876,492.39499 c 2.2644,2.66632 6.07748,3.19909 8.63579,5.43274 2.86007,2.28019 6.66345,0.59268 9.87447,1.65009 3.09838,0.67486 5.93629,2.75922 9.39536,2.88839 3.32499,0.37833 6.55094,0.57956 9.53617,1.55177 2.6564,0.95363 5.25607,-2.99638 7.07288,-0.0245 3.26765,2.24544 7.81367,0.6425 11.58781,1.00892 3.32915,0.008 5.80304,-2.7396 9.17467,-2.25665 3.08744,-0.22194 6.69298,0.88515 9.12364,-1.39255 3.30181,0.0682 6.36091,-0.78244 9.0003,-2.76185 1.51143,-1.14436 3.49477,-0.47019 5.25963,-0.64998 0.0806,-1.61182 2.11123,-1.97141 2.85714,-3.21429"
+ id="path6159"
+ style="fill:none;stroke:#000000;stroke-width:0.69999999;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ inkscape:connector-curvature="0" />
+ </g>
+ </g>
+ </g>
+</svg>
diff --git a/images/red-koala.xcf b/images/red-koala.xcf
new file mode 100644
index 000000000..a95baf62c
--- /dev/null
+++ b/images/red-koala.xcf
Binary files differ
diff --git a/include/account.php b/include/account.php
index 5e57d53a8..6c6fdece4 100644
--- a/include/account.php
+++ b/include/account.php
@@ -31,7 +31,7 @@ function check_account_email($email) {
if(! strlen($email))
return $result;
- if((! valid_email($email)) || (! validate_email($email)))
+ if(! validate_email($email))
$result['message'] .= t('Not a valid email address') . EOL;
elseif(! allowed_email($email))
$result['message'] = t('Your email domain is not among those allowed on this site');
@@ -105,6 +105,33 @@ function account_total() {
}
+function account_store_lowlevel($arr) {
+
+ $store = [
+ 'account_parent' => ((array_key_exists('account_parent',$arr)) ? $arr['account_parent'] : '0'),
+ 'account_default_channel' => ((array_key_exists('account_default_channel',$arr)) ? $arr['account_default_channel'] : '0'),
+ 'account_salt' => ((array_key_exists('account_salt',$arr)) ? $arr['account_salt'] : ''),
+ 'account_password' => ((array_key_exists('account_password',$arr)) ? $arr['account_password'] : ''),
+ 'account_email' => ((array_key_exists('account_email',$arr)) ? $arr['account_email'] : ''),
+ 'account_external' => ((array_key_exists('account_external',$arr)) ? $arr['account_external'] : ''),
+ 'account_language' => ((array_key_exists('account_language',$arr)) ? $arr['account_language'] : 'en'),
+ 'account_created' => ((array_key_exists('account_created',$arr)) ? $arr['account_created'] : '0001-01-01 00:00:00'),
+ 'account_lastlog' => ((array_key_exists('account_lastlog',$arr)) ? $arr['account_lastlog'] : '0001-01-01 00:00:00'),
+ 'account_flags' => ((array_key_exists('account_flags',$arr)) ? $arr['account_flags'] : '0'),
+ 'account_roles' => ((array_key_exists('account_roles',$arr)) ? $arr['account_roles'] : '0'),
+ 'account_reset' => ((array_key_exists('account_reset',$arr)) ? $arr['account_reset'] : ''),
+ 'account_expires' => ((array_key_exists('account_expires',$arr)) ? $arr['account_expires'] : '0001-01-01 00:00:00'),
+ 'account_expire_notified' => ((array_key_exists('account_expire_notified',$arr)) ? $arr['account_expire_notified'] : '0001-01-01 00:00:00'),
+ 'account_service_class' => ((array_key_exists('account_service_class',$arr)) ? $arr['account_service_class'] : ''),
+ 'account_level' => ((array_key_exists('account_level',$arr)) ? $arr['account_level'] : '0'),
+ 'account_password_changed' => ((array_key_exists('account_password_changed',$arr)) ? $arr['account_password_changed'] : '0001-01-01 00:00:00')
+ ];
+
+ return create_table_from_array('account',$store);
+
+}
+
+
function create_account($arr) {
// Required: { email, password }
@@ -177,21 +204,20 @@ function create_account($arr) {
$salt = random_string(32);
$password_encoded = hash('whirlpool', $salt . $password);
- $r = q("INSERT INTO account
- ( account_parent, account_salt, account_password, account_email, account_language,
- account_created, account_flags, account_roles, account_level, account_expires, account_service_class )
- VALUES ( %d, '%s', '%s', '%s', '%s', '%s', %d, %d, %d, '%s', '%s' )",
- intval($parent),
- dbesc($salt),
- dbesc($password_encoded),
- dbesc($email),
- dbesc(get_best_language()),
- dbesc(datetime_convert()),
- intval($flags),
- intval($roles),
- intval($techlevel),
- dbesc($expires),
- dbesc($default_service_class)
+ $r = account_store_lowlevel(
+ [
+ 'account_parent' => intval($parent),
+ 'account_salt' => $salt,
+ 'account_password' => $password_encoded,
+ 'account_email' => $email,
+ 'account_language' => get_best_language(),
+ 'account_created' => datetime_convert(),
+ 'account_flags' => intval($flags),
+ 'account_roles' => intval($roles),
+ 'account_level' => intval($techlevel),
+ 'account_expires' => $expires,
+ 'account_service_class' => $default_service_class
+ ]
);
if(! $r) {
logger('create_account: DB INSERT failed.');
@@ -246,16 +272,18 @@ function verify_email_address($arr) {
dbesc($arr['account']['account_language'])
);
-//@fixme - get correct language template
+ push_lang(($arr['account']['account_language']) ? $arr['account']['account_language'] : 'en');
- $email_msg = replace_macros(get_intltext_template('register_verify_member.tpl'), array(
- '$sitename' => get_config('system','sitename'),
- '$siteurl' => z_root(),
- '$email' => $arr['email'],
- '$uid' => $arr['account']['account_id'],
- '$hash' => $hash,
- '$details' => $details
- ));
+ $email_msg = replace_macros(get_intltext_template('register_verify_member.tpl'),
+ [
+ '$sitename' => get_config('system','sitename'),
+ '$siteurl' => z_root(),
+ '$email' => $arr['email'],
+ '$uid' => $arr['account']['account_id'],
+ '$hash' => $hash,
+ '$details' => $details
+ ]
+ );
$res = z_mail(
[
@@ -265,10 +293,12 @@ function verify_email_address($arr) {
]
);
+ pop_lang();
+
if($res)
$delivered ++;
else
- logger('send_reg_approval_email: failed to ' . $admin['email'] . 'account_id: ' . $arr['account']['account_id']);
+ logger('send_reg_approval_email: failed to account_id: ' . $arr['account']['account_id']);
return $res;
}
@@ -354,9 +384,9 @@ function send_register_success_email($email,$password) {
$res = z_mail(
[
- 'toEmail' => $email,
- 'messageSubject' => sprintf( t('Registration details for %s'), get_config('system','sitename')),
- 'textVersion' => $email_msg,
+ 'toEmail' => $email,
+ 'messageSubject' => sprintf( t('Registration details for %s'), get_config('system','sitename')),
+ 'textVersion' => $email_msg,
]
);
@@ -424,7 +454,7 @@ function account_allow($hash) {
pop_lang();
- if(get_config('system','auto_channel_create') || get_config('system','server_role') === 'basic')
+ if(get_config('system','auto_channel_create'))
auto_channel_create($register[0]['uid']);
if ($res) {
@@ -525,19 +555,13 @@ function account_approve($hash) {
if(! $account)
return $ret;
-
-
-
- if(get_config('system','auto_channel_create') || get_config('system','server_role') === 'basic')
+ if(get_config('system','auto_channel_create'))
auto_channel_create($register[0]['uid']);
else {
$_SESSION['login_return_url'] = 'new_channel';
authenticate_success($account[0],null,true,true,false,true);
}
-
- // info( t('Account verified. Please login.') . EOL );
-
return true;
}
@@ -772,12 +796,6 @@ function upgrade_bool_message($bbcode = false) {
function get_account_techlevel($account_id = 0) {
- $role = \Zotlabs\Lib\System::get_server_role();
- if($role == 'basic')
- return 0;
- if($role == 'standard')
- return 5;
-
if(! $account_id) {
$x = \App::get_account();
}
diff --git a/include/api.php b/include/api.php
index 693967696..c91590070 100644
--- a/include/api.php
+++ b/include/api.php
@@ -194,15 +194,25 @@ require_once('include/api_zot.php');
else
$redirect = trim($_REQUEST['redirect_uris']);
$icon = trim($_REQUEST['logo_uri']);
- $r = q("INSERT INTO clients (client_id, pw, clname, redirect_uri, icon, uid)
- VALUES ('%s','%s','%s','%s','%s',%d)",
- dbesc($key),
- dbesc($secret),
- dbesc($name),
- dbesc($redirect),
- dbesc($icon),
- intval(0)
- );
+ if($oauth2) {
+ $r = q("INSERT INTO oauth_clients (client_id, client_secret, redirect_uri, grant_types, scope, user_id)
+ VALUES ( '%s', '%s', '%s', null, null, null ) ",
+ dbesc($key),
+ dbesc($secret),
+ dbesc($redirect)
+ );
+ }
+ else {
+ $r = q("INSERT INTO clients (client_id, pw, clname, redirect_uri, icon, uid)
+ VALUES ('%s','%s','%s','%s','%s',%d)",
+ dbesc($key),
+ dbesc($secret),
+ dbesc($name),
+ dbesc($redirect),
+ dbesc($icon),
+ intval(0)
+ );
+ }
$ret['client_id'] = $key;
$ret['client_secret'] = $secret;
diff --git a/include/attach.php b/include/attach.php
index ac50b05b1..50de3ac53 100644
--- a/include/attach.php
+++ b/include/attach.php
@@ -610,7 +610,8 @@ function attach_store($channel, $observer_hash, $options = '', $arr = null) {
// A freshly uploaded file. Check for duplicate and resolve with the channel's overwrite settings.
- $r = q("select filename, id, hash, filesize from attach where filename = '%s' and folder = '%s' ",
+ $r = q("select filename, id, hash, filesize from attach where uid = %d and filename = '%s' and folder = '%s' ",
+ intval($channel_id),
dbesc($filename),
dbesc($folder_hash)
);
@@ -632,7 +633,8 @@ function attach_store($channel, $observer_hash, $options = '', $arr = null) {
$ext = $def_extension;
}
- $r = q("select filename from attach where ( filename = '%s' OR filename like '%s' ) and folder = '%s' ",
+ $r = q("select filename from attach where uid = %d and ( filename = '%s' OR filename like '%s' ) and folder = '%s' ",
+ intval($channel_id),
dbesc($basename . $ext),
dbesc($basename . '(%)' . $ext),
dbesc($folder_hash)
@@ -1596,7 +1598,10 @@ function file_activity($channel_id, $object, $allow_cid, $allow_gid, $deny_cid,
$folder_hash = $object['folder'];
- $r_perms = recursive_activity_recipients($arr_allow_cid, $arr_allow_gid, $arr_deny_cid, $arr_deny_gid, $folder_hash);
+ $r_perms = attach_recursive_perms($arr_allow_cid, $arr_allow_gid, $arr_deny_cid, $arr_deny_gid, $folder_hash);
+
+ if($r_perms === false) //nobody has recursive perms - nobody must be notified
+ return;
//split up returned perms
$arr_allow_cid = $r_perms['allow_cid'];
@@ -1675,17 +1680,9 @@ function file_activity($channel_id, $object, $allow_cid, $allow_gid, $deny_cid,
$arr['obj'] = $u_jsonobject;
$arr['body'] = '';
- $post = item_store($arr);
- $item_id = $post['item_id'];
- if($item_id) {
- Zotlabs\Daemon\Master::Summon(array('Notifier','activity',$item_id));
- }
-
- call_hooks('post_local_end', $arr);
+ post_activity_item($arr);
$update = false;
-
- //notice( t('File activity updated') . EOL);
}
//don't create new activity if notify was not enabled
@@ -1710,16 +1707,7 @@ function file_activity($channel_id, $object, $allow_cid, $allow_gid, $deny_cid,
$arr['obj'] = (($update) ? $u_jsonobject : $jsonobject);
$arr['body'] = '';
- $post = item_store($arr);
- $item_id = $post['item_id'];
-
- if($item_id) {
- Zotlabs\Daemon\Master::Summon(array('Notifier','activity',$item_id));
- }
-
- call_hooks('post_local_end', $arr);
-
- //(($verb === 'post') ? notice( t('File activity posted') . EOL) : notice( t('File activity dropped') . EOL));
+ post_activity_item($arr);
return;
}
@@ -1776,7 +1764,7 @@ function get_file_activity_object($channel_id, $hash, $cloudpath) {
}
/**
- * @brief Returns array of channels which have recursive permission for a file
+ * @brief Returns recursive permissions array or false if nobody has recursive permissions
*
* @param array $arr_allow_cid
* @param array $arr_allow_gid
@@ -1784,19 +1772,20 @@ function get_file_activity_object($channel_id, $hash, $cloudpath) {
* @param array $arr_deny_gid
* @param string $folder_hash
*/
-function recursive_activity_recipients($arr_allow_cid, $arr_allow_gid, $arr_deny_cid, $arr_deny_gid, $folder_hash) {
+function attach_recursive_perms($arr_allow_cid, $arr_allow_gid, $arr_deny_cid, $arr_deny_gid, $folder_hash) {
$ret = array();
$parent_arr = array();
$count_values = array();
$poster = App::get_observer();
- //turn allow_gid into allow_cid's
- foreach($arr_allow_gid as $gid) {
- $in_group = group_get_members($gid);
+ //lookup all channels in sharee group and add them to sharee $arr_allow_cid
+ if($arr_allow_gid) {
+ $in_group = expand_groups($arr_allow_gid);
$arr_allow_cid = array_unique(array_merge($arr_allow_cid, $in_group));
}
+ //count existing parent folders - we will compare to that count later
$count = 0;
while($folder_hash) {
$x = q("SELECT allow_cid, allow_gid, deny_cid, deny_gid, folder FROM attach WHERE hash = '%s' LIMIT 1",
@@ -1805,30 +1794,20 @@ function recursive_activity_recipients($arr_allow_cid, $arr_allow_gid, $arr_deny
//only process private folders
if($x[0]['allow_cid'] || $x[0]['allow_gid'] || $x[0]['deny_cid'] || $x[0]['deny_gid']) {
-
$parent_arr['allow_cid'][] = expand_acl($x[0]['allow_cid']);
$parent_arr['allow_gid'][] = expand_acl($x[0]['allow_gid']);
-
- /**
- * @TODO should find a much better solution for the allow_cid <-> allow_gid problem.
- * Do not use allow_gid for now. Instead lookup the members of the group directly and add them to allow_cid.
- * */
- if($parent_arr['allow_gid']) {
- foreach($parent_arr['allow_gid'][$count] as $gid) {
- $in_group = group_get_members($gid);
- $parent_arr['allow_cid'][$count] = array_unique(array_merge($parent_arr['allow_cid'][$count], $in_group));
- }
- }
-
$parent_arr['deny_cid'][] = expand_acl($x[0]['deny_cid']);
$parent_arr['deny_gid'][] = expand_acl($x[0]['deny_gid']);
+ //this is the number of all existing parent folders - we will compare to that count later
$count++;
}
$folder_hash = $x[0]['folder'];
}
+ //logger(EOL . 'parent_arr: ' . print_r($parent_arr,true));
+
//if none of the parent folders is private just return file perms
if(!$parent_arr['allow_cid'] && !$parent_arr['allow_gid'] && !$parent_arr['deny_cid'] && !$parent_arr['deny_gid']) {
$ret['allow_gid'] = $arr_allow_gid;
@@ -1839,7 +1818,7 @@ function recursive_activity_recipients($arr_allow_cid, $arr_allow_gid, $arr_deny
return $ret;
}
- //if there are no perms on the file we get them from the first parent folder
+ //if there are no perms on the file we will work with the perms from the first parent folder
if(!$arr_allow_cid && !$arr_allow_gid && !$arr_deny_cid && !$arr_deny_gid) {
$arr_allow_cid = $parent_arr['allow_cid'][0];
$arr_allow_gid = $parent_arr['allow_gid'][0];
@@ -1847,52 +1826,83 @@ function recursive_activity_recipients($arr_allow_cid, $arr_allow_gid, $arr_deny
$arr_deny_gid = $parent_arr['deny_gid'][0];
}
- //allow_cid
- $r_arr_allow_cid = false;
- foreach ($parent_arr['allow_cid'] as $folder_arr_allow_cid) {
- foreach ($folder_arr_allow_cid as $ac_hash) {
- $count_values[$ac_hash]++;
+
+ /***
+ *
+ * check if sharee has perms for all parent folders
+ *
+ ***/
+
+ $r_arr_allow_cid = [];
+
+ if($parent_arr['allow_cid']) {
+ //check sharee arr_allow_cid against allow_cid of all parent folders
+ foreach($parent_arr['allow_cid'] as $folder_arr_allow_cid) {
+ foreach($folder_arr_allow_cid as $ac_hash) {
+ $count_values[$ac_hash]++;
+ }
}
- }
- foreach ($arr_allow_cid as $fac_hash) {
- if($count_values[$fac_hash] == $count)
- $r_arr_allow_cid[] = $fac_hash;
+ foreach($arr_allow_cid as $fac_hash) {
+ if($count_values[$fac_hash] == $count)
+ $r_arr_allow_cid[] = $fac_hash;
+ }
+ //logger(EOL . 'r_arr_allow_cid: ' . print_r($r_arr_allow_cid,true));
}
- //allow_gid
- $r_arr_allow_gid = false;
- foreach ($parent_arr['allow_gid'] as $folder_arr_allow_gid) {
- foreach ($folder_arr_allow_gid as $ag_hash) {
- $count_values[$ag_hash]++;
+ if($parent_arr['allow_gid']) {
+ //check sharee arr_allow_cid against members of allow_gid of all parent folders
+ foreach($parent_arr['allow_gid'] as $folder_arr_allow_gid) {
+ //get the group members
+ $folder_arr_allow_cid = expand_groups($folder_arr_allow_gid);
+ foreach($folder_arr_allow_cid as $ac_hash) {
+ $count_values[$ac_hash]++;
+ }
}
- }
- foreach ($arr_allow_gid as $fag_hash) {
- if($count_values[$fag_hash] == $count)
- $r_arr_allow_gid[] = $fag_hash;
+ foreach($arr_allow_cid as $fac_hash) {
+ if($count_values[$fac_hash] == $count)
+ $r_arr_allow_cid[] = $fac_hash;
+ }
+ //logger(EOL . 'groups - r_arr_allow_cid: ' . print_r($r_arr_allow_cid,true));
}
- //deny_gid
- foreach($parent_arr['deny_gid'] as $folder_arr_deny_gid) {
- $r_arr_deny_gid = array_merge($arr_deny_gid, $folder_arr_deny_gid);
- }
- $r_arr_deny_gid = array_unique($r_arr_deny_gid);
+
+ /***
+ *
+ * check if sharee is denied somewhere in parent folders and deny him if so
+ *
+ ***/
//deny_cid
- foreach($parent_arr['deny_cid'] as $folder_arr_deny_cid) {
- $r_arr_deny_cid = array_merge($arr_deny_cid, $folder_arr_deny_cid);
+ $r_arr_deny_cid = [];
+
+ if($parent_arr['deny_cid']) {
+ foreach($parent_arr['deny_cid'] as $folder_arr_deny_cid) {
+ $r_arr_deny_cid = array_merge($arr_deny_cid, $folder_arr_deny_cid);
+ }
+ $r_arr_deny_cid = array_unique($r_arr_deny_cid);
+ //logger(EOL . 'r_arr_deny_cid: ' . print_r($r_arr_deny_cid,true));
}
- $r_arr_deny_cid = array_unique($r_arr_deny_cid);
- //if none is allowed restrict to self
- if(($r_arr_allow_gid === false) && ($r_arr_allow_cid === false)) {
- $ret['allow_cid'] = $poster['xchan_hash'];
- } else {
- $ret['allow_gid'] = $r_arr_allow_gid;
- $ret['allow_cid'] = $r_arr_allow_cid;
- $ret['deny_gid'] = $r_arr_deny_gid;
- $ret['deny_cid'] = $r_arr_deny_cid;
+ //deny_gid
+ $r_arr_deny_gid = [];
+
+ if($parent_arr['deny_cid']) {
+ foreach($parent_arr['deny_gid'] as $folder_arr_deny_gid) {
+ $r_arr_deny_gid = array_merge($arr_deny_gid, $folder_arr_deny_gid);
+ }
+ $r_arr_deny_gid = array_unique($r_arr_deny_gid);
+ //logger(EOL . 'r_arr_deny_gid: ' . print_r($r_arr_dr_arr_deny_gideny_cid,true));
}
+ //if no channel is allowed return false
+ if(! $r_arr_allow_cid)
+ return false;
+
+ $ret['allow_gid'] = []; // eventual group members are already collected in $r_arr_allow_cid
+ $ret['allow_cid'] = $r_arr_allow_cid;
+ $ret['deny_gid'] = $r_arr_deny_gid;
+ $ret['deny_cid'] = $r_arr_deny_cid;
+
return $ret;
}
@@ -2355,3 +2365,104 @@ function attach_upgrade() {
}
}
+
+function save_chunk($channel,$start,$end,$len) {
+
+ $result = [];
+
+ $tmp_path = $_FILES['files']['tmp_name'];
+ $new_base = 'store/[data]/' . $channel['channel_address'] . '/tmp';
+ os_mkdir($new_base,STORAGE_DEFAULT_PERMISSIONS,true);
+
+ $new_path = $new_base . '/' . $_FILES['files']['name'];
+
+ if(! file_exists($new_path)) {
+ rename($tmp_path,$new_path);
+ }
+ else {
+ $istream = fopen($tmp_path,'rb');
+ $ostream = fopen($new_path,'ab');
+ if($istream && $ostream) {
+ pipe_streams($istream,$ostream);
+ fclose($istream);
+ fclose($ostream);
+ }
+ }
+ if(($len - 1) == $end) {
+ unlink($tmp_path);
+ $result['name'] = $_FILES['files']['tmp_name'];
+ $result['type'] = $_FILES['files']['type'];
+ $result['tmp_name'] = $new_path;
+ $result['error'] = 0;
+ $result['size'] = $len;
+ $result['complete'] = true;
+ return $result;
+ }
+ $result['partial'] = true;
+ $result['length'] = intval(filesize($new_path));
+ return $result;
+}
+
+
+/*
+ * chunkloader
+ * Submit handler for chunked uploads
+ *
+ */
+
+function chunkloader($channel,$arr) {
+
+ logger('request: ' . print_r($arr,true), LOGGER_DEBUG);
+ logger('files: ' . print_r($_FILES,true), LOGGER_DEBUG);
+
+
+ $result = [];
+
+
+ $tmp_path = $_FILES['file']['tmp_name'];
+ $new_base = 'store/[data]/' . $channel['channel_address'] . '/tmp';
+ os_mkdir($new_base,STORAGE_DEFAULT_PERMISSIONS,true);
+
+ $new_path = $new_base . '/' . $arr['resumableFilename'];
+
+ rename($tmp_path,$new_path . '.' . intval($arr['resumableChunkNumber']));
+
+ $missing_parts = false;
+ for($x = 1; $x <= intval($arr['resumableTotalChunks']); $x ++) {
+ if(! file_exists($new_path . '.' . $x)) {
+ $missing_parts = true;
+ break;
+ }
+ }
+
+ if($missing_parts) {
+ $result['partial'] = true;
+ return $result;
+ }
+
+ if(intval($arr['resumableTotalChunks']) === 1) {
+ rename($new_path . '.' . '1', $new_path);
+ }
+ else {
+ for($x = 1; $x <= intval($arr['resumableTotalChunks']); $x ++) {
+ $istream = fopen($new_path . '.' . $x,'rb');
+ $ostream = fopen($new_path,'ab');
+ if($istream && $ostream) {
+ pipe_streams($istream,$ostream);
+ fclose($istream);
+ fclose($ostream);
+ }
+ unlink($new_path . '.' . $x);
+ }
+ }
+
+ $result['name'] = $arr['resumableFilename'];
+ $result['type'] = $arr['resumableType'];
+ $result['tmp_name'] = $new_path;
+ $result['error'] = 0;
+ $result['size'] = $arr['resumableTotalSize'];
+ $result['complete'] = true;
+ return $result;
+
+}
+
diff --git a/include/bbcode.php b/include/bbcode.php
index 2f15cefe1..9f9b5c5e1 100644
--- a/include/bbcode.php
+++ b/include/bbcode.php
@@ -7,6 +7,66 @@
require_once('include/oembed.php');
require_once('include/event.php');
require_once('include/zot.php');
+require_once('include/html2plain.php');
+
+function get_bb_tag_pos($s, $name, $occurance = 1) {
+
+ if($occurance < 1)
+ $occurance = 1;
+
+ $start_open = -1;
+ for($i = 1; $i <= $occurance; $i++) {
+ if( $start_open !== false)
+ $start_open = strpos($s, '[' . $name, $start_open + 1); // allow [name= type tags
+ }
+
+ if( $start_open === false)
+ return false;
+
+ $start_equal = strpos($s, '=', $start_open);
+ $start_close = strpos($s, ']', $start_open);
+
+ if( $start_close === false)
+ return false;
+
+ $start_close++;
+
+ $end_open = strpos($s, '[/' . $name . ']', $start_close);
+
+ if( $end_open === false)
+ return false;
+
+ $res = array( 'start' => array('open' => $start_open, 'close' => $start_close),
+ 'end' => array('open' => $end_open, 'close' => $end_open + strlen('[/' . $name . ']')) );
+ if( $start_equal !== false)
+ $res['start']['equal'] = $start_equal + 1;
+
+ return $res;
+}
+
+function bb_tag_preg_replace($pattern, $replace, $name, $s) {
+
+ $string = $s;
+
+ $occurance = 1;
+ $pos = get_bb_tag_pos($string, $name, $occurance);
+ while($pos !== false && $occurance < 1000) {
+
+ $start = substr($string, 0, $pos['start']['open']);
+ $subject = substr($string, $pos['start']['open'], $pos['end']['close'] - $pos['start']['open']);
+ $end = substr($string, $pos['end']['close']);
+ if($end === false)
+ $end = '';
+
+ $subject = preg_replace($pattern, $replace, $subject);
+ $string = $start . $subject . $end;
+
+ $occurance++;
+ $pos = get_bb_tag_pos($string, $name, $occurance);
+ }
+
+ return $string;
+}
function tryoembed($match) {
@@ -383,7 +443,7 @@ function bb_definitionList($match) {
$eatLeadingSpaces = '(?:&nbsp;|[ \t])*'; // prevent spaces infront of [*= from adding another line to the previous element
$listElements = preg_replace('/^(\n|<br \/>)/', '', $match[2]); // ltrim the first newline
$listElements = preg_replace(
- '/' . $eatLeadingSpaces . '\[\*=([[:print:]]*?)(?<!\\\)\]/ism',
+ '/' . $eatLeadingSpaces . '\[\*=([[:print:]]*?)(?<!\\\)\]/uism',
$closeDescriptionTag . '<dt>$1</dt><dd>',
$listElements
);
@@ -555,10 +615,7 @@ function bb_code_options($match) {
}
function bb_highlight($match) {
- $lang = ((in_array(strtolower($match[1]),['php','css','mysql','sql','abap','diff','html','perl','ruby',
- 'vbscript','avrc','dtd','java','xml','cpp','python','javascript','js','json','sh']))
- ? strtolower($match[1]) : 'php' );
- return text_highlight($match[2],$lang);
+ return text_highlight($match[2],strtolower($match[1]));
}
function bb_fixtable_lf($match) {
@@ -782,7 +839,7 @@ function bbcode($Text, $preserve_nl = false, $tryoembed = true, $cache = false)
if($tryoembed) {
$Text = preg_replace_callback("/([^\]\='".'"'."\/]|^|\#\^)(https?\:\/\/$urlchars+)/ism", 'tryoembed', $Text);
}
- $Text = preg_replace("/([^\]\='".'"'."\/]|^|\#\^)(https?\:\/\/$urlchars+)/ism", '$1<a href="$2" target="_blank" >$2</a>', $Text);
+ $Text = preg_replace("/([^\]\='".'"'."\/]|^|\#\^)(https?\:\/\/$urlchars+)/ism", '$1<a href="$2" target="_blank" rel="nofollow noopener">$2</a>', $Text);
}
if (strpos($Text,'[/share]') !== false) {
@@ -794,16 +851,16 @@ function bbcode($Text, $preserve_nl = false, $tryoembed = true, $cache = false)
}
}
if (strpos($Text,'[/url]') !== false) {
- $Text = preg_replace("/\#\^\[url\]([$URLSearchString]*)\[\/url\]/ism", '<span class="bookmark-identifier">#^</span><a class="bookmark" href="$1" target="_blank" >$1</a>', $Text);
- $Text = preg_replace("/\#\^\[url\=([$URLSearchString]*)\](.*?)\[\/url\]/ism", '<span class="bookmark-identifier">#^</span><a class="bookmark" href="$1" target="_blank" >$2</a>', $Text);
- $Text = preg_replace("/\[url\]([$URLSearchString]*)\[\/url\]/ism", '<a href="$1" target="_blank" >$1</a>', $Text);
- $Text = preg_replace("/\[url\=([$URLSearchString]*)\](.*?)\[\/url\]/ism", '<a href="$1" target="_blank" >$2</a>', $Text);
+ $Text = preg_replace("/\#\^\[url\]([$URLSearchString]*)\[\/url\]/ism", '<span class="bookmark-identifier">#^</span><a class="bookmark" href="$1" target="_blank" rel="nofollow noopener" >$1</a>', $Text);
+ $Text = preg_replace("/\#\^\[url\=([$URLSearchString]*)\](.*?)\[\/url\]/ism", '<span class="bookmark-identifier">#^</span><a class="bookmark" href="$1" target="_blank" rel="nofollow noopener" >$2</a>', $Text);
+ $Text = preg_replace("/\[url\]([$URLSearchString]*)\[\/url\]/ism", '<a href="$1" target="_blank" rel="nofollow noopener" >$1</a>', $Text);
+ $Text = preg_replace("/\[url\=([$URLSearchString]*)\](.*?)\[\/url\]/ism", '<a href="$1" target="_blank" rel="nofollow noopener" >$2</a>', $Text);
}
if (strpos($Text,'[/zrl]') !== false) {
- $Text = preg_replace("/\#\^\[zrl\]([$URLSearchString]*)\[\/zrl\]/ism", '<span class="bookmark-identifier">#^</span><a class="zrl bookmark" href="$1" target="_blank" >$1</a>', $Text);
- $Text = preg_replace("/\#\^\[zrl\=([$URLSearchString]*)\](.*?)\[\/zrl\]/ism", '<span class="bookmark-identifier">#^</span><a class="zrl bookmark" href="$1" target="_blank" >$2</a>', $Text);
- $Text = preg_replace("/\[zrl\]([$URLSearchString]*)\[\/zrl\]/ism", '<a class="zrl" href="$1" target="_blank" >$1</a>', $Text);
- $Text = preg_replace("/\[zrl\=([$URLSearchString]*)\](.*?)\[\/zrl\]/ism", '<a class="zrl" href="$1" target="_blank" >$2</a>', $Text);
+ $Text = preg_replace("/\#\^\[zrl\]([$URLSearchString]*)\[\/zrl\]/ism", '<span class="bookmark-identifier">#^</span><a class="zrl bookmark" href="$1" target="_blank" rel="nofollow noopener" >$1</a>', $Text);
+ $Text = preg_replace("/\#\^\[zrl\=([$URLSearchString]*)\](.*?)\[\/zrl\]/ism", '<span class="bookmark-identifier">#^</span><a class="zrl bookmark" href="$1" target="_blank" rel="nofollow noopener" >$2</a>', $Text);
+ $Text = preg_replace("/\[zrl\]([$URLSearchString]*)\[\/zrl\]/ism", '<a class="zrl" href="$1" target="_blank" rel="nofollow noopener" >$1</a>', $Text);
+ $Text = preg_replace("/\[zrl\=([$URLSearchString]*)\](.*?)\[\/zrl\]/ism", '<a class="zrl" href="$1" target="_blank" rel="nofollow noopener" >$2</a>', $Text);
}
if (get_account_techlevel() < 2)
@@ -811,8 +868,8 @@ function bbcode($Text, $preserve_nl = false, $tryoembed = true, $cache = false)
// Perform MAIL Search
if (strpos($Text,'[/mail]') !== false) {
- $Text = preg_replace("/\[mail\]([$MAILSearchString]*)\[\/mail\]/", '<a href="mailto:$1" target="_blank" >$1</a>', $Text);
- $Text = preg_replace("/\[mail\=([$MAILSearchString]*)\](.*?)\[\/mail\]/", '<a href="mailto:$1" target="_blank" >$2</a>', $Text);
+ $Text = preg_replace("/\[mail\]([$MAILSearchString]*)\[\/mail\]/", '<a href="mailto:$1" target="_blank" rel="nofollow noopener" >$1</a>', $Text);
+ $Text = preg_replace("/\[mail\=([$MAILSearchString]*)\](.*?)\[\/mail\]/", '<a href="mailto:$1" target="_blank" rel="nofollow noopener" >$2</a>', $Text);
}
@@ -1132,17 +1189,17 @@ function bbcode($Text, $preserve_nl = false, $tryoembed = true, $cache = false)
// if video couldn't be embedded, link to it instead.
if (strpos($Text,'[/video]') !== false) {
- $Text = preg_replace("/\[video\](.*?)\[\/video\]/", '<a href="$1" target="_blank" >$1</a>', $Text);
+ $Text = preg_replace("/\[video\](.*?)\[\/video\]/", '<a href="$1" target="_blank" rel="nofollow noopener" >$1</a>', $Text);
}
if (strpos($Text,'[/audio]') !== false) {
- $Text = preg_replace("/\[audio\](.*?)\[\/audio\]/", '<a href="$1" target="_blank" >$1</a>', $Text);
+ $Text = preg_replace("/\[audio\](.*?)\[\/audio\]/", '<a href="$1" target="_blank" rel="nofollow noopener" >$1</a>', $Text);
}
if (strpos($Text,'[/zvideo]') !== false) {
- $Text = preg_replace("/\[zvideo\](.*?)\[\/zvideo\]/", '<a class="zid" href="$1" target="_blank" >$1</a>', $Text);
+ $Text = preg_replace("/\[zvideo\](.*?)\[\/zvideo\]/", '<a class="zid" href="$1" target="_blank" rel="nofollow noopener" >$1</a>', $Text);
}
if (strpos($Text,'[/zaudio]') !== false) {
- $Text = preg_replace("/\[zaudio\](.*?)\[\/zaudio\]/", '<a class="zid" href="$1" target="_blank" >$1</a>', $Text);
+ $Text = preg_replace("/\[zaudio\](.*?)\[\/zaudio\]/", '<a class="zid" href="$1" target="_blank" rel="nofollow noopener" >$1</a>', $Text);
}
// if ($tryoembed){
@@ -1151,7 +1208,7 @@ function bbcode($Text, $preserve_nl = false, $tryoembed = true, $cache = false)
// }
// } else {
// if (strpos($Text,'[/iframe]') !== false) {
-// $Text = preg_replace("/\[iframe\](.*?)\[\/iframe\]/ism", '<a href="$1" target="_blank" >$1</a>', $Text);
+// $Text = preg_replace("/\[iframe\](.*?)\[\/iframe\]/ism", '<a href="$1" target="_blank" rel="nofollow noopener" >$1</a>', $Text);
// }
// }
@@ -1174,6 +1231,7 @@ function bbcode($Text, $preserve_nl = false, $tryoembed = true, $cache = false)
$Text = preg_replace("/\[event\-start\](.*?)\[\/event\-start\]/ism",$sub,$Text);
+ $Text = preg_replace("/\[event\](.*?)\[\/event\]/ism",'',$Text);
$Text = preg_replace("/\[event\-summary\](.*?)\[\/event\-summary\]/ism",'',$Text);
$Text = preg_replace("/\[event\-description\](.*?)\[\/event\-description\]/ism",'',$Text);
$Text = preg_replace("/\[event\-finish\](.*?)\[\/event\-finish\]/ism",'',$Text);
diff --git a/include/channel.php b/include/channel.php
index 31dca1ae5..49da57fd6 100644
--- a/include/channel.php
+++ b/include/channel.php
@@ -258,6 +258,7 @@ function create_identity($arr) {
'channel_system' => intval($system),
'channel_expire_days' => intval($expire),
'channel_timezone' => App::$timezone
+
]
);
@@ -736,14 +737,14 @@ function identity_basic_export($channel_id, $sections = null) {
$ret['conv'] = $r;
}
- $r = q("select * from mail where mail.uid = %d",
+ $r = q("select * from mail where channel_id = %d",
intval($channel_id)
);
if($r) {
$m = array();
foreach($r as $rr) {
xchan_mail_query($rr);
- $m[] = mail_encode($rr,true);
+ $m[] = encode_mail($rr,true);
}
$ret['mail'] = $m;
}
@@ -1161,31 +1162,16 @@ function profile_sidebar($profile, $block = 0, $show_connect = true, $zcard = fa
$location = $reddress = $pdesc = $gender = $marital = $homepage = False;
}
+ if($profile['gender']) {
+ $profile['gender_icon'] = gender_icon($profile['gender']);
+ }
+
$firstname = ((strpos($profile['channel_name'],' '))
? trim(substr($profile['channel_name'],0,strpos($profile['channel_name'],' '))) : $profile['channel_name']);
$lastname = (($firstname === $profile['channel_name']) ? '' : trim(substr($profile['channel_name'],strlen($firstname))));
// @fixme move this to the diaspora plugin itself
- if(plugin_is_installed('diaspora')) {
- $diaspora = array(
- 'podloc' => z_root(),
- 'guid' => $profile['channel_guid'] . str_replace('.','',App::get_hostname()),
- 'pubkey' => pemtorsa($profile['channel_pubkey']),
- 'searchable' => (($block) ? 'false' : 'true'),
- 'nickname' => $profile['channel_address'],
- 'fullname' => $profile['channel_name'],
- 'firstname' => $firstname,
- 'lastname' => $lastname,
- 'photo300' => z_root() . '/photo/profile/300/' . $profile['uid'] . '.jpg',
- 'photo100' => z_root() . '/photo/profile/100/' . $profile['uid'] . '.jpg',
- 'photo50' => z_root() . '/photo/profile/50/' . $profile['uid'] . '.jpg',
- );
- }
- else
- $diaspora = '';
-
-
$contact_block = contact_block();
$channel_menu = false;
@@ -1218,7 +1204,6 @@ function profile_sidebar($profile, $block = 0, $show_connect = true, $zcard = fa
'$marital' => $marital,
'$homepage' => $homepage,
'$chanmenu' => $channel_menu,
- '$diaspora' => $diaspora,
'$reddress' => $reddress,
'$rating' => '',
'$contact_block' => $contact_block,
@@ -1229,7 +1214,29 @@ function profile_sidebar($profile, $block = 0, $show_connect = true, $zcard = fa
call_hooks('profile_sidebar', $arr);
- return $o;
+ return $arr['entry'];
+
+}
+
+function gender_icon($gender) {
+
+// logger('gender: ' . $gender);
+
+ // This can easily get throw off if the observer language is different
+ // than the channel owner language.
+
+ if(strpos(strtolower($gender),strtolower(t('Female'))) !== false)
+ return 'venus';
+ if(strpos(strtolower($gender),strtolower(t('Male'))) !== false)
+ return 'mars';
+ if(strpos(strtolower($gender),strtolower(t('Trans'))) !== false)
+ return 'transgender';
+ if(strpos(strtolower($gender),strtolower(t('Neuter'))) !== false)
+ return 'neuter';
+ if(strpos(strtolower($gender),strtolower(t('Non-specific'))) !== false)
+ return 'genderless';
+
+ return '';
}
@@ -1998,49 +2005,48 @@ function remote_login() {
}
-
function channel_store_lowlevel($arr) {
+ $store = [
+ 'channel_account_id' => ((array_key_exists('channel_account_id',$arr)) ? $arr['channel_account_id'] : '0'),
+ 'channel_primary' => ((array_key_exists('channel_primary',$arr)) ? $arr['channel_primary'] : '0'),
+ 'channel_name' => ((array_key_exists('channel_name',$arr)) ? $arr['channel_name'] : ''),
+ 'channel_address' => ((array_key_exists('channel_address',$arr)) ? $arr['channel_address'] : ''),
+ 'channel_guid' => ((array_key_exists('channel_guid',$arr)) ? $arr['channel_guid'] : ''),
+ 'channel_guid_sig' => ((array_key_exists('channel_guid_sig',$arr)) ? $arr['channel_guid_sig'] : ''),
+ 'channel_hash' => ((array_key_exists('channel_hash',$arr)) ? $arr['channel_hash'] : ''),
+ 'channel_timezone' => ((array_key_exists('channel_timezone',$arr)) ? $arr['channel_timezone'] : 'UTC'),
+ 'channel_location' => ((array_key_exists('channel_location',$arr)) ? $arr['channel_location'] : ''),
+ 'channel_theme' => ((array_key_exists('channel_theme',$arr)) ? $arr['channel_theme'] : ''),
+ 'channel_startpage' => ((array_key_exists('channel_startpage',$arr)) ? $arr['channel_startpage'] : ''),
+ 'channel_pubkey' => ((array_key_exists('channel_pubkey',$arr)) ? $arr['channel_pubkey'] : ''),
+ 'channel_prvkey' => ((array_key_exists('channel_prvkey',$arr)) ? $arr['channel_prvkey'] : ''),
+ 'channel_notifyflags' => ((array_key_exists('channel_notifyflags',$arr)) ? $arr['channel_notifyflags'] : '65535'),
+ 'channel_pageflags' => ((array_key_exists('channel_pageflags',$arr)) ? $arr['channel_pageflags'] : '0'),
+ 'channel_dirdate' => ((array_key_exists('channel_dirdate',$arr)) ? $arr['channel_dirdate'] : NULL_DATE),
+ 'channel_lastpost' => ((array_key_exists('channel_lastpost',$arr)) ? $arr['channel_lastpost'] : NULL_DATE),
+ 'channel_deleted' => ((array_key_exists('channel_deleted',$arr)) ? $arr['channel_deleted'] : NULL_DATE),
+ 'channel_max_anon_mail' => ((array_key_exists('channel_max_anon_mail',$arr)) ? $arr['channel_max_anon_mail'] : '10'),
+ 'channel_max_friend_req' => ((array_key_exists('channel_max_friend_req',$arr)) ? $arr['channel_max_friend_req'] : '10'),
+ 'channel_expire_days' => ((array_key_exists('channel_expire_days',$arr)) ? $arr['channel_expire_days'] : '0'),
+ 'channel_passwd_reset' => ((array_key_exists('channel_passwd_reset',$arr)) ? $arr['channel_passwd_reset'] : ''),
+ 'channel_default_group' => ((array_key_exists('channel_default_group',$arr)) ? $arr['channel_default_group'] : ''),
+ 'channel_allow_cid' => ((array_key_exists('channel_allow_cid',$arr)) ? $arr['channel_allow_cid'] : ''),
+ 'channel_allow_gid' => ((array_key_exists('channel_allow_gid',$arr)) ? $arr['channel_allow_gid'] : ''),
+ 'channel_deny_cid' => ((array_key_exists('channel_deny_cid',$arr)) ? $arr['channel_deny_cid'] : ''),
+ 'channel_deny_gid' => ((array_key_exists('channel_deny_gid',$arr)) ? $arr['channel_deny_gid'] : ''),
+ 'channel_removed' => ((array_key_exists('channel_removed',$arr)) ? $arr['channel_removed'] : '0'),
+ 'channel_system' => ((array_key_exists('channel_system',$arr)) ? $arr['channel_system'] : '0'),
- $store = [
- 'channel_account_id' => ((array_key_exists('channel_account_id',$arr)) ? $arr['channel_account_id'] : '0'),
- 'channel_primary' => ((array_key_exists('channel_primary',$arr)) ? $arr['channel_primary'] : '0'),
- 'channel_name' => ((array_key_exists('channel_name',$arr)) ? $arr['channel_name'] : ''),
- 'channel_address' => ((array_key_exists('channel_address',$arr)) ? $arr['channel_address'] : ''),
- 'channel_guid' => ((array_key_exists('channel_guid',$arr)) ? $arr['channel_guid'] : ''),
- 'channel_guid_sig' => ((array_key_exists('channel_guid_sig',$arr)) ? $arr['channel_guid_sig'] : ''),
- 'channel_hash' => ((array_key_exists('channel_hash',$arr)) ? $arr['channel_hash'] : ''),
- 'channel_timezone' => ((array_key_exists('channel_timezone',$arr)) ? $arr['channel_timezone'] : 'UTC'),
- 'channel_location' => ((array_key_exists('channel_location',$arr)) ? $arr['channel_location'] : ''),
- 'channel_theme' => ((array_key_exists('channel_theme',$arr)) ? $arr['channel_theme'] : ''),
- 'channel_startpage' => ((array_key_exists('channel_startpage',$arr)) ? $arr['channel_startpage'] : ''),
- 'channel_pubkey' => ((array_key_exists('channel_pubkey',$arr)) ? $arr['channel_pubkey'] : ''),
- 'channel_prvkey' => ((array_key_exists('channel_prvkey',$arr)) ? $arr['channel_prvkey'] : ''),
- 'channel_notifyflags' => ((array_key_exists('channel_notifyflags',$arr)) ? $arr['channel_notifyflags'] : '65535'),
- 'channel_pageflags' => ((array_key_exists('channel_pageflags',$arr)) ? $arr['channel_pageflags'] : '0'),
- 'channel_dirdate' => ((array_key_exists('channel_dirdate',$arr)) ? $arr['channel_dirdate'] : NULL_DATE),
- 'channel_lastpost' => ((array_key_exists('channel_lastpost',$arr)) ? $arr['channel_lastpost'] : NULL_DATE),
- 'channel_deleted' => ((array_key_exists('channel_deleted',$arr)) ? $arr['channel_deleted'] : NULL_DATE),
- 'channel_max_anon_mail' => ((array_key_exists('channel_max_anon_mail',$arr)) ? $arr['channel_max_anon_mail'] : '10'),
- 'channel_max_friend_req' => ((array_key_exists('channel_max_friend_req',$arr)) ? $arr['channel_max_friend_req'] : '10'),
- 'channel_expire_days' => ((array_key_exists('channel_expire_days',$arr)) ? $arr['channel_expire_days'] : '0'),
- 'channel_passwd_reset' => ((array_key_exists('channel_passwd_reset',$arr)) ? $arr['channel_passwd_reset'] : ''),
- 'channel_default_group' => ((array_key_exists('channel_default_group',$arr)) ? $arr['channel_default_group'] : ''),
- 'channel_allow_cid' => ((array_key_exists('channel_allow_cid',$arr)) ? $arr['channel_allow_cid'] : ''),
- 'channel_allow_gid' => ((array_key_exists('channel_allow_gid',$arr)) ? $arr['channel_allow_gid'] : ''),
- 'channel_deny_cid' => ((array_key_exists('channel_deny_cid',$arr)) ? $arr['channel_deny_cid'] : ''),
- 'channel_deny_gid' => ((array_key_exists('channel_deny_gid',$arr)) ? $arr['channel_deny_gid'] : ''),
- 'channel_removed' => ((array_key_exists('channel_removed',$arr)) ? $arr['channel_removed'] : '0'),
- 'channel_system' => ((array_key_exists('channel_system',$arr)) ? $arr['channel_system'] : '0'),
'channel_moved' => ((array_key_exists('channel_moved',$arr)) ? $arr['channel_moved'] : ''),
'channel_password' => ((array_key_exists('channel_password',$arr)) ? $arr['channel_password'] : ''),
'channel_salt' => ((array_key_exists('channel_salt',$arr)) ? $arr['channel_salt'] : '')
+
];
return create_table_from_array('channel',$store);
}
-
function profile_store_lowlevel($arr) {
$store = [
@@ -2322,4 +2328,76 @@ function channel_codeallowed($channel_id) {
return true;
return false;
+
+}
+
+function anon_identity_init($reqvars) {
+
+ $x = [ 'request_vars' => $reqvars, 'xchan' => null, 'success' => 'unset' ];
+ call_hooks('anon_identity_init',$x);
+ if($x['success'] !== 'unset' && intval($x['success']) && $x['xchan'])
+ return $x['xchan'];
+
+ // allow a captcha handler to over-ride
+ if($x['success'] !== 'unset' && (intval($x['success']) === 0))
+ return false;
+
+
+ $anon_name = strip_tags(trim($reqvars['anonname']));
+ $anon_email = strip_tags(trim($reqvars['anonmail']));
+ $anon_url = strip_tags(trim($reqvars['anonurl']));
+
+ if(! ($anon_name && $anon_email)) {
+ logger('anonymous commenter did not complete form');
+ return false;
+ }
+
+ if(! validate_email($anon_email)) {
+ logger('enonymous email not valid');
+ return false;
+ }
+
+ if(! $anon_url)
+ $anon_url = z_root();
+
+ $hash = hash('md5',$anon_email);
+
+ $x = q("select * from xchan where xchan_guid = '%s' and xchan_hash = '%s' and xchan_network = 'unknown' limit 1",
+ dbesc($anon_email),
+ dbesc($hash)
+ );
+
+ if(! $x) {
+ xchan_store_lowlevel([
+ 'xchan_guid' => $anon_email,
+ 'xchan_hash' => $hash,
+ 'xchan_name' => $anon_name,
+ 'xchan_url' => $anon_url,
+ 'xchan_network' => 'unknown',
+ 'xchan_name_date' => datetime_convert()
+ ]);
+
+
+ $x = q("select * from xchan where xchan_guid = '%s' and xchan_hash = '%s' and xchan_network = 'unknown' limit 1",
+ dbesc($anon_email),
+ dbesc($hash)
+ );
+
+ $photo = z_root() . '/' . get_default_profile_photo(300);
+ $photos = import_xchan_photo($photo,$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' where xchan_guid = '%s' and xchan_hash = '%s' and xchan_network = 'unknown' ",
+ dbesc(datetime_convert()),
+ dbesc($photos[0]),
+ dbesc($photos[1]),
+ dbesc($photos[2]),
+ dbesc($photos[3]),
+ dbesc($anon_email),
+ dbesc($hash)
+ );
+
+ }
+
+ return $x[0];
}
+
+
diff --git a/include/connections.php b/include/connections.php
index 8f4f84e1a..8df795190 100644
--- a/include/connections.php
+++ b/include/connections.php
@@ -341,6 +341,11 @@ function contact_remove($channel_id, $abook_id) {
logger('removing contact ' . $abook_id . ' for channel ' . $channel_id,LOGGER_DEBUG);
+
+ $x = [ 'channel_id' => $channel_id, 'abook_id' => $abook_id ];
+ call_hooks('connection_remove',$x);
+
+
$archive = get_pconfig($channel_id, 'system','archive_removed_contacts');
if($archive) {
q("update abook set abook_archived = 1 where abook_id = %d and abook_channel = %d",
@@ -415,9 +420,9 @@ function random_profile() {
for($i = 0; $i < $retryrandom; $i++) {
- $r = q("select xchan_url from xchan left join hubloc on hubloc_hash = xchan_hash where xchan_addr not like '%s' and xchan_hidden = 0 and hubloc_connected > %s - interval %s order by $randfunc limit 1",
- dbesc('sys@%'),
- db_utcnow(), db_quoteinterval('30 day')
+ $r = q("select xchan_url, xchan_hash from xchan left join hubloc on hubloc_hash = xchan_hash where xchan_hidden = 0 and xchan_system = 0 and hubloc_connected > %s - interval %s order by $randfunc limit 1",
+ db_utcnow(),
+ db_quoteinterval('30 day')
);
if(!$r) return ''; // Couldn't get a random channel
@@ -425,12 +430,12 @@ function random_profile() {
if($checkrandom) {
$x = z_fetch_url($r[0]['xchan_url']);
if($x['success'])
- return $r[0]['xchan_url'];
+ return $r[0]['xchan_hash'];
else
logger('Random channel turned out to be bad.');
}
else {
- return $r[0]['xchan_url'];
+ return $r[0]['xchan_hash'];
}
}
@@ -629,7 +634,7 @@ function get_vcard_array($vc,$id) {
'address' => $adr->getParts()
];
$last_entry = end($adrs);
- if($adrs[$last_entry]['address'])
+ if($last_entry && is_array($adrs[$last_entry]['address']))
array_walk($adrs[$last_entry]['address'],'array_escape_tags');
}
}
@@ -712,4 +717,4 @@ function vcard_query(&$r) {
}
}
}
-} \ No newline at end of file
+}
diff --git a/include/conversation.php b/include/conversation.php
index 0f940b1a3..23220b390 100644
--- a/include/conversation.php
+++ b/include/conversation.php
@@ -353,14 +353,6 @@ function localize_item(&$item){
}
*/
- // if item body was obscured and we changed it, re-obscure it
- // FIXME - we need a better filter than just the string 'data'; try and
- // match the fact that it's json encoded
-
- if(intval($item['item_obscured'])
- && strlen($item['body']) && (! strpos($item['body'],'data'))) {
- $item['body'] = z_obscure($item['body']);
- }
}
@@ -450,7 +442,6 @@ function is_edit_activity($item) {
* figures out how to determine page owner and other contextual items
* that are based on unique features of the calling module.
*
- * @param App &$a
* @param array $items
* @param string $mode
* @param boolean $update
@@ -458,7 +449,7 @@ function is_edit_activity($item) {
* @param string $prepared_item
* @return string
*/
-function conversation(&$a, $items, $mode, $update, $page_mode = 'traditional', $prepared_item = '') {
+function conversation($items, $mode, $update, $page_mode = 'traditional', $prepared_item = '') {
$content_html = '';
$o = '';
@@ -541,8 +532,12 @@ function conversation(&$a, $items, $mode, $update, $page_mode = 'traditional', $
$live_update_div = '<div id="live-search"></div>' . "\r\n";
}
+ elseif ($mode === 'moderate') {
+ $profile_owner = local_channel();
+ }
+
elseif ($mode === 'photos') {
- $profile_onwer = App::$profile['profile_uid'];
+ $profile_owner = App::$profile['profile_uid'];
$page_writeable = ($profile_owner == local_channel());
$live_update_div = '<div id="live-photos"></div>' . "\r\n";
// for photos we've already formatted the top-level item (the photo)
@@ -585,7 +580,7 @@ function conversation(&$a, $items, $mode, $update, $page_mode = 'traditional', $
if($items) {
- if($mode === 'network-new' || $mode === 'search' || $mode === 'community') {
+ if(in_array($mode, [ 'network-new', 'search', 'community', 'moderate' ])) {
// "New Item View" on network page or search page results
// - just loop through the items and format them minimally for display
@@ -617,14 +612,14 @@ function conversation(&$a, $items, $mode, $update, $page_mode = 'traditional', $
if(((activity_match($item['verb'],ACTIVITY_LIKE)) || (activity_match($item['verb'],ACTIVITY_DISLIKE)))
&& ($item['id'] != $item['parent']))
continue;
- $nickname = $item['nickname'];
+// $nickname = $item['nickname'];
}
- else
- $nickname = App::$user['nickname'];
+// else
+// $nickname = App::$user['nickname'];
- $profile_name = ((strlen($item['author-name'])) ? $item['author-name'] : $item['name']);
- if($item['author-link'] && (! $item['author-name']))
- $profile_name = $item['author-link'];
+// $profile_name = ((strlen($item['author-name'])) ? $item['author-name'] : $item['name']);
+// if($item['author-link'] && (! $item['author-name']))
+// $profile_name = $item['author-link'];
$sp = false;
$profile_link = best_link_url($item,$sp);
@@ -633,7 +628,7 @@ function conversation(&$a, $items, $mode, $update, $page_mode = 'traditional', $
else
$profile_link = zid($profile_link);
- $normalised = normalise_link((strlen($item['author-link'])) ? $item['author-link'] : $item['url']);
+// $normalised = normalise_link((strlen($item['author-link'])) ? $item['author-link'] : $item['url']);
$profile_name = $item['author']['xchan_name'];
$profile_link = $item['author']['xchan_url'];
@@ -687,6 +682,8 @@ function conversation(&$a, $items, $mode, $update, $page_mode = 'traditional', $
'template' => $tpl,
'toplevel' => 'toplevel_item',
'mode' => $mode,
+ 'approve' => t('Approve'),
+ 'delete' => t('Delete'),
'id' => (($preview) ? 'P0' : $item['item_id']),
'linktitle' => sprintf( t('View %s\'s profile @ %s'), $profile_name, $profile_url),
'profile_url' => $profile_link,
@@ -917,9 +914,9 @@ function thread_action_menu($item,$mode = '') {
}
-function author_is_pmable($xchan) {
+function author_is_pmable($xchan, $abook) {
- $x = [ 'xchan' => $xchan, 'result' => 'unset' ];
+ $x = [ 'xchan' => $xchan, 'abook' => $abook, 'result' => 'unset' ];
call_hooks('author_is_pmable',$x);
if($x['result'] !== 'unset')
return $x['result'];
@@ -949,7 +946,7 @@ function thread_author_menu($item, $mode = '') {
}
$profile_link = chanlink_hash($item['author_xchan']);
-
+ $contact = false;
if(App::$contacts && array_key_exists($item['author_xchan'],App::$contacts))
$contact = App::$contacts[$item['author_xchan']];
@@ -958,9 +955,9 @@ function thread_author_menu($item, $mode = '') {
$follow_url = z_root() . '/follow/?f=&url=' . urlencode($item['author']['xchan_addr']);
- if($item['uid'] > 0 && author_is_pmable($item['author']))
+ if($item['uid'] > 0 && author_is_pmable($item['author'],$contact)) {
$pm_url = z_root() . '/mail/new/?f=&hash=' . urlencode($item['author_xchan']);
-
+ }
if($contact) {
@@ -1625,11 +1622,9 @@ function network_tabs() {
// tabs
$tabs = array();
- $d = get_config('system','disable_discover_tab');
- if($d === false)
- $d = 1;
+ $disable_discover_tab = get_config('system','disable_discover_tab') || get_config('system','disable_discover_tab') === false;
- if(! $d) {
+ if(! $disable_discover_tab) {
$tabs[] = array(
'label' => t('Discover'),
'url' => z_root() . '/' . $cmd . '?f=&fh=1' ,
diff --git a/include/dba/dba_driver.php b/include/dba/dba_driver.php
index d362f58b2..7e925a106 100755
--- a/include/dba/dba_driver.php
+++ b/include/dba/dba_driver.php
@@ -163,8 +163,9 @@ abstract class dba_driver {
}
function get_install_script() {
- if(file_exists('install/' . PLATFORM_NAME . '/' . \DBA::$install_script))
- return 'install/' . PLATFORM_NAME . '/' . \DBA::$install_script;
+ $platform_name = \Zotlabs\Lib\System::get_platform_name();
+ if(file_exists('install/' . $platform_name . '/' . \DBA::$install_script))
+ return 'install/' . $platform_name . '/' . \DBA::$install_script;
return 'install/' . \DBA::$install_script;
}
@@ -344,11 +345,8 @@ function q($sql) {
if(\DBA::$dba && \DBA::$dba->connected) {
$stmt = vsprintf($sql, $args);
if($stmt === false) {
- if(version_compare(PHP_VERSION, '5.4.0') >= 0)
- db_logger('dba: vsprintf error: ' .
- print_r(debug_backtrace(DEBUG_BACKTRACE_PROVIDE_OBJECT, 1), true),LOGGER_NORMAL,LOG_CRIT);
- else
- db_logger('dba: vsprintf error: ' . print_r(debug_backtrace(), true),LOGGER_NORMAL,LOG_CRIT);
+ db_logger('dba: vsprintf error: ' .
+ print_r(debug_backtrace(DEBUG_BACKTRACE_PROVIDE_OBJECT, 1), true),LOGGER_NORMAL,LOG_CRIT);
}
if(\DBA::$dba->debug)
db_logger('Sql: ' . $stmt, LOGGER_DEBUG, LOG_INFO);
@@ -445,6 +443,20 @@ function db_getfunc($f) {
return $f;
}
+function db_load_file($f) {
+ // db errors should get logged to the logfile
+ $str = @file_get_contents($f);
+ $arr = explode(';', $str);
+ if($arr) {
+ foreach($arr as $a) {
+ if(strlen(trim($a))) {
+ $r = dbq(trim($a));
+ }
+ }
+ }
+}
+
+
// The logger function may make DB calls internally to query the system logging parameters.
// This can cause a recursion if database debugging is enabled.
// So this function preserves the current database debugging state and then turns it off
diff --git a/include/dba/dba_pdo.php b/include/dba/dba_pdo.php
index f76e6cdd7..f119d8926 100755
--- a/include/dba/dba_pdo.php
+++ b/include/dba/dba_pdo.php
@@ -74,19 +74,19 @@ class dba_pdo extends dba_driver {
return $result;
}
- if($this->debug) {
- db_logger('dba_pdo: DEBUG: ' . printable($sql) . ' returned ' . count($result) . ' results.', LOGGER_NORMAL, LOG_INFO);
- }
-
$r = array();
if($result) {
foreach($result as $x) {
$r[] = $x;
}
- if($this->debug) {
- db_logger('dba_pdo: ' . printable(print_r($r,true)), LOGGER_NORMAL, LOG_INFO);
- }
}
+
+ if($this->debug) {
+ db_logger('dba_pdo: DEBUG: ' . printable($sql) . ' returned ' . count($r) . ' results.', LOGGER_NORMAL, LOG_INFO);
+ db_logger('dba_pdo: ' . printable(print_r($r,true)), LOGGER_NORMAL, LOG_INFO);
+ }
+
+
return (($this->error) ? false : $r);
}
diff --git a/include/event.php b/include/event.php
index c57e52bc0..b56a5fb3e 100644
--- a/include/event.php
+++ b/include/event.php
@@ -210,6 +210,10 @@ function format_event_bbcode($ev) {
$o = '';
+ if($ev['event_vdata']) {
+ $o .= '[event]' . $ev['event_vdata'] . '[/event]';
+ }
+
if($ev['summary'])
$o .= '[event-summary]' . $ev['summary'] . '[/event-summary]';
@@ -1232,3 +1236,71 @@ function tasks_fetch($arr) {
return $ret;
}
+
+function cdav_principal($uri) {
+ $r = q("SELECT uri FROM principals WHERE uri = '%s' LIMIT 1",
+ dbesc($uri)
+ );
+
+ if($r[0]['uri'] === $uri)
+ return true;
+ else
+ return false;
+}
+
+function cdav_perms($needle, $haystack, $check_rw = false) {
+ foreach ($haystack as $item) {
+ if($check_rw) {
+ if(is_array($item['id'])) {
+ if ($item['id'][0] == $needle && $item['share-access'] != 2) {
+ return $item['{DAV:}displayname'];
+ }
+ }
+ else {
+ if ($item['id'] == $needle && $item['share-access'] != 2) {
+ return $item['{DAV:}displayname'];
+ }
+ }
+ }
+ else {
+ if(is_array($item['id'])) {
+ if ($item['id'][0] == $needle) {
+ return $item['{DAV:}displayname'];
+ }
+ }
+ else {
+ if ($item['id'] == $needle) {
+ return $item['{DAV:}displayname'];
+ }
+ }
+ }
+ }
+ return false;
+}
+
+
+function translate_type($type) {
+
+ if(!$type)
+ return;
+
+ $type = strtoupper($type);
+
+ $map = [
+ 'CELL' => t('Mobile'),
+ 'HOME' => t('Home'),
+ 'HOME,VOICE' => t('Home, Voice'),
+ 'HOME,FAX' => t('Home, Fax'),
+ 'WORK' => t('Work'),
+ 'WORK,VOICE' => t('Work, Voice'),
+ 'WORK,FAX' => t('Work, Fax'),
+ 'OTHER' => t('Other')
+ ];
+
+ if (array_key_exists($type, $map)) {
+ return [$type, $map[$type]];
+ }
+ else {
+ return [$type, t('Other') . ' (' . $type . ')'];
+ }
+}
diff --git a/include/features.php b/include/features.php
index 0fc6fbc1d..f32dbe82e 100644
--- a/include/features.php
+++ b/include/features.php
@@ -45,10 +45,6 @@ function feature_level($feature,$def) {
function get_features($filtered = true) {
- $server_role = \Zotlabs\Lib\System::get_server_role();
-
- if($server_role === 'basic' && $filtered)
- return array();
$arr = [
@@ -424,16 +420,15 @@ function get_features($filtered = true) {
];
- if($server_role === 'pro') {
- $arr['general'][] = [
- 'premium_channel',
- t('Premium Channel'),
- t('Allows you to set restrictions and terms on those that connect with your channel'),
- false,
- get_config('feature_lock','premium_channel'),
- feature_level('premium_channel',4),
- ];
- }
+ $arr['general'][] = [
+ 'premium_channel',
+ t('Premium Channel'),
+ t('Allows you to set restrictions and terms on those that connect with your channel'),
+ false,
+ get_config('feature_lock','premium_channel'),
+ feature_level('premium_channel',4),
+ ];
+
$techlevel = get_account_techlevel();
diff --git a/include/feedutils.php b/include/feedutils.php
index 6bb7d103e..07cb79340 100644
--- a/include/feedutils.php
+++ b/include/feedutils.php
@@ -79,9 +79,11 @@ function get_feed_for($channel, $observer_hash, $params) {
$feed_author = '';
if(intval($params['compat']) === 1) {
- $feed_author = atom_author('author',$channel['channel_address'],$channel['channel_name'],$channel['xchan_url'],300,300,$channel['xchan_photo_mimetype'],$channel['xchan_photo_l']);
+ $feed_author = atom_render_author('author',$channel);
}
+ $owner = atom_render_author('zot:owner',$channel);
+
$atom .= replace_macros($feed_template, array(
'$version' => xmlify(Zotlabs\Lib\System::get_project_version()),
'$red' => xmlify(Zotlabs\Lib\System::get_platform_name()),
@@ -89,6 +91,7 @@ function get_feed_for($channel, $observer_hash, $params) {
'$feed_title' => xmlify($channel['channel_name']),
'$feed_updated' => xmlify(datetime_convert('UTC', 'UTC', 'now', ATOM_TIME)),
'$author' => $feed_author,
+ '$owner' => $owner,
'$name' => xmlify($channel['channel_name']),
'$profile_page' => xmlify($channel['xchan_url']),
'$mimephoto' => xmlify($channel['xchan_photo_mimetype']),
@@ -112,7 +115,7 @@ function get_feed_for($channel, $observer_hash, $params) {
$items = items_fetch(
[
- 'wall' => '1',
+ 'wall' => '1',
'datequery' => $params['end'],
'datequery2' => $params['begin'],
'start' => intval($params['start']),
@@ -133,7 +136,7 @@ function get_feed_for($channel, $observer_hash, $params) {
continue;
/** @BUG $owner is undefined in this call */
- $atom .= atom_entry($item, $type, null, $owner, true);
+ $atom .= atom_entry($item, $type, null, $owner, true, '', $params['compat']);
}
}
@@ -243,9 +246,17 @@ function get_atom_elements($feed, $item, &$author) {
$found_author = $item->get_author();
if($found_author) {
+ if($rawauthor) {
+ if($rawauthor[0]['child'][NAMESPACE_POCO]['displayName'][0]['data'])
+ $author['full_name'] = unxmlify($rawauthor[0]['child'][NAMESPACE_POCO]['displayName'][0]['data']);
+ }
$author['author_name'] = unxmlify($found_author->get_name());
$author['author_link'] = unxmlify($found_author->get_link());
$author['author_is_feed'] = false;
+
+ $rawauthor = $feed->get_feed_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'author');
+ logger('rawauthor: ' . print_r($rawauthor, true));
+
}
else {
$author['author_name'] = unxmlify($feed->get_title());
@@ -256,13 +267,15 @@ function get_atom_elements($feed, $item, &$author) {
if(substr($author['author_link'],-1,1) == '/')
$author['author_link'] = substr($author['author_link'],0,-1);
- $res['mid'] = unxmlify($item->get_id());
+ $res['mid'] = normalise_id(unxmlify($item->get_id()));
$res['title'] = unxmlify($item->get_title());
$res['body'] = unxmlify($item->get_content());
$res['plink'] = unxmlify($item->get_link(0));
$res['item_rss'] = 1;
+ $summary = unxmlify($item->get_description(true));
+
// removing the content of the title if its identically to the body
// This helps with auto generated titles e.g. from tumblr
@@ -275,6 +288,23 @@ function get_atom_elements($feed, $item, &$author) {
$base_url = '';
+ $rawcreated = $item->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'published');
+ if($rawcreated)
+ $res['created'] = unxmlify($rawcreated[0]['data']);
+
+ $rawedited = $item->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'updated');
+ if($rawedited)
+ $res['edited'] = unxmlify($rawedited[0]['data']);
+
+ if((x($res,'edited')) && (! (x($res,'created'))))
+ $res['created'] = $res['edited'];
+
+ if(! $res['created'])
+ $res['created'] = $item->get_date('c');
+
+ if(! $res['edited'])
+ $res['edited'] = $item->get_date('c');
+
$rawverb = $item->get_item_tags(NAMESPACE_ACTIVITY, 'verb');
// select between supported verbs
@@ -283,121 +313,125 @@ function get_atom_elements($feed, $item, &$author) {
$res['verb'] = unxmlify($rawverb[0]['data']);
}
- // translate OStatus unfollow to activity streams if it happened to get selected
-
- if((x($res,'verb')) && ($res['verb'] === 'http://ostatus.org/schema/1.0/unfollow'))
- $res['verb'] = ACTIVITY_UNFOLLOW;
+ // look for a photo. We should check media size and find the best one,
+ // but for now let's just find any author photo
- if(array_key_exists('verb',$res) && $res['verb'] === ACTIVITY_SHARE) {
- // For Mastodon shares ("boosts"), we need to parse the original author information
- // from the activity:object -> author structure
- $rawobj = $item->get_item_tags(NAMESPACE_ACTIVITY, 'object');
+ $rawauthor = $item->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_10,'author');
- if($rawobj) {
- $rawauthor = $rawobj->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'author');
- if($rawauthor && $rawauthor[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['name']) {
- $author['author_name'] = unxmlify($rawauthor[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['name']);
+ if($rawauthor && $rawauthor[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['link']) {
+ $base = $rawauthor[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['link'];
+ foreach($base as $link) {
+ if(!x($author, 'author_photo') || ! $author['author_photo']) {
+ if($link['attribs']['']['rel'] === 'photo' || $link['attribs']['']['rel'] === 'avatar')
+ $author['author_photo'] = unxmlify($link['attribs']['']['href']);
}
+ }
+ }
+ $rawactor = $item->get_item_tags(NAMESPACE_ACTIVITY, 'actor');
- if($rawauthor && $rawauthor[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['uri']) {
- $author['author_link'] = unxmlify($rawauthor[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['uri']);
- }
- if($rawauthor && $rawauthor[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['link']) {
- $base = $rawauthor[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['link'];
- foreach($base as $link) {
- if(!x($author, 'author_photo') || ! $author['author_photo']) {
- if($link['attribs']['']['rel'] === 'photo' || $link['attribs']['']['rel'] === 'avatar')
- $author['author_photo'] = unxmlify($link['attribs']['']['href']);
- }
+ if($rawactor && activity_match($rawactor[0]['child'][NAMESPACE_ACTIVITY]['obj_type'][0]['data'], ACTIVITY_OBJ_PERSON)) {
+ $base = $rawactor[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['link'];
+ if($base && count($base)) {
+ foreach($base as $link) {
+ if($link['attribs']['']['rel'] === 'alternate' && (! $res['author_link']))
+ $author['author_link'] = unxmlify($link['attribs']['']['href']);
+ if(!x($author, 'author_photo') || ! $author['author_photo']) {
+ if($link['attribs']['']['rel'] === 'avatar' || $link['attribs']['']['rel'] === 'photo')
+ $author['author_photo'] = unxmlify($link['attribs']['']['href']);
}
}
}
}
- else {
- // look for a photo. We should check media size and find the best one,
- // but for now let's just find any author photo
- $rawauthor = $item->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'author');
+ // check for a yahoo media element (github etc.)
+ if(! $author['author_photo']) {
+ $rawmedia = $item->get_item_tags(NAMESPACE_YMEDIA,'thumbnail');
+ if($rawmedia && $rawmedia[0]['attribs']['']['url']) {
+ $author['author_photo'] = strip_tags(unxmlify($rawmedia[0]['attribs']['']['url']));
+ }
+ }
+
+
+ // No photo/profile-link on the item - look at the feed level
+
+
+ if((! (x($author,'author_link'))) || (! (x($author,'author_photo')))) {
+ $rawauthor = $feed->get_feed_tags(SIMPLEPIE_NAMESPACE_ATOM_10,'author');
if($rawauthor && $rawauthor[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['link']) {
$base = $rawauthor[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['link'];
foreach($base as $link) {
- if(!x($author, 'author_photo') || ! $author['author_photo']) {
+ if($link['attribs']['']['rel'] === 'alternate' && (! $author['author_link'])) {
+ $author['author_link'] = unxmlify($link['attribs']['']['href']);
+ $author['author_is_feed'] = true;
+ }
+ if(! $author['author_photo']) {
if($link['attribs']['']['rel'] === 'photo' || $link['attribs']['']['rel'] === 'avatar')
$author['author_photo'] = unxmlify($link['attribs']['']['href']);
}
}
}
- $rawactor = $item->get_item_tags(NAMESPACE_ACTIVITY, 'actor');
+ $rawactor = $feed->get_feed_tags(NAMESPACE_ACTIVITY, 'subject');
- if($rawactor && activity_match($rawactor[0]['child'][NAMESPACE_ACTIVITY]['obj_type'][0]['data'], ACTIVITY_OBJ_PERSON)) {
+ if($rawactor && activity_match($rawactor[0]['child'][NAMESPACE_ACTIVITY]['obj_type'][0]['data'],ACTIVITY_OBJ_PERSON)) {
$base = $rawactor[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['link'];
+
if($base && count($base)) {
foreach($base as $link) {
if($link['attribs']['']['rel'] === 'alternate' && (! $res['author_link']))
$author['author_link'] = unxmlify($link['attribs']['']['href']);
- if(!x($author, 'author_photo') || ! $author['author_photo']) {
+ if(! (x($author,'author_photo'))) {
if($link['attribs']['']['rel'] === 'avatar' || $link['attribs']['']['rel'] === 'photo')
$author['author_photo'] = unxmlify($link['attribs']['']['href']);
}
}
}
}
+ }
- // check for a yahoo media element (github etc.)
-
- if(! $author['author_photo']) {
- $rawmedia = $item->get_item_tags(NAMESPACE_YMEDIA,'thumbnail');
- if($rawmedia && $rawmedia[0]['attribs']['']['url']) {
- $author['author_photo'] = strip_tags(unxmlify($rawmedia[0]['attribs']['']['url']));
- }
+ $rawcnv = $item->get_item_tags(NAMESPACE_OSTATUS, 'conversation');
+ if($rawcnv) {
+ // new style
+ $ostatus_conversation = normalise_id(unxmlify($rawcnv[0]['attribs']['']['ref']));
+ if(! $ostatus_conversation) {
+ // old style
+ $ostatus_conversation = normalise_id(unxmlify($rawcnv[0]['data']));
}
+ if($ostatus_conversation) {
+ set_iconfig($res,'ostatus','conversation',$ostatus_conversation,true);
+ logger('ostatus_conversation: ' . $ostatus_conversation, LOGGER_DATA, LOG_INFO);
+ }
+ }
+ $ostatus_protocol = (($ostatus_conversation) ? true : false);
+
+ $mastodon = (($item->get_item_tags('http://mastodon.social/schema/1.0','scope')) ? true : false);
+ if($mastodon) {
+ $ostatus_protocol = true;
+ if(($mastodon[0]['data']) && ($mastodon[0]['data'] !== 'public'))
+ $res['item_private'] = 1;
+ }
- // No photo/profile-link on the item - look at the feed level
-
- if((! (x($author,'author_link'))) || (! (x($author,'author_photo')))) {
- $rawauthor = $feed->get_feed_tags(SIMPLEPIE_NAMESPACE_ATOM_10,'author');
- if($rawauthor && $rawauthor[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['link']) {
- $base = $rawauthor[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['link'];
- foreach($base as $link) {
- if($link['attribs']['']['rel'] === 'alternate' && (! $author['author_link'])) {
- $author['author_link'] = unxmlify($link['attribs']['']['href']);
- $author['author_is_feed'] = true;
- }
- if(! $author['author_photo']) {
- if($link['attribs']['']['rel'] === 'photo' || $link['attribs']['']['rel'] === 'avatar')
- $author['author_photo'] = unxmlify($link['attribs']['']['href']);
- }
- }
- }
+ $apps = $item->get_item_tags(NAMESPACE_STATUSNET, 'notice_info');
+ if($apps && $apps[0]['attribs']['']['source']) {
+ $res['app'] = strip_tags(unxmlify($apps[0]['attribs']['']['source']));
+ }
- $rawactor = $feed->get_feed_tags(NAMESPACE_ACTIVITY, 'subject');
+ if($ostatus_protocol) {
- if($rawactor && activity_match($rawactor[0]['child'][NAMESPACE_ACTIVITY]['obj_type'][0]['data'], ACTIVITY_OBJ_PERSON)) {
- $base = $rawactor[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['link'];
+ // translate OStatus unfollow to activity streams if it happened to get selected
- if($base && count($base)) {
- foreach($base as $link) {
- if($link['attribs']['']['rel'] === 'alternate' && (! $res['author_link']))
- $author['author_link'] = unxmlify($link['attribs']['']['href']);
- if(! (x($author,'author_photo'))) {
- if($link['attribs']['']['rel'] === 'avatar' || $link['attribs']['']['rel'] === 'photo')
- $author['author_photo'] = unxmlify($link['attribs']['']['href']);
- }
- }
- }
- }
+ if((x($res,'verb')) && ($res['verb'] === 'http://ostatus.org/schema/1.0/unfollow')) {
+ $res['verb'] = ACTIVITY_UNFOLLOW;
}
- }
- $ostatus_protocol = (($item->get_item_tags(NAMESPACE_OSTATUS, 'conversation')) ? true : false);
+ // And OStatus 'favorite' is pretty much what we call 'like' on other networks
- $apps = $item->get_item_tags(NAMESPACE_STATUSNET, 'notice_info');
- if($apps && $apps[0]['attribs']['']['source']) {
- $res['app'] = strip_tags(unxmlify($apps[0]['attribs']['']['source']));
+ if((x($res,'verb')) && ($res['verb'] === ACTIVITY_FAVORITE)) {
+ $res['verb'] = ACTIVITY_LIKE;
+ }
}
/*
@@ -483,6 +517,12 @@ function get_atom_elements($feed, $item, &$author) {
);
}
+ // turn Mastodon content warning into a #nsfw hashtag
+ if($mastodon && $summary) {
+ $res['body'] .= "\n\n#ContentWarning\n";
+ }
+
+
$private = $item->get_item_tags(NAMESPACE_DFRN, 'private');
if($private && intval($private[0]['data']) > 0)
$res['item_private'] = ((intval($private[0]['data'])) ? 1 : 0);
@@ -493,23 +533,6 @@ function get_atom_elements($feed, $item, &$author) {
if($rawlocation)
$res['location'] = unxmlify($rawlocation[0]['data']);
- $rawcreated = $item->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'published');
- if($rawcreated)
- $res['created'] = unxmlify($rawcreated[0]['data']);
-
- $rawedited = $item->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'updated');
- if($rawedited)
- $res['edited'] = unxmlify($rawedited[0]['data']);
-
- if((x($res,'edited')) && (! (x($res,'created'))))
- $res['created'] = $res['edited'];
-
- if(! $res['created'])
- $res['created'] = $item->get_date('c');
-
- if(! $res['edited'])
- $res['edited'] = $item->get_date('c');
-
// Disallow time travelling posts
@@ -591,6 +614,7 @@ function get_atom_elements($feed, $item, &$author) {
$attach = $item->get_enclosures();
if($attach) {
+
$res['attach'] = array();
foreach($attach as $att) {
$len = intval($att->get_length());
@@ -607,9 +631,21 @@ function get_atom_elements($feed, $item, &$author) {
if(! $type)
$type = 'application/octet-stream';
+ if($ostatus_protocol) {
+ if((strpos($type,'image') === 0) && (strpos($res['body'], ']' . $link . '[/img]') === false) && (strpos($link,'http') === 0)) {
+ $res['body'] .= "\n\n" . '[img]' . $link . '[/img]';
+ }
+ if((strpos($type,'video') === 0) && (strpos($res['body'], ']' . $link . '[/video]') === false) && (strpos($link,'http') === 0)) {
+ $res['body'] .= "\n\n" . '[video]' . $link . '[/video]';
+ }
+ if((strpos($type,'audio') === 0) && (strpos($res['body'], ']' . $link . '[/audio]') === false) && (strpos($link,'http') === 0)) {
+ $res['body'] .= "\n\n" . '[audio]' . $link . '[/audio]';
+ }
+ }
$res['attach'][] = array('href' => $link, 'length' => $len, 'type' => $type, 'title' => $title );
}
}
+
$rawobj = $item->get_item_tags(NAMESPACE_ACTIVITY, 'object');
@@ -687,6 +723,13 @@ function get_atom_elements($feed, $item, &$author) {
$res['target'] = $obj;
}
+
+
+ if(array_key_exists('verb',$res) && $res['verb'] === ACTIVITY_SHARE
+ && array_key_exists('obj_type',$res) && in_array($res['obj_type'], [ ACTIVITY_OBJ_NOTE, ACTIVITY_OBJ_COMMENT, ACTIVITY_OBJ_ACTIVITY ] )) {
+ feed_get_reshare($res,$item);
+ }
+
// build array to pass to hook
$arr = [
'feed' => $feed,
@@ -703,6 +746,120 @@ function get_atom_elements($feed, $item, &$author) {
return $arr['result'];
}
+function feed_get_reshare(&$res,$item) {
+
+ $share = [];
+
+ // For Mastodon shares ("boosts"), we need to parse the original author information
+ // from the activity:object -> author structure
+ $rawobj = $item->get_item_tags(NAMESPACE_ACTIVITY, 'object');
+
+ if($rawobj) {
+
+ $rawauthor = $rawobj[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['author'];
+
+ if($rawauthor && $rawauthor[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['name']) {
+ $share['author'] = unxmlify($rawauthor[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['name'][0]['data']);
+ }
+
+ if($rawauthor && $rawauthor[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['uri']) {
+ $share['profile'] = unxmlify($rawauthor[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['uri'][0]['data']);
+ }
+
+ if($rawauthor && $rawauthor[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['link']) {
+ $base = $rawauthor[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['link'];
+ foreach($base as $link) {
+ if(! (array_key_exists('avatar',$share) && $share['avatar'])) {
+ if($link['attribs']['']['rel'] === 'photo' || $link['attribs']['']['rel'] === 'avatar')
+ $share['avatar'] = unxmlify($link['attribs']['']['href']);
+ }
+ }
+ }
+
+ if(! $share['author'])
+ $share['author'] = t('unknown');
+ if(! $share['avatar'])
+ $share['avatar'] = z_root() . '/' . get_default_profile_photo(80);
+ if(! $share['profile'])
+ $share['profile'] = z_root();
+
+ $child = $rawobj[0]['child'];
+
+
+ if(x($child[SIMPLEPIE_NAMESPACE_ATOM_10], 'link') && $child[SIMPLEPIE_NAMESPACE_ATOM_10]['link'])
+ $share['links'] = encode_rel_links($child[SIMPLEPIE_NAMESPACE_ATOM_10]['link']);
+
+ $rawcreated = $rawobj[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['published'];
+
+ if($rawcreated)
+ $share['created'] = unxmlify($rawcreated[0]['data']);
+ else
+ $share['created'] = $res['created'];
+
+ if(x($child[SIMPLEPIE_NAMESPACE_ATOM_10], 'id') && $child[SIMPLEPIE_NAMESPACE_ATOM_10]['id'][0]['data'])
+ $share['message_id'] = unxmlify($child[SIMPLEPIE_NAMESPACE_ATOM_10]['id'][0]['data']);
+
+ if(x($child[SIMPLEPIE_NAMESPACE_ATOM_10], 'content') && $child[SIMPLEPIE_NAMESPACE_ATOM_10]['content'][0]['data']) {
+ $body = unxmlify($child[SIMPLEPIE_NAMESPACE_ATOM_10]['content'][0]['data']);
+ if(! $body)
+ $body = unxmlify($child[SIMPLEPIE_NAMESPACE_ATOM_10]['summary'][0]['data']);
+
+ if((strpos($body,'<') !== false) || (strpos($body,'>') !== false)) {
+ $body = purify_html($body);
+ $body = html2bbcode($body);
+ }
+ }
+
+ $attach = $share['links'];
+ if($attach) {
+ foreach($attach as $att) {
+ if($att['rel'] === 'alternate') {
+ $share['alternate'] = str_replace(array(',','"'),array('%2D','%22'),notags(trim(unxmlify($att['href']))));
+ continue;
+ }
+ if($att['rel'] !== 'enclosure')
+ continue;
+ $len = intval($att['length']);
+ $link = str_replace(array(',','"'),array('%2D','%22'),notags(trim(unxmlify($att['href']))));
+ $title = str_replace(array(',','"'),array('%2D','%22'),notags(trim(unxmlify($att['title']))));
+ $type = str_replace(array(',','"'),array('%2D','%22'),notags(trim(unxmlify($att['type']))));
+ if(strpos($type,';'))
+ $type = substr($type,0,strpos($type,';'));
+ if((! $link) || (strpos($link,'http') !== 0))
+ continue;
+
+ if(! $title)
+ $title = ' ';
+ if(! $type)
+ $type = 'application/octet-stream';
+
+ if((strpos($type,'image') === 0) && (strpos($body, ']' . $link . '[/img]') === false) && (strpos($link,'http') === 0)) {
+ $body .= "\n\n" . '[img]' . $link . '[/img]';
+ }
+ if((strpos($type,'video') === 0) && (strpos($body, ']' . $link . '[/video]') === false) && (strpos($link,'http') === 0)) {
+ $body .= "\n\n" . '[video]' . $link . '[/video]';
+ }
+ if((strpos($type,'audio') === 0) && (strpos($body, ']' . $link . '[/audio]') === false) && (strpos($link,'http') === 0)) {
+ $body .= "\n\n" . '[audio]' . $link . '[/audio]';
+ }
+ }
+ }
+
+ $res['body'] = "[share author='" . urlencode($share['author']) .
+ "' profile='" . $share['profile'] .
+ "' avatar='" . $share['avatar'] .
+ "' link='" . $share['alternate'] .
+ "' posted='" . $share['created'] .
+ "' message_id='" . $share['message_id'] . "']";
+
+ $res['body'] .= $body;
+ $res['body'] .= "[/share]";
+ }
+
+}
+
+
+
/**
* @brief Encodes SimplePie_Item link arrays.
*
@@ -718,6 +875,10 @@ function encode_rel_links($links) {
$l = array();
if($link['attribs']['']['rel'])
$l['rel'] = $link['attribs']['']['rel'];
+ if($link['attribs']['']['length'])
+ $l['length'] = $link['attribs']['']['length'];
+ if($link['attribs']['']['title'])
+ $l['title'] = $link['attribs']['']['title'];
if($link['attribs']['']['type'])
$l['type'] = $link['attribs']['']['type'];
if($link['attribs']['']['href'])
@@ -838,7 +999,8 @@ function consume_feed($xml, $importer, &$contact, $pass = 0) {
foreach($items as $item) {
$is_reply = false;
- $item_id = normalise_id($item->get_id());
+ $send_downstream = false;
+ $parent_link = '';
logger('processing ' . $item->get_id(), LOGGER_DEBUG);
@@ -847,6 +1009,11 @@ function consume_feed($xml, $importer, &$contact, $pass = 0) {
$is_reply = true;
$parent_mid = normalise_id($rawthread[0]['attribs']['']['ref']);
}
+ if(isset($rawthread[0]['attribs']['']['href'])) {
+ $parent_link = $rawthread[0]['attribs']['']['href'];
+ }
+
+ logger('in-reply-to: ' . $parent_mid, LOGGER_DEBUG);
if($is_reply) {
@@ -855,18 +1022,35 @@ function consume_feed($xml, $importer, &$contact, $pass = 0) {
// Have we seen it? If not, import it.
- $item_id = normalise_id($item->get_id());
$author = array();
$datarray = get_atom_elements($feed,$item,$author);
- if($datarray['mid'])
- $datarray['mid'] = normalise_id($item->get_id());
+ if(! $datarray['mid'])
+ continue;
+
+ // This probably isn't an appropriate default but we're about to change it
+ // if it's wrong.
+
+ $datarray['comment_policy'] = 'authenticated';
+
+ // A Mastodon privacy tag has been found. We cannot send private comments
+ // through the OStatus protocol, so block commenting.
+
+ if(array_key_exists('item_private',$datarray) && intval($datarray['item_private'])) {
+ $datarray['public_policy'] = 'specific';
+ $datarray['comment_policy'] = 'none';
+ }
if($contact['xchan_network'] === 'rss') {
$datarray['public_policy'] = 'specific';
$datarray['comment_policy'] = 'none';
}
+ // if we have everything but a photo, provide the default profile photo
+
+ if($author['author_name'] && $author['author_link'] && (! $author['author_photo']))
+ $author['author_photo'] = z_root() . '/' . get_default_profile_photo(80);
+
if((! x($author,'author_name')) || ($author['author_is_feed']))
$author['author_name'] = $contact['xchan_name'];
if((! x($author,'author_link')) || ($author['author_is_feed']))
@@ -877,7 +1061,16 @@ function consume_feed($xml, $importer, &$contact, $pass = 0) {
$datarray['author_xchan'] = '';
if($author['author_link'] != $contact['xchan_url']) {
- $x = import_author_unknown(array('name' => $author['author_name'],'url' => $author['author_link'],'photo' => array('src' => $author['author_photo'])));
+ $name = '';
+ if($author['full_name']) {
+ $name = $author['full_name'];
+ if($author['author_name'])
+ $name .= ' (' . $author['author_name'] . ')';
+ }
+ else {
+ $name = $author['author_name'];
+ }
+ $x = import_author_unknown(array('name' => $name,'url' => $author['author_link'],'photo' => array('src' => $author['author_photo'])));
if($x)
$datarray['author_xchan'] = $x;
}
@@ -886,8 +1079,8 @@ function consume_feed($xml, $importer, &$contact, $pass = 0) {
$datarray['owner_xchan'] = $contact['xchan_hash'];
- $r = q("SELECT edited FROM item WHERE mid = '%s' AND uid = %d LIMIT 1",
- dbesc($item_id),
+ $r = q("SELECT id, edited FROM item WHERE mid = '%s' AND uid = %d LIMIT 1",
+ dbesc($datarray['mid']),
intval($importer['channel_id'])
);
@@ -902,20 +1095,148 @@ function consume_feed($xml, $importer, &$contact, $pass = 0) {
if(datetime_convert('UTC','UTC',$datarray['edited']) < $r[0]['edited'])
continue;
+ $datarray['uid'] = $importer['channel_id'];
+ $datarray['aid'] = $importer['channel_account_id'];
+ $datarray['id'] = $r[0]['id'];
+
update_feed_item($importer['channel_id'],$datarray);
+
}
continue;
}
- $x = q("select mid from item where mid = '%s' and uid = %d limit 1",
- dbesc($parent_mid),
- intval($importer['channel_id'])
- );
- if($x)
- $parent_mid = $x[0]['mid'];
+ $pmid = '';
+ $conv_id = get_iconfig($datarray,'ostatus','conversation');
+
+ // match conversations - first try ostatus:conversation
+ // next try thr:in_reply_to
+
+ if($conv_id) {
+ logger('find_parent: conversation_id: ' . $conv_id, LOGGER_DEBUG);
+ $c = q("select parent_mid from item left join iconfig on item.id = iconfig.iid where iconfig.cat = 'ostatus' and iconfig.k = 'conversation' and iconfig.v = '%s' and item.uid = %d order by item.id limit 1",
+ dbesc($conv_id),
+ intval($importer['channel_id'])
+ );
+ if($c) {
+ logger('find_parent: matched conversation: ' . $conv_id, LOGGER_DEBUG);
+ $pmid = $c[0]['parent_mid'];
+ $datarray['parent_mid'] = $pmid;
+ }
+ }
+ if(! $pmid) {
+ $x = q("select parent_mid from item where mid = '%s' and uid = %d limit 1",
+ dbesc($parent_mid),
+ intval($importer['channel_id'])
+ );
+
+ if($x) {
+ logger('find_parent: matched in-reply-to: ' . $parent_mid, LOGGER_DEBUG);
+ $pmid = $x[0]['parent_mid'];
+ $datarray['parent_mid'] = $pmid;
+ }
+ }
+ if((! $pmid) && $parent_link !== '') {
+ $f = feed_conversation_fetch($importer,$contact,$parent_link);
+ if($f) {
+ // check both potential conversation parents again
+ if($conv_id) {
+ $c = q("select parent_mid from item left join iconfig on item.id = iconfig.iid where iconfig.cat = 'ostatus' and iconfig.k = 'conversation' and iconfig.v = '%s' and item.uid = %d order by item.id limit 1",
+ dbesc($conv_id),
+ intval($importer['channel_id'])
+ );
+ if($c) {
+ $pmid = $c[0]['parent_mid'];
+ $datarray['parent_mid'] = $pmid;
+ }
+ }
+ if(! $pmid) {
+ $x = q("select parent_mid from item where mid = '%s' and uid = %d limit 1",
+ dbesc($parent_mid),
+ intval($importer['channel_id'])
+ );
+
+ if($x) {
+ $pmid = $x[0]['parent_mid'];
+ $datarray['parent_mid'] = $pmid;
+ }
+ }
+ }
+
+ // the conversation parent might just be the post we are trying to import.
+ // check existence again in case it was just delivered.
- $datarray['parent_mid'] = $parent_mid;
+ $r = q("SELECT id FROM item WHERE mid = '%s' AND uid = %d LIMIT 1",
+ dbesc($datarray['mid']),
+ intval($importer['channel_id'])
+ );
+ if($r) {
+ continue;
+ }
+ }
+
+ if($pmid) {
+
+ // check comment permissions on the parent
+
+ $parent_item = 0;
+
+ $r = q("select * from item where parent_mid = '%s' and parent_mid = mid and uid = %d limit 1",
+ dbesc($pmid),
+ intval($importer['channel_id'])
+ );
+ if($r) {
+ $parent_item = $r[0];
+ if(intval($parent_item['item_nocomment']) || $parent_item['comment_policy'] === 'none'
+ || ($parent_item['comments_closed'] > NULL_DATE && $parent_item['comments_closed'] < datetime_convert())) {
+ logger('comments disabled for post ' . $parent_item['mid']);
+ continue;
+ }
+ }
+
+ $allowed = false;
+
+ if($parent_item) {
+ if($parent_item['owner_xchan'] == $importer['channel_hash'])
+ $allowed = perm_is_allowed($importer['channel_id'],$contact['xchan_hash'],'post_comments');
+ else
+ $allowed = true;
+
+ if(! $allowed) {
+ logger('Ignoring this comment author.');
+ $status = 202;
+ continue;
+ }
+
+ // The salmon endpoint sets this to indicate that we should send comments from
+ // interactive feeds (such as OStatus) downstream to our followers
+ // We do not want to set it for non-interactive feeds or conversations we do not own
+
+ if(array_key_exists('send_downstream',$importer) && intval($importer['send_downstream'])
+ && ($parent_item['owner_xchan'] == $importer['channel_hash'])) {
+ $send_downstream = true;
+ }
+ }
+ else {
+ if((! perm_is_allowed($importer['channel_id'],$contact['xchan_hash'],'send_stream')) && (! $importer['system'])) {
+ // @fixme check for and process ostatus autofriend
+ // otherwise
+
+ logger('Ignoring this author.');
+ continue;
+ }
+ }
+ }
+ else {
+ // immediate parent wasn't found. Turn into a top-level post if permissions allow
+ // but save the thread_parent in case we need to refer to it later.
+
+ if(! post_is_importable($datarray, $contact))
+ continue;
+ $datarray['parent_mid'] = $datarray['mid'];
+ set_iconfig($datarray,'system','parent_mid',$parent_mid,true);
+ }
+
$datarray['aid'] = $importer['channel_account_id'];
$datarray['uid'] = $importer['channel_id'];
@@ -923,24 +1244,48 @@ function consume_feed($xml, $importer, &$contact, $pass = 0) {
$xx = item_store($datarray);
$r = $xx['item_id'];
+
+ if($send_downstream) {
+ \Zotlabs\Daemon\Master::Summon(array('Notifier', 'comment', $r));
+ }
+
continue;
}
else {
// Head post of a conversation. Have we seen it? If not, import it.
- $item_id = normalise_id($item->get_id());
$author = array();
$datarray = get_atom_elements($feed,$item,$author);
- if($datarray['mid'])
- $datarray['mid'] = normalise_id($item->get_id());
+ if(! $datarray['mid'])
+ continue;
+
+ // This probably isn't an appropriate default but we're about to change it
+ // if it's wrong.
+
+ $datarray['comment_policy'] = 'authenticated';
+
+ // A Mastodon privacy tag has been found. We cannot send private comments
+ // through the OStatus protocol, so block commenting.
+
+ if(array_key_exists('item_private',$datarray) && intval($datarray['item_private'])) {
+ $datarray['public_policy'] = 'specific';
+ $datarray['comment_policy'] = 'none';
+ }
if($contact['xchan_network'] === 'rss') {
$datarray['public_policy'] = 'specific';
$datarray['comment_policy'] = 'none';
}
+
+
+ // if we have everything but a photo, provide the default profile photo
+
+ if($author['author_name'] && $author['author_link'] && (! $author['author_photo']))
+ $author['author_photo'] = z_root() . '/' . get_default_profile_photo(80);
+
if(is_array($contact)) {
if((! x($author,'author_name')) || ($author['author_is_feed']))
$author['author_name'] = $contact['xchan_name'];
@@ -957,19 +1302,17 @@ function consume_feed($xml, $importer, &$contact, $pass = 0) {
$datarray['author_xchan'] = '';
- if(activity_match($datarray['verb'],ACTIVITY_FOLLOW) && $datarray['obj_type'] === ACTIVITY_OBJ_PERSON) {
- $cb = array('item' => $datarray,'channel' => $importer, 'xchan' => [ 'placeholder' => '' ], 'author' => $author, 'caught' => false);
- call_hooks('follow_from_feed',$cb);
- if($cb['caught']) {
- if($cb['return_code'])
- http_status_exit($cb['return_code']);
-
- continue;
- }
- }
-
if($author['author_link'] != $contact['xchan_url']) {
- $x = import_author_unknown(array('name' => $author['author_name'],'url' => $author['author_link'],'photo' => array('src' => $author['author_photo'])));
+ $name = '';
+ if($author['full_name']) {
+ $name = $author['full_name'];
+ if($author['author_name'])
+ $name .= ' (' . $author['author_name'] . ')';
+ }
+ else {
+ $name = $author['author_name'];
+ }
+ $x = import_author_unknown(array('name' => $name,'url' => $author['author_link'],'photo' => array('src' => $author['author_photo'])));
if($x)
$datarray['author_xchan'] = $x;
}
@@ -988,8 +1331,8 @@ function consume_feed($xml, $importer, &$contact, $pass = 0) {
}
- $r = q("SELECT edited FROM item WHERE mid = '%s' AND uid = %d LIMIT 1",
- dbesc($item_id),
+ $r = q("SELECT id, edited FROM item WHERE mid = '%s' AND uid = %d LIMIT 1",
+ dbesc($datarray['mid']),
intval($importer['channel_id'])
);
@@ -1003,13 +1346,17 @@ function consume_feed($xml, $importer, &$contact, $pass = 0) {
if(datetime_convert('UTC','UTC',$datarray['edited']) < $r[0]['edited'])
continue;
+ $datarray['uid'] = $importer['channel_id'];
+ $datarray['aid'] = $importer['channel_account_id'];
+ $datarray['id'] = $r[0]['id'];
+
update_feed_item($importer['channel_id'],$datarray);
}
continue;
}
- $datarray['parent_mid'] = $item_id;
+ $datarray['parent_mid'] = $datarray['mid'];
$datarray['uid'] = $importer['channel_id'];
$datarray['aid'] = $importer['channel_account_id'];
@@ -1035,6 +1382,51 @@ function consume_feed($xml, $importer, &$contact, $pass = 0) {
}
}
+
+function feed_conversation_fetch($importer,$contact,$parent_link) {
+
+ logger('parent_link: ' . $parent_link, LOGGER_DEBUG, LOG_INFO);
+
+ $link = '';
+
+ // GNU-Social flavoured feeds
+ if(strpos($parent_link,'/notice/')) {
+ $link = str_replace('/notice/','/api/statuses/show/',$parent_link) . '.atom';
+ }
+
+ // Mastodon flavoured feeds
+ if(strpos($parent_link,'/users/') && strpos($parent_link,'/updates/')) {
+ $link = $parent_link . '.atom';
+ }
+
+ if(! $link)
+ return false;
+
+ logger('fetching: ' . $link, LOGGER_DEBUG, LOG_INFO);
+
+ $fetch = z_fetch_url($link);
+
+ if(! $fetch['success'])
+ return false;
+
+ $data = $fetch['body'];
+
+ // We will probably receive an atom 'entry' and not an atom 'feed'. Unfortunately
+ // our parser is a bit strict about compliance so we'll insert just enough of a feed
+ // tag to trick it into believing it's a compliant feed.
+
+ if(! strstr($data,'<feed')) {
+ $data = str_replace('<entry ','<feed xmlns="http://www.w3.org/2005/Atom"><entry ',$data);
+ $data .= '</feed>';
+ }
+
+ consume_feed($data,$importer,$contact,1);
+ consume_feed($data,$importer,$contact,2);
+
+ return true;
+
+}
+
/**
* @brief Normalise an id.
*
@@ -1112,7 +1504,7 @@ function process_salmon_feed($xml, $importer) {
// reset policies which are restricted by default for RSS connections
// This item is likely coming from GNU-social via salmon and allows public interaction
$datarray['public_policy'] = '';
- $datarray['comment_policy'] = '';
+ $datarray['comment_policy'] = 'authenticated';
$ret['item'] = $datarray;
}
@@ -1179,6 +1571,10 @@ function feed_meta($xml) {
}
}
+ if(! $author['author_photo'])
+ $author['author_photo'] = $feed->get_image_url();
+
+
if(substr($author['author_link'],-1,1) == '/')
$author['author_link'] = substr($author['author_link'],0,-1);
@@ -1194,7 +1590,7 @@ function feed_meta($xml) {
* @param array $datarray
*/
function update_feed_item($uid, $datarray) {
- logger('Not implemented! ' . $uid . ' ' . print_r($datarray, true), LOGGER_DATA);
+ item_store_update($datarray);
}
/**
@@ -1272,6 +1668,59 @@ function atom_author($tag, $nick, $name, $uri, $h, $w, $type, $photo) {
return $o;
}
+
+function atom_render_author($tag,$xchan) {
+
+
+ $nick = xmlify(substr($xchan['xchan_addr'],0,strpos($xchan['xchan_addr'],'@')));
+ $id = xmlify($xchan['xchan_url']);
+ $name = xmlify($xchan['xchan_name']);
+ $photo = xmlify($xchan['xchan_photo_l']);
+ $type = xmlify($xchan['xchan_photo_mimetype']);
+ $w = $h = 300;
+
+ $o .= "<$tag>\r\n";
+ $o .= " <as:object-type>http://activitystrea.ms/schema/1.0/person</as:object-type>\r\n";
+ $o .= " <id>$id</id>\r\n";
+ $o .= " <name>$nick</name>\r\n";
+ $o .= " <uri>$id</uri>\r\n";
+ $o .= ' <link rel="alternate" type="text/html" href="' . $id . '" />' . "\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";
+ $o .= ' <poco:preferredUsername>' . $nick . '</poco:preferredUsername>' . "\r\n";
+ $o .= ' <poco:displayName>' . $name . '</poco:displayName>' . "\r\n";
+
+ call_hooks('atom_render_author', $o);
+
+ $o .= "</$tag>\r\n";
+
+ return $o;
+
+
+}
+
+function compat_photos_list($s) {
+
+ $ret = [];
+
+ $found = preg_match_all('/\[[zi]mg(.*?)\](.*?)\[/ism',$s,$matches,PREG_SET_ORDER);
+
+ if($found) {
+ foreach($matches as $match) {
+ $ret[] = [
+ 'href' => $match[2],
+ 'length' => 0,
+ 'type' => guess_image_type($match[2])
+ ];
+
+ }
+ }
+
+ return $ret;
+}
+
+
+
/**
* @brief Create an item for the Atom feed.
*
@@ -1285,7 +1734,8 @@ function atom_author($tag, $nick, $name, $uri, $h, $w, $type, $photo) {
* @param number $cid default 0
* @return void|string
*/
-function atom_entry($item, $type, $author, $owner, $comment = false, $cid = 0) {
+function atom_entry($item, $type, $author, $owner, $comment = false, $cid = 0, $compat = false) {
+
if(! $item['parent'])
return;
@@ -1300,23 +1750,31 @@ function atom_entry($item, $type, $author, $owner, $comment = false, $cid = 0) {
else
$body = $item['body'];
+ if($compat) {
+ $compat_photos = compat_photos_list($body);
+ }
+ else {
+ $compat_photos = null;
+ }
+
$o = "\r\n\r\n<entry>\r\n";
if(is_array($author)) {
- $reddress = substr($author['xchan_addr'],0,strpos($author['xchan_addr'],'@'));
- $o .= atom_author('author',$reddress,$author['xchan_name'],$author['xchan_url'],80,80,$author['xchan_photo_mimetype'],$author['xchan_photo_m']);
+ $o .= atom_render_author('author',$author);
}
else {
- $reddress = substr($item['author']['xchan_addr'],0,strpos($item['author']['xchan_addr'],'@'));
- $o .= atom_author('author',$reddress,$item['author']['xchan_name'],$item['author']['xchan_url'],80,80,$item['author']['xchan_photo_mimetype'], $item['author']['xchan_photo_m']);
+ $o .= atom_render_author('author',$item['author']);
}
- $reddress = substr($item['owner']['xchan_addr'],0,strpos($item['owner']['xchan_addr'],'@'));
- $o .= atom_author('zot:owner',$reddress,$item['owner']['xchan_name'],$item['owner']['xchan_url'],80,80,$item['owner']['xchan_photo_mimetype'],$item['owner']['xchan_photo_m']);
+ $o .= atom_render_author('zot:owner',$item['owner']);
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="' . 'X-ZOT:' . xmlify($parent_item) . '" type="text/html" href="' . xmlify($item['plink']) . '" />' . "\r\n";
+ // ensure it's a legal uri and not just a message-id
+ if(! strpos($parent_item,':'))
+ $parent_item = 'X-ZOT:' . $parent_item;
+
+ $o .= '<thr:in-reply-to ref="' . xmlify($parent_item) . '" type="text/html" href="' . xmlify($item['plink']) . '" />' . "\r\n";
}
if(activity_match($item['obj_type'],ACTIVITY_OBJ_EVENT) && activity_match($item['verb'],ACTIVITY_POST)) {
@@ -1372,10 +1830,19 @@ function atom_entry($item, $type, $author, $owner, $comment = false, $cid = 0) {
. (($enc['href']) ? 'href="' . $enc['href'] . '" ' : '')
. (($enc['length']) ? 'length="' . $enc['length'] . '" ' : '')
. (($enc['type']) ? 'type="' . $enc['type'] . '" ' : '')
- . ' />';
+ . ' />' . "\r\n";
}
}
}
+ if($compat_photos) {
+ foreach($compat_photos as $enc) {
+ $o .= '<link rel="enclosure" '
+ . (($enc['href']) ? 'href="' . $enc['href'] . '" ' : '')
+ . ((array_key_exists('length',$enc)) ? 'length="' . $enc['length'] . '" ' : '')
+ . (($enc['type']) ? 'type="' . $enc['type'] . '" ' : '')
+ . ' />' . "\r\n";
+ }
+ }
if($item['term']) {
foreach($item['term'] as $term) {
@@ -1427,98 +1894,3 @@ function atom_entry($item, $type, $author, $owner, $comment = false, $cid = 0) {
return $x['entry'];
}
-/**
- * @brief
- *
- * @param array $items
- * @return array
- */
-function gen_asld($items) {
- $ret = array();
- if(! $items)
- return $ret;
-
- foreach($items as $item) {
- $ret[] = i2asld($item);
- }
-
- return $ret;
-}
-
-/**
- * @brief
- *
- * @param array $i
- * @return array
- */
-function i2asld($i) {
-
- if(! $i)
- return array();
-
- $ret = array();
-
- $ret['@context'] = array( 'http://www.w3.org/ns/activitystreams', 'zot' => 'http://purl.org/zot/protocol');
-
- if($i['verb']) {
- if(strpos(dirname($i['verb'],'activitystrea.ms/schema/1.0'))) {
- $ret['@type'] = ucfirst(basename($i['verb']));
- }
- elseif(strpos(dirname($i['verb'],'purl.org/zot'))) {
- $ret['@type'] = 'zot:' . ucfirst(basename($i['verb']));
- }
- }
- $ret['@id'] = $i['plink'];
-
- $ret['published'] = datetime_convert('UTC','UTC',$i['created'],ATOM_TIME);
-
- // we need to pass the parent into this
-// if($i['id'] != $i['parent'] && $i['obj_type'] === ACTIVITY_OBJ_NOTE) {
-// $ret['inReplyTo'] = asencode_note
-// }
-
- if($i['obj_type'] === ACTIVITY_OBJ_NOTE)
- $ret['object'] = asencode_note($i);
-
- $ret['actor'] = asencode_person($i['author']);
-
- return $ret;
-}
-
-function asencode_note($i) {
-
- $ret = array();
-
- $ret['@type'] = 'Note';
- $ret['@id'] = $i['plink'];
- if($i['title'])
- $ret['title'] = bbcode($i['title']);
-
- $ret['content'] = bbcode($i['body']);
- $ret['zot:owner'] = asencode_person($i['owner']);
- $ret['published'] = datetime_convert('UTC','UTC',$i['created'],ATOM_TIME);
- if($i['created'] !== $i['edited'])
- $ret['updated'] = datetime_convert('UTC','UTC',$i['edited'],ATOM_TIME);
-
- return $ret;
-}
-
-
-function asencode_person($p) {
- $ret = array();
- $ret['@type'] = 'Person';
- $ret['@id'] = 'acct:' . $p['xchan_addr'];
- $ret['displayName'] = $p['xchan_name'];
- $ret['icon'] = array(
- '@type' => 'Link',
- 'mediaType' => $p['xchan_photo_mimetype'],
- 'href' => $p['xchan_photo_m']
- );
- $ret['url'] = array(
- '@type' => 'Link',
- 'mediaType' => 'text/html',
- 'href' => $p['xchan_url']
- );
-
- return $ret;
-}
diff --git a/include/follow.php b/include/follow.php
index 0d7c16aa3..9e2fd6a9c 100644
--- a/include/follow.php
+++ b/include/follow.php
@@ -182,6 +182,11 @@ function new_contact($uid,$url,$channel,$interactive = false, $confirm = false)
$hash = get_observer_hash();
$default_group = $channel['channel_default_group'];
+ if($hash == $xchan_hash) {
+ $result['message'] = t('Cannot connect to yourself.');
+ return $result;
+ }
+
if($xchan['xchan_network'] === 'rss') {
// check service class feed limits
@@ -196,28 +201,22 @@ function new_contact($uid,$url,$channel,$interactive = false, $confirm = false)
$result['message'] = upgrade_message();
return $result;
}
- }
- if($hash == $xchan_hash) {
- $result['message'] = t('Cannot connect to yourself.');
- return $result;
+ // Always set these "remote" permissions for feeds since we cannot interact with them
+ // to negotiate a suitable permission response
+
+ set_abconfig($uid,$xchan_hash,'their_perms','view_stream',1);
+ set_abconfig($uid,$xchan_hash,'their_perms','republish',1);
+
}
+
$r = q("select abook_id, abook_xchan, abook_pending, abook_instance from abook
where abook_xchan = '%s' and abook_channel = %d limit 1",
dbesc($xchan_hash),
intval($uid)
);
- if($is_http) {
-
- // Always set these "remote" permissions for feeds since we cannot interact with them
- // to negotiate a suitable permission response
-
- set_abconfig($uid,$xchan_hash,'their_perms','view_stream',1);
- set_abconfig($uid,$xchan_hash,'their_perms','republish',1);
- }
-
if($r) {
$abook_instance = $r[0]['abook_instance'];
@@ -226,12 +225,12 @@ function new_contact($uid,$url,$channel,$interactive = false, $confirm = false)
if($abook_instance)
$abook_instance .= ',';
$abook_instance .= z_root();
- }
- $x = q("update abook set abook_instance = '%s' where abook_id = %d",
- dbesc($abook_instance),
- intval($r[0]['abook_id'])
- );
+ $x = q("update abook set abook_instance = '%s', abook_not_here = 0 where abook_id = %d",
+ dbesc($abook_instance),
+ intval($r[0]['abook_id'])
+ );
+ }
if(intval($r[0]['abook_pending'])) {
$x = q("update abook set abook_pending = 0 where abook_id = %d",
@@ -250,7 +249,7 @@ function new_contact($uid,$url,$channel,$interactive = false, $confirm = false)
'abook_channel' => intval($uid),
'abook_closeness' => intval($closeness),
'abook_xchan' => $xchan_hash,
- 'abook_feed' => intval(($is_http) ? 1 : 0),
+ 'abook_feed' => intval(($xchan['xchan_network'] === 'rss') ? 1 : 0),
'abook_created' => datetime_convert(),
'abook_updated' => datetime_convert(),
'abook_instance' => (($singleton) ? z_root() : '')
diff --git a/include/group.php b/include/group.php
index 3b208ef95..e0c20b536 100644
--- a/include/group.php
+++ b/include/group.php
@@ -278,8 +278,9 @@ function group_side($every="connections",$each="group",$edit = false, $group_id
$o = '';
- if(! (local_channel() && feature_enabled(local_channel(),'groups')))
+ if(! (local_channel() && feature_enabled(local_channel(),'groups'))) {
return '';
+ }
$groups = array();
diff --git a/include/help.php b/include/help.php
index e4725575d..4f9251b1b 100644
--- a/include/help.php
+++ b/include/help.php
@@ -57,7 +57,7 @@ function get_help_content($tocpath = false) {
if(! $text) {
$doctype = 'bbcode';
$text = load_doc_file('doc/main.bb');
- goaway('/help/about/about_hubzilla');
+ goaway('/help/about/about');
\App::$page['title'] = t('Help');
}
@@ -116,9 +116,11 @@ function load_doc_file($s) {
$b = basename($s);
$d = dirname($s);
- $c = find_doc_file("$d/$lang/$b");
- if($c)
- return $c;
+ if($dirname !== '-') {
+ $c = find_doc_file("$d/$lang/$b");
+ if($c)
+ return $c;
+ }
$c = find_doc_file($s);
if($c)
return $c;
@@ -140,8 +142,8 @@ function find_doc_file($s) {
*/
function search_doc_files($s) {
- $itemspage = get_pconfig(local_channel(),'system','itemspage');
- \App::set_pager_itemspage(((intval($itemspage)) ? $itemspage : 20));
+
+ \App::set_pager_itemspage(60);
$pager_sql = sprintf(" LIMIT %d OFFSET %d ", intval(\App::$pager['itemspage']), intval(\App::$pager['start']));
$regexop = db_getfunc('REGEXP');
@@ -198,6 +200,7 @@ function doc_rank_sort($s1, $s2) {
*
* @return string
*/
+
function load_context_help() {
$path = App::$cmd;
diff --git a/include/import.php b/include/import.php
index 3f4d84765..5cb354cc3 100644
--- a/include/import.php
+++ b/include/import.php
@@ -628,16 +628,18 @@ function import_items($channel, $items, $sync = false, $relocate = null) {
$item_result = item_store($item,$allow_code,$deliver);
}
+ // preserve conversations you've been involved in from being expired
+
+ $stored = $item_result['item'];
+ if((is_array($stored)) && ($stored['id'] != $stored['parent'])
+ && ($stored['author_xchan'] === $channel['channel_hash'])) {
+ retain_item($stored['item']['parent']);
+ }
+
fix_attached_photo_permissions($channel['channel_id'],$item['author_xchan'],$item['body'],$item['allow_cid'],$item['allow_gid'],$item['deny_cid'],$item['deny_gid']);
fix_attached_file_permissions($channel,$item['author_xchan'],$item['body'],$item['allow_cid'],$item['allow_gid'],$item['deny_cid'],$item['deny_gid']);
- if($sync && $item['item_wall']) {
- // deliver singletons if we have any
- if($item_result && $item_result['success']) {
- Zotlabs\Daemon\Master::Summon( [ 'Notifier','single_activity',$item_result['item_id'] ]);
- }
- }
}
}
}
@@ -1011,9 +1013,6 @@ function import_mail($channel, $mails, $sync = false) {
$m['aid'] = $channel['channel_account_id'];
$m['uid'] = $channel['channel_id'];
$mail_id = mail_store($m);
- if($sync && $mail_id) {
- Zotlabs\Daemon\Master::Summon(array('Notifier','single_mail',$mail_id));
- }
}
}
}
@@ -1094,11 +1093,12 @@ function sync_files($channel, $files) {
$ext = '';
}
- $r = q("select filename from attach where ( filename = '%s' OR filename like '%s' ) and folder = '%s' and hash != '%s' ",
+ $r = q("select filename from attach where ( filename = '%s' OR filename like '%s' ) and folder = '%s' and hash != '%s' and uid = %d ",
dbesc($basename . $ext),
dbesc($basename . '(%)' . $ext),
dbesc($att['folder']),
- dbesc($att['hash'])
+ dbesc($att['hash']),
+ intval($channel['channel_id'])
);
if($r) {
@@ -1264,7 +1264,7 @@ function sync_files($channel, $files) {
$r = dbq("update photo set " . $str . " where id = " . intval($exists[0]['id']) );
}
else {
- create_attach_from_array('photo',$p);
+ create_table_from_array('photo',$p);
}
}
}
diff --git a/include/items.php b/include/items.php
index 328079b9d..5a0ca01c6 100755
--- a/include/items.php
+++ b/include/items.php
@@ -8,6 +8,7 @@ use Zotlabs\Lib as Zlib;
require_once('include/bbcode.php');
require_once('include/oembed.php');
require_once('include/crypto.php');
+require_once('include/message.php');
require_once('include/feedutils.php');
require_once('include/photo/photo_driver.php');
require_once('include/permissions.php');
@@ -175,6 +176,13 @@ function item_normal() {
and item.item_blocked = 0 ";
}
+function item_normal_search() {
+ return " and item.item_hidden = 0 and item.item_type in (0,3) and item.item_deleted = 0
+ and item.item_unpublished = 0 and item.item_delayed = 0 and item.item_pending_remove = 0
+ and item.item_blocked = 0 ";
+}
+
+
/**
* @brief
*
@@ -212,6 +220,11 @@ function can_comment_on_post($observer_xchan, $item) {
// logger('can_comment_on_post: comment_policy: ' . $item['comment_policy'], LOGGER_DEBUG);
+ $x = [ 'observer_hash' => $observer_xchan, 'item' => $item, 'allowed' => 'unset' ];
+ call_hooks('can_comment_on_post',$x);
+ if($x['allowed'] !== 'unset')
+ return $x['allowed'];
+
if(! $observer_xchan)
return false;
@@ -248,8 +261,6 @@ function can_comment_on_post($observer_xchan, $item) {
}
if(strstr($item['comment_policy'],'network:') && strstr($item['comment_policy'],'red'))
return true;
- if(strstr($item['comment_policy'],'network:') && strstr($item['comment_policy'],'diaspora'))
- return true;
if(strstr($item['comment_policy'],'site:') && strstr($item['comment_policy'],App::get_hostname()))
return true;
@@ -587,11 +598,6 @@ function get_item_elements($x,$allow_code = false) {
$arr['sig'] = (($x['signature']) ? htmlspecialchars($x['signature'], ENT_COMPAT,'UTF-8',false) : '');
- if(array_key_exists('diaspora_signature',$x) && is_array($x['diaspora_signature']))
- $x['diaspora_signature'] = json_encode($x['diaspora_signature']);
-
- $arr['diaspora_meta'] = (($x['diaspora_signature']) ? $x['diaspora_signature'] : '');
-
$arr['obj'] = activity_sanitise($x['object']);
$arr['target'] = activity_sanitise($x['target']);
@@ -797,8 +803,10 @@ function import_author_xchan($x) {
if((! array_key_exists('network', $x)) || ($x['network'] === 'zot')) {
$y = import_author_zot($x);
}
- if(! $y)
- $y = import_author_diaspora($x);
+
+ // if we were told that it's a zot connection, don't probe/import anything else
+ if(array_key_exists('network',$x) && $x['network'] === 'zot')
+ return $y;
if($x['network'] === 'rss') {
$y = import_author_rss($x);
@@ -809,36 +817,7 @@ function import_author_xchan($x) {
}
return($y);
-}
-
-/**
- * @brief Imports an author from Diaspora.
- *
- * @param array $x an associative array with
- * * \e string \b address
- * @return boolean|string false on error, otherwise xchan_hash of the new entry
- */
-function import_author_diaspora($x) {
- if(! $x['address'])
- return false;
-
- $r = q("select * from xchan where xchan_addr = '%s' limit 1",
- dbesc($x['address'])
- );
- if($r) {
- logger('in_cache: ' . $x['address'], LOGGER_DATA);
- return $r[0]['xchan_hash'];
- }
-
- if(discover_by_webbie($x['address'])) {
- $r = q("select xchan_hash from xchan where xchan_addr = '%s' limit 1",
- dbesc($x['address'])
- );
- if($r)
- return $r[0]['xchan_hash'];
- }
- return false;
}
/**
@@ -850,6 +829,7 @@ function import_author_diaspora($x) {
* * \e string \b guid
* @return boolean|string
*/
+
function import_author_rss($x) {
if(! $x['url'])
return false;
@@ -897,6 +877,11 @@ function import_author_rss($x) {
function import_author_unknown($x) {
+ $arr = [ 'author' => $x, 'result' => false ];
+ call_hooks('import_author', $arr);
+ if($arr['result'])
+ return $arr['result'];
+
if(! $x['url'])
return false;
@@ -926,7 +911,7 @@ function import_author_unknown($x) {
$photos = import_xchan_photo($x['photo']['src'],$x['url']);
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_url = '%s' and xchan_network = 'unknown'",
+ $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' and xchan_network = 'unknown'",
dbesc(datetime_convert()),
dbesc($photos[0]),
dbesc($photos[1]),
@@ -1056,17 +1041,7 @@ function encode_item($item,$mirror = false) {
if($item['iconfig'])
$x['meta'] = encode_item_meta($item['iconfig'],$mirror);
- if($item['diaspora_meta']) {
- $z = json_decode($item['diaspora_meta'],true);
- if($z) {
- if(is_array($z) && array_key_exists('iv',$z))
- $x['diaspora_signature'] = crypto_unencapsulate($z,$key);
- else
- $x['diaspora_signature'] = $z;
- if(! is_array($z))
- logger('encode_item: diaspora meta is not an array: ' . print_r($z,true));
- }
- }
+
logger('encode_item: ' . print_r($x,true), LOGGER_DATA);
return $x;
@@ -1347,11 +1322,12 @@ function encode_mail($item,$extended = false) {
$x['message_parent'] = $item['parent_mid'];
$x['created'] = $item['created'];
$x['expires'] = $item['expires'];
- $x['diaspora_meta'] = $item['diaspora_meta'];
$x['title'] = $item['title'];
$x['body'] = $item['body'];
$x['from'] = encode_item_xchan($item['from']);
$x['to'] = encode_item_xchan($item['to']);
+ $x['raw'] = $item['mail_raw'];
+ $x['mimetype'] = $item['mail_mimetype'];
if($item['attach'])
$x['attach'] = json_decode($item['attach'],true);
@@ -1385,9 +1361,16 @@ function get_mail_elements($x) {
$arr = array();
- $arr['body'] = (($x['body']) ? htmlspecialchars($x['body'], ENT_COMPAT,'UTF-8',false) : '');
- $arr['title'] = (($x['title'])? htmlspecialchars($x['title'],ENT_COMPAT,'UTF-8',false) : '');
+ if(intval($x['raw'])) {
+ $arr['mail_raw'] = intval($x['raw']);
+ $arr['body'] = $x['body'];
+ }
+ else {
+ $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['mail_mimetype'] = (($x['mimetype']) ? htmlspecialchars($x['mimetype'],ENT_COMPAT,'UTF-8',false) : 'text/bbcode');
$arr['conv_guid'] = (($x['conv_guid'])? htmlspecialchars($x['conv_guid'],ENT_COMPAT,'UTF-8',false) : '');
$arr['created'] = datetime_convert('UTC','UTC',$x['created']);
@@ -1560,7 +1543,6 @@ function item_store($arr, $allow_exec = false, $deliver = true) {
$arr['title'] = ((array_key_exists('title',$arr) && strlen($arr['title'])) ? trim($arr['title']) : '');
$arr['body'] = ((array_key_exists('body',$arr) && strlen($arr['body'])) ? trim($arr['body']) : '');
- $arr['diaspora_meta'] = ((x($arr,'diaspora_meta')) ? $arr['diaspora_meta'] : '');
$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']) : '');
@@ -1755,7 +1737,7 @@ logger('revision: ' . $arr['revision']);
if($r[0]['owner_xchan'] !== $arr['owner_xchan']) {
$arr['owner_xchan'] = $r[0]['owner_xchan'];
-// $uplinked_comment = true;
+ // $uplinked_comment = true;
}
// if the parent is private, force privacy for the entire conversation
@@ -2060,7 +2042,7 @@ function item_store_update($arr,$allow_exec = false, $deliver = true) {
$arr['changed'] = $orig[0]['changed'];
$arr['route'] = ((array_key_exists('route',$arr)) ? trim($arr['route']) : $orig[0]['route']);
- $arr['diaspora_meta'] = ((x($arr,'diaspora_meta')) ? $arr['diaspora_meta'] : $orig[0]['diaspora_meta']);
+
$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']);
@@ -2219,55 +2201,6 @@ function item_store_update($arr,$allow_exec = false, $deliver = true) {
-function store_diaspora_comment_sig($datarray, $channel, $parent_item, $post_id, $walltowall = false) {
-
- // We won't be able to sign Diaspora comments for authenticated visitors
- // - we don't have their private key
-
- // since Diaspora doesn't handle edits we can only do this for the original text and not update it.
-
- require_once('include/markdown.php');
- $signed_body = bb2diaspora_itembody($datarray,$walltowall);
-
- if($walltowall) {
- logger('wall to wall comment',LOGGER_DEBUG);
- // post will come across with the owner's identity. Throw a preamble onto the post to indicate the true author.
- $signed_body = "\n\n"
- . '![' . $datarray['author']['xchan_name'] . '](' . $datarray['author']['xchan_photo_m'] . ')'
- . '[' . $datarray['author']['xchan_name'] . '](' . $datarray['author']['xchan_url'] . ')' . "\n\n"
- . $signed_body;
- }
-
- logger('storing diaspora comment signature',LOGGER_DEBUG);
-
- $diaspora_handle = channel_reddress($channel);
-
- $signed_text = $datarray['mid'] . ';' . $parent_item['mid'] . ';' . $signed_body . ';' . $diaspora_handle;
-
-
- if( $channel && $channel['channel_prvkey'] )
- $authorsig = base64_encode(rsa_sign($signed_text, $channel['channel_prvkey'], 'sha256'));
- else
- $authorsig = '';
-
- $x = array('signer' => $diaspora_handle, 'body' => $signed_body, 'signed_text' => $signed_text, 'signature' => $authorsig);
-
- $y = json_encode($x);
-
- $r = q("update item set diaspora_meta = '%s' where id = %d",
- dbesc($y),
- intval($post_id)
- );
-
-
- if(! $r)
- logger('store_diaspora_comment_sig: DB write failed');
-
- return;
-}
-
-
-
function send_status_notifications($post_id,$item) {
// only send notifications for comments
@@ -3000,6 +2933,8 @@ function mail_store($arr) {
return 0;
}
+ $channel = channelx_by_n($arr['channel_id']);
+
if(! $arr['mail_obscured']) {
if((strpos($arr['body'],'<') !== false) || (strpos($arr['body'],'>') !== false))
$arr['body'] = escape_tags($arr['body']);
@@ -3025,14 +2960,39 @@ function mail_store($arr) {
$arr['body'] = ((x($arr,'body')) ? trim($arr['body']) : '');
$arr['sig'] = ((x($arr,'sig')) ? trim($arr['sig']) : '');
$arr['conv_guid'] = ((x($arr,'conv_guid')) ? trim($arr['conv_guid']) : '');
+ $arr['mail_mimetype'] = ((x($arr,'mail_mimetype')) ? trim($arr['mail_mimetype']) : 'text/bbcode');
$arr['mail_flags'] = ((x($arr,'mail_flags')) ? intval($arr['mail_flags']) : 0 );
+ $arr['mail_raw'] = ((x($arr,'mail_raw')) ? intval($arr['mail_raw']) : 0 );
- if(! $arr['parent_mid']) {
+
+
+ if($arr['parent_mid']) {
+ $parent_item = q("select * from mail where mid = '%s' and channel_id = %d limit 1",
+ dbesc($arr['parent_mid']),
+ intval($arr['channel_id'])
+ );
+ if(($parent_item) && (! $arr['conv_guid'])) {
+ $arr['conv_guid'] = $parent_item[0]['conv_guid'];
+ }
+ }
+ else {
logger('mail_store: missing parent');
$arr['parent_mid'] = $arr['mid'];
}
+ if($arr['from_xchan'] === $channel['channel_hash'])
+ $conversant = $arr['to_xchan'];
+ else
+ $conversant = $arr['from_xchan'];
+
+
+ if(! $arr['conv_guid']) {
+ $x = create_conversation($channel,$conversant,(($arr['title']) ? base64url_decode(str_rot47($arr['title'])) : ''));
+ $arr['conv_guid'] = (($x) ? $x['guid'] : '');
+ }
+
+
$r = q("SELECT id FROM mail WHERE mid = '%s' AND channel_id = %d LIMIT 1",
dbesc($arr['mid']),
intval($arr['channel_id'])
@@ -3097,6 +3057,14 @@ function mail_store($arr) {
Zlib\Enotify::submit($notif_params);
}
+ if($arr['conv_guid']) {
+ $c = q("update conv set updated = '%s' where guid = '%s' and uid = %d",
+ dbesc(datetime_convert()),
+ dbesc($arr['conv_guid']),
+ intval($arr['channel_id'])
+ );
+ }
+
call_hooks('post_mail_end',$arr);
return $current_post;
}
@@ -3961,8 +3929,8 @@ function items_fetch($arr,$channel = null,$observer_hash = null,$client_mode = C
}
}
- if(intval($arr['compat']) === 1) {
- $sql_extra = " AND author_xchan = owner_xchan and item_wall = 1 and item_private = 0 ";
+ if($channel && intval($arr['compat']) === 1) {
+ $sql_extra = " AND author_xchan = '" . $channel['channel_hash'] . "' and item_private = 0 ";
}
if ($arr['datequery']) {
@@ -3972,11 +3940,6 @@ function items_fetch($arr,$channel = null,$observer_hash = null,$client_mode = C
$sql_extra3 .= protect_sprintf(sprintf(" AND item.created >= '%s' ", dbesc(datetime_convert('UTC','UTC',$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)
@@ -4048,7 +4011,8 @@ function items_fetch($arr,$channel = null,$observer_hash = null,$client_mode = C
if($arr['item_type'] === '*')
$item_restrict = '';
- if ($arr['nouveau'] && ($client_mode & CLIENT_MODE_LOAD) && $channel) {
+ if ((($arr['compat']) || ($arr['nouveau'] && ($client_mode & CLIENT_MODE_LOAD))) && $channel) {
+
// "New Item View" - show all items unthreaded in reverse created date order
$items = q("SELECT item.*, item.id AS item_id FROM item
@@ -4343,10 +4307,7 @@ function sync_an_item($channel_id,$item_id) {
if($r) {
xchan_query($r);
$sync_item = fetch_post_tags($r);
- $rid = q("select * from item_id where iid = %d",
- intval($item_id)
- );
- build_sync_packet($channel_d,array('item' => array(encode_item($sync_item[0],true)),'item_id' => $rid));
+ build_sync_packet($channel_d,array('item' => array(encode_item($sync_item[0],true))));
}
}
diff --git a/include/markdown.php b/include/markdown.php
index a9617f72b..0cd9ab237 100644
--- a/include/markdown.php
+++ b/include/markdown.php
@@ -5,7 +5,7 @@
*/
use Michelf\MarkdownExtra;
-use Markdownify\Converter;
+use League\HTMLToMarkdown\HtmlConverter;
require_once("include/oembed.php");
require_once("include/event.php");
@@ -13,138 +13,6 @@ require_once("include/html2bbcode.php");
require_once("include/bbcode.php");
-function get_bb_tag_pos($s, $name, $occurance = 1) {
-
- if($occurance < 1)
- $occurance = 1;
-
- $start_open = -1;
- for($i = 1; $i <= $occurance; $i++) {
- if( $start_open !== false)
- $start_open = strpos($s, '[' . $name, $start_open + 1); // allow [name= type tags
- }
-
- if( $start_open === false)
- return false;
-
- $start_equal = strpos($s, '=', $start_open);
- $start_close = strpos($s, ']', $start_open);
-
- if( $start_close === false)
- return false;
-
- $start_close++;
-
- $end_open = strpos($s, '[/' . $name . ']', $start_close);
-
- if( $end_open === false)
- return false;
-
- $res = array( 'start' => array('open' => $start_open, 'close' => $start_close),
- 'end' => array('open' => $end_open, 'close' => $end_open + strlen('[/' . $name . ']')) );
- if( $start_equal !== false)
- $res['start']['equal'] = $start_equal + 1;
-
- return $res;
-}
-
-function bb_tag_preg_replace($pattern, $replace, $name, $s) {
-
- $string = $s;
-
- $occurance = 1;
- $pos = get_bb_tag_pos($string, $name, $occurance);
- while($pos !== false && $occurance < 1000) {
-
- $start = substr($string, 0, $pos['start']['open']);
- $subject = substr($string, $pos['start']['open'], $pos['end']['close'] - $pos['start']['open']);
- $end = substr($string, $pos['end']['close']);
- if($end === false)
- $end = '';
-
- $subject = preg_replace($pattern, $replace, $subject);
- $string = $start . $subject . $end;
-
- $occurance++;
- $pos = get_bb_tag_pos($string, $name, $occurance);
- }
-
- return $string;
-}
-
-function share_shield($m) {
- return str_replace($m[1],'!=+=+=!' . base64url_encode($m[1]) . '=+!=+!=',$m[0]);
-}
-
-function share_unshield($m) {
- $x = str_replace(array('!=+=+=!','=+!=+!='),array('',''),$m[1]);
- return str_replace($m[1], base64url_decode($x), $m[0]);
-}
-
-
-function diaspora_mention_callback($matches) {
-
- $webbie = $matches[2] . '@' . $matches[3];
- $link = '';
- if($webbie) {
- $r = q("select * from hubloc left join xchan on hubloc_hash = xchan_hash where hubloc_addr = '%s' limit 1",
- dbesc($webbie)
- );
- if(! $r) {
- $x = discover_by_webbie($webbie);
- if($x) {
- $r = q("select * from hubloc left join xchan on hubloc_hash = xchan_hash where hubloc_addr = '%s' limit 1",
- dbesc($webbie)
- );
- }
- }
- if($r)
- $link = $r[0]['xchan_url'];
- }
- if(! $link)
- $link = 'https://' . $matches[3] . '/u/' . $matches[2];
-
- if($r && $r[0]['hubloc_network'] === 'zot')
- return '@[zrl=' . $link . ']' . trim($matches[1]) . ((substr($matches[0],-1,1) === '+') ? '+' : '') . '[/zrl]' ;
- else
- return '@[url=' . $link . ']' . trim($matches[1]) . ((substr($matches[0],-1,1) === '+') ? '+' : '') . '[/url]' ;
-
-}
-
-function diaspora_mention_callback2($matches) {
-
- $webbie = $matches[1] . '@' . $matches[2];
- $link = '';
- if($webbie) {
- $r = q("select * from hubloc left join xchan on hubloc_hash = xchan_hash where hubloc_addr = '%s' limit 1",
- dbesc($webbie)
- );
- if(! $r) {
- $x = discover_by_webbie($webbie);
- if($x) {
- $r = q("select * from hubloc left join xchan on hubloc_hash = xchan_hash where hubloc_addr = '%s' limit 1",
- dbesc($webbie)
- );
- }
- }
- if($r)
- $link = $r[0]['xchan_url'];
- }
-
- $name = (($r) ? $r[0]['xchan_name'] : $matches[1]);
-
- if(! $link)
- $link = 'https://' . $matches[2] . '/u/' . $matches[1];
-
- if($r && $r[0]['hubloc_network'] === 'zot')
- return '@[zrl=' . $link . ']' . trim($name) . ((substr($matches[0],-1,1) === '+') ? '+' : '') . '[/zrl]' ;
- else
- return '@[url=' . $link . ']' . trim($name) . ((substr($matches[0],-1,1) === '+') ? '+' : '') . '[/url]' ;
-
-}
-
-
-
/**
* @brief
*
@@ -157,28 +25,29 @@ function diaspora_mention_callback2($matches) {
* @param boolean $use_zrl default false
* @return string
*/
-function markdown_to_bb($s, $use_zrl = false) {
- $s = str_replace("&#xD;","\r",$s);
- $s = str_replace("&#xD;\n&gt;","",$s);
+function markdown_to_bb($s, $use_zrl = false, $options = []) {
+
if(is_array($s)) {
btlogger('markdown_to_bb called with array. ' . print_r($s,true), LOGGER_NORMAL, LOG_WARNING);
return '';
}
+
+ $s = str_replace("&#xD;","\r",$s);
+ $s = str_replace("&#xD;\n&gt;","",$s);
+
$s = html_entity_decode($s,ENT_COMPAT,'UTF-8');
// if empty link text replace with the url
$s = preg_replace("/\[\]\((.*?)\)/ism",'[$1]($1)',$s);
- // first try plustags
+ $x = [ 'text' => $s , 'zrl' => $use_zrl, 'options' => $options ];
- $s = preg_replace_callback('/\@\{(.+?)\; (.+?)\@(.+?)\}\+/','diaspora_mention_callback',$s);
- $s = preg_replace_callback('/\@\{(.+?)\; (.+?)\@(.+?)\}/','diaspora_mention_callback',$s);
+ call_hooks('markdown_to_bb_init',$x);
- $s = preg_replace_callback('/\@\{(.+?)\@(.+?)\}\+/','diaspora_mention_callback2',$s);
- $s = preg_replace_callback('/\@\{(.+?)\@(.+?)\}/','diaspora_mention_callback2',$s);
+ $s = $x['text'];
// Escaping the hash tags - doesn't always seem to work
// $s = preg_replace('/\#([^\s\#])/','\\#$1',$s);
@@ -193,9 +62,6 @@ function markdown_to_bb($s, $use_zrl = false) {
$s = html2bbcode($s);
- // protect the recycle symbol from turning into a tag, but without unescaping angles and naked ampersands
- $s = str_replace('&#x2672;',html_entity_decode('&#x2672;',ENT_QUOTES,'UTF-8'),$s);
-
// Convert everything that looks like a link to a link
if($use_zrl) {
$s = str_replace(array('[img','/img]'),array('[zmg','/zmg]'),$s);
@@ -217,287 +83,106 @@ function markdown_to_bb($s, $use_zrl = false) {
}
-function stripdcode_br_cb($s) {
- return '[code]' . str_replace('<br />', "\n\t", $s[1]) . '[/code]';
-}
-
-
-//////////////////////
-// The following "diaspora_ul" and "diaspora_ol" are only appropriate for the
-// pre-Markdownify conversion. If Markdownify isn't used, use the non-Markdownify
-// versions below
-//////////////////////
-/*
-function diaspora_ul($s) {
- // Replace "[*]" followed by any number (including zero) of
- // spaces by "* " to match Diaspora's list format
- if( strpos($s[0], "[list]") === 0 )
- return '<ul class="listbullet" style="list-style-type: circle;">' . preg_replace("/\[\*\]( *)/", "* ", $s[1]) . '</ul>';
- elseif( strpos($s[0], "[ul]") === 0 )
- return '<ul class="listbullet" style="list-style-type: circle;">' . preg_replace("/\[\*\]( *)/", "* ", $s[1]) . '</ul>';
- else
- return $s[0];
-}
-
-
-function diaspora_ol($s) {
- // A hack: Diaspora will create a properly-numbered ordered list even
- // if you use '1.' for each element of the list, like:
- // 1. First element
- // 1. Second element
- // 1. Third element
- if( strpos($s[0], "[list=1]") === 0 )
- return '<ul class="listdecimal" style="list-style-type: decimal;">' . preg_replace("/\[\*\]( *)/", "1. ", $s[1]) . '</ul>';
- elseif( strpos($s[0], "[list=i]") === 0 )
- return '<ul class="listlowerroman" style="list-style-type: lower-roman;">' . preg_replace("/\[\*\]( *)/", "1. ", $s[1]) . '</ul>';
- elseif( strpos($s[0], "[list=I]") === 0 )
- return '<ul class="listupperroman" style="list-style-type: upper-roman;">' . preg_replace("/\[\*\]( *)/", "1. ", $s[1]) . '</ul>';
- elseif( strpos($s[0], "[list=a]") === 0 )
- return '<ul class="listloweralpha" style="list-style-type: lower-alpha;">' . preg_replace("/\[\*\]( *)/", "1. ", $s[1]) . '</ul>';
- elseif( strpos($s[0], "[list=A]") === 0 )
- return '<ul class="listupperalpha" style="list-style-type: upper-alpha;">' . preg_replace("/\[\*\]( *)/", "1. ", $s[1]) . '</ul>';
- elseif( strpos($s[0], "[ol]") === 0 )
- return '<ul class="listdecimal" style="list-style-type: decimal;">' . preg_replace("/\[\*\]( *)/", "1. ", $s[1]) . '</ul>';
- else
- return $s[0];
-}
-*/
-
-//////////////////////
-// Non-Markdownify versions of "diaspora_ol" and "diaspora_ul"
-//////////////////////
-/**
- * @brief
- *
- * Replace "[\\*]" followed by any number (including zero) of
- * spaces by "* " to match Diaspora's list format.
- *
- * @param string $s
- * @return string
- */
-function diaspora_ul($s) {
- return preg_replace("/\[\\\\\*\]( *)/", "* ", $s[1]);
-}
-
-/**
- * @brief
- *
- * A hack: Diaspora will create a properly-numbered ordered list even
- * if you use '1.' for each element of the list, like:
- * \code
- * 1. First element
- * 1. Second element
- * 1. Third element
- * \endcode
- * @param string $s
- * @return string
- */
-function diaspora_ol($s) {
- return preg_replace("/\[\\\\\*\]( *)/", "1. ", $s[1]);
-}
-
-function bb2dmention_callback($match) {
-
- $r = q("select xchan_addr from xchan where xchan_url = '%s'",
- dbesc($match[2])
- );
-
- if($r)
- return '@{' . $match[3] . ' ; ' . $r[0]['xchan_addr'] . '}';
-
- return '@' . $match[3];
-}
-
-
-function bb2diaspora_itemwallwall(&$item,$uplink = false) {
-
- // We will provide wallwall (embedded author on the Diaspora side) if
- // 1. It is a wall-to-wall post
- // 2. A comment arrived which has no Diaspora signature info
-
-
- $wallwall = false;
- $author_exists = true;
-
- if(! array_key_exists('author',$item)) {
- $author_exists = false;
- logger('bb2diaspora_itemwallwall: no author');
- $r = q("select * from xchan where xchan_hash = '%s' limit 1",
- dbesc($item['author_xchan'])
- );
- if($r)
- $item['author'] = $r[0];
- }
-
- $has_meta = false;
- if($item['diaspora_meta'] || get_iconfig($item,'diaspora','fields'))
- $has_meta = true;
-
- if($item['author_xchan'] != $item['owner_xchan']) {
- if($item['mid'] == $item['parent_mid'])
- $wallwall = true;
- else {
- if(! $has_meta) {
- $wallwall = true;
- }
- }
- }
-
- if($uplink)
- $wallwall = true;
-
- if(($wallwall) && (is_array($item['author'])) && $item['author']['xchan_url'] && $item['author']['xchan_name'] && $item['author']['xchan_photo_s']) {
- logger('bb2diaspora_itemwallwall: wall to wall post',LOGGER_DEBUG);
- // post will come across with the owner's identity. Throw a preamble onto the post to indicate the true author.
- $item['body'] = "\n\n"
- . '[quote]'
- . '[img]' . $item['author']['xchan_photo_s'] . '[/img]'
- . ' '
- . '[url=' . $item['author']['xchan_url'] . '][b]' . $item['author']['xchan_name'] . '[/b][/url]' . "\n\n"
- . $item['body']
- . '[/quote]';
- }
-
- // $item['author'] might cause a surprise further down the line if it wasn't expected to be here.
-
- if(! $author_exists)
- unset($item['author']);
-}
-
-function bb2diaspora_itembody($item, $force_update = false, $have_channel = false, $uplink = false) {
-
- if(! get_iconfig($item,'diaspora','fields')) {
- $force_update = true;
- }
+function bb_to_markdown_share($match) {
$matches = array();
-
- if(($item['diaspora_meta']) && (! $force_update)) {
- $diaspora_meta = json_decode($item['diaspora_meta'],true);
- if($diaspora_meta) {
- if(array_key_exists('iv',$diaspora_meta)) {
- $key = get_config('system','prvkey');
- $meta = json_decode(crypto_unencapsulate($diaspora_meta,$key),true);
- }
- else {
- $meta = $diaspora_meta;
- }
- if($meta) {
- logger('bb2diaspora_itembody: cached ');
- $newitem = $item;
- $newitem['body'] = $meta['body'];
- return $newitem['body'];
- }
- }
+ $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];
+
+ // message_id is never used, do we still need it?
+ $message_id = "";
+ preg_match("/message_id='(.*?)'/ism", $attributes, $matches);
+ if ($matches[1] != "")
+ $message_id = $matches[1];
+
+ if(! $message_id) {
+ preg_match("/guid='(.*?)'/ism", $attributes, $matches);
+ if ($matches[1] != "")
+ $message_id = $matches[1];
}
- create_export_photo_body($item);
-
- $newitem = $item;
-
- if(array_key_exists('item_obscured',$item) && intval($item['item_obscured'])) {
- $key = get_config('system','prvkey');
- $b = json_decode($item['body'],true);
- // if called from diaspora_process_outbound, this decoding has already been done.
- // Everything else that calls us will not yet be decoded.
- if($b && is_array($b) && array_key_exists('iv',$b)) {
- $newitem['title'] = (($item['title']) ? crypto_unencapsulate(json_decode($item['title'],true),$key) : '');
- $newitem['body'] = (($item['body']) ? crypto_unencapsulate(json_decode($item['body'],true),$key) : '');
- }
- }
- if(! $have_channel)
- bb2diaspora_itemwallwall($newitem,$uplink);
+ $reldate = datetime_convert('UTC', date_default_timezone_get(), $posted, 'r');
- $title = $newitem['title'];
- $body = preg_replace('/\#\^http/i', 'http', $newitem['body']);
+ $headline = '';
- // protect tags and mentions from hijacking
+ if ($avatar != "")
+ $headline .= '[url=' . zid($profile) . '][img]' . $avatar . '[/img][/url]';
- if(intval(get_pconfig($item['uid'],'system','prevent_tag_hijacking'))) {
- $new_tag = html_entity_decode('&#x22d5;',ENT_COMPAT,'UTF-8');
- $new_mention = html_entity_decode('&#xff20;',ENT_COMPAT,'UTF-8');
+ // Bob Smith wrote the following post 2 hours ago
- // #-tags
- $body = preg_replace('/\#\[url/i', $new_tag . '[url', $body);
- $body = preg_replace('/\#\[zrl/i', $new_tag . '[zrl', $body);
- // @-mentions
- $body = preg_replace('/\@\!?\[url/i', $new_mention . '[url', $body);
- $body = preg_replace('/\@\!?\[zrl/i', $new_mention . '[zrl', $body);
- }
+ $fmt = sprintf( t('%1$s wrote the following %2$s %3$s'),
+ '[url=' . zid($profile) . ']' . $author . '[/url]',
+ '[url=' . zid($link) . ']' . t('post') . '[/url]',
+ $reldate
+ );
- // remove multiple newlines
- do {
- $oldbody = $body;
- $body = str_replace("\n\n\n", "\n\n", $body);
- } while ($oldbody != $body);
-
- $body = bb2diaspora($body);
-
- if(strlen($title))
- $body = "## " . $title . "\n\n" . $body;
-
- if($item['attach']) {
- $cnt = preg_match_all('/href=\"(.*?)\"(.*?)title=\"(.*?)\"/ism', $item['attach'], $matches, PREG_SET_ORDER);
- if($cnt) {
- $body .= "\n" . t('Attachments:') . "\n";
- foreach($matches as $mtch) {
- $body .= '[' . $mtch[3] . '](' . $mtch[1] . ')' . "\n";
- }
- }
- }
+ $headline .= $fmt . "\n\n";
-// logger('bb2diaspora_itembody : ' . $body, LOGGER_DATA);
+ $text = $headline . trim($match[2]);
- return html_entity_decode($body);
+ return $text;
}
-function bb2diaspora($Text, $preserve_nl = false, $fordiaspora = true) {
- // Re-enabling the converter again.
- // The bbcode parser now handles youtube-links (and the other stuff) correctly.
- // Additionally the html code is now fixed so that lists are now working.
+
+function bb_to_markdown($Text, $options = []) {
/*
* Transform #tags, strip off the [url] and replace spaces with underscore
*/
- $Text = preg_replace_callback('/#\[([zu])rl\=(\w+.*?)\](\w+.*?)\[\/[(zu)]rl\]/i', create_function('$match',
- 'return \'#\'. str_replace(\' \', \'_\', $match[3]);'
- ), $Text);
-
- $Text = preg_replace('/#\^\[([zu])rl\=(\w+.*?)\](\w+.*?)\[\/([zu])rl\]/i', '[$1rl=$2]$3[/$4rl]', $Text);
- $Text = preg_replace_callback('/\@\!?\[([zu])rl\=(\w+.*?)\](\w+.*?)\[\/([zu])rl\]/i', 'bb2dmention_callback', $Text);
+ $Text = preg_replace_callback('/#\[([zu])rl\=(.*?)\](.*?)\[\/[(zu)]rl\]/i',
+ create_function('$match', 'return \'#\'. str_replace(\' \', \'_\', $match[3]);'), $Text);
- // strip map tags, as the rendering is performed in bbcode() and the resulting output
- // is not compatible with Diaspora (at least in the case of openstreetmap and probably
- // due to the inclusion of an html iframe)
- $Text = preg_replace("/\[map\=(.*?)\]/ism", '$1', $Text);
- $Text = preg_replace("/\[map\](.*?)\[\/map\]/ism", '$1', $Text);
+ $Text = preg_replace('/#\^\[([zu])rl\=(.*?)\](.*?)\[\/([zu])rl\]/i', '[$1rl=$2]$3[/$4rl]', $Text);
// Converting images with size parameters to simple images. Markdown doesn't know it.
$Text = preg_replace("/\[img\=([0-9]*)x([0-9]*)\](.*?)\[\/img\]/ism", '[img]$3[/img]', $Text);
- // the following was added on 10-January-2012 due to an inability of Diaspora's
- // new javascript markdown processor to handle links with images as the link "text"
- // It is not optimal and may be removed if this ability is restored in the future
- //if ($fordiaspora)
- // $Text = preg_replace("/\[url\=([^\[\]]*)\]\s*\[img\](.*?)\[\/img\]\s*\[\/url\]/ism",
- // "[url]$1[/url]\n[img]$2[/img]", $Text);
+ $Text = preg_replace_callback("/\[share(.*?)\](.*?)\[\/share\]/ism", 'bb_to_markdown_share', $Text);
+
+ $x = [ 'bbcode' => $Text, 'options' => $options ];
+
+ call_hooks('bb_to_markdown_bb',$x);
+
+ $Text = $x['bbcode'];
// Convert it to HTML - don't try oembed
$Text = bbcode($Text, $preserve_nl, false);
// Markdownify does not preserve previously escaped html entities such as <> and &.
-
$Text = str_replace(array('&lt;','&gt;','&amp;'),array('&_lt_;','&_gt_;','&_amp_;'),$Text);
// Now convert HTML to Markdown
- $md = new Converter(Converter::LINK_AFTER_CONTENT, false, false);
- $Text = $md->parseString($Text);
+ $Text = html2markdown($Text);
// It also adds backslashes to our attempt at getting around the html entity preservation for some weird reason.
@@ -512,55 +197,40 @@ function bb2diaspora($Text, $preserve_nl = false, $fordiaspora = true) {
// Remove empty zrl links
$Text = preg_replace("/\[zrl\=\].*?\[\/zrl\]/is", "", $Text);
- // Remove all unconverted tags
- $Text = strip_tags($Text);
-
- // Remove any leading or trailing whitespace, as this will mess up
- // the Diaspora signature verification and cause the item to disappear
-
$Text = trim($Text);
- call_hooks('bb2diaspora', $Text);
+ call_hooks('bb_to_markdown', $Text);
return $Text;
-}
-function unescape_underscores_in_links($m) {
- $y = str_replace('\\_','_', $m[2]);
- return('[' . $m[1] . '](' . $y . ')');
}
-function format_event_diaspora($ev) {
-
- if(! ((is_array($ev)) && count($ev)))
- return '';
-
- $bd_format = t('l F d, Y \@ g:i A') ; // Friday January 18, 2011 @ 8 AM
-
- $o = t('$Projectname event notification:') . "\n";
-
- $o .= '**' . (($ev['summary']) ? bb2diaspora($ev['summary']) : bb2diaspora($ev['desc'])) . '**' . "\n";
-
- $o .= t('Starts:') . ' ' . '['
- . (($ev['adjust']) ? day_translate(datetime_convert('UTC', 'UTC',
- $ev['start'] , $bd_format ))
- : day_translate(datetime_convert('UTC', 'UTC',
- $ev['start'] , $bd_format)))
- . '](' . z_root() . '/localtime/?f=&time=' . urlencode(datetime_convert('UTC','UTC',$ev['start'])) . ")\n";
-
- if(! $ev['nofinish'])
- $o .= t('Finishes:') . ' ' . '['
- . (($ev['adjust']) ? day_translate(datetime_convert('UTC', 'UTC',
- $ev['finish'] , $bd_format ))
- : day_translate(datetime_convert('UTC', 'UTC',
- $ev['finish'] , $bd_format )))
- . '](' . z_root() . '/localtime/?f=&time=' . urlencode(datetime_convert('UTC','UTC',$ev['finish'])) . ")\n";
- if(strlen($ev['location']))
- $o .= t('Location:') . bb2diaspora($ev['location'])
- . "\n";
- $o .= "\n";
+/**
+ * @brief Convert a HTML text into Markdown.
+ *
+ * This function uses the library league/html-to-markdown for this task.
+ *
+ * If the HTML text can not get parsed it will return an empty string.
+ *
+ * @see HTMLToMarkdown
+ *
+ * @param string $html The HTML code to convert
+ * @return string Markdown representation of the given HTML text, empty on error
+ */
+function html2markdown($html) {
+ $markdown = '';
+ $converter = new HtmlConverter();
+
+ try {
+ $markdown = $converter->convert($html);
+ } catch (InvalidArgumentException $e) {
+ logger("Invalid HTML. HTMLToMarkdown library threw an exception.");
+ }
- return $o;
+ // The old html 2 markdown library "pixel418/markdownify": "^2.2",
+ //$md = new HtmlConverter();
+ //$markdown = $md->convert($Text);
+ return $markdown;
}
diff --git a/include/message.php b/include/message.php
index 4e8e44adc..3f003e020 100644
--- a/include/message.php
+++ b/include/message.php
@@ -5,10 +5,20 @@
require_once('include/crypto.php');
require_once('include/attach.php');
+
+function mail_prepare_binary($item) {
+
+ return replace_macros(get_markup_template('item_binary.tpl'), [
+ '$download' => t('Download binary/encrypted content'),
+ '$url' => z_root() . '/mail/' . $item['id'] . '/download'
+ ]);
+}
+
+
// send a private message
-function send_message($uid = 0, $recipient = '', $body = '', $subject = '', $replyto = '', $expires = NULL_DATE) {
+function send_message($uid = 0, $recipient = '', $body = '', $subject = '', $replyto = '', $expires = NULL_DATE, $mimetype = 'text/bbcode', $raw = false) {
$ret = array('success' => false);
$is_reply = false;
@@ -94,38 +104,9 @@ function send_message($uid = 0, $recipient = '', $body = '', $subject = '', $rep
// create a new conversation
- $conv_guid = random_string();
-
- $recip = q("select * from xchan where xchan_hash = '%s' limit 1",
- dbesc($recipient)
- );
- if($recip)
- $recip_handle = $recip[0]['xchan_addr'];
-
- $sender_handle = channel_reddress($channel);
-
- $handles = $recip_handle . ';' . $sender_handle;
-
- if($subject)
- $nsubject = str_rot47(base64url_encode($subject));
-
- $r = q("insert into conv (uid,guid,creator,created,updated,subject,recips) values(%d, '%s', '%s', '%s', '%s', '%s', '%s') ",
- intval(local_channel()),
- dbesc($conv_guid),
- dbesc($sender_handle),
- dbesc(datetime_convert()),
- dbesc(datetime_convert()),
- dbesc($nsubject),
- dbesc($handles)
- );
-
- $r = q("select * from conv where guid = '%s' and uid = %d limit 1",
- dbesc($conv_guid),
- intval(local_channel())
- );
- if($r) {
- $retconv = $r[0];
- $retconv['subject'] = base64url_decode(str_rot47($retconv['subject']));
+ $retconv = create_conversation($channel,$recipient,$subject);
+ if($retconv) {
+ $conv_guid = $retconv['guid'];
}
}
@@ -136,7 +117,6 @@ function send_message($uid = 0, $recipient = '', $body = '', $subject = '', $rep
);
if($r) {
$retconv = $r[0];
- $retconv['subject'] = base64url_decode(str_rot47($retconv['subject']));
}
}
@@ -145,6 +125,12 @@ function send_message($uid = 0, $recipient = '', $body = '', $subject = '', $rep
return $ret;
}
+ $c = q("update conv set updated = '%s' where guid = '%s' and uid = %d",
+ dbesc(datetime_convert()),
+ dbesc($conv_guid),
+ intval(local_channel())
+ );
+
// generate a unique message_id
do {
@@ -192,8 +178,8 @@ function send_message($uid = 0, $recipient = '', $body = '', $subject = '', $rep
$sig = ''; // placeholder
$mimetype = ''; //placeholder
- $r = q("INSERT INTO mail ( account_id, conv_guid, mail_obscured, channel_id, from_xchan, to_xchan, mail_mimetype, title, body, sig, attach, mid, parent_mid, created, expires, mail_isreply )
- VALUES ( %d, '%s', %d, %d, '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', %d )",
+ $r = q("INSERT INTO mail ( account_id, conv_guid, mail_obscured, channel_id, from_xchan, to_xchan, mail_mimetype, title, body, sig, attach, mid, parent_mid, created, expires, mail_isreply, mail_raw )
+ VALUES ( %d, '%s', %d, %d, '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', %d, %d )",
intval($channel['channel_account_id']),
dbesc($conv_guid),
intval(1),
@@ -209,7 +195,8 @@ function send_message($uid = 0, $recipient = '', $body = '', $subject = '', $rep
dbesc($replyto),
dbesc(datetime_convert()),
dbescdate($expires),
- intval($is_reply)
+ intval($is_reply),
+ intval($raw)
);
// verify the save
@@ -273,6 +260,49 @@ function send_message($uid = 0, $recipient = '', $body = '', $subject = '', $rep
}
+function create_conversation($channel,$recipient,$subject) {
+
+ // create a new conversation
+
+ $conv_guid = random_string();
+
+ $recip = q("select * from xchan where xchan_hash = '%s' limit 1",
+ dbesc($recipient)
+ );
+ if($recip)
+ $recip_handle = $recip[0]['xchan_addr'];
+
+ $sender_handle = channel_reddress($channel);
+
+ $handles = $recip_handle . ';' . $sender_handle;
+
+ if($subject)
+ $nsubject = str_rot47(base64url_encode($subject));
+
+ $r = q("insert into conv (uid,guid,creator,created,updated,subject,recips) values(%d, '%s', '%s', '%s', '%s', '%s', '%s') ",
+ intval($channel['channel_id']),
+ dbesc($conv_guid),
+ dbesc($sender_handle),
+ dbesc(datetime_convert()),
+ dbesc(datetime_convert()),
+ dbesc($nsubject),
+ dbesc($handles)
+ );
+
+ $r = q("select * from conv where guid = '%s' and uid = %d limit 1",
+ dbesc($conv_guid),
+ intval($channel['channel_id'])
+ );
+
+ return $r[0];
+
+}
+
+
+
+
+
+
function private_messages_list($uid, $mailbox = '', $start = 0, $numitems = 0) {
$where = '';
@@ -304,6 +334,8 @@ function private_messages_list($uid, $mailbox = '', $start = 0, $numitems = 0) {
break;
case 'combined':
+ default:
+
$parents = q("SELECT parent_mid FROM mail WHERE mid = parent_mid AND channel_id = %d ORDER BY created DESC",
dbesc($local_channel)
);
@@ -315,15 +347,21 @@ function private_messages_list($uid, $mailbox = '', $start = 0, $numitems = 0) {
}
+ $r = null;
+
if($parents) {
foreach($parents as $parent) {
- $all[] = q("SELECT * FROM mail WHERE parent_mid = '%s' AND channel_id = %d ORDER BY created DESC",
+ $all = q("SELECT * FROM mail WHERE parent_mid = '%s' AND channel_id = %d ORDER BY created DESC limit 1",
dbesc($parent['parent_mid']),
dbesc($local_channel)
);
+
+ if($all) {
+ foreach($all as $single) {
+ $r[] = $single;
+ }
+ }
}
- foreach($all as $single)
- $r[] = $single[0];
}
else {
$r = q($sql);
@@ -441,10 +479,12 @@ function private_messages_drop($channel_id, $messageitem_id, $drop_conversation
intval($channel_id)
);
if($z) {
- q("delete from conv where guid = '%s' and uid = %d",
- dbesc($x[0]['conv_guid']),
- intval($channel_id)
- );
+ if($x[0]['conv_guid']) {
+ q("delete from conv where guid = '%s' and uid = %d",
+ dbesc($x[0]['conv_guid']),
+ intval($channel_id)
+ );
+ }
$m['mail'] = array();
foreach($z as $zz) {
xchan_mail_query($zz);
diff --git a/include/nav.php b/include/nav.php
index 08dbbd5e3..2004f6ae3 100644
--- a/include/nav.php
+++ b/include/nav.php
@@ -34,15 +34,17 @@ EOT;
intval($channel['channel_id'])
);
- $chans = q("select channel_name, channel_id from channel where channel_account_id = %d and channel_removed = 0 order by channel_name ",
- intval(get_account_id())
- );
+ if(! $_SESSION['delegate']) {
+ $chans = q("select channel_name, channel_id from channel where channel_account_id = %d and channel_removed = 0 order by channel_name ",
+ intval(get_account_id())
+ );
+ }
}
elseif(remote_channel())
$observer = App::get_observer();
require_once('include/conversation.php');
- $is_owner = (((local_channel()) && (App::$profile['profile_uid'] == local_channel())) ? true : false);
+ $is_owner = (((local_channel()) && ((App::$profile_uid == local_channel()) || (App::$profile_uid == 0))) ? true : false);
$channel_apps[] = channel_apps($is_owner, App::$profile['channel_address']);
$myident = (($channel) ? $channel['xchan_addr'] : '');
@@ -65,8 +67,6 @@ EOT;
//we could additionally use this to display important system notifications e.g. for updates
));
- $server_role = get_config('system','server_role');
- $basic = (($server_role === 'basic') ? true : false);
$techlevel = get_account_techlevel();
// nav links: array of array('href', 'text', 'extra css classes', 'title')
@@ -95,20 +95,18 @@ EOT;
if(local_channel()) {
-
-
- if($chans && count($chans) > 1 && feature_enabled(local_channel(),'nav_channel_select') && (! $basic))
+ if($chans && count($chans) > 1 && feature_enabled(local_channel(),'nav_channel_select'))
$nav['channels'] = $chans;
$nav['logout'] = ['logout',t('Logout'), "", t('End this session'),'logout_nav_btn'];
// user menu
- $nav['usermenu'][] = ['profile/' . $channel['channel_address'], t('View Profile'), "", t('Your profile page'),'profile_nav_btn'];
+ $nav['usermenu'][] = ['profile/' . $channel['channel_address'], t('View Profile'), ((\App::$nav_sel['active'] == 'Profile') ? 'active' : ''), t('Your profile page'),'profile_nav_btn'];
- if(feature_enabled(local_channel(),'multi_profiles') && (! $basic))
- $nav['usermenu'][] = ['profiles', t('Edit Profiles'),"", t('Manage/Edit profiles'),'profiles_nav_btn'];
+ if(feature_enabled(local_channel(),'multi_profiles'))
+ $nav['usermenu'][] = ['profiles', t('Edit Profiles'), ((\App::$nav_sel['active'] == 'Profiles') ? 'active' : '') , t('Manage/Edit profiles'),'profiles_nav_btn'];
else
- $nav['usermenu'][] = ['profiles/' . $prof[0]['id'], t('Edit Profile'),"", t('Edit your profile'),'profiles_nav_btn'];
+ $nav['usermenu'][] = ['profiles/' . $prof[0]['id'], t('Edit Profile'), ((\App::$nav_sel['active'] == 'Profiles') ? 'active' : ''), t('Edit your profile'),'profiles_nav_btn'];
}
else {
@@ -136,12 +134,12 @@ EOT;
$homelink = (($observer) ? $observer['xchan_url'] : '');
}
- if(! local_channel()) {
+ if(! $is_owner) {
$nav['rusermenu'] = array(
$homelink,
t('Take me home'),
'logout',
- t('Log me out of this site')
+ ((local_channel()) ? t('Logout') : t('Log me out of this site'))
);
}
@@ -172,7 +170,6 @@ EOT;
if(local_channel()) {
-
$nav['network'] = array('network', t('Grid'), "", t('Your grid'),'network_nav_btn');
$nav['network']['all'] = [ 'network', t('View your network/grid'), '','' ];
$nav['network']['mark'] = array('', t('Mark all grid notifications seen'), '','');
@@ -201,8 +198,9 @@ EOT;
$nav['all_events']['all']=array('events', t('View events'), "", "");
$nav['all_events']['mark'] = array('', t('Mark all events seen'), '','');
- if(! $basic)
+ if(! $_SESSION['delegate']) {
$nav['manage'] = array('manage', t('Channel Manager'), "", t('Manage Your Channels'),'manage_nav_btn');
+ }
$nav['settings'] = array('settings', t('Settings'),"", t('Account/Channel Settings'),'settings_nav_btn');
@@ -224,7 +222,7 @@ EOT;
$powered_by = '';
//app bin
- if(local_channel()) {
+ if($is_owner) {
if(get_pconfig(local_channel(), 'system','initial_import_system_apps') === false) {
Zlib\Apps::import_system_apps();
set_pconfig(local_channel(), 'system','initial_import_system_apps', 1);
@@ -245,8 +243,16 @@ EOT;
usort($syslist,'Zotlabs\\Lib\\Apps::app_name_compare');
+ $syslist = Zlib\Apps::app_order(local_channel(),$syslist);
+
foreach($syslist as $app) {
- $nav_apps[] = Zlib\Apps::app_render($app,'nav');
+ if(\App::$nav_sel['active'] == $app['name'])
+ $app['active'] = true;
+
+ if($is_owner)
+ $nav_apps[] = Zlib\Apps::app_render($app,'nav');
+ elseif(! $is_owner && strpos($app['requires'], 'local_channel') === false)
+ $nav_apps[] = Zlib\Apps::app_render($app,'nav');
}
$tpl = get_markup_template('nav.tpl');
@@ -260,6 +266,7 @@ EOT;
'$emptynotifications' => t('Loading...'),
'$userinfo' => $x['usermenu'],
'$localuser' => local_channel(),
+ '$is_owner' => $is_owner,
'$sel' => App::$nav_sel,
'$powered_by' => $powered_by,
'$help' => t('@name, #tag, ?doc, content'),
@@ -267,6 +274,7 @@ EOT;
'$nav_apps' => $nav_apps,
'$channel_apps' => $channel_apps,
'$addapps' => t('Add Apps'),
+ '$orderapps' => t('Arrange Apps'),
'$sysapps_toggle' => t('Toggle System Apps')
));
@@ -290,21 +298,7 @@ EOT;
*
*/
function nav_set_selected($item){
- App::$nav_sel = array(
- 'community' => null,
- 'network' => null,
- 'home' => null,
- 'profiles' => null,
- 'intros' => null,
- 'notifications' => null,
- 'messages' => null,
- 'directory' => null,
- 'settings' => null,
- 'contacts' => null,
- 'manage' => null,
- 'register' => null,
- );
- App::$nav_sel[$item] = 'active';
+ App::$nav_sel['active'] = $item;
}
diff --git a/include/network.php b/include/network.php
index c03ca70f5..5f814ef32 100644
--- a/include/network.php
+++ b/include/network.php
@@ -343,7 +343,7 @@ function z_post_url($url,$params, $redirects = 0, $opts = array()) {
if (isset($url_parsed)) {
curl_close($ch);
if($http_code == 303) {
- return z_fetch_url($newurl,false,$redirects++,$opts);
+ return z_fetch_url($newurl,false,++$redirects,$opts);
} else {
return z_post_url($newurl,$params,++$redirects,$opts);
}
@@ -397,31 +397,6 @@ function json_return_and_die($x, $content_type = 'application/json') {
killme();
}
-
-/**
- * @brief Generic XML return.
- *
- * 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.
- *
- * @param string $st
- * @param string $message
- */
-function xml_status($st, $message = '') {
-
- $xml_message = ((strlen($message)) ? "\t<message>" . xmlify($message) . "</message>\r\n" : '');
-
- if($st)
- logger('Returning non_zero: ' . $st . " message=" . $message);
-
- header( "Content-type: text/xml" );
- 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();
-}
-
-
/**
* @brief Send HTTP status header.
*
@@ -696,11 +671,12 @@ function parse_xml_string($s,$strict = true) {
libxml_use_internal_errors(true);
$x = @simplexml_load_string($s2);
- if(! $x) {
+ if($x === false) {
logger('libxml: parse: error: ' . $s2, LOGGER_DATA);
- foreach(libxml_get_errors() as $err)
- logger('libxml: parse: ' . $err->code." at ".$err->line.":".$err->column." : ".$err->message, LOGGER_DATA);
-
+ foreach(libxml_get_errors() as $err) {
+ logger('libxml: parse: ' . $err->code . ' at ' . $err->line
+ . ':' . $err->column . ' : ' . $err->message, LOGGER_DATA);
+ }
libxml_clear_errors();
}
@@ -1007,39 +983,6 @@ function email_header_encode($in_str, $charset = 'UTF-8') {
return $out_str;
}
-function email_send($addr, $subject, $headers, $item) {
- //$headers .= 'MIME-Version: 1.0' . "\n";
- //$headers .= 'Content-Type: text/html; charset=UTF-8' . "\n";
- //$headers .= 'Content-Type: text/plain; charset=UTF-8' . "\n";
- //$headers .= 'Content-Transfer-Encoding: 8bit' . "\n\n";
-
- $part = uniqid("", true);
-
- $html = prepare_body($item);
-
- $headers .= "Mime-Version: 1.0\n";
- $headers .= 'Content-Type: multipart/alternative; boundary="=_'.$part.'"'."\n\n";
-
- $body = "\n--=_".$part."\n";
- $body .= "Content-Transfer-Encoding: 8bit\n";
- $body .= "Content-Type: text/plain; charset=utf-8; format=flowed\n\n";
-
- $body .= html2plain($html)."\n";
-
- $body .= "--=_".$part."\n";
- $body .= "Content-Transfer-Encoding: 8bit\n";
- $body .= "Content-Type: text/html; charset=utf-8\n\n";
-
- $body .= '<html><head></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; ">'.$html."</body></html>\n";
-
- $body .= "--=_".$part."--";
-
- //$message = '<html><body>' . $html . '</body></html>';
- //$message = html2plain($html);
- logger('notifier: email delivery to ' . $addr);
- mail($addr, $subject, $body, $headers);
-}
-
/**
* @brief Creates an xchan entry for URL.
*
@@ -1056,10 +999,10 @@ function discover_by_url($url, $arr = null) {
return false;
$network = (($arr['network']) ? $arr['network'] : 'unknown');
- $name = (($arr['name']) ? $arr['name'] : 'unknown');
- $photo = (($arr['photo']) ? $arr['photo'] : '');
- $addr = (($arr['addr']) ? $arr['addr'] : '');
- $guid = $url;
+ $name = (($arr['name']) ? $arr['name'] : 'unknown');
+ $photo = (($arr['photo']) ? $arr['photo'] : '');
+ $addr = (($arr['addr']) ? $arr['addr'] : '');
+ $guid = $url;
}
$profile = $url;
@@ -1095,8 +1038,8 @@ function discover_by_url($url, $arr = null) {
if($feed->error())
logger('scrape_feed: Error parsing XML: ' . $feed->error());
- $name = unxmlify(trim($feed->get_title()));
- $photo = $feed->get_image_url();
+ $name = unxmlify(trim($feed->get_title()));
+ $photo = $feed->get_image_url();
$author = $feed->get_author();
if($author) {
@@ -1195,23 +1138,11 @@ function discover_by_url($url, $arr = null) {
}
function discover_by_webbie($webbie) {
- require_once('library/HTML5/Parser.php');
- $result = array();
+ $result = [];
$network = null;
- $diaspora = false;
- $gnusoc = false;
- $dfrn = false;
-
- $has_salmon = false;
- $salmon_key = false;
- $atom_feed = false;
- $diaspora_base = '';
- $diaspora_guid = '';
- $diaspora_key = '';
-
$webbie = strtolower($webbie);
$x = webfinger_rfc7033($webbie,true);
@@ -1237,21 +1168,6 @@ function discover_by_webbie($webbie) {
}
}
}
- if($link['rel'] == NAMESPACE_DFRN) {
- $dfrn = $link['href'];
- }
- if($link['rel'] == 'magic-public-key') {
- if(substr($link['href'],0,5) === 'data:') {
- $salmon_key = convert_salmon_key($link['href']);
- }
- }
- if($link['rel'] == 'salmon') {
- $has_salmon = true;
- $salmon = $link['href'];
- }
- if($link['rel'] == 'http://schemas.google.com/g/2010#updates-from') {
- $atom_feed = $link['href'];
- }
}
}
}
@@ -1263,275 +1179,9 @@ function discover_by_webbie($webbie) {
if($arr['success'])
return true;
- $aliases = array();
-
- // Now let's make some decisions on what we may need
- // to obtain further info
-
- $probe_atom = false;
- $probe_old = false;
- $probe_hcard = false;
-
- $address = '';
- $location = '';
- $nickname = '';
- $fullname = '';
- $avatar = '';
- $pubkey = '';
-
- if(is_array($x)) {
- if(array_key_exists('address',$x))
- $address = $x['address'];
- if(array_key_exists('location',$x))
- $location = $x['location'];
- if(array_key_exists('nickname',$x))
- $nickname = $x['nickname'];
- }
-
- if(! $x)
- $probe_old = true;
-
- if((! $dfrn) && (! $has_salmon))
- $probe_old = true;
-
- if($probe_old) {
- $y = old_webfinger($webbie);
- if($y) {
- logger('old_webfinger: ' . print_r($x,true));
- foreach($y as $link) {
- 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']);
- if($link['@attributes']['rel'] === 'http://joindiaspora.com/seed_location') {
- $diaspora_base = unamp($link['@attributes']['href']);
- $diaspora = true;
- }
- if($link['@attributes']['rel'] === 'http://joindiaspora.com/guid') {
- $diaspora_guid = unamp($link['@attributes']['href']);
- $diaspora = true;
- }
- if($link['@attributes']['rel'] === 'diaspora-public-key') {
- $diaspora_key = base64_decode(unamp($link['@attributes']['href']));
- if(strstr($diaspora_key,'RSA '))
- $pubkey = rsatopem($diaspora_key);
- else
- $pubkey = $diaspora_key;
- $diaspora = true;
- }
- if($link['@attributes']['rel'] == 'magic-public-key') {
- if(substr($link['@attributes']['href'],0,5) === 'data:') {
- $salmon_key = convert_salmon_key($link['@attributes']['href']);
- }
- }
- if($link['@attributes']['rel'] == 'salmon') {
- $has_salmon = true;
- $salmon = $link['@attributes']['href'];
- }
-
- if($link['@attributes']['rel'] == 'http://schemas.google.com/g/2010#updates-from') {
- $atom_feed = $link['@attributes']['href'];
- }
- if($link['@attributes']['rel'] === 'alias') {
- $aliases[] = $link['@attributes']['href'];
- }
- if($link['@attributes']['rel'] === 'subject') {
- $subject = $link['@attributes']['href'];
- }
- }
- }
- }
-
- if($subject || $aliases) {
- if(strpos($webbie,'@')) {
- $rhs = substr($webbie,strpos($webbie,'@')+1);
- }
- else {
- $m = parse_url($webbie);
- if($m) {
- $rhs = $m['host'] . (($m['port']) ? ':' . $m['port'] : '');
- }
- }
-
- $v = array('subject' => $subject,'aliases' => $aliases);
- $address = find_webfinger_address($v,$rhs);
- $location = find_webfinger_location($v,$rhs);
- if($address)
- $nickname = substr($address,0,strpos($address,'@'));
- }
-
- if($salmon_key && $has_salmon && $atom_feed && (! $dfrn) && (! $diaspora)) {
- $gnusoc = true;
- $probe_atom = true;
- }
-
- if(! $pubkey)
- $pubkey = $salmon_key;
-
- if(($dfrn || $diaspora) && $hcard)
- $probe_hcard = true;
-
- if(! $fullname)
- $fullname = $nickname;
-
- if($probe_atom) {
- $k = z_fetch_url($atom_feed);
- if($k['success'])
- $feed_meta = feed_meta($k['body']);
- if($feed_meta) {
-
- // stash any discovered pubsubhubbub hubs in case we need to follow them
- // this will save an expensive lookup later
-
- if($feed_meta['hubs'] && $address) {
- set_xconfig($address,'system','push_hubs',$feed_meta['hubs']);
- set_xconfig($address,'system','feed_url',$atom_feed);
- }
- if($feed_meta['author']['author_name']) {
- $fullname = $feed_meta['author']['author_name'];
- }
- if(! $avatar) {
- if($feed_meta['author']['author_photo'])
- $avatar = $feed_meta['author']['author_photo'];
- }
-
- // for GNU-social over-ride any url aliases we may have picked up in webfinger
- // The author.uri element in the feed is likely to be more accurate
-
- if($gnusoc && $feed_meta['author']['author_uri'])
- $location = $feed_meta['author']['author_uri'];
- }
- }
- else {
- if($probe_hcard) {
- $vcard = scrape_vcard($hcard);
- if($vcard) {
- logger('vcard: ' . print_r($vcard,true), LOGGER_DATA);
- if($vcard['fn'])
- $fullname = $vcard['fn'];
- if($vcard['photo'] && (strpos($vcard['photo'],'http') !== 0))
- $vcard['photo'] = $diaspora_base . '/' . $vcard['photo'];
- if(($vcard['public_key']) && (! $pubkey)) {
- $diaspora_key = $vcard['public_key'];
- if(strstr($diaspora_key,'RSA '))
- $pubkey = rsatopem($diaspora_key);
- else
- $pubkey = $diaspora_key;
- }
- if(! $avatar)
- $avatar = $vcard['photo'];
- if($diaspora) {
- if(($vcard['uid']) && (! $diaspora_guid))
- $diaspora_guid = $vcard['uid'];
- if(($vcard['url']) && (! $diaspora_base))
- $diaspora_base = $vcard['url'];
- }
- }
- }
- }
-
- if(($profile) && (! $location))
- $location = $profile;
-
- if($location) {
- $m = parse_url($location);
- $base = $m['scheme'] . '://' . $m['host'];
- $host = $m['host'];
- }
-
- if($diaspora && $diaspora_base && $diaspora_guid) {
- if($dfrn)
- $network = 'friendica-over-diaspora';
- else
- $network = 'diaspora';
-
- $base = trim($diaspora_base, '/');
- $notify = $base . '/receive';
- }
- else {
- if($gnusoc) {
- $network = 'gnusoc';
- $notify = $salmon;
- }
- }
-
- logger('network: ' . $network);
- logger('address: ' . $address);
- logger('fullname: ' . $fullname);
- logger('pubkey: ' . $pubkey);
- logger('location: ' . $location);
-
- // if we have everything we need, let's create the records
-
- if($network && $address && $fullname && $pubkey && $location) {
- $r = q("select * from xchan where xchan_hash = '%s' limit 1",
- dbesc($address)
- );
- if($r) {
- $r = q("update xchan set xchan_name = '%s', xchan_network = '%s', xchan_name_date = '%s' where xchan_hash = '%s'",
- dbesc($fullname),
- dbesc($network),
- dbesc(datetime_convert()),
- dbesc($address)
- );
- }
- else {
- $r = xchan_store_lowlevel(
- [
- 'xchan_hash' => $address,
- 'xchan_guid' => (($diaspora_guid) ? $diaspora_guid : $location),
- 'xchan_pubkey' => $pubkey,
- 'xchan_addr' => $address,
- 'xchan_url' => $location,
- 'xchan_name' => $fullname,
- 'xchan_name_date' => datetime_convert(),
- 'xchan_network' => $network
- ]
- );
- }
-
- $r = q("select * from hubloc where hubloc_hash = '%s' limit 1",
- dbesc($address)
- );
-
- if(! $r) {
- $r = hubloc_store_lowlevel(
- [
- 'hubloc_guid' => (($diaspora_guid) ? $diaspora_guid : $location),
- 'hubloc_hash' => $address,
- 'hubloc_addr' => $address,
- 'hubloc_network' => $network,
- 'hubloc_url' => $base,
- 'hubloc_host' => $host,
- 'hubloc_callback' => $notify,
- 'hubloc_updated' => datetime_convert(),
- 'hubloc_primary' => 1
- ]
- );
- }
- $photos = import_xchan_photo($avatar,$address);
- $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'",
- dbescdate(datetime_convert()),
- dbesc($photos[0]),
- dbesc($photos[1]),
- dbesc($photos[2]),
- dbesc($photos[3]),
- dbesc($address)
- );
- return true;
- }
return false;
-}
-
+}
function webfinger_rfc7033($webbie,$zot = false) {
@@ -1557,105 +1207,22 @@ function webfinger_rfc7033($webbie,$zot = false) {
// and results in a 406 (Not Acceptable) response, and will also incorrectly produce an XML
// document if you use 'application/jrd+json, */*'. We could set this to application/jrd+json,
// but some test webfinger servers may not explicitly set the content type and they would be
- // blocked. The best compromise until Mastodon is fixed is to remove the Accept header which is
- // accomplished by setting it to nothing.
+ // blocked. The best compromise until Mastodon is fixed is to remove the Accept header which is
+ // accomplished by setting it to nothing.
$counter = 0;
- $s = z_fetch_url('https://' . $rhs . '/.well-known/webfinger?f=&resource=' . $resource . (($zot) ? '&zot=1' : ''),
+ $s = z_fetch_url('https://' . $rhs . '/.well-known/webfinger?f=&resource=' . $resource . (($zot) ? '&zot=1' : ''),
false, $counter, [ 'headers' => [ 'Accept:' ] ]);
if($s['success']) {
$j = json_decode($s['body'],true);
-
- // We could have a number of URL aliases and webbies
- // make an executive decision about the most likely "best" of each
- // by comparing against some examples from known networks we're likely to encounter.
- // Otherwise we have to store every alias that we may ever encounter and
- // validate every URL we ever find against every possible alias
-
- /**
- * @FIXME pump.io is going to be a real bugger since it doesn't return
- * subject or aliases or provide lookup by url
- */
-
- $j['address'] = find_webfinger_address($j,$rhs);
- $j['location'] = find_webfinger_location($j,$rhs);
- if($j['address'])
- $j['nickname'] = substr($j['address'],0,strpos($j['address'],'@'));
- }
- else
- return false;
-
- return($j);
-}
-
-function find_webfinger_address($j,$rhs) {
- if(is_array($j) && ($j)) {
- if(strpos($j['subject'],'acct:') !== false && strpos($j['subject'],'@' . $rhs))
- return str_replace('acct:','',$j['subject']);
- if($j['aliases']) {
- foreach($j['aliases'] as $alias) {
- if(strpos($alias,'acct:') !== false && strpos($alias,'@' . $rhs)) {
- return str_replace('acct:','',$alias);
- }
- }
- }
+ return($j);
}
- return '';
-}
-
-function find_webfinger_location($j,$rhs) {
- if(is_array($j) && ($j)) {
- if(strpos($j['subject'],'http') === 0) {
- $x = match_webfinger_location($j['subject'],$rhs);
- if($x)
- return $x;
- }
- if($j['aliases']) {
- foreach($j['aliases'] as $alias) {
- if(strpos($alias,'http') === 0) {
- $x = match_webfinger_location($alias,$rhs);
- if($x)
- return($x);
- }
- }
- }
- }
- return '';
-}
-
-/**
- * @brief Match the webfinger location for the different networks.
- *
- * @param string $s The string to search in
- * @param string $h The host
- * @return string
- */
-function match_webfinger_location($s, $h) {
-
- // GNU-social and the older StatusNet - the $host/user/123 form doesn't work
- if(preg_match('|' . $h . '/index.php/user/([0-9]*?)$|', $s))
- return $s;
- // Redmatrix / hubzilla
- if(preg_match('|' . $h . '/channel/|', $s))
- return $s;
- // Friendica
- if(preg_match('|' . $h . '/profile/|', $s))
- return $s;
-
- $arr = array('test' => $s, 'host' => $h, 'success' => false);
- call_hooks('match_webfinger_location', $arr);
- if($arr['success'])
- return $s;
+ return false;
- return '';
}
-
-
-
-
function old_webfinger($webbie) {
$host = '';
@@ -1723,9 +1290,6 @@ function fetch_xrd_links($url) {
if ((! $xml) || (! stristr($xml,'<xrd')))
return array();
- // fix diaspora's bad xml
- $xml = str_replace(array('href=&quot;','&quot;/>'),array('href="','"/>'),$xml);
-
$h = parse_xml_string($xml);
if(! $h)
return array();
@@ -1765,89 +1329,13 @@ function fetch_xrd_links($url) {
}
-function scrape_vcard($url) {
-
- $ret = array();
-
- logger('url=' . $url);
-
- $x = z_fetch_url($url);
- if(! $x['success'])
- return $ret;
-
- $s = $x['body'];
-
- if(! $s)
- return $ret;
-
- $headers = $x['header'];
- $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('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('id'),'pod_location'))
- $ret['pod_location'] = $x->textContent;
- if(attribute_contains($x->getAttribute('class'),'fn'))
- $ret['fn'] = $x->textContent;
- if(attribute_contains($x->getAttribute('class'),'uid'))
- $ret['uid'] = $x->textContent;
- if(attribute_contains($x->getAttribute('class'),'nickname'))
- $ret['nick'] = $x->textContent;
- if(attribute_contains($x->getAttribute('class'),'searchable'))
- $ret['searchable'] = $x->textContent;
- if(attribute_contains($x->getAttribute('class'),'key'))
- $ret['public_key'] = $x->textContent;
- if(attribute_contains($x->getAttribute('class'),'given_name'))
- $ret['given_name'] = $x->textContent;
- if(attribute_contains($x->getAttribute('class'),'family_name'))
- $ret['family_name'] = $x->textContent;
- if(attribute_contains($x->getAttribute('class'),'url'))
- $ret['url'] = $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;
- }
- }
- }
- }
- }
-
- return $ret;
-}
-
/**
* @brief
*
* @param string $url The URL to scrape
* @return array
*/
+
function scrape_feed($url) {
require_once('library/HTML5/Parser.php');
@@ -1941,112 +1429,6 @@ function scrape_feed($url) {
-function service_plink($contact, $guid) {
-
- $plink = '';
-
- $m = parse_url($contact['xchan_url']);
- if($m) {
- $url = $m['scheme'] . '://' . $m['host'] . (($m['port']) ? ':' . $m['port'] : '');
- }
- else
- $url = 'https://' . substr($contact['xchan_addr'],strpos($contact['xchan_addr'],'@')+1);
-
- $handle = substr($contact['xchan_addr'], 0, strpos($contact['xchan_addr'],'@'));
-
- if($contact['xchan_network'] === 'diaspora')
- $plink = $url . '/posts/' . $guid;
- if($contact['xchan_network'] === 'friendica-over-diaspora')
- $plink = $url . '/display/' . $handle . '/' . $guid;
- if($contact['xchan_network'] === 'zot')
- $plink = $url . '/channel/' . $handle . '?f=&mid=' . $guid;
-
- return $plink;
-}
-
-
-function format_and_send_email($sender,$xchan,$item) {
-
- $title = $item['title'];
- $body = $item['body'];
-
- $textversion = strip_tags(html_entity_decode(bbcode(str_replace(array("\\r", "\\n"), array( "", "\n"), $body)),ENT_QUOTES,'UTF-8'));
-
- $htmlversion = bbcode(str_replace(array("\\r","\\n"), array("","<br />\n"),$body));
-
- $banner = t('$Projectname Notification');
- $product = t('$projectname'); // PLATFORM_NAME;
- $siteurl = z_root();
- $thanks = t('Thank You,');
- $sitename = get_config('system', 'sitename');
- $site_admin = sprintf( t('%s Administrator'), $sitename);
-
- // load the template for private message notifications
- $tpl = get_markup_template('email_notify_html.tpl');
- $email_html_body = replace_macros($tpl, array(
- '$banner' => $banner,
- '$notify_icon' => Zotlabs\Lib\System::get_notify_icon(),
- '$product' => $product,
- '$preamble' => '',
- '$sitename' => $sitename,
- '$siteurl' => $siteurl,
- '$source_name' => $sender['xchan_name'],
- '$source_link' => $sender['xchan_url'],
- '$source_photo' => $sender['xchan_photo_m'],
- '$username' => $xchan['xchan_name'],
- '$hsitelink' => $datarray['hsitelink'], /// @FIXME $datarray is undefined
- '$hitemlink' => $datarray['hitemlink'], /// @FIXME $datarray is undefined
- '$thanks' => $thanks,
- '$site_admin' => $site_admin,
- '$title' => $title,
- '$htmlversion' => $htmlversion,
- ));
-
- // load the template for private message notifications
- $tpl = get_markup_template('email_notify_text.tpl');
- $email_text_body = replace_macros($tpl, array(
- '$banner' => $banner,
- '$product' => $product,
- '$preamble' => '',
- '$sitename' => $sitename,
- '$siteurl' => $siteurl,
- '$source_name' => $sender['xchan_name'],
- '$source_link' => $sender['xchan_url'],
- '$source_photo' => $sender['xchan_photo_m'],
- '$username' => $xchan['xchan_name'],
- '$hsitelink' => $datarray['hsitelink'],
- '$hitemlink' => $datarray['hitemlink'],
- '$thanks' => $thanks,
- '$site_admin' => $site_admin,
- '$title' => $title,
- '$textversion' => $textversion
- ));
-
- $sender_name = t('Administrator');
-
- $hostname = App::get_hostname();
- if(strpos($hostname, ':'))
- $hostname = substr($hostname,0,strpos($hostname,':'));
-
- $sender_email = get_config('system', 'reply_address');
- if(! $sender_email)
- $sender_email = 'noreply' . '@' . $hostname;
-
- // use the EmailNotification library to send the message
-
- Zotlabs\Lib\Enotify::send(array(
- 'fromName' => $product,
- 'fromEmail' => $sender_email,
- 'replyTo' => $sender_email,
- 'toEmail' => str_replace('mailto:','',$xchan['xchan_addr']),
- 'messageSubject' => (($title) ? $title : t('No Subject')),
- 'htmlVersion' => $email_html_body,
- 'textVersion' => $email_text_body,
- 'additionalMailHeader' => '',
- ));
-}
-
-
function do_delivery($deliveries) {
if(! (is_array($deliveries) && count($deliveries)))
@@ -2160,33 +1542,33 @@ function get_site_info() {
}
- $data = Array(
- 'version' => $version,
- 'version_tag' => $tag,
- 'server_role' => Zotlabs\Lib\System::get_server_role(),
- 'commit' => $commit,
- 'url' => z_root(),
- 'plugins' => $visible_plugins,
- 'register_policy' => $register_policy[get_config('system','register_policy')],
- 'invitation_only' => intval(get_config('system','invitation_only')),
- 'directory_mode' => $directory_mode[get_config('system','directory_mode')],
- 'language' => get_config('system','language'),
- 'rss_connections' => intval(get_config('system','feed_contacts')),
- 'expiration' => $site_expire,
+ $data = [
+ 'url' => z_root(),
+ 'platform' => Zotlabs\Lib\System::get_platform_name(),
+ 'site_name' => (($site_name) ? $site_name : ''),
+ 'version' => $version,
+ 'version_tag' => $tag,
+ 'server_role' => Zotlabs\Lib\System::get_server_role(),
+ 'commit' => $commit,
+ 'plugins' => $visible_plugins,
+ 'register_policy' => $register_policy[get_config('system','register_policy')],
+ 'invitation_only' => intval(get_config('system','invitation_only')),
+ 'directory_mode' => $directory_mode[get_config('system','directory_mode')],
+ 'language' => get_config('system','language'),
+ 'rss_connections' => intval(get_config('system','feed_contacts')),
+ 'expiration' => $site_expire,
'default_service_restrictions' => $service_class,
- 'locked_features' => $locked_features,
- 'admin' => $admin,
- 'site_name' => (($site_name) ? $site_name : ''),
- 'platform' => Zotlabs\Lib\System::get_platform_name(),
- 'dbdriver' => DBA::$dba->getdriver(),
- 'lastpoll' => get_config('system','lastpoll'),
- 'info' => (($site_info) ? $site_info : ''),
- 'channels_total' => $channels_total_stat,
- 'channels_active_halfyear' => $channels_active_halfyear_stat,
- 'channels_active_monthly' => $channels_active_monthly_stat,
- 'local_posts' => $local_posts_stat,
- 'hide_in_statistics' => $hide_in_statistics
- );
+ 'locked_features' => $locked_features,
+ 'admin' => $admin,
+ 'dbdriver' => DBA::$dba->getdriver(),
+ 'lastpoll' => get_config('system','lastpoll'),
+ 'info' => (($site_info) ? $site_info : ''),
+ 'channels_total' => $channels_total_stat,
+ 'channels_active_halfyear' => $channels_active_halfyear_stat,
+ 'channels_active_monthly' => $channels_active_monthly_stat,
+ 'local_posts' => $local_posts_stat,
+ 'hide_in_statistics' => $hide_in_statistics
+ ];
return $data;
}
@@ -2412,3 +1794,144 @@ function probe_api_path($host) {
return '';
}
+
+
+function scrape_vcard($url) {
+
+ require_once('library/HTML5/Parser.php');
+
+ $ret = array();
+
+ logger('url=' . $url);
+
+ $x = z_fetch_url($url);
+ if(! $x['success'])
+ return $ret;
+
+ $s = $x['body'];
+
+ if(! $s)
+ return $ret;
+
+ $headers = $x['header'];
+ $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('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('id'),'pod_location'))
+ $ret['pod_location'] = $x->textContent;
+ if(attribute_contains($x->getAttribute('class'),'fn'))
+ $ret['fn'] = $x->textContent;
+ if(attribute_contains($x->getAttribute('class'),'uid'))
+ $ret['uid'] = $x->textContent;
+ if(attribute_contains($x->getAttribute('class'),'nickname'))
+ $ret['nick'] = $x->textContent;
+ if(attribute_contains($x->getAttribute('class'),'searchable'))
+ $ret['searchable'] = $x->textContent;
+ if(attribute_contains($x->getAttribute('class'),'key'))
+ $ret['public_key'] = $x->textContent;
+ if(attribute_contains($x->getAttribute('class'),'given_name'))
+ $ret['given_name'] = $x->textContent;
+ if(attribute_contains($x->getAttribute('class'),'family_name'))
+ $ret['family_name'] = $x->textContent;
+ if(attribute_contains($x->getAttribute('class'),'url'))
+ $ret['url'] = $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;
+ }
+ }
+ }
+ }
+ }
+
+ return $ret;
+}
+
+function service_plink($contact, $guid) {
+
+ $plink = '';
+
+ $m = parse_url($contact['xchan_url']);
+ if($m) {
+ $url = $m['scheme'] . '://' . $m['host'] . (($m['port']) ? ':' . $m['port'] : '');
+ }
+ else {
+ $url = 'https://' . substr($contact['xchan_addr'],strpos($contact['xchan_addr'],'@')+1);
+ }
+
+ $handle = substr($contact['xchan_addr'], 0, strpos($contact['xchan_addr'],'@'));
+
+ $plink = $url . '/channel/' . $handle . '?f=&mid=' . $guid;
+
+ $x = [ 'xchan' => $contact, 'guid' => $guid, 'url' => $url, 'plink' => $plink ];
+ call_hooks('service_plink', $x);
+
+ return $x['plink'];
+}
+
+function getBestSupportedMimeType($mimeTypes = null, $acceptedTypes = false) {
+ // Values will be stored in this array
+
+ if($acceptedTypes === false)
+ $acceptedTypes = $_SERVER['HTTP_ACCEPT'];
+
+ $AcceptTypes = Array ();
+
+ // Accept header is case insensitive, and whitespace isn’t important
+ $accept = strtolower(str_replace(' ', '', $acceptedTypes));
+ // divide it into parts in the place of a ","
+ $accept = explode(',', $accept);
+ foreach ($accept as $a) {
+ // the default quality is 1.
+ $q = 1;
+ // check if there is a different quality
+ if (strpos($a, ';q=')) {
+ // divide "mime/type;q=X" into two parts: "mime/type" i "X"
+ list($a, $q) = explode(';q=', $a);
+ }
+ // mime-type $a is accepted with the quality $q
+ // WARNING: $q == 0 means, that mime-type isn’t supported!
+ $AcceptTypes[$a] = $q;
+ }
+ arsort($AcceptTypes);
+
+ // if no parameter was passed, just return parsed data
+ if (!$mimeTypes) return $AcceptTypes;
+
+ $mimeTypes = array_map('strtolower', (array)$mimeTypes);
+
+ // let’s check our supported types:
+ foreach ($AcceptTypes as $mime => $q) {
+ if ($q && in_array($mime, $mimeTypes)) return $mime;
+ }
+ // no mime-type found
+ return null;
+} \ No newline at end of file
diff --git a/include/oauth2.php b/include/oauth2.php
new file mode 100644
index 000000000..3a71a651d
--- /dev/null
+++ b/include/oauth2.php
@@ -0,0 +1,23 @@
+<?php
+
+/*
+ $storage = new OAuth2\Storage\Pdo(\DBA::$dba->db);
+ $config = [
+ 'use_openid_connect' => true,
+ 'issuer' => \Zotlabs\Lib\System::get_site_name()
+ ];
+
+ $oauth2_server = new OAuth2\Server($storage,$config);
+
+ $oauth2_server->addGrantType(new OAuth2\GrantType\ClientCredentials($storage));
+ $oauth2_server->addGrantType(new OAuth2\GrantType\AuthorizationCode($storage));
+
+ $keyStorage = new OAuth2\Storage\Memory( [
+ 'keys' => [
+ 'public_key' => get_config('system','pubkey'),
+ 'private_key' => get_config('system','prvkey')
+ ]
+ ]);
+
+ $oauth2_server->addStorage($keyStorage,'public_key');
+*/ \ No newline at end of file
diff --git a/include/oembed.php b/include/oembed.php
index 5865c95d5..460e0244e 100755
--- a/include/oembed.php
+++ b/include/oembed.php
@@ -134,7 +134,9 @@ function oembed_fetch_url($embedurl){
$txt = null;
// we should try to cache this and avoid a lookup on each render
- $zrl = is_matrix_url($embedurl);
+ $is_matrix = is_matrix_url($embedurl);
+
+ $zrl = ((get_config('system','oembed_zrl')) ? $is_matrix : false);
$furl = ((local_channel() && $zrl) ? zid($embedurl) : $embedurl);
@@ -222,7 +224,7 @@ function oembed_fetch_url($embedurl){
if($action === 'filter') {
if($j['html']) {
$orig = $j['html'];
- $allow_position = (($zrl) ? true : false);
+ $allow_position = (($is_matrix) ? true : false);
$j['html'] = purify_html($j['html'],$allow_position);
if($j['html'] != $orig) {
logger('oembed html was purified. original: ' . $orig . ' purified: ' . $j['html'], LOGGER_DEBUG, LOG_INFO);
diff --git a/include/page_widgets.php b/include/page_widgets.php
deleted file mode 100644
index 3270de4a3..000000000
--- a/include/page_widgets.php
+++ /dev/null
@@ -1,52 +0,0 @@
-<?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, $which is channel_address - we'll need to pass observer later too.
-
-function pagelist_widget ($owner,$which) {
-
- $r = q("select * from iconfig left join item on iconfig.iid = item.id where item_id.uid = %d
- and iconfig.cat = 'system' and iconfig.k = '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'],'pagetitle' => $rr['v'],'title' => $rr['title'],'created' => datetime_convert('UTC',date_default_timezone_get(),$rr['created']),'edited' => datetime_convert('UTC',date_default_timezone_get(),$rr['edited']));
- }
- }
-
- //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'),
- '$actions_txt' => t('Actions'),
- '$pagelink_txt' => t('Page Link'),
- '$title_txt' => t('Title'),
- '$created_txt' => t('Created'),
- '$edited_txt' => t('Edited')
-
- ));
-
-}
diff --git a/include/permissions.php b/include/permissions.php
index f719394c5..f97142fab 100644
--- a/include/permissions.php
+++ b/include/permissions.php
@@ -7,61 +7,11 @@ require_once('include/security.php');
*
* This file conntains functions to check and work with permissions.
*
- * Most of this file is obsolete and has been superceded by extensible permissions in v1.12; it is left here
- * for reference and because we haven't yet checked that all functions have been replaced and are available
- * elsewhere (typically Zotlabs/Access/*).
*/
/**
- * @brief Return an array with all available permissions.
- *
- * These are channel specific permissions.
- * The list of available permissions can get manipulated by the <i>hook</i>
- * <b>global_permissions</b>.
- *
- * @return array associative array containing all permissions
- */
-function get_perms() {
-
-// thinking about making element[2] a bitmask instead of boolean so that we can provide a list of applicable selections
-// for any given permission. Currently we use the boolean to disallow write access to "everybody", but we also want to be
-// able to handle troublesome settings such as allowing channel_w_stream to anybody in the network. You can allow it, but
-// there's no way to implement sending it.
-
- $global_perms = array(
- // Read only permissions
- 'view_stream' => array('channel_r_stream', intval(PERMS_R_STREAM), true, t('Can view my normal stream and posts'), ''),
- 'view_profile' => array('channel_r_profile', intval(PERMS_R_PROFILE), true, t('Can view my default channel profile'), ''),
- 'view_contacts' => array('channel_r_abook', intval(PERMS_R_ABOOK), true, t('Can view my connections'), ''),
- 'view_storage' => array('channel_r_storage', intval(PERMS_R_STORAGE), true, t('Can view my file storage and photos'), ''),
- 'view_pages' => array('channel_r_pages', intval(PERMS_R_PAGES), true, t('Can view my webpages'), ''),
-
- // Write permissions
- 'send_stream' => array('channel_w_stream', intval(PERMS_W_STREAM), false, t('Can send me their channel stream and posts'), ''),
- 'post_wall' => array('channel_w_wall', intval(PERMS_W_WALL), false, t('Can post on my channel page ("wall")'), ''),
- 'post_comments' => array('channel_w_comment', intval(PERMS_W_COMMENT), false, t('Can comment on or like my posts'), ''),
- 'post_mail' => array('channel_w_mail', intval(PERMS_W_MAIL), false, t('Can send me private mail messages'), ''),
- 'post_like' => array('channel_w_like', intval(PERMS_W_LIKE), false, t('Can like/dislike stuff'), t('Profiles and things other than posts/comments')),
-
- '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('')),
- 'write_storage' => array('channel_w_storage', intval(PERMS_W_STORAGE), false, t('Can write to my file storage and photos'), ''),
- 'write_pages' => array('channel_w_pages', intval(PERMS_W_PAGES), false, t('Can edit my webpages'), ''),
-
- '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);
- call_hooks('global_permissions', $ret);
-
- return $ret['global_permissions'];
-}
-
-
-/**
* get_all_perms($uid,$observer_xchan)
*
* @param int $uid The channel_id associated with the resource owner
@@ -297,7 +247,6 @@ function get_all_perms($uid, $observer_xchan, $internal_use = true) {
*
* Checks if the given observer with the hash $observer_xchan has permission
* $permission on channel_id $uid.
- * $permission is one defined in get_perms();
*
* @param int $uid The channel_id associated with the resource owner
* @param string $observer_xchan The xchan_hash representing the observer
@@ -465,7 +414,7 @@ function perm_is_allowed($uid, $observer_xchan, $permission) {
function get_all_api_perms($uid,$api) {
- $global_perms = get_perms();
+ $global_perms = \Zotlabs\Access\Permissions::Perms();
$ret = array();
@@ -568,6 +517,7 @@ function site_default_perms() {
'view_contacts' => PERMS_PUBLIC,
'view_storage' => PERMS_PUBLIC,
'view_pages' => PERMS_PUBLIC,
+ 'view_wiki' => PERMS_PUBLIC,
'send_stream' => PERMS_SPECIFIC,
'post_wall' => PERMS_SPECIFIC,
'post_comments' => PERMS_SPECIFIC,
@@ -576,16 +526,15 @@ function site_default_perms() {
'chat' => PERMS_SPECIFIC,
'write_storage' => PERMS_SPECIFIC,
'write_pages' => PERMS_SPECIFIC,
+ 'write_wiki' => PERMS_SPECIFIC,
'delegate' => PERMS_SPECIFIC,
'post_like' => PERMS_NETWORK
);
- $global_perms = get_perms();
+ $global_perms = \Zotlabs\Access\Permissions::Perms();
foreach($global_perms as $perm => $v) {
- $x = get_config('default_perms', $perm);
- if($x === false)
- $x = $typical[$perm];
+ $x = get_config('default_perms', $perm, $typical[$perm]);
$ret[$perm] = $x;
}
@@ -593,362 +542,3 @@ function site_default_perms() {
}
-/**
- * @brief Return an array of all permissions for this role.
- *
- * Given a string for the channel role ('social','forum', etc)
- * return an array of all permission fields pre-filled for this role.
- * This includes the channel permission scope indicators (anything beginning with 'channel_') as well as
- * * perms_auto: true or false to create auto-permissions for this channel
- * * perms_follow: The permissions to apply when initiating a connection request to another channel
- * * perms_accept: The permissions to apply when accepting a connection request from another channel (not automatic)
- * * default_collection: true or false to make the default ACL include the channel's default collection
- * * directory_publish: true or false to publish this channel in the directory
- * Any attributes may be extended (new roles defined) and modified (specific permissions altered) by plugins
- *
- * @param string $role
- * @return array
- */
-function get_role_perms($role) {
-
- $ret = array();
-
- $ret['role'] = $role;
-
- switch($role) {
- case 'social':
- $ret['perms_auto'] = false;
- $ret['default_collection'] = false;
- $ret['directory_publish'] = true;
- $ret['online'] = true;
- $ret['perms_connect'] = [
- 'view_stream', 'view_profile', 'view_contacts', 'view_storage',
- 'view_pages', 'send_stream', 'post_wall', 'post_comments',
- 'post_mail', 'chat', 'post_like', 'republish' ];
- $ret['limits'] = [
- 'view_stream' => PERMS_PUBLIC,
- 'view_profile' => 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_like' => PERMS_SPECIFIC,
- 'tag_deliver' => PERMS_SPECIFIC,
- 'chat' => PERMS_SPECIFIC,
- 'write_storage' => PERMS_SPECIFIC,
- 'write_pages' => PERMS_SPECIFIC,
- 'republish' => PERMS_SPECIFIC,
- 'delegate' => PERMS_SPECIFIC
- ];
-
- break;
-
- case 'social_restricted':
- $ret['perms_auto'] = false;
- $ret['default_collection'] = true;
- $ret['directory_publish'] = true;
- $ret['online'] = true;
- $ret['perms_connect'] = [
- 'view_stream', 'view_profile', 'view_contacts', 'view_storage',
- 'view_pages', 'send_stream', 'post_wall', 'post_comments',
- 'post_mail', 'chat', 'post_like' ];
- $ret['limits'] = [
- 'view_stream' => PERMS_PUBLIC,
- 'view_profile' => 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_like' => PERMS_SPECIFIC,
- 'tag_deliver' => PERMS_SPECIFIC,
- 'chat' => PERMS_SPECIFIC,
- 'write_storage' => PERMS_SPECIFIC,
- 'write_pages' => PERMS_SPECIFIC,
- 'republish' => PERMS_SPECIFIC,
- 'delegate' => PERMS_SPECIFIC
- ];
-
-
- break;
-
- case 'social_private':
- $ret['perms_auto'] = false;
- $ret['default_collection'] = true;
- $ret['directory_publish'] = false;
- $ret['online'] = false;
- $ret['perms_connect'] = [
- 'view_stream', 'view_profile', 'view_contacts', 'view_storage',
- 'view_pages', 'send_stream', 'post_wall', 'post_comments',
- 'post_mail', 'post_like' ];
- $ret['limits'] = [
- 'view_stream' => PERMS_PUBLIC,
- 'view_profile' => PERMS_PUBLIC,
- 'view_contacts' => PERMS_SPECIFIC,
- 'view_storage' => PERMS_SPECIFIC,
- 'view_pages' => PERMS_PUBLIC,
- 'send_stream' => PERMS_SPECIFIC,
- 'post_wall' => PERMS_SPECIFIC,
- 'post_comments' => PERMS_SPECIFIC,
- 'post_mail' => PERMS_SPECIFIC,
- 'post_like' => PERMS_SPECIFIC,
- 'tag_deliver' => PERMS_SPECIFIC,
- 'chat' => PERMS_SPECIFIC,
- 'write_storage' => PERMS_SPECIFIC,
- 'write_pages' => PERMS_SPECIFIC,
- 'republish' => PERMS_SPECIFIC,
- 'delegate' => PERMS_SPECIFIC
- ];
-
- break;
-
- case 'forum':
- $ret['perms_auto'] = true;
- $ret['default_collection'] = false;
- $ret['directory_publish'] = true;
- $ret['online'] = false;
- $ret['perms_connect'] = [
- 'view_stream', 'view_profile', 'view_contacts', 'view_storage',
- 'view_pages', 'post_wall', 'post_comments', 'tag_deliver',
- 'post_mail', 'post_like' , 'republish', 'chat' ];
- $ret['limits'] = [
- 'view_stream' => PERMS_PUBLIC,
- 'view_profile' => 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_like' => PERMS_SPECIFIC,
- 'tag_deliver' => PERMS_SPECIFIC,
- 'chat' => PERMS_SPECIFIC,
- 'write_storage' => PERMS_SPECIFIC,
- 'write_pages' => PERMS_SPECIFIC,
- 'republish' => PERMS_SPECIFIC,
- 'delegate' => PERMS_SPECIFIC
- ];
-
- break;
-
- case 'forum_restricted':
- $ret['perms_auto'] = false;
- $ret['default_collection'] = true;
- $ret['directory_publish'] = true;
- $ret['online'] = false;
- $ret['perms_connect'] = [
- 'view_stream', 'view_profile', 'view_contacts', 'view_storage',
- 'view_pages', 'post_wall', 'post_comments', 'tag_deliver',
- 'post_mail', 'post_like' , 'chat' ];
- $ret['limits'] = [
- 'view_stream' => PERMS_PUBLIC,
- 'view_profile' => 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_like' => PERMS_SPECIFIC,
- 'tag_deliver' => PERMS_SPECIFIC,
- 'chat' => PERMS_SPECIFIC,
- 'write_storage' => PERMS_SPECIFIC,
- 'write_pages' => PERMS_SPECIFIC,
- 'republish' => PERMS_SPECIFIC,
- 'delegate' => PERMS_SPECIFIC
- ];
-
- break;
-
- case 'forum_private':
- $ret['perms_auto'] = false;
- $ret['default_collection'] = true;
- $ret['directory_publish'] = false;
- $ret['online'] = false;
-
- $ret['perms_connect'] = [
- 'view_stream', 'view_profile', 'view_contacts', 'view_storage',
- 'view_pages', 'post_wall', 'post_comments',
- 'post_mail', 'post_like' , 'chat' ];
- $ret['limits'] = [
- 'view_stream' => PERMS_PUBLIC,
- 'view_profile' => PERMS_SPECIFIC,
- 'view_contacts' => PERMS_SPECIFIC,
- 'view_storage' => PERMS_SPECIFIC,
- 'view_pages' => PERMS_SPECIFIC,
- 'send_stream' => PERMS_SPECIFIC,
- 'post_wall' => PERMS_SPECIFIC,
- 'post_comments' => PERMS_SPECIFIC,
- 'post_mail' => PERMS_SPECIFIC,
- 'post_like' => PERMS_SPECIFIC,
- 'tag_deliver' => PERMS_SPECIFIC,
- 'chat' => PERMS_SPECIFIC,
- 'write_storage' => PERMS_SPECIFIC,
- 'write_pages' => PERMS_SPECIFIC,
- 'republish' => PERMS_SPECIFIC,
- 'delegate' => PERMS_SPECIFIC
- ];
-
- break;
-
- case 'feed':
- $ret['perms_auto'] = true;
- $ret['default_collection'] = false;
- $ret['directory_publish'] = true;
- $ret['online'] = false;
-
- $ret['perms_connect'] = [
- 'view_stream', 'view_profile', 'view_contacts', 'view_storage',
- 'view_pages', 'send_stream', 'post_wall', 'post_comments',
- 'post_mail', 'post_like' , 'republish' ];
- $ret['limits'] = [
- 'view_stream' => PERMS_PUBLIC,
- 'view_profile' => 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_like' => PERMS_SPECIFIC,
- 'tag_deliver' => PERMS_SPECIFIC,
- 'chat' => PERMS_SPECIFIC,
- 'write_storage' => PERMS_SPECIFIC,
- 'write_pages' => PERMS_SPECIFIC,
- 'republish' => PERMS_SPECIFIC,
- 'delegate' => PERMS_SPECIFIC
- ];
-
- break;
-
- case 'feed_restricted':
- $ret['perms_auto'] = false;
- $ret['default_collection'] = true;
- $ret['directory_publish'] = false;
- $ret['online'] = false;
- $ret['perms_connect'] = [
- 'view_stream', 'view_profile', 'view_contacts', 'view_storage',
- 'view_pages', 'send_stream', 'post_wall', 'post_comments',
- 'post_mail', 'post_like' , 'republish' ];
- $ret['limits'] = [
- 'view_stream' => PERMS_PUBLIC,
- 'view_profile' => 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_like' => PERMS_SPECIFIC,
- 'tag_deliver' => PERMS_SPECIFIC,
- 'chat' => PERMS_SPECIFIC,
- 'write_storage' => PERMS_SPECIFIC,
- 'write_pages' => PERMS_SPECIFIC,
- 'republish' => PERMS_SPECIFIC,
- 'delegate' => PERMS_SPECIFIC
- ];
-
- break;
-
- case 'soapbox':
- $ret['perms_auto'] = true;
- $ret['default_collection'] = false;
- $ret['directory_publish'] = true;
- $ret['online'] = false;
-
- $ret['perms_connect'] = [
- 'view_stream', 'view_profile', 'view_contacts', 'view_storage',
- 'view_pages', 'post_like' , 'republish' ];
-
- $ret['limits'] = [
- 'view_stream' => PERMS_PUBLIC,
- 'view_profile' => 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_like' => PERMS_SPECIFIC,
- 'tag_deliver' => PERMS_SPECIFIC,
- 'chat' => PERMS_SPECIFIC,
- 'write_storage' => PERMS_SPECIFIC,
- 'write_pages' => PERMS_SPECIFIC,
- 'republish' => PERMS_SPECIFIC,
- 'delegate' => PERMS_SPECIFIC
- ];
-
- break;
-
- case 'repository':
- $ret['perms_auto'] = true;
- $ret['default_collection'] = false;
- $ret['directory_publish'] = true;
- $ret['online'] = false;
-
- $ret['perms_connect'] = [
- 'view_stream', 'view_profile', 'view_contacts', 'view_storage',
- 'view_pages', 'write_storage', 'write_pages', 'post_wall', 'post_comments', 'tag_deliver',
- 'post_mail', 'post_like' , 'republish', 'chat' ];
- $ret['limits'] = [
- 'view_stream' => PERMS_PUBLIC,
- 'view_profile' => 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_like' => PERMS_SPECIFIC,
- 'tag_deliver' => PERMS_SPECIFIC,
- 'chat' => PERMS_SPECIFIC,
- 'write_storage' => PERMS_SPECIFIC,
- 'write_pages' => PERMS_SPECIFIC,
- 'republish' => PERMS_SPECIFIC,
- 'delegate' => PERMS_SPECIFIC
- ];
-
-
- break;
-
- default:
- break;
- }
-
- $x = get_config('system','role_perms');
- // let system settings over-ride any or all
- if($x && is_array($x) && array_key_exists($role,$x))
- $ret = array_merge($ret,$x[$role]);
-
- call_hooks('get_role_perms',$ret);
-
- return $ret;
-}
-
-/**
- * @brief Returns a list or roles, grouped by type.
- *
- * @return string Returns an array of roles, grouped by type
- */
-function get_roles() {
- $roles = array(
- t('Social Networking') => array('social' => t('Social - Mostly Public'), 'social_restricted' => t('Social - Restricted'), 'social_private' => t('Social - Private')),
- t('Community Forum') => array('forum' => t('Forum - Mostly Public'), 'forum_restricted' => t('Forum - Restricted'), 'forum_private' => t('Forum - Private')),
- t('Feed Republish') => array('feed' => t('Feed - Mostly Public'), 'feed_restricted' => t('Feed - Restricted')),
- t('Special Purpose') => array('soapbox' => t('Special - Celebrity/Soapbox'), 'repository' => t('Special - Group Repository')),
- t('Other') => array('custom' => t('Custom/Expert Mode'))
- );
-
- return $roles;
-}
diff --git a/include/photo/photo_driver.php b/include/photo/photo_driver.php
index cc1f3b5d0..f47a9c878 100644
--- a/include/photo/photo_driver.php
+++ b/include/photo/photo_driver.php
@@ -252,11 +252,10 @@ abstract class photo_driver {
*/
if(! $this->is_valid())
- return FALSE;
-
+ return false;
if((! function_exists('exif_read_data')) || ($this->getType() !== 'image/jpeg'))
- return;
+ return false;
$exif = @exif_read_data($filename,null,true);
@@ -489,20 +488,32 @@ function guess_image_type($filename, $headers = '') {
$ext = pathinfo($filename, PATHINFO_EXTENSION);
$ph = photo_factory('');
$types = $ph->supportedTypes();
- foreach ($types as $m=>$e){
- if ($ext==$e) $type = $m;
+ foreach($types as $m => $e) {
+ if($ext === $e) {
+ $type = $m;
+ }
}
}
- if(is_null($type)) {
+ if(is_null($type) && (strpos($filename,'http') === false)) {
$size = getimagesize($filename);
$ph = photo_factory('');
$types = $ph->supportedTypes();
$type = ((array_key_exists($size['mime'], $types)) ? $size['mime'] : 'image/jpeg');
}
+ if(is_null($type)) {
+ if(strpos(strtolower($filename),'jpg') !== false)
+ $type = 'image/jpeg';
+ elseif(strpos(strtolower($filename),'jpeg') !== false)
+ $type = 'image/jpeg';
+ elseif(strpos(strtolower($filename),'gif') !== false)
+ $type = 'image/gif';
+ elseif(strpos(strtolower($filename),'png') !== false)
+ $type = 'image/png';
+ }
}
- logger('Photo: guess_image_type: type='.$type, LOGGER_DEBUG);
+ logger('Photo: guess_image_type: type = ' . $type, LOGGER_DEBUG);
return $type;
}
diff --git a/include/photos.php b/include/photos.php
index 093a43095..f5d5fdb48 100644
--- a/include/photos.php
+++ b/include/photos.php
@@ -17,6 +17,7 @@ require_once('include/text.php');
* @param array $args
* @return array
*/
+
function photo_upload($channel, $observer, $args) {
$ret = array('success' => false);
@@ -28,9 +29,6 @@ function photo_upload($channel, $observer, $args) {
return $ret;
}
-
-//call_hooks('photo_upload_begin', $args);
-
/*
* Determine the album to use
*/
@@ -90,8 +88,6 @@ function photo_upload($channel, $observer, $args) {
} else {
$f = array('src' => '', 'filename' => '', 'filesize' => 0, 'type' => '');
-// call_hooks('photo_upload_file',$f);
-
if (x($f,'src') && x($f,'filesize')) {
$src = $f['src'];
$filename = $f['filename'];
@@ -369,37 +365,37 @@ function photo_upload($channel, $observer, $args) {
else {
$mid = item_message_id();
- $arr = array();
-
- if($lat && $lon)
- $arr['coord'] = $lat . ' ' . $lon;
+ $arr = [
+ 'aid' => $account_id,
+ 'uid' => $channel_id,
+ 'mid' => $mid,
+ 'parent_mid' => $mid,
+ 'item_hidden' => $item_hidden,
+ 'resource_type' => 'photo',
+ 'resource_id' => $photo_hash,
+ 'owner_xchan' => $channel['channel_hash'],
+ 'author_xchan' => $observer['xchan_hash'],
+ 'title' => $title,
+ 'allow_cid' => $ac['allow_cid'],
+ 'allow_gid' => $ac['allow_gid'],
+ 'deny_cid' => $ac['deny_cid'],
+ 'deny_gid' => $ac['deny_gid'],
+ 'verb' => ACTIVITY_POST,
+ 'obj_type' => ACTIVITY_OBJ_PHOTO,
+ 'obj' => json_encode($object),
+ 'tgt_type' => ACTIVITY_OBJ_ALBUM,
+ 'target' => json_encode($target),
+ 'item_wall' => $visible,
+ 'item_origin' => 1,
+ 'item_thread_top' => 1,
+ 'item_private' => intval($acl->is_private()),
+ 'body' => $summary
+ ];
- $arr['aid'] = $account_id;
- $arr['uid'] = $channel_id;
- $arr['mid'] = $mid;
- $arr['parent_mid'] = $mid;
- $arr['item_hidden'] = $item_hidden;
- $arr['resource_type'] = 'photo';
- $arr['resource_id'] = $photo_hash;
- $arr['owner_xchan'] = $channel['channel_hash'];
- $arr['author_xchan'] = $observer['xchan_hash'];
- $arr['title'] = $title;
- $arr['allow_cid'] = $ac['allow_cid'];
- $arr['allow_gid'] = $ac['allow_gid'];
- $arr['deny_cid'] = $ac['deny_cid'];
- $arr['deny_gid'] = $ac['deny_gid'];
- $arr['verb'] = ACTIVITY_POST;
- $arr['obj_type'] = ACTIVITY_OBJ_PHOTO;
- $arr['obj'] = json_encode($object);
- $arr['tgt_type'] = ACTIVITY_OBJ_ALBUM;
- $arr['target'] = json_encode($target);
- $arr['item_wall'] = 1;
- $arr['item_origin'] = 1;
- $arr['item_thread_top'] = 1;
- $arr['item_private'] = intval($acl->is_private());
$arr['plink'] = z_root() . '/channel/' . $channel['channel_address'] . '/?f=&mid=' . urlencode($arr['mid']);
- $arr['body'] = $summary;
+ if($lat && $lon)
+ $arr['coord'] = $lat . ' ' . $lon;
// this one is tricky because the item and the photo have the same permissions, those of the photo.
// Use the channel read_stream permissions to get the correct public_policy for the item and recalculate the
@@ -446,6 +442,7 @@ function photo_upload($channel, $observer, $args) {
* * \e boolean \b success
* * \e array \b albums
*/
+
function photos_albums_list($channel, $observer, $sort_key = 'display_path', $direction = 'asc') {
$channel_id = $channel['channel_id'];
@@ -495,15 +492,15 @@ function photos_albums_list($channel, $observer, $sort_key = 'display_path', $di
$ret['success'] = true;
$ret['albums'] = array();
foreach($albums as $k => $album) {
- $entry = array(
- 'text' => (($album['album']) ? $album['album'] : '/'),
+ $entry = [
+ 'text' => (($album['album']) ? $album['album'] : '/'),
'shorttext' => (($album['album']) ? ellipsify($album['album'],28) : '/'),
- 'jstext' => (($album['album']) ? addslashes($album['album']) : '/'),
- 'total' => $album['total'],
- 'url' => z_root() . '/photos/' . $channel['channel_address'] . '/album/' . $album['folder'],
+ 'jstext' => (($album['album']) ? addslashes($album['album']) : '/'),
+ 'total' => $album['total'],
+ 'url' => z_root() . '/photos/' . $channel['channel_address'] . '/album/' . $album['folder'],
'urlencode' => urlencode($album['album']),
- 'bin2hex' => $album['folder']
- );
+ 'bin2hex' => $album['folder']
+ ];
$ret['albums'][] = $entry;
}
}
@@ -545,6 +542,7 @@ function photos_album_widget($channelx,$observer,$sortkey = 'display_path',$dire
* @param string $album default empty
* @return boolean|array
*/
+
function photos_list_photos($channel, $observer, $album = '') {
$channel_id = $channel['channel_id'];
@@ -584,7 +582,10 @@ function photos_list_photos($channel, $observer, $album = '') {
* @param string $album name of the album
* @return boolean
*/
+
+
function photos_album_exists($channel_id, $observer_hash, $album) {
+
$sql_extra = permissions_sql($channel_id,$observer_hash);
$r = q("SELECT folder, hash, is_dir, filename, os_path, display_path FROM attach WHERE hash = '%s' AND is_dir = 1 AND uid = %d $sql_extra limit 1",
@@ -614,6 +615,7 @@ function photos_album_exists($channel_id, $observer_hash, $album) {
* @param string $newname The new name of the album
* @return bool|array
*/
+
function photos_album_rename($channel_id, $oldname, $newname) {
return q("UPDATE photo SET album = '%s' WHERE album = '%s' AND uid = %d",
dbesc($newname),
@@ -632,6 +634,7 @@ function photos_album_rename($channel_id, $oldname, $newname) {
* @param string $remote_xchan
* @return string|boolean
*/
+
function photos_album_get_db_idstr($channel_id, $album, $remote_xchan = '') {
if($remote_xchan) {
@@ -668,6 +671,7 @@ function photos_album_get_db_idstr($channel_id, $album, $remote_xchan = '') {
* @param boolean $visible default false
* @return int item_id
*/
+
function photos_create_item($channel, $creator_hash, $photo, $visible = false) {
// Create item container
@@ -723,7 +727,7 @@ function getGps($exifCoord, $hemi) {
function getGpstimestamp($exifCoord) {
- $hours = count($exifCoord) > 0 ? gps2Num($exifCoord[0]) : 0;
+ $hours = count($exifCoord) > 0 ? gps2Num($exifCoord[0]) : 0;
$minutes = count($exifCoord) > 1 ? gps2Num($exifCoord[1]) : 0;
$seconds = count($exifCoord) > 2 ? gps2Num($exifCoord[2]) : 0;
diff --git a/include/security.php b/include/security.php
index ddbb3d806..6e7b3dbb2 100644
--- a/include/security.php
+++ b/include/security.php
@@ -467,7 +467,6 @@ function scopes_sql($uid,$observer) {
*/
function public_permissions_sql($observer_hash) {
- //$observer = App::get_observer();
$groups = init_groups_visitor($observer_hash);
$gs = '<<>>'; // should be impossible to match
diff --git a/include/socgraph.php b/include/socgraph.php
index 69365f80f..a5b5d1378 100644
--- a/include/socgraph.php
+++ b/include/socgraph.php
@@ -122,7 +122,7 @@ function poco_load($xchan = '', $url = null) {
$profile_url = $url['value'];
continue;
}
- if($url['type'] == 'zot' || $url['type'] == 'diaspora' || $url['type'] == 'friendica') {
+ if($url['type'] == 'zot') {
$network = $url['type'];
$address = str_replace('acct:' , '', $url['value']);
continue;
@@ -163,12 +163,6 @@ function poco_load($xchan = '', $url = null) {
continue;
}
}
- else {
- $x = import_author_diaspora(array('address' => $address));
- if(! $x) {
- continue;
- }
- }
}
else {
continue;
@@ -243,77 +237,6 @@ function common_friends($uid,$xchan,$start = 0,$limit=100000000,$shuffle = false
}
-function count_common_friends_zcid($uid,$zcid) {
-
- $r = q("SELECT count(*) as total
- FROM glink left join gcontact on glink.gcid = gcontact.id
- where glink.zcid = %d
- and gcontact.nurl in (select nurl from contact where uid = %d and self = 0 and blocked = 0 and hidden = 0 ) ",
- intval($zcid),
- intval($uid)
- );
-
- if(count($r))
- return $r[0]['total'];
-
- return 0;
-}
-
-function common_friends_zcid($uid,$zcid,$start = 0, $limit = 9999,$shuffle = false) {
-
- if($shuffle)
- $sql_extra = " order by rand() ";
- else
- $sql_extra = " order by gcontact.name asc ";
-
- $r = q("SELECT gcontact.*
- FROM glink left join gcontact on glink.gcid = gcontact.id
- where glink.zcid = %d
- and gcontact.nurl in (select nurl from contact where uid = %d and self = 0 and blocked = 0 and hidden = 0 )
- $sql_extra limit %d offset %d",
- intval($zcid),
- intval($uid),
- intval($limit),
- intval($start)
- );
-
- return $r;
-}
-
-
-function count_all_friends($uid,$cid) {
-
- $r = q("SELECT count(*) as total
- FROM glink left join gcontact on glink.gcid = gcontact.id
- where glink.cid = %d and glink.uid = %d ",
- intval($cid),
- intval($uid)
- );
-
- if(count($r))
- return $r[0]['total'];
-
- return 0;
-}
-
-
-function all_friends($uid,$cid,$start = 0, $limit = 80) {
-
- $r = q("SELECT gcontact.*
- FROM glink left join gcontact on glink.gcid = gcontact.id
- where glink.cid = %d and glink.uid = %d
- order by gcontact.name asc LIMIT %d OFFSET %d ",
- intval($cid),
- intval($uid),
- intval($limit),
- intval($start)
- );
-
- return $r;
-}
-
-
-
function suggestion_query($uid, $myxchan, $start = 0, $limit = 80) {
if((! $uid) || (! $myxchan))
@@ -564,8 +487,6 @@ function poco($a,$extended = false) {
if($fields_ret['urls']) {
$entry['urls'] = array(array('value' => $rr['xchan_url'], 'type' => 'profile'));
$network = $rr['xchan_network'];
- if(strpos($network,'friendica') !== false)
- $network = 'friendica';
if($rr['xchan_addr'])
$entry['urls'][] = array('value' => 'acct:' . $rr['xchan_addr'], 'type' => $network);
}
diff --git a/include/statistics_fns.php b/include/statistics_fns.php
index cbff3b0b7..d213485bf 100644
--- a/include/statistics_fns.php
+++ b/include/statistics_fns.php
@@ -7,7 +7,7 @@ function update_channels_total_stat() {
$channels_total_stat = intval($r[0]['channels_total']);
set_config('system','channels_total_stat',$channels_total_stat);
} else {
- set_config('system','channels_total_stat',null);
+ set_config('system','channels_total_stat',0);
}
}
@@ -30,10 +30,10 @@ function update_channels_active_halfyear_stat() {
$channels_active_halfyear_stat = count($x);
set_config('system','channels_active_halfyear_stat',$channels_active_halfyear_stat);
} else {
- set_config('system','channels_active_halfyear_stat',null);
+ set_config('system','channels_active_halfyear_stat',0);
}
} else {
- set_config('system','channels_active_halfyear_stat',null);
+ set_config('system','channels_active_halfyear_stat',0);
}
}
@@ -56,10 +56,10 @@ function update_channels_active_monthly_stat() {
$channels_active_monthly_stat = count($x);
set_config('system','channels_active_monthly_stat',$channels_active_monthly_stat);
} else {
- set_config('system','channels_active_monthly_stat',null);
+ set_config('system','channels_active_monthly_stat',0);
}
} else {
- set_config('system','channels_active_monthly_stat',null);
+ set_config('system','channels_active_monthly_stat',0);
}
}
@@ -69,8 +69,16 @@ function update_local_posts_stat() {
$local_posts_stat = intval($posts[0]["local_posts"]);
set_config('system','local_posts_stat',$local_posts_stat);
} else {
- set_config('system','local_posts_stat',null);
+ set_config('system','local_posts_stat',0);
}
}
+function update_local_comments_stat() {
+ $posts = q("SELECT COUNT(*) AS local_posts FROM item WHERE item_wall = 1 and id != parent");
+ if (!is_array($posts))
+ $local_posts = 0;
+ else
+ $local_posts = $posts[0]["local_posts"];
+ set_config('system','local_comments_stat', $local_posts);
+} \ No newline at end of file
diff --git a/include/taxonomy.php b/include/taxonomy.php
index 0b4b2aa9a..46d661581 100644
--- a/include/taxonomy.php
+++ b/include/taxonomy.php
@@ -44,6 +44,45 @@ function term_query($table,$s,$type = TERM_UNKNOWN, $type2 = '') {
}
+function term_item_parent_query($uid,$table,$s,$type = TERM_UNKNOWN, $type2 = '') {
+
+ // Allow asterisks for wildcard search
+ // In theory this means '%' will also do a wildcard search, but there appear to be multiple escape
+ // issues with '%' in term names and trying to fix this with '\\%' here did not help.
+ // Ideally I think we want '*' to indicate wildcards and allow '%' literally in names, but that is being
+ // left for another developer on another day.
+
+ $s = str_replace('*','%',$s);
+
+ if($type2) {
+ $r = q("select parent from item left join term on term.oid = item.id where term.ttype in (%d, %d) and term.term like '%s' and term.uid = %d and term.otype = 1",
+ intval($type),
+ intval($type2),
+ dbesc($s),
+ intval($uid)
+ );
+ }
+ else {
+ $r = q("select parent from item left join term on term.oid = item.id where term.ttype = %d and term.term like '%s' and term.uid = %d and term.otype = 1",
+ intval($type),
+ dbesc($s),
+ intval($uid)
+ );
+ }
+
+ if($r) {
+ $str = '';
+ foreach($r as $rv) {
+ if($str)
+ $str .= ',';
+ $str .= intval($rv['parent']);
+ }
+ return " AND " . (($table) ? dbesc($table) . '.' : '') . "id in ( $str ) ";
+ }
+ return " AND false ";
+}
+
+
function store_item_tag($uid,$iid,$otype,$type,$term,$url = '') {
if(! $term)
return false;
diff --git a/include/text.php b/include/text.php
index d352a61bf..5af4f1b67 100644
--- a/include/text.php
+++ b/include/text.php
@@ -648,12 +648,8 @@ function logger($msg, $level = LOGGER_NORMAL, $priority = LOG_INFO) {
$where = '';
- // We require > 5.4 but leave the version check so that install issues (including version) can be logged
-
- if(version_compare(PHP_VERSION, '5.4.0') >= 0) {
- $stack = debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS, 2);
- $where = basename($stack[0]['file']) . ':' . $stack[0]['line'] . ':' . $stack[1]['function'] . ': ';
- }
+ $stack = debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS, 2);
+ $where = basename($stack[0]['file']) . ':' . $stack[0]['line'] . ':' . $stack[1]['function'] . ': ';
$s = datetime_convert() . ':' . log_priority_str($priority) . ':' . session_id() . ':' . $where . $msg . PHP_EOL;
$pluginfo = array('filename' => $logfile, 'loglevel' => $level, 'message' => $s,'priority' => $priority, 'logged' => false);
@@ -687,16 +683,14 @@ function btlogger($msg, $level = LOGGER_NORMAL, $priority = LOG_INFO) {
@file_put_contents(BTLOGGER_DEBUG_FILE, $s, FILE_APPEND);
}
- if(version_compare(PHP_VERSION, '5.4.0') >= 0) {
- $stack = debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS);
- if($stack) {
- for($x = 1; $x < count($stack); $x ++) {
- $s = 'stack: ' . basename($stack[$x]['file']) . ':' . $stack[$x]['line'] . ':' . $stack[$x]['function'] . '()';
- logger($s,$level, $priority);
+ $stack = debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS);
+ if($stack) {
+ for($x = 1; $x < count($stack); $x ++) {
+ $s = 'stack: ' . basename($stack[$x]['file']) . ':' . $stack[$x]['line'] . ':' . $stack[$x]['function'] . '()';
+ logger($s,$level, $priority);
- if(file_exists(BTLOGGER_DEBUG_FILE) && is_writable(BTLOGGER_DEBUG_FILE)) {
- @file_put_contents(BTLOGGER_DEBUG_FILE, $s . PHP_EOL, FILE_APPEND);
- }
+ if(file_exists(BTLOGGER_DEBUG_FILE) && is_writable(BTLOGGER_DEBUG_FILE)) {
+ @file_put_contents(BTLOGGER_DEBUG_FILE, $s . PHP_EOL, FILE_APPEND);
}
}
}
@@ -751,10 +745,10 @@ function dlogger($msg, $level = 0) {
return;
$where = '';
- if(version_compare(PHP_VERSION, '5.4.0') >= 0) {
- $stack = debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS, 2);
- $where = basename($stack[0]['file']) . ':' . $stack[0]['line'] . ':' . $stack[1]['function'] . ': ';
- }
+
+ $stack = debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS, 2);
+ $where = basename($stack[0]['file']) . ':' . $stack[0]['line'] . ':' . $stack[1]['function'] . ': ';
+
@file_put_contents($logfile, datetime_convert() . ':' . session_id() . ' ' . $where . $msg . PHP_EOL, FILE_APPEND);
}
@@ -1042,19 +1036,6 @@ function searchbox($s,$id='search-box',$url='/search',$save = false) {
));
}
-function valid_email_regex($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;
-}
-
-function valid_email($x){
- if(get_config('system','disable_email_validation'))
- return true;
-
- return valid_email_regex($x);
-}
-
/**
* @brief Replace naked text hyperlink with HTML formatted hyperlink.
*
@@ -1199,8 +1180,7 @@ function list_smilies($default_only = false) {
':coffee',
':facepalm',
':like',
- ':dislike',
- ':hubzilla'
+ ':dislike'
);
$icons = array(
@@ -1234,8 +1214,7 @@ function list_smilies($default_only = false) {
'<img class="smiley" src="' . z_root() . '/images/emoticons/coffee.gif" alt=":coffee" />',
'<img class="smiley" src="' . z_root() . '/images/emoticons/smiley-facepalm.gif" alt=":facepalm" />',
'<img class="smiley" src="' . z_root() . '/images/emoticons/like.gif" alt=":like" />',
- '<img class="smiley" src="' . z_root() . '/images/emoticons/dislike.gif" alt=":dislike" />',
- '<img class="smiley" src="' . z_root() . '/images/hz-16.png" alt=":hubzilla" />',
+ '<img class="smiley" src="' . z_root() . '/images/emoticons/dislike.gif" alt=":dislike" />'
);
@@ -1552,17 +1531,22 @@ function prepare_body(&$item,$attach = false) {
// if original photo width is <= 640px prepend it to item body
if($object['link'][0]['width'] && $object['link'][0]['width'] <= 640) {
- $s .= '<div class="inline-photo-item-wrapper"><a href="' . zid(rawurldecode($object['id'])) . '" target="_blank"><img class="inline-photo-item" style="max-width:' . $object['link'][0]['width'] . 'px; width:100%; height:auto;" src="' . zid(rawurldecode($object['link'][0]['href'])) . '"></a></div>' . $s;
+ $s .= '<div class="inline-photo-item-wrapper"><a href="' . zid(rawurldecode($object['id'])) . '" target="_blank" rel="nofollow noopener" ><img class="inline-photo-item" style="max-width:' . $object['link'][0]['width'] . 'px; width:100%; height:auto;" src="' . zid(rawurldecode($object['link'][0]['href'])) . '"></a></div>' . $s;
}
// if original photo width is > 640px make it a cover photo
if($object['link'][0]['width'] && $object['link'][0]['width'] > 640) {
$scale = ((($object['link'][1]['width'] == 1024) || ($object['link'][1]['height'] == 1024)) ? 1 : 0);
- $photo = '<a href="' . zid(rawurldecode($object['id'])) . '" target="_blank"><img style="max-width:' . $object['link'][$scale]['width'] . 'px; width:100%; height:auto;" src="' . zid(rawurldecode($object['link'][$scale]['href'])) . '"></a>';
+ $photo = '<a href="' . zid(rawurldecode($object['id'])) . '" target="_blank" rel="nofollow noopener"><img style="max-width:' . $object['link'][$scale]['width'] . 'px; width:100%; height:auto;" src="' . zid(rawurldecode($object['link'][$scale]['href'])) . '"></a>';
}
}
- $s .= prepare_text($item['body'],$item['mimetype'], false);
+ if($item['item_obscured']) {
+ $s .= prepare_binary($item);
+ }
+ else {
+ $s .= prepare_text($item['body'],$item['mimetype'], false);
+ }
$event = (($item['obj_type'] === ACTIVITY_OBJ_EVENT) ? format_event_obj($item['obj']) : false);
@@ -1625,6 +1609,17 @@ function prepare_body(&$item,$attach = false) {
return $prep_arr;
}
+
+function prepare_binary($item) {
+ return replace_macros(get_markup_template('item_binary.tpl'), [
+ '$download' => t('Download binary/encrypted content'),
+ '$url' => z_root() . '/viewsrc/' . $item['id'] . '/download'
+ ]);
+}
+
+
+
+
/**
* @brief Given a text string, convert from bbcode to html and add smilie icons.
*
@@ -1992,23 +1987,44 @@ function legal_webbie($s) {
if(! strlen($s))
return '';
- $x = $s;
- do {
- $s = $x;
- $x = preg_replace('/^([^a-z])(.*?)/',"$2",$s);
- } while($x != $s);
+ // WARNING: This regex will not work in a federated environment.
+ // You will probably want something like
+ // preg_replace('/([^a-z0-9\_])/','',strtolower($s));
+
+ $r = preg_replace('/([^a-z0-9\-\_\.])/','',strtolower($s));
+
+ $x = [ 'input' => $s, 'output' => $r ];
+ call_hooks('legal_webbie',$x);
+ return $x['output'];
+
+}
+
+function legal_webbie_text() {
+
+ // WARNING: This will not work in a federated environment.
+
+ $s = t('a-z, 0-9, -, _, and . only');
+
+ $x = [ 'text' => $s ];
+ call_hooks('legal_webbie_text',$x);
+ return $x['text'];
- return preg_replace('/([^a-z0-9\-\_])/','',$x);
}
+
+
+
function check_webbie($arr) {
+
+ // These names conflict with the CalDAV server
+ $taken = [ 'principals', 'addressbooks', 'calendars' ];
+
$reservechan = get_config('system','reserved_channels');
- if(strlen($reservechan))
- $taken = explode(',', $reservechan);
- else
- $taken = array('principals','addressbooks','calendars');
+ if(strlen($reservechan)) {
+ $taken = array_merge($taken,explode(',', $reservechan));
+ }
$str = '';
if(count($arr)) {
@@ -2258,13 +2274,13 @@ function design_tools() {
$who = $channel['channel_address'];
return replace_macros(get_markup_template('design_tools.tpl'), array(
- '$title' => t('Design Tools'),
- '$who' => $who,
- '$sys' => $sys,
+ '$title' => t('Design Tools'),
+ '$who' => $who,
+ '$sys' => $sys,
'$blocks' => t('Blocks'),
- '$menus' => t('Menus'),
+ '$menus' => t('Menus'),
'$layout' => t('Layouts'),
- '$pages' => t('Pages')
+ '$pages' => t('Pages')
));
}
@@ -2285,21 +2301,21 @@ function website_portation_tools() {
}
return replace_macros(get_markup_template('website_portation_tools.tpl'), array(
- '$title' => t('Import'),
- '$import_label' => t('Import website...'),
- '$import_placeholder' => t('Select folder to import'),
- '$file_upload_text' => t('Import from a zipped folder:'),
- '$file_import_text' => t('Import from cloud files:'),
- '$desc' => t('/cloud/channel/path/to/folder'),
- '$hint' => t('Enter path to website files'),
- '$select' => t('Select folder'),
- '$export_label' => t('Export website...'),
- '$file_download_text' => t('Export to a zip file'),
- '$filename_desc' => t('website.zip'),
- '$filename_hint' => t('Enter a name for the zip file.'),
- '$cloud_export_text' => t('Export to cloud files'),
- '$cloud_export_desc' => t('/path/to/export/folder'),
- '$cloud_export_hint' => t('Enter a path to a cloud files destination.'),
+ '$title' => t('Import'),
+ '$import_label' => t('Import website...'),
+ '$import_placeholder' => t('Select folder to import'),
+ '$file_upload_text' => t('Import from a zipped folder:'),
+ '$file_import_text' => t('Import from cloud files:'),
+ '$desc' => t('/cloud/channel/path/to/folder'),
+ '$hint' => t('Enter path to website files'),
+ '$select' => t('Select folder'),
+ '$export_label' => t('Export website...'),
+ '$file_download_text' => t('Export to a zip file'),
+ '$filename_desc' => t('website.zip'),
+ '$filename_hint' => t('Enter a name for the zip file.'),
+ '$cloud_export_text' => t('Export to cloud files'),
+ '$cloud_export_desc' => t('/path/to/export/folder'),
+ '$cloud_export_hint' => t('Enter a path to a cloud files destination.'),
'$cloud_export_select' => t('Specify folder'),
));
}
@@ -2897,7 +2913,7 @@ function pdl_selector($uid, $current='') {
$sql_extra = item_permissions_sql($uid);
- $r = q("select iconfig.*, mid from item_id left join item on iconfig.iid = item.id
+ $r = q("select iconfig.*, mid from iconfig left join item on iconfig.iid = item.id
where item.uid = %d and iconfig.cat = 'system' and iconfig.k = 'PDL' $sql_extra order by v asc",
intval($uid)
);
@@ -2969,40 +2985,13 @@ function text_highlight($s, $lang) {
$s = jindent($s);
}
- if(! strpos('Text_Highlighter', get_include_path())) {
- set_include_path(get_include_path() . PATH_SEPARATOR . 'library/Text_Highlighter');
- }
- require_once('library/Text_Highlighter/Text/Highlighter.php');
- require_once('library/Text_Highlighter/Text/Highlighter/Renderer/Html.php');
- $options = array(
- 'numbers' => HL_NUMBERS_LI,
- 'tabsize' => 4,
- );
- $tag_added = false;
- $s = trim(html_entity_decode($s, ENT_COMPAT));
- $s = str_replace(" ", "\t", $s);
-
- // The highlighter library insists on an opening php tag for php code blocks. If
- // it isn't present, nothing is highlighted. So we're going to see if it's present.
- // If not, we'll add it, and then quietly remove it after we get the processed output back.
-
- if($lang === 'php') {
- if(strpos('<?php', $s) !== 0) {
- $s = '<?php' . "\n" . $s;
- $tag_added = true;
- }
- }
- $renderer = new Text_Highlighter_Renderer_HTML($options);
- $hl = Text_Highlighter::factory($lang);
- $hl->setRenderer($renderer);
- $o = $hl->highlight($s);
- $o = str_replace([" ", "\n"], ["&nbsp;&nbsp;&nbsp;&nbsp;", ''], $o);
+ $arr = [ 'text' => $s, 'language' => $lang, 'success' => false ];
+ call_hooks('text_highlight',$arr);
- if($tag_added) {
- $b = substr($o, 0, strpos($o, '<li>'));
- $e = substr($o, strpos($o, '</li>'));
- $o = $b . $e;
- }
+ if($arr['success'])
+ $o = $arr['text'];
+ else
+ $o = $s;
return('<code>' . $o . '</code>');
}
@@ -3033,7 +3022,8 @@ function array2XML($obj, $array) {
if(is_array($value)) {
$node = $obj->addChild($key);
array2XML($node, $value);
- } else {
+ }
+ else {
$obj->addChild($key, htmlspecialchars($value));
}
}
@@ -3065,6 +3055,14 @@ function create_table_from_array($table, $arr) {
return $r;
}
+function share_shield($m) {
+ return str_replace($m[1],'!=+=+=!' . base64url_encode($m[1]) . '=+!=+!=',$m[0]);
+}
+
+function share_unshield($m) {
+ $x = str_replace(array('!=+=+=!','=+!=+!='),array('',''),$m[1]);
+ return str_replace($m[1], base64url_decode($x), $m[0]);
+}
function cleanup_bbcode($body) {
diff --git a/include/zid.php b/include/zid.php
index f5df1c611..ee43fd7c8 100644
--- a/include/zid.php
+++ b/include/zid.php
@@ -60,7 +60,7 @@ function zid($s,$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
+ * of urls attached to our channel. Should probably match against our site, since we
* will not need to remote authenticate on our own site anyway.
*/
diff --git a/include/zot.php b/include/zot.php
index 31debbe9d..3143fa000 100644
--- a/include/zot.php
+++ b/include/zot.php
@@ -1326,8 +1326,10 @@ function public_recips($msg) {
$include_sys = false;
if($msg['message']['type'] === 'activity') {
- if(! get_config('system','disable_discover_tab'))
+ $disable_discover_tab = get_config('system','disable_discover_tab') || get_config('system','disable_discover_tab') === false;
+ if(! $disable_discover_tab)
$include_sys = true;
+
$perm = 'send_stream';
if(array_key_exists('flags',$msg['message']) && in_array('thread_parent', $msg['message']['flags'])) {
@@ -1761,7 +1763,7 @@ function process_delivery($sender, $arr, $deliveries, $relay, $public = false, $
$result[] = $DR->get();
}
else {
- update_imported_item($sender,$arr,$r[0],$channel['channel_id'],$tag_delivery);
+ $item_result = update_imported_item($sender,$arr,$r[0],$channel['channel_id'],$tag_delivery);
$DR->update('updated');
$result[] = $DR->get();
if(! $relay)
@@ -1810,6 +1812,14 @@ function process_delivery($sender, $arr, $deliveries, $relay, $public = false, $
}
}
+ // preserve conversations with which you are involved from expiration
+
+ $stored = (($item_result && $item_result['item']) ? $item_result['item'] : false);
+ if((is_array($stored)) && ($stored['id'] != $stored['parent'])
+ && ($stored['author_xchan'] === $channel['channel_hash'])) {
+ retain_item($stored['item']['parent']);
+ }
+
if($relay && $item_id) {
logger('process_delivery: invoking relay');
Zotlabs\Daemon\Master::Summon(array('Notifier','relay',intval($item_id)));
@@ -1946,6 +1956,8 @@ function update_imported_item($sender, $item, $orig, $uid, $tag_delivery) {
logger('update_imported_item: failed: ' . $x['message']);
else
logger('update_imported_item');
+
+ return $x;
}
/**
@@ -2237,9 +2249,6 @@ function check_location_move($sender_hash,$locations) {
if(! $locations)
return;
- if(get_config('system','server_role') !== 'basic')
- return;
-
if(count($locations) != 1)
return;
@@ -2824,7 +2833,7 @@ function import_site($arr, $pubkey) {
$access_policy = ACCESS_PRIVATE;
if($access_policy != ACCESS_PRIVATE) {
- $x = z_fetch_url($arr['url'] . '/siteinfo/json');
+ $x = z_fetch_url($arr['url'] . '/siteinfo.json');
if(! $x['success'])
$access_policy = ACCESS_PRIVATE;
}
@@ -2935,8 +2944,6 @@ function import_site($arr, $pubkey) {
function build_sync_packet($uid = 0, $packet = null, $groups_changed = false) {
- if(get_config('system','server_role') === 'basic')
- return;
logger('build_sync_packet');
@@ -3086,8 +3093,6 @@ function build_sync_packet($uid = 0, $packet = null, $groups_changed = false) {
function process_channel_sync_delivery($sender, $arr, $deliveries) {
- if(get_config('system','server_role') === 'basic')
- return;
require_once('include/import.php');
@@ -3289,6 +3294,11 @@ function process_channel_sync_delivery($sender, $arr, $deliveries) {
if(! array_key_exists('abook_xchan',$clean))
continue;
+ if(array_key_exists('abook_instance',$clean) && $clean['abook_instance'] && strpos($clean['abook_instance'],z_root()) === false) {
+ $clean['abook_not_here'] = 1;
+ }
+
+
$r = q("select * from abook where abook_xchan = '%s' and abook_channel = %d limit 1",
dbesc($clean['abook_xchan']),
intval($channel['channel_id'])
@@ -3364,7 +3374,7 @@ function process_channel_sync_delivery($sender, $arr, $deliveries) {
dbesc($cl['name']),
intval($cl['visible']),
intval($cl['deleted']),
- dbesc($cl['hash']),
+ dbesc($cl['collection']),
intval($channel['channel_id'])
);
}
@@ -3586,6 +3596,14 @@ function import_author_zot($x) {
$hash = make_xchan_hash($x['guid'],$x['guid_sig']);
+ // also - this function may get passed a profile url as 'url' and zot_refresh wants a hubloc_url (site baseurl),
+ // so deconstruct the url (if we have one) and rebuild it with just the baseurl components.
+
+ if(array_key_exists('url',$x)) {
+ $m = parse_url($x['url']);
+ $desturl = $m['scheme'] . '://' . $m['host'];
+ }
+
$r1 = q("select hubloc_url, hubloc_updated, site_dead from hubloc left join site on
hubloc_url = site_url where hubloc_guid = '%s' and hubloc_guid_sig = '%s' and hubloc_primary = 1 limit 1",
dbesc($x['guid']),
@@ -3627,14 +3645,16 @@ function import_author_zot($x) {
);
if($r) {
logger('found another site that is not dead: ' . $r[0]['hubloc_url'], LOGGER_DEBUG,LOG_INFO);
- $x['url'] = $r[0]['hubloc_url'];
+ $desturl = $r[0]['hubloc_url'];
}
else {
return $hash;
}
}
- $them = array('hubloc_url' => $x['url'], 'xchan_guid' => $x['guid'], 'xchan_guid_sig' => $x['guid_sig']);
+
+
+ $them = array('hubloc_url' => $desturl, 'xchan_guid' => $x['guid'], 'xchan_guid_sig' => $x['guid_sig']);
if(zot_refresh($them))
return $hash;
@@ -3921,6 +3941,7 @@ function zotinfo($arr) {
$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['follow_url'] = $e['xchan_follow'];
$ret['target'] = $ztarget;
$ret['target_sig'] = $zsig;
$ret['searchable'] = $searchable;
@@ -3928,19 +3949,22 @@ function zotinfo($arr) {
$ret['public_forum'] = $public_forum;
if($deleted)
$ret['deleted'] = $deleted;
+
if(intval($e['channel_removed']))
$ret['deleted_locally'] = true;
+
+
// 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'];
-
+ if($special_channel) {
+ $ret['connect_url'] = (($e['xchan_connpage']) ? $e['xchan_connpage'] : 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';
-
+ if(! $ret['follow_url'])
+ $ret['follow_url'] = z_root() . '/follow?f=&url=%s';
$permissions = get_all_perms($e['channel_id'],$ztarget_hash,false);
diff --git a/install/htconfig.sample.php b/install/htconfig.sample.php
index f37b3dc79..07725e3f4 100755
--- a/install/htconfig.sample.php
+++ b/install/htconfig.sample.php
@@ -44,14 +44,6 @@ App::$config['system']['sitename'] = "Hubzilla";
App::$config['system']['location_hash'] = 'if the auto install failed, put a unique random string here';
-// Choices are 'basic', 'standard', and 'pro'.
-// basic sets up the sevrer for basic social networking and removes "complicated" features
-// standard provides most desired features except e-commerce
-// pro gives you access to everything, but removes cross-platform federation/emulation
-
-App::$config['system']['server_role'] = 'standard';
-
-
// These lines set additional security headers to be sent with all responses
// You may wish to set transport_security_header to 0 if your server already sends
// this header. content_security_policy may need to be disabled if you wish to
diff --git a/install/sample-nginx.conf b/install/sample-nginx.conf
index 85178596a..4121ff2ec 100644
--- a/install/sample-nginx.conf
+++ b/install/sample-nginx.conf
@@ -56,7 +56,7 @@ server {
ssl_certificate_key /etc/nginx/ssl/example.net.key;
ssl_session_timeout 5m;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
- ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-DSS-AES128-SHA256:DHE-DSS-AES256-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA:AES256-SHA:AES:CAMELLIA:DES-CBC3-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!aECDH:!EDH-DSS-DES-CBC3-SHA:!EDH-RSA-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA:!DHE-RSA-AES128-GCM-SHA256:!DHE-RSA-AES256-GCM-SHA384:!DHE-RSA-AES128-SHA256:!DHE-RSA-AES256-SHA:!DHE-RSA-AES128-SHA:!DHE-RSA-AES256-SHA256:!DHE-RSA-CAMELLIA128-SHA:!DHE-RSA-CAMELLIA256-SHA;
+ ssl_ciphers ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA:ECDHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES256-SHA:ECDHE-ECDSA-DES-CBC3-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:DES-CBC3-SHA:!DSS;
ssl_prefer_server_ciphers on;
fastcgi_param HTTPS on;
diff --git a/install/schema_mysql.sql b/install/schema_mysql.sql
index faaf167a2..9e2e401b5 100644
--- a/install/schema_mysql.sql
+++ b/install/schema_mysql.sql
@@ -2,22 +2,22 @@
CREATE TABLE IF NOT EXISTS `abconfig` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`chan` int(10) unsigned NOT NULL DEFAULT 0 ,
- `xchan` char(255) NOT NULL DEFAULT '',
- `cat` char(255) NOT NULL DEFAULT '',
- `k` char(255) NOT NULL DEFAULT '',
+ `xchan` char(191) NOT NULL DEFAULT '',
+ `cat` char(191) NOT NULL DEFAULT '',
+ `k` char(191) NOT NULL DEFAULT '',
`v` mediumtext NOT NULL,
PRIMARY KEY (`id`),
KEY `chan` (`chan`),
KEY `xchan` (`xchan`),
KEY `cat` (`cat`),
KEY `k` (`k`)
-) ENGINE=MyISAM DEFAULT CHARSET=utf8;
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
CREATE TABLE IF NOT EXISTS `abook` (
`abook_id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`abook_account` int(10) unsigned NOT NULL DEFAULT 0 ,
`abook_channel` int(10) unsigned NOT NULL DEFAULT 0 ,
- `abook_xchan` char(255) NOT NULL DEFAULT '',
+ `abook_xchan` char(191) NOT NULL DEFAULT '',
`abook_my_perms` int(11) NOT NULL DEFAULT 0 ,
`abook_their_perms` int(11) NOT NULL DEFAULT 0 ,
`abook_closeness` tinyint(3) unsigned NOT NULL DEFAULT 99,
@@ -35,7 +35,7 @@ CREATE TABLE IF NOT EXISTS `abook` (
`abook_self` tinyint(4) NOT NULL DEFAULT 0 ,
`abook_feed` tinyint(4) NOT NULL DEFAULT 0 ,
`abook_not_here` tinyint(4) NOT NULL DEFAULT 0 ,
- `abook_profile` char(64) NOT NULL DEFAULT '',
+ `abook_profile` char(191) NOT NULL DEFAULT '',
`abook_incl` text NOT NULL,
`abook_excl` text NOT NULL,
`abook_instance` text NOT NULL,
@@ -61,22 +61,22 @@ CREATE TABLE IF NOT EXISTS `abook` (
KEY `abook_self` (`abook_self`),
KEY `abook_not_here` (`abook_not_here`),
KEY `abook_feed` (`abook_feed`)
-) ENGINE=MyISAM DEFAULT CHARSET=utf8;
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
CREATE TABLE IF NOT EXISTS `account` (
`account_id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`account_parent` int(10) unsigned NOT NULL DEFAULT 0 ,
`account_default_channel` int(10) unsigned NOT NULL DEFAULT 0 ,
`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_password` char(191) NOT NULL DEFAULT '',
+ `account_email` char(191) NOT NULL DEFAULT '',
+ `account_external` char(191) NOT NULL DEFAULT '',
`account_language` char(16) NOT NULL DEFAULT 'en',
`account_created` datetime NOT NULL DEFAULT '0001-01-01 00:00:00',
`account_lastlog` datetime NOT NULL DEFAULT '0001-01-01 00:00:00',
`account_flags` int(10) unsigned NOT NULL DEFAULT 0 ,
`account_roles` int(10) unsigned NOT NULL DEFAULT 0 ,
- `account_reset` char(255) NOT NULL DEFAULT '',
+ `account_reset` char(191) NOT NULL DEFAULT '',
`account_expires` datetime NOT NULL DEFAULT '0001-01-01 00:00:00',
`account_expire_notified` datetime NOT NULL DEFAULT '0001-01-01 00:00:00',
`account_service_class` char(32) NOT NULL DEFAULT '',
@@ -94,12 +94,12 @@ CREATE TABLE IF NOT EXISTS `account` (
KEY `account_external` (`account_external`),
KEY `account_level` (`account_level`),
KEY `account_password_changed` (`account_password_changed`)
-) ENGINE=MyISAM DEFAULT CHARSET=utf8;
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
CREATE TABLE IF NOT EXISTS `addon` (
`id` int(11) NOT NULL AUTO_INCREMENT,
- `aname` char(255) NOT NULL DEFAULT '',
- `version` char(255) NOT NULL DEFAULT '',
+ `aname` char(191) NOT NULL DEFAULT '',
+ `version` char(191) NOT NULL DEFAULT '',
`installed` tinyint(1) NOT NULL DEFAULT 0 ,
`hidden` tinyint(1) NOT NULL DEFAULT 0 ,
`tstamp` bigint(20) NOT NULL DEFAULT 0 ,
@@ -108,26 +108,26 @@ CREATE TABLE IF NOT EXISTS `addon` (
KEY `hidden` (`hidden`),
KEY `aname` (`aname`),
KEY `installed` (`installed`)
-) ENGINE=MyISAM DEFAULT CHARSET=utf8;
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
CREATE TABLE IF NOT EXISTS `app` (
`id` int(11) NOT NULL AUTO_INCREMENT,
- `app_id` char(255) NOT NULL DEFAULT '',
- `app_sig` char(255) NOT NULL DEFAULT '',
- `app_author` char(255) NOT NULL DEFAULT '',
- `app_name` char(255) NOT NULL DEFAULT '',
+ `app_id` char(191) NOT NULL DEFAULT '',
+ `app_sig` char(191) NOT NULL DEFAULT '',
+ `app_author` char(191) NOT NULL DEFAULT '',
+ `app_name` char(191) NOT NULL DEFAULT '',
`app_desc` text NOT NULL,
- `app_url` char(255) NOT NULL DEFAULT '',
- `app_photo` char(255) NOT NULL DEFAULT '',
- `app_version` char(255) NOT NULL DEFAULT '',
+ `app_url` char(191) NOT NULL DEFAULT '',
+ `app_photo` char(191) NOT NULL DEFAULT '',
+ `app_version` char(191) NOT NULL DEFAULT '',
`app_channel` int(11) NOT NULL DEFAULT 0 ,
- `app_addr` char(255) NOT NULL DEFAULT '',
- `app_price` char(255) NOT NULL DEFAULT '',
- `app_page` char(255) NOT NULL DEFAULT '',
- `app_requires` char(255) NOT NULL DEFAULT '',
+ `app_addr` char(191) NOT NULL DEFAULT '',
+ `app_price` char(191) NOT NULL DEFAULT '',
+ `app_page` char(191) NOT NULL DEFAULT '',
+ `app_requires` char(191) NOT NULL DEFAULT '',
`app_deleted` int(11) NOT NULL DEFAULT 0 ,
`app_system` int(11) NOT NULL DEFAULT 0 ,
- `app_plugin` char(255) NOT NULL DEFAULT '',
+ `app_plugin` char(191) NOT NULL DEFAULT '',
`app_created` datetime NOT NULL DEFAULT '0001-01-01 00:00:00',
`app_edited` datetime NOT NULL DEFAULT '0001-01-01 00:00:00',
PRIMARY KEY (`id`),
@@ -142,15 +142,15 @@ CREATE TABLE IF NOT EXISTS `app` (
KEY `app_deleted` (`app_deleted`),
KEY `app_system` (`app_system`),
KEY `app_edited` (`app_edited`)
-) ENGINE=MyISAM DEFAULT CHARSET=utf8;
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
CREATE TABLE IF NOT EXISTS `atoken` (
`atoken_id` int(11) NOT NULL AUTO_INCREMENT,
- `atoken_aid` int(11) NOT NULL DEFAULT 0,
- `atoken_uid` int(11) NOT NULL DEFAULT 0,
- `atoken_name` char(255) NOT NULL DEFAULT '',
- `atoken_token` char(255) NOT NULL DEFAULT '',
+ `atoken_aid` int(11) NOT NULL DEFAULT 0 ,
+ `atoken_uid` int(11) NOT NULL DEFAULT 0 ,
+ `atoken_name` char(191) NOT NULL DEFAULT '',
+ `atoken_token` char(191) NOT NULL DEFAULT '',
`atoken_expires` datetime NOT NULL DEFAULT '0001-01-01 00:00:00',
PRIMARY KEY (`atoken_id`),
KEY `atoken_aid` (`atoken_aid`),
@@ -159,19 +159,19 @@ CREATE TABLE IF NOT EXISTS `atoken` (
KEY `atoken_name` (`atoken_name`),
KEY `atoken_token` (`atoken_token`),
KEY `atoken_expires` (`atoken_expires`)
-) ENGINE=MyISAM DEFAULT CHARSET=utf8;
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
CREATE TABLE IF NOT EXISTS `attach` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`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 '',
- `filename` char(255) NOT NULL DEFAULT '',
- `filetype` char(64) NOT NULL DEFAULT '',
+ `hash` char(191) NOT NULL DEFAULT '',
+ `creator` char(191) NOT NULL DEFAULT '',
+ `filename` char(191) NOT NULL DEFAULT '',
+ `filetype` char(191) NOT NULL DEFAULT '',
`filesize` int(10) unsigned NOT NULL DEFAULT 0 ,
`revision` int(10) unsigned NOT NULL DEFAULT 0 ,
- `folder` char(64) NOT NULL DEFAULT '',
+ `folder` char(191) NOT NULL DEFAULT '',
`flags` int(10) unsigned NOT NULL DEFAULT 0 ,
`is_dir` tinyint(1) NOT NULL DEFAULT 0 ,
`is_photo` tinyint(1) NOT NULL DEFAULT 0 ,
@@ -201,7 +201,7 @@ CREATE TABLE IF NOT EXISTS `attach` (
KEY `is_dir` (`is_dir`),
KEY `is_photo` (`is_photo`),
KEY `os_storage` (`os_storage`)
-) ENGINE=MyISAM DEFAULT CHARSET=utf8;
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
CREATE TABLE IF NOT EXISTS `auth_codes` (
`id` varchar(40) NOT NULL DEFAULT '',
@@ -210,48 +210,48 @@ CREATE TABLE IF NOT EXISTS `auth_codes` (
`expires` int(11) NOT NULL DEFAULT 0 ,
`auth_scope` varchar(512) NOT NULL DEFAULT '',
PRIMARY KEY (`id`)
-) ENGINE=MyISAM DEFAULT CHARSET=utf8;
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
CREATE TABLE IF NOT EXISTS `cache` (
- `k` char(255) NOT NULL DEFAULT '',
+ `k` char(191) NOT NULL DEFAULT '',
`v` text NOT NULL,
`updated` datetime NOT NULL DEFAULT '0001-01-01 00:00:00',
PRIMARY KEY (`k`)
-) ENGINE=MyISAM DEFAULT CHARSET=utf8;
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
CREATE TABLE IF NOT EXISTS `cal` (
`cal_id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`cal_aid` int(10) unsigned NOT NULL DEFAULT 0 ,
`cal_uid` int(10) unsigned NOT NULL DEFAULT 0 ,
- `cal_hash` varchar(255) NOT NULL DEFAULT '',
- `cal_name` varchar(255) NOT NULL DEFAULT '',
- `uri` varchar(255) NOT NULL DEFAULT '',
- `logname` varchar(255) NOT NULL DEFAULT '',
- `pass` varchar(255) NOT NULL DEFAULT '',
- `ctag` varchar(255) NOT NULL DEFAULT '',
- `synctoken` varchar(255) NOT NULL DEFAULT '',
- `cal_types` varchar(255) NOT NULL DEFAULT '',
+ `cal_hash` varchar(191) NOT NULL DEFAULT '',
+ `cal_name` varchar(191) NOT NULL DEFAULT '',
+ `uri` varchar(191) NOT NULL DEFAULT '',
+ `logname` varchar(191) NOT NULL DEFAULT '',
+ `pass` varchar(191) NOT NULL DEFAULT '',
+ `ctag` varchar(191) NOT NULL DEFAULT '',
+ `synctoken` varchar(191) NOT NULL DEFAULT '',
+ `cal_types` varchar(191) NOT NULL DEFAULT '',
PRIMARY KEY (`cal_id`),
KEY `cal_aid` (`cal_aid`),
KEY `cal_uid` (`cal_uid`),
KEY `cal_hash` (`cal_hash`),
KEY `cal_name` (`cal_name`),
KEY `cal_types` (`cal_types`)
-) ENGINE=MyISAM DEFAULT CHARSET=utf8;
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
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 ,
`channel_primary` tinyint(1) unsigned NOT NULL DEFAULT 0 ,
- `channel_name` char(255) NOT NULL DEFAULT '',
- `channel_address` char(255) NOT NULL DEFAULT '',
- `channel_guid` char(255) NOT NULL DEFAULT '',
+ `channel_name` char(191) NOT NULL DEFAULT '',
+ `channel_address` char(191) NOT NULL DEFAULT '',
+ `channel_guid` char(191) NOT NULL DEFAULT '',
`channel_guid_sig` text NOT NULL,
- `channel_hash` char(255) NOT NULL DEFAULT '',
+ `channel_hash` char(191) NOT NULL DEFAULT '',
`channel_timezone` char(128) NOT NULL DEFAULT 'UTC',
- `channel_location` char(255) NOT NULL DEFAULT '',
- `channel_theme` char(255) NOT NULL DEFAULT '',
- `channel_startpage` char(255) NOT NULL DEFAULT '',
+ `channel_location` char(191) NOT NULL DEFAULT '',
+ `channel_theme` char(191) NOT NULL DEFAULT '',
+ `channel_startpage` char(191) NOT NULL DEFAULT '',
`channel_pubkey` text NOT NULL,
`channel_prvkey` text NOT NULL,
`channel_notifyflags` int(10) unsigned NOT NULL DEFAULT 65535,
@@ -262,8 +262,8 @@ CREATE TABLE IF NOT EXISTS `channel` (
`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_group` char(255) NOT NULL DEFAULT '',
+ `channel_passwd_reset` char(191) NOT NULL DEFAULT '',
+ `channel_default_group` char(191) NOT NULL DEFAULT '',
`channel_allow_cid` mediumtext NOT NULL,
`channel_allow_gid` mediumtext NOT NULL,
`channel_deny_cid` mediumtext NOT NULL,
@@ -288,11 +288,11 @@ CREATE TABLE IF NOT EXISTS `channel` (
`channel_w_like` int(10) unsigned NOT NULL DEFAULT 0 ,
`channel_removed` tinyint(1) NOT NULL DEFAULT 0 ,
`channel_system` tinyint(1) NOT NULL DEFAULT 0 ,
- `channel_moved` char(255) NOT NULL DEFAULT '',
- `channel_password` varchar(255) NOT NULL,
- `channel_salt` varchar(255) NOT NULL,
+ `channel_moved` char(191) NOT NULL DEFAULT '',
+ `channel_password` varchar(191) NOT NULL,
+ `channel_salt` varchar(191) NOT NULL,
PRIMARY KEY (`channel_id`),
- UNIQUE KEY `channel_address_unique` (`channel_address`),
+ KEY `channel_address` (`channel_address`),
KEY `channel_account_id` (`channel_account_id`),
KEY `channel_primary` (`channel_primary`),
KEY `channel_name` (`channel_name`),
@@ -304,66 +304,48 @@ CREATE TABLE IF NOT EXISTS `channel` (
KEY `channel_max_anon_mail` (`channel_max_anon_mail`),
KEY `channel_max_friend_req` (`channel_max_friend_req`),
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`),
- KEY `channel_r_abook` (`channel_r_abook`),
- KEY `channel_w_stream` (`channel_w_stream`),
- KEY `channel_w_wall` (`channel_w_wall`),
- KEY `channel_w_tagwall` (`channel_w_tagwall`),
- KEY `channel_w_comment` (`channel_w_comment`),
- KEY `channel_w_mail` (`channel_w_mail`),
- KEY `channel_w_photos` (`channel_w_photos`),
- KEY `channel_w_chat` (`channel_w_chat`),
KEY `channel_guid` (`channel_guid`),
KEY `channel_hash` (`channel_hash`),
KEY `channel_expire_days` (`channel_expire_days`),
- KEY `channel_a_delegate` (`channel_a_delegate`),
- KEY `channel_r_storage` (`channel_r_storage`),
- 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_a_republish` (`channel_a_republish`),
KEY `channel_dirdate` (`channel_dirdate`),
- KEY `channel_w_like` (`channel_w_like`),
KEY `channel_removed` (`channel_removed`),
KEY `channel_system` (`channel_system`),
KEY `channel_lastpost` (`channel_lastpost`),
KEY `channel_moved` (`channel_moved`)
-) ENGINE=MyISAM DEFAULT CHARSET=utf8;
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
CREATE TABLE IF NOT EXISTS `chat` (
`chat_id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`chat_room` int(10) unsigned NOT NULL DEFAULT 0 ,
- `chat_xchan` char(255) NOT NULL DEFAULT '',
+ `chat_xchan` char(191) NOT NULL DEFAULT '',
`chat_text` mediumtext NOT NULL,
`created` datetime NOT NULL DEFAULT '0001-01-01 00:00:00',
PRIMARY KEY (`chat_id`),
KEY `chat_room` (`chat_room`),
KEY `chat_xchan` (`chat_xchan`),
KEY `created` (`created`)
-) ENGINE=MyISAM DEFAULT CHARSET=utf8;
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
CREATE TABLE IF NOT EXISTS `chatpresence` (
`cp_id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`cp_room` int(10) unsigned NOT NULL DEFAULT 0 ,
- `cp_xchan` char(255) NOT NULL DEFAULT '',
+ `cp_xchan` char(191) NOT NULL DEFAULT '',
`cp_last` datetime NOT NULL DEFAULT '0001-01-01 00:00:00',
- `cp_status` char(255) NOT NULL DEFAULT '',
+ `cp_status` char(191) NOT NULL DEFAULT '',
`cp_client` char(128) NOT NULL DEFAULT '',
PRIMARY KEY (`cp_id`),
KEY `cp_room` (`cp_room`),
KEY `cp_xchan` (`cp_xchan`),
KEY `cp_last` (`cp_last`),
KEY `cp_status` (`cp_status`)
-) ENGINE=MyISAM DEFAULT CHARSET=utf8;
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
CREATE TABLE IF NOT EXISTS `chatroom` (
`cr_id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`cr_aid` int(10) unsigned NOT NULL DEFAULT 0 ,
`cr_uid` int(10) unsigned NOT NULL DEFAULT 0 ,
- `cr_name` char(255) NOT NULL DEFAULT '',
+ `cr_name` char(191) NOT NULL DEFAULT '',
`cr_created` datetime NOT NULL DEFAULT '0001-01-01 00:00:00',
`cr_edited` datetime NOT NULL DEFAULT '0001-01-01 00:00:00',
`cr_expire` int(10) unsigned NOT NULL DEFAULT 0 ,
@@ -378,51 +360,51 @@ CREATE TABLE IF NOT EXISTS `chatroom` (
KEY `cr_created` (`cr_created`),
KEY `cr_edited` (`cr_edited`),
KEY `cr_expire` (`cr_expire`)
-) ENGINE=MyISAM DEFAULT CHARSET=utf8;
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
CREATE TABLE IF NOT EXISTS `clients` (
- `client_id` varchar(20) NOT NULL DEFAULT '',
- `pw` varchar(20) NOT NULL DEFAULT '',
+ `client_id` varchar(191) NOT NULL DEFAULT '',
+ `pw` varchar(191) NOT NULL DEFAULT '',
`redirect_uri` varchar(200) NOT NULL DEFAULT '',
`clname` text,
`icon` text,
`uid` int(11) NOT NULL DEFAULT 0 ,
PRIMARY KEY (`client_id`)
-) ENGINE=MyISAM DEFAULT CHARSET=utf8;
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
CREATE TABLE IF NOT EXISTS `config` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
- `cat` char(255) CHARACTER SET ascii NOT NULL DEFAULT '',
- `k` char(255) CHARACTER SET ascii NOT NULL DEFAULT '',
+ `cat` char(191) NOT NULL DEFAULT '',
+ `k` char(191) NOT NULL DEFAULT '',
`v` text NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `access` (`cat`,`k`)
-) ENGINE=MyISAM DEFAULT CHARSET=utf8;
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
CREATE TABLE IF NOT EXISTS `conv` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
- `guid` char(255) NOT NULL DEFAULT '',
+ `guid` char(191) NOT NULL DEFAULT '',
`recips` mediumtext NOT NULL,
`uid` int(11) NOT NULL DEFAULT 0 ,
- `creator` char(255) NOT NULL DEFAULT '',
+ `creator` char(191) NOT NULL DEFAULT '',
`created` datetime NOT NULL DEFAULT '0001-01-01 00:00:00',
`updated` datetime NOT NULL DEFAULT '0001-01-01 00:00:00',
`subject` mediumtext NOT NULL,
PRIMARY KEY (`id`),
KEY `created` (`created`),
KEY `updated` (`updated`)
-) ENGINE=MyISAM DEFAULT CHARSET=utf8;
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
CREATE TABLE IF NOT EXISTS `dreport` (
`dreport_id` int(11) NOT NULL AUTO_INCREMENT,
`dreport_channel` int(11) NOT NULL DEFAULT 0 ,
- `dreport_mid` char(255) NOT NULL DEFAULT '',
- `dreport_site` char(255) NOT NULL DEFAULT '',
- `dreport_recip` char(255) NOT NULL DEFAULT '',
- `dreport_result` char(255) NOT NULL DEFAULT '',
+ `dreport_mid` char(191) NOT NULL DEFAULT '',
+ `dreport_site` char(191) NOT NULL DEFAULT '',
+ `dreport_recip` char(191) NOT NULL DEFAULT '',
+ `dreport_result` char(191) NOT NULL DEFAULT '',
`dreport_time` datetime NOT NULL DEFAULT '0001-01-01 00:00:00',
- `dreport_xchan` char(255) NOT NULL DEFAULT '',
- `dreport_queue` char(255) NOT NULL DEFAULT '',
+ `dreport_xchan` char(191) NOT NULL DEFAULT '',
+ `dreport_queue` char(191) NOT NULL DEFAULT '',
PRIMARY KEY (`dreport_id`),
KEY `dreport_mid` (`dreport_mid`),
KEY `dreport_site` (`dreport_site`),
@@ -430,15 +412,15 @@ CREATE TABLE IF NOT EXISTS `dreport` (
KEY `dreport_xchan` (`dreport_xchan`),
KEY `dreport_queue` (`dreport_queue`),
KEY `dreport_channel` (`dreport_channel`)
-) ENGINE=MyISAM DEFAULT CHARSET=utf8;
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
CREATE TABLE IF NOT EXISTS `event` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`aid` int(10) unsigned NOT NULL DEFAULT 0 ,
`uid` int(11) NOT NULL DEFAULT 0 ,
`cal_id` int(11) unsigned NOT NULL DEFAULT 0 ,
- `event_xchan` char(255) NOT NULL DEFAULT '',
- `event_hash` char(255) NOT NULL DEFAULT '',
+ `event_xchan` char(191) NOT NULL DEFAULT '',
+ `event_hash` char(191) NOT NULL DEFAULT '',
`created` datetime NOT NULL DEFAULT '0001-01-01 00:00:00',
`edited` datetime NOT NULL DEFAULT '0001-01-01 00:00:00',
`dtstart` datetime NOT NULL DEFAULT '0001-01-01 00:00:00',
@@ -446,7 +428,7 @@ CREATE TABLE IF NOT EXISTS `event` (
`summary` text NOT NULL,
`description` text NOT NULL,
`location` text NOT NULL,
- `etype` char(255) NOT NULL DEFAULT '',
+ `etype` char(191) NOT NULL DEFAULT '',
`nofinish` tinyint(1) NOT NULL DEFAULT 0 ,
`adjust` tinyint(1) NOT NULL DEFAULT 1,
`dismissed` tinyint(1) NOT NULL DEFAULT 0 ,
@@ -454,7 +436,7 @@ CREATE TABLE IF NOT EXISTS `event` (
`allow_gid` mediumtext NOT NULL,
`deny_cid` mediumtext NOT NULL,
`deny_gid` mediumtext NOT NULL,
- `event_status` char(255) NOT NULL DEFAULT '',
+ `event_status` char(191) NOT NULL DEFAULT '',
`event_status_date` datetime NOT NULL DEFAULT '0001-01-01 00:00:00',
`event_percent` smallint(6) NOT NULL DEFAULT 0 ,
`event_repeat` text NOT NULL,
@@ -476,61 +458,61 @@ CREATE TABLE IF NOT EXISTS `event` (
KEY `event_status` (`event_status`),
KEY `event_sequence` (`event_sequence`),
KEY `event_priority` (`event_priority`)
-) ENGINE=MyISAM DEFAULT CHARSET=utf8;
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
CREATE TABLE IF NOT EXISTS `groups` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
- `hash` char(255) NOT NULL DEFAULT '',
+ `hash` char(191) NOT NULL DEFAULT '',
`uid` int(10) unsigned NOT NULL DEFAULT 0 ,
`visible` tinyint(1) NOT NULL DEFAULT 0 ,
`deleted` tinyint(1) NOT NULL DEFAULT 0 ,
- `gname` char(255) NOT NULL DEFAULT '',
+ `gname` char(191) NOT NULL DEFAULT '',
PRIMARY KEY (`id`),
KEY `uid` (`uid`),
KEY `visible` (`visible`),
KEY `deleted` (`deleted`),
KEY `hash` (`hash`),
KEY `gname` (`gname`)
-) ENGINE=MyISAM DEFAULT CHARSET=utf8;
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
CREATE TABLE IF NOT EXISTS `group_member` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`uid` int(10) unsigned NOT NULL DEFAULT 0 ,
`gid` int(10) unsigned NOT NULL DEFAULT 0 ,
- `xchan` char(255) NOT NULL DEFAULT '',
+ `xchan` char(191) NOT NULL DEFAULT '',
PRIMARY KEY (`id`),
KEY `uid` (`uid`),
KEY `gid` (`gid`),
KEY `xchan` (`xchan`)
-) ENGINE=MyISAM DEFAULT CHARSET=utf8;
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
CREATE TABLE IF NOT EXISTS `hook` (
`id` int(11) NOT NULL AUTO_INCREMENT,
- `hook` char(255) NOT NULL DEFAULT '',
- `file` char(255) NOT NULL DEFAULT '',
- `fn` char(255) NOT NULL DEFAULT '',
+ `hook` char(191) NOT NULL DEFAULT '',
+ `file` char(191) NOT NULL DEFAULT '',
+ `fn` char(191) NOT NULL DEFAULT '',
`priority` smallint NOT NULL DEFAULT 0 ,
`hook_version` int(11) NOT NULL DEFAULT 0 ,
PRIMARY KEY (`id`),
KEY `hook` (`hook`),
KEY `priority` (`priority`),
KEY `hook_version` (`hook_version`)
-) ENGINE=MyISAM DEFAULT CHARSET=utf8;
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
CREATE TABLE IF NOT EXISTS `hubloc` (
`hubloc_id` int(10) unsigned NOT NULL AUTO_INCREMENT,
- `hubloc_guid` char(255) NOT NULL DEFAULT '',
+ `hubloc_guid` char(191) NOT NULL DEFAULT '',
`hubloc_guid_sig` text NOT NULL,
- `hubloc_hash` char(255) NOT NULL DEFAULT '',
- `hubloc_addr` char(255) NOT NULL DEFAULT '',
+ `hubloc_hash` char(191) NOT NULL DEFAULT '',
+ `hubloc_addr` char(191) NOT NULL DEFAULT '',
`hubloc_network` char(32) 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` char(191) 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_host` char(191) NOT NULL DEFAULT '',
+ `hubloc_callback` char(191) NOT NULL DEFAULT '',
+ `hubloc_connect` char(191) NOT NULL DEFAULT '',
`hubloc_sitekey` text NOT NULL,
`hubloc_updated` datetime NOT NULL DEFAULT '0001-01-01 00:00:00',
`hubloc_connected` datetime NOT NULL DEFAULT '0001-01-01 00:00:00',
@@ -541,6 +523,7 @@ CREATE TABLE IF NOT EXISTS `hubloc` (
PRIMARY KEY (`hubloc_id`),
KEY `hubloc_url` (`hubloc_url`),
KEY `hubloc_guid` (`hubloc_guid`),
+ KEY `hubloc_hash` (`hubloc_hash`),
KEY `hubloc_flags` (`hubloc_flags`),
KEY `hubloc_connect` (`hubloc_connect`),
KEY `hubloc_host` (`hubloc_host`),
@@ -553,14 +536,14 @@ CREATE TABLE IF NOT EXISTS `hubloc` (
KEY `hubloc_orphancheck` (`hubloc_orphancheck`),
KEY `hubloc_deleted` (`hubloc_deleted`),
KEY `hubloc_error` (`hubloc_error`)
-) ENGINE=MyISAM DEFAULT CHARSET=utf8;
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
CREATE TABLE IF NOT EXISTS `iconfig` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`iid` int(11) NOT NULL DEFAULT 0 ,
- `cat` char(255) NOT NULL DEFAULT '',
- `k` char(255) NOT NULL DEFAULT '',
+ `cat` char(191) NOT NULL DEFAULT '',
+ `k` char(191) NOT NULL DEFAULT '',
`v` mediumtext NOT NULL,
`sharing` int(11) NOT NULL DEFAULT 0 ,
PRIMARY KEY (`id`),
@@ -568,16 +551,16 @@ CREATE TABLE IF NOT EXISTS `iconfig` (
KEY `cat` (`cat`),
KEY `k` (`k`),
KEY `sharing` (`sharing`)
-) ENGINE=MyISAM DEFAULT CHARSET=utf8;
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
CREATE TABLE IF NOT EXISTS `issue` (
`issue_id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`issue_created` datetime NOT NULL DEFAULT '0001-01-01 00:00:00',
`issue_updated` datetime NOT NULL DEFAULT '0001-01-01 00:00:00',
- `issue_assigned` char(255) NOT NULL DEFAULT '',
+ `issue_assigned` char(191) NOT NULL DEFAULT '',
`issue_priority` int(11) NOT NULL DEFAULT 0 ,
`issue_status` int(11) NOT NULL DEFAULT 0 ,
- `issue_component` char(255) NOT NULL DEFAULT '',
+ `issue_component` char(191) NOT NULL DEFAULT '',
PRIMARY KEY (`issue_id`),
KEY `issue_created` (`issue_created`),
KEY `issue_updated` (`issue_updated`),
@@ -585,16 +568,16 @@ CREATE TABLE IF NOT EXISTS `issue` (
KEY `issue_priority` (`issue_priority`),
KEY `issue_status` (`issue_status`),
KEY `issue_component` (`issue_component`)
-) ENGINE=MyISAM DEFAULT CHARSET=utf8;
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
CREATE TABLE IF NOT EXISTS `item` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
- `mid` char(255) CHARACTER SET ascii NOT NULL DEFAULT '',
+ `mid` char(191) NOT NULL DEFAULT '',
`aid` int(10) unsigned NOT NULL DEFAULT 0 ,
`uid` int(10) unsigned NOT NULL DEFAULT 0 ,
`parent` int(10) unsigned NOT NULL DEFAULT 0 ,
- `parent_mid` char(255) CHARACTER SET ascii NOT NULL DEFAULT '',
- `thr_parent` char(255) NOT NULL DEFAULT '',
+ `parent_mid` char(191) NOT NULL DEFAULT '',
+ `thr_parent` char(191) NOT NULL DEFAULT '',
`created` datetime NOT NULL DEFAULT '0001-01-01 00:00:00',
`edited` datetime NOT NULL DEFAULT '0001-01-01 00:00:00',
`expires` datetime NOT NULL DEFAULT '0001-01-01 00:00:00',
@@ -602,35 +585,35 @@ CREATE TABLE IF NOT EXISTS `item` (
`received` datetime NOT NULL DEFAULT '0001-01-01 00:00:00',
`changed` datetime NOT NULL DEFAULT '0001-01-01 00:00:00',
`comments_closed` datetime NOT NULL DEFAULT '0001-01-01 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 '',
+ `owner_xchan` char(191) NOT NULL DEFAULT '',
+ `author_xchan` char(191) NOT NULL DEFAULT '',
+ `source_xchan` char(191) NOT NULL DEFAULT '',
+ `mimetype` char(191) NOT NULL DEFAULT '',
`title` text NOT NULL,
`body` mediumtext NOT NULL,
`html` mediumtext NOT NULL,
- `app` char(255) NOT NULL DEFAULT '',
+ `app` char(191) NOT NULL DEFAULT '',
`lang` char(64) NOT NULL DEFAULT '',
`revision` int(10) unsigned NOT NULL DEFAULT 0 ,
- `verb` char(255) NOT NULL DEFAULT '',
- `obj_type` char(255) NOT NULL DEFAULT '',
+ `verb` char(191) NOT NULL DEFAULT '',
+ `obj_type` char(191) NOT NULL DEFAULT '',
`obj` text NOT NULL,
- `tgt_type` char(255) NOT NULL DEFAULT '',
+ `tgt_type` char(191) NOT NULL DEFAULT '',
`target` text NOT NULL,
- `layout_mid` char(255) NOT NULL DEFAULT '',
+ `layout_mid` char(191) NOT NULL DEFAULT '',
`postopts` text NOT NULL,
`route` text NOT NULL,
- `llink` char(255) NOT NULL DEFAULT '',
- `plink` char(255) NOT NULL DEFAULT '',
- `resource_id` char(255) NOT NULL DEFAULT '',
+ `llink` char(191) NOT NULL DEFAULT '',
+ `plink` char(191) NOT NULL DEFAULT '',
+ `resource_id` char(191) NOT NULL DEFAULT '',
`resource_type` char(16) NOT NULL DEFAULT '',
`attach` mediumtext NOT NULL,
`sig` text NOT NULL,
`diaspora_meta` mediumtext NOT NULL,
- `location` char(255) NOT NULL DEFAULT '',
- `coord` char(255) NOT NULL DEFAULT '',
- `public_policy` char(255) NOT NULL DEFAULT '',
- `comment_policy` char(255) NOT NULL DEFAULT '',
+ `location` char(191) NOT NULL DEFAULT '',
+ `coord` char(191) NOT NULL DEFAULT '',
+ `public_policy` char(191) NOT NULL DEFAULT '',
+ `comment_policy` char(191) NOT NULL DEFAULT '',
`allow_cid` mediumtext NOT NULL,
`allow_gid` mediumtext NOT NULL,
`deny_cid` mediumtext NOT NULL,
@@ -677,6 +660,7 @@ CREATE TABLE IF NOT EXISTS `item` (
KEY `item_flags` (`item_flags`),
KEY `commented` (`commented`),
KEY `verb` (`verb`),
+ KEY `obj_type` (`obj_type`),
KEY `item_private` (`item_private`),
KEY `llink` (`llink`),
KEY `expires` (`expires`),
@@ -712,38 +696,32 @@ CREATE TABLE IF NOT EXISTS `item` (
KEY `item_unpublished` (`item_unpublished`),
KEY `item_delayed` (`item_delayed`),
KEY `item_pending_remove` (`item_pending_remove`),
- KEY `item_blocked` (`item_blocked`),
- FULLTEXT KEY `title` (`title`),
- FULLTEXT KEY `body` (`body`),
- FULLTEXT KEY `allow_cid` (`allow_cid`),
- FULLTEXT KEY `allow_gid` (`allow_gid`),
- FULLTEXT KEY `deny_cid` (`deny_cid`),
- FULLTEXT KEY `deny_gid` (`deny_gid`)
-) ENGINE=MyISAM DEFAULT CHARSET=utf8;
+ KEY `item_blocked` (`item_blocked`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
CREATE TABLE IF NOT EXISTS `item_id` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`iid` int(11) NOT NULL DEFAULT 0 ,
`uid` int(11) NOT NULL DEFAULT 0 ,
- `sid` char(255) NOT NULL DEFAULT '',
- `service` char(255) NOT NULL DEFAULT '',
+ `sid` char(191) NOT NULL DEFAULT '',
+ `service` char(191) NOT NULL DEFAULT '',
PRIMARY KEY (`id`),
KEY `uid` (`uid`),
KEY `sid` (`sid`),
KEY `service` (`service`),
KEY `iid` (`iid`)
-) ENGINE=MyISAM DEFAULT CHARSET=utf8;
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
CREATE TABLE IF NOT EXISTS `likes` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`channel_id` int(10) unsigned NOT NULL DEFAULT 0 ,
- `liker` char(128) NOT NULL DEFAULT '',
- `likee` char(128) NOT NULL DEFAULT '',
+ `liker` char(191) NOT NULL DEFAULT '',
+ `likee` char(191) NOT NULL DEFAULT '',
`iid` int(11) unsigned NOT NULL DEFAULT 0 ,
- `i_mid` char(255) NOT NULL DEFAULT '',
- `verb` char(255) NOT NULL DEFAULT '',
- `target_type` char(255) NOT NULL DEFAULT '',
- `target_id` char(128) NOT NULL DEFAULT '',
+ `i_mid` char(191) NOT NULL DEFAULT '',
+ `verb` char(191) NOT NULL DEFAULT '',
+ `target_type` char(191) NOT NULL DEFAULT '',
+ `target_id` char(191) NOT NULL DEFAULT '',
`target` mediumtext NOT NULL,
PRIMARY KEY (`id`),
KEY `liker` (`liker`),
@@ -754,15 +732,15 @@ CREATE TABLE IF NOT EXISTS `likes` (
KEY `target_type` (`target_type`),
KEY `channel_id` (`channel_id`),
KEY `target_id` (`target_id`)
-) ENGINE=MyISAM DEFAULT CHARSET=utf8;
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
CREATE TABLE IF NOT EXISTS `mail` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`convid` int(10) unsigned NOT NULL DEFAULT 0 ,
- `conv_guid` char(255) NOT NULL DEFAULT '',
+ `conv_guid` char(191) NOT NULL DEFAULT '',
`mail_flags` int(10) unsigned NOT NULL DEFAULT 0 ,
- `from_xchan` char(255) NOT NULL DEFAULT '',
- `to_xchan` char(255) NOT NULL DEFAULT '',
+ `from_xchan` char(191) NOT NULL DEFAULT '',
+ `to_xchan` char(191) NOT NULL DEFAULT '',
`account_id` int(10) unsigned NOT NULL DEFAULT 0 ,
`channel_id` int(10) unsigned NOT NULL DEFAULT 0 ,
`mail_mimetype` char(64) NOT NULL DEFAULT 'text/bbcode',
@@ -770,8 +748,8 @@ CREATE TABLE IF NOT EXISTS `mail` (
`body` mediumtext NOT NULL,
`sig` text NOT NULL,
`attach` mediumtext NOT NULL,
- `mid` char(255) NOT NULL DEFAULT '',
- `parent_mid` char(255) NOT NULL DEFAULT '',
+ `mid` char(191) NOT NULL DEFAULT '',
+ `parent_mid` char(191) NOT NULL DEFAULT '',
`mail_deleted` tinyint(4) NOT NULL DEFAULT 0 ,
`mail_replied` tinyint(4) NOT NULL DEFAULT 0 ,
`mail_isreply` tinyint(4) NOT NULL DEFAULT 0 ,
@@ -799,13 +777,13 @@ CREATE TABLE IF NOT EXISTS `mail` (
KEY `mail_seen` (`mail_seen`),
KEY `mail_recalled` (`mail_recalled`),
KEY `mail_obscured` (`mail_obscured`)
-) ENGINE=MyISAM DEFAULT CHARSET=utf8;
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
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_name` char(191) NOT NULL DEFAULT '',
+ `menu_desc` char(191) NOT NULL DEFAULT '',
`menu_flags` int(11) NOT NULL DEFAULT 0 ,
`menu_created` datetime NOT NULL DEFAULT '0001-01-01 00:00:00',
`menu_edited` datetime NOT NULL DEFAULT '0001-01-01 00:00:00',
@@ -815,12 +793,12 @@ CREATE TABLE IF NOT EXISTS `menu` (
KEY `menu_flags` (`menu_flags`),
KEY `menu_created` (`menu_created`),
KEY `menu_edited` (`menu_edited`)
-) ENGINE=MyISAM DEFAULT CHARSET=utf8;
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
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_link` char(191) NOT NULL DEFAULT '',
+ `mitem_desc` char(191) NOT NULL DEFAULT '',
`mitem_flags` int(11) NOT NULL DEFAULT 0 ,
`allow_cid` mediumtext NOT NULL,
`allow_gid` mediumtext NOT NULL,
@@ -833,23 +811,23 @@ CREATE TABLE IF NOT EXISTS `menu_item` (
KEY `mitem_channel_id` (`mitem_channel_id`),
KEY `mitem_menu_id` (`mitem_menu_id`),
KEY `mitem_flags` (`mitem_flags`)
-) ENGINE=MyISAM DEFAULT CHARSET=utf8;
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
CREATE TABLE IF NOT EXISTS `notify` (
`id` int(11) NOT NULL AUTO_INCREMENT,
- `hash` char(64) NOT NULL DEFAULT '',
- `xname` char(255) NOT NULL DEFAULT '',
- `url` char(255) NOT NULL DEFAULT '',
- `photo` char(255) NOT NULL DEFAULT '',
+ `hash` char(191) NOT NULL DEFAULT '',
+ `xname` char(191) NOT NULL DEFAULT '',
+ `url` char(191) NOT NULL DEFAULT '',
+ `photo` char(191) NOT NULL DEFAULT '',
`created` datetime NOT NULL DEFAULT '0001-01-01 00:00:00',
`msg` mediumtext NOT NULL,
`aid` int(11) NOT NULL DEFAULT 0 ,
`uid` int(11) NOT NULL DEFAULT 0 ,
- `link` char(255) NOT NULL DEFAULT '',
- `parent` char(255) NOT NULL DEFAULT '',
+ `link` char(191) NOT NULL DEFAULT '',
+ `parent` char(191) NOT NULL DEFAULT '',
`seen` tinyint(1) NOT NULL DEFAULT 0 ,
`ntype` int(11) NOT NULL DEFAULT 0 ,
- `verb` char(255) NOT NULL DEFAULT '',
+ `verb` char(191) NOT NULL DEFAULT '',
`otype` char(16) NOT NULL DEFAULT '',
PRIMARY KEY (`id`),
KEY `ntype` (`ntype`),
@@ -861,18 +839,18 @@ CREATE TABLE IF NOT EXISTS `notify` (
KEY `link` (`link`),
KEY `otype` (`otype`),
KEY `aid` (`aid`)
-) ENGINE=MyISAM DEFAULT CHARSET=utf8;
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
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_verb` char(191) NOT NULL DEFAULT '',
`obj_type` int(10) unsigned NOT NULL DEFAULT 0 ,
- `obj_obj` char(255) NOT NULL DEFAULT '',
+ `obj_obj` char(191) NOT NULL DEFAULT '',
`obj_channel` int(10) unsigned NOT NULL DEFAULT 0 ,
- `obj_term` char(255) NOT NULL DEFAULT '',
- `obj_url` char(255) NOT NULL DEFAULT '',
- `obj_imgurl` char(255) NOT NULL DEFAULT '',
+ `obj_term` char(191) NOT NULL DEFAULT '',
+ `obj_url` char(191) NOT NULL DEFAULT '',
+ `obj_imgurl` char(191) NOT NULL DEFAULT '',
`obj_created` datetime NOT NULL DEFAULT '0001-01-01 00:00:00',
`obj_edited` datetime NOT NULL DEFAULT '0001-01-01 00:00:00',
`obj_quantity` int(11) NOT NULL DEFAULT 0 ,
@@ -892,14 +870,14 @@ CREATE TABLE IF NOT EXISTS `obj` (
KEY `obj_edited` (`obj_edited`),
KEY `obj_quantity` (`obj_quantity`),
KEY `obj_obj` (`obj_obj`)
-) ENGINE=MyISAM DEFAULT CHARSET=utf8;
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
CREATE TABLE IF NOT EXISTS `outq` (
- `outq_hash` char(255) NOT NULL,
+ `outq_hash` char(191) 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_posturl` char(191) NOT NULL DEFAULT '',
`outq_async` tinyint(1) NOT NULL DEFAULT 0 ,
`outq_delivered` tinyint(1) NOT NULL DEFAULT 0 ,
`outq_created` datetime NOT NULL DEFAULT '0001-01-01 00:00:00',
@@ -918,31 +896,30 @@ CREATE TABLE IF NOT EXISTS `outq` (
KEY `outq_async` (`outq_async`),
KEY `outq_delivered` (`outq_delivered`),
KEY `outq_priority` (`outq_priority`)
-) ENGINE=MyISAM DEFAULT CHARSET=utf8;
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
CREATE TABLE IF NOT EXISTS `pconfig` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`uid` int(11) NOT NULL DEFAULT 0 ,
- `cat` char(255) CHARACTER SET ascii NOT NULL DEFAULT '',
- `k` char(255) CHARACTER SET ascii NOT NULL DEFAULT '',
+ `cat` char(191) NOT NULL DEFAULT '',
+ `k` char(191) NOT NULL DEFAULT '',
`v` mediumtext NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `access` (`uid`,`cat`,`k`)
-) ENGINE=MyISAM DEFAULT CHARSET=utf8;
-
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
CREATE TABLE IF NOT EXISTS `photo` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`aid` int(10) unsigned NOT NULL DEFAULT 0 ,
`uid` int(10) unsigned NOT NULL DEFAULT 0 ,
- `xchan` char(255) NOT NULL DEFAULT '',
- `resource_id` char(255) NOT NULL DEFAULT '',
+ `xchan` char(191) NOT NULL DEFAULT '',
+ `resource_id` char(191) NOT NULL DEFAULT '',
`created` datetime NOT NULL DEFAULT '0001-01-01 00:00:00',
`edited` datetime NOT NULL DEFAULT '0001-01-01 00:00:00',
- `title` char(255) NOT NULL DEFAULT '',
+ `title` char(191) NOT NULL DEFAULT '',
`description` text NOT NULL,
- `album` char(255) NOT NULL DEFAULT '',
- `filename` char(255) NOT NULL DEFAULT '',
+ `album` char(191) NOT NULL DEFAULT '',
+ `filename` char(191) NOT NULL DEFAULT '',
`mimetype` char(128) NOT NULL DEFAULT 'image/jpeg',
`height` smallint(6) NOT NULL DEFAULT 0 ,
`width` smallint(6) NOT NULL DEFAULT 0 ,
@@ -974,7 +951,7 @@ CREATE TABLE IF NOT EXISTS `photo` (
KEY `is_nsfw` (`is_nsfw`),
KEY `os_storage` (`os_storage`),
KEY `photo_usage` (`photo_usage`)
-) ENGINE=MyISAM DEFAULT CHARSET=utf8;
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
CREATE TABLE IF NOT EXISTS `poll` (
`poll_id` int(10) unsigned NOT NULL AUTO_INCREMENT,
@@ -986,7 +963,7 @@ CREATE TABLE IF NOT EXISTS `poll` (
KEY `poll_channel` (`poll_channel`),
KEY `poll_flags` (`poll_flags`),
KEY `poll_votes` (`poll_votes`)
-) ENGINE=MyISAM DEFAULT CHARSET=utf8;
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
CREATE TABLE IF NOT EXISTS `poll_elm` (
`pelm_id` int(10) unsigned NOT NULL AUTO_INCREMENT,
@@ -997,62 +974,62 @@ CREATE TABLE IF NOT EXISTS `poll_elm` (
PRIMARY KEY (`pelm_id`),
KEY `pelm_poll` (`pelm_poll`),
KEY `pelm_result` (`pelm_result`)
-) ENGINE=MyISAM DEFAULT CHARSET=utf8;
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
CREATE TABLE IF NOT EXISTS `profdef` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
- `field_name` char(255) NOT NULL DEFAULT '',
+ `field_name` char(191) NOT NULL DEFAULT '',
`field_type` char(16) NOT NULL DEFAULT '',
- `field_desc` char(255) NOT NULL DEFAULT '',
- `field_help` char(255) NOT NULL DEFAULT '',
+ `field_desc` char(191) NOT NULL DEFAULT '',
+ `field_help` char(191) NOT NULL DEFAULT '',
`field_inputs` mediumtext NOT NULL,
PRIMARY KEY (`id`),
KEY `field_name` (`field_name`)
-) ENGINE=MyISAM DEFAULT CHARSET=utf8;
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
CREATE TABLE IF NOT EXISTS `profext` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`channel_id` int(10) unsigned NOT NULL DEFAULT 0 ,
- `hash` char(255) NOT NULL DEFAULT '',
- `k` char(255) NOT NULL DEFAULT '',
+ `hash` char(191) NOT NULL DEFAULT '',
+ `k` char(191) NOT NULL DEFAULT '',
`v` mediumtext NOT NULL,
PRIMARY KEY (`id`),
KEY `channel_id` (`channel_id`),
KEY `hash` (`hash`),
KEY `k` (`k`)
-) ENGINE=MyISAM DEFAULT CHARSET=utf8;
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
CREATE TABLE IF NOT EXISTS `profile` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`profile_guid` char(64) NOT NULL DEFAULT '',
`aid` int(10) unsigned NOT NULL DEFAULT 0 ,
`uid` int(11) NOT NULL DEFAULT 0 ,
- `profile_name` char(255) NOT NULL DEFAULT '',
+ `profile_name` char(191) NOT NULL DEFAULT '',
`is_default` tinyint(1) NOT NULL DEFAULT 0 ,
`hide_friends` tinyint(1) NOT NULL DEFAULT 0 ,
- `fullname` char(255) NOT NULL DEFAULT '',
- `pdesc` char(255) NOT NULL DEFAULT '',
+ `fullname` char(191) NOT NULL DEFAULT '',
+ `pdesc` char(191) NOT NULL DEFAULT '',
`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 DEFAULT '',
- `locality` char(255) NOT NULL DEFAULT '',
- `region` char(255) NOT NULL DEFAULT '',
+ `dob_tz` char(191) NOT NULL DEFAULT 'UTC',
+ `address` char(191) NOT NULL DEFAULT '',
+ `locality` char(191) NOT NULL DEFAULT '',
+ `region` char(191) NOT NULL DEFAULT '',
`postal_code` char(32) NOT NULL DEFAULT '',
- `country_name` char(255) NOT NULL DEFAULT '',
- `hometown` char(255) NOT NULL DEFAULT '',
+ `country_name` char(191) NOT NULL DEFAULT '',
+ `hometown` char(191) NOT NULL DEFAULT '',
`gender` char(32) NOT NULL DEFAULT '',
- `marital` char(255) NOT NULL DEFAULT '',
+ `marital` char(191) NOT NULL DEFAULT '',
`partner` text NOT NULL,
`howlong` datetime NOT NULL DEFAULT '0001-01-01 00:00:00',
- `sexual` char(255) NOT NULL DEFAULT '',
- `politic` char(255) NOT NULL DEFAULT '',
- `religion` char(255) NOT NULL DEFAULT '',
+ `sexual` char(191) NOT NULL DEFAULT '',
+ `politic` char(191) NOT NULL DEFAULT '',
+ `religion` char(191) NOT NULL DEFAULT '',
`keywords` text NOT NULL,
`likes` text NOT NULL,
`dislikes` text NOT NULL,
`about` text NOT NULL,
- `summary` char(255) NOT NULL DEFAULT '',
+ `summary` char(191) NOT NULL DEFAULT '',
`music` text NOT NULL,
`book` text NOT NULL,
`tv` text NOT NULL,
@@ -1063,9 +1040,9 @@ CREATE TABLE IF NOT EXISTS `profile` (
`education` text NOT NULL,
`contact` text NOT NULL,
`channels` text NOT NULL,
- `homepage` char(255) NOT NULL DEFAULT '',
- `photo` char(255) NOT NULL DEFAULT '',
- `thumb` char(255) NOT NULL DEFAULT '',
+ `homepage` char(191) NOT NULL DEFAULT '',
+ `photo` char(191) NOT NULL DEFAULT '',
+ `thumb` char(191) NOT NULL DEFAULT '',
`publish` tinyint(1) NOT NULL DEFAULT 0 ,
`profile_vcard` text NOT NULL,
PRIMARY KEY (`id`),
@@ -1083,14 +1060,14 @@ CREATE TABLE IF NOT EXISTS `profile` (
KEY `postal_code` (`postal_code`),
KEY `country_name` (`country_name`),
KEY `profile_guid` (`profile_guid`)
-) ENGINE=MyISAM DEFAULT CHARSET=utf8;
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
CREATE TABLE IF NOT EXISTS `profile_check` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`uid` int(10) unsigned NOT NULL DEFAULT 0 ,
`cid` int(10) unsigned NOT NULL DEFAULT 0 ,
- `dfrn_id` char(255) NOT NULL DEFAULT '',
- `sec` char(255) NOT NULL DEFAULT '',
+ `dfrn_id` char(191) NOT NULL DEFAULT '',
+ `sec` char(191) NOT NULL DEFAULT '',
`expire` int(11) NOT NULL DEFAULT 0 ,
PRIMARY KEY (`id`),
KEY `uid` (`uid`),
@@ -1098,41 +1075,41 @@ CREATE TABLE IF NOT EXISTS `profile_check` (
KEY `dfrn_id` (`dfrn_id`),
KEY `sec` (`sec`),
KEY `expire` (`expire`)
-) ENGINE=MyISAM DEFAULT CHARSET=utf8;
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
CREATE TABLE IF NOT EXISTS `register` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
- `hash` char(255) NOT NULL DEFAULT '',
+ `hash` char(191) NOT NULL DEFAULT '',
`created` datetime NOT NULL DEFAULT '0001-01-01 00:00:00',
`uid` int(10) unsigned NOT NULL DEFAULT 0 ,
- `password` char(255) NOT NULL DEFAULT '',
+ `password` char(191) NOT NULL DEFAULT '',
`lang` char(16) NOT NULL DEFAULT '',
PRIMARY KEY (`id`),
KEY `hash` (`hash`),
KEY `created` (`created`),
KEY `uid` (`uid`)
-) ENGINE=MyISAM DEFAULT CHARSET=utf8;
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
CREATE TABLE IF NOT EXISTS `session` (
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
- `sid` char(255) NOT NULL DEFAULT '',
+ `sid` char(191) NOT NULL DEFAULT '',
`sess_data` text NOT NULL,
`expire` bigint(20) unsigned NOT NULL DEFAULT 0 ,
PRIMARY KEY (`id`),
KEY `sid` (`sid`),
KEY `expire` (`expire`)
-) ENGINE=MyISAM DEFAULT CHARSET=utf8;
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
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 '',
+ `share_xchan` char(191) 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;
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
CREATE TABLE IF NOT EXISTS `sign` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
@@ -1140,28 +1117,28 @@ CREATE TABLE IF NOT EXISTS `sign` (
`retract_iid` int(10) unsigned NOT NULL DEFAULT 0 ,
`signed_text` mediumtext NOT NULL,
`signature` text NOT NULL,
- `signer` char(255) NOT NULL DEFAULT '',
+ `signer` char(191) NOT NULL DEFAULT '',
PRIMARY KEY (`id`),
KEY `iid` (`iid`),
KEY `retract_iid` (`retract_iid`)
-) ENGINE=MyISAM DEFAULT CHARSET=utf8;
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
CREATE TABLE IF NOT EXISTS `site` (
- `site_url` char(255) NOT NULL,
+ `site_url` char(191) NOT NULL,
`site_access` int(11) NOT NULL DEFAULT 0 ,
`site_flags` int(11) NOT NULL DEFAULT 0 ,
`site_update` datetime NOT NULL DEFAULT '0001-01-01 00:00:00',
`site_pull` datetime NOT NULL DEFAULT '0001-01-01 00:00:00',
`site_sync` datetime NOT NULL DEFAULT '0001-01-01 00:00:00',
- `site_directory` char(255) NOT NULL DEFAULT '',
+ `site_directory` char(191) 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 '',
- `site_realm` char(255) NOT NULL DEFAULT '',
+ `site_sellpage` char(191) NOT NULL DEFAULT '',
+ `site_location` char(191) NOT NULL DEFAULT '',
+ `site_realm` char(191) NOT NULL DEFAULT '',
`site_valid` smallint NOT NULL DEFAULT 0 ,
`site_dead` smallint NOT NULL DEFAULT 0 ,
`site_type` smallint NOT NULL DEFAULT 0 ,
- `site_project` char(255) NOT NULL DEFAULT '',
+ `site_project` char(191) NOT NULL DEFAULT '',
`site_version` varchar(32) NOT NULL DEFAULT '',
`site_crypto` text NOT NULL,
PRIMARY KEY (`site_url`),
@@ -1177,29 +1154,29 @@ CREATE TABLE IF NOT EXISTS `site` (
KEY `site_dead` (`site_dead`),
KEY `site_type` (`site_type`),
KEY `site_project` (`site_project`)
-) ENGINE=MyISAM DEFAULT CHARSET=utf8;
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
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_channel_xchan` char(191) NOT NULL DEFAULT '',
+ `src_xchan` char(191) NOT NULL DEFAULT '',
`src_patt` mediumtext NOT NULL,
`src_tag` 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;
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
CREATE TABLE IF NOT EXISTS `sys_perms` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
- `cat` char(255) NOT NULL DEFAULT '',
- `k` char(255) NOT NULL DEFAULT '',
+ `cat` char(191) NOT NULL DEFAULT '',
+ `k` char(191) NOT NULL DEFAULT '',
`v` mediumtext NOT NULL,
`public_perm` tinyint(1) unsigned NOT NULL DEFAULT 0 ,
PRIMARY KEY (`id`)
-) ENGINE=MyISAM DEFAULT CHARSET=utf8;
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
CREATE TABLE IF NOT EXISTS `term` (
`tid` int(10) unsigned NOT NULL AUTO_INCREMENT,
@@ -1208,11 +1185,11 @@ CREATE TABLE IF NOT EXISTS `term` (
`oid` int(10) unsigned NOT NULL DEFAULT 0 ,
`otype` tinyint(3) unsigned NOT NULL DEFAULT 0 ,
`ttype` tinyint(3) unsigned NOT NULL DEFAULT 0 ,
- `term` char(255) NOT NULL DEFAULT '',
- `url` char(255) NOT NULL DEFAULT '',
- `imgurl` char(255) NOT NULL DEFAULT '',
- `term_hash` char(255) NOT NULL DEFAULT '',
- `parent_hash` char(255) NOT NULL DEFAULT '',
+ `term` char(191) NOT NULL DEFAULT '',
+ `url` char(191) NOT NULL DEFAULT '',
+ `imgurl` char(191) NOT NULL DEFAULT '',
+ `term_hash` char(191) NOT NULL DEFAULT '',
+ `parent_hash` char(191) NOT NULL DEFAULT '',
PRIMARY KEY (`tid`),
KEY `oid` (`oid`),
KEY `otype` (`otype`),
@@ -1223,12 +1200,12 @@ CREATE TABLE IF NOT EXISTS `term` (
KEY `imgurl` (`imgurl`),
KEY `term_hash` (`term_hash`),
KEY `parent_hash` (`parent_hash`)
-) ENGINE=MyISAM DEFAULT CHARSET=utf8;
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
CREATE TABLE IF NOT EXISTS `tokens` (
- `id` varchar(40) NOT NULL DEFAULT '',
+ `id` varchar(191) NOT NULL DEFAULT '',
`secret` text NOT NULL,
- `client_id` varchar(20) NOT NULL DEFAULT '',
+ `client_id` varchar(191) NOT NULL DEFAULT '',
`expires` bigint(20) unsigned NOT NULL DEFAULT 0 ,
`auth_scope` varchar(512) NOT NULL DEFAULT '',
`uid` int(11) NOT NULL DEFAULT 0 ,
@@ -1236,16 +1213,16 @@ CREATE TABLE IF NOT EXISTS `tokens` (
KEY `client_id` (`client_id`),
KEY `expires` (`expires`),
KEY `uid` (`uid`)
-) ENGINE=MyISAM DEFAULT CHARSET=utf8;
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
CREATE TABLE IF NOT EXISTS `updates` (
`ud_id` int(10) unsigned NOT NULL AUTO_INCREMENT,
- `ud_hash` char(128) NOT NULL DEFAULT '',
- `ud_guid` char(255) NOT NULL DEFAULT '',
+ `ud_hash` char(191) NOT NULL DEFAULT '',
+ `ud_guid` char(191) NOT NULL DEFAULT '',
`ud_date` datetime NOT NULL DEFAULT '0001-01-01 00:00:00',
`ud_last` datetime NOT NULL DEFAULT '0001-01-01 00:00:00',
`ud_flags` int(11) NOT NULL DEFAULT 0 ,
- `ud_addr` char(255) NOT NULL DEFAULT '',
+ `ud_addr` char(191) NOT NULL DEFAULT '',
PRIMARY KEY (`ud_id`),
KEY `ud_date` (`ud_date`),
KEY `ud_guid` (`ud_guid`),
@@ -1253,14 +1230,14 @@ CREATE TABLE IF NOT EXISTS `updates` (
KEY `ud_flags` (`ud_flags`),
KEY `ud_addr` (`ud_addr`),
KEY `ud_last` (`ud_last`)
-) ENGINE=MyISAM DEFAULT CHARSET=utf8;
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
CREATE TABLE IF NOT EXISTS `verify` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`channel` int(10) unsigned NOT NULL DEFAULT 0 ,
`vtype` char(32) NOT NULL DEFAULT '',
- `token` char(255) NOT NULL DEFAULT '',
- `meta` char(255) NOT NULL DEFAULT '',
+ `token` char(191) NOT NULL DEFAULT '',
+ `meta` char(191) NOT NULL DEFAULT '',
`created` datetime NOT NULL DEFAULT '0001-01-01 00:00:00',
PRIMARY KEY (`id`),
KEY `channel` (`channel`),
@@ -1268,37 +1245,37 @@ CREATE TABLE IF NOT EXISTS `verify` (
KEY `token` (`token`),
KEY `meta` (`meta`),
KEY `created` (`created`)
-) ENGINE=MyISAM DEFAULT CHARSET=utf8;
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
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 '',
+ `vote_xchan` char(191) 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;
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
CREATE TABLE IF NOT EXISTS `xchan` (
- `xchan_hash` char(255) NOT NULL,
- `xchan_guid` char(255) NOT NULL DEFAULT '',
+ `xchan_hash` char(191) NOT NULL,
+ `xchan_guid` char(191) NOT NULL DEFAULT '',
`xchan_guid_sig` text NOT NULL,
`xchan_pubkey` text NOT NULL,
`xchan_photo_mimetype` char(32) NOT NULL DEFAULT 'image/jpeg',
- `xchan_photo_l` char(255) NOT NULL DEFAULT '',
- `xchan_photo_m` char(255) NOT NULL DEFAULT '',
- `xchan_photo_s` char(255) NOT NULL DEFAULT '',
- `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_photo_l` char(191) NOT NULL DEFAULT '',
+ `xchan_photo_m` char(191) NOT NULL DEFAULT '',
+ `xchan_photo_s` char(191) NOT NULL DEFAULT '',
+ `xchan_addr` char(191) NOT NULL DEFAULT '',
+ `xchan_url` char(191) NOT NULL DEFAULT '',
+ `xchan_connurl` char(191) NOT NULL DEFAULT '',
+ `xchan_follow` char(191) NOT NULL DEFAULT '',
+ `xchan_connpage` char(191) NOT NULL DEFAULT '',
+ `xchan_name` char(191) NOT NULL DEFAULT '',
+ `xchan_network` char(191) NOT NULL DEFAULT '',
+ `xchan_instance_url` char(191) NOT NULL DEFAULT '',
`xchan_flags` int(10) unsigned NOT NULL DEFAULT 0 ,
`xchan_photo_date` datetime NOT NULL DEFAULT '0001-01-01 00:00:00',
`xchan_name_date` datetime NOT NULL DEFAULT '0001-01-01 00:00:00',
@@ -1326,46 +1303,46 @@ CREATE TABLE IF NOT EXISTS `xchan` (
KEY `xchan_system` (`xchan_system`),
KEY `xchan_pubforum` (`xchan_pubforum`),
KEY `xchan_deleted` (`xchan_deleted`)
-) ENGINE=MyISAM DEFAULT CHARSET=utf8;
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
CREATE TABLE IF NOT EXISTS `xchat` (
`xchat_id` int(10) unsigned NOT NULL AUTO_INCREMENT,
- `xchat_url` char(255) NOT NULL DEFAULT '',
- `xchat_desc` char(255) NOT NULL DEFAULT '',
- `xchat_xchan` char(255) NOT NULL DEFAULT '',
+ `xchat_url` char(191) NOT NULL DEFAULT '',
+ `xchat_desc` char(191) NOT NULL DEFAULT '',
+ `xchat_xchan` char(191) NOT NULL DEFAULT '',
`xchat_edited` datetime NOT NULL DEFAULT '0001-01-01 00:00:00',
PRIMARY KEY (`xchat_id`),
KEY `xchat_url` (`xchat_url`),
KEY `xchat_desc` (`xchat_desc`),
KEY `xchat_xchan` (`xchat_xchan`),
KEY `xchat_edited` (`xchat_edited`)
-) ENGINE=MyISAM DEFAULT CHARSET=utf8;
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
CREATE TABLE IF NOT EXISTS `xconfig` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
- `xchan` char(255) NOT NULL DEFAULT '',
- `cat` char(255) NOT NULL DEFAULT '',
- `k` char(255) NOT NULL DEFAULT '',
+ `xchan` char(191) NOT NULL DEFAULT '',
+ `cat` char(191) NOT NULL DEFAULT '',
+ `k` char(191) NOT NULL DEFAULT '',
`v` mediumtext NOT NULL,
PRIMARY KEY (`id`),
KEY `xchan` (`xchan`),
KEY `cat` (`cat`),
KEY `k` (`k`)
-) ENGINE=MyISAM DEFAULT CHARSET=utf8;
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
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 '',
+ `xchan` char(191) NOT NULL DEFAULT '',
PRIMARY KEY (`id`),
KEY `uid` (`uid`),
KEY `xchan` (`xchan`)
-) ENGINE=MyISAM DEFAULT CHARSET=utf8;
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
CREATE TABLE IF NOT EXISTS `xlink` (
`xlink_id` int(10) unsigned NOT NULL AUTO_INCREMENT,
- `xlink_xchan` char(255) NOT NULL DEFAULT '',
- `xlink_link` char(255) NOT NULL DEFAULT '',
+ `xlink_xchan` char(191) NOT NULL DEFAULT '',
+ `xlink_link` char(191) NOT NULL DEFAULT '',
`xlink_rating` int(11) NOT NULL DEFAULT 0 ,
`xlink_rating_text` text NOT NULL,
`xlink_updated` datetime NOT NULL DEFAULT '0001-01-01 00:00:00',
@@ -1377,7 +1354,7 @@ CREATE TABLE IF NOT EXISTS `xlink` (
KEY `xlink_updated` (`xlink_updated`),
KEY `xlink_rating` (`xlink_rating`),
KEY `xlink_static` (`xlink_static`)
-) ENGINE=MyISAM DEFAULT CHARSET=utf8;
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
CREATE TABLE IF NOT EXISTS `xperm` (
`xp_id` int(10) unsigned NOT NULL AUTO_INCREMENT,
@@ -1388,24 +1365,24 @@ CREATE TABLE IF NOT EXISTS `xperm` (
KEY `xp_client` (`xp_client`),
KEY `xp_channel` (`xp_channel`),
KEY `xp_perm` (`xp_perm`)
-) ENGINE=MyISAM DEFAULT CHARSET=utf8;
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
CREATE TABLE IF NOT EXISTS `xprof` (
- `xprof_hash` char(255) NOT NULL,
+ `xprof_hash` char(191) NOT NULL,
`xprof_age` tinyint(3) unsigned NOT NULL DEFAULT 0 ,
- `xprof_desc` char(255) NOT NULL DEFAULT '',
+ `xprof_desc` char(191) NOT NULL DEFAULT '',
`xprof_dob` char(12) NOT NULL DEFAULT '',
- `xprof_gender` char(255) NOT NULL DEFAULT '',
- `xprof_marital` char(255) NOT NULL DEFAULT '',
- `xprof_sexual` char(255) NOT NULL DEFAULT '',
- `xprof_locale` char(255) NOT NULL DEFAULT '',
- `xprof_region` char(255) NOT NULL DEFAULT '',
+ `xprof_gender` char(191) NOT NULL DEFAULT '',
+ `xprof_marital` char(191) NOT NULL DEFAULT '',
+ `xprof_sexual` char(191) NOT NULL DEFAULT '',
+ `xprof_locale` char(191) NOT NULL DEFAULT '',
+ `xprof_region` char(191) NOT NULL DEFAULT '',
`xprof_postcode` char(32) NOT NULL DEFAULT '',
- `xprof_country` char(255) NOT NULL DEFAULT '',
+ `xprof_country` char(191) 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 '',
+ `xprof_homepage` char(191) NOT NULL DEFAULT '',
+ `xprof_hometown` char(191) NOT NULL DEFAULT '',
PRIMARY KEY (`xprof_hash`),
KEY `xprof_desc` (`xprof_desc`),
KEY `xprof_dob` (`xprof_dob`),
@@ -1418,15 +1395,186 @@ CREATE TABLE IF NOT EXISTS `xprof` (
KEY `xprof_country` (`xprof_country`),
KEY `xprof_age` (`xprof_age`),
KEY `xprof_hometown` (`xprof_hometown`)
-) ENGINE=MyISAM DEFAULT CHARSET=utf8;
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
CREATE TABLE IF NOT EXISTS `xtag` (
`xtag_id` int(10) unsigned NOT NULL AUTO_INCREMENT,
- `xtag_hash` char(255) NOT NULL DEFAULT '',
- `xtag_term` char(255) NOT NULL DEFAULT '',
+ `xtag_hash` char(191) NOT NULL DEFAULT '',
+ `xtag_term` char(191) NOT NULL DEFAULT '',
`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;
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
+
+CREATE TABLE if not exists addressbooks (
+ id INT(11) UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT,
+ principaluri VARBINARY(255),
+ displayname VARCHAR(255),
+ uri VARBINARY(200),
+ description TEXT,
+ synctoken INT(11) UNSIGNED NOT NULL DEFAULT '1',
+ UNIQUE(principaluri(100), uri(100))
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
+
+CREATE TABLE if not exists cards (
+ id INT(11) UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT,
+ addressbookid INT(11) UNSIGNED NOT NULL,
+ carddata MEDIUMBLOB,
+ uri VARBINARY(200),
+ lastmodified INT(11) UNSIGNED,
+ etag VARBINARY(32),
+ size INT(11) UNSIGNED NOT NULL
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
+
+CREATE TABLE if not exists addressbookchanges (
+ id INT(11) UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT,
+ uri VARBINARY(200) NOT NULL,
+ synctoken INT(11) UNSIGNED NOT NULL,
+ addressbookid INT(11) UNSIGNED NOT NULL,
+ operation TINYINT(1) NOT NULL,
+ INDEX addressbookid_synctoken (addressbookid, synctoken)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
+
+CREATE TABLE if not exists calendarobjects (
+ id INT(11) UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT,
+ calendardata MEDIUMBLOB,
+ uri VARBINARY(200),
+ calendarid INTEGER UNSIGNED NOT NULL,
+ lastmodified INT(11) UNSIGNED,
+ etag VARBINARY(32),
+ size INT(11) UNSIGNED NOT NULL,
+ componenttype VARBINARY(8),
+ firstoccurence INT(11) UNSIGNED,
+ lastoccurence INT(11) UNSIGNED,
+ uid VARBINARY(200),
+ UNIQUE(calendarid, uri),
+ INDEX calendarid_time (calendarid, firstoccurence)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
+
+CREATE TABLE if not exists calendars (
+ id INTEGER UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT,
+ synctoken INTEGER UNSIGNED NOT NULL DEFAULT '1',
+ components VARBINARY(21)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
+
+CREATE TABLE if not exists calendarinstances (
+ id INTEGER UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT,
+ calendarid INTEGER UNSIGNED NOT NULL,
+ principaluri VARBINARY(100),
+ access TINYINT(1) NOT NULL DEFAULT '1' COMMENT '1 = owner, 2 = read, 3 = readwrite',
+ displayname VARCHAR(100),
+ uri VARBINARY(200),
+ description TEXT,
+ calendarorder INT(11) UNSIGNED NOT NULL DEFAULT '0',
+ calendarcolor VARBINARY(10),
+ timezone TEXT,
+ transparent TINYINT(1) NOT NULL DEFAULT '0',
+ share_href VARBINARY(100),
+ share_displayname VARCHAR(100),
+ share_invitestatus TINYINT(1) NOT NULL DEFAULT '2' COMMENT '1 = noresponse, 2 = accepted, 3 = declined, 4 = invalid',
+ UNIQUE(principaluri, uri),
+ UNIQUE(calendarid, principaluri),
+ UNIQUE(calendarid, share_href)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
+
+CREATE TABLE if not exists calendarchanges (
+ id INT(11) UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT,
+ uri VARBINARY(200) NOT NULL,
+ synctoken INT(11) UNSIGNED NOT NULL,
+ calendarid INT(11) UNSIGNED NOT NULL,
+ operation TINYINT(1) NOT NULL,
+ INDEX calendarid_synctoken (calendarid, synctoken)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
+
+CREATE TABLE if not exists calendarsubscriptions (
+ id INT(11) UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT,
+ uri VARBINARY(200) NOT NULL,
+ principaluri VARBINARY(100) NOT NULL,
+ source TEXT,
+ displayname VARCHAR(100),
+ refreshrate VARCHAR(10),
+ calendarorder INT(11) UNSIGNED NOT NULL DEFAULT '0',
+ calendarcolor VARBINARY(10),
+ striptodos TINYINT(1) NULL,
+ stripalarms TINYINT(1) NULL,
+ stripattachments TINYINT(1) NULL,
+ lastmodified INT(11) UNSIGNED,
+ UNIQUE(principaluri, uri)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
+
+CREATE TABLE if not exists schedulingobjects (
+ id INT(11) UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT,
+ principaluri VARBINARY(255),
+ calendardata MEDIUMBLOB,
+ uri VARBINARY(200),
+ lastmodified INT(11) UNSIGNED,
+ etag VARBINARY(32),
+ size INT(11) UNSIGNED NOT NULL
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
+
+CREATE TABLE if not exists locks (
+ id INTEGER UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT,
+ owner VARCHAR(100),
+ timeout INTEGER UNSIGNED,
+ created INTEGER,
+ token VARBINARY(100),
+ scope TINYINT,
+ depth TINYINT,
+ uri VARBINARY(1000),
+ INDEX(token),
+ INDEX(uri(100))
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
+
+CREATE TABLE if not exists principals (
+ id INTEGER UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT,
+ uri VARBINARY(200) NOT NULL,
+ email VARBINARY(80),
+ displayname VARCHAR(80),
+ UNIQUE(uri)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
+
+CREATE TABLE if not exists 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)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
+
+CREATE TABLE if not exists propertystorage (
+ id INT UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT,
+ path VARBINARY(1024) NOT NULL,
+ name VARBINARY(100) NOT NULL,
+ valuetype INT UNSIGNED,
+ value MEDIUMBLOB
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
+
+CREATE UNIQUE INDEX path_property ON propertystorage (path(600), name(100));
+
+CREATE TABLE if not exists users (
+ id INTEGER UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT,
+ username VARBINARY(50),
+ digesta1 VARBINARY(32),
+ UNIQUE(username)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
+
+CREATE TABLE if not exists calendarinstances (
+ id INTEGER UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT,
+ calendarid INTEGER UNSIGNED NOT NULL,
+ principaluri VARBINARY(100),
+ access TINYINT(1) NOT NULL DEFAULT '1' COMMENT '1 = owner, 2 = read, 3 = readwrite',
+ displayname VARCHAR(100),
+ uri VARBINARY(200),
+ description TEXT,
+ calendarorder INT(11) UNSIGNED NOT NULL DEFAULT '0',
+ calendarcolor VARBINARY(10),
+ timezone TEXT,
+ transparent TINYINT(1) NOT NULL DEFAULT '0',
+ share_href VARBINARY(100),
+ share_displayname VARCHAR(100),
+ share_invitestatus TINYINT(1) NOT NULL DEFAULT '2' COMMENT '1 = noresponse, 2 = accepted, 3 = declined, 4 = invalid',
+ UNIQUE(principaluri, uri),
+ UNIQUE(calendarid, principaluri),
+ UNIQUE(calendarid, share_href)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
diff --git a/install/schema_postgres.sql b/install/schema_postgres.sql
index e171d9baf..197cbb4d1 100644
--- a/install/schema_postgres.sql
+++ b/install/schema_postgres.sql
@@ -16,23 +16,23 @@ CREATE TABLE "abook" (
"abook_account" bigint NOT NULL,
"abook_channel" bigint NOT NULL,
"abook_xchan" text NOT NULL DEFAULT '',
- "abook_my_perms" bigint NOT NULL DEFAULT 0,
- "abook_their_perms" bigint NOT NULL DEFAULT 0,
- "abook_closeness" numeric(3) NOT NULL DEFAULT 99,
+ "abook_my_perms" bigint NOT NULL,
+ "abook_their_perms" bigint NOT NULL,
+ "abook_closeness" numeric(3) NOT NULL DEFAULT '99',
"abook_created" timestamp NOT NULL DEFAULT '0001-01-01 00:00:00',
"abook_updated" timestamp NOT NULL DEFAULT '0001-01-01 00:00:00',
"abook_connected" timestamp NOT NULL DEFAULT '0001-01-01 00:00:00',
"abook_dob" timestamp NOT NULL DEFAULT '0001-01-01 00:00:00',
- "abook_flags" bigint NOT NULL DEFAULT 0 ,
- "abook_blocked" smallint NOT NULL DEFAULT 0 ,
- "abook_ignored" smallint NOT NULL DEFAULT 0 ,
- "abook_hidden" smallint NOT NULL DEFAULT 0 ,
- "abook_archived" smallint NOT NULL DEFAULT 0 ,
- "abook_pending" smallint NOT NULL DEFAULT 0 ,
- "abook_unconnected" smallint NOT NULL DEFAULT 0 ,
- "abook_self" smallint NOT NULL DEFAULT 0 ,
- "abook_feed" smallint NOT NULL DEFAULT 0 ,
- "abook_not_here" smallint NOT NULL DEFAULT 0 ,
+ "abook_flags" bigint NOT NULL DEFAULT '0',
+ "abook_blocked" smallint NOT NULL DEFAULT '0',
+ "abook_ignored" smallint NOT NULL DEFAULT '0',
+ "abook_hidden" smallint NOT NULL DEFAULT '0',
+ "abook_archived" smallint NOT NULL DEFAULT '0',
+ "abook_pending" smallint NOT NULL DEFAULT '0',
+ "abook_unconnected" smallint NOT NULL DEFAULT '0',
+ "abook_self" smallint NOT NULL DEFAULT '0',
+ "abook_feed" smallint NOT NULL DEFAULT '0',
+ "abook_not_here" smallint NOT NULL DEFAULT '0',
"abook_profile" varchar(64) NOT NULL DEFAULT '',
"abook_incl" TEXT NOT NULL DEFAULT '',
"abook_excl" TEXT NOT NULL DEFAULT '',
@@ -42,8 +42,8 @@ CREATE TABLE "abook" (
create index "abook_account" on abook ("abook_account");
create index "abook_channel" on abook ("abook_channel");
create index "abook_xchan" on abook ("abook_xchan");
- create index "abook_my_perms" on abook ("abook_my_perms");
- create index "abook_their_perms" on abook ("abook_their_perms");
+ create index "abook_my_perms" on abook ("abook_my_perms");
+ create index "abook_their_perms" on abook ("abook_their_perms");
create index "abook_closeness" on abook ("abook_closeness");
create index "abook_created" on abook ("abook_created");
create index "abook_updated" on abook ("abook_updated");
@@ -64,8 +64,8 @@ CREATE TABLE "abook" (
CREATE TABLE "account" (
"account_id" serial NOT NULL,
- "account_parent" bigint NOT NULL DEFAULT 0 ,
- "account_default_channel" bigint NOT NULL DEFAULT 0 ,
+ "account_parent" bigint NOT NULL DEFAULT '0',
+ "account_default_channel" bigint NOT NULL DEFAULT '0',
"account_salt" varchar(32) NOT NULL DEFAULT '',
"account_password" text NOT NULL DEFAULT '',
"account_email" text NOT NULL DEFAULT '',
@@ -261,26 +261,8 @@ CREATE TABLE "channel" (
"channel_allow_gid" text ,
"channel_deny_cid" text ,
"channel_deny_gid" text ,
- "channel_r_stream" bigint NOT NULL DEFAULT 0,
- "channel_r_profile" bigint NOT NULL DEFAULT 0,
- "channel_r_photos" bigint NOT NULL DEFAULT 0,
- "channel_r_abook" bigint NOT NULL DEFAULT 0,
- "channel_w_stream" bigint NOT NULL DEFAULT 0,
- "channel_w_wall" bigint NOT NULL DEFAULT 0,
- "channel_w_tagwall" bigint NOT NULL DEFAULT 0,
- "channel_w_comment" bigint NOT NULL DEFAULT 0,
- "channel_w_mail" bigint NOT NULL DEFAULT 0,
- "channel_w_photos" bigint NOT NULL DEFAULT 0,
- "channel_w_chat" bigint NOT NULL DEFAULT 0,
- "channel_a_delegate" bigint NOT NULL DEFAULT 0 ,
- "channel_r_storage" bigint NOT NULL DEFAULT 0,
- "channel_w_storage" bigint NOT NULL DEFAULT 0,
- "channel_r_pages" bigint NOT NULL DEFAULT 0,
- "channel_w_pages" bigint NOT NULL DEFAULT 0,
- "channel_a_republish" bigint NOT NULL DEFAULT 0,
- "channel_w_like" bigint NOT NULL DEFAULT 0,
- "channel_removed" smallint NOT NULL DEFAULT 0 ,
- "channel_system" smallint NOT NULL DEFAULT 0 ,
+ "channel_removed" smallint NOT NULL DEFAULT '0',
+ "channel_system" smallint NOT NULL DEFAULT '0',
"channel_moved" text NOT NULL DEFAULT '',
"channel_password" varchar(255) NOT NULL,
"channel_salt" varchar(255) NOT NULL,
@@ -298,28 +280,10 @@ create index "channel_pageflags" on channel ("channel_pageflags");
create index "channel_max_anon_mail" on channel ("channel_max_anon_mail");
create index "channel_max_friend_req" on channel ("channel_max_friend_req");
create index "channel_default_gid" on channel ("channel_default_group");
-create index "channel_r_stream" on channel ("channel_r_stream");
-create index "channel_r_profile" on channel ("channel_r_profile");
-create index "channel_r_photos" on channel ("channel_r_photos");
-create index "channel_r_abook" on channel ("channel_r_abook");
-create index "channel_w_stream" on channel ("channel_w_stream");
-create index "channel_w_wall" on channel ("channel_w_wall");
-create index "channel_w_tagwall" on channel ("channel_w_tagwall");
-create index "channel_w_comment" on channel ("channel_w_comment");
-create index "channel_w_mail" on channel ("channel_w_mail");
-create index "channel_w_photos" on channel ("channel_w_photos");
-create index "channel_w_chat" on channel ("channel_w_chat");
create index "channel_guid" on channel ("channel_guid");
create index "channel_hash" on channel ("channel_hash");
create index "channel_expire_days" on channel ("channel_expire_days");
-create index "channel_a_delegate" on channel ("channel_a_delegate");
-create index "channel_r_storage" on channel ("channel_r_storage");
-create index "channel_w_storage" on channel ("channel_w_storage");
-create index "channel_r_pages" on channel ("channel_r_pages");
-create index "channel_w_pages" on channel ("channel_w_pages");
create index "channel_deleted" on channel ("channel_deleted");
-create index "channel_a_republish" on channel ("channel_a_republish");
-create index "channel_w_like" on channel ("channel_w_like");
create index "channel_dirdate" on channel ("channel_dirdate");
create index "channel_lastpost" on channel ("channel_lastpost");
create index "channel_removed" on channel ("channel_removed");
@@ -403,7 +367,7 @@ create index "conv_updated_idx" on conv ("updated");
CREATE TABLE IF NOT EXISTS "dreport" (
"dreport_id" serial NOT NULL,
- "dreport_channel" int NOT NULL DEFAULT 0 ,
+ "dreport_channel" int NOT NULL DEFAULT '0',
"dreport_mid" varchar(255) NOT NULL DEFAULT '',
"dreport_site" varchar(255) NOT NULL DEFAULT '',
"dreport_recip" varchar(255) NOT NULL DEFAULT '',
@@ -613,7 +577,6 @@ CREATE TABLE "item" (
"resource_type" varchar(16) NOT NULL DEFAULT '',
"attach" text NOT NULL,
"sig" text NOT NULL DEFAULT '',
- "diaspora_meta" text NOT NULL DEFAULT '',
"location" text NOT NULL DEFAULT '',
"coord" text NOT NULL DEFAULT '',
"public_policy" text NOT NULL DEFAULT '',
@@ -668,6 +631,7 @@ create index "item_restrict" on item ("item_restrict");
create index "item_flags" on item ("item_flags");
create index "item_commented" on item ("commented");
create index "item_verb" on item ("verb");
+create index "item_obj_type" on item ("obj_type");
create index "item_private" on item ("item_private");
create index "item_llink" on item ("llink");
create index "item_expires" on item ("expires");
@@ -725,10 +689,10 @@ create index "itemid_service" on item_id ("service");
create index "itemid_iid" on item_id ("iid");
CREATE TABLE "likes" (
"id" serial NOT NULL,
- "channel_id" bigint NOT NULL DEFAULT 0 ,
+ "channel_id" bigint NOT NULL DEFAULT '0',
"liker" varchar(128) NOT NULL DEFAULT '',
"likee" varchar(128) NOT NULL DEFAULT '',
- "iid" bigint NOT NULL DEFAULT 0 ,
+ "iid" bigint NOT NULL DEFAULT '0',
"i_mid" varchar(255) NOT NULL DEFAULT '',
"verb" text NOT NULL DEFAULT '',
"target_type" text NOT NULL DEFAULT '',
@@ -751,9 +715,9 @@ CREATE TABLE "mail" (
"mail_flags" bigint NOT NULL DEFAULT 0 ,
"from_xchan" text NOT NULL DEFAULT '',
"to_xchan" text NOT NULL DEFAULT '',
- "account_id" bigint NOT NULL DEFAULT 0 ,
- "channel_id" bigint NOT NULL DEFAULT 0 ,
- "mail_mimetype" varchar(64) NOT NULL DEFAULT 'text/bbcode',
+ "account_id" bigint NOT NULL DEFAULT '0',
+ "channel_id" bigint NOT NULL DEFAULT '0',
+ "mail_mimetype" varchar(64) NOT NULL DEFAULT '0',
"title" text NOT NULL,
"body" text NOT NULL,
"sig" text NOT NULL,
@@ -1009,7 +973,7 @@ create index "profext_k" on profext ("k");
CREATE TABLE "profile" (
"id" serial NOT NULL,
"profile_guid" varchar(64) NOT NULL DEFAULT '',
- "aid" bigint NOT NULL DEFAULT 0 ,
+ "aid" bigint NOT NULL DEFAULT '0',
"uid" bigint NOT NULL,
"profile_name" text NOT NULL,
"is_default" numeric(1) NOT NULL DEFAULT 0 ,
@@ -1399,3 +1363,225 @@ CREATE TABLE "xtag" (
create index "xtag_term" on xtag ("xtag_term");
create index "xtag_hash" on xtag ("xtag_hash");
create index "xtag_flags" on xtag ("xtag_flags");
+
+CREATE TABLE addressbooks (
+ id SERIAL NOT NULL,
+ principaluri VARCHAR(255),
+ displayname VARCHAR(255),
+ uri VARCHAR(200),
+ description TEXT,
+ synctoken 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 BYTEA,
+ uri VARCHAR(200),
+ lastmodified INTEGER,
+ etag VARCHAR(32),
+ size INTEGER NOT NULL
+);
+
+ALTER TABLE ONLY cards
+ ADD CONSTRAINT cards_pkey PRIMARY KEY (id);
+
+CREATE UNIQUE INDEX cards_ukey
+ ON cards USING btree (addressbookid, uri);
+
+CREATE TABLE addressbookchanges (
+ id SERIAL NOT NULL,
+ uri VARCHAR(200) NOT NULL,
+ synctoken INTEGER NOT NULL,
+ addressbookid INTEGER NOT NULL,
+ operation SMALLINT NOT NULL
+);
+
+ALTER TABLE ONLY addressbookchanges
+ ADD CONSTRAINT addressbookchanges_pkey PRIMARY KEY (id);
+
+CREATE INDEX addressbookchanges_addressbookid_synctoken_ix
+ ON addressbookchanges USING btree (addressbookid, synctoken);
+
+CREATE TABLE calendarobjects (
+ id SERIAL NOT NULL,
+ calendardata BYTEA,
+ uri VARCHAR(200),
+ calendarid INTEGER NOT NULL,
+ lastmodified INTEGER,
+ etag VARCHAR(32),
+ size INTEGER NOT NULL,
+ componenttype VARCHAR(8),
+ firstoccurence INTEGER,
+ lastoccurence INTEGER,
+ uid VARCHAR(200)
+);
+
+ALTER TABLE ONLY calendarobjects
+ ADD CONSTRAINT calendarobjects_pkey PRIMARY KEY (id);
+
+CREATE UNIQUE INDEX calendarobjects_ukey
+ ON calendarobjects USING btree (calendarid, uri);
+
+
+CREATE TABLE calendars (
+ id SERIAL NOT NULL,
+ synctoken INTEGER NOT NULL DEFAULT 1,
+ components VARCHAR(21)
+);
+
+ALTER TABLE ONLY calendars
+ ADD CONSTRAINT calendars_pkey PRIMARY KEY (id);
+
+
+CREATE TABLE calendarinstances (
+ id SERIAL NOT NULL,
+ calendarid INTEGER NOT NULL,
+ principaluri VARCHAR(100),
+ access SMALLINT NOT NULL DEFAULT '1', -- '1 = owner, 2 = read, 3 = readwrite'
+ displayname VARCHAR(100),
+ uri VARCHAR(200),
+ description TEXT,
+ calendarorder INTEGER NOT NULL DEFAULT 0,
+ calendarcolor VARCHAR(10),
+ timezone TEXT,
+ transparent SMALLINT NOT NULL DEFAULT '0',
+ share_href VARCHAR(100),
+ share_displayname VARCHAR(100),
+ share_invitestatus SMALLINT NOT NULL DEFAULT '2' -- '1 = noresponse, 2 = accepted, 3 = declined, 4 = invalid'
+);
+
+ALTER TABLE ONLY calendarinstances
+ ADD CONSTRAINT calendarinstances_pkey PRIMARY KEY (id);
+
+CREATE UNIQUE INDEX calendarinstances_principaluri_uri
+ ON calendarinstances USING btree (principaluri, uri);
+
+
+CREATE UNIQUE INDEX calendarinstances_principaluri_calendarid
+ ON calendarinstances USING btree (principaluri, calendarid);
+
+CREATE UNIQUE INDEX calendarinstances_principaluri_share_href
+ ON calendarinstances USING btree (principaluri, share_href);
+
+CREATE TABLE calendarsubscriptions (
+ id SERIAL NOT NULL,
+ uri VARCHAR(200) NOT NULL,
+ principaluri VARCHAR(100) NOT NULL,
+ source TEXT,
+ displayname VARCHAR(100),
+ refreshrate VARCHAR(10),
+ calendarorder INTEGER NOT NULL DEFAULT 0,
+ calendarcolor VARCHAR(10),
+ striptodos SMALLINT NULL,
+ stripalarms SMALLINT NULL,
+ stripattachments SMALLINT NULL,
+ lastmodified INTEGER
+);
+
+ALTER TABLE ONLY calendarsubscriptions
+ ADD CONSTRAINT calendarsubscriptions_pkey PRIMARY KEY (id);
+
+CREATE UNIQUE INDEX calendarsubscriptions_ukey
+ ON calendarsubscriptions USING btree (principaluri, uri);
+
+CREATE TABLE calendarchanges (
+ id SERIAL NOT NULL,
+ uri VARCHAR(200) NOT NULL,
+ synctoken INTEGER NOT NULL,
+ calendarid INTEGER NOT NULL,
+ operation SMALLINT NOT NULL DEFAULT 0
+);
+
+ALTER TABLE ONLY calendarchanges
+ ADD CONSTRAINT calendarchanges_pkey PRIMARY KEY (id);
+
+CREATE INDEX calendarchanges_calendarid_synctoken_ix
+ ON calendarchanges USING btree (calendarid, synctoken);
+
+CREATE TABLE schedulingobjects (
+ id SERIAL NOT NULL,
+ principaluri VARCHAR(255),
+ calendardata BYTEA,
+ uri VARCHAR(200),
+ lastmodified INTEGER,
+ etag VARCHAR(32),
+ size INTEGER NOT NULL
+);
+
+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);
+
+CREATE INDEX locks_token_ix
+ ON locks USING btree (token);
+
+CREATE INDEX locks_uri_ix
+ ON locks USING btree (uri);
+
+CREATE TABLE principals (
+ id SERIAL NOT NULL,
+ uri VARCHAR(200) NOT NULL,
+ email VARCHAR(80),
+ displayname VARCHAR(80)
+);
+
+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);
+
+CREATE TABLE propertystorage (
+ id SERIAL NOT NULL,
+ path VARCHAR(1024) NOT NULL,
+ name VARCHAR(100) NOT NULL,
+ valuetype INT,
+ value BYTEA
+);
+
+ALTER TABLE ONLY propertystorage
+ ADD CONSTRAINT propertystorage_pkey PRIMARY KEY (id);
+
+CREATE UNIQUE INDEX propertystorage_ukey
+ ON propertystorage (path, name);
+
+CREATE TABLE users (
+ id SERIAL NOT NULL,
+ username VARCHAR(50),
+ digesta1 VARCHAR(32)
+);
+
+ALTER TABLE ONLY users
+ ADD CONSTRAINT users_pkey PRIMARY KEY (id);
+
+CREATE UNIQUE INDEX users_ukey
+ ON users USING btree (username);
diff --git a/install/update.php b/install/update.php
index f9f1d0a3c..8798a3d69 100644
--- a/install/update.php
+++ b/install/update.php
@@ -1,6 +1,6 @@
<?php
-define( 'UPDATE_VERSION' , 1191 );
+define( 'UPDATE_VERSION' , 1193 );
/**
*
@@ -2546,3 +2546,435 @@ function update_r1190() {
return UPDATE_SUCCESS;
return UPDATE_FAILED;
}
+
+function update_r1191() {
+
+ $r = q("SELECT 1 FROM principals LIMIT 1");
+
+ if($r !== false) {
+ return UPDATE_SUCCESS;
+ }
+ else {
+ if(ACTIVE_DBTYPE == DBTYPE_POSTGRES) {
+ $r1 = q("CREATE TABLE addressbooks (
+ id SERIAL NOT NULL,
+ principaluri VARCHAR(255),
+ displayname VARCHAR(255),
+ uri VARCHAR(200),
+ description TEXT,
+ synctoken INTEGER NOT NULL DEFAULT 1
+ );"
+ );
+
+ $r2 = q("ALTER TABLE ONLY addressbooks ADD CONSTRAINT addressbooks_pkey PRIMARY KEY (id);");
+
+ $r3 = q("CREATE UNIQUE INDEX addressbooks_ukey ON addressbooks USING btree (principaluri, uri);");
+
+ $r4 = q("CREATE TABLE cards (
+ id SERIAL NOT NULL,
+ addressbookid INTEGER NOT NULL,
+ carddata BYTEA,
+ uri VARCHAR(200),
+ lastmodified INTEGER,
+ etag VARCHAR(32),
+ size INTEGER NOT NULL
+ );"
+ );
+
+ $r5 = q("ALTER TABLE ONLY cards ADD CONSTRAINT cards_pkey PRIMARY KEY (id);");
+
+ $r6 = q("CREATE UNIQUE INDEX cards_ukey ON cards USING btree (addressbookid, uri);");
+
+ $r7 = q("CREATE TABLE addressbookchanges (
+ id SERIAL NOT NULL,
+ uri VARCHAR(200) NOT NULL,
+ synctoken INTEGER NOT NULL,
+ addressbookid INTEGER NOT NULL,
+ operation SMALLINT NOT NULL
+ );"
+ );
+
+ $r8 = q("ALTER TABLE ONLY addressbookchanges ADD CONSTRAINT addressbookchanges_pkey PRIMARY KEY (id);");
+
+ $r9 = q("CREATE INDEX addressbookchanges_addressbookid_synctoken_ix ON addressbookchanges USING btree (addressbookid, synctoken);");
+
+ $r10 = q("CREATE TABLE calendarobjects (
+ id SERIAL NOT NULL,
+ calendardata BYTEA,
+ uri VARCHAR(200),
+ calendarid INTEGER NOT NULL,
+ lastmodified INTEGER,
+ etag VARCHAR(32),
+ size INTEGER NOT NULL,
+ componenttype VARCHAR(8),
+ firstoccurence INTEGER,
+ lastoccurence INTEGER,
+ uid VARCHAR(200)
+ );"
+ );
+
+ $r11 = q("ALTER TABLE ONLY calendarobjects ADD CONSTRAINT calendarobjects_pkey PRIMARY KEY (id);");
+
+ $r12 = q("CREATE UNIQUE INDEX calendarobjects_ukey ON calendarobjects USING btree (calendarid, uri);");
+
+ $r13 = q("CREATE TABLE calendars (
+ id SERIAL NOT NULL,
+ synctoken INTEGER NOT NULL DEFAULT 1,
+ components VARCHAR(21)
+ );"
+ );
+
+ $r14 = q("ALTER TABLE ONLY calendars ADD CONSTRAINT calendars_pkey PRIMARY KEY (id);");
+
+ $r15 = q("CREATE TABLE calendarinstances (
+ id SERIAL NOT NULL,
+ calendarid INTEGER NOT NULL,
+ principaluri VARCHAR(100),
+ access SMALLINT NOT NULL DEFAULT '1', -- '1 = owner, 2 = read, 3 = readwrite'
+ displayname VARCHAR(100),
+ uri VARCHAR(200),
+ description TEXT,
+ calendarorder INTEGER NOT NULL DEFAULT 0,
+ calendarcolor VARCHAR(10),
+ timezone TEXT,
+ transparent SMALLINT NOT NULL DEFAULT '0',
+ share_href VARCHAR(100),
+ share_displayname VARCHAR(100),
+ share_invitestatus SMALLINT NOT NULL DEFAULT '2' -- '1 = noresponse, 2 = accepted, 3 = declined, 4 = invalid'
+ );"
+ );
+
+ $r16 = q("ALTER TABLE ONLY calendarinstances ADD CONSTRAINT calendarinstances_pkey PRIMARY KEY (id);");
+
+ $r17 = q("CREATE UNIQUE INDEX calendarinstances_principaluri_uri ON calendarinstances USING btree (principaluri, uri);");
+
+ $r18 = q("CREATE UNIQUE INDEX calendarinstances_principaluri_calendarid ON calendarinstances USING btree (principaluri, calendarid);");
+
+ $r19 = q("CREATE UNIQUE INDEX calendarinstances_principaluri_share_href ON calendarinstances USING btree (principaluri, share_href);");
+
+ $r20 = q("CREATE TABLE calendarsubscriptions (
+ id SERIAL NOT NULL,
+ uri VARCHAR(200) NOT NULL,
+ principaluri VARCHAR(100) NOT NULL,
+ source TEXT,
+ displayname VARCHAR(100),
+ refreshrate VARCHAR(10),
+ calendarorder INTEGER NOT NULL DEFAULT 0,
+ calendarcolor VARCHAR(10),
+ striptodos SMALLINT NULL,
+ stripalarms SMALLINT NULL,
+ stripattachments SMALLINT NULL,
+ lastmodified INTEGER
+ );"
+ );
+
+ $r21 = q("ALTER TABLE ONLY calendarsubscriptions ADD CONSTRAINT calendarsubscriptions_pkey PRIMARY KEY (id);");
+
+ $r22 = q("CREATE UNIQUE INDEX calendarsubscriptions_ukey ON calendarsubscriptions USING btree (principaluri, uri);");
+
+ $r23 = q("CREATE TABLE calendarchanges (
+ id SERIAL NOT NULL,
+ uri VARCHAR(200) NOT NULL,
+ synctoken INTEGER NOT NULL,
+ calendarid INTEGER NOT NULL,
+ operation SMALLINT NOT NULL DEFAULT 0
+ );"
+ );
+
+ $r24 = q("ALTER TABLE ONLY calendarchanges ADD CONSTRAINT calendarchanges_pkey PRIMARY KEY (id);");
+
+ $r25 = q("CREATE INDEX calendarchanges_calendarid_synctoken_ix ON calendarchanges USING btree (calendarid, synctoken);");
+
+ $r26 = q("CREATE TABLE schedulingobjects (
+ id SERIAL NOT NULL,
+ principaluri VARCHAR(255),
+ calendardata BYTEA,
+ uri VARCHAR(200),
+ lastmodified INTEGER,
+ etag VARCHAR(32),
+ size INTEGER NOT NULL
+ );"
+ );
+
+ $r27 = q("CREATE TABLE locks (
+ id SERIAL NOT NULL,
+ owner VARCHAR(100),
+ timeout INTEGER,
+ created INTEGER,
+ token VARCHAR(100),
+ scope SMALLINT,
+ depth SMALLINT,
+ uri TEXT
+ );"
+ );
+
+ $r28 = q("ALTER TABLE ONLY locks ADD CONSTRAINT locks_pkey PRIMARY KEY (id);");
+
+ $r29 = q("CREATE INDEX locks_token_ix ON locks USING btree (token);");
+
+ $r30 = q("CREATE INDEX locks_uri_ix ON locks USING btree (uri);");
+
+ $r31 = q("CREATE TABLE principals (
+ id SERIAL NOT NULL,
+ uri VARCHAR(200) NOT NULL,
+ email VARCHAR(80),
+ displayname VARCHAR(80)
+ );"
+ );
+
+ $r32 = q("ALTER TABLE ONLY principals ADD CONSTRAINT principals_pkey PRIMARY KEY (id);");
+
+ $r33 = q("CREATE UNIQUE INDEX principals_ukey ON principals USING btree (uri);");
+
+ $r34 = q("CREATE TABLE groupmembers (
+ id SERIAL NOT NULL,
+ principal_id INTEGER NOT NULL,
+ member_id INTEGER NOT NULL
+ );"
+ );
+
+ $r35 = q("ALTER TABLE ONLY groupmembers ADD CONSTRAINT groupmembers_pkey PRIMARY KEY (id);");
+
+ $r36 = q("CREATE UNIQUE INDEX groupmembers_ukey ON groupmembers USING btree (principal_id, member_id);");
+
+ $r37 = q("CREATE TABLE propertystorage (
+ id SERIAL NOT NULL,
+ path VARCHAR(1024) NOT NULL,
+ name VARCHAR(100) NOT NULL,
+ valuetype INT,
+ value BYTEA
+ );"
+ );
+
+ $r38 = q("ALTER TABLE ONLY propertystorage ADD CONSTRAINT propertystorage_pkey PRIMARY KEY (id);");
+
+ $r39 = q("CREATE UNIQUE INDEX propertystorage_ukey ON propertystorage (path, name);");
+
+ $r40 = q("CREATE TABLE users (
+ id SERIAL NOT NULL,
+ username VARCHAR(50),
+ digesta1 VARCHAR(32)
+ );"
+ );
+
+ $r41 = q("ALTER TABLE ONLY users ADD CONSTRAINT users_pkey PRIMARY KEY (id);");
+
+ $r42 = q("CREATE UNIQUE INDEX users_ukey ON users USING btree (username);");
+
+ if(
+ $r1 && $r2 && $r3 && $r4 && $r5 && $r6 && $r7 && $r8 && $r9 && $r10
+ && $r11 && $r12 && $r13 && $r14 && $r15 && $r16 && $r17 && $r18 && $r19 && $r20
+ && $r21 && $r22 && $r23 && $r24 && $r25 && $r26 && $r27 && $r28 && $r29 && $r30
+ && $r31 && $r32 && $r33 && $r34 && $r35 && $r36 && $r37 && $r38 && $r39 && $r40
+ && $r41 && $r42
+ )
+ return UPDATE_SUCCESS;
+ return UPDATE_FAILED;
+ }
+ else {
+ $r1 = q("CREATE TABLE if not exists addressbooks (
+ id INT(11) UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT,
+ principaluri VARBINARY(255),
+ displayname VARCHAR(255),
+ uri VARBINARY(200),
+ description TEXT,
+ synctoken INT(11) UNSIGNED NOT NULL DEFAULT '1',
+ UNIQUE(principaluri(100), uri(100))
+ ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;"
+ );
+
+ $r2 = q("CREATE TABLE if not exists cards (
+ id INT(11) UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT,
+ addressbookid INT(11) UNSIGNED NOT NULL,
+ carddata MEDIUMBLOB,
+ uri VARBINARY(200),
+ lastmodified INT(11) UNSIGNED,
+ etag VARBINARY(32),
+ size INT(11) UNSIGNED NOT NULL
+ ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;"
+ );
+
+ $r3 = q("CREATE TABLE if not exists addressbookchanges (
+ id INT(11) UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT,
+ uri VARBINARY(200) NOT NULL,
+ synctoken INT(11) UNSIGNED NOT NULL,
+ addressbookid INT(11) UNSIGNED NOT NULL,
+ operation TINYINT(1) NOT NULL,
+ INDEX addressbookid_synctoken (addressbookid, synctoken)
+ ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;"
+ );
+
+ $r4 = q("CREATE TABLE if not exists calendarobjects (
+ id INT(11) UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT,
+ calendardata MEDIUMBLOB,
+ uri VARBINARY(200),
+ calendarid INTEGER UNSIGNED NOT NULL,
+ lastmodified INT(11) UNSIGNED,
+ etag VARBINARY(32),
+ size INT(11) UNSIGNED NOT NULL,
+ componenttype VARBINARY(8),
+ firstoccurence INT(11) UNSIGNED,
+ lastoccurence INT(11) UNSIGNED,
+ uid VARBINARY(200),
+ UNIQUE(calendarid, uri),
+ INDEX calendarid_time (calendarid, firstoccurence)
+ ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;"
+ );
+
+ $r5 = q("CREATE TABLE if not exists calendars (
+ id INTEGER UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT,
+ synctoken INTEGER UNSIGNED NOT NULL DEFAULT '1',
+ components VARBINARY(21)
+ ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;"
+ );
+
+ $r6 = q("CREATE TABLE if not exists calendarinstances (
+ id INTEGER UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT,
+ calendarid INTEGER UNSIGNED NOT NULL,
+ principaluri VARBINARY(100),
+ access TINYINT(1) NOT NULL DEFAULT '1' COMMENT '1 = owner, 2 = read, 3 = readwrite',
+ displayname VARCHAR(100),
+ uri VARBINARY(200),
+ description TEXT,
+ calendarorder INT(11) UNSIGNED NOT NULL DEFAULT '0',
+ calendarcolor VARBINARY(10),
+ timezone TEXT,
+ transparent TINYINT(1) NOT NULL DEFAULT '0',
+ share_href VARBINARY(100),
+ share_displayname VARCHAR(100),
+ share_invitestatus TINYINT(1) NOT NULL DEFAULT '2' COMMENT '1 = noresponse, 2 = accepted, 3 = declined, 4 = invalid',
+ UNIQUE(principaluri, uri),
+ UNIQUE(calendarid, principaluri),
+ UNIQUE(calendarid, share_href)
+ ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;"
+ );
+
+ $r7 = q("CREATE TABLE if not exists calendarchanges (
+ id INT(11) UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT,
+ uri VARBINARY(200) NOT NULL,
+ synctoken INT(11) UNSIGNED NOT NULL,
+ calendarid INT(11) UNSIGNED NOT NULL,
+ operation TINYINT(1) NOT NULL,
+ INDEX calendarid_synctoken (calendarid, synctoken)
+ ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;"
+ );
+
+ $r8 = q("CREATE TABLE if not exists calendarsubscriptions (
+ id INT(11) UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT,
+ uri VARBINARY(200) NOT NULL,
+ principaluri VARBINARY(100) NOT NULL,
+ source TEXT,
+ displayname VARCHAR(100),
+ refreshrate VARCHAR(10),
+ calendarorder INT(11) UNSIGNED NOT NULL DEFAULT '0',
+ calendarcolor VARBINARY(10),
+ striptodos TINYINT(1) NULL,
+ stripalarms TINYINT(1) NULL,
+ stripattachments TINYINT(1) NULL,
+ lastmodified INT(11) UNSIGNED,
+ UNIQUE(principaluri, uri)
+ ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;"
+ );
+
+ $r9 = q("CREATE TABLE if not exists schedulingobjects (
+ id INT(11) UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT,
+ principaluri VARBINARY(255),
+ calendardata MEDIUMBLOB,
+ uri VARBINARY(200),
+ lastmodified INT(11) UNSIGNED,
+ etag VARBINARY(32),
+ size INT(11) UNSIGNED NOT NULL
+ ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;"
+ );
+
+ $r10 = q("CREATE TABLE if not exists locks (
+ id INTEGER UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT,
+ owner VARCHAR(100),
+ timeout INTEGER UNSIGNED,
+ created INTEGER,
+ token VARBINARY(100),
+ scope TINYINT,
+ depth TINYINT,
+ uri VARBINARY(1000),
+ INDEX(token),
+ INDEX(uri(100))
+ ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;"
+ );
+
+ $r11 = q("CREATE TABLE if not exists principals (
+ id INTEGER UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT,
+ uri VARBINARY(200) NOT NULL,
+ email VARBINARY(80),
+ displayname VARCHAR(80),
+ UNIQUE(uri)
+ ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;"
+ );
+
+ $r12 = q("CREATE TABLE if not exists 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)
+ ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;"
+ );
+
+ $r13 = q("CREATE TABLE if not exists propertystorage (
+ id INT UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT,
+ path VARBINARY(1024) NOT NULL,
+ name VARBINARY(100) NOT NULL,
+ valuetype INT UNSIGNED,
+ value MEDIUMBLOB
+ ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;"
+ );
+
+ $r14 = q("CREATE UNIQUE INDEX path_property ON propertystorage (path(600), name(100));");
+
+ $r15 = q("CREATE TABLE if not exists users (
+ id INTEGER UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT,
+ username VARBINARY(50),
+ digesta1 VARBINARY(32),
+ UNIQUE(username)
+ ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;"
+ );
+
+ $r16 = q("CREATE TABLE if not exists calendarinstances (
+ id INTEGER UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT,
+ calendarid INTEGER UNSIGNED NOT NULL,
+ principaluri VARBINARY(100),
+ access TINYINT(1) NOT NULL DEFAULT '1' COMMENT '1 = owner, 2 = read, 3 = readwrite',
+ displayname VARCHAR(100),
+ uri VARBINARY(200),
+ description TEXT,
+ calendarorder INT(11) UNSIGNED NOT NULL DEFAULT '0',
+ calendarcolor VARBINARY(10),
+ timezone TEXT,
+ transparent TINYINT(1) NOT NULL DEFAULT '0',
+ share_href VARBINARY(100),
+ share_displayname VARCHAR(100),
+ share_invitestatus TINYINT(1) NOT NULL DEFAULT '2' COMMENT '1 = noresponse, 2 = accepted, 3 = declined, 4 = invalid',
+ UNIQUE(principaluri, uri),
+ UNIQUE(calendarid, principaluri),
+ UNIQUE(calendarid, share_href)
+ ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;"
+ );
+
+ if($r1 && $r2 && $r3 && $r4 && $r5 && $r6 && $r7 && $r8 && $r9 && $r10 && $r11 && $r12 && $r13 && $r14 && $r15 && $r16)
+ return UPDATE_SUCCESS;
+ return UPDATE_FAILED;
+ }
+ }
+}
+
+function update_r1192() {
+
+ if(ACTIVE_DBTYPE == DBTYPE_POSTGRES) {
+ $r1 = q("CREATE INDEX item_obj_type ON item (obj_type)");
+ }
+ else {
+ $r1 = q("ALTER TABLE item ADD INDEX (obj_type)");
+ }
+
+ if($r1)
+ return UPDATE_SUCCESS;
+ return UPDATE_FAILED;
+}
diff --git a/library/Text_Highlighter/README b/library/Text_Highlighter/README
deleted file mode 100644
index 88f71aed2..000000000
--- a/library/Text_Highlighter/README
+++ /dev/null
@@ -1,455 +0,0 @@
-# $Id$
-
-Introduction
-============
-
-Text_Highlighter is a class for syntax highlighting. The main idea is to
-simplify creation of subclasses implementing syntax highlighting for
-particular language. Subclasses do not implement any new functioanality, they
-just provide syntax highlighting rules. The rules sources are in XML format.
-To create a highlighter for a language, there is no need to code a new class
-manually. Simply describe the rules in XML file and use Text_Highlighter_Generator
-to create a new class.
-
-
-This document does not contain a formal description of API - it is very
-simple, and I believe providing some examples of code is sufficient.
-
-
-Highlighter XML source
-======================
-
-Basics
-------
-
-Creating a new syntax highlighter begins with describing the highlighting
-rules. There are two basic elements: block and region. A block is just a
-portion of text matching a regular expression and highlighted with a single
-color. Keyword is an example of a block. A region is defined by two regular
-expressions: one for start of region, and another for the end. The main
-difference from a block is that a region can contain blocks and regions
-(including same-named regions). An example of a region is a group of
-statements enclosed in curly brackets (this is used in many languages, for
-example PHP and C). Also, characters matching start and end of a region may be
-highlighted with their own color, and region contents with another.
-
-Blocks and regions may be declared as contained. Contained blocks and regions
-can only appear inside regions. If a region or a block is not declared as
-contained, it can appear both on top level and inside regions. Block or region
-declared as not-contained can only appear on top level.
-
-For any region, a list of blocks and regions that can appear inside this
-region can be specified.
-
-In this document, the term "color group" is used. Chunks of text assigned to
-same color group will be highlighted with same color. Note that in versions
-prior 0.5.0 color goups were refered as CSS classes, but since 0.5.0 not only
-HTML output is supported, so "color group" is more appropriate term.
-
-Elements
---------
-
-The toplevel element is <highlight>. Attribute lang is required and denotes
-the name of the language. Its value is used as a part of generated class name,
-and must only contain letters, digits and underscores. Optional attribute
-case, when given value yes, makes the language case sensitive (default is case
-insensitive). Allowed subelements are:
-
- * <authors>: Information about the authors of the file.
- <author>: Information about a single author of the file. (May be used
- multiple times, one per author.)
- - name="...": Author's name. Required.
- - email="...": Author's email address. Optional.
-
- * <default>: Default color group.
- - innerGroup="...": color group name. Required.
-
- * <region>: Region definition
- - name="...": Region name. Required.
- - innerGroup="...": Default color group of region contents. Required.
- - delimGroup="...": color group of start and end of region. Optional,
- defaults to value of innerGroup attribute.
- - start="...", end="...": Regular expression matching start and end
- of region. Required. Regular expression delimiters are optional, but
- if you need to specify delimiter, use /. The only case when the
- delimiters are needed, is specifying regular expression modifiers,
- such as m or U. Examples: \/\* or /$/m.
- - contained="yes": Marks region as contained.
- - never-contained="yes": Marks region as not-contained.
- - <contains>: Elements allowed inside this region.
- - all="yes" Region can contain any other region or block
- (except not-contained). May be used multiple times.
- - <but> Do not allow certain regions or blocks.
- - region="..." Name of region not allowed within
- current region.
- - block="..." Name of block not allowed within
- current region.
- - region="..." Name of region allowed within current region.
- - block="..." Name of block allowed within current region.
- - <onlyin> Only allow this region within certain regions. May be
- used multiple times.
- - block="..." Name of parent region
-
- * <block>: Block definition
- - name="...": Block name. Required.
- - innerGroup="...": color group of block contents. Optional. If not
- specified, color group of parent region or default color group will be
- used. One would only want to omit this attribute if there are
- keyword groups (see below) inherited from this block, and no special
- highlighting should apply when the block does not match the keyword.
- - match="..." Regular expression matching the block. Required.
- Regular expression delimiters are optional, but if you need to
- specify delimiter, use /. The only case when the delimiters are
- needed, is specifying regular expression modifiers, such as m or U.
- Examples: #|\/\/ or /$/m.
- - contained="yes": Marks block as contained.
- - never-contained="yes": Marks block as not-contained.
- - <onlyin> Only allow this block within certain regions. May be used
- multiple times.
- - block="..." Name of parent region
- - multiline="yes": Marks block as multi-line. By default, whole
- blocks are assumed to reside in a single line. This make the things
- faster. If you need to declare a multi-line block, use this
- attribute.
- - <partgroup>: Assigns another color group to a part of the block that
- matched a subpattern.
- - index="n": Subpattern index. Required.
- - innerGroup="...": color group name. Required.
-
- This is an example from CSS highlighter: the measure is matched as
- a whole, but the measurement units are highlighted with different
- color.
-
- <block name="measure" match="\d*\.?\d+(\%|em|ex|pc|pt|px|in|mm|cm)"
- innerGroup="number" contained="yes">
- <onlyin region="property"/>
- <partGroup index="1" innerGroup="string" />
- </block>
-
- * <keywords>: Keyword group definition. Keyword groups are useful when you
- want to highlight some words that match a condition for a block with a
- different color. Keywords are defined with literal match, not regular
- expressions. For example, you have a block named identifier matching a
- general identifier, and want to highlight reserved words (which match
- this block as well) with different color. You inherit a keyword group
- "reserved" from "identifier" block.
- - name="...": Keyword group. Required.
- - ifdef="...", ifndef="..." : Conditional declaration. See
- "Conditions" below.
- - inherits="...": Inherited block name. Required.
- - innerGroup="...": color group of keyword group. Required.
- - case="yes|no": Overrides case-sensitivity of the language.
- Optional, defaults to global value.
- - <keyword>: Single keyword definition.
- - match="..." The keyword. Note: this is not a regular
- expression, but literal match (possibly case insensitive).
-
-Note that for BC reasons element partClass is alias for partGroup, and
-attributes innerClass and delimClass are aliases of innerGroup and
-delimGroup, respectively.
-
-
-Conditions
-----------
-
-Conditional declarations allow enabling or disabling certain highlighting
-rules at runtime. For example, Java highlighter has a very big list of
-keywords matching Java standard classes. Finding a match in this list can take
-much time. For that reason, corresponding keyword group is declared with
-"ifdef" attribute :
-
- <keywords name="builtin" inherits="identifier" innerClass="builtin"
- case="yes" ifdef="java.builtins">
- <keyword match="AbstractAction" />
- <keyword match="AbstractBorder" />
- <keyword match="AbstractButton" />
- ...
- ...
- <keyword match="_Remote_Stub" />
- <keyword match="_ServantActivatorStub" />
- <keyword match="_ServantLocatorStub" />
- </keywords>
-
-This keyword group will be only enabled when "java.builtins" is passed as an
-element of "defines" option:
-
- $options = array(
- 'defines' => array(
- 'java.builtins',
- ),
- 'numbers' => HL_NUMBERS_TABLE,
- );
- $highlighter = Text_Highlighter::factory('java', $options);
-
-"ifndef" attribute has reverse meaning.
-
-Currently, "ifdef" and "ifndef" attributes are only supported for <keywords>
-tag.
-
-
-
-Class generation
-================
-
-Creating XML description of highlighting rules is the most complicated part of
-the process. To generate the class, you need just few lines of code:
-
- <?php
- require_once 'Text/Highlighter/Generator.php';
- $generator = new Text_Highlighter_Generator('php.xml');
- $generator->generate();
- $generator->saveCode('PHP.php');
- ?>
-
-
-
-Command-line class generation tool
-==================================
-
-Example from previous section looks pretty simple, but it does not handle any
-errors which may occur during parsing of XML source. The package provides a
-command-line script to make generation of classes even more simple, and takes
-care of possible errors. It is called generate (on Unix/Linux) or generate.bat
-(on Windows). This script is able to process multiple files in one run, and
-also to process XML from standard input and write generated code to standard
-output.
-
- Usage:
- generate options
-
- Options:
- -x filename, --xml=filename
- source XML file. Multiple input files can be specified, in which
- case each -x option must be followed by -p unless -d is specified
- Defaults to stdin
- -p filename, --php=filename
- destination PHP file. Defaults to stdout. If specied multiple times,
- each -p must follow -x
- -d dirname, --dir=dirname
- Default destination directory. File names will be taken from XML input
- ("lang" attribute of <highlight> tag)
- -h, --help
- This help
-
-Examples
-
- Read from php.xml, write to PHP.php
-
- generate -x php.xml -p PHP.php
-
- Read from php.xml, write to standard output
-
- generate -x php.xml
-
- Read from php.xml, write to PHP.php, read from xml.xml, write to XML.php
-
- generate -x php.xml -p PHP.php -x xml.xml -p XML.php
-
- Read from php.xml, write to /some/dir/PHP.php, read from xml.xml, write to
- /some/dir/XML.php (assuming that xml.xml contains <highlight lang="xml">, and
- php.xml contains <highlight lang="php">)
-
- generate -x php.xml -x xml.xml -d /some/dir/
-
-
-
-Renderers
-=========
-
-Introduction
-------------
-
-Text_Highlighter supports renderes. Using renderers, you can get output in
-different formats. Two renderers are included in the package:
-
- - HTML renderer. Generates HTML output. A style sheet should be linked to
- the document to display colored text
-
- - Console renderer. Can be used to output highlighted text to
- color-capable terminals, either directly or trough less -r
-
-
-Renderers API
--------------
-
-Renderers are subclasses of Text_Highlighter_Renderer. Renderer should
-override at least two methods - acceptToken and getOutput. Overriding other
-methods is optional, depending on the nature of renderer's output and details
-of implementation.
-
- string reset()
- resets renderer state. This method is called every time before a new
- source file is highlighted.
-
- string preprocess(string $code)
- preprocesses code. Can be used, for example, to normalize whitespace
- before highlighting. Returns preprocessed string.
-
- void acceptToken(string $group, string $content)
- the core method of the renderer. Highlighter passes chunks of text to
- this method in $content, and color group in $group
-
- void finalize()
- signals the renderer that no more tokens are available.
-
- mixed getOutput()
- returns generated output.
-
-
-Setting renderer options
---------------------------------
-
-Renderers accept an optional argument to their constructor - options array.
-Elements of this array are renderer-specific.
-
-HTML renderer
--------------
-
-HTML renderer produces HTML output with optional line numbering. The renderer
-itself does not provide information about actual colors of highlighted text.
-Instead, <span class="hl-XXX"> is used, where XXX is replaced with color group
-name (hl-var, hl-string, etc.). It is up to you to create a CSS stylesheet.
-If 'use_language' option with value evaluating to true was passed, class names
-will be formatted as "LANG-hl-XXX", where LANG is language name as defined in
-highlighter XML source ("lang" attribute of <highlight> tag) in lower case.
-
-There are 3 special CSS classes:
-
- hl-main - this class applies to whole output or right table column,
- depending on 'numbers' option
- hl-gutter - applies to left column in table
- hl-table - applies to whole table
-
-HTML renderer accepts following options (each being optional):
-
- * numbers - line numbering style.
- 0 - no numbering (default)
- HL_NUMBERS_LI - use <ol></ol> for line numbering
- HL_NUMBERS_TABLE - create a 2-column table, with line numbers in left
- column and highlighted text in right column
-
- * tabsize - tabulation size. Defaults to 4
-
- Example:
-
- require_once 'Text/Highlighter/Renderer/Html.php';
- $options = array(
- 'numbers' => HL_NUMBERS_LI,
- 'tabsize' => 8,
- );
- $renderer = new Text_Highlighter_Renderer_HTML($options);
-
-Console renderer
-----------------
-
-Console renderer produces output for displaying on a color-capable terminal,
-either directly or through less -r, using ANSI escape sequences. By default,
-this renderer only highlights most common color groups. Additional colors
-can be specified using 'colors' option. This renderer also accepts 'numbers'
-option - a boolean value, and 'tabsize' option.
-
- Example :
-
- require_once 'Text/Highlighter/Renderer/Console.php';
- $colors = array(
- 'prepro' => "\033[35m",
- 'types' => "\033[32m",
- );
- $options = array(
- 'numbers' => true,
- 'tabsize' => 8,
- 'colors' => $colors,
- );
- $renderer = new Text_Highlighter_Renderer_Console($options);
-
-
-ANSI color escape sequences have the following format:
-
- ESC[#;#;....;#m
-
-where ESC is character with ASCII code 27 (033 octal, 0x1B hexadecimal). # is
-one of the following:
-
- 0 for normal display
- 1 for bold on
- 4 underline (mono only)
- 5 blink on
- 7 reverse video on
- 8 nondisplayed (invisible)
- 30 black foreground
- 31 red foreground
- 32 green foreground
- 33 yellow foreground
- 34 blue foreground
- 35 magenta foreground
- 36 cyan foreground
- 37 white foreground
- 40 black background
- 41 red background
- 42 green background
- 43 yellow background
- 44 blue background
- 45 magenta background
- 46 cyan background
- 47 white background
-
-
-How to use Text_Highlighter class
-=================================
-
-Creating a highlighter object
------------------------------
-
-To create a highlighter for a certain language, use Text_Highlighter::factory()
-static method:
-
- require_once 'Text/Highlighter.php';
- $hl = Text_Highlighter::factory('php');
-
-
-Setting a renderer
-------------------
-
-Actual output is produced by a renderer.
-
- require_once 'Text/Highlighter.php';
- require_once 'Text/Highlighter/Renderer/Html.php';
- $options = array(
- 'numbers' => HL_NUMBERS_LI,
- 'tabsize' => 8,
- );
- $renderer = new Text_Highlighter_Renderer_HTML($options);
- $hl = Text_Highlighter::factory('php');
- $hl->setRenderer($renderer);
-
-Note that for BC reasons, it is possible to use highlighter without setting a
-renderer. If no renderer is set, HTML renderer will be used by default. In
-this case, you should pass options as second parameter to factory method. The
-following example works exactly as previous one:
-
- require_once 'Text/Highlighter.php';
- $options = array(
- 'numbers' => HL_NUMBERS_LI,
- 'tabsize' => 8,
- );
- $hl = Text_Highlighter::factory('php', $options);
-
-
-Getting output
---------------
-
-And finally, do the highlighting and get the output:
-
- require_once 'Text/Highlighter.php';
- require_once 'Text/Highlighter/Renderer/Html.php';
- $options = array(
- 'numbers' => HL_NUMBERS_LI,
- 'tabsize' => 8,
- );
- $renderer = new Text_Highlighter_Renderer_HTML($options);
- $hl = Text_Highlighter::factory('php');
- $hl->setRenderer($renderer);
- $html = $hl->highlight(file_get_contents('example.php'));
-
-# vim: set autoindent tabstop=4 shiftwidth=4 softtabstop=4 tw=78: */
-
diff --git a/library/Text_Highlighter/TODO b/library/Text_Highlighter/TODO
deleted file mode 100644
index 77a148b8a..000000000
--- a/library/Text_Highlighter/TODO
+++ /dev/null
@@ -1,12 +0,0 @@
-# $Id$
-
-Major issues to solve (but I currently have no idea how) :
-
-- speedup highlighting process
-
-- switching between highlighters depending on context, for example :
- PHP code -> HTML -> (JavaScript|CSS)
-
-
-# vim: set autoindent tabstop=4 shiftwidth=4 softtabstop=4 tw=78: */
-
diff --git a/library/Text_Highlighter/Text/Highlighter.php b/library/Text_Highlighter/Text/Highlighter.php
deleted file mode 100644
index 480113c16..000000000
--- a/library/Text_Highlighter/Text/Highlighter.php
+++ /dev/null
@@ -1,398 +0,0 @@
-<?php
-/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
-/**
- * Highlighter base class
- *
- * PHP versions 4 and 5
- *
- * LICENSE: This source file is subject to version 3.0 of the PHP license
- * that is available through the world-wide-web at the following URI:
- * http://www.php.net/license/3_0.txt. If you did not receive a copy of
- * the PHP License and are unable to obtain it through the web, please
- * send a note to license@php.net so we can mail you a copy immediately.
- *
- * @category Text
- * @package Text_Highlighter
- * @author Andrey Demenev <demenev@gmail.com>
- * @copyright 2004-2006 Andrey Demenev
- * @license http://www.php.net/license/3_0.txt PHP License
- * @version CVS: $Id$
- * @link http://pear.php.net/package/Text_Highlighter
- */
-
-// require_once 'PEAR.php';
-
-// {{{ BC constants
-
-// BC trick : define constants related to default
-// renderer if needed
-if (!defined('HL_NUMBERS_LI')) {
- /**#@+
- * Constant for use with $options['numbers']
- * @see Text_Highlighter_Renderer_Html::_init()
- */
- /**
- * use numbered list
- */
- define ('HL_NUMBERS_LI' , 1);
- /**
- * Use 2-column table with line numbers in left column and code in right column.
- * Forces $options['tag'] = HL_TAG_PRE
- */
- define ('HL_NUMBERS_TABLE' , 2);
- /**#@-*/
-}
-
-// }}}
-// {{{ constants
-/**
- * for our purpose, it is infinity
- */
-define ('HL_INFINITY', 1000000000);
-
-// }}}
-
-/**
- * Text highlighter base class
- *
- * @author Andrey Demenev <demenev@gmail.com>
- * @copyright 2004-2006 Andrey Demenev
- * @license http://www.php.net/license/3_0.txt PHP License
- * @version Release: @package_version@
- * @link http://pear.php.net/package/Text_Highlighter
- */
-
-// {{{ Text_Highlighter
-
-/**
- * Text highlighter base class
- *
- * This class implements all functions necessary for highlighting,
- * but it does not contain highlighting rules. Actual highlighting is
- * done using a descendent of this class.
- *
- * One is not supposed to manually create descendent classes.
- * Instead, describe highlighting rules in XML format and
- * use {@link Text_Highlighter_Generator} to create descendent class.
- * Alternatively, an instance of a descendent class can be created
- * directly.
- *
- * Use {@link Text_Highlighter::factory()} to create an
- * object for particular language highlighter
- *
- * Usage example
- * <code>
- *require_once 'Text/Highlighter.php';
- *$hlSQL = Text_Highlighter::factory('SQL',array('numbers'=>true));
- *echo $hlSQL->highlight('SELECT * FROM table a WHERE id = 12');
- * </code>
- *
- * @author Andrey Demenev <demenev@gmail.com>
- * @package Text_Highlighter
- * @access public
- */
-
-class Text_Highlighter
-{
- // {{{ members
-
- /**
- * Syntax highlighting rules.
- * Auto-generated classes set this var
- *
- * @access protected
- * @see _init
- * @var array
- */
- var $_syntax;
-
- /**
- * Renderer object.
- *
- * @access private
- * @var array
- */
- var $_renderer;
-
- /**
- * Options. Keeped for BC
- *
- * @access protected
- * @var array
- */
- var $_options = array();
-
- /**
- * Conditionds
- *
- * @access protected
- * @var array
- */
- var $_conditions = array();
-
- /**
- * Disabled keywords
- *
- * @access protected
- * @var array
- */
- var $_disabled = array();
-
- /**
- * Language
- *
- * @access protected
- * @var string
- */
- var $_language = '';
-
- // }}}
- // {{{ _checkDefines
-
- /**
- * Called by subclssses' constructors to enable/disable
- * optional highlighter rules
- *
- * @param array $defines Conditional defines
- *
- * @access protected
- */
- function _checkDefines()
- {
- if (isset($this->_options['defines'])) {
- $defines = $this->_options['defines'];
- } else {
- $defines = array();
- }
- foreach ($this->_conditions as $name => $actions) {
- foreach($actions as $action) {
- $present = in_array($name, $defines);
- if (!$action[1]) {
- $present = !$present;
- }
- if ($present) {
- unset($this->_disabled[$action[0]]);
- } else {
- $this->_disabled[$action[0]] = true;
- }
- }
- }
- }
-
- // }}}
- // {{{ factory
-
- /**
- * Create a new Highlighter object for specified language
- *
- * @param string $lang language, for example "SQL"
- * @param array $options Rendering options. This
- * parameter is only keeped for BC reasons, use
- * {@link Text_Highlighter::setRenderer()} instead
- *
- * @return mixed a newly created Highlighter object, or
- * a PEAR error object on error
- *
- * @static
- * @access public
- */
- function &factory($lang, $options = array())
- {
- $lang = strtoupper($lang);
- @include_once 'Text/Highlighter/' . $lang . '.php';
-
- $classname = 'Text_Highlighter_' . $lang;
-
- if (!class_exists($classname)) {
- return PEAR::raiseError('Highlighter for ' . $lang . ' not found');
- }
-
- $obj = new $classname($options);
-
- return $obj;
- }
-
- // }}}
- // {{{ setRenderer
-
- /**
- * Set renderer object
- *
- * @param object $renderer Text_Highlighter_Renderer
- *
- * @access public
- */
- function setRenderer(&$renderer)
- {
- $this->_renderer = $renderer;
- }
-
- // }}}
-
- /**
- * Helper function to find matching brackets
- *
- * @access private
- */
- function _matchingBrackets($str)
- {
- return strtr($str, '()<>[]{}', ')(><][}{');
- }
-
-
-
-
- function _getToken()
- {
- if (!empty($this->_tokenStack)) {
- return array_pop($this->_tokenStack);
- }
- if ($this->_pos >= $this->_len) {
- return NULL;
- }
-
- if ($this->_state != -1 && preg_match($this->_endpattern, $this->_str, $m, PREG_OFFSET_CAPTURE, $this->_pos)) {
- $endpos = $m[0][1];
- $endmatch = $m[0][0];
- } else {
- $endpos = -1;
- }
- preg_match ($this->_regs[$this->_state], $this->_str, $m, PREG_OFFSET_CAPTURE, $this->_pos);
- $n = 1;
-
-
- foreach ($this->_counts[$this->_state] as $i=>$count) {
- if (!isset($m[$n])) {
- break;
- }
- if ($m[$n][1]>-1 && ($endpos == -1 || $m[$n][1] < $endpos)) {
- if ($this->_states[$this->_state][$i] != -1) {
- $this->_tokenStack[] = array($this->_delim[$this->_state][$i], $m[$n][0]);
- } else {
- $inner = $this->_inner[$this->_state][$i];
- if (isset($this->_parts[$this->_state][$i])) {
- $parts = array();
- $partpos = $m[$n][1];
- for ($j=1; $j<=$count; $j++) {
- if ($m[$j+$n][1] < 0) {
- continue;
- }
- if (isset($this->_parts[$this->_state][$i][$j])) {
- if ($m[$j+$n][1] > $partpos) {
- array_unshift($parts, array($inner, substr($this->_str, $partpos, $m[$j+$n][1]-$partpos)));
- }
- array_unshift($parts, array($this->_parts[$this->_state][$i][$j], $m[$j+$n][0]));
- }
- $partpos = $m[$j+$n][1] + strlen($m[$j+$n][0]);
- }
- if ($partpos < $m[$n][1] + strlen($m[$n][0])) {
- array_unshift($parts, array($inner, substr($this->_str, $partpos, $m[$n][1] - $partpos + strlen($m[$n][0]))));
- }
- $this->_tokenStack = array_merge($this->_tokenStack, $parts);
- } else {
- foreach ($this->_keywords[$this->_state][$i] as $g => $re) {
- if (isset($this->_disabled[$g])) {
- continue;
- }
- if (preg_match($re, $m[$n][0])) {
- $inner = $this->_kwmap[$g];
- break;
- }
- }
- $this->_tokenStack[] = array($inner, $m[$n][0]);
- }
- }
- if ($m[$n][1] > $this->_pos) {
- $this->_tokenStack[] = array($this->_lastinner, substr($this->_str, $this->_pos, $m[$n][1]-$this->_pos));
- }
- $this->_pos = $m[$n][1] + strlen($m[$n][0]);
- if ($this->_states[$this->_state][$i] != -1) {
- $this->_stack[] = array($this->_state, $this->_lastdelim, $this->_lastinner, $this->_endpattern);
- $this->_lastinner = $this->_inner[$this->_state][$i];
- $this->_lastdelim = $this->_delim[$this->_state][$i];
- $l = $this->_state;
- $this->_state = $this->_states[$this->_state][$i];
- $this->_endpattern = $this->_end[$this->_state];
- if ($this->_subst[$l][$i]) {
- for ($k=0; $k<=$this->_counts[$l][$i]; $k++) {
- if (!isset($m[$i+$k])) {
- break;
- }
- $quoted = preg_quote($m[$n+$k][0], '/');
- $this->_endpattern = str_replace('%'.$k.'%', $quoted, $this->_endpattern);
- $this->_endpattern = str_replace('%b'.$k.'%', $this->_matchingBrackets($quoted), $this->_endpattern);
- }
- }
- }
- return array_pop($this->_tokenStack);
- }
- $n += $count + 1;
- }
-
- if ($endpos > -1) {
- $this->_tokenStack[] = array($this->_lastdelim, $endmatch);
- if ($endpos > $this->_pos) {
- $this->_tokenStack[] = array($this->_lastinner, substr($this->_str, $this->_pos, $endpos-$this->_pos));
- }
- list($this->_state, $this->_lastdelim, $this->_lastinner, $this->_endpattern) = array_pop($this->_stack);
- $this->_pos = $endpos + strlen($endmatch);
- return array_pop($this->_tokenStack);
- }
- $p = $this->_pos;
- $this->_pos = HL_INFINITY;
- return array($this->_lastinner, substr($this->_str, $p));
- }
-
-
-
-
- // {{{ highlight
-
- /**
- * Highlights code
- *
- * @param string $str Code to highlight
- * @access public
- * @return string Highlighted text
- *
- */
-
- function highlight($str)
- {
- if (!($this->_renderer)) {
- include_once('Text/Highlighter/Renderer/Html.php');
- $this->_renderer = new Text_Highlighter_Renderer_Html($this->_options);
- }
- $this->_state = -1;
- $this->_pos = 0;
- $this->_stack = array();
- $this->_tokenStack = array();
- $this->_lastinner = $this->_defClass;
- $this->_lastdelim = $this->_defClass;
- $this->_endpattern = '';
- $this->_renderer->reset();
- $this->_renderer->setCurrentLanguage($this->_language);
- $this->_str = $this->_renderer->preprocess($str);
- $this->_len = strlen($this->_str);
- while ($token = $this->_getToken()) {
- $this->_renderer->acceptToken($token[0], $token[1]);
- }
- $this->_renderer->finalize();
- return $this->_renderer->getOutput();
- }
-
- // }}}
-
-}
-
-// }}}
-
-/*
- * Local variables:
- * tab-width: 4
- * c-basic-offset: 4
- * c-hanging-comment-ender-p: nil
- * End:
- */
-
-?>
diff --git a/library/Text_Highlighter/Text/Highlighter/ABAP.php b/library/Text_Highlighter/Text/Highlighter/ABAP.php
deleted file mode 100644
index b2f7bda94..000000000
--- a/library/Text_Highlighter/Text/Highlighter/ABAP.php
+++ /dev/null
@@ -1,519 +0,0 @@
-<?php
-/**
- * Auto-generated class. ABAP syntax highlighting
- *
- * PHP version 4 and 5
- *
- * LICENSE: This source file is subject to version 3.0 of the PHP license
- * that is available through the world-wide-web at the following URI:
- * http://www.php.net/license/3_0.txt. If you did not receive a copy of
- * the PHP License and are unable to obtain it through the web, please
- * send a note to license@php.net so we can mail you a copy immediately.
- *
- * @copyright 2004-2006 Andrey Demenev
- * @license http://www.php.net/license/3_0.txt PHP License
- * @link http://pear.php.net/package/Text_Highlighter
- * @category Text
- * @package Text_Highlighter
- * @version generated from: : abap.xml,v 1.1 2007/06/03 02:35:28 ssttoo Exp
- * @author Stoyan Stefanov <ssttoo@gmail.com>
- *
- */
-
-/**
- * @ignore
- */
-
-require_once 'Text/Highlighter.php';
-
-/**
- * Auto-generated class. ABAP syntax highlighting
- *
- * @author Stoyan Stefanov <ssttoo@gmail.com>
- * @category Text
- * @package Text_Highlighter
- * @copyright 2004-2006 Andrey Demenev
- * @license http://www.php.net/license/3_0.txt PHP License
- * @version Release: @package_version@
- * @link http://pear.php.net/package/Text_Highlighter
- */
-class Text_Highlighter_ABAP extends Text_Highlighter
-{
- var $_language = 'abap';
-
- /**
- * PHP4 Compatible Constructor
- *
- * @param array $options
- * @access public
- */
- function Text_Highlighter_ABAP($options=array())
- {
- $this->__construct($options);
- }
-
-
- /**
- * Constructor
- *
- * @param array $options
- * @access public
- */
- function __construct($options=array())
- {
-
- $this->_options = $options;
- $this->_regs = array (
- -1 => '/((?i)\\{)|((?i)\\()|((?i)\\[)|((?i)^\\*|")|((?i)\')|((?i)[a-z_\\-]\\w*)/',
- 0 => '/((?i)\\{)|((?i)\\()|((?i)\\[)|((?i)^\\*|")|((?i)\')|((?i)0[xX][\\da-f]+)|((?i)\\d\\d*|\\b0\\b)|((?i)0[0-7]+)|((?i)(\\d*\\.\\d+)|(\\d+\\.\\d*))|((?i)[a-z_\\-]\\w*)/',
- 1 => '/((?i)\\{)|((?i)\\()|((?i)\\[)|((?i)^\\*|")|((?i)\')|((?i)0[xX][\\da-f]+)|((?i)\\d\\d*|\\b0\\b)|((?i)0[0-7]+)|((?i)(\\d*\\.\\d+)|(\\d+\\.\\d*))|((?i)[a-z_\\-]\\w*)/',
- 2 => '/((?i)\\{)|((?i)\\()|((?i)\\[)|((?i)^\\*|")|((?i)\')|((?i)0[xX][\\da-f]+)|((?i)\\d\\d*|\\b0\\b)|((?i)0[0-7]+)|((?i)(\\d*\\.\\d+)|(\\d+\\.\\d*))|((?i)[a-z_\\-]\\w*)/',
- 3 => '//',
- 4 => '//',
- );
- $this->_counts = array (
- -1 =>
- array (
- 0 => 0,
- 1 => 0,
- 2 => 0,
- 3 => 0,
- 4 => 0,
- 5 => 0,
- ),
- 0 =>
- array (
- 0 => 0,
- 1 => 0,
- 2 => 0,
- 3 => 0,
- 4 => 0,
- 5 => 0,
- 6 => 0,
- 7 => 0,
- 8 => 2,
- 9 => 0,
- ),
- 1 =>
- array (
- 0 => 0,
- 1 => 0,
- 2 => 0,
- 3 => 0,
- 4 => 0,
- 5 => 0,
- 6 => 0,
- 7 => 0,
- 8 => 2,
- 9 => 0,
- ),
- 2 =>
- array (
- 0 => 0,
- 1 => 0,
- 2 => 0,
- 3 => 0,
- 4 => 0,
- 5 => 0,
- 6 => 0,
- 7 => 0,
- 8 => 2,
- 9 => 0,
- ),
- 3 =>
- array (
- ),
- 4 =>
- array (
- ),
- );
- $this->_delim = array (
- -1 =>
- array (
- 0 => 'brackets',
- 1 => 'brackets',
- 2 => 'brackets',
- 3 => 'comment',
- 4 => 'quotes',
- 5 => '',
- ),
- 0 =>
- array (
- 0 => 'brackets',
- 1 => 'brackets',
- 2 => 'brackets',
- 3 => 'comment',
- 4 => 'quotes',
- 5 => '',
- 6 => '',
- 7 => '',
- 8 => '',
- 9 => '',
- ),
- 1 =>
- array (
- 0 => 'brackets',
- 1 => 'brackets',
- 2 => 'brackets',
- 3 => 'comment',
- 4 => 'quotes',
- 5 => '',
- 6 => '',
- 7 => '',
- 8 => '',
- 9 => '',
- ),
- 2 =>
- array (
- 0 => 'brackets',
- 1 => 'brackets',
- 2 => 'brackets',
- 3 => 'comment',
- 4 => 'quotes',
- 5 => '',
- 6 => '',
- 7 => '',
- 8 => '',
- 9 => '',
- ),
- 3 =>
- array (
- ),
- 4 =>
- array (
- ),
- );
- $this->_inner = array (
- -1 =>
- array (
- 0 => 'code',
- 1 => 'code',
- 2 => 'code',
- 3 => 'comment',
- 4 => 'string',
- 5 => 'identifier',
- ),
- 0 =>
- array (
- 0 => 'code',
- 1 => 'code',
- 2 => 'code',
- 3 => 'comment',
- 4 => 'string',
- 5 => 'number',
- 6 => 'number',
- 7 => 'number',
- 8 => 'number',
- 9 => 'identifier',
- ),
- 1 =>
- array (
- 0 => 'code',
- 1 => 'code',
- 2 => 'code',
- 3 => 'comment',
- 4 => 'string',
- 5 => 'number',
- 6 => 'number',
- 7 => 'number',
- 8 => 'number',
- 9 => 'identifier',
- ),
- 2 =>
- array (
- 0 => 'code',
- 1 => 'code',
- 2 => 'code',
- 3 => 'comment',
- 4 => 'string',
- 5 => 'number',
- 6 => 'number',
- 7 => 'number',
- 8 => 'number',
- 9 => 'identifier',
- ),
- 3 =>
- array (
- ),
- 4 =>
- array (
- ),
- );
- $this->_end = array (
- 0 => '/(?i)\\}/',
- 1 => '/(?i)\\)/',
- 2 => '/(?i)\\]/',
- 3 => '/(?mi)$/',
- 4 => '/(?i)\'/',
- );
- $this->_states = array (
- -1 =>
- array (
- 0 => 0,
- 1 => 1,
- 2 => 2,
- 3 => 3,
- 4 => 4,
- 5 => -1,
- ),
- 0 =>
- array (
- 0 => 0,
- 1 => 1,
- 2 => 2,
- 3 => 3,
- 4 => 4,
- 5 => -1,
- 6 => -1,
- 7 => -1,
- 8 => -1,
- 9 => -1,
- ),
- 1 =>
- array (
- 0 => 0,
- 1 => 1,
- 2 => 2,
- 3 => 3,
- 4 => 4,
- 5 => -1,
- 6 => -1,
- 7 => -1,
- 8 => -1,
- 9 => -1,
- ),
- 2 =>
- array (
- 0 => 0,
- 1 => 1,
- 2 => 2,
- 3 => 3,
- 4 => 4,
- 5 => -1,
- 6 => -1,
- 7 => -1,
- 8 => -1,
- 9 => -1,
- ),
- 3 =>
- array (
- ),
- 4 =>
- array (
- ),
- );
- $this->_keywords = array (
- -1 =>
- array (
- 0 => -1,
- 1 => -1,
- 2 => -1,
- 3 => -1,
- 4 => -1,
- 5 =>
- array (
- 'sy' => '/^((?i)screen-name|screen-group1|screen-group2|screen-group3|screen-group4|screen-required|screen-input|screen-output|screen-intensified|screen-invisible|screen-length|screen-active|sy-index|sy-pagno|sy-tabix|sy-tfill|sy-tlopc|sy-tmaxl|sy-toccu|sy-ttabc|sy-tstis|sy-ttabi|sy-dbcnt|sy-fdpos|sy-colno|sy-linct|sy-linno|sy-linsz|sy-pagct|sy-macol|sy-marow|sy-tleng|sy-sfoff|sy-willi|sy-lilli|sy-subrc|sy-fleng|sy-cucol|sy-curow|sy-lsind|sy-listi|sy-stepl|sy-tpagi|sy-winx1|sy-winy1|sy-winx2|sy-winy2|sy-winco|sy-winro|sy-windi|sy-srows|sy-scols|sy-loopc|sy-folen|sy-fodec|sy-tzone|sy-dayst|sy-ftype|sy-appli|sy-fdayw|sy-ccurs|sy-ccurt|sy-debug|sy-ctype|sy-input|sy-langu|sy-modno|sy-batch|sy-binpt|sy-calld|sy-dynnr|sy-dyngr|sy-newpa|sy-pri40|sy-rstrt|sy-wtitl|sy-cpage|sy-dbnam|sy-mandt|sy-prefx|sy-fmkey|sy-pexpi|sy-prini|sy-primm|sy-prrel|sy-playo|sy-prbig|sy-playp|sy-prnew|sy-prlog|sy-pdest|sy-plist|sy-pauth|sy-prdsn|sy-pnwpa|sy-callr|sy-repi2|sy-rtitl|sy-prrec|sy-prtxt|sy-prabt|sy-lpass|sy-nrpag|sy-paart|sy-prcop|sy-batzs|sy-bspld|sy-brep4|sy-batzo|sy-batzd|sy-batzw|sy-batzm|sy-ctabl|sy-dbsys|sy-dcsys|sy-macdb|sy-sysid|sy-opsys|sy-pfkey|sy-saprl|sy-tcode|sy-ucomm|sy-cfwae|sy-chwae|sy-spono|sy-sponr|sy-waers|sy-cdate|sy-datum|sy-slset|sy-subty|sy-subcs|sy-group|sy-ffile|sy-uzeit|sy-dsnam|sy-repid|sy-tabid|sy-tfdsn|sy-uname|sy-lstat|sy-abcde|sy-marky|sy-sfnam|sy-tname|sy-msgli|sy-title|sy-entry|sy-lisel|sy-uline|sy-xcode|sy-cprog|sy-xprog|sy-xform|sy-ldbpg|sy-tvar0|sy-tvar1|sy-tvar2|sy-tvar3|sy-tvar4|sy-tvar5|sy-tvar6|sy-tvar7|sy-tvar8|sy-tvar9|sy-msgid|sy-msgty|sy-msgno|sy-msgv1|sy-msgv2|sy-msgv3|sy-msgv4|sy-oncom|sy-vline|sy-winsl|sy-staco|sy-staro|sy-datar|sy-host|sy-locdb|sy-locop|sy-datlo|sy-timlo|sy-zonlo|syst-index|syst-pagno|syst-tabix|syst-tfill|syst-tlopc|syst-tmaxl|syst-toccu|syst-ttabc|syst-tstis|syst-ttabi|syst-dbcnt|syst-fdpos|syst-colno|syst-linct|syst-linno|syst-linsz|syst-pagct|syst-macol|syst-marow|syst-tleng|syst-sfoff|syst-willi|syst-lilli|syst-subrc|syst-fleng|syst-cucol|syst-curow|syst-lsind|syst-listi|syst-stepl|syst-tpagi|syst-winx1|syst-winy1|syst-winx2|syst-winy2|syst-winco|syst-winro|syst-windi|syst-srows|syst-scols|syst-loopc|syst-folen|syst-fodec|syst-tzone|syst-dayst|syst-ftype|syst-appli|syst-fdayw|syst-ccurs|syst-ccurt|syst-debug|syst-ctype|syst-input|syst-langu|syst-modno|syst-batch|syst-binpt|syst-calld|syst-dynnr|syst-dyngr|syst-newpa|syst-pri40|syst-rstrt|syst-wtitl|syst-cpage|syst-dbnam|syst-mandt|syst-prefx|syst-fmkey|syst-pexpi|syst-prini|syst-primm|syst-prrel|syst-playo|syst-prbig|syst-playp|syst-prnew|syst-prlog|syst-pdest|syst-plist|syst-pauth|syst-prdsn|syst-pnwpa|syst-callr|syst-repi2|syst-rtitl|syst-prrec|syst-prtxt|syst-prabt|syst-lpass|syst-nrpag|syst-paart|syst-prcop|syst-batzs|syst-bspld|syst-brep4|syst-batzo|syst-batzd|syst-batzw|syst-batzm|syst-ctabl|syst-dbsys|syst-dcsys|syst-macdb|syst-sysid|syst-opsys|syst-pfkey|syst-saprl|syst-tcode|syst-ucomm|syst-cfwae|syst-chwae|syst-spono|syst-sponr|syst-waers|syst-cdate|syst-datum|syst-slset|syst-subty|syst-subcs|syst-group|syst-ffile|syst-uzeit|syst-dsnam|syst-repid|syst-tabid|syst-tfdsn|syst-uname|syst-lstat|syst-abcde|syst-marky|syst-sfnam|syst-tname|syst-msgli|syst-title|syst-entry|syst-lisel|syst-uline|syst-xcode|syst-cprog|syst-xprog|syst-xform|syst-ldbpg|syst-tvar0|syst-tvar1|syst-tvar2|syst-tvar3|syst-tvar4|syst-tvar5|syst-tvar6|syst-tvar7|syst-tvar8|syst-tvar9|syst-msgid|syst-msgty|syst-msgno|syst-msgv1|syst-msgv2|syst-msgv3|syst-msgv4|syst-oncom|syst-vline|syst-winsl|syst-staco|syst-staro|syst-datar|syst-host|syst-locdb|syst-locop|syst-datlo|syst-timlo|syst-zonlo)$/',
- 'reserved' => '/^((?i)abs|acos|add|add-corresponding|adjacent|after|aliases|all|analyzer|and|any|append|as|ascending|asin|assign|assigned|assigning|at|atan|authority-check|avg|back|before|begin|binary|bit|bit-and|bit-not|bit-or|bit-xor|blank|block|break-point|buffer|by|c|call|case|catch|ceil|centered|chain|change|changing|check|checkbox|class|class-data|class-events|class-methods|class-pool|clear|client|close|cnt|code|collect|color|comment|commit|communication|compute|concatenate|condense|constants|context|contexts|continue|control|controls|convert|copy|corresponding|cos|cosh|count|country|create|currency|cursor|customer-function|data|database|dataset|delete|decimals|default|define|demand|descending|describe|dialog|distinct|div|divide|divide-corresponding|do|duplicates|dynpro|edit|editor-call|else|elseif|end|end-of-definition|end-of-page|end-of-selection|endat|endcase|endcatch|endchain|endclass|enddo|endexec|endform|endfunction|endif|endinterface|endloop|endmethod|endmodule|endon|endprovide|endselect|endwhile|entries|events|exec|exit|exit-command|exp|exponent|export|exporting|exceptions|extended|extract|fetch|field|field-groups|field-symbols|fields|floor|for|form|format|frac|frame|free|from|function|function-pool|generate|get|group|hashed|header|help-id|help-request|hide|hotspot|icon|id|if|import|importing|include|index|infotypes|initialization|inner|input|insert|intensified|interface|interface-pool|interfaces|into|inverse|join|key|language|last|leave|left|left-justified|like|line|line-count|line-selection|line-size|lines|list-processing|load|load-of-program|local|locale|log|log10|loop|m|margin|mask|matchcode|max|memory|message|message-id|messages|method|methods|min|mod|mode|modif|modify|module|move|move-corresponding|multiply|multiply-corresponding|new|new-line|new-page|next|no|no-gap|no-gaps|no-heading|no-scrolling|no-sign|no-title|no-zero|nodes|non-unique|o|object|obligatory|occurs|of|off|on|open|or|order|others|outer|output|overlay|pack|page|parameter|parameters|perform|pf-status|position|print|print-control|private|process|program|property|protected|provide|public|put|radiobutton|raise|raising|range|ranges|read|receive|refresh|reject|replace|report|requested|reserve|reset|right-justified|rollback|round|rows|rtti|run|scan|screen|search|separated|scroll|scroll-boundary|select|select-options|selection-screen|selection-table|set|shared|shift|sign|sin|single|sinh|size|skip|sort|sorted|split|sql|sqrt|stamp|standard|start-of-selection|statics|stop|string|strlen|structure|submit|subtract|subtract-corresponding|sum|supply|suppress|symbol|syntax-check|syntax-trace|system-call|system-exceptions|table|table_line|tables|tan|tanh|text|textpool|time|times|title|titlebar|to|top-of-page|transaction|transfer|translate|transporting|trunc|type|type-pool|type-pools|types|uline|under|unique|unit|unpack|up|update|user-command|using|value|value-request|values|vary|when|where|while|window|with|with-title|work|write|x|xstring|z|zone)$/',
- 'constants' => '/^((?i)initial|null|space|col_background|col_heading|col_normal|col_total|col_key|col_positive|col_negative|col_group)$/',
- ),
- ),
- 0 =>
- array (
- 0 => -1,
- 1 => -1,
- 2 => -1,
- 3 => -1,
- 4 => -1,
- 5 =>
- array (
- ),
- 6 =>
- array (
- ),
- 7 =>
- array (
- ),
- 8 =>
- array (
- ),
- 9 =>
- array (
- 'sy' => '/^((?i)screen-name|screen-group1|screen-group2|screen-group3|screen-group4|screen-required|screen-input|screen-output|screen-intensified|screen-invisible|screen-length|screen-active|sy-index|sy-pagno|sy-tabix|sy-tfill|sy-tlopc|sy-tmaxl|sy-toccu|sy-ttabc|sy-tstis|sy-ttabi|sy-dbcnt|sy-fdpos|sy-colno|sy-linct|sy-linno|sy-linsz|sy-pagct|sy-macol|sy-marow|sy-tleng|sy-sfoff|sy-willi|sy-lilli|sy-subrc|sy-fleng|sy-cucol|sy-curow|sy-lsind|sy-listi|sy-stepl|sy-tpagi|sy-winx1|sy-winy1|sy-winx2|sy-winy2|sy-winco|sy-winro|sy-windi|sy-srows|sy-scols|sy-loopc|sy-folen|sy-fodec|sy-tzone|sy-dayst|sy-ftype|sy-appli|sy-fdayw|sy-ccurs|sy-ccurt|sy-debug|sy-ctype|sy-input|sy-langu|sy-modno|sy-batch|sy-binpt|sy-calld|sy-dynnr|sy-dyngr|sy-newpa|sy-pri40|sy-rstrt|sy-wtitl|sy-cpage|sy-dbnam|sy-mandt|sy-prefx|sy-fmkey|sy-pexpi|sy-prini|sy-primm|sy-prrel|sy-playo|sy-prbig|sy-playp|sy-prnew|sy-prlog|sy-pdest|sy-plist|sy-pauth|sy-prdsn|sy-pnwpa|sy-callr|sy-repi2|sy-rtitl|sy-prrec|sy-prtxt|sy-prabt|sy-lpass|sy-nrpag|sy-paart|sy-prcop|sy-batzs|sy-bspld|sy-brep4|sy-batzo|sy-batzd|sy-batzw|sy-batzm|sy-ctabl|sy-dbsys|sy-dcsys|sy-macdb|sy-sysid|sy-opsys|sy-pfkey|sy-saprl|sy-tcode|sy-ucomm|sy-cfwae|sy-chwae|sy-spono|sy-sponr|sy-waers|sy-cdate|sy-datum|sy-slset|sy-subty|sy-subcs|sy-group|sy-ffile|sy-uzeit|sy-dsnam|sy-repid|sy-tabid|sy-tfdsn|sy-uname|sy-lstat|sy-abcde|sy-marky|sy-sfnam|sy-tname|sy-msgli|sy-title|sy-entry|sy-lisel|sy-uline|sy-xcode|sy-cprog|sy-xprog|sy-xform|sy-ldbpg|sy-tvar0|sy-tvar1|sy-tvar2|sy-tvar3|sy-tvar4|sy-tvar5|sy-tvar6|sy-tvar7|sy-tvar8|sy-tvar9|sy-msgid|sy-msgty|sy-msgno|sy-msgv1|sy-msgv2|sy-msgv3|sy-msgv4|sy-oncom|sy-vline|sy-winsl|sy-staco|sy-staro|sy-datar|sy-host|sy-locdb|sy-locop|sy-datlo|sy-timlo|sy-zonlo|syst-index|syst-pagno|syst-tabix|syst-tfill|syst-tlopc|syst-tmaxl|syst-toccu|syst-ttabc|syst-tstis|syst-ttabi|syst-dbcnt|syst-fdpos|syst-colno|syst-linct|syst-linno|syst-linsz|syst-pagct|syst-macol|syst-marow|syst-tleng|syst-sfoff|syst-willi|syst-lilli|syst-subrc|syst-fleng|syst-cucol|syst-curow|syst-lsind|syst-listi|syst-stepl|syst-tpagi|syst-winx1|syst-winy1|syst-winx2|syst-winy2|syst-winco|syst-winro|syst-windi|syst-srows|syst-scols|syst-loopc|syst-folen|syst-fodec|syst-tzone|syst-dayst|syst-ftype|syst-appli|syst-fdayw|syst-ccurs|syst-ccurt|syst-debug|syst-ctype|syst-input|syst-langu|syst-modno|syst-batch|syst-binpt|syst-calld|syst-dynnr|syst-dyngr|syst-newpa|syst-pri40|syst-rstrt|syst-wtitl|syst-cpage|syst-dbnam|syst-mandt|syst-prefx|syst-fmkey|syst-pexpi|syst-prini|syst-primm|syst-prrel|syst-playo|syst-prbig|syst-playp|syst-prnew|syst-prlog|syst-pdest|syst-plist|syst-pauth|syst-prdsn|syst-pnwpa|syst-callr|syst-repi2|syst-rtitl|syst-prrec|syst-prtxt|syst-prabt|syst-lpass|syst-nrpag|syst-paart|syst-prcop|syst-batzs|syst-bspld|syst-brep4|syst-batzo|syst-batzd|syst-batzw|syst-batzm|syst-ctabl|syst-dbsys|syst-dcsys|syst-macdb|syst-sysid|syst-opsys|syst-pfkey|syst-saprl|syst-tcode|syst-ucomm|syst-cfwae|syst-chwae|syst-spono|syst-sponr|syst-waers|syst-cdate|syst-datum|syst-slset|syst-subty|syst-subcs|syst-group|syst-ffile|syst-uzeit|syst-dsnam|syst-repid|syst-tabid|syst-tfdsn|syst-uname|syst-lstat|syst-abcde|syst-marky|syst-sfnam|syst-tname|syst-msgli|syst-title|syst-entry|syst-lisel|syst-uline|syst-xcode|syst-cprog|syst-xprog|syst-xform|syst-ldbpg|syst-tvar0|syst-tvar1|syst-tvar2|syst-tvar3|syst-tvar4|syst-tvar5|syst-tvar6|syst-tvar7|syst-tvar8|syst-tvar9|syst-msgid|syst-msgty|syst-msgno|syst-msgv1|syst-msgv2|syst-msgv3|syst-msgv4|syst-oncom|syst-vline|syst-winsl|syst-staco|syst-staro|syst-datar|syst-host|syst-locdb|syst-locop|syst-datlo|syst-timlo|syst-zonlo)$/',
- 'reserved' => '/^((?i)abs|acos|add|add-corresponding|adjacent|after|aliases|all|analyzer|and|any|append|as|ascending|asin|assign|assigned|assigning|at|atan|authority-check|avg|back|before|begin|binary|bit|bit-and|bit-not|bit-or|bit-xor|blank|block|break-point|buffer|by|c|call|case|catch|ceil|centered|chain|change|changing|check|checkbox|class|class-data|class-events|class-methods|class-pool|clear|client|close|cnt|code|collect|color|comment|commit|communication|compute|concatenate|condense|constants|context|contexts|continue|control|controls|convert|copy|corresponding|cos|cosh|count|country|create|currency|cursor|customer-function|data|database|dataset|delete|decimals|default|define|demand|descending|describe|dialog|distinct|div|divide|divide-corresponding|do|duplicates|dynpro|edit|editor-call|else|elseif|end|end-of-definition|end-of-page|end-of-selection|endat|endcase|endcatch|endchain|endclass|enddo|endexec|endform|endfunction|endif|endinterface|endloop|endmethod|endmodule|endon|endprovide|endselect|endwhile|entries|events|exec|exit|exit-command|exp|exponent|export|exporting|exceptions|extended|extract|fetch|field|field-groups|field-symbols|fields|floor|for|form|format|frac|frame|free|from|function|function-pool|generate|get|group|hashed|header|help-id|help-request|hide|hotspot|icon|id|if|import|importing|include|index|infotypes|initialization|inner|input|insert|intensified|interface|interface-pool|interfaces|into|inverse|join|key|language|last|leave|left|left-justified|like|line|line-count|line-selection|line-size|lines|list-processing|load|load-of-program|local|locale|log|log10|loop|m|margin|mask|matchcode|max|memory|message|message-id|messages|method|methods|min|mod|mode|modif|modify|module|move|move-corresponding|multiply|multiply-corresponding|new|new-line|new-page|next|no|no-gap|no-gaps|no-heading|no-scrolling|no-sign|no-title|no-zero|nodes|non-unique|o|object|obligatory|occurs|of|off|on|open|or|order|others|outer|output|overlay|pack|page|parameter|parameters|perform|pf-status|position|print|print-control|private|process|program|property|protected|provide|public|put|radiobutton|raise|raising|range|ranges|read|receive|refresh|reject|replace|report|requested|reserve|reset|right-justified|rollback|round|rows|rtti|run|scan|screen|search|separated|scroll|scroll-boundary|select|select-options|selection-screen|selection-table|set|shared|shift|sign|sin|single|sinh|size|skip|sort|sorted|split|sql|sqrt|stamp|standard|start-of-selection|statics|stop|string|strlen|structure|submit|subtract|subtract-corresponding|sum|supply|suppress|symbol|syntax-check|syntax-trace|system-call|system-exceptions|table|table_line|tables|tan|tanh|text|textpool|time|times|title|titlebar|to|top-of-page|transaction|transfer|translate|transporting|trunc|type|type-pool|type-pools|types|uline|under|unique|unit|unpack|up|update|user-command|using|value|value-request|values|vary|when|where|while|window|with|with-title|work|write|x|xstring|z|zone)$/',
- 'constants' => '/^((?i)initial|null|space|col_background|col_heading|col_normal|col_total|col_key|col_positive|col_negative|col_group)$/',
- ),
- ),
- 1 =>
- array (
- 0 => -1,
- 1 => -1,
- 2 => -1,
- 3 => -1,
- 4 => -1,
- 5 =>
- array (
- ),
- 6 =>
- array (
- ),
- 7 =>
- array (
- ),
- 8 =>
- array (
- ),
- 9 =>
- array (
- 'sy' => '/^((?i)screen-name|screen-group1|screen-group2|screen-group3|screen-group4|screen-required|screen-input|screen-output|screen-intensified|screen-invisible|screen-length|screen-active|sy-index|sy-pagno|sy-tabix|sy-tfill|sy-tlopc|sy-tmaxl|sy-toccu|sy-ttabc|sy-tstis|sy-ttabi|sy-dbcnt|sy-fdpos|sy-colno|sy-linct|sy-linno|sy-linsz|sy-pagct|sy-macol|sy-marow|sy-tleng|sy-sfoff|sy-willi|sy-lilli|sy-subrc|sy-fleng|sy-cucol|sy-curow|sy-lsind|sy-listi|sy-stepl|sy-tpagi|sy-winx1|sy-winy1|sy-winx2|sy-winy2|sy-winco|sy-winro|sy-windi|sy-srows|sy-scols|sy-loopc|sy-folen|sy-fodec|sy-tzone|sy-dayst|sy-ftype|sy-appli|sy-fdayw|sy-ccurs|sy-ccurt|sy-debug|sy-ctype|sy-input|sy-langu|sy-modno|sy-batch|sy-binpt|sy-calld|sy-dynnr|sy-dyngr|sy-newpa|sy-pri40|sy-rstrt|sy-wtitl|sy-cpage|sy-dbnam|sy-mandt|sy-prefx|sy-fmkey|sy-pexpi|sy-prini|sy-primm|sy-prrel|sy-playo|sy-prbig|sy-playp|sy-prnew|sy-prlog|sy-pdest|sy-plist|sy-pauth|sy-prdsn|sy-pnwpa|sy-callr|sy-repi2|sy-rtitl|sy-prrec|sy-prtxt|sy-prabt|sy-lpass|sy-nrpag|sy-paart|sy-prcop|sy-batzs|sy-bspld|sy-brep4|sy-batzo|sy-batzd|sy-batzw|sy-batzm|sy-ctabl|sy-dbsys|sy-dcsys|sy-macdb|sy-sysid|sy-opsys|sy-pfkey|sy-saprl|sy-tcode|sy-ucomm|sy-cfwae|sy-chwae|sy-spono|sy-sponr|sy-waers|sy-cdate|sy-datum|sy-slset|sy-subty|sy-subcs|sy-group|sy-ffile|sy-uzeit|sy-dsnam|sy-repid|sy-tabid|sy-tfdsn|sy-uname|sy-lstat|sy-abcde|sy-marky|sy-sfnam|sy-tname|sy-msgli|sy-title|sy-entry|sy-lisel|sy-uline|sy-xcode|sy-cprog|sy-xprog|sy-xform|sy-ldbpg|sy-tvar0|sy-tvar1|sy-tvar2|sy-tvar3|sy-tvar4|sy-tvar5|sy-tvar6|sy-tvar7|sy-tvar8|sy-tvar9|sy-msgid|sy-msgty|sy-msgno|sy-msgv1|sy-msgv2|sy-msgv3|sy-msgv4|sy-oncom|sy-vline|sy-winsl|sy-staco|sy-staro|sy-datar|sy-host|sy-locdb|sy-locop|sy-datlo|sy-timlo|sy-zonlo|syst-index|syst-pagno|syst-tabix|syst-tfill|syst-tlopc|syst-tmaxl|syst-toccu|syst-ttabc|syst-tstis|syst-ttabi|syst-dbcnt|syst-fdpos|syst-colno|syst-linct|syst-linno|syst-linsz|syst-pagct|syst-macol|syst-marow|syst-tleng|syst-sfoff|syst-willi|syst-lilli|syst-subrc|syst-fleng|syst-cucol|syst-curow|syst-lsind|syst-listi|syst-stepl|syst-tpagi|syst-winx1|syst-winy1|syst-winx2|syst-winy2|syst-winco|syst-winro|syst-windi|syst-srows|syst-scols|syst-loopc|syst-folen|syst-fodec|syst-tzone|syst-dayst|syst-ftype|syst-appli|syst-fdayw|syst-ccurs|syst-ccurt|syst-debug|syst-ctype|syst-input|syst-langu|syst-modno|syst-batch|syst-binpt|syst-calld|syst-dynnr|syst-dyngr|syst-newpa|syst-pri40|syst-rstrt|syst-wtitl|syst-cpage|syst-dbnam|syst-mandt|syst-prefx|syst-fmkey|syst-pexpi|syst-prini|syst-primm|syst-prrel|syst-playo|syst-prbig|syst-playp|syst-prnew|syst-prlog|syst-pdest|syst-plist|syst-pauth|syst-prdsn|syst-pnwpa|syst-callr|syst-repi2|syst-rtitl|syst-prrec|syst-prtxt|syst-prabt|syst-lpass|syst-nrpag|syst-paart|syst-prcop|syst-batzs|syst-bspld|syst-brep4|syst-batzo|syst-batzd|syst-batzw|syst-batzm|syst-ctabl|syst-dbsys|syst-dcsys|syst-macdb|syst-sysid|syst-opsys|syst-pfkey|syst-saprl|syst-tcode|syst-ucomm|syst-cfwae|syst-chwae|syst-spono|syst-sponr|syst-waers|syst-cdate|syst-datum|syst-slset|syst-subty|syst-subcs|syst-group|syst-ffile|syst-uzeit|syst-dsnam|syst-repid|syst-tabid|syst-tfdsn|syst-uname|syst-lstat|syst-abcde|syst-marky|syst-sfnam|syst-tname|syst-msgli|syst-title|syst-entry|syst-lisel|syst-uline|syst-xcode|syst-cprog|syst-xprog|syst-xform|syst-ldbpg|syst-tvar0|syst-tvar1|syst-tvar2|syst-tvar3|syst-tvar4|syst-tvar5|syst-tvar6|syst-tvar7|syst-tvar8|syst-tvar9|syst-msgid|syst-msgty|syst-msgno|syst-msgv1|syst-msgv2|syst-msgv3|syst-msgv4|syst-oncom|syst-vline|syst-winsl|syst-staco|syst-staro|syst-datar|syst-host|syst-locdb|syst-locop|syst-datlo|syst-timlo|syst-zonlo)$/',
- 'reserved' => '/^((?i)abs|acos|add|add-corresponding|adjacent|after|aliases|all|analyzer|and|any|append|as|ascending|asin|assign|assigned|assigning|at|atan|authority-check|avg|back|before|begin|binary|bit|bit-and|bit-not|bit-or|bit-xor|blank|block|break-point|buffer|by|c|call|case|catch|ceil|centered|chain|change|changing|check|checkbox|class|class-data|class-events|class-methods|class-pool|clear|client|close|cnt|code|collect|color|comment|commit|communication|compute|concatenate|condense|constants|context|contexts|continue|control|controls|convert|copy|corresponding|cos|cosh|count|country|create|currency|cursor|customer-function|data|database|dataset|delete|decimals|default|define|demand|descending|describe|dialog|distinct|div|divide|divide-corresponding|do|duplicates|dynpro|edit|editor-call|else|elseif|end|end-of-definition|end-of-page|end-of-selection|endat|endcase|endcatch|endchain|endclass|enddo|endexec|endform|endfunction|endif|endinterface|endloop|endmethod|endmodule|endon|endprovide|endselect|endwhile|entries|events|exec|exit|exit-command|exp|exponent|export|exporting|exceptions|extended|extract|fetch|field|field-groups|field-symbols|fields|floor|for|form|format|frac|frame|free|from|function|function-pool|generate|get|group|hashed|header|help-id|help-request|hide|hotspot|icon|id|if|import|importing|include|index|infotypes|initialization|inner|input|insert|intensified|interface|interface-pool|interfaces|into|inverse|join|key|language|last|leave|left|left-justified|like|line|line-count|line-selection|line-size|lines|list-processing|load|load-of-program|local|locale|log|log10|loop|m|margin|mask|matchcode|max|memory|message|message-id|messages|method|methods|min|mod|mode|modif|modify|module|move|move-corresponding|multiply|multiply-corresponding|new|new-line|new-page|next|no|no-gap|no-gaps|no-heading|no-scrolling|no-sign|no-title|no-zero|nodes|non-unique|o|object|obligatory|occurs|of|off|on|open|or|order|others|outer|output|overlay|pack|page|parameter|parameters|perform|pf-status|position|print|print-control|private|process|program|property|protected|provide|public|put|radiobutton|raise|raising|range|ranges|read|receive|refresh|reject|replace|report|requested|reserve|reset|right-justified|rollback|round|rows|rtti|run|scan|screen|search|separated|scroll|scroll-boundary|select|select-options|selection-screen|selection-table|set|shared|shift|sign|sin|single|sinh|size|skip|sort|sorted|split|sql|sqrt|stamp|standard|start-of-selection|statics|stop|string|strlen|structure|submit|subtract|subtract-corresponding|sum|supply|suppress|symbol|syntax-check|syntax-trace|system-call|system-exceptions|table|table_line|tables|tan|tanh|text|textpool|time|times|title|titlebar|to|top-of-page|transaction|transfer|translate|transporting|trunc|type|type-pool|type-pools|types|uline|under|unique|unit|unpack|up|update|user-command|using|value|value-request|values|vary|when|where|while|window|with|with-title|work|write|x|xstring|z|zone)$/',
- 'constants' => '/^((?i)initial|null|space|col_background|col_heading|col_normal|col_total|col_key|col_positive|col_negative|col_group)$/',
- ),
- ),
- 2 =>
- array (
- 0 => -1,
- 1 => -1,
- 2 => -1,
- 3 => -1,
- 4 => -1,
- 5 =>
- array (
- ),
- 6 =>
- array (
- ),
- 7 =>
- array (
- ),
- 8 =>
- array (
- ),
- 9 =>
- array (
- 'sy' => '/^((?i)screen-name|screen-group1|screen-group2|screen-group3|screen-group4|screen-required|screen-input|screen-output|screen-intensified|screen-invisible|screen-length|screen-active|sy-index|sy-pagno|sy-tabix|sy-tfill|sy-tlopc|sy-tmaxl|sy-toccu|sy-ttabc|sy-tstis|sy-ttabi|sy-dbcnt|sy-fdpos|sy-colno|sy-linct|sy-linno|sy-linsz|sy-pagct|sy-macol|sy-marow|sy-tleng|sy-sfoff|sy-willi|sy-lilli|sy-subrc|sy-fleng|sy-cucol|sy-curow|sy-lsind|sy-listi|sy-stepl|sy-tpagi|sy-winx1|sy-winy1|sy-winx2|sy-winy2|sy-winco|sy-winro|sy-windi|sy-srows|sy-scols|sy-loopc|sy-folen|sy-fodec|sy-tzone|sy-dayst|sy-ftype|sy-appli|sy-fdayw|sy-ccurs|sy-ccurt|sy-debug|sy-ctype|sy-input|sy-langu|sy-modno|sy-batch|sy-binpt|sy-calld|sy-dynnr|sy-dyngr|sy-newpa|sy-pri40|sy-rstrt|sy-wtitl|sy-cpage|sy-dbnam|sy-mandt|sy-prefx|sy-fmkey|sy-pexpi|sy-prini|sy-primm|sy-prrel|sy-playo|sy-prbig|sy-playp|sy-prnew|sy-prlog|sy-pdest|sy-plist|sy-pauth|sy-prdsn|sy-pnwpa|sy-callr|sy-repi2|sy-rtitl|sy-prrec|sy-prtxt|sy-prabt|sy-lpass|sy-nrpag|sy-paart|sy-prcop|sy-batzs|sy-bspld|sy-brep4|sy-batzo|sy-batzd|sy-batzw|sy-batzm|sy-ctabl|sy-dbsys|sy-dcsys|sy-macdb|sy-sysid|sy-opsys|sy-pfkey|sy-saprl|sy-tcode|sy-ucomm|sy-cfwae|sy-chwae|sy-spono|sy-sponr|sy-waers|sy-cdate|sy-datum|sy-slset|sy-subty|sy-subcs|sy-group|sy-ffile|sy-uzeit|sy-dsnam|sy-repid|sy-tabid|sy-tfdsn|sy-uname|sy-lstat|sy-abcde|sy-marky|sy-sfnam|sy-tname|sy-msgli|sy-title|sy-entry|sy-lisel|sy-uline|sy-xcode|sy-cprog|sy-xprog|sy-xform|sy-ldbpg|sy-tvar0|sy-tvar1|sy-tvar2|sy-tvar3|sy-tvar4|sy-tvar5|sy-tvar6|sy-tvar7|sy-tvar8|sy-tvar9|sy-msgid|sy-msgty|sy-msgno|sy-msgv1|sy-msgv2|sy-msgv3|sy-msgv4|sy-oncom|sy-vline|sy-winsl|sy-staco|sy-staro|sy-datar|sy-host|sy-locdb|sy-locop|sy-datlo|sy-timlo|sy-zonlo|syst-index|syst-pagno|syst-tabix|syst-tfill|syst-tlopc|syst-tmaxl|syst-toccu|syst-ttabc|syst-tstis|syst-ttabi|syst-dbcnt|syst-fdpos|syst-colno|syst-linct|syst-linno|syst-linsz|syst-pagct|syst-macol|syst-marow|syst-tleng|syst-sfoff|syst-willi|syst-lilli|syst-subrc|syst-fleng|syst-cucol|syst-curow|syst-lsind|syst-listi|syst-stepl|syst-tpagi|syst-winx1|syst-winy1|syst-winx2|syst-winy2|syst-winco|syst-winro|syst-windi|syst-srows|syst-scols|syst-loopc|syst-folen|syst-fodec|syst-tzone|syst-dayst|syst-ftype|syst-appli|syst-fdayw|syst-ccurs|syst-ccurt|syst-debug|syst-ctype|syst-input|syst-langu|syst-modno|syst-batch|syst-binpt|syst-calld|syst-dynnr|syst-dyngr|syst-newpa|syst-pri40|syst-rstrt|syst-wtitl|syst-cpage|syst-dbnam|syst-mandt|syst-prefx|syst-fmkey|syst-pexpi|syst-prini|syst-primm|syst-prrel|syst-playo|syst-prbig|syst-playp|syst-prnew|syst-prlog|syst-pdest|syst-plist|syst-pauth|syst-prdsn|syst-pnwpa|syst-callr|syst-repi2|syst-rtitl|syst-prrec|syst-prtxt|syst-prabt|syst-lpass|syst-nrpag|syst-paart|syst-prcop|syst-batzs|syst-bspld|syst-brep4|syst-batzo|syst-batzd|syst-batzw|syst-batzm|syst-ctabl|syst-dbsys|syst-dcsys|syst-macdb|syst-sysid|syst-opsys|syst-pfkey|syst-saprl|syst-tcode|syst-ucomm|syst-cfwae|syst-chwae|syst-spono|syst-sponr|syst-waers|syst-cdate|syst-datum|syst-slset|syst-subty|syst-subcs|syst-group|syst-ffile|syst-uzeit|syst-dsnam|syst-repid|syst-tabid|syst-tfdsn|syst-uname|syst-lstat|syst-abcde|syst-marky|syst-sfnam|syst-tname|syst-msgli|syst-title|syst-entry|syst-lisel|syst-uline|syst-xcode|syst-cprog|syst-xprog|syst-xform|syst-ldbpg|syst-tvar0|syst-tvar1|syst-tvar2|syst-tvar3|syst-tvar4|syst-tvar5|syst-tvar6|syst-tvar7|syst-tvar8|syst-tvar9|syst-msgid|syst-msgty|syst-msgno|syst-msgv1|syst-msgv2|syst-msgv3|syst-msgv4|syst-oncom|syst-vline|syst-winsl|syst-staco|syst-staro|syst-datar|syst-host|syst-locdb|syst-locop|syst-datlo|syst-timlo|syst-zonlo)$/',
- 'reserved' => '/^((?i)abs|acos|add|add-corresponding|adjacent|after|aliases|all|analyzer|and|any|append|as|ascending|asin|assign|assigned|assigning|at|atan|authority-check|avg|back|before|begin|binary|bit|bit-and|bit-not|bit-or|bit-xor|blank|block|break-point|buffer|by|c|call|case|catch|ceil|centered|chain|change|changing|check|checkbox|class|class-data|class-events|class-methods|class-pool|clear|client|close|cnt|code|collect|color|comment|commit|communication|compute|concatenate|condense|constants|context|contexts|continue|control|controls|convert|copy|corresponding|cos|cosh|count|country|create|currency|cursor|customer-function|data|database|dataset|delete|decimals|default|define|demand|descending|describe|dialog|distinct|div|divide|divide-corresponding|do|duplicates|dynpro|edit|editor-call|else|elseif|end|end-of-definition|end-of-page|end-of-selection|endat|endcase|endcatch|endchain|endclass|enddo|endexec|endform|endfunction|endif|endinterface|endloop|endmethod|endmodule|endon|endprovide|endselect|endwhile|entries|events|exec|exit|exit-command|exp|exponent|export|exporting|exceptions|extended|extract|fetch|field|field-groups|field-symbols|fields|floor|for|form|format|frac|frame|free|from|function|function-pool|generate|get|group|hashed|header|help-id|help-request|hide|hotspot|icon|id|if|import|importing|include|index|infotypes|initialization|inner|input|insert|intensified|interface|interface-pool|interfaces|into|inverse|join|key|language|last|leave|left|left-justified|like|line|line-count|line-selection|line-size|lines|list-processing|load|load-of-program|local|locale|log|log10|loop|m|margin|mask|matchcode|max|memory|message|message-id|messages|method|methods|min|mod|mode|modif|modify|module|move|move-corresponding|multiply|multiply-corresponding|new|new-line|new-page|next|no|no-gap|no-gaps|no-heading|no-scrolling|no-sign|no-title|no-zero|nodes|non-unique|o|object|obligatory|occurs|of|off|on|open|or|order|others|outer|output|overlay|pack|page|parameter|parameters|perform|pf-status|position|print|print-control|private|process|program|property|protected|provide|public|put|radiobutton|raise|raising|range|ranges|read|receive|refresh|reject|replace|report|requested|reserve|reset|right-justified|rollback|round|rows|rtti|run|scan|screen|search|separated|scroll|scroll-boundary|select|select-options|selection-screen|selection-table|set|shared|shift|sign|sin|single|sinh|size|skip|sort|sorted|split|sql|sqrt|stamp|standard|start-of-selection|statics|stop|string|strlen|structure|submit|subtract|subtract-corresponding|sum|supply|suppress|symbol|syntax-check|syntax-trace|system-call|system-exceptions|table|table_line|tables|tan|tanh|text|textpool|time|times|title|titlebar|to|top-of-page|transaction|transfer|translate|transporting|trunc|type|type-pool|type-pools|types|uline|under|unique|unit|unpack|up|update|user-command|using|value|value-request|values|vary|when|where|while|window|with|with-title|work|write|x|xstring|z|zone)$/',
- 'constants' => '/^((?i)initial|null|space|col_background|col_heading|col_normal|col_total|col_key|col_positive|col_negative|col_group)$/',
- ),
- ),
- 3 =>
- array (
- ),
- 4 =>
- array (
- ),
- );
- $this->_parts = array (
- 0 =>
- array (
- 0 => NULL,
- 1 => NULL,
- 2 => NULL,
- 3 => NULL,
- 4 => NULL,
- 5 => NULL,
- 6 => NULL,
- 7 => NULL,
- 8 => NULL,
- 9 => NULL,
- ),
- 1 =>
- array (
- 0 => NULL,
- 1 => NULL,
- 2 => NULL,
- 3 => NULL,
- 4 => NULL,
- 5 => NULL,
- 6 => NULL,
- 7 => NULL,
- 8 => NULL,
- 9 => NULL,
- ),
- 2 =>
- array (
- 0 => NULL,
- 1 => NULL,
- 2 => NULL,
- 3 => NULL,
- 4 => NULL,
- 5 => NULL,
- 6 => NULL,
- 7 => NULL,
- 8 => NULL,
- 9 => NULL,
- ),
- 3 =>
- array (
- ),
- 4 =>
- array (
- ),
- );
- $this->_subst = array (
- -1 =>
- array (
- 0 => false,
- 1 => false,
- 2 => false,
- 3 => false,
- 4 => false,
- 5 => false,
- ),
- 0 =>
- array (
- 0 => false,
- 1 => false,
- 2 => false,
- 3 => false,
- 4 => false,
- 5 => false,
- 6 => false,
- 7 => false,
- 8 => false,
- 9 => false,
- ),
- 1 =>
- array (
- 0 => false,
- 1 => false,
- 2 => false,
- 3 => false,
- 4 => false,
- 5 => false,
- 6 => false,
- 7 => false,
- 8 => false,
- 9 => false,
- ),
- 2 =>
- array (
- 0 => false,
- 1 => false,
- 2 => false,
- 3 => false,
- 4 => false,
- 5 => false,
- 6 => false,
- 7 => false,
- 8 => false,
- 9 => false,
- ),
- 3 =>
- array (
- ),
- 4 =>
- array (
- ),
- );
- $this->_conditions = array (
- );
- $this->_kwmap = array (
- 'sy' => 'reserved',
- 'reserved' => 'reserved',
- 'constants' => 'reserved',
- );
- $this->_defClass = 'code';
- $this->_checkDefines();
- }
-
-} \ No newline at end of file
diff --git a/library/Text_Highlighter/Text/Highlighter/AVRC.php b/library/Text_Highlighter/Text/Highlighter/AVRC.php
deleted file mode 100644
index de4b82ccd..000000000
--- a/library/Text_Highlighter/Text/Highlighter/AVRC.php
+++ /dev/null
@@ -1,894 +0,0 @@
-
-<?php
-/**
- * Auto-generated class. AVRC syntax highlighting
- *
- *
- * C/C++ highlighter specific to Atmel AVR microcontrollers
- *
- *
- * PHP version 4 and 5
- *
- * LICENSE: This source file is subject to version 3.0 of the PHP license
- * that is available through the world-wide-web at the following URI:
- * http://www.php.net/license/3_0.txt. If you did not receive a copy of
- * the PHP License and are unable to obtain it through the web, please
- * send a note to license@php.net so we can mail you a copy immediately.
- *
- * @copyright 2004-2006 Andrey Demenev
- * @license http://www.php.net/license/3_0.txt PHP License
- * @link http://pear.php.net/package/Text_Highlighter
- * @category Text
- * @package Text_Highlighter
- * @version generated from: avrc.xml
- * @author Andrey Demenev <demenev@gmail.com>
- *
- */
-
-/**
- * @ignore
- */
-
-require_once 'Text/Highlighter.php';
-
-/**
- * Auto-generated class. AVRC syntax highlighting
- *
- * @author Andrey Demenev <demenev@gmail.com>
- * @category Text
- * @package Text_Highlighter
- * @copyright 2004-2006 Andrey Demenev
- * @license http://www.php.net/license/3_0.txt PHP License
- * @version Release: 0.7.0
- * @link http://pear.php.net/package/Text_Highlighter
- */
-class Text_Highlighter_AVRC extends Text_Highlighter
-{
- var $_language = 'avrc';
-
- /**
- * PHP4 Compatible Constructor
- *
- * @param array $options
- * @access public
- */
- function Text_Highlighter_AVRC($options=array())
- {
- $this->__construct($options);
- }
-
-
- /**
- * Constructor
- *
- * @param array $options
- * @access public
- */
- function __construct($options=array())
- {
-
- $this->_options = $options;
- $this->_regs = array (
- -1 => '/((?i)")|((?i)\\{)|((?i)\\()|((?i)\\[)|((?i)[a-z_]\\w*)|((?i)\\b0[xX][\\da-f]+)|((?i)\\b\\d\\d*|\\b0\\b)|((?i)\\b0[0-7]+)|((?i)\\b(\\d*\\.\\d+)|(\\d+\\.\\d*))|((?mi)^[ \\t]*#include)|((?mii)^[ \\t]*#[ \\t]*[a-z]+)|((?i)\\d*\\.?\\d+)|((?i)\\/\\*)|((?i)\\/\\/.+)/',
- 0 => '/((?i)\\\\)/',
- 1 => '/((?i)")|((?i)\\{)|((?i)\\()|((?i)\\[)|((?i)[a-z_]\\w*)|((?i)\\b0[xX][\\da-f]+)|((?i)\\b\\d\\d*|\\b0\\b)|((?i)\\b0[0-7]+)|((?i)\\b(\\d*\\.\\d+)|(\\d+\\.\\d*))|((?mi)^[ \\t]*#include)|((?mii)^[ \\t]*#[ \\t]*[a-z]+)|((?i)\\d*\\.?\\d+)|((?i)\\/\\*)|((?i)\\/\\/.+)/',
- 2 => '/((?i)")|((?i)\\{)|((?i)\\()|((?i)\\[)|((?i)[a-z_]\\w*)|((?i)\\b0[xX][\\da-f]+)|((?i)\\b\\d\\d*|\\b0\\b)|((?i)\\b0[0-7]+)|((?i)\\b(\\d*\\.\\d+)|(\\d+\\.\\d*))|((?mi)^[ \\t]*#include)|((?mii)^[ \\t]*#[ \\t]*[a-z]+)|((?i)\\d*\\.?\\d+)|((?i)\\/\\*)|((?i)\\/\\/.+)/',
- 3 => '/((?i)")|((?i)\\{)|((?i)\\()|((?i)\\[)|((?i)[a-z_]\\w*)|((?i)\\b0[xX][\\da-f]+)|((?i)\\b\\d\\d*|\\b0\\b)|((?i)\\b0[0-7]+)|((?i)\\b(\\d*\\.\\d+)|(\\d+\\.\\d*))|((?mi)^[ \\t]*#include)|((?mii)^[ \\t]*#[ \\t]*[a-z]+)|((?i)\\d*\\.?\\d+)|((?i)\\/\\*)|((?i)\\/\\/.+)/',
- 4 => '//',
- 5 => '/((?i)")|((?i)<)/',
- 6 => '/((?i)")|((?i)\\{)|((?i)\\()|((?i)[a-z_]\\w*)|((?i)\\b0[xX][\\da-f]+)|((?i)\\b\\d\\d*|\\b0\\b)|((?i)\\b0[0-7]+)|((?i)\\b(\\d*\\.\\d+)|(\\d+\\.\\d*))|((?i)\\/\\*)|((?i)\\/\\/.+)/',
- 7 => '/((?i)\\$\\w+\\s*:.+\\$)/',
- 8 => '/((?i)\\$\\w+\\s*:.+\\$)/',
- );
- $this->_counts = array (
- -1 =>
- array (
- 0 => 0,
- 1 => 0,
- 2 => 0,
- 3 => 0,
- 4 => 0,
- 5 => 0,
- 6 => 0,
- 7 => 0,
- 8 => 2,
- 9 => 0,
- 10 => 0,
- 11 => 0,
- 12 => 0,
- 13 => 0,
- ),
- 0 =>
- array (
- 0 => 0,
- ),
- 1 =>
- array (
- 0 => 0,
- 1 => 0,
- 2 => 0,
- 3 => 0,
- 4 => 0,
- 5 => 0,
- 6 => 0,
- 7 => 0,
- 8 => 2,
- 9 => 0,
- 10 => 0,
- 11 => 0,
- 12 => 0,
- 13 => 0,
- ),
- 2 =>
- array (
- 0 => 0,
- 1 => 0,
- 2 => 0,
- 3 => 0,
- 4 => 0,
- 5 => 0,
- 6 => 0,
- 7 => 0,
- 8 => 2,
- 9 => 0,
- 10 => 0,
- 11 => 0,
- 12 => 0,
- 13 => 0,
- ),
- 3 =>
- array (
- 0 => 0,
- 1 => 0,
- 2 => 0,
- 3 => 0,
- 4 => 0,
- 5 => 0,
- 6 => 0,
- 7 => 0,
- 8 => 2,
- 9 => 0,
- 10 => 0,
- 11 => 0,
- 12 => 0,
- 13 => 0,
- ),
- 4 =>
- array (
- ),
- 5 =>
- array (
- 0 => 0,
- 1 => 0,
- ),
- 6 =>
- array (
- 0 => 0,
- 1 => 0,
- 2 => 0,
- 3 => 0,
- 4 => 0,
- 5 => 0,
- 6 => 0,
- 7 => 2,
- 8 => 0,
- 9 => 0,
- ),
- 7 =>
- array (
- 0 => 0,
- ),
- 8 =>
- array (
- 0 => 0,
- ),
- );
- $this->_delim = array (
- -1 =>
- array (
- 0 => 'quotes',
- 1 => 'brackets',
- 2 => 'brackets',
- 3 => 'brackets',
- 4 => '',
- 5 => '',
- 6 => '',
- 7 => '',
- 8 => '',
- 9 => 'prepro',
- 10 => 'prepro',
- 11 => '',
- 12 => 'mlcomment',
- 13 => 'comment',
- ),
- 0 =>
- array (
- 0 => '',
- ),
- 1 =>
- array (
- 0 => 'quotes',
- 1 => 'brackets',
- 2 => 'brackets',
- 3 => 'brackets',
- 4 => '',
- 5 => '',
- 6 => '',
- 7 => '',
- 8 => '',
- 9 => 'prepro',
- 10 => 'prepro',
- 11 => '',
- 12 => 'mlcomment',
- 13 => 'comment',
- ),
- 2 =>
- array (
- 0 => 'quotes',
- 1 => 'brackets',
- 2 => 'brackets',
- 3 => 'brackets',
- 4 => '',
- 5 => '',
- 6 => '',
- 7 => '',
- 8 => '',
- 9 => 'prepro',
- 10 => 'prepro',
- 11 => '',
- 12 => 'mlcomment',
- 13 => 'comment',
- ),
- 3 =>
- array (
- 0 => 'quotes',
- 1 => 'brackets',
- 2 => 'brackets',
- 3 => 'brackets',
- 4 => '',
- 5 => '',
- 6 => '',
- 7 => '',
- 8 => '',
- 9 => 'prepro',
- 10 => 'prepro',
- 11 => '',
- 12 => 'mlcomment',
- 13 => 'comment',
- ),
- 4 =>
- array (
- ),
- 5 =>
- array (
- 0 => 'quotes',
- 1 => 'quotes',
- ),
- 6 =>
- array (
- 0 => 'quotes',
- 1 => 'brackets',
- 2 => 'brackets',
- 3 => '',
- 4 => '',
- 5 => '',
- 6 => '',
- 7 => '',
- 8 => 'mlcomment',
- 9 => 'comment',
- ),
- 7 =>
- array (
- 0 => '',
- ),
- 8 =>
- array (
- 0 => '',
- ),
- );
- $this->_inner = array (
- -1 =>
- array (
- 0 => 'string',
- 1 => 'code',
- 2 => 'code',
- 3 => 'code',
- 4 => 'identifier',
- 5 => 'number',
- 6 => 'number',
- 7 => 'number',
- 8 => 'number',
- 9 => 'prepro',
- 10 => 'code',
- 11 => 'number',
- 12 => 'mlcomment',
- 13 => 'comment',
- ),
- 0 =>
- array (
- 0 => 'special',
- ),
- 1 =>
- array (
- 0 => 'string',
- 1 => 'code',
- 2 => 'code',
- 3 => 'code',
- 4 => 'identifier',
- 5 => 'number',
- 6 => 'number',
- 7 => 'number',
- 8 => 'number',
- 9 => 'prepro',
- 10 => 'code',
- 11 => 'number',
- 12 => 'mlcomment',
- 13 => 'comment',
- ),
- 2 =>
- array (
- 0 => 'string',
- 1 => 'code',
- 2 => 'code',
- 3 => 'code',
- 4 => 'identifier',
- 5 => 'number',
- 6 => 'number',
- 7 => 'number',
- 8 => 'number',
- 9 => 'prepro',
- 10 => 'code',
- 11 => 'number',
- 12 => 'mlcomment',
- 13 => 'comment',
- ),
- 3 =>
- array (
- 0 => 'string',
- 1 => 'code',
- 2 => 'code',
- 3 => 'code',
- 4 => 'identifier',
- 5 => 'number',
- 6 => 'number',
- 7 => 'number',
- 8 => 'number',
- 9 => 'prepro',
- 10 => 'code',
- 11 => 'number',
- 12 => 'mlcomment',
- 13 => 'comment',
- ),
- 4 =>
- array (
- ),
- 5 =>
- array (
- 0 => 'string',
- 1 => 'string',
- ),
- 6 =>
- array (
- 0 => 'string',
- 1 => 'code',
- 2 => 'code',
- 3 => 'identifier',
- 4 => 'number',
- 5 => 'number',
- 6 => 'number',
- 7 => 'number',
- 8 => 'mlcomment',
- 9 => 'comment',
- ),
- 7 =>
- array (
- 0 => 'inlinedoc',
- ),
- 8 =>
- array (
- 0 => 'inlinedoc',
- ),
- );
- $this->_end = array (
- 0 => '/(?i)"/',
- 1 => '/(?i)\\}/',
- 2 => '/(?i)\\)/',
- 3 => '/(?i)\\]/',
- 4 => '/(?i)>/',
- 5 => '/(?mi)(?<!\\\\)$/',
- 6 => '/(?mi)(?<!\\\\)$/',
- 7 => '/(?i)\\*\\//',
- 8 => '/(?mi)$/',
- );
- $this->_states = array (
- -1 =>
- array (
- 0 => 0,
- 1 => 1,
- 2 => 2,
- 3 => 3,
- 4 => -1,
- 5 => -1,
- 6 => -1,
- 7 => -1,
- 8 => -1,
- 9 => 5,
- 10 => 6,
- 11 => -1,
- 12 => 7,
- 13 => 8,
- ),
- 0 =>
- array (
- 0 => -1,
- ),
- 1 =>
- array (
- 0 => 0,
- 1 => 1,
- 2 => 2,
- 3 => 3,
- 4 => -1,
- 5 => -1,
- 6 => -1,
- 7 => -1,
- 8 => -1,
- 9 => 5,
- 10 => 6,
- 11 => -1,
- 12 => 7,
- 13 => 8,
- ),
- 2 =>
- array (
- 0 => 0,
- 1 => 1,
- 2 => 2,
- 3 => 3,
- 4 => -1,
- 5 => -1,
- 6 => -1,
- 7 => -1,
- 8 => -1,
- 9 => 5,
- 10 => 6,
- 11 => -1,
- 12 => 7,
- 13 => 8,
- ),
- 3 =>
- array (
- 0 => 0,
- 1 => 1,
- 2 => 2,
- 3 => 3,
- 4 => -1,
- 5 => -1,
- 6 => -1,
- 7 => -1,
- 8 => -1,
- 9 => 5,
- 10 => 6,
- 11 => -1,
- 12 => 7,
- 13 => 8,
- ),
- 4 =>
- array (
- ),
- 5 =>
- array (
- 0 => 0,
- 1 => 4,
- ),
- 6 =>
- array (
- 0 => 0,
- 1 => 1,
- 2 => 2,
- 3 => -1,
- 4 => -1,
- 5 => -1,
- 6 => -1,
- 7 => -1,
- 8 => 7,
- 9 => 8,
- ),
- 7 =>
- array (
- 0 => -1,
- ),
- 8 =>
- array (
- 0 => -1,
- ),
- );
- $this->_keywords = array (
- -1 =>
- array (
- 0 => -1,
- 1 => -1,
- 2 => -1,
- 3 => -1,
- 4 =>
- array (
- 'reserved' => '/^(and|and_eq|asm|bitand|bitor|break|case|catch|compl|const_cast|continue|default|delete|do|dynamic_cast|else|for|fortran|friend|goto|if|new|not|not_eq|operator|or|or_eq|private|protected|public|reinterpret_cast|return|sizeof|static_cast|switch|this|throw|try|typeid|using|while|xor|xor_eq|false|true)$/',
- 'registers' => '/^(ACSR|ADCH|ADCL|ADCSRA|ADMUX|ASSR|DDRA|DDRB|DDRC|DDRD|DDRE|DDRF|DDRG|EEARH|EEARL|EECR|EEDR|EICRA|EICRB|EIFR|EIMSK|ETIFR|ETIMSK|GICR|GIFR|ICR1H|ICR1L|ICR3H|ICR3L|MCUCR|MCUCSR|OCDR|OCR0|OCR1AH|OCR1AL|OCR1BH|OCR1BL|OCR1CH|OCR1CL|OCR2|OCR3AH|OCR3AL|OCR3BH|OCR3BL|OCR3CH|OCR3CL|OSCCAL|PINA|PINB|PINC|PIND|PINE|PINF|PING|PORTA|PORTB|PORTC|PORTD|PORTE|PORTF|PORTG|RAMPZ|SFIOR|SPCR|SPDR|SPH|SPL|SPMCR|SPMCSR|SPSR|SREG|TCCR0|TCCR1A|TCCR1B|TCCR1C|TCCR2|TCCR3A|TCCR3B|TCCR3C|TCNT0|TCNT1H|TCNT1L|TCNT2|TCNT3H|TCNT3L|TIFR|TIMSK|TWAR|TWBR|TWCR|TWDR|TWSR|UBRR0H|UBRR0L|UBRR1H|UBRR1L|UBRRH|UBRRL|UCSR0A|UCSR0B|UCSR0C|UCSR1A|UCSR1B|UCSR1C|UCSRA|UCSRB|UCSRC|UDR|UDR0|UDR1|WDTCR|XDIV|XMCRA|XMCRB)$/',
- 'types' => '/^(auto|bool|char|class|const|double|enum|explicit|export|extern|float|inline|int|long|mutable|namespace|register|short|signed|static|struct|template|typedef|typename|union|unsigned|virtual|void|volatile|wchar_t)$/',
- 'Common Macros' => '/^(NULL|TRUE|FALSE|MAX|MIN|__LINE__|__DATA__|__FILE__|__TIME__|__STDC__)$/',
- ),
- 5 =>
- array (
- ),
- 6 =>
- array (
- ),
- 7 =>
- array (
- ),
- 8 =>
- array (
- ),
- 9 => -1,
- 10 => -1,
- 11 =>
- array (
- ),
- 12 => -1,
- 13 => -1,
- ),
- 0 =>
- array (
- 0 =>
- array (
- ),
- ),
- 1 =>
- array (
- 0 => -1,
- 1 => -1,
- 2 => -1,
- 3 => -1,
- 4 =>
- array (
- 'reserved' => '/^(and|and_eq|asm|bitand|bitor|break|case|catch|compl|const_cast|continue|default|delete|do|dynamic_cast|else|for|fortran|friend|goto|if|new|not|not_eq|operator|or|or_eq|private|protected|public|reinterpret_cast|return|sizeof|static_cast|switch|this|throw|try|typeid|using|while|xor|xor_eq|false|true)$/',
- 'registers' => '/^(ACSR|ADCH|ADCL|ADCSRA|ADMUX|ASSR|DDRA|DDRB|DDRC|DDRD|DDRE|DDRF|DDRG|EEARH|EEARL|EECR|EEDR|EICRA|EICRB|EIFR|EIMSK|ETIFR|ETIMSK|GICR|GIFR|ICR1H|ICR1L|ICR3H|ICR3L|MCUCR|MCUCSR|OCDR|OCR0|OCR1AH|OCR1AL|OCR1BH|OCR1BL|OCR1CH|OCR1CL|OCR2|OCR3AH|OCR3AL|OCR3BH|OCR3BL|OCR3CH|OCR3CL|OSCCAL|PINA|PINB|PINC|PIND|PINE|PINF|PING|PORTA|PORTB|PORTC|PORTD|PORTE|PORTF|PORTG|RAMPZ|SFIOR|SPCR|SPDR|SPH|SPL|SPMCR|SPMCSR|SPSR|SREG|TCCR0|TCCR1A|TCCR1B|TCCR1C|TCCR2|TCCR3A|TCCR3B|TCCR3C|TCNT0|TCNT1H|TCNT1L|TCNT2|TCNT3H|TCNT3L|TIFR|TIMSK|TWAR|TWBR|TWCR|TWDR|TWSR|UBRR0H|UBRR0L|UBRR1H|UBRR1L|UBRRH|UBRRL|UCSR0A|UCSR0B|UCSR0C|UCSR1A|UCSR1B|UCSR1C|UCSRA|UCSRB|UCSRC|UDR|UDR0|UDR1|WDTCR|XDIV|XMCRA|XMCRB)$/',
- 'types' => '/^(auto|bool|char|class|const|double|enum|explicit|export|extern|float|inline|int|long|mutable|namespace|register|short|signed|static|struct|template|typedef|typename|union|unsigned|virtual|void|volatile|wchar_t)$/',
- 'Common Macros' => '/^(NULL|TRUE|FALSE|MAX|MIN|__LINE__|__DATA__|__FILE__|__TIME__|__STDC__)$/',
- ),
- 5 =>
- array (
- ),
- 6 =>
- array (
- ),
- 7 =>
- array (
- ),
- 8 =>
- array (
- ),
- 9 => -1,
- 10 => -1,
- 11 =>
- array (
- ),
- 12 => -1,
- 13 => -1,
- ),
- 2 =>
- array (
- 0 => -1,
- 1 => -1,
- 2 => -1,
- 3 => -1,
- 4 =>
- array (
- 'reserved' => '/^(and|and_eq|asm|bitand|bitor|break|case|catch|compl|const_cast|continue|default|delete|do|dynamic_cast|else|for|fortran|friend|goto|if|new|not|not_eq|operator|or|or_eq|private|protected|public|reinterpret_cast|return|sizeof|static_cast|switch|this|throw|try|typeid|using|while|xor|xor_eq|false|true)$/',
- 'registers' => '/^(ACSR|ADCH|ADCL|ADCSRA|ADMUX|ASSR|DDRA|DDRB|DDRC|DDRD|DDRE|DDRF|DDRG|EEARH|EEARL|EECR|EEDR|EICRA|EICRB|EIFR|EIMSK|ETIFR|ETIMSK|GICR|GIFR|ICR1H|ICR1L|ICR3H|ICR3L|MCUCR|MCUCSR|OCDR|OCR0|OCR1AH|OCR1AL|OCR1BH|OCR1BL|OCR1CH|OCR1CL|OCR2|OCR3AH|OCR3AL|OCR3BH|OCR3BL|OCR3CH|OCR3CL|OSCCAL|PINA|PINB|PINC|PIND|PINE|PINF|PING|PORTA|PORTB|PORTC|PORTD|PORTE|PORTF|PORTG|RAMPZ|SFIOR|SPCR|SPDR|SPH|SPL|SPMCR|SPMCSR|SPSR|SREG|TCCR0|TCCR1A|TCCR1B|TCCR1C|TCCR2|TCCR3A|TCCR3B|TCCR3C|TCNT0|TCNT1H|TCNT1L|TCNT2|TCNT3H|TCNT3L|TIFR|TIMSK|TWAR|TWBR|TWCR|TWDR|TWSR|UBRR0H|UBRR0L|UBRR1H|UBRR1L|UBRRH|UBRRL|UCSR0A|UCSR0B|UCSR0C|UCSR1A|UCSR1B|UCSR1C|UCSRA|UCSRB|UCSRC|UDR|UDR0|UDR1|WDTCR|XDIV|XMCRA|XMCRB)$/',
- 'types' => '/^(auto|bool|char|class|const|double|enum|explicit|export|extern|float|inline|int|long|mutable|namespace|register|short|signed|static|struct|template|typedef|typename|union|unsigned|virtual|void|volatile|wchar_t)$/',
- 'Common Macros' => '/^(NULL|TRUE|FALSE|MAX|MIN|__LINE__|__DATA__|__FILE__|__TIME__|__STDC__)$/',
- ),
- 5 =>
- array (
- ),
- 6 =>
- array (
- ),
- 7 =>
- array (
- ),
- 8 =>
- array (
- ),
- 9 => -1,
- 10 => -1,
- 11 =>
- array (
- ),
- 12 => -1,
- 13 => -1,
- ),
- 3 =>
- array (
- 0 => -1,
- 1 => -1,
- 2 => -1,
- 3 => -1,
- 4 =>
- array (
- 'reserved' => '/^(and|and_eq|asm|bitand|bitor|break|case|catch|compl|const_cast|continue|default|delete|do|dynamic_cast|else|for|fortran|friend|goto|if|new|not|not_eq|operator|or|or_eq|private|protected|public|reinterpret_cast|return|sizeof|static_cast|switch|this|throw|try|typeid|using|while|xor|xor_eq|false|true)$/',
- 'registers' => '/^(ACSR|ADCH|ADCL|ADCSRA|ADMUX|ASSR|DDRA|DDRB|DDRC|DDRD|DDRE|DDRF|DDRG|EEARH|EEARL|EECR|EEDR|EICRA|EICRB|EIFR|EIMSK|ETIFR|ETIMSK|GICR|GIFR|ICR1H|ICR1L|ICR3H|ICR3L|MCUCR|MCUCSR|OCDR|OCR0|OCR1AH|OCR1AL|OCR1BH|OCR1BL|OCR1CH|OCR1CL|OCR2|OCR3AH|OCR3AL|OCR3BH|OCR3BL|OCR3CH|OCR3CL|OSCCAL|PINA|PINB|PINC|PIND|PINE|PINF|PING|PORTA|PORTB|PORTC|PORTD|PORTE|PORTF|PORTG|RAMPZ|SFIOR|SPCR|SPDR|SPH|SPL|SPMCR|SPMCSR|SPSR|SREG|TCCR0|TCCR1A|TCCR1B|TCCR1C|TCCR2|TCCR3A|TCCR3B|TCCR3C|TCNT0|TCNT1H|TCNT1L|TCNT2|TCNT3H|TCNT3L|TIFR|TIMSK|TWAR|TWBR|TWCR|TWDR|TWSR|UBRR0H|UBRR0L|UBRR1H|UBRR1L|UBRRH|UBRRL|UCSR0A|UCSR0B|UCSR0C|UCSR1A|UCSR1B|UCSR1C|UCSRA|UCSRB|UCSRC|UDR|UDR0|UDR1|WDTCR|XDIV|XMCRA|XMCRB)$/',
- 'types' => '/^(auto|bool|char|class|const|double|enum|explicit|export|extern|float|inline|int|long|mutable|namespace|register|short|signed|static|struct|template|typedef|typename|union|unsigned|virtual|void|volatile|wchar_t)$/',
- 'Common Macros' => '/^(NULL|TRUE|FALSE|MAX|MIN|__LINE__|__DATA__|__FILE__|__TIME__|__STDC__)$/',
- ),
- 5 =>
- array (
- ),
- 6 =>
- array (
- ),
- 7 =>
- array (
- ),
- 8 =>
- array (
- ),
- 9 => -1,
- 10 => -1,
- 11 =>
- array (
- ),
- 12 => -1,
- 13 => -1,
- ),
- 4 =>
- array (
- ),
- 5 =>
- array (
- 0 => -1,
- 1 => -1,
- ),
- 6 =>
- array (
- 0 => -1,
- 1 => -1,
- 2 => -1,
- 3 =>
- array (
- 'reserved' => '/^(and|and_eq|asm|bitand|bitor|break|case|catch|compl|const_cast|continue|default|delete|do|dynamic_cast|else|for|fortran|friend|goto|if|new|not|not_eq|operator|or|or_eq|private|protected|public|reinterpret_cast|return|sizeof|static_cast|switch|this|throw|try|typeid|using|while|xor|xor_eq|false|true)$/',
- 'registers' => '/^(ACSR|ADCH|ADCL|ADCSRA|ADMUX|ASSR|DDRA|DDRB|DDRC|DDRD|DDRE|DDRF|DDRG|EEARH|EEARL|EECR|EEDR|EICRA|EICRB|EIFR|EIMSK|ETIFR|ETIMSK|GICR|GIFR|ICR1H|ICR1L|ICR3H|ICR3L|MCUCR|MCUCSR|OCDR|OCR0|OCR1AH|OCR1AL|OCR1BH|OCR1BL|OCR1CH|OCR1CL|OCR2|OCR3AH|OCR3AL|OCR3BH|OCR3BL|OCR3CH|OCR3CL|OSCCAL|PINA|PINB|PINC|PIND|PINE|PINF|PING|PORTA|PORTB|PORTC|PORTD|PORTE|PORTF|PORTG|RAMPZ|SFIOR|SPCR|SPDR|SPH|SPL|SPMCR|SPMCSR|SPSR|SREG|TCCR0|TCCR1A|TCCR1B|TCCR1C|TCCR2|TCCR3A|TCCR3B|TCCR3C|TCNT0|TCNT1H|TCNT1L|TCNT2|TCNT3H|TCNT3L|TIFR|TIMSK|TWAR|TWBR|TWCR|TWDR|TWSR|UBRR0H|UBRR0L|UBRR1H|UBRR1L|UBRRH|UBRRL|UCSR0A|UCSR0B|UCSR0C|UCSR1A|UCSR1B|UCSR1C|UCSRA|UCSRB|UCSRC|UDR|UDR0|UDR1|WDTCR|XDIV|XMCRA|XMCRB)$/',
- 'types' => '/^(auto|bool|char|class|const|double|enum|explicit|export|extern|float|inline|int|long|mutable|namespace|register|short|signed|static|struct|template|typedef|typename|union|unsigned|virtual|void|volatile|wchar_t)$/',
- 'Common Macros' => '/^(NULL|TRUE|FALSE|MAX|MIN|__LINE__|__DATA__|__FILE__|__TIME__|__STDC__)$/',
- ),
- 4 =>
- array (
- ),
- 5 =>
- array (
- ),
- 6 =>
- array (
- ),
- 7 =>
- array (
- ),
- 8 => -1,
- 9 => -1,
- ),
- 7 =>
- array (
- 0 =>
- array (
- ),
- ),
- 8 =>
- array (
- 0 =>
- array (
- ),
- ),
- );
- $this->_parts = array (
- 0 =>
- array (
- 0 => NULL,
- ),
- 1 =>
- array (
- 0 => NULL,
- 1 => NULL,
- 2 => NULL,
- 3 => NULL,
- 4 => NULL,
- 5 => NULL,
- 6 => NULL,
- 7 => NULL,
- 8 => NULL,
- 9 => NULL,
- 10 => NULL,
- 11 => NULL,
- 12 => NULL,
- 13 => NULL,
- ),
- 2 =>
- array (
- 0 => NULL,
- 1 => NULL,
- 2 => NULL,
- 3 => NULL,
- 4 => NULL,
- 5 => NULL,
- 6 => NULL,
- 7 => NULL,
- 8 => NULL,
- 9 => NULL,
- 10 => NULL,
- 11 => NULL,
- 12 => NULL,
- 13 => NULL,
- ),
- 3 =>
- array (
- 0 => NULL,
- 1 => NULL,
- 2 => NULL,
- 3 => NULL,
- 4 => NULL,
- 5 => NULL,
- 6 => NULL,
- 7 => NULL,
- 8 => NULL,
- 9 => NULL,
- 10 => NULL,
- 11 => NULL,
- 12 => NULL,
- 13 => NULL,
- ),
- 4 =>
- array (
- ),
- 5 =>
- array (
- 0 => NULL,
- 1 => NULL,
- ),
- 6 =>
- array (
- 0 => NULL,
- 1 => NULL,
- 2 => NULL,
- 3 => NULL,
- 4 => NULL,
- 5 => NULL,
- 6 => NULL,
- 7 => NULL,
- 8 => NULL,
- 9 => NULL,
- ),
- 7 =>
- array (
- 0 => NULL,
- ),
- 8 =>
- array (
- 0 => NULL,
- ),
- );
- $this->_subst = array (
- -1 =>
- array (
- 0 => false,
- 1 => false,
- 2 => false,
- 3 => false,
- 4 => false,
- 5 => false,
- 6 => false,
- 7 => false,
- 8 => false,
- 9 => false,
- 10 => false,
- 11 => false,
- 12 => false,
- 13 => false,
- ),
- 0 =>
- array (
- 0 => false,
- ),
- 1 =>
- array (
- 0 => false,
- 1 => false,
- 2 => false,
- 3 => false,
- 4 => false,
- 5 => false,
- 6 => false,
- 7 => false,
- 8 => false,
- 9 => false,
- 10 => false,
- 11 => false,
- 12 => false,
- 13 => false,
- ),
- 2 =>
- array (
- 0 => false,
- 1 => false,
- 2 => false,
- 3 => false,
- 4 => false,
- 5 => false,
- 6 => false,
- 7 => false,
- 8 => false,
- 9 => false,
- 10 => false,
- 11 => false,
- 12 => false,
- 13 => false,
- ),
- 3 =>
- array (
- 0 => false,
- 1 => false,
- 2 => false,
- 3 => false,
- 4 => false,
- 5 => false,
- 6 => false,
- 7 => false,
- 8 => false,
- 9 => false,
- 10 => false,
- 11 => false,
- 12 => false,
- 13 => false,
- ),
- 4 =>
- array (
- ),
- 5 =>
- array (
- 0 => false,
- 1 => false,
- ),
- 6 =>
- array (
- 0 => false,
- 1 => false,
- 2 => false,
- 3 => false,
- 4 => false,
- 5 => false,
- 6 => false,
- 7 => false,
- 8 => false,
- 9 => false,
- ),
- 7 =>
- array (
- 0 => false,
- ),
- 8 =>
- array (
- 0 => false,
- ),
- );
- $this->_conditions = array (
- );
- $this->_kwmap = array (
- 'reserved' => 'reserved',
- 'registers' => 'reserved',
- 'types' => 'types',
- 'Common Macros' => 'prepro',
- );
- $this->_defClass = 'code';
- $this->_checkDefines();
- }
-
-} \ No newline at end of file
diff --git a/library/Text_Highlighter/Text/Highlighter/CPP.php b/library/Text_Highlighter/Text/Highlighter/CPP.php
deleted file mode 100644
index eaa47c575..000000000
--- a/library/Text_Highlighter/Text/Highlighter/CPP.php
+++ /dev/null
@@ -1,891 +0,0 @@
-
-<?php
-/**
- * Auto-generated class. CPP syntax highlighting
- *
- *
- * Thanks to Aaron Kalin for initial
- * implementation of this highlighter
- *
- *
- * PHP version 4 and 5
- *
- * LICENSE: This source file is subject to version 3.0 of the PHP license
- * that is available through the world-wide-web at the following URI:
- * http://www.php.net/license/3_0.txt. If you did not receive a copy of
- * the PHP License and are unable to obtain it through the web, please
- * send a note to license@php.net so we can mail you a copy immediately.
- *
- * @copyright 2004-2006 Andrey Demenev
- * @license http://www.php.net/license/3_0.txt PHP License
- * @link http://pear.php.net/package/Text_Highlighter
- * @category Text
- * @package Text_Highlighter
- * @version generated from: cpp.xml
- * @author Aaron Kalin
- * @author Andrey Demenev <demenev@gmail.com>
- *
- */
-
-/**
- * @ignore
- */
-
-require_once 'Text/Highlighter.php';
-
-/**
- * Auto-generated class. CPP syntax highlighting
- *
- * @author Aaron Kalin
- * @author Andrey Demenev <demenev@gmail.com>
- * @category Text
- * @package Text_Highlighter
- * @copyright 2004-2006 Andrey Demenev
- * @license http://www.php.net/license/3_0.txt PHP License
- * @version Release: 0.7.0
- * @link http://pear.php.net/package/Text_Highlighter
- */
-class Text_Highlighter_CPP extends Text_Highlighter
-{
- var $_language = 'cpp';
-
- /**
- * PHP4 Compatible Constructor
- *
- * @param array $options
- * @access public
- */
- function Text_Highlighter_CPP($options=array())
- {
- $this->__construct($options);
- }
-
-
- /**
- * Constructor
- *
- * @param array $options
- * @access public
- */
- function __construct($options=array())
- {
-
- $this->_options = $options;
- $this->_regs = array (
- -1 => '/((?i)")|((?i)\\{)|((?i)\\()|((?i)\\[)|((?i)[a-z_]\\w*)|((?i)\\b0[xX][\\da-f]+)|((?i)\\b\\d\\d*|\\b0\\b)|((?i)\\b0[0-7]+)|((?i)\\b(\\d*\\.\\d+)|(\\d+\\.\\d*))|((?mi)^[ \\t]*#include)|((?mii)^[ \\t]*#[ \\t]*[a-z]+)|((?i)\\d*\\.?\\d+)|((?i)\\/\\*)|((?i)\\/\\/.+)/',
- 0 => '/((?i)\\\\)/',
- 1 => '/((?i)")|((?i)\\{)|((?i)\\()|((?i)\\[)|((?i)[a-z_]\\w*)|((?i)\\b0[xX][\\da-f]+)|((?i)\\b\\d\\d*|\\b0\\b)|((?i)\\b0[0-7]+)|((?i)\\b(\\d*\\.\\d+)|(\\d+\\.\\d*))|((?mi)^[ \\t]*#include)|((?mii)^[ \\t]*#[ \\t]*[a-z]+)|((?i)\\d*\\.?\\d+)|((?i)\\/\\*)|((?i)\\/\\/.+)/',
- 2 => '/((?i)")|((?i)\\{)|((?i)\\()|((?i)\\[)|((?i)[a-z_]\\w*)|((?i)\\b0[xX][\\da-f]+)|((?i)\\b\\d\\d*|\\b0\\b)|((?i)\\b0[0-7]+)|((?i)\\b(\\d*\\.\\d+)|(\\d+\\.\\d*))|((?mi)^[ \\t]*#include)|((?mii)^[ \\t]*#[ \\t]*[a-z]+)|((?i)\\d*\\.?\\d+)|((?i)\\/\\*)|((?i)\\/\\/.+)/',
- 3 => '/((?i)")|((?i)\\{)|((?i)\\()|((?i)\\[)|((?i)[a-z_]\\w*)|((?i)\\b0[xX][\\da-f]+)|((?i)\\b\\d\\d*|\\b0\\b)|((?i)\\b0[0-7]+)|((?i)\\b(\\d*\\.\\d+)|(\\d+\\.\\d*))|((?mi)^[ \\t]*#include)|((?mii)^[ \\t]*#[ \\t]*[a-z]+)|((?i)\\d*\\.?\\d+)|((?i)\\/\\*)|((?i)\\/\\/.+)/',
- 4 => '//',
- 5 => '/((?i)")|((?i)<)/',
- 6 => '/((?i)")|((?i)\\{)|((?i)\\()|((?i)[a-z_]\\w*)|((?i)\\b0[xX][\\da-f]+)|((?i)\\b\\d\\d*|\\b0\\b)|((?i)\\b0[0-7]+)|((?i)\\b(\\d*\\.\\d+)|(\\d+\\.\\d*))|((?i)\\/\\*)|((?i)\\/\\/.+)/',
- 7 => '/((?i)\\$\\w+\\s*:.+\\$)/',
- 8 => '/((?i)\\$\\w+\\s*:.+\\$)/',
- );
- $this->_counts = array (
- -1 =>
- array (
- 0 => 0,
- 1 => 0,
- 2 => 0,
- 3 => 0,
- 4 => 0,
- 5 => 0,
- 6 => 0,
- 7 => 0,
- 8 => 2,
- 9 => 0,
- 10 => 0,
- 11 => 0,
- 12 => 0,
- 13 => 0,
- ),
- 0 =>
- array (
- 0 => 0,
- ),
- 1 =>
- array (
- 0 => 0,
- 1 => 0,
- 2 => 0,
- 3 => 0,
- 4 => 0,
- 5 => 0,
- 6 => 0,
- 7 => 0,
- 8 => 2,
- 9 => 0,
- 10 => 0,
- 11 => 0,
- 12 => 0,
- 13 => 0,
- ),
- 2 =>
- array (
- 0 => 0,
- 1 => 0,
- 2 => 0,
- 3 => 0,
- 4 => 0,
- 5 => 0,
- 6 => 0,
- 7 => 0,
- 8 => 2,
- 9 => 0,
- 10 => 0,
- 11 => 0,
- 12 => 0,
- 13 => 0,
- ),
- 3 =>
- array (
- 0 => 0,
- 1 => 0,
- 2 => 0,
- 3 => 0,
- 4 => 0,
- 5 => 0,
- 6 => 0,
- 7 => 0,
- 8 => 2,
- 9 => 0,
- 10 => 0,
- 11 => 0,
- 12 => 0,
- 13 => 0,
- ),
- 4 =>
- array (
- ),
- 5 =>
- array (
- 0 => 0,
- 1 => 0,
- ),
- 6 =>
- array (
- 0 => 0,
- 1 => 0,
- 2 => 0,
- 3 => 0,
- 4 => 0,
- 5 => 0,
- 6 => 0,
- 7 => 2,
- 8 => 0,
- 9 => 0,
- ),
- 7 =>
- array (
- 0 => 0,
- ),
- 8 =>
- array (
- 0 => 0,
- ),
- );
- $this->_delim = array (
- -1 =>
- array (
- 0 => 'quotes',
- 1 => 'brackets',
- 2 => 'brackets',
- 3 => 'brackets',
- 4 => '',
- 5 => '',
- 6 => '',
- 7 => '',
- 8 => '',
- 9 => 'prepro',
- 10 => 'prepro',
- 11 => '',
- 12 => 'mlcomment',
- 13 => 'comment',
- ),
- 0 =>
- array (
- 0 => '',
- ),
- 1 =>
- array (
- 0 => 'quotes',
- 1 => 'brackets',
- 2 => 'brackets',
- 3 => 'brackets',
- 4 => '',
- 5 => '',
- 6 => '',
- 7 => '',
- 8 => '',
- 9 => 'prepro',
- 10 => 'prepro',
- 11 => '',
- 12 => 'mlcomment',
- 13 => 'comment',
- ),
- 2 =>
- array (
- 0 => 'quotes',
- 1 => 'brackets',
- 2 => 'brackets',
- 3 => 'brackets',
- 4 => '',
- 5 => '',
- 6 => '',
- 7 => '',
- 8 => '',
- 9 => 'prepro',
- 10 => 'prepro',
- 11 => '',
- 12 => 'mlcomment',
- 13 => 'comment',
- ),
- 3 =>
- array (
- 0 => 'quotes',
- 1 => 'brackets',
- 2 => 'brackets',
- 3 => 'brackets',
- 4 => '',
- 5 => '',
- 6 => '',
- 7 => '',
- 8 => '',
- 9 => 'prepro',
- 10 => 'prepro',
- 11 => '',
- 12 => 'mlcomment',
- 13 => 'comment',
- ),
- 4 =>
- array (
- ),
- 5 =>
- array (
- 0 => 'quotes',
- 1 => 'quotes',
- ),
- 6 =>
- array (
- 0 => 'quotes',
- 1 => 'brackets',
- 2 => 'brackets',
- 3 => '',
- 4 => '',
- 5 => '',
- 6 => '',
- 7 => '',
- 8 => 'mlcomment',
- 9 => 'comment',
- ),
- 7 =>
- array (
- 0 => '',
- ),
- 8 =>
- array (
- 0 => '',
- ),
- );
- $this->_inner = array (
- -1 =>
- array (
- 0 => 'string',
- 1 => 'code',
- 2 => 'code',
- 3 => 'code',
- 4 => 'identifier',
- 5 => 'number',
- 6 => 'number',
- 7 => 'number',
- 8 => 'number',
- 9 => 'prepro',
- 10 => 'code',
- 11 => 'number',
- 12 => 'mlcomment',
- 13 => 'comment',
- ),
- 0 =>
- array (
- 0 => 'special',
- ),
- 1 =>
- array (
- 0 => 'string',
- 1 => 'code',
- 2 => 'code',
- 3 => 'code',
- 4 => 'identifier',
- 5 => 'number',
- 6 => 'number',
- 7 => 'number',
- 8 => 'number',
- 9 => 'prepro',
- 10 => 'code',
- 11 => 'number',
- 12 => 'mlcomment',
- 13 => 'comment',
- ),
- 2 =>
- array (
- 0 => 'string',
- 1 => 'code',
- 2 => 'code',
- 3 => 'code',
- 4 => 'identifier',
- 5 => 'number',
- 6 => 'number',
- 7 => 'number',
- 8 => 'number',
- 9 => 'prepro',
- 10 => 'code',
- 11 => 'number',
- 12 => 'mlcomment',
- 13 => 'comment',
- ),
- 3 =>
- array (
- 0 => 'string',
- 1 => 'code',
- 2 => 'code',
- 3 => 'code',
- 4 => 'identifier',
- 5 => 'number',
- 6 => 'number',
- 7 => 'number',
- 8 => 'number',
- 9 => 'prepro',
- 10 => 'code',
- 11 => 'number',
- 12 => 'mlcomment',
- 13 => 'comment',
- ),
- 4 =>
- array (
- ),
- 5 =>
- array (
- 0 => 'string',
- 1 => 'string',
- ),
- 6 =>
- array (
- 0 => 'string',
- 1 => 'code',
- 2 => 'code',
- 3 => 'identifier',
- 4 => 'number',
- 5 => 'number',
- 6 => 'number',
- 7 => 'number',
- 8 => 'mlcomment',
- 9 => 'comment',
- ),
- 7 =>
- array (
- 0 => 'inlinedoc',
- ),
- 8 =>
- array (
- 0 => 'inlinedoc',
- ),
- );
- $this->_end = array (
- 0 => '/(?i)"/',
- 1 => '/(?i)\\}/',
- 2 => '/(?i)\\)/',
- 3 => '/(?i)\\]/',
- 4 => '/(?i)>/',
- 5 => '/(?mi)(?<!\\\\)$/',
- 6 => '/(?mi)(?<!\\\\)$/',
- 7 => '/(?i)\\*\\//',
- 8 => '/(?mi)$/',
- );
- $this->_states = array (
- -1 =>
- array (
- 0 => 0,
- 1 => 1,
- 2 => 2,
- 3 => 3,
- 4 => -1,
- 5 => -1,
- 6 => -1,
- 7 => -1,
- 8 => -1,
- 9 => 5,
- 10 => 6,
- 11 => -1,
- 12 => 7,
- 13 => 8,
- ),
- 0 =>
- array (
- 0 => -1,
- ),
- 1 =>
- array (
- 0 => 0,
- 1 => 1,
- 2 => 2,
- 3 => 3,
- 4 => -1,
- 5 => -1,
- 6 => -1,
- 7 => -1,
- 8 => -1,
- 9 => 5,
- 10 => 6,
- 11 => -1,
- 12 => 7,
- 13 => 8,
- ),
- 2 =>
- array (
- 0 => 0,
- 1 => 1,
- 2 => 2,
- 3 => 3,
- 4 => -1,
- 5 => -1,
- 6 => -1,
- 7 => -1,
- 8 => -1,
- 9 => 5,
- 10 => 6,
- 11 => -1,
- 12 => 7,
- 13 => 8,
- ),
- 3 =>
- array (
- 0 => 0,
- 1 => 1,
- 2 => 2,
- 3 => 3,
- 4 => -1,
- 5 => -1,
- 6 => -1,
- 7 => -1,
- 8 => -1,
- 9 => 5,
- 10 => 6,
- 11 => -1,
- 12 => 7,
- 13 => 8,
- ),
- 4 =>
- array (
- ),
- 5 =>
- array (
- 0 => 0,
- 1 => 4,
- ),
- 6 =>
- array (
- 0 => 0,
- 1 => 1,
- 2 => 2,
- 3 => -1,
- 4 => -1,
- 5 => -1,
- 6 => -1,
- 7 => -1,
- 8 => 7,
- 9 => 8,
- ),
- 7 =>
- array (
- 0 => -1,
- ),
- 8 =>
- array (
- 0 => -1,
- ),
- );
- $this->_keywords = array (
- -1 =>
- array (
- 0 => -1,
- 1 => -1,
- 2 => -1,
- 3 => -1,
- 4 =>
- array (
- 'reserved' => '/^(and|and_eq|asm|bitand|bitor|break|case|catch|compl|const_cast|continue|default|delete|do|dynamic_cast|else|for|fortran|friend|goto|if|new|not|not_eq|operator|or|or_eq|private|protected|public|reinterpret_cast|return|sizeof|static_cast|switch|this|throw|try|typeid|using|while|xor|xor_eq|false|true)$/',
- 'types' => '/^(auto|bool|char|class|const|double|enum|explicit|export|extern|float|inline|int|long|mutable|namespace|register|short|signed|static|struct|template|typedef|typename|union|unsigned|virtual|void|volatile|wchar_t)$/',
- 'Common Macros' => '/^(NULL|TRUE|FALSE|MAX|MIN|__LINE__|__DATA__|__FILE__|__TIME__|__STDC__)$/',
- ),
- 5 =>
- array (
- ),
- 6 =>
- array (
- ),
- 7 =>
- array (
- ),
- 8 =>
- array (
- ),
- 9 => -1,
- 10 => -1,
- 11 =>
- array (
- ),
- 12 => -1,
- 13 => -1,
- ),
- 0 =>
- array (
- 0 =>
- array (
- ),
- ),
- 1 =>
- array (
- 0 => -1,
- 1 => -1,
- 2 => -1,
- 3 => -1,
- 4 =>
- array (
- 'reserved' => '/^(and|and_eq|asm|bitand|bitor|break|case|catch|compl|const_cast|continue|default|delete|do|dynamic_cast|else|for|fortran|friend|goto|if|new|not|not_eq|operator|or|or_eq|private|protected|public|reinterpret_cast|return|sizeof|static_cast|switch|this|throw|try|typeid|using|while|xor|xor_eq|false|true)$/',
- 'types' => '/^(auto|bool|char|class|const|double|enum|explicit|export|extern|float|inline|int|long|mutable|namespace|register|short|signed|static|struct|template|typedef|typename|union|unsigned|virtual|void|volatile|wchar_t)$/',
- 'Common Macros' => '/^(NULL|TRUE|FALSE|MAX|MIN|__LINE__|__DATA__|__FILE__|__TIME__|__STDC__)$/',
- ),
- 5 =>
- array (
- ),
- 6 =>
- array (
- ),
- 7 =>
- array (
- ),
- 8 =>
- array (
- ),
- 9 => -1,
- 10 => -1,
- 11 =>
- array (
- ),
- 12 => -1,
- 13 => -1,
- ),
- 2 =>
- array (
- 0 => -1,
- 1 => -1,
- 2 => -1,
- 3 => -1,
- 4 =>
- array (
- 'reserved' => '/^(and|and_eq|asm|bitand|bitor|break|case|catch|compl|const_cast|continue|default|delete|do|dynamic_cast|else|for|fortran|friend|goto|if|new|not|not_eq|operator|or|or_eq|private|protected|public|reinterpret_cast|return|sizeof|static_cast|switch|this|throw|try|typeid|using|while|xor|xor_eq|false|true)$/',
- 'types' => '/^(auto|bool|char|class|const|double|enum|explicit|export|extern|float|inline|int|long|mutable|namespace|register|short|signed|static|struct|template|typedef|typename|union|unsigned|virtual|void|volatile|wchar_t)$/',
- 'Common Macros' => '/^(NULL|TRUE|FALSE|MAX|MIN|__LINE__|__DATA__|__FILE__|__TIME__|__STDC__)$/',
- ),
- 5 =>
- array (
- ),
- 6 =>
- array (
- ),
- 7 =>
- array (
- ),
- 8 =>
- array (
- ),
- 9 => -1,
- 10 => -1,
- 11 =>
- array (
- ),
- 12 => -1,
- 13 => -1,
- ),
- 3 =>
- array (
- 0 => -1,
- 1 => -1,
- 2 => -1,
- 3 => -1,
- 4 =>
- array (
- 'reserved' => '/^(and|and_eq|asm|bitand|bitor|break|case|catch|compl|const_cast|continue|default|delete|do|dynamic_cast|else|for|fortran|friend|goto|if|new|not|not_eq|operator|or|or_eq|private|protected|public|reinterpret_cast|return|sizeof|static_cast|switch|this|throw|try|typeid|using|while|xor|xor_eq|false|true)$/',
- 'types' => '/^(auto|bool|char|class|const|double|enum|explicit|export|extern|float|inline|int|long|mutable|namespace|register|short|signed|static|struct|template|typedef|typename|union|unsigned|virtual|void|volatile|wchar_t)$/',
- 'Common Macros' => '/^(NULL|TRUE|FALSE|MAX|MIN|__LINE__|__DATA__|__FILE__|__TIME__|__STDC__)$/',
- ),
- 5 =>
- array (
- ),
- 6 =>
- array (
- ),
- 7 =>
- array (
- ),
- 8 =>
- array (
- ),
- 9 => -1,
- 10 => -1,
- 11 =>
- array (
- ),
- 12 => -1,
- 13 => -1,
- ),
- 4 =>
- array (
- ),
- 5 =>
- array (
- 0 => -1,
- 1 => -1,
- ),
- 6 =>
- array (
- 0 => -1,
- 1 => -1,
- 2 => -1,
- 3 =>
- array (
- 'reserved' => '/^(and|and_eq|asm|bitand|bitor|break|case|catch|compl|const_cast|continue|default|delete|do|dynamic_cast|else|for|fortran|friend|goto|if|new|not|not_eq|operator|or|or_eq|private|protected|public|reinterpret_cast|return|sizeof|static_cast|switch|this|throw|try|typeid|using|while|xor|xor_eq|false|true)$/',
- 'types' => '/^(auto|bool|char|class|const|double|enum|explicit|export|extern|float|inline|int|long|mutable|namespace|register|short|signed|static|struct|template|typedef|typename|union|unsigned|virtual|void|volatile|wchar_t)$/',
- 'Common Macros' => '/^(NULL|TRUE|FALSE|MAX|MIN|__LINE__|__DATA__|__FILE__|__TIME__|__STDC__)$/',
- ),
- 4 =>
- array (
- ),
- 5 =>
- array (
- ),
- 6 =>
- array (
- ),
- 7 =>
- array (
- ),
- 8 => -1,
- 9 => -1,
- ),
- 7 =>
- array (
- 0 =>
- array (
- ),
- ),
- 8 =>
- array (
- 0 =>
- array (
- ),
- ),
- );
- $this->_parts = array (
- 0 =>
- array (
- 0 => NULL,
- ),
- 1 =>
- array (
- 0 => NULL,
- 1 => NULL,
- 2 => NULL,
- 3 => NULL,
- 4 => NULL,
- 5 => NULL,
- 6 => NULL,
- 7 => NULL,
- 8 => NULL,
- 9 => NULL,
- 10 => NULL,
- 11 => NULL,
- 12 => NULL,
- 13 => NULL,
- ),
- 2 =>
- array (
- 0 => NULL,
- 1 => NULL,
- 2 => NULL,
- 3 => NULL,
- 4 => NULL,
- 5 => NULL,
- 6 => NULL,
- 7 => NULL,
- 8 => NULL,
- 9 => NULL,
- 10 => NULL,
- 11 => NULL,
- 12 => NULL,
- 13 => NULL,
- ),
- 3 =>
- array (
- 0 => NULL,
- 1 => NULL,
- 2 => NULL,
- 3 => NULL,
- 4 => NULL,
- 5 => NULL,
- 6 => NULL,
- 7 => NULL,
- 8 => NULL,
- 9 => NULL,
- 10 => NULL,
- 11 => NULL,
- 12 => NULL,
- 13 => NULL,
- ),
- 4 =>
- array (
- ),
- 5 =>
- array (
- 0 => NULL,
- 1 => NULL,
- ),
- 6 =>
- array (
- 0 => NULL,
- 1 => NULL,
- 2 => NULL,
- 3 => NULL,
- 4 => NULL,
- 5 => NULL,
- 6 => NULL,
- 7 => NULL,
- 8 => NULL,
- 9 => NULL,
- ),
- 7 =>
- array (
- 0 => NULL,
- ),
- 8 =>
- array (
- 0 => NULL,
- ),
- );
- $this->_subst = array (
- -1 =>
- array (
- 0 => false,
- 1 => false,
- 2 => false,
- 3 => false,
- 4 => false,
- 5 => false,
- 6 => false,
- 7 => false,
- 8 => false,
- 9 => false,
- 10 => false,
- 11 => false,
- 12 => false,
- 13 => false,
- ),
- 0 =>
- array (
- 0 => false,
- ),
- 1 =>
- array (
- 0 => false,
- 1 => false,
- 2 => false,
- 3 => false,
- 4 => false,
- 5 => false,
- 6 => false,
- 7 => false,
- 8 => false,
- 9 => false,
- 10 => false,
- 11 => false,
- 12 => false,
- 13 => false,
- ),
- 2 =>
- array (
- 0 => false,
- 1 => false,
- 2 => false,
- 3 => false,
- 4 => false,
- 5 => false,
- 6 => false,
- 7 => false,
- 8 => false,
- 9 => false,
- 10 => false,
- 11 => false,
- 12 => false,
- 13 => false,
- ),
- 3 =>
- array (
- 0 => false,
- 1 => false,
- 2 => false,
- 3 => false,
- 4 => false,
- 5 => false,
- 6 => false,
- 7 => false,
- 8 => false,
- 9 => false,
- 10 => false,
- 11 => false,
- 12 => false,
- 13 => false,
- ),
- 4 =>
- array (
- ),
- 5 =>
- array (
- 0 => false,
- 1 => false,
- ),
- 6 =>
- array (
- 0 => false,
- 1 => false,
- 2 => false,
- 3 => false,
- 4 => false,
- 5 => false,
- 6 => false,
- 7 => false,
- 8 => false,
- 9 => false,
- ),
- 7 =>
- array (
- 0 => false,
- ),
- 8 =>
- array (
- 0 => false,
- ),
- );
- $this->_conditions = array (
- );
- $this->_kwmap = array (
- 'reserved' => 'reserved',
- 'types' => 'types',
- 'Common Macros' => 'prepro',
- );
- $this->_defClass = 'code';
- $this->_checkDefines();
- }
-
-} \ No newline at end of file
diff --git a/library/Text_Highlighter/Text/Highlighter/CSS.php b/library/Text_Highlighter/Text/Highlighter/CSS.php
deleted file mode 100644
index 51757c88e..000000000
--- a/library/Text_Highlighter/Text/Highlighter/CSS.php
+++ /dev/null
@@ -1,437 +0,0 @@
-<?php
-/**
- * Auto-generated class. CSS syntax highlighting
- *
- * PHP version 4 and 5
- *
- * LICENSE: This source file is subject to version 3.0 of the PHP license
- * that is available through the world-wide-web at the following URI:
- * http://www.php.net/license/3_0.txt. If you did not receive a copy of
- * the PHP License and are unable to obtain it through the web, please
- * send a note to license@php.net so we can mail you a copy immediately.
- *
- * @copyright 2004-2006 Andrey Demenev
- * @license http://www.php.net/license/3_0.txt PHP License
- * @link http://pear.php.net/package/Text_Highlighter
- * @category Text
- * @package Text_Highlighter
- * @version generated from: css.xml
- * @author Andrey Demenev <demenev@gmail.com>
- *
- */
-
-/**
- * @ignore
- */
-
-require_once 'Text/Highlighter.php';
-
-/**
- * Auto-generated class. CSS syntax highlighting
- *
- * @author Andrey Demenev <demenev@gmail.com>
- * @category Text
- * @package Text_Highlighter
- * @copyright 2004-2006 Andrey Demenev
- * @license http://www.php.net/license/3_0.txt PHP License
- * @version Release: 0.7.0
- * @link http://pear.php.net/package/Text_Highlighter
- */
-class Text_Highlighter_CSS extends Text_Highlighter
-{
- var $_language = 'css';
-
- /**
- * PHP4 Compatible Constructor
- *
- * @param array $options
- * @access public
- */
- function Text_Highlighter_CSS($options=array())
- {
- $this->__construct($options);
- }
-
-
- /**
- * Constructor
- *
- * @param array $options
- * @access public
- */
- function __construct($options=array())
- {
-
- $this->_options = $options;
- $this->_regs = array (
- -1 => '/((?i)\\/\\*)|((?i)(@[a-z\\d]+))|((?i)(((\\.|#)?[a-z]+[a-z\\d\\-]*(?![a-z\\d\\-]))|(\\*))(?!\\s*:\\s*[\\s\\{]))|((?i):[a-z][a-z\\d\\-]*)|((?i)\\[)|((?i)\\{)/',
- 0 => '//',
- 1 => '/((?i)\\d*\\.?\\d+(\\%|em|ex|pc|pt|px|in|mm|cm))|((?i)\\d*\\.?\\d+)|((?i)[a-z][a-z\\d\\-]*)|((?i)#([\\da-f]{6}|[\\da-f]{3})\\b)/',
- 2 => '/((?i)\')|((?i)")|((?i)[\\w\\-\\:]+)/',
- 3 => '/((?i)\\/\\*)|((?i)[a-z][a-z\\d\\-]*\\s*:)|((?i)(((\\.|#)?[a-z]+[a-z\\d\\-]*(?![a-z\\d\\-]))|(\\*))(?!\\s*:\\s*[\\s\\{]))|((?i)\\{)/',
- 4 => '/((?i)\\\\[\\\\(\\\\)\\\\])/',
- 5 => '/((?i)\\\\\\\\|\\\\"|\\\\\'|\\\\`)/',
- 6 => '/((?i)\\\\\\\\|\\\\"|\\\\\'|\\\\`|\\\\t|\\\\n|\\\\r)/',
- );
- $this->_counts = array (
- -1 =>
- array (
- 0 => 0,
- 1 => 1,
- 2 => 4,
- 3 => 0,
- 4 => 0,
- 5 => 0,
- ),
- 0 =>
- array (
- ),
- 1 =>
- array (
- 0 => 1,
- 1 => 0,
- 2 => 0,
- 3 => 1,
- ),
- 2 =>
- array (
- 0 => 0,
- 1 => 0,
- 2 => 0,
- ),
- 3 =>
- array (
- 0 => 0,
- 1 => 0,
- 2 => 4,
- 3 => 0,
- ),
- 4 =>
- array (
- 0 => 0,
- ),
- 5 =>
- array (
- 0 => 0,
- ),
- 6 =>
- array (
- 0 => 0,
- ),
- );
- $this->_delim = array (
- -1 =>
- array (
- 0 => 'comment',
- 1 => '',
- 2 => '',
- 3 => '',
- 4 => 'brackets',
- 5 => 'brackets',
- ),
- 0 =>
- array (
- ),
- 1 =>
- array (
- 0 => '',
- 1 => '',
- 2 => '',
- 3 => '',
- ),
- 2 =>
- array (
- 0 => 'quotes',
- 1 => 'quotes',
- 2 => '',
- ),
- 3 =>
- array (
- 0 => 'comment',
- 1 => 'reserved',
- 2 => '',
- 3 => 'brackets',
- ),
- 4 =>
- array (
- 0 => '',
- ),
- 5 =>
- array (
- 0 => '',
- ),
- 6 =>
- array (
- 0 => '',
- ),
- );
- $this->_inner = array (
- -1 =>
- array (
- 0 => 'comment',
- 1 => 'var',
- 2 => 'identifier',
- 3 => 'special',
- 4 => 'code',
- 5 => 'code',
- ),
- 0 =>
- array (
- ),
- 1 =>
- array (
- 0 => 'number',
- 1 => 'number',
- 2 => 'code',
- 3 => 'var',
- ),
- 2 =>
- array (
- 0 => 'string',
- 1 => 'string',
- 2 => 'var',
- ),
- 3 =>
- array (
- 0 => 'comment',
- 1 => 'code',
- 2 => 'identifier',
- 3 => 'code',
- ),
- 4 =>
- array (
- 0 => 'string',
- ),
- 5 =>
- array (
- 0 => 'special',
- ),
- 6 =>
- array (
- 0 => 'special',
- ),
- );
- $this->_end = array (
- 0 => '/(?i)\\*\\//',
- 1 => '/(?i)(?=;|\\})/',
- 2 => '/(?i)\\]/',
- 3 => '/(?i)\\}/',
- 4 => '/(?i)\\)/',
- 5 => '/(?i)\'/',
- 6 => '/(?i)"/',
- );
- $this->_states = array (
- -1 =>
- array (
- 0 => 0,
- 1 => -1,
- 2 => -1,
- 3 => -1,
- 4 => 2,
- 5 => 3,
- ),
- 0 =>
- array (
- ),
- 1 =>
- array (
- 0 => -1,
- 1 => -1,
- 2 => -1,
- 3 => -1,
- ),
- 2 =>
- array (
- 0 => 5,
- 1 => 6,
- 2 => -1,
- ),
- 3 =>
- array (
- 0 => 0,
- 1 => 1,
- 2 => -1,
- 3 => 3,
- ),
- 4 =>
- array (
- 0 => -1,
- ),
- 5 =>
- array (
- 0 => -1,
- ),
- 6 =>
- array (
- 0 => -1,
- ),
- );
- $this->_keywords = array (
- -1 =>
- array (
- 0 => -1,
- 1 =>
- array (
- ),
- 2 =>
- array (
- ),
- 3 =>
- array (
- ),
- 4 => -1,
- 5 => -1,
- ),
- 0 =>
- array (
- ),
- 1 =>
- array (
- 0 =>
- array (
- ),
- 1 =>
- array (
- ),
- 2 =>
- array (
- 'propertyValue' => '/^((?i)far-left|left|center-left|center-right|center|far-right|right-side|right|behind|leftwards|rightwards|inherit|scroll|fixed|transparent|none|repeat-x|repeat-y|repeat|no-repeat|collapse|separate|auto|top|bottom|both|open-quote|close-quote|no-open-quote|no-close-quote|crosshair|default|pointer|move|e-resize|ne-resize|nw-resize|n-resize|se-resize|sw-resize|s-resize|text|wait|help|ltr|rtl|inline|block|list-item|run-in|compact|marker|table|inline-table|table-row-group|table-header-group|table-footer-group|table-row|table-column-group|table-column|table-cell|table-caption|below|level|above|higher|lower|show|hide|caption|icon|menu|message-box|small-caption|status-bar|normal|wider|narrower|ultra-condensed|extra-condensed|condensed|semi-condensed|semi-expanded|expanded|extra-expanded|ultra-expanded|italic|oblique|small-caps|bold|bolder|lighter|inside|outside|disc|circle|square|decimal|decimal-leading-zero|lower-roman|upper-roman|lower-greek|lower-alpha|lower-latin|upper-alpha|upper-latin|hebrew|armenian|georgian|cjk-ideographic|hiragana|katakana|hiragana-iroha|katakana-iroha|crop|cross|invert|visible|hidden|always|avoid|x-low|low|medium|high|x-high|mix?|repeat?|static|relative|absolute|portrait|landscape|spell-out|once|digits|continuous|code|x-slow|slow|fast|x-fast|faster|slower|justify|underline|overline|line-through|blink|capitalize|uppercase|lowercase|embed|bidi-override|baseline|sub|super|text-top|middle|text-bottom|silent|x-soft|soft|loud|x-loud|pre|nowrap|serif|sans-serif|cursive|fantasy|monospace|empty|string|strict|loose|char|true|false|dotted|dashed|solid|double|groove|ridge|inset|outset|larger|smaller|xx-small|x-small|small|large|x-large|xx-large|all|newspaper|distribute|distribute-all-lines|distribute-center-last|inter-word|inter-ideograph|inter-cluster|kashida|ideograph-alpha|ideograph-numeric|ideograph-parenthesis|ideograph-space|keep-all|break-all|break-word|lr-tb|tb-rl|thin|thick|inline-block|w-resize|hand|distribute-letter|distribute-space|whitespace|male|female|child)$/',
- 'namedcolor' => '/^((?i)aqua|black|blue|fuchsia|gray|green|lime|maroon|navy|olive|purple|red|silver|teal|white|yellow|activeborder|activecaption|appworkspace|background|buttonface|buttonhighlight|buttonshadow|buttontext|captiontext|graytext|highlight|highlighttext|inactiveborder|inactivecaption|inactivecaptiontext|infobackground|infotext|menu|menutext|scrollbar|threeddarkshadow|threedface|threedhighlight|threedlightshadow|threedshadow|window|windowframe|windowtext)$/',
- ),
- 3 =>
- array (
- ),
- ),
- 2 =>
- array (
- 0 => -1,
- 1 => -1,
- 2 =>
- array (
- ),
- ),
- 3 =>
- array (
- 0 => -1,
- 1 => -1,
- 2 =>
- array (
- ),
- 3 => -1,
- ),
- 4 =>
- array (
- 0 =>
- array (
- ),
- ),
- 5 =>
- array (
- 0 =>
- array (
- ),
- ),
- 6 =>
- array (
- 0 =>
- array (
- ),
- ),
- );
- $this->_parts = array (
- 0 =>
- array (
- ),
- 1 =>
- array (
- 0 =>
- array (
- 1 => 'string',
- ),
- 1 => NULL,
- 2 => NULL,
- 3 => NULL,
- ),
- 2 =>
- array (
- 0 => NULL,
- 1 => NULL,
- 2 => NULL,
- ),
- 3 =>
- array (
- 0 => NULL,
- 1 => NULL,
- 2 => NULL,
- 3 => NULL,
- ),
- 4 =>
- array (
- 0 => NULL,
- ),
- 5 =>
- array (
- 0 => NULL,
- ),
- 6 =>
- array (
- 0 => NULL,
- ),
- );
- $this->_subst = array (
- -1 =>
- array (
- 0 => false,
- 1 => false,
- 2 => false,
- 3 => false,
- 4 => false,
- 5 => false,
- ),
- 0 =>
- array (
- ),
- 1 =>
- array (
- 0 => false,
- 1 => false,
- 2 => false,
- 3 => false,
- ),
- 2 =>
- array (
- 0 => false,
- 1 => false,
- 2 => false,
- ),
- 3 =>
- array (
- 0 => false,
- 1 => false,
- 2 => false,
- 3 => false,
- ),
- 4 =>
- array (
- 0 => false,
- ),
- 5 =>
- array (
- 0 => false,
- ),
- 6 =>
- array (
- 0 => false,
- ),
- );
- $this->_conditions = array (
- );
- $this->_kwmap = array (
- 'propertyValue' => 'string',
- 'namedcolor' => 'var',
- );
- $this->_defClass = 'code';
- $this->_checkDefines();
- }
-
-}
diff --git a/library/Text_Highlighter/Text/Highlighter/DIFF.php b/library/Text_Highlighter/Text/Highlighter/DIFF.php
deleted file mode 100644
index 2bb25a453..000000000
--- a/library/Text_Highlighter/Text/Highlighter/DIFF.php
+++ /dev/null
@@ -1,384 +0,0 @@
-<?php
-/**
- * Auto-generated class. DIFF syntax highlighting
- *
- * PHP version 4 and 5
- *
- * LICENSE: This source file is subject to version 3.0 of the PHP license
- * that is available through the world-wide-web at the following URI:
- * http://www.php.net/license/3_0.txt. If you did not receive a copy of
- * the PHP License and are unable to obtain it through the web, please
- * send a note to license@php.net so we can mail you a copy immediately.
- *
- * @copyright 2004-2006 Andrey Demenev
- * @license http://www.php.net/license/3_0.txt PHP License
- * @link http://pear.php.net/package/Text_Highlighter
- * @category Text
- * @package Text_Highlighter
- * @version generated from: : diff.xml,v 1.1 2007/06/03 02:35:28 ssttoo Exp
- * @author Andrey Demenev <demenev@gmail.com>
- *
- */
-
-/**
- * @ignore
- */
-
-require_once 'Text/Highlighter.php';
-
-/**
- * Auto-generated class. DIFF syntax highlighting
- *
- * @author Andrey Demenev <demenev@gmail.com>
- * @category Text
- * @package Text_Highlighter
- * @copyright 2004-2006 Andrey Demenev
- * @license http://www.php.net/license/3_0.txt PHP License
- * @version Release: @package_version@
- * @link http://pear.php.net/package/Text_Highlighter
- */
-class Text_Highlighter_DIFF extends Text_Highlighter
-{
- var $_language = 'diff';
-
- /**
- * PHP4 Compatible Constructor
- *
- * @param array $options
- * @access public
- */
- function Text_Highlighter_DIFF($options=array())
- {
- $this->__construct($options);
- }
-
-
- /**
- * Constructor
- *
- * @param array $options
- * @access public
- */
- function __construct($options=array())
- {
-
- $this->_options = $options;
- $this->_regs = array (
- -1 => '/((?m)^\\\\\\sNo\\snewline.+$)|((?m)^\\-\\-\\-$)|((?m)^(diff\\s+\\-|Only\\s+|Index).*$)|((?m)^(\\-\\-\\-|\\+\\+\\+)\\s.+$)|((?m)^\\*.*$)|((?m)^\\+.*$)|((?m)^!.*$)|((?m)^\\<\\s.*$)|((?m)^\\>\\s.*$)|((?m)^\\d+(\\,\\d+)?[acd]\\d+(,\\d+)?$)|((?m)^\\-.*$)|((?m)^\\+.*$)|((?m)^@@.+@@$)|((?m)^d\\d+\\s\\d+$)|((?m)^a\\d+\\s\\d+$)|((?m)^(\\d+)(,\\d+)?(a)$)|((?m)^(\\d+)(,\\d+)?(c)$)|((?m)^(\\d+)(,\\d+)?(d)$)|((?m)^a(\\d+)(\\s\\d+)?$)|((?m)^c(\\d+)(\\s\\d+)?$)|((?m)^d(\\d+)(\\s\\d+)?$)/',
- 0 => '//',
- 1 => '//',
- 2 => '//',
- 3 => '//',
- 4 => '//',
- );
- $this->_counts = array (
- -1 =>
- array (
- 0 => 0,
- 1 => 0,
- 2 => 1,
- 3 => 1,
- 4 => 0,
- 5 => 0,
- 6 => 0,
- 7 => 0,
- 8 => 0,
- 9 => 2,
- 10 => 0,
- 11 => 0,
- 12 => 0,
- 13 => 0,
- 14 => 0,
- 15 => 3,
- 16 => 3,
- 17 => 3,
- 18 => 2,
- 19 => 2,
- 20 => 2,
- ),
- 0 =>
- array (
- ),
- 1 =>
- array (
- ),
- 2 =>
- array (
- ),
- 3 =>
- array (
- ),
- 4 =>
- array (
- ),
- );
- $this->_delim = array (
- -1 =>
- array (
- 0 => '',
- 1 => '',
- 2 => '',
- 3 => '',
- 4 => '',
- 5 => '',
- 6 => '',
- 7 => '',
- 8 => '',
- 9 => '',
- 10 => '',
- 11 => '',
- 12 => '',
- 13 => '',
- 14 => 'code',
- 15 => 'code',
- 16 => 'code',
- 17 => '',
- 18 => 'code',
- 19 => 'code',
- 20 => '',
- ),
- 0 =>
- array (
- ),
- 1 =>
- array (
- ),
- 2 =>
- array (
- ),
- 3 =>
- array (
- ),
- 4 =>
- array (
- ),
- );
- $this->_inner = array (
- -1 =>
- array (
- 0 => 'special',
- 1 => 'code',
- 2 => 'var',
- 3 => 'reserved',
- 4 => 'quotes',
- 5 => 'string',
- 6 => 'inlinedoc',
- 7 => 'quotes',
- 8 => 'string',
- 9 => 'code',
- 10 => 'quotes',
- 11 => 'string',
- 12 => 'code',
- 13 => 'code',
- 14 => 'var',
- 15 => 'string',
- 16 => 'inlinedoc',
- 17 => 'code',
- 18 => 'string',
- 19 => 'inlinedoc',
- 20 => 'code',
- ),
- 0 =>
- array (
- ),
- 1 =>
- array (
- ),
- 2 =>
- array (
- ),
- 3 =>
- array (
- ),
- 4 =>
- array (
- ),
- );
- $this->_end = array (
- 0 => '/(?m)(?=^[ad]\\d+\\s\\d+)/',
- 1 => '/(?m)^(\\.)$/',
- 2 => '/(?m)^(\\.)$/',
- 3 => '/(?m)^(\\.)$/',
- 4 => '/(?m)^(\\.)$/',
- );
- $this->_states = array (
- -1 =>
- array (
- 0 => -1,
- 1 => -1,
- 2 => -1,
- 3 => -1,
- 4 => -1,
- 5 => -1,
- 6 => -1,
- 7 => -1,
- 8 => -1,
- 9 => -1,
- 10 => -1,
- 11 => -1,
- 12 => -1,
- 13 => -1,
- 14 => 0,
- 15 => 1,
- 16 => 2,
- 17 => -1,
- 18 => 3,
- 19 => 4,
- 20 => -1,
- ),
- 0 =>
- array (
- ),
- 1 =>
- array (
- ),
- 2 =>
- array (
- ),
- 3 =>
- array (
- ),
- 4 =>
- array (
- ),
- );
- $this->_keywords = array (
- -1 =>
- array (
- 0 =>
- array (
- ),
- 1 =>
- array (
- ),
- 2 =>
- array (
- ),
- 3 =>
- array (
- ),
- 4 =>
- array (
- ),
- 5 =>
- array (
- ),
- 6 =>
- array (
- ),
- 7 =>
- array (
- ),
- 8 =>
- array (
- ),
- 9 =>
- array (
- ),
- 10 =>
- array (
- ),
- 11 =>
- array (
- ),
- 12 =>
- array (
- ),
- 13 =>
- array (
- ),
- 14 => -1,
- 15 => -1,
- 16 => -1,
- 17 =>
- array (
- ),
- 18 => -1,
- 19 => -1,
- 20 =>
- array (
- ),
- ),
- 0 =>
- array (
- ),
- 1 =>
- array (
- ),
- 2 =>
- array (
- ),
- 3 =>
- array (
- ),
- 4 =>
- array (
- ),
- );
- $this->_parts = array (
- 0 =>
- array (
- ),
- 1 =>
- array (
- ),
- 2 =>
- array (
- ),
- 3 =>
- array (
- ),
- 4 =>
- array (
- ),
- );
- $this->_subst = array (
- -1 =>
- array (
- 0 => false,
- 1 => false,
- 2 => false,
- 3 => false,
- 4 => false,
- 5 => false,
- 6 => false,
- 7 => false,
- 8 => false,
- 9 => false,
- 10 => false,
- 11 => false,
- 12 => false,
- 13 => false,
- 14 => false,
- 15 => false,
- 16 => false,
- 17 => false,
- 18 => false,
- 19 => false,
- 20 => false,
- ),
- 0 =>
- array (
- ),
- 1 =>
- array (
- ),
- 2 =>
- array (
- ),
- 3 =>
- array (
- ),
- 4 =>
- array (
- ),
- );
- $this->_conditions = array (
- );
- $this->_kwmap = array (
- );
- $this->_defClass = 'default';
- $this->_checkDefines();
- }
-
-} \ No newline at end of file
diff --git a/library/Text_Highlighter/Text/Highlighter/DTD.php b/library/Text_Highlighter/Text/Highlighter/DTD.php
deleted file mode 100644
index 41b0faa78..000000000
--- a/library/Text_Highlighter/Text/Highlighter/DTD.php
+++ /dev/null
@@ -1,426 +0,0 @@
-<?php
-/**
- * Auto-generated class. DTD syntax highlighting
- *
- * PHP version 4 and 5
- *
- * LICENSE: This source file is subject to version 3.0 of the PHP license
- * that is available through the world-wide-web at the following URI:
- * http://www.php.net/license/3_0.txt. If you did not receive a copy of
- * the PHP License and are unable to obtain it through the web, please
- * send a note to license@php.net so we can mail you a copy immediately.
- *
- * @copyright 2004-2006 Andrey Demenev
- * @license http://www.php.net/license/3_0.txt PHP License
- * @link http://pear.php.net/package/Text_Highlighter
- * @category Text
- * @package Text_Highlighter
- * @version generated from: : dtd.xml,v 1.1 2007/06/03 02:35:28 ssttoo Exp
- * @author Andrey Demenev <demenev@gmail.com>
- *
- */
-
-/**
- * @ignore
- */
-
-require_once 'Text/Highlighter.php';
-
-/**
- * Auto-generated class. DTD syntax highlighting
- *
- * @author Andrey Demenev <demenev@gmail.com>
- * @category Text
- * @package Text_Highlighter
- * @copyright 2004-2006 Andrey Demenev
- * @license http://www.php.net/license/3_0.txt PHP License
- * @version Release: @package_version@
- * @link http://pear.php.net/package/Text_Highlighter
- */
-class Text_Highlighter_DTD extends Text_Highlighter
-{
- var $_language = 'dtd';
-
- /**
- * PHP4 Compatible Constructor
- *
- * @param array $options
- * @access public
- */
- function Text_Highlighter_DTD($options=array())
- {
- $this->__construct($options);
- }
-
-
- /**
- * Constructor
- *
- * @param array $options
- * @access public
- */
- function __construct($options=array())
- {
-
- $this->_options = $options;
- $this->_regs = array (
- -1 => '/(\\<!--)|(\\<\\!\\[)|((\\&|\\%)[\\w\\-\\.]+;)/',
- 0 => '//',
- 1 => '/(\\<!--)|(\\<)|(#PCDATA\\b)|((\\&|\\%)[\\w\\-\\.]+;)|((?i)[a-z][a-z\\d\\-\\,:]+)/',
- 2 => '/(\\<!--)|(\\()|(\')|(")|((?<=\\<)!(ENTITY|ATTLIST|ELEMENT|NOTATION)\\b)|(\\s(#(IMPLIED|REQUIRED|FIXED))|CDATA|ENTITY|NOTATION|NMTOKENS?|PUBLIC|SYSTEM\\b)|(#PCDATA\\b)|((\\&|\\%)[\\w\\-\\.]+;)|((?i)[a-z][a-z\\d\\-\\,:]+)/',
- 3 => '/(\\()|((\\&|\\%)[\\w\\-\\.]+;)|((?i)[a-z][a-z\\d\\-\\,:]+)/',
- 4 => '/((\\&|\\%)[\\w\\-\\.]+;)/',
- 5 => '/((\\&|\\%)[\\w\\-\\.]+;)/',
- );
- $this->_counts = array (
- -1 =>
- array (
- 0 => 0,
- 1 => 0,
- 2 => 1,
- ),
- 0 =>
- array (
- ),
- 1 =>
- array (
- 0 => 0,
- 1 => 0,
- 2 => 0,
- 3 => 1,
- 4 => 0,
- ),
- 2 =>
- array (
- 0 => 0,
- 1 => 0,
- 2 => 0,
- 3 => 0,
- 4 => 1,
- 5 => 2,
- 6 => 0,
- 7 => 1,
- 8 => 0,
- ),
- 3 =>
- array (
- 0 => 0,
- 1 => 1,
- 2 => 0,
- ),
- 4 =>
- array (
- 0 => 1,
- ),
- 5 =>
- array (
- 0 => 1,
- ),
- );
- $this->_delim = array (
- -1 =>
- array (
- 0 => 'comment',
- 1 => 'brackets',
- 2 => '',
- ),
- 0 =>
- array (
- ),
- 1 =>
- array (
- 0 => 'comment',
- 1 => 'brackets',
- 2 => '',
- 3 => '',
- 4 => '',
- ),
- 2 =>
- array (
- 0 => 'comment',
- 1 => 'brackets',
- 2 => 'quotes',
- 3 => 'quotes',
- 4 => '',
- 5 => '',
- 6 => '',
- 7 => '',
- 8 => '',
- ),
- 3 =>
- array (
- 0 => 'brackets',
- 1 => '',
- 2 => '',
- ),
- 4 =>
- array (
- 0 => '',
- ),
- 5 =>
- array (
- 0 => '',
- ),
- );
- $this->_inner = array (
- -1 =>
- array (
- 0 => 'comment',
- 1 => 'code',
- 2 => 'special',
- ),
- 0 =>
- array (
- ),
- 1 =>
- array (
- 0 => 'comment',
- 1 => 'code',
- 2 => 'reserved',
- 3 => 'special',
- 4 => 'identifier',
- ),
- 2 =>
- array (
- 0 => 'comment',
- 1 => 'code',
- 2 => 'string',
- 3 => 'string',
- 4 => 'var',
- 5 => 'reserved',
- 6 => 'reserved',
- 7 => 'special',
- 8 => 'identifier',
- ),
- 3 =>
- array (
- 0 => 'code',
- 1 => 'special',
- 2 => 'identifier',
- ),
- 4 =>
- array (
- 0 => 'special',
- ),
- 5 =>
- array (
- 0 => 'special',
- ),
- );
- $this->_end = array (
- 0 => '/--\\>/',
- 1 => '/\\]\\]\\>/',
- 2 => '/\\>/',
- 3 => '/\\)/',
- 4 => '/\'/',
- 5 => '/"/',
- );
- $this->_states = array (
- -1 =>
- array (
- 0 => 0,
- 1 => 1,
- 2 => -1,
- ),
- 0 =>
- array (
- ),
- 1 =>
- array (
- 0 => 0,
- 1 => 2,
- 2 => -1,
- 3 => -1,
- 4 => -1,
- ),
- 2 =>
- array (
- 0 => 0,
- 1 => 3,
- 2 => 4,
- 3 => 5,
- 4 => -1,
- 5 => -1,
- 6 => -1,
- 7 => -1,
- 8 => -1,
- ),
- 3 =>
- array (
- 0 => 3,
- 1 => -1,
- 2 => -1,
- ),
- 4 =>
- array (
- 0 => -1,
- ),
- 5 =>
- array (
- 0 => -1,
- ),
- );
- $this->_keywords = array (
- -1 =>
- array (
- 0 => -1,
- 1 => -1,
- 2 =>
- array (
- ),
- ),
- 0 =>
- array (
- ),
- 1 =>
- array (
- 0 => -1,
- 1 => -1,
- 2 =>
- array (
- ),
- 3 =>
- array (
- ),
- 4 =>
- array (
- ),
- ),
- 2 =>
- array (
- 0 => -1,
- 1 => -1,
- 2 => -1,
- 3 => -1,
- 4 =>
- array (
- ),
- 5 =>
- array (
- ),
- 6 =>
- array (
- ),
- 7 =>
- array (
- ),
- 8 =>
- array (
- ),
- ),
- 3 =>
- array (
- 0 => -1,
- 1 =>
- array (
- ),
- 2 =>
- array (
- ),
- ),
- 4 =>
- array (
- 0 =>
- array (
- ),
- ),
- 5 =>
- array (
- 0 =>
- array (
- ),
- ),
- );
- $this->_parts = array (
- 0 =>
- array (
- ),
- 1 =>
- array (
- 0 => NULL,
- 1 => NULL,
- 2 => NULL,
- 3 => NULL,
- 4 => NULL,
- ),
- 2 =>
- array (
- 0 => NULL,
- 1 => NULL,
- 2 => NULL,
- 3 => NULL,
- 4 => NULL,
- 5 => NULL,
- 6 => NULL,
- 7 => NULL,
- 8 => NULL,
- ),
- 3 =>
- array (
- 0 => NULL,
- 1 => NULL,
- 2 => NULL,
- ),
- 4 =>
- array (
- 0 => NULL,
- ),
- 5 =>
- array (
- 0 => NULL,
- ),
- );
- $this->_subst = array (
- -1 =>
- array (
- 0 => false,
- 1 => false,
- 2 => false,
- ),
- 0 =>
- array (
- ),
- 1 =>
- array (
- 0 => false,
- 1 => false,
- 2 => false,
- 3 => false,
- 4 => false,
- ),
- 2 =>
- array (
- 0 => false,
- 1 => false,
- 2 => false,
- 3 => false,
- 4 => false,
- 5 => false,
- 6 => false,
- 7 => false,
- 8 => false,
- ),
- 3 =>
- array (
- 0 => false,
- 1 => false,
- 2 => false,
- ),
- 4 =>
- array (
- 0 => false,
- ),
- 5 =>
- array (
- 0 => false,
- ),
- );
- $this->_conditions = array (
- );
- $this->_kwmap = array (
- );
- $this->_defClass = 'code';
- $this->_checkDefines();
- }
-
-} \ No newline at end of file
diff --git a/library/Text_Highlighter/Text/Highlighter/Generator.php b/library/Text_Highlighter/Text/Highlighter/Generator.php
deleted file mode 100644
index 39c4edccb..000000000
--- a/library/Text_Highlighter/Text/Highlighter/Generator.php
+++ /dev/null
@@ -1,1291 +0,0 @@
-<?php
-/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
-/**
-* Syntax highlighter class generator
-*
-* To simplify the process of creating new syntax highlighters
-* for different languages, {@link Text_Highlighter_Generator} class is
-* provided. It takes highlighting rules from XML file and generates
-* a code of a class inherited from {@link Text_Highlighter}.
-*
-* PHP versions 4 and 5
-*
-* LICENSE: This source file is subject to version 3.0 of the PHP license
-* that is available through the world-wide-web at the following URI:
-* http://www.php.net/license/3_0.txt. If you did not receive a copy of
-* the PHP License and are unable to obtain it through the web, please
-* send a note to license@php.net so we can mail you a copy immediately.
-*
-* @category Text
-* @package Text_Highlighter
-* @author Andrey Demenev <demenev@gmail.com>
-* @copyright 2004-2006 Andrey Demenev
-* @license http://www.php.net/license/3_0.txt PHP License
-* @version CVS: $Id$
-* @link http://pear.php.net/package/Text_Highlighter
-*/
-
-/**
-* @ignore
-*/
-require_once 'PEAR.php';
-require_once 'XML/Parser.php';
-
-// {{{ error codes
-
-define ('TEXT_HIGHLIGHTER_EMPTY_RE', 1);
-define ('TEXT_HIGHLIGHTER_INVALID_RE', 2);
-define ('TEXT_HIGHLIGHTER_EMPTY_OR_MISSING', 3);
-define ('TEXT_HIGHLIGHTER_EMPTY', 4);
-define ('TEXT_HIGHLIGHTER_REGION_REGION', 5);
-define ('TEXT_HIGHLIGHTER_REGION_BLOCK', 6);
-define ('TEXT_HIGHLIGHTER_BLOCK_REGION', 7);
-define ('TEXT_HIGHLIGHTER_KEYWORD_BLOCK', 8);
-define ('TEXT_HIGHLIGHTER_KEYWORD_INHERITS', 9);
-define ('TEXT_HIGHLIGHTER_PARSE', 10);
-define ('TEXT_HIGHLIGHTER_FILE_WRITE', 11);
-define ('TEXT_HIGHLIGHTER_FILE_READ', 12);
-// }}}
-
-/**
-* Syntax highliter class generator class
-*
-* This class is used to generate PHP classes
-* from XML files with highlighting rules
-*
-* Usage example
-* <code>
-*require_once 'Text/Highlighter/Generator.php';
-*$generator = new Text_Highlighter_Generator('php.xml');
-*$generator->generate();
-*$generator->saveCode('PHP.php');
-* </code>
-*
-* A command line script <b>generate</b> is provided for
-* class generation (installs in scripts/Text/Highlighter).
-*
-* @author Andrey Demenev <demenev@gmail.com>
-* @copyright 2004-2006 Andrey Demenev
-* @license http://www.php.net/license/3_0.txt PHP License
-* @version Release: @package_version@
-* @link http://pear.php.net/package/Text_Highlighter
-*/
-
-class Text_Highlighter_Generator extends XML_Parser
-{
- // {{{ properties
- /**
- * Whether to do case folding.
- * We have to declare it here, because XML_Parser
- * sets case folding in constructor
- *
- * @var boolean
- */
- var $folding = false;
-
- /**
- * Holds name of file with highlighting rules
- *
- * @var string
- * @access private
- */
- var $_syntaxFile;
-
- /**
- * Current element being processed
- *
- * @var array
- * @access private
- */
- var $_element;
-
- /**
- * List of regions
- *
- * @var array
- * @access private
- */
- var $_regions = array();
-
- /**
- * List of blocks
- *
- * @var array
- * @access private
- */
- var $_blocks = array();
-
- /**
- * List of keyword groups
- *
- * @var array
- * @access private
- */
- var $_keywords = array();
-
- /**
- * List of authors
- *
- * @var array
- * @access private
- */
- var $_authors = array();
-
- /**
- * Name of language
- *
- * @var string
- * @access public
- */
- var $language = '';
-
- /**
- * Generated code
- *
- * @var string
- * @access private
- */
- var $_code = '';
-
- /**
- * Default class
- *
- * @var string
- * @access private
- */
- var $_defClass = 'default';
-
- /**
- * Comment
- *
- * @var string
- * @access private
- */
- var $_comment = '';
-
- /**
- * Flag for comment processing
- *
- * @var boolean
- * @access private
- */
- var $_inComment = false;
-
- /**
- * Sorting order of current block/region
- *
- * @var integer
- * @access private
- */
- var $_blockOrder = 0;
-
- /**
- * Generation errors
- *
- * @var array
- * @access private
- */
- var $_errors;
-
- // }}}
- // {{{ constructor
-
- /**
- * PHP4 compatable constructor
- *
- * @param string $syntaxFile Name of XML file
- * with syntax highlighting rules
- *
- * @access public
- */
-
- function Text_Highlighter_Generator($syntaxFile = '')
- {
- return $this->__construct($syntaxFile);
- }
-
- /**
- * Constructor
- *
- * @param string $syntaxFile Name of XML file
- * with syntax highlighting rules
- *
- * @access public
- */
-
- function __construct($syntaxFile = '')
- {
- XML_Parser::XML_Parser(null, 'func');
- $this->_errors = array();
- $this->_declareErrorMessages();
- if ($syntaxFile) {
- $this->setInputFile($syntaxFile);
- }
- }
-
- // }}}
- // {{{ _formatError
-
- /**
- * Format error message
- *
- * @param int $code error code
- * @param string $params parameters
- * @param string $fileName file name
- * @param int $lineNo line number
- * @return array
- * @access public
- */
- function _formatError($code, $params, $fileName, $lineNo)
- {
- $template = $this->_templates[$code];
- $ret = call_user_func_array('sprintf', array_merge(array($template), $params));
- if ($fileName) {
- $ret = '[' . $fileName . '] ' . $ret;
- }
- if ($lineNo) {
- $ret .= ' (line ' . $lineNo . ')';
- }
- return $ret;
- }
-
- // }}}
- // {{{ declareErrorMessages
-
- /**
- * Set up error message templates
- *
- * @access private
- */
- function _declareErrorMessages()
- {
- $this->_templates = array (
- TEXT_HIGHLIGHTER_EMPTY_RE => 'Empty regular expression',
- TEXT_HIGHLIGHTER_INVALID_RE => 'Invalid regular expression : %s',
- TEXT_HIGHLIGHTER_EMPTY_OR_MISSING => 'Empty or missing %s',
- TEXT_HIGHLIGHTER_EMPTY => 'Empty %s',
- TEXT_HIGHLIGHTER_REGION_REGION => 'Region %s refers undefined region %s',
- TEXT_HIGHLIGHTER_REGION_BLOCK => 'Region %s refers undefined block %s',
- TEXT_HIGHLIGHTER_BLOCK_REGION => 'Block %s refers undefined region %s',
- TEXT_HIGHLIGHTER_KEYWORD_BLOCK => 'Keyword group %s refers undefined block %s',
- TEXT_HIGHLIGHTER_KEYWORD_INHERITS => 'Keyword group %s inherits undefined block %s',
- TEXT_HIGHLIGHTER_PARSE => '%s',
- TEXT_HIGHLIGHTER_FILE_WRITE => 'Error writing file %s',
- TEXT_HIGHLIGHTER_FILE_READ => '%s'
- );
- }
-
- // }}}
- // {{{ setInputFile
-
- /**
- * Sets the input xml file to be parsed
- *
- * @param string Filename (full path)
- * @return boolean
- * @access public
- */
- function setInputFile($file)
- {
- $this->_syntaxFile = $file;
- $ret = parent::setInputFile($file);
- if (PEAR::isError($ret)) {
- $this->_error(TEXT_HIGHLIGHTER_FILE_READ, $ret->message);
- return false;
- }
- return true;
- }
-
- // }}}
- // {{{ generate
-
- /**
- * Generates class code
- *
- * @access public
- */
-
- function generate()
- {
- $this->_regions = array();
- $this->_blocks = array();
- $this->_keywords = array();
- $this->language = '';
- $this->_code = '';
- $this->_defClass = 'default';
- $this->_comment = '';
- $this->_inComment = false;
- $this->_authors = array();
- $this->_blockOrder = 0;
- $this->_errors = array();
-
- $ret = $this->parse();
- if (PEAR::isError($ret)) {
- $this->_error(TEXT_HIGHLIGHTER_PARSE, $ret->message);
- return false;
- }
- return true;
- }
-
- // }}}
- // {{{ getCode
-
- /**
- * Returns generated code as a string.
- *
- * @return string Generated code
- * @access public
- */
-
- function getCode()
- {
- return $this->_code;
- }
-
- // }}}
- // {{{ saveCode
-
- /**
- * Saves generated class to file. Note that {@link Text_Highlighter::factory()}
- * assumes that filename is uppercase (SQL.php, DTD.php, etc), and file
- * is located in Text/Highlighter
- *
- * @param string $filename Name of file to write the code to
- * @return boolean true on success, false on failure
- * @access public
- */
-
- function saveCode($filename)
- {
- $f = @fopen($filename, 'wb');
- if (!$f) {
- $this->_error(TEXT_HIGHLIGHTER_FILE_WRITE, array('outfile'=>$filename));
- return false;
- }
- fwrite ($f, $this->_code);
- fclose($f);
- return true;
- }
-
- // }}}
- // {{{ hasErrors
-
- /**
- * Reports if there were errors
- *
- * @return boolean
- * @access public
- */
-
- function hasErrors()
- {
- return count($this->_errors) > 0;
- }
-
- // }}}
- // {{{ getErrors
-
- /**
- * Returns errors
- *
- * @return array
- * @access public
- */
-
- function getErrors()
- {
- return $this->_errors;
- }
-
- // }}}
- // {{{ _sortBlocks
-
- /**
- * Sorts blocks
- *
- * @access private
- */
-
- function _sortBlocks($b1, $b2) {
- return $b1['order'] - $b2['order'];
- }
-
- // }}}
- // {{{ _sortLookFor
- /**
- * Sort 'look for' list
- * @return int
- * @param string $b1
- * @param string $b2
- */
- function _sortLookFor($b1, $b2) {
- $o1 = isset($this->_blocks[$b1]) ? $this->_blocks[$b1]['order'] : $this->_regions[$b1]['order'];
- $o2 = isset($this->_blocks[$b2]) ? $this->_blocks[$b2]['order'] : $this->_regions[$b2]['order'];
- return $o1 - $o2;
- }
-
- // }}}
- // {{{ _makeRE
-
- /**
- * Adds delimiters and modifiers to regular expression if necessary
- *
- * @param string $text Original RE
- * @return string Final RE
- * @access private
- */
- function _makeRE($text, $case = false)
- {
- if (!strlen($text)) {
- $this->_error(TEXT_HIGHLIGHTER_EMPTY_RE);
- }
- if (!strlen($text) || $text{0} != '/') {
- $text = '/' . $text . '/';
- }
- if (!$case) {
- $text .= 'i';
- }
- $php_errormsg = '';
- @preg_match($text, '');
- if ($php_errormsg) {
- $this->_error(TEXT_HIGHLIGHTER_INVALID_RE, $php_errormsg);
- }
- preg_match ('#^/(.+)/(.*)$#', $text, $m);
- if (@$m[2]) {
- $text = '(?' . $m[2] . ')' . $m[1];
- } else {
- $text = $m[1];
- }
- return $text;
- }
-
- // }}}
- // {{{ _exportArray
-
- /**
- * Exports array as PHP code
- *
- * @param array $array
- * @return string Code
- * @access private
- */
- function _exportArray($array)
- {
- $array = var_export($array, true);
- return trim(preg_replace('~^(\s*)~m',' \1\1',$array));
- }
-
- // }}}
- // {{{ _countSubpatterns
- /**
- * Find number of capturing suppaterns in regular expression
- * @return int
- * @param string $re Regular expression (without delimiters)
- */
- function _countSubpatterns($re)
- {
- preg_match_all('/' . $re . '/', '', $m);
- return count($m)-1;
- }
-
- // }}}
-
- /**#@+
- * @access private
- * @param resource $xp XML parser resource
- * @param string $elem XML element name
- * @param array $attribs XML element attributes
- */
-
- // {{{ xmltag_Default
-
- /**
- * start handler for <default> element
- */
- function xmltag_Default($xp, $elem, $attribs)
- {
- $this->_aliasAttributes($attribs);
- if (!isset($attribs['innerGroup']) || $attribs['innerGroup'] === '') {
- $this->_error(TEXT_HIGHLIGHTER_EMPTY_OR_MISSING, 'innerGroup');
- }
- $this->_defClass = @$attribs['innerGroup'];
- }
-
- // }}}
- // {{{ xmltag_Region
-
- /**
- * start handler for <region> element
- */
- function xmltag_Region($xp, $elem, $attribs)
- {
- $this->_aliasAttributes($attribs);
- if (!isset($attribs['name']) || $attribs['name'] === '') {
- $this->_error(TEXT_HIGHLIGHTER_EMPTY_OR_MISSING, 'region name');
- }
- if (!isset($attribs['innerGroup']) || $attribs['innerGroup'] === '') {
- $this->_error(TEXT_HIGHLIGHTER_EMPTY_OR_MISSING, 'innerGroup');
- }
- $this->_element = array('name' => $attribs['name']);
- $this->_element['line'] = xml_get_current_line_number($this->parser);
- if (isset($attribs['case'])) {
- $this->_element['case'] = $attribs['case'] == 'yes';
- } else {
- $this->_element['case'] = $this->_case;
- }
- $this->_element['innerGroup'] = $attribs['innerGroup'];
- $this->_element['delimGroup'] = isset($attribs['delimGroup']) ?
- $attribs['delimGroup'] :
- $attribs['innerGroup'];
- $this->_element['start'] = $this->_makeRE(@$attribs['start'], $this->_element['case']);
- $this->_element['end'] = $this->_makeRE(@$attribs['end'], $this->_element['case']);
- $this->_element['contained'] = @$attribs['contained'] == 'yes';
- $this->_element['never-contained'] = @$attribs['never-contained'] == 'yes';
- $this->_element['remember'] = @$attribs['remember'] == 'yes';
- if (isset($attribs['startBOL']) && $attribs['startBOL'] == 'yes') {
- $this->_element['startBOL'] = true;
- }
- if (isset($attribs['endBOL']) && $attribs['endBOL'] == 'yes') {
- $this->_element['endBOL'] = true;
- }
- if (isset($attribs['neverAfter'])) {
- $this->_element['neverafter'] = $this->_makeRE($attribs['neverAfter']);
- }
- }
-
- // }}}
- // {{{ xmltag_Block
-
- /**
- * start handler for <block> element
- */
- function xmltag_Block($xp, $elem, $attribs)
- {
- $this->_aliasAttributes($attribs);
- if (!isset($attribs['name']) || $attribs['name'] === '') {
- $this->_error(TEXT_HIGHLIGHTER_EMPTY_OR_MISSING, 'block name');
- }
- if (isset($attribs['innerGroup']) && $attribs['innerGroup'] === '') {
- $this->_error(TEXT_HIGHLIGHTER_EMPTY, 'innerGroup');
- }
- $this->_element = array('name' => $attribs['name']);
- $this->_element['line'] = xml_get_current_line_number($this->parser);
- if (isset($attribs['case'])) {
- $this->_element['case'] = $attribs['case'] == 'yes';
- } else {
- $this->_element['case'] = $this->_case;
- }
- if (isset($attribs['innerGroup'])) {
- $this->_element['innerGroup'] = @$attribs['innerGroup'];
- }
- $this->_element['match'] = $this->_makeRE($attribs['match'], $this->_element['case']);
- $this->_element['contained'] = @$attribs['contained'] == 'yes';
- $this->_element['multiline'] = @$attribs['multiline'] == 'yes';
- if (isset($attribs['BOL']) && $attribs['BOL'] == 'yes') {
- $this->_element['BOL'] = true;
- }
- if (isset($attribs['neverAfter'])) {
- $this->_element['neverafter'] = $this->_makeRE($attribs['neverAfter']);
- }
- }
-
- // }}}
- // {{{ cdataHandler
-
- /**
- * Character data handler. Used for comment
- */
- function cdataHandler($xp, $cdata)
- {
- if ($this->_inComment) {
- $this->_comment .= $cdata;
- }
- }
-
- // }}}
- // {{{ xmltag_Comment
-
- /**
- * start handler for <comment> element
- */
- function xmltag_Comment($xp, $elem, $attribs)
- {
- $this->_comment = '';
- $this->_inComment = true;
- }
-
- // }}}
- // {{{ xmltag_PartGroup
-
- /**
- * start handler for <partgroup> element
- */
- function xmltag_PartGroup($xp, $elem, $attribs)
- {
- $this->_aliasAttributes($attribs);
- if (!isset($attribs['innerGroup']) || $attribs['innerGroup'] === '') {
- $this->_error(TEXT_HIGHLIGHTER_EMPTY_OR_MISSING, 'innerGroup');
- }
- $this->_element['partClass'][$attribs['index']] = @$attribs['innerGroup'];
- }
-
- // }}}
- // {{{ xmltag_PartClass
-
- /**
- * start handler for <partclass> element
- */
- function xmltag_PartClass($xp, $elem, $attribs)
- {
- $this->xmltag_PartGroup($xp, $elem, $attribs);
- }
-
- // }}}
- // {{{ xmltag_Keywords
-
- /**
- * start handler for <keywords> element
- */
- function xmltag_Keywords($xp, $elem, $attribs)
- {
- $this->_aliasAttributes($attribs);
- if (!isset($attribs['name']) || $attribs['name'] === '') {
- $this->_error(TEXT_HIGHLIGHTER_EMPTY_OR_MISSING, 'keyword group name');
- }
- if (!isset($attribs['innerGroup']) || $attribs['innerGroup'] === '') {
- $this->_error(TEXT_HIGHLIGHTER_EMPTY_OR_MISSING, 'innerGroup');
- }
- if (!isset($attribs['inherits']) || $attribs['inherits'] === '') {
- $this->_error(TEXT_HIGHLIGHTER_EMPTY_OR_MISSING, 'inherits');
- }
- $this->_element = array('name'=>@$attribs['name']);
- $this->_element['line'] = xml_get_current_line_number($this->parser);
- $this->_element['innerGroup'] = @$attribs['innerGroup'];
- if (isset($attribs['case'])) {
- $this->_element['case'] = $attribs['case'] == 'yes';
- } else {
- $this->_element['case'] = $this->_case;
- }
- $this->_element['inherits'] = @$attribs['inherits'];
- if (isset($attribs['otherwise'])) {
- $this->_element['otherwise'] = $attribs['otherwise'];
- }
- if (isset($attribs['ifdef'])) {
- $this->_element['ifdef'] = $attribs['ifdef'];
- }
- if (isset($attribs['ifndef'])) {
- $this->_element['ifndef'] = $attribs['ifndef'];
- }
- }
-
- // }}}
- // {{{ xmltag_Keyword
-
- /**
- * start handler for <keyword> element
- */
- function xmltag_Keyword($xp, $elem, $attribs)
- {
- if (!isset($attribs['match']) || $attribs['match'] === '') {
- $this->_error(TEXT_HIGHLIGHTER_EMPTY_OR_MISSING, 'match');
- }
- $keyword = @$attribs['match'];
- if (!$this->_element['case']) {
- $keyword = strtolower($keyword);
- }
- $this->_element['match'][$keyword] = true;
- }
-
- // }}}
- // {{{ xmltag_Contains
-
- /**
- * start handler for <contains> element
- */
- function xmltag_Contains($xp, $elem, $attribs)
- {
- $this->_element['contains-all'] = @$attribs['all'] == 'yes';
- if (isset($attribs['region'])) {
- $this->_element['contains']['region'][$attribs['region']] =
- xml_get_current_line_number($this->parser);
- }
- if (isset($attribs['block'])) {
- $this->_element['contains']['block'][$attribs['block']] =
- xml_get_current_line_number($this->parser);
- }
- }
-
- // }}}
- // {{{ xmltag_But
-
- /**
- * start handler for <but> element
- */
- function xmltag_But($xp, $elem, $attribs)
- {
- if (isset($attribs['region'])) {
- $this->_element['not-contains']['region'][$attribs['region']] = true;
- }
- if (isset($attribs['block'])) {
- $this->_element['not-contains']['block'][$attribs['block']] = true;
- }
- }
-
- // }}}
- // {{{ xmltag_Onlyin
-
- /**
- * start handler for <onlyin> element
- */
- function xmltag_Onlyin($xp, $elem, $attribs)
- {
- if (!isset($attribs['region']) || $attribs['region'] === '') {
- $this->_error(TEXT_HIGHLIGHTER_EMPTY_OR_MISSING, 'region');
- }
- $this->_element['onlyin'][$attribs['region']] = xml_get_current_line_number($this->parser);
- }
-
- // }}}
- // {{{ xmltag_Author
-
- /**
- * start handler for <author> element
- */
- function xmltag_Author($xp, $elem, $attribs)
- {
- if (!isset($attribs['name']) || $attribs['name'] === '') {
- $this->_error(TEXT_HIGHLIGHTER_EMPTY_OR_MISSING, 'author name');
- }
- $this->_authors[] = array(
- 'name' => @$attribs['name'],
- 'email' => (string)@$attribs['email']
- );
- }
-
- // }}}
- // {{{ xmltag_Highlight
-
- /**
- * start handler for <highlight> element
- */
- function xmltag_Highlight($xp, $elem, $attribs)
- {
- if (!isset($attribs['lang']) || $attribs['lang'] === '') {
- $this->_error(TEXT_HIGHLIGHTER_EMPTY_OR_MISSING, 'language name');
- }
- $this->_code = '';
- $this->language = strtoupper(@$attribs['lang']);
- $this->_case = @$attribs['case'] == 'yes';
- }
-
- // }}}
-
- /**#@-*/
-
- // {{{ _error
-
- /**
- * Add an error message
- *
- * @param integer $code Error code
- * @param mixed $message Error message or array with error message parameters
- * @param integer $lineNo Source code line number
- * @access private
- */
- function _error($code, $params = array(), $lineNo = 0)
- {
- if (!$lineNo && !empty($this->parser)) {
- $lineNo = xml_get_current_line_number($this->parser);
- }
- $this->_errors[] = $this->_formatError($code, $params, $this->_syntaxFile, $lineNo);
- }
-
- // }}}
- // {{{ _aliasAttributes
-
- /**
- * BC trick
- *
- * @param array $attrs attributes
- */
- function _aliasAttributes(&$attrs)
- {
- if (isset($attrs['innerClass']) && !isset($attrs['innerGroup'])) {
- $attrs['innerGroup'] = $attrs['innerClass'];
- }
- if (isset($attrs['delimClass']) && !isset($attrs['delimGroup'])) {
- $attrs['delimGroup'] = $attrs['delimClass'];
- }
- if (isset($attrs['partClass']) && !isset($attrs['partGroup'])) {
- $attrs['partGroup'] = $attrs['partClass'];
- }
- }
-
- // }}}
-
- /**#@+
- * @access private
- * @param resource $xp XML parser resource
- * @param string $elem XML element name
- */
-
- // {{{ xmltag_Comment_
-
- /**
- * end handler for <comment> element
- */
- function xmltag_Comment_($xp, $elem)
- {
- $this->_inComment = false;
- }
-
- // }}}
- // {{{ xmltag_Region_
-
- /**
- * end handler for <region> element
- */
- function xmltag_Region_($xp, $elem)
- {
- $this->_element['type'] = 'region';
- $this->_element['order'] = $this->_blockOrder ++;
- $this->_regions[$this->_element['name']] = $this->_element;
- }
-
- // }}}
- // {{{ xmltag_Keywords_
-
- /**
- * end handler for <keywords> element
- */
- function xmltag_Keywords_($xp, $elem)
- {
- $this->_keywords[$this->_element['name']] = $this->_element;
- }
-
- // }}}
- // {{{ xmltag_Block_
-
- /**
- * end handler for <block> element
- */
- function xmltag_Block_($xp, $elem)
- {
- $this->_element['type'] = 'block';
- $this->_element['order'] = $this->_blockOrder ++;
- $this->_blocks[$this->_element['name']] = $this->_element;
- }
-
- // }}}
- // {{{ xmltag_Highlight_
-
- /**
- * end handler for <highlight> element
- */
- function xmltag_Highlight_($xp, $elem)
- {
- $conditions = array();
- $toplevel = array();
- foreach ($this->_blocks as $i => $current) {
- if (!$current['contained'] && !isset($current['onlyin'])) {
- $toplevel[] = $i;
- }
- foreach ((array)@$current['onlyin'] as $region => $lineNo) {
- if (!isset($this->_regions[$region])) {
- $this->_error(TEXT_HIGHLIGHTER_BLOCK_REGION,
- array(
- 'block' => $current['name'],
- 'region' => $region
- ));
- }
- }
- }
- foreach ($this->_regions as $i=>$current) {
- if (!$current['contained'] && !isset($current['onlyin'])) {
- $toplevel[] = $i;
- }
- foreach ((array)@$current['contains']['region'] as $region => $lineNo) {
- if (!isset($this->_regions[$region])) {
- $this->_error(TEXT_HIGHLIGHTER_REGION_REGION,
- array(
- 'region1' => $current['name'],
- 'region2' => $region
- ));
- }
- }
- foreach ((array)@$current['contains']['block'] as $region => $lineNo) {
- if (!isset($this->_blocks[$region])) {
- $this->_error(TEXT_HIGHLIGHTER_REGION_BLOCK,
- array(
- 'block' => $current['name'],
- 'region' => $region
- ));
- }
- }
- foreach ((array)@$current['onlyin'] as $region => $lineNo) {
- if (!isset($this->_regions[$region])) {
- $this->_error(TEXT_HIGHLIGHTER_REGION_REGION,
- array(
- 'region1' => $current['name'],
- 'region2' => $region
- ));
- }
- }
- foreach ($this->_regions as $j => $region) {
- if (isset($region['onlyin'])) {
- $suits = isset($region['onlyin'][$current['name']]);
- } elseif (isset($current['not-contains']['region'][$region['name']])) {
- $suits = false;
- } elseif (isset($current['contains']['region'][$region['name']])) {
- $suits = true;
- } else {
- $suits = @$current['contains-all'] && @!$region['never-contained'];
- }
- if ($suits) {
- $this->_regions[$i]['lookfor'][] = $j;
- }
- }
- foreach ($this->_blocks as $j=>$region) {
- if (isset($region['onlyin'])) {
- $suits = isset($region['onlyin'][$current['name']]);
- } elseif (isset($current['not-contains']['block'][$region['name']])) {
- $suits = false;
- } elseif (isset($current['contains']['block'][$region['name']])) {
- $suits = true;
- } else {
- $suits = @$current['contains-all'] && @!$region['never-contained'];
- }
- if ($suits) {
- $this->_regions[$i]['lookfor'][] = $j;
- }
- }
- }
- foreach ($this->_blocks as $i=>$current) {
- unset ($this->_blocks[$i]['never-contained']);
- unset ($this->_blocks[$i]['contained']);
- unset ($this->_blocks[$i]['contains-all']);
- unset ($this->_blocks[$i]['contains']);
- unset ($this->_blocks[$i]['onlyin']);
- unset ($this->_blocks[$i]['line']);
- }
-
- foreach ($this->_regions as $i=>$current) {
- unset ($this->_regions[$i]['never-contained']);
- unset ($this->_regions[$i]['contained']);
- unset ($this->_regions[$i]['contains-all']);
- unset ($this->_regions[$i]['contains']);
- unset ($this->_regions[$i]['onlyin']);
- unset ($this->_regions[$i]['line']);
- }
-
- foreach ($this->_keywords as $name => $keyword) {
- if (isset($keyword['ifdef'])) {
- $conditions[$keyword['ifdef']][] = array($name, true);
- }
- if (isset($keyword['ifndef'])) {
- $conditions[$keyword['ifndef']][] = array($name, false);
- }
- unset($this->_keywords[$name]['line']);
- if (!isset($this->_blocks[$keyword['inherits']])) {
- $this->_error(TEXT_HIGHLIGHTER_KEYWORD_INHERITS,
- array(
- 'keyword' => $keyword['name'],
- 'block' => $keyword['inherits']
- ));
- }
- if (isset($keyword['otherwise']) && !isset($this->_blocks[$keyword['otherwise']]) ) {
- $this->_error(TEXT_HIGHLIGHTER_KEYWORD_BLOCK,
- array(
- 'keyword' => $keyword['name'],
- 'block' => $keyword['inherits']
- ));
- }
- }
-
- $syntax=array(
- 'keywords' => $this->_keywords,
- 'blocks' => array_merge($this->_blocks, $this->_regions),
- 'toplevel' => $toplevel,
- );
- uasort($syntax['blocks'], array(&$this, '_sortBlocks'));
- foreach ($syntax['blocks'] as $name => $block) {
- if ($block['type'] == 'block') {
- continue;
- }
- if (is_array(@$syntax['blocks'][$name]['lookfor'])) {
- usort($syntax['blocks'][$name]['lookfor'], array(&$this, '_sortLookFor'));
- }
- }
- usort($syntax['toplevel'], array(&$this, '_sortLookFor'));
- $syntax['case'] = $this->_case;
- $this->_code = <<<CODE
-<?php
-/**
- * Auto-generated class. {$this->language} syntax highlighting
-CODE;
-
- if ($this->_comment) {
- $comment = preg_replace('~^~m',' * ',$this->_comment);
- $this->_code .= "\n * \n" . $comment;
- }
-
- $this->_code .= <<<CODE
-
- *
- * PHP version 4 and 5
- *
- * LICENSE: This source file is subject to version 3.0 of the PHP license
- * that is available through the world-wide-web at the following URI:
- * http://www.php.net/license/3_0.txt. If you did not receive a copy of
- * the PHP License and are unable to obtain it through the web, please
- * send a note to license@php.net so we can mail you a copy immediately.
- *
- * @copyright 2004-2006 Andrey Demenev
- * @license http://www.php.net/license/3_0.txt PHP License
- * @link http://pear.php.net/package/Text_Highlighter
- * @category Text
- * @package Text_Highlighter
- * @version generated from: $this->_syntaxFile
-
-CODE;
-
- foreach ($this->_authors as $author) {
- $this->_code .= ' * @author ' . $author['name'];
- if ($author['email']) {
- $this->_code .= ' <' . $author['email'] . '>';
- }
- $this->_code .= "\n";
- }
-
- $this->_code .= <<<CODE
- *
- */
-
-/**
- * @ignore
- */
-
-require_once 'Text/Highlighter.php';
-
-/**
- * Auto-generated class. {$this->language} syntax highlighting
- *
-
-CODE;
- foreach ($this->_authors as $author) {
- $this->_code .= ' * @author ' . $author['name'];
- if ($author['email']) {
- $this->_code .= ' <' . $author['email']. '>';
- }
- $this->_code .= "\n";
- }
-
-
- $this->_code .= <<<CODE
- * @category Text
- * @package Text_Highlighter
- * @copyright 2004-2006 Andrey Demenev
- * @license http://www.php.net/license/3_0.txt PHP License
- * @version Release: @package_version@
- * @link http://pear.php.net/package/Text_Highlighter
- */
-class Text_Highlighter_{$this->language} extends Text_Highlighter
-{
-
-CODE;
- $this->_code .= 'var $_language = \'' . strtolower($this->language) . "';\n\n";
- $array = var_export($syntax, true);
- $array = trim(preg_replace('~^(\s*)~m',' \1\1',$array));
- // \$this->_syntax = $array;
- $this->_code .= <<<CODE
- /**
- * PHP4 Compatible Constructor
- *
- * @param array \$options
- * @access public
- */
- function Text_Highlighter_{$this->language}(\$options=array())
- {
- \$this->__construct(\$options);
- }
-
-
- /**
- * Constructor
- *
- * @param array \$options
- * @access public
- */
- function __construct(\$options=array())
- {
-
-CODE;
- $this->_code .= <<<CODE
-
- \$this->_options = \$options;
-CODE;
- $states = array();
- $i = 0;
- foreach ($syntax['blocks'] as $name => $block) {
- if ($block['type'] == 'region') {
- $states[$name] = $i++;
- }
- }
- $regs = array();
- $counts = array();
- $delim = array();
- $inner = array();
- $end = array();
- $stat = array();
- $keywords = array();
- $parts = array();
- $kwmap = array();
- $subst = array();
- $re = array();
- $ce = array();
- $rd = array();
- $in = array();
- $st = array();
- $kw = array();
- $sb = array();
- foreach ($syntax['toplevel'] as $name) {
- $block = $syntax['blocks'][$name];
- if ($block['type'] == 'block') {
- $kwm = array();
- $re[] = '(' . $block['match'] . ')';
- $ce[] = $this->_countSubpatterns($block['match']);
- $rd[] = '';
- $sb[] = false;;
- $st[] = -1;
- foreach ($syntax['keywords'] as $kwname => $kwgroup) {
- if ($kwgroup['inherits'] != $name) {
- continue;
- }
- $gre = implode('|', array_keys($kwgroup['match']));
- if (!$kwgroup['case']) {
- $gre = '(?i)' . $gre;
- }
- $kwm[$kwname][] = $gre;
- $kwmap[$kwname] = $kwgroup['innerGroup'];
- }
- foreach ($kwm as $g => $ma) {
- $kwm[$g] = '/^(' . implode(')|(', $ma) . ')$/';
- }
- $kw[] = $kwm;
- } else {
- $kw[] = -1;
- $re[] = '(' . $block['start'] . ')';
- $ce[] = $this->_countSubpatterns($block['start']);
- $rd[] = $block['delimGroup'];
- $st[] = $states[$name];
- $sb[] = $block['remember'];
- }
- $in[] = $block['innerGroup'];
- }
- $re = implode('|', $re);
- $regs[-1] = '/' . $re . '/';
- $counts[-1] = $ce;
- $delim[-1] = $rd;
- $inner[-1] = $in;
- $stat[-1] = $st;
- $keywords[-1] = $kw;
- $subst[-1] = $sb;
-
- foreach ($syntax['blocks'] as $ablock) {
- if ($ablock['type'] != 'region') {
- continue;
- }
- $end[] = '/' . $ablock['end'] . '/';
- $re = array();
- $ce = array();
- $rd = array();
- $in = array();
- $st = array();
- $kw = array();
- $pc = array();
- $sb = array();
- foreach ((array)@$ablock['lookfor'] as $name) {
- $block = $syntax['blocks'][$name];
- if (isset($block['partClass'])) {
- $pc[] = $block['partClass'];
- } else {
- $pc[] = null;
- }
- if ($block['type'] == 'block') {
- $kwm = array();;
- $re[] = '(' . $block['match'] . ')';
- $ce[] = $this->_countSubpatterns($block['match']);
- $rd[] = '';
- $sb[] = false;
- $st[] = -1;
- foreach ($syntax['keywords'] as $kwname => $kwgroup) {
- if ($kwgroup['inherits'] != $name) {
- continue;
- }
- $gre = implode('|', array_keys($kwgroup['match']));
- if (!$kwgroup['case']) {
- $gre = '(?i)' . $gre;
- }
- $kwm[$kwname][] = $gre;
- $kwmap[$kwname] = $kwgroup['innerGroup'];
- }
- foreach ($kwm as $g => $ma) {
- $kwm[$g] = '/^(' . implode(')|(', $ma) . ')$/';
- }
- $kw[] = $kwm;
- } else {
- $sb[] = $block['remember'];
- $kw[] = -1;
- $re[] = '(' . $block['start'] . ')';
- $ce[] = $this->_countSubpatterns($block['start']);
- $rd[] = $block['delimGroup'];
- $st[] = $states[$name];
- }
- $in[] = $block['innerGroup'];
- }
- $re = implode('|', $re);
- $regs[] = '/' . $re . '/';
- $counts[] = $ce;
- $delim[] = $rd;
- $inner[] = $in;
- $stat[] = $st;
- $keywords[] = $kw;
- $parts[] = $pc;
- $subst[] = $sb;
- }
-
-
- $this->_code .= "\n \$this->_regs = " . $this->_exportArray($regs);
- $this->_code .= ";\n \$this->_counts = " .$this->_exportArray($counts);
- $this->_code .= ";\n \$this->_delim = " .$this->_exportArray($delim);
- $this->_code .= ";\n \$this->_inner = " .$this->_exportArray($inner);
- $this->_code .= ";\n \$this->_end = " .$this->_exportArray($end);
- $this->_code .= ";\n \$this->_states = " .$this->_exportArray($stat);
- $this->_code .= ";\n \$this->_keywords = " .$this->_exportArray($keywords);
- $this->_code .= ";\n \$this->_parts = " .$this->_exportArray($parts);
- $this->_code .= ";\n \$this->_subst = " .$this->_exportArray($subst);
- $this->_code .= ";\n \$this->_conditions = " .$this->_exportArray($conditions);
- $this->_code .= ";\n \$this->_kwmap = " .$this->_exportArray($kwmap);
- $this->_code .= ";\n \$this->_defClass = '" .$this->_defClass . '\'';
- $this->_code .= <<<CODE
-;
- \$this->_checkDefines();
- }
-
-}
-CODE;
-}
-
-// }}}
-}
-
-
-/*
-* Local variables:
-* tab-width: 4
-* c-basic-offset: 4
-* c-hanging-comment-ender-p: nil
-* End:
-*/
-
-?>
diff --git a/library/Text_Highlighter/Text/Highlighter/HTML.php b/library/Text_Highlighter/Text/Highlighter/HTML.php
deleted file mode 100644
index 14d0a783f..000000000
--- a/library/Text_Highlighter/Text/Highlighter/HTML.php
+++ /dev/null
@@ -1,234 +0,0 @@
-<?php
-/**
- * Auto-generated class. HTML syntax highlighting
- *
- * PHP version 4 and 5
- *
- * LICENSE: This source file is subject to version 3.0 of the PHP license
- * that is available through the world-wide-web at the following URI:
- * http://www.php.net/license/3_0.txt. If you did not receive a copy of
- * the PHP License and are unable to obtain it through the web, please
- * send a note to license@php.net so we can mail you a copy immediately.
- *
- * @copyright 2004-2006 Andrey Demenev
- * @license http://www.php.net/license/3_0.txt PHP License
- * @link http://pear.php.net/package/Text_Highlighter
- * @category Text
- * @package Text_Highlighter
- * @version generated from: : html.xml,v 1.1 2007/06/03 02:35:28 ssttoo Exp
- * @author Andrey Demenev <demenev@gmail.com>
- *
- */
-
-/**
- * @ignore
- */
-
-require_once 'Text/Highlighter.php';
-
-/**
- * Auto-generated class. HTML syntax highlighting
- *
- * @author Andrey Demenev <demenev@gmail.com>
- * @category Text
- * @package Text_Highlighter
- * @copyright 2004-2006 Andrey Demenev
- * @license http://www.php.net/license/3_0.txt PHP License
- * @version Release: @package_version@
- * @link http://pear.php.net/package/Text_Highlighter
- */
-class Text_Highlighter_HTML extends Text_Highlighter
-{
- var $_language = 'html';
-
- /**
- * PHP4 Compatible Constructor
- *
- * @param array $options
- * @access public
- */
- function Text_Highlighter_HTML($options=array())
- {
- $this->__construct($options);
- }
-
-
- /**
- * Constructor
- *
- * @param array $options
- * @access public
- */
- function __construct($options=array())
- {
-
- $this->_options = $options;
- $this->_regs = array (
- -1 => '/((?i)\\<!--)|((?i)\\<[\\?\\/]?)|((?i)(&)[\\w\\-\\.]+;)/',
- 0 => '//',
- 1 => '/((?i)(?<=[\\<\\/?])[\\w\\-\\:]+)|((?i)[\\w\\-\\:]+)|((?i)")/',
- 2 => '/((?i)(&)[\\w\\-\\.]+;)/',
- );
- $this->_counts = array (
- -1 =>
- array (
- 0 => 0,
- 1 => 0,
- 2 => 1,
- ),
- 0 =>
- array (
- ),
- 1 =>
- array (
- 0 => 0,
- 1 => 0,
- 2 => 0,
- ),
- 2 =>
- array (
- 0 => 1,
- ),
- );
- $this->_delim = array (
- -1 =>
- array (
- 0 => 'comment',
- 1 => 'brackets',
- 2 => '',
- ),
- 0 =>
- array (
- ),
- 1 =>
- array (
- 0 => '',
- 1 => '',
- 2 => 'quotes',
- ),
- 2 =>
- array (
- 0 => '',
- ),
- );
- $this->_inner = array (
- -1 =>
- array (
- 0 => 'comment',
- 1 => 'code',
- 2 => 'special',
- ),
- 0 =>
- array (
- ),
- 1 =>
- array (
- 0 => 'reserved',
- 1 => 'var',
- 2 => 'string',
- ),
- 2 =>
- array (
- 0 => 'special',
- ),
- );
- $this->_end = array (
- 0 => '/(?i)--\\>/',
- 1 => '/(?i)[\\/\\?]?\\>/',
- 2 => '/(?i)"/',
- );
- $this->_states = array (
- -1 =>
- array (
- 0 => 0,
- 1 => 1,
- 2 => -1,
- ),
- 0 =>
- array (
- ),
- 1 =>
- array (
- 0 => -1,
- 1 => -1,
- 2 => 2,
- ),
- 2 =>
- array (
- 0 => -1,
- ),
- );
- $this->_keywords = array (
- -1 =>
- array (
- 0 => -1,
- 1 => -1,
- 2 =>
- array (
- ),
- ),
- 0 =>
- array (
- ),
- 1 =>
- array (
- 0 =>
- array (
- ),
- 1 =>
- array (
- ),
- 2 => -1,
- ),
- 2 =>
- array (
- 0 =>
- array (
- ),
- ),
- );
- $this->_parts = array (
- 0 =>
- array (
- ),
- 1 =>
- array (
- 0 => NULL,
- 1 => NULL,
- 2 => NULL,
- ),
- 2 =>
- array (
- 0 => NULL,
- ),
- );
- $this->_subst = array (
- -1 =>
- array (
- 0 => false,
- 1 => false,
- 2 => false,
- ),
- 0 =>
- array (
- ),
- 1 =>
- array (
- 0 => false,
- 1 => false,
- 2 => false,
- ),
- 2 =>
- array (
- 0 => false,
- ),
- );
- $this->_conditions = array (
- );
- $this->_kwmap = array (
- );
- $this->_defClass = 'code';
- $this->_checkDefines();
- }
-
-} \ No newline at end of file
diff --git a/library/Text_Highlighter/Text/Highlighter/JAVA.php b/library/Text_Highlighter/Text/Highlighter/JAVA.php
deleted file mode 100644
index 46c0b8851..000000000
--- a/library/Text_Highlighter/Text/Highlighter/JAVA.php
+++ /dev/null
@@ -1,802 +0,0 @@
-<?php
-/**
- * Auto-generated class. JAVA syntax highlighting
- *
- * PHP version 4 and 5
- *
- * LICENSE: This source file is subject to version 3.0 of the PHP license
- * that is available through the world-wide-web at the following URI:
- * http://www.php.net/license/3_0.txt. If you did not receive a copy of
- * the PHP License and are unable to obtain it through the web, please
- * send a note to license@php.net so we can mail you a copy immediately.
- *
- * @copyright 2004-2006 Andrey Demenev
- * @license http://www.php.net/license/3_0.txt PHP License
- * @link http://pear.php.net/package/Text_Highlighter
- * @category Text
- * @package Text_Highlighter
- * @version generated from: : java.xml,v 1.1 2007/06/03 02:35:28 ssttoo Exp
- * @author Andrey Demenev <demenev@gmail.com>
- *
- */
-
-/**
- * @ignore
- */
-
-require_once 'Text/Highlighter.php';
-
-/**
- * Auto-generated class. JAVA syntax highlighting
- *
- * @author Andrey Demenev <demenev@gmail.com>
- * @category Text
- * @package Text_Highlighter
- * @copyright 2004-2006 Andrey Demenev
- * @license http://www.php.net/license/3_0.txt PHP License
- * @version Release: @package_version@
- * @link http://pear.php.net/package/Text_Highlighter
- */
-class Text_Highlighter_JAVA extends Text_Highlighter
-{
- var $_language = 'java';
-
- /**
- * PHP4 Compatible Constructor
- *
- * @param array $options
- * @access public
- */
- function Text_Highlighter_JAVA($options=array())
- {
- $this->__construct($options);
- }
-
-
- /**
- * Constructor
- *
- * @param array $options
- * @access public
- */
- function __construct($options=array())
- {
-
- $this->_options = $options;
- $this->_regs = array (
- -1 => '/((?i)\\{)|((?i)\\()|((?i)\\[)|((?i)\\/\\*)|((?i)")|((?i)\')|((?i)\\/\\/)|((?i)[a-z_]\\w*)|((?i)0[xX][\\da-f]+)|((?i)\\d\\d*|\\b0\\b)|((?i)0[0-7]+)|((?i)(\\d*\\.\\d+)|(\\d+\\.\\d*))|((?i)((\\d+|((\\d*\\.\\d+)|(\\d+\\.\\d*)))[eE][+-]?\\d+))/',
- 0 => '/((?i)\\{)|((?i)\\()|((?i)\\[)|((?i)\\/\\*)|((?i)")|((?i)\')|((?i)\\/\\/)|((?i)[a-z_]\\w*)|((?i)0[xX][\\da-f]+)|((?i)\\d\\d*|\\b0\\b)|((?i)0[0-7]+)|((?i)(\\d*\\.\\d+)|(\\d+\\.\\d*))|((?i)((\\d+|((\\d*\\.\\d+)|(\\d+\\.\\d*)))[eE][+-]?\\d+))/',
- 1 => '/((?i)\\{)|((?i)\\()|((?i)\\[)|((?i)\\/\\*)|((?i)")|((?i)\')|((?i)\\/\\/)|((?i)[a-z_]\\w*)|((?i)0[xX][\\da-f]+)|((?i)\\d\\d*|\\b0\\b)|((?i)0[0-7]+)|((?i)(\\d*\\.\\d+)|(\\d+\\.\\d*))|((?i)((\\d+|((\\d*\\.\\d+)|(\\d+\\.\\d*)))[eE][+-]?\\d+))/',
- 2 => '/((?i)\\{)|((?i)\\()|((?i)\\[)|((?i)\\/\\*)|((?i)")|((?i)\')|((?i)\\/\\/)|((?i)[a-z_]\\w*)|((?i)0[xX][\\da-f]+)|((?i)\\d\\d*|\\b0\\b)|((?i)0[0-7]+)|((?i)(\\d*\\.\\d+)|(\\d+\\.\\d*))|((?i)((\\d+|((\\d*\\.\\d+)|(\\d+\\.\\d*)))[eE][+-]?\\d+))/',
- 3 => '/((?i)\\s@\\w+\\s)|((?i)((https?|ftp):\\/\\/[\\w\\?\\.\\-\\&=\\/%+]+)|(^|[\\s,!?])www\\.\\w+\\.\\w+[\\w\\?\\.\\&=\\/%+]*)|((?i)\\w+[\\.\\w\\-]+@(\\w+[\\.\\w\\-])+)|((?i)\\bnote:)|((?i)\\$\\w+\\s*:.*\\$)/',
- 4 => '/((?i)\\\\[\\\\"\'`tnr\\$\\{])/',
- 5 => '/((?i)\\\\.)/',
- 6 => '/((?i)\\s@\\w+\\s)|((?i)((https?|ftp):\\/\\/[\\w\\?\\.\\-\\&=\\/%+]+)|(^|[\\s,!?])www\\.\\w+\\.\\w+[\\w\\?\\.\\&=\\/%+]*)|((?i)\\w+[\\.\\w\\-]+@(\\w+[\\.\\w\\-])+)|((?i)\\bnote:)|((?i)\\$\\w+\\s*:.*\\$)/',
- );
- $this->_counts = array (
- -1 =>
- array (
- 0 => 0,
- 1 => 0,
- 2 => 0,
- 3 => 0,
- 4 => 0,
- 5 => 0,
- 6 => 0,
- 7 => 0,
- 8 => 0,
- 9 => 0,
- 10 => 0,
- 11 => 2,
- 12 => 5,
- ),
- 0 =>
- array (
- 0 => 0,
- 1 => 0,
- 2 => 0,
- 3 => 0,
- 4 => 0,
- 5 => 0,
- 6 => 0,
- 7 => 0,
- 8 => 0,
- 9 => 0,
- 10 => 0,
- 11 => 2,
- 12 => 5,
- ),
- 1 =>
- array (
- 0 => 0,
- 1 => 0,
- 2 => 0,
- 3 => 0,
- 4 => 0,
- 5 => 0,
- 6 => 0,
- 7 => 0,
- 8 => 0,
- 9 => 0,
- 10 => 0,
- 11 => 2,
- 12 => 5,
- ),
- 2 =>
- array (
- 0 => 0,
- 1 => 0,
- 2 => 0,
- 3 => 0,
- 4 => 0,
- 5 => 0,
- 6 => 0,
- 7 => 0,
- 8 => 0,
- 9 => 0,
- 10 => 0,
- 11 => 2,
- 12 => 5,
- ),
- 3 =>
- array (
- 0 => 0,
- 1 => 3,
- 2 => 1,
- 3 => 0,
- 4 => 0,
- ),
- 4 =>
- array (
- 0 => 0,
- ),
- 5 =>
- array (
- 0 => 0,
- ),
- 6 =>
- array (
- 0 => 0,
- 1 => 3,
- 2 => 1,
- 3 => 0,
- 4 => 0,
- ),
- );
- $this->_delim = array (
- -1 =>
- array (
- 0 => 'brackets',
- 1 => 'brackets',
- 2 => 'brackets',
- 3 => 'comment',
- 4 => 'quotes',
- 5 => 'quotes',
- 6 => 'comment',
- 7 => '',
- 8 => '',
- 9 => '',
- 10 => '',
- 11 => '',
- 12 => '',
- ),
- 0 =>
- array (
- 0 => 'brackets',
- 1 => 'brackets',
- 2 => 'brackets',
- 3 => 'comment',
- 4 => 'quotes',
- 5 => 'quotes',
- 6 => 'comment',
- 7 => '',
- 8 => '',
- 9 => '',
- 10 => '',
- 11 => '',
- 12 => '',
- ),
- 1 =>
- array (
- 0 => 'brackets',
- 1 => 'brackets',
- 2 => 'brackets',
- 3 => 'comment',
- 4 => 'quotes',
- 5 => 'quotes',
- 6 => 'comment',
- 7 => '',
- 8 => '',
- 9 => '',
- 10 => '',
- 11 => '',
- 12 => '',
- ),
- 2 =>
- array (
- 0 => 'brackets',
- 1 => 'brackets',
- 2 => 'brackets',
- 3 => 'comment',
- 4 => 'quotes',
- 5 => 'quotes',
- 6 => 'comment',
- 7 => '',
- 8 => '',
- 9 => '',
- 10 => '',
- 11 => '',
- 12 => '',
- ),
- 3 =>
- array (
- 0 => '',
- 1 => '',
- 2 => '',
- 3 => '',
- 4 => '',
- ),
- 4 =>
- array (
- 0 => '',
- ),
- 5 =>
- array (
- 0 => '',
- ),
- 6 =>
- array (
- 0 => '',
- 1 => '',
- 2 => '',
- 3 => '',
- 4 => '',
- ),
- );
- $this->_inner = array (
- -1 =>
- array (
- 0 => 'code',
- 1 => 'code',
- 2 => 'code',
- 3 => 'comment',
- 4 => 'string',
- 5 => 'string',
- 6 => 'comment',
- 7 => 'identifier',
- 8 => 'number',
- 9 => 'number',
- 10 => 'number',
- 11 => 'number',
- 12 => 'number',
- ),
- 0 =>
- array (
- 0 => 'code',
- 1 => 'code',
- 2 => 'code',
- 3 => 'comment',
- 4 => 'string',
- 5 => 'string',
- 6 => 'comment',
- 7 => 'identifier',
- 8 => 'number',
- 9 => 'number',
- 10 => 'number',
- 11 => 'number',
- 12 => 'number',
- ),
- 1 =>
- array (
- 0 => 'code',
- 1 => 'code',
- 2 => 'code',
- 3 => 'comment',
- 4 => 'string',
- 5 => 'string',
- 6 => 'comment',
- 7 => 'identifier',
- 8 => 'number',
- 9 => 'number',
- 10 => 'number',
- 11 => 'number',
- 12 => 'number',
- ),
- 2 =>
- array (
- 0 => 'code',
- 1 => 'code',
- 2 => 'code',
- 3 => 'comment',
- 4 => 'string',
- 5 => 'string',
- 6 => 'comment',
- 7 => 'identifier',
- 8 => 'number',
- 9 => 'number',
- 10 => 'number',
- 11 => 'number',
- 12 => 'number',
- ),
- 3 =>
- array (
- 0 => 'inlinedoc',
- 1 => 'url',
- 2 => 'url',
- 3 => 'inlinedoc',
- 4 => 'inlinedoc',
- ),
- 4 =>
- array (
- 0 => 'special',
- ),
- 5 =>
- array (
- 0 => 'special',
- ),
- 6 =>
- array (
- 0 => 'inlinedoc',
- 1 => 'url',
- 2 => 'url',
- 3 => 'inlinedoc',
- 4 => 'inlinedoc',
- ),
- );
- $this->_end = array (
- 0 => '/(?i)\\}/',
- 1 => '/(?i)\\)/',
- 2 => '/(?i)\\]/',
- 3 => '/(?i)\\*\\//',
- 4 => '/(?i)"/',
- 5 => '/(?i)\'/',
- 6 => '/(?mi)$/',
- );
- $this->_states = array (
- -1 =>
- array (
- 0 => 0,
- 1 => 1,
- 2 => 2,
- 3 => 3,
- 4 => 4,
- 5 => 5,
- 6 => 6,
- 7 => -1,
- 8 => -1,
- 9 => -1,
- 10 => -1,
- 11 => -1,
- 12 => -1,
- ),
- 0 =>
- array (
- 0 => 0,
- 1 => 1,
- 2 => 2,
- 3 => 3,
- 4 => 4,
- 5 => 5,
- 6 => 6,
- 7 => -1,
- 8 => -1,
- 9 => -1,
- 10 => -1,
- 11 => -1,
- 12 => -1,
- ),
- 1 =>
- array (
- 0 => 0,
- 1 => 1,
- 2 => 2,
- 3 => 3,
- 4 => 4,
- 5 => 5,
- 6 => 6,
- 7 => -1,
- 8 => -1,
- 9 => -1,
- 10 => -1,
- 11 => -1,
- 12 => -1,
- ),
- 2 =>
- array (
- 0 => 0,
- 1 => 1,
- 2 => 2,
- 3 => 3,
- 4 => 4,
- 5 => 5,
- 6 => 6,
- 7 => -1,
- 8 => -1,
- 9 => -1,
- 10 => -1,
- 11 => -1,
- 12 => -1,
- ),
- 3 =>
- array (
- 0 => -1,
- 1 => -1,
- 2 => -1,
- 3 => -1,
- 4 => -1,
- ),
- 4 =>
- array (
- 0 => -1,
- ),
- 5 =>
- array (
- 0 => -1,
- ),
- 6 =>
- array (
- 0 => -1,
- 1 => -1,
- 2 => -1,
- 3 => -1,
- 4 => -1,
- ),
- );
- $this->_keywords = array (
- -1 =>
- array (
- 0 => -1,
- 1 => -1,
- 2 => -1,
- 3 => -1,
- 4 => -1,
- 5 => -1,
- 6 => -1,
- 7 =>
- array (
- 'types' => '/^(boolean|byte|char|const|double|final|float|int|long|short|static|void)$/',
- 'reserved' => '/^(import|package|abstract|break|case|catch|class|continue|default|do|else|extends|false|finally|for|goto|if|implements|instanceof|interface|native|new|null|private|protected|public|return|super|strictfp|switch|synchronized|this|throws|throw|transient|true|try|volatile|while)$/',
- 'builtin' => '/^(AbstractAction|AbstractBorder|AbstractButton|AbstractCellEditor|AbstractCollection|AbstractColorChooserPanel|AbstractDocument|AbstractInterruptibleChannel|AbstractLayoutCache|AbstractList|AbstractListModel|AbstractMap|AbstractMethodError|AbstractPreferences|AbstractSelectableChannel|AbstractSelectionKey|AbstractSelector|AbstractSequentialList|AbstractSet|AbstractSpinnerModel|AbstractTableModel|AbstractUndoableEdit|AbstractWriter|AccessControlContext|AccessControlException|AccessController|AccessException|Accessible|AccessibleAction|AccessibleBundle|AccessibleComponent|AccessibleContext|AccessibleEditableText|AccessibleExtendedComponent|AccessibleExtendedTable|AccessibleHyperlink|AccessibleHypertext|AccessibleIcon|AccessibleKeyBinding|AccessibleObject|AccessibleRelation|AccessibleRelationSet|AccessibleResourceBundle|AccessibleRole|AccessibleSelection|AccessibleState|AccessibleStateSet|AccessibleTable|AccessibleTableModelChange|AccessibleText|AccessibleValue|AccountExpiredException|Acl|AclEntry|AclNotFoundException|Action|ActionEvent|ActionListener|ActionMap|ActionMapUIResource|Activatable|ActivateFailedException|ActivationDesc|ActivationException|ActivationGroup|ActivationGroup_Stub|ActivationGroupDesc|ActivationGroupID|ActivationID|ActivationInstantiator|ActivationMonitor|ActivationSystem|Activator|ActiveEvent|AdapterActivator|AdapterActivatorOperations|AdapterAlreadyExists|AdapterAlreadyExistsHelper|AdapterInactive|AdapterInactiveHelper|AdapterNonExistent|AdapterNonExistentHelper|AddressHelper|Adjustable|AdjustmentEvent|AdjustmentListener|Adler32|AffineTransform|AffineTransformOp|AlgorithmParameterGenerator|AlgorithmParameterGeneratorSpi|AlgorithmParameters|AlgorithmParameterSpec|AlgorithmParametersSpi|AllPermission|AlphaComposite|AlreadyBound|AlreadyBoundException|AlreadyBoundHelper|AlreadyBoundHolder|AlreadyConnectedException|AncestorEvent|AncestorListener|Annotation|Any|AnyHolder|AnySeqHelper|AnySeqHolder|AppConfigurationEntry|Applet|AppletContext|AppletInitializer|AppletStub|ApplicationException|Arc2D|Area|AreaAveragingScaleFilter|ARG_IN|ARG_INOUT|ARG_OUT|ArithmeticException|Array|ArrayIndexOutOfBoundsException|ArrayList|Arrays|ArrayStoreException|AssertionError|AsyncBoxView|AsynchronousCloseException|Attr|Attribute|AttributedCharacterIterator|AttributedString|AttributeException|AttributeInUseException|AttributeList|AttributeListImpl|AttributeModificationException|Attributes|AttributeSet|AttributeSetUtilities|AttributesImpl|AudioClip|AudioFileFormat|AudioFileReader|AudioFileWriter|AudioFormat|AudioInputStream|AudioPermission|AudioSystem|AuthenticationException|AuthenticationNotSupportedException|Authenticator|AuthPermission|Autoscroll|AWTError|AWTEvent|AWTEventListener|AWTEventListenerProxy|AWTEventMulticaster|AWTException|AWTKeyStroke|AWTPermission|BackingStoreException|BAD_CONTEXT|BAD_INV_ORDER|BAD_OPERATION|BAD_PARAM|BAD_POLICY|BAD_POLICY_TYPE|BAD_POLICY_VALUE|BAD_TYPECODE|BadKind|BadLocationException|BadPaddingException|BandCombineOp|BandedSampleModel|BasicArrowButton|BasicAttribute|BasicAttributes|BasicBorders|BasicButtonListener|BasicButtonUI|BasicCheckBoxMenuItemUI|BasicCheckBoxUI|BasicColorChooserUI|BasicComboBoxEditor|BasicComboBoxRenderer|BasicComboBoxUI|BasicComboPopup|BasicDesktopIconUI|BasicDesktopPaneUI|BasicDirectoryModel|BasicEditorPaneUI|BasicFileChooserUI|BasicFormattedTextFieldUI|BasicGraphicsUtils|BasicHTML|BasicIconFactory|BasicInternalFrameTitlePane|BasicInternalFrameUI|BasicLabelUI|BasicListUI|BasicLookAndFeel|BasicMenuBarUI|BasicMenuItemUI|BasicMenuUI|BasicOptionPaneUI|BasicPanelUI|BasicPasswordFieldUI|BasicPermission|BasicPopupMenuSeparatorUI|BasicPopupMenuUI|BasicProgressBarUI|BasicRadioButtonMenuItemUI|BasicRadioButtonUI|BasicRootPaneUI|BasicScrollBarUI|BasicScrollPaneUI|BasicSeparatorUI|BasicSliderUI|BasicSpinnerUI|BasicSplitPaneDivider|BasicSplitPaneUI|BasicStroke|BasicTabbedPaneUI|BasicTableHeaderUI|BasicTableUI|BasicTextAreaUI|BasicTextFieldUI|BasicTextPaneUI|BasicTextUI|BasicToggleButtonUI|BasicToolBarSeparatorUI|BasicToolBarUI|BasicToolTipUI|BasicTreeUI|BasicViewportUI|BatchUpdateException|BeanContext|BeanContextChild|BeanContextChildComponentProxy|BeanContextChildSupport|BeanContextContainerProxy|BeanContextEvent|BeanContextMembershipEvent|BeanContextMembershipListener|BeanContextProxy|BeanContextServiceAvailableEvent|BeanContextServiceProvider|BeanContextServiceProviderBeanInfo|BeanContextServiceRevokedEvent|BeanContextServiceRevokedListener|BeanContextServices|BeanContextServicesListener|BeanContextServicesSupport|BeanContextSupport|BeanDescriptor|BeanInfo|Beans|BevelBorder|Bidi|BigDecimal|BigInteger|BinaryRefAddr|BindException|Binding|BindingHelper|BindingHolder|BindingIterator|BindingIteratorHelper|BindingIteratorHolder|BindingIteratorOperations|BindingIteratorPOA|BindingListHelper|BindingListHolder|BindingType|BindingTypeHelper|BindingTypeHolder|BitSet|Blob|BlockView|Book|Boolean|BooleanControl|BooleanHolder|BooleanSeqHelper|BooleanSeqHolder|Border|BorderFactory|BorderLayout|BorderUIResource|BoundedRangeModel|Bounds|Box|BoxedValueHelper|BoxLayout|BoxView|BreakIterator|Buffer|BufferCapabilities|BufferedImage|BufferedImageFilter|BufferedImageOp|BufferedInputStream|BufferedOutputStream|BufferedReader|BufferedWriter|BufferOverflowException|BufferStrategy|BufferUnderflowException|Button|ButtonGroup|ButtonModel|ButtonUI|Byte|ByteArrayInputStream|ByteArrayOutputStream|ByteBuffer|ByteChannel|ByteHolder|ByteLookupTable|ByteOrder|Calendar|CallableStatement|Callback|CallbackHandler|CancelablePrintJob|CancelledKeyException|CannotProceed|CannotProceedException|CannotProceedHelper|CannotProceedHolder|CannotRedoException|CannotUndoException|Canvas|CardLayout|Caret|CaretEvent|CaretListener|CDATASection|CellEditor|CellEditorListener|CellRendererPane|Certificate|CertificateEncodingException|CertificateException|CertificateExpiredException|CertificateFactory|CertificateFactorySpi|CertificateNotYetValidException|CertificateParsingException|CertPath|CertPathBuilder|CertPathBuilderException|CertPathBuilderResult|CertPathBuilderSpi|CertPathParameters|CertPathValidator|CertPathValidatorException|CertPathValidatorResult|CertPathValidatorSpi|CertSelector|CertStore|CertStoreException|CertStoreParameters|CertStoreSpi|ChangedCharSetException|ChangeEvent|ChangeListener|Channel|ChannelBinding|Channels|Character|CharacterCodingException|CharacterData|CharacterIterator|CharArrayReader|CharArrayWriter|CharBuffer|CharConversionException|CharHolder|CharSeqHelper|CharSeqHolder|CharSequence|Charset|CharsetDecoder|CharsetEncoder|CharsetProvider|Checkbox|CheckboxGroup|CheckboxMenuItem|CheckedInputStream|CheckedOutputStream|Checksum|Choice|ChoiceCallback|ChoiceFormat|Chromaticity|Cipher|CipherInputStream|CipherOutputStream|CipherSpi|Class|ClassCastException|ClassCircularityError|ClassDesc|ClassFormatError|ClassLoader|ClassNotFoundException|ClientRequestInfo|ClientRequestInfoOperations|ClientRequestInterceptor|ClientRequestInterceptorOperations|Clip|Clipboard|ClipboardOwner|Clob|Cloneable|CloneNotSupportedException|ClosedByInterruptException|ClosedChannelException|ClosedSelectorException|CMMException|Codec|CodecFactory|CodecFactoryHelper|CodecFactoryOperations|CodecOperations|CoderMalfunctionError|CoderResult|CodeSets|CodeSource|CodingErrorAction|CollationElementIterator|CollationKey|Collator|Collection|CollectionCertStoreParameters|Collections|Color|ColorChooserComponentFactory|ColorChooserUI|ColorConvertOp|ColorModel|ColorSelectionModel|ColorSpace|ColorSupported|ColorUIResource|ComboBoxEditor|ComboBoxModel|ComboBoxUI|ComboPopup|COMM_FAILURE|Comment|CommunicationException|Comparable|Comparator|Compiler|CompletionStatus|CompletionStatusHelper|Component|ComponentAdapter|ComponentColorModel|ComponentEvent|ComponentIdHelper|ComponentInputMap|ComponentInputMapUIResource|ComponentListener|ComponentOrientation|ComponentSampleModel|ComponentUI|ComponentView|Composite|CompositeContext|CompositeName|CompositeView|CompoundBorder|CompoundControl|CompoundEdit|CompoundName|Compression|ConcurrentModificationException|Configuration|ConfigurationException|ConfirmationCallback|ConnectException|ConnectIOException|Connection|ConnectionEvent|ConnectionEventListener|ConnectionPendingException|ConnectionPoolDataSource|ConsoleHandler|Constructor|Container|ContainerAdapter|ContainerEvent|ContainerListener|ContainerOrderFocusTraversalPolicy|ContentHandler|ContentHandlerFactory|ContentModel|Context|ContextList|ContextNotEmptyException|ContextualRenderedImageFactory|Control|ControlFactory|ControllerEventListener|ConvolveOp|CookieHolder|Copies|CopiesSupported|CRC32|CredentialExpiredException|CRL|CRLException|CRLSelector|CropImageFilter|CSS|CTX_RESTRICT_SCOPE|CubicCurve2D|Currency|Current|CurrentHelper|CurrentHolder|CurrentOperations|Cursor|Customizer|CustomMarshal|CustomValue|DATA_CONVERSION|DatabaseMetaData|DataBuffer|DataBufferByte|DataBufferDouble|DataBufferFloat|DataBufferInt|DataBufferShort|DataBufferUShort|DataFlavor|DataFormatException|DatagramChannel|DatagramPacket|DatagramSocket|DatagramSocketImpl|DatagramSocketImplFactory|DataInput|DataInputStream|DataLine|DataOutput|DataOutputStream|DataSource|DataTruncation|Date|DateFormat|DateFormatSymbols|DateFormatter|DateTimeAtCompleted|DateTimeAtCreation|DateTimeAtProcessing|DateTimeSyntax|DebugGraphics|DecimalFormat|DecimalFormatSymbols|DeclHandler|DefaultBoundedRangeModel|DefaultButtonModel|DefaultCaret|DefaultCellEditor|DefaultColorSelectionModel|DefaultComboBoxModel|DefaultDesktopManager|DefaultEditorKit|DefaultFocusManager|DefaultFocusTraversalPolicy|DefaultFormatter|DefaultFormatterFactory|DefaultHandler|DefaultHighlighter|DefaultKeyboardFocusManager|DefaultListCellRenderer|DefaultListModel|DefaultListSelectionModel|DefaultMenuLayout|DefaultMetalTheme|DefaultMutableTreeNode|DefaultPersistenceDelegate|DefaultSingleSelectionModel|DefaultStyledDocument|DefaultTableCellRenderer|DefaultTableColumnModel|DefaultTableModel|DefaultTextUI|DefaultTreeCellEditor|DefaultTreeCellRenderer|DefaultTreeModel|DefaultTreeSelectionModel|DefinitionKind|DefinitionKindHelper|Deflater|DeflaterOutputStream|Delegate|DelegationPermission|DESedeKeySpec|DesignMode|DESKeySpec|DesktopIconUI|DesktopManager|DesktopPaneUI|Destination|Destroyable|DestroyFailedException|DGC|DHGenParameterSpec|DHKey|DHParameterSpec|DHPrivateKey|DHPrivateKeySpec|DHPublicKey|DHPublicKeySpec|Dialog|Dictionary|DigestException|DigestInputStream|DigestOutputStream|Dimension|Dimension2D|DimensionUIResource|DirContext|DirectColorModel|DirectoryManager|DirObjectFactory|DirStateFactory|DisplayMode|DnDConstants|Doc|DocAttribute|DocAttributeSet|DocFlavor|DocPrintJob|Document|DocumentBuilder|DocumentBuilderFactory|DocumentEvent|DocumentFilter|DocumentFragment|DocumentHandler|DocumentListener|DocumentName|DocumentParser|DocumentType|DomainCombiner|DomainManager|DomainManagerOperations|DOMException|DOMImplementation|DOMLocator|DOMResult|DOMSource|Double|DoubleBuffer|DoubleHolder|DoubleSeqHelper|DoubleSeqHolder|DragGestureEvent|DragGestureListener|DragGestureRecognizer|DragSource|DragSourceAdapter|DragSourceContext|DragSourceDragEvent|DragSourceDropEvent|DragSourceEvent|DragSourceListener|DragSourceMotionListener|Driver|DriverManager|DriverPropertyInfo|DropTarget|DropTargetAdapter|DropTargetContext|DropTargetDragEvent|DropTargetDropEvent|DropTargetEvent|DropTargetListener|DSAKey|DSAKeyPairGenerator|DSAParameterSpec|DSAParams|DSAPrivateKey|DSAPrivateKeySpec|DSAPublicKey|DSAPublicKeySpec|DTD|DTDConstants|DTDHandler|DuplicateName|DuplicateNameHelper|DynamicImplementation|DynAny|DynAnyFactory|DynAnyFactoryHelper|DynAnyFactoryOperations|DynAnyHelper|DynAnyOperations|DynAnySeqHelper|DynArray|DynArrayHelper|DynArrayOperations|DynEnum|DynEnumHelper|DynEnumOperations|DynFixed|DynFixedHelper|DynFixedOperations|DynSequence|DynSequenceHelper|DynSequenceOperations|DynStruct|DynStructHelper|DynStructOperations|DynUnion|DynUnionHelper|DynUnionOperations|DynValue|DynValueBox|DynValueBoxOperations|DynValueCommon|DynValueCommonOperations|DynValueHelper|DynValueOperations|EditorKit|Element|ElementIterator|Ellipse2D|EmptyBorder|EmptyStackException|EncodedKeySpec|Encoder|Encoding|ENCODING_CDR_ENCAPS|EncryptedPrivateKeyInfo|Entity|EntityReference|EntityResolver|EnumControl|Enumeration|EnumSyntax|Environment|EOFException|Error|ErrorHandler|ErrorListener|ErrorManager|EtchedBorder|Event|EventContext|EventDirContext|EventHandler|EventListener|EventListenerList|EventListenerProxy|EventObject|EventQueue|EventSetDescriptor|Exception|ExceptionInInitializerError|ExceptionList|ExceptionListener|ExemptionMechanism|ExemptionMechanismException|ExemptionMechanismSpi|ExpandVetoException|ExportException|Expression|ExtendedRequest|ExtendedResponse|Externalizable|FactoryConfigurationError|FailedLoginException|FeatureDescriptor|Fidelity|Field|FieldNameHelper|FieldPosition|FieldView|File|FileCacheImageInputStream|FileCacheImageOutputStream|FileChannel|FileChooserUI|FileDescriptor|FileDialog|FileFilter|FileHandler|FileImageInputStream|FileImageOutputStream|FileInputStream|FileLock|FileLockInterruptionException|FilenameFilter|FileNameMap|FileNotFoundException|FileOutputStream|FilePermission|FileReader|FileSystemView|FileView|FileWriter|Filter|FilteredImageSource|FilterInputStream|FilterOutputStream|FilterReader|FilterWriter|Finishings|FixedHeightLayoutCache|FixedHolder|FlatteningPathIterator|FlavorException|FlavorMap|FlavorTable|Float|FloatBuffer|FloatControl|FloatHolder|FloatSeqHelper|FloatSeqHolder|FlowLayout|FlowView|FocusAdapter|FocusEvent|FocusListener|FocusManager|FocusTraversalPolicy|Font|FontFormatException|FontMetrics|FontRenderContext|FontUIResource|Format|FormatConversionProvider|FormatMismatch|FormatMismatchHelper|Formatter|FormView|ForwardRequest|ForwardRequestHelper|Frame|FREE_MEM|GapContent|GatheringByteChannel|GeneralPath|GeneralSecurityException|GlyphJustificationInfo|GlyphMetrics|GlyphVector|GlyphView|GradientPaint|GraphicAttribute|Graphics|Graphics2D|GraphicsConfigTemplate|GraphicsConfiguration|GraphicsDevice|GraphicsEnvironment|GrayFilter|GregorianCalendar|GridBagConstraints|GridBagLayout|GridLayout|Group|GSSContext|GSSCredential|GSSException|GSSManager|GSSName|Guard|GuardedObject|GZIPInputStream|GZIPOutputStream|Handler|HandlerBase|HandshakeCompletedEvent|HandshakeCompletedListener|HasControls|HashAttributeSet|HashDocAttributeSet|HashMap|HashPrintJobAttributeSet|HashPrintRequestAttributeSet|HashPrintServiceAttributeSet|HashSet|Hashtable|HeadlessException|HierarchyBoundsAdapter|HierarchyBoundsListener|HierarchyEvent|HierarchyListener|Highlighter|HostnameVerifier|HTML|HTMLDocument|HTMLEditorKit|HTMLFrameHyperlinkEvent|HTMLWriter|HttpsURLConnection|HttpURLConnection|HyperlinkEvent|HyperlinkListener|ICC_ColorSpace|ICC_Profile|ICC_ProfileGray|ICC_ProfileRGB|Icon|IconUIResource|IconView|ID_ASSIGNMENT_POLICY_ID|ID_UNIQUENESS_POLICY_ID|IdAssignmentPolicy|IdAssignmentPolicyOperations|IdAssignmentPolicyValue|IdentifierHelper|Identity|IdentityHashMap|IdentityScope|IDLEntity|IDLType|IDLTypeHelper|IDLTypeOperations|IdUniquenessPolicy|IdUniquenessPolicyOperations|IdUniquenessPolicyValue|IIOByteBuffer|IIOException|IIOImage|IIOInvalidTreeException|IIOMetadata|IIOMetadataController|IIOMetadataFormat|IIOMetadataFormatImpl|IIOMetadataNode|IIOParam|IIOParamController|IIOReadProgressListener|IIOReadUpdateListener|IIOReadWarningListener|IIORegistry|IIOServiceProvider|IIOWriteProgressListener|IIOWriteWarningListener|IllegalAccessError|IllegalAccessException|IllegalArgumentException|IllegalBlockingModeException|IllegalBlockSizeException|IllegalCharsetNameException|IllegalComponentStateException|IllegalMonitorStateException|IllegalPathStateException|IllegalSelectorException|IllegalStateException|IllegalThreadStateException|Image|ImageCapabilities|ImageConsumer|ImageFilter|ImageGraphicAttribute|ImageIcon|ImageInputStream|ImageInputStreamImpl|ImageInputStreamSpi|ImageIO|ImageObserver|ImageOutputStream|ImageOutputStreamImpl|ImageOutputStreamSpi|ImageProducer|ImageReader|ImageReaderSpi|ImageReaderWriterSpi|ImageReadParam|ImageTranscoder|ImageTranscoderSpi|ImageTypeSpecifier|ImageView|ImageWriteParam|ImageWriter|ImageWriterSpi|ImagingOpException|IMP_LIMIT|IMPLICIT_ACTIVATION_POLICY_ID|ImplicitActivationPolicy|ImplicitActivationPolicyOperations|ImplicitActivationPolicyValue|IncompatibleClassChangeError|InconsistentTypeCode|InconsistentTypeCodeHelper|IndexColorModel|IndexedPropertyDescriptor|IndexOutOfBoundsException|IndirectionException|Inet4Address|Inet6Address|InetAddress|InetSocketAddress|Inflater|InflaterInputStream|InheritableThreadLocal|InitialContext|InitialContextFactory|InitialContextFactoryBuilder|InitialDirContext|INITIALIZE|InitialLdapContext|InlineView|InputContext|InputEvent|InputMap|InputMapUIResource|InputMethod|InputMethodContext|InputMethodDescriptor|InputMethodEvent|InputMethodHighlight|InputMethodListener|InputMethodRequests|InputSource|InputStream|InputStreamReader|InputSubset|InputVerifier|Insets|InsetsUIResource|InstantiationError|InstantiationException|Instrument|InsufficientResourcesException|IntBuffer|Integer|IntegerSyntax|Interceptor|InterceptorOperations|INTERNAL|InternalError|InternalFrameAdapter|InternalFrameEvent|InternalFrameFocusTraversalPolicy|InternalFrameListener|InternalFrameUI|InternationalFormatter|InterruptedException|InterruptedIOException|InterruptedNamingException|InterruptibleChannel|INTF_REPOS|IntHolder|IntrospectionException|Introspector|INV_FLAG|INV_IDENT|INV_OBJREF|INV_POLICY|Invalid|INVALID_TRANSACTION|InvalidAddress|InvalidAddressHelper|InvalidAddressHolder|InvalidAlgorithmParameterException|InvalidAttributeIdentifierException|InvalidAttributesException|InvalidAttributeValueException|InvalidClassException|InvalidDnDOperationException|InvalidKeyException|InvalidKeySpecException|InvalidMarkException|InvalidMidiDataException|InvalidName|InvalidNameException|InvalidNameHelper|InvalidNameHolder|InvalidObjectException|InvalidParameterException|InvalidParameterSpecException|InvalidPolicy|InvalidPolicyHelper|InvalidPreferencesFormatException|InvalidSearchControlsException|InvalidSearchFilterException|InvalidSeq|InvalidSlot|InvalidSlotHelper|InvalidTransactionException|InvalidTypeForEncoding|InvalidTypeForEncodingHelper|InvalidValue|InvalidValueHelper|InvocationEvent|InvocationHandler|InvocationTargetException|InvokeHandler|IOException|IOR|IORHelper|IORHolder|IORInfo|IORInfoOperations|IORInterceptor|IORInterceptorOperations|IRObject|IRObjectOperations|IstringHelper|ItemEvent|ItemListener|ItemSelectable|Iterator|IvParameterSpec|JApplet|JarEntry|JarException|JarFile|JarInputStream|JarOutputStream|JarURLConnection|JButton|JCheckBox|JCheckBoxMenuItem|JColorChooser|JComboBox|JComponent|JDesktopPane|JDialog|JEditorPane|JFileChooser|JFormattedTextField|JFrame|JInternalFrame|JLabel|JLayeredPane|JList|JMenu|JMenuBar|JMenuItem|JobAttributes|JobHoldUntil|JobImpressions|JobImpressionsCompleted|JobImpressionsSupported|JobKOctets|JobKOctetsProcessed|JobKOctetsSupported|JobMediaSheets|JobMediaSheetsCompleted|JobMediaSheetsSupported|JobMessageFromOperator|JobName|JobOriginatingUserName|JobPriority|JobPrioritySupported|JobSheets|JobState|JobStateReason|JobStateReasons|JOptionPane|JPanel|JPasswordField|JPEGHuffmanTable|JPEGImageReadParam|JPEGImageWriteParam|JPEGQTable|JPopupMenu|JProgressBar|JRadioButton|JRadioButtonMenuItem|JRootPane|JScrollBar|JScrollPane|JSeparator|JSlider|JSpinner|JSplitPane|JTabbedPane|JTable|JTableHeader|JTextArea|JTextComponent|JTextField|JTextPane|JToggleButton|JToolBar|JToolTip|JTree|JViewport|JWindow|KerberosKey|KerberosPrincipal|KerberosTicket|Kernel|Key|KeyAdapter|KeyAgreement|KeyAgreementSpi|KeyboardFocusManager|KeyEvent|KeyEventDispatcher|KeyEventPostProcessor|KeyException|KeyFactory|KeyFactorySpi|KeyGenerator|KeyGeneratorSpi|KeyListener|KeyManagementException|KeyManager|KeyManagerFactory|KeyManagerFactorySpi|Keymap|KeyPair|KeyPairGenerator|KeyPairGeneratorSpi|KeySpec|KeyStore|KeyStoreException|KeyStoreSpi|KeyStroke|Label|LabelUI|LabelView|LanguageCallback|LastOwnerException|LayeredHighlighter|LayoutFocusTraversalPolicy|LayoutManager|LayoutManager2|LayoutQueue|LDAPCertStoreParameters|LdapContext|LdapReferralException|Lease|Level|LexicalHandler|LIFESPAN_POLICY_ID|LifespanPolicy|LifespanPolicyOperations|LifespanPolicyValue|LimitExceededException|Line|Line2D|LineBorder|LineBreakMeasurer|LineEvent|LineListener|LineMetrics|LineNumberInputStream|LineNumberReader|LineUnavailableException|LinkageError|LinkedHashMap|LinkedHashSet|LinkedList|LinkException|LinkLoopException|LinkRef|List|ListCellRenderer|ListDataEvent|ListDataListener|ListIterator|ListModel|ListResourceBundle|ListSelectionEvent|ListSelectionListener|ListSelectionModel|ListUI|ListView|LoaderHandler|Locale|LocalObject|LocateRegistry|LOCATION_FORWARD|Locator|LocatorImpl|Logger|LoggingPermission|LoginContext|LoginException|LoginModule|LogManager|LogRecord|LogStream|Long|LongBuffer|LongHolder|LongLongSeqHelper|LongLongSeqHolder|LongSeqHelper|LongSeqHolder|LookAndFeel|LookupOp|LookupTable|Mac|MacSpi|MalformedInputException|MalformedLinkException|MalformedURLException|ManagerFactoryParameters|Manifest|Map|MappedByteBuffer|MARSHAL|MarshalException|MarshalledObject|MaskFormatter|Matcher|Math|MatteBorder|Media|MediaName|MediaPrintableArea|MediaSize|MediaSizeName|MediaTracker|MediaTray|Member|MemoryCacheImageInputStream|MemoryCacheImageOutputStream|MemoryHandler|MemoryImageSource|Menu|MenuBar|MenuBarUI|MenuComponent|MenuContainer|MenuDragMouseEvent|MenuDragMouseListener|MenuElement|MenuEvent|MenuItem|MenuItemUI|MenuKeyEvent|MenuKeyListener|MenuListener|MenuSelectionManager|MenuShortcut|MessageDigest|MessageDigestSpi|MessageFormat|MessageProp|MetaEventListener|MetalBorders|MetalButtonUI|MetalCheckBoxIcon|MetalCheckBoxUI|MetalComboBoxButton|MetalComboBoxEditor|MetalComboBoxIcon|MetalComboBoxUI|MetalDesktopIconUI|MetalFileChooserUI|MetalIconFactory|MetalInternalFrameTitlePane|MetalInternalFrameUI|MetalLabelUI|MetalLookAndFeel|MetalPopupMenuSeparatorUI|MetalProgressBarUI|MetalRadioButtonUI|MetalRootPaneUI|MetalScrollBarUI|MetalScrollButton|MetalScrollPaneUI|MetalSeparatorUI|MetalSliderUI|MetalSplitPaneUI|MetalTabbedPaneUI|MetalTextFieldUI|MetalTheme|MetalToggleButtonUI|MetalToolBarUI|MetalToolTipUI|MetalTreeUI|MetaMessage|Method|MethodDescriptor|MidiChannel|MidiDevice|MidiDeviceProvider|MidiEvent|MidiFileFormat|MidiFileReader|MidiFileWriter|MidiMessage|MidiSystem|MidiUnavailableException|MimeTypeParseException|MinimalHTMLWriter|MissingResourceException|Mixer|MixerProvider|ModificationItem|Modifier|MouseAdapter|MouseDragGestureRecognizer|MouseEvent|MouseInputAdapter|MouseInputListener|MouseListener|MouseMotionAdapter|MouseMotionListener|MouseWheelEvent|MouseWheelListener|MultiButtonUI|MulticastSocket|MultiColorChooserUI|MultiComboBoxUI|MultiDesktopIconUI|MultiDesktopPaneUI|MultiDoc|MultiDocPrintJob|MultiDocPrintService|MultiFileChooserUI|MultiInternalFrameUI|MultiLabelUI|MultiListUI|MultiLookAndFeel|MultiMenuBarUI|MultiMenuItemUI|MultiOptionPaneUI|MultiPanelUI|MultiPixelPackedSampleModel|MultipleComponentProfileHelper|MultipleComponentProfileHolder|MultipleDocumentHandling|MultipleMaster|MultiPopupMenuUI|MultiProgressBarUI|MultiRootPaneUI|MultiScrollBarUI|MultiScrollPaneUI|MultiSeparatorUI|MultiSliderUI|MultiSpinnerUI|MultiSplitPaneUI|MultiTabbedPaneUI|MultiTableHeaderUI|MultiTableUI|MultiTextUI|MultiToolBarUI|MultiToolTipUI|MultiTreeUI|MultiViewportUI|MutableAttributeSet|MutableComboBoxModel|MutableTreeNode|Name|NameAlreadyBoundException|NameCallback|NameClassPair|NameComponent|NameComponentHelper|NameComponentHolder|NamedNodeMap|NamedValue|NameDynAnyPair|NameDynAnyPairHelper|NameDynAnyPairSeqHelper|NameHelper|NameHolder|NameNotFoundException|NameParser|NamespaceChangeListener|NamespaceSupport|NameValuePair|NameValuePairHelper|NameValuePairSeqHelper|Naming|NamingContext|NamingContextExt|NamingContextExtHelper|NamingContextExtHolder|NamingContextExtOperations|NamingContextExtPOA|NamingContextHelper|NamingContextHolder|NamingContextOperations|NamingContextPOA|NamingEnumeration|NamingEvent|NamingException|NamingExceptionEvent|NamingListener|NamingManager|NamingSecurityException|NavigationFilter|NegativeArraySizeException|NetPermission|NetworkInterface|NO_IMPLEMENT|NO_MEMORY|NO_PERMISSION|NO_RESOURCES|NO_RESPONSE|NoClassDefFoundError|NoConnectionPendingException|NoContext|NoContextHelper|Node|NodeChangeEvent|NodeChangeListener|NodeList|NoInitialContextException|NoninvertibleTransformException|NonReadableChannelException|NonWritableChannelException|NoPermissionException|NoRouteToHostException|NoServant|NoServantHelper|NoSuchAlgorithmException|NoSuchAttributeException|NoSuchElementException|NoSuchFieldError|NoSuchFieldException|NoSuchMethodError|NoSuchMethodException|NoSuchObjectException|NoSuchPaddingException|NoSuchProviderException|NotActiveException|Notation|NotBoundException|NotContextException|NotEmpty|NotEmptyHelper|NotEmptyHolder|NotFound|NotFoundHelper|NotFoundHolder|NotFoundReason|NotFoundReasonHelper|NotFoundReasonHolder|NotOwnerException|NotSerializableException|NotYetBoundException|NotYetConnectedException|NullCipher|NullPointerException|Number|NumberFormat|NumberFormatException|NumberFormatter|NumberOfDocuments|NumberOfInterveningJobs|NumberUp|NumberUpSupported|NumericShaper|NVList|OBJ_ADAPTER|Object|OBJECT_NOT_EXIST|ObjectAlreadyActive|ObjectAlreadyActiveHelper|ObjectChangeListener|ObjectFactory|ObjectFactoryBuilder|ObjectHelper|ObjectHolder|ObjectIdHelper|ObjectImpl|ObjectInput|ObjectInputStream|ObjectInputValidation|ObjectNotActive|ObjectNotActiveHelper|ObjectOutput|ObjectOutputStream|ObjectStreamClass|ObjectStreamConstants|ObjectStreamException|ObjectStreamField|ObjectView|ObjID|Observable|Observer|OctetSeqHelper|OctetSeqHolder|Oid|OMGVMCID|OpenType|Operation|OperationNotSupportedException|Option|OptionalDataException|OptionPaneUI|ORB|ORBInitializer|ORBInitializerOperations|ORBInitInfo|ORBInitInfoOperations|OrientationRequested|OutOfMemoryError|OutputDeviceAssigned|OutputKeys|OutputStream|OutputStreamWriter|OverlappingFileLockException|OverlayLayout|Owner|Package|PackedColorModel|Pageable|PageAttributes|PageFormat|PageRanges|PagesPerMinute|PagesPerMinuteColor|Paint|PaintContext|PaintEvent|Panel|PanelUI|Paper|ParagraphView|Parameter|ParameterBlock|ParameterDescriptor|ParameterMetaData|ParameterMode|ParameterModeHelper|ParameterModeHolder|ParseException|ParsePosition|Parser|ParserAdapter|ParserConfigurationException|ParserDelegator|ParserFactory|PartialResultException|PasswordAuthentication|PasswordCallback|PasswordView|Patch|PathIterator|Pattern|PatternSyntaxException|PBEKey|PBEKeySpec|PBEParameterSpec|PDLOverrideSupported|Permission|PermissionCollection|Permissions|PERSIST_STORE|PersistenceDelegate|PhantomReference|Pipe|PipedInputStream|PipedOutputStream|PipedReader|PipedWriter|PixelGrabber|PixelInterleavedSampleModel|PKCS8EncodedKeySpec|PKIXBuilderParameters|PKIXCertPathBuilderResult|PKIXCertPathChecker|PKIXCertPathValidatorResult|PKIXParameters|PlainDocument|PlainView|POA|POAHelper|POAManager|POAManagerOperations|POAOperations|Point|Point2D|Policy|PolicyError|PolicyErrorCodeHelper|PolicyErrorHelper|PolicyErrorHolder|PolicyFactory|PolicyFactoryOperations|PolicyHelper|PolicyHolder|PolicyListHelper|PolicyListHolder|PolicyNode|PolicyOperations|PolicyQualifierInfo|PolicyTypeHelper|Polygon|PooledConnection|Popup|PopupFactory|PopupMenu|PopupMenuEvent|PopupMenuListener|PopupMenuUI|Port|PortableRemoteObject|PortableRemoteObjectDelegate|PortUnreachableException|Position|PreferenceChangeEvent|PreferenceChangeListener|Preferences|PreferencesFactory|PreparedStatement|PresentationDirection|Principal|PrincipalHolder|Printable|PrinterAbortException|PrinterException|PrinterGraphics|PrinterInfo|PrinterIOException|PrinterIsAcceptingJobs|PrinterJob|PrinterLocation|PrinterMakeAndModel|PrinterMessageFromOperator|PrinterMoreInfo|PrinterMoreInfoManufacturer|PrinterName|PrinterResolution|PrinterState|PrinterStateReason|PrinterStateReasons|PrinterURI|PrintEvent|PrintException|PrintGraphics|PrintJob|PrintJobAdapter|PrintJobAttribute|PrintJobAttributeEvent|PrintJobAttributeListener|PrintJobAttributeSet|PrintJobEvent|PrintJobListener|PrintQuality|PrintRequestAttribute|PrintRequestAttributeSet|PrintService|PrintServiceAttribute|PrintServiceAttributeEvent|PrintServiceAttributeListener|PrintServiceAttributeSet|PrintServiceLookup|PrintStream|PrintWriter|PRIVATE_MEMBER|PrivateCredentialPermission|PrivateKey|PrivilegedAction|PrivilegedActionException|PrivilegedExceptionAction|Process|ProcessingInstruction|ProfileDataException|ProfileIdHelper|ProgressBarUI|ProgressMonitor|ProgressMonitorInputStream|Properties|PropertyChangeEvent|PropertyChangeListener|PropertyChangeListenerProxy|PropertyChangeSupport|PropertyDescriptor|PropertyEditor|PropertyEditorManager|PropertyEditorSupport|PropertyPermission|PropertyResourceBundle|PropertyVetoException|ProtectionDomain|ProtocolException|Provider|ProviderException|Proxy|PSSParameterSpec|PUBLIC_MEMBER|PublicKey|PushbackInputStream|PushbackReader|QuadCurve2D|QueuedJobCount|Random|RandomAccess|RandomAccessFile|Raster|RasterFormatException|RasterOp|RC2ParameterSpec|RC5ParameterSpec|ReadableByteChannel|Reader|ReadOnlyBufferException|Receiver|Rectangle|Rectangle2D|RectangularShape|Ref|RefAddr|Reference|Referenceable|ReferenceQueue|ReferenceUriSchemesSupported|ReferralException|ReflectPermission|Refreshable|RefreshFailedException|RegisterableService|Registry|RegistryHandler|RemarshalException|Remote|RemoteCall|RemoteException|RemoteObject|RemoteRef|RemoteServer|RemoteStub|RenderableImage|RenderableImageOp|RenderableImageProducer|RenderContext|RenderedImage|RenderedImageFactory|Renderer|RenderingHints|RepaintManager|ReplicateScaleFilter|RepositoryIdHelper|Request|REQUEST_PROCESSING_POLICY_ID|RequestInfo|RequestInfoOperations|RequestingUserName|RequestProcessingPolicy|RequestProcessingPolicyOperations|RequestProcessingPolicyValue|RescaleOp|ResolutionSyntax|Resolver|ResolveResult|ResourceBundle|ResponseHandler|Result|ResultSet|ResultSetMetaData|ReverbType|RGBImageFilter|RMIClassLoader|RMIClassLoaderSpi|RMIClientSocketFactory|RMIFailureHandler|RMISecurityException|RMISecurityManager|RMIServerSocketFactory|RMISocketFactory|Robot|RootPaneContainer|RootPaneUI|RoundRectangle2D|RowMapper|RowSet|RowSetEvent|RowSetInternal|RowSetListener|RowSetMetaData|RowSetReader|RowSetWriter|RSAKey|RSAKeyGenParameterSpec|RSAMultiPrimePrivateCrtKey|RSAMultiPrimePrivateCrtKeySpec|RSAOtherPrimeInfo|RSAPrivateCrtKey|RSAPrivateCrtKeySpec|RSAPrivateKey|RSAPrivateKeySpec|RSAPublicKey|RSAPublicKeySpec|RTFEditorKit|RuleBasedCollator|Runnable|Runtime|RunTime|RuntimeException|RunTimeOperations|RuntimePermission|SampleModel|Savepoint|SAXException|SAXNotRecognizedException|SAXNotSupportedException|SAXParseException|SAXParser|SAXParserFactory|SAXResult|SAXSource|SAXTransformerFactory|ScatteringByteChannel|SchemaViolationException|Scrollable|Scrollbar|ScrollBarUI|ScrollPane|ScrollPaneAdjustable|ScrollPaneConstants|ScrollPaneLayout|ScrollPaneUI|SealedObject|SearchControls|SearchResult|SecretKey|SecretKeyFactory|SecretKeyFactorySpi|SecretKeySpec|SecureClassLoader|SecureRandom|SecureRandomSpi|Security|SecurityException|SecurityManager|SecurityPermission|Segment|SelectableChannel|SelectionKey|Selector|SelectorProvider|SeparatorUI|Sequence|SequenceInputStream|Sequencer|Serializable|SerializablePermission|Servant|SERVANT_RETENTION_POLICY_ID|ServantActivator|ServantActivatorHelper|ServantActivatorOperations|ServantActivatorPOA|ServantAlreadyActive|ServantAlreadyActiveHelper|ServantLocator|ServantLocatorHelper|ServantLocatorOperations|ServantLocatorPOA|ServantManager|ServantManagerOperations|ServantNotActive|ServantNotActiveHelper|ServantObject|ServantRetentionPolicy|ServantRetentionPolicyOperations|ServantRetentionPolicyValue|ServerCloneException|ServerError|ServerException|ServerNotActiveException|ServerRef|ServerRequest|ServerRequestInfo|ServerRequestInfoOperations|ServerRequestInterceptor|ServerRequestInterceptorOperations|ServerRuntimeException|ServerSocket|ServerSocketChannel|ServerSocketFactory|ServiceContext|ServiceContextHelper|ServiceContextHolder|ServiceContextListHelper|ServiceContextListHolder|ServiceDetail|ServiceDetailHelper|ServiceIdHelper|ServiceInformation|ServiceInformationHelper|ServiceInformationHolder|ServicePermission|ServiceRegistry|ServiceUI|ServiceUIFactory|ServiceUnavailableException|Set|SetOfIntegerSyntax|SetOverrideType|SetOverrideTypeHelper|Severity|Shape|ShapeGraphicAttribute|SheetCollate|Short|ShortBuffer|ShortBufferException|ShortHolder|ShortLookupTable|ShortMessage|ShortSeqHelper|ShortSeqHolder|Sides|Signature|SignatureException|SignatureSpi|SignedObject|Signer|SimpleAttributeSet|SimpleBeanInfo|SimpleDateFormat|SimpleDoc|SimpleFormatter|SimpleTimeZone|SinglePixelPackedSampleModel|SingleSelectionModel|Size2DSyntax|SizeLimitExceededException|SizeRequirements|SizeSequence|Skeleton|SkeletonMismatchException|SkeletonNotFoundException|SliderUI|Socket|SocketAddress|SocketChannel|SocketException|SocketFactory|SocketHandler|SocketImpl|SocketImplFactory|SocketOptions|SocketPermission|SocketSecurityException|SocketTimeoutException|SoftBevelBorder|SoftReference|SortedMap|SortedSet|SortingFocusTraversalPolicy|Soundbank|SoundbankReader|SoundbankResource|Source|SourceDataLine|SourceLocator|SpinnerDateModel|SpinnerListModel|SpinnerModel|SpinnerNumberModel|SpinnerUI|SplitPaneUI|Spring|SpringLayout|SQLData|SQLException|SQLInput|SQLOutput|SQLPermission|SQLWarning|SSLContext|SSLContextSpi|SSLException|SSLHandshakeException|SSLKeyException|SSLPeerUnverifiedException|SSLPermission|SSLProtocolException|SSLServerSocket|SSLServerSocketFactory|SSLSession|SSLSessionBindingEvent|SSLSessionBindingListener|SSLSessionContext|SSLSocket|SSLSocketFactory|Stack|StackOverflowError|StackTraceElement|StartTlsRequest|StartTlsResponse|State|StateEdit|StateEditable|StateFactory|Statement|Streamable|StreamableValue|StreamCorruptedException|StreamHandler|StreamPrintService|StreamPrintServiceFactory|StreamResult|StreamSource|StreamTokenizer|StrictMath|String|StringBuffer|StringBufferInputStream|StringCharacterIterator|StringContent|StringHolder|StringIndexOutOfBoundsException|StringNameHelper|StringReader|StringRefAddr|StringSelection|StringSeqHelper|StringSeqHolder|StringTokenizer|StringValueHelper|StringWriter|Stroke|Struct|StructMember|StructMemberHelper|Stub|StubDelegate|StubNotFoundException|Style|StyleConstants|StyleContext|StyledDocument|StyledEditorKit|StyleSheet|Subject|SubjectDomainCombiner|SUCCESSFUL|SupportedValuesAttribute|SwingConstants|SwingPropertyChangeSupport|SwingUtilities|SYNC_WITH_TRANSPORT|SyncFailedException|SyncScopeHelper|Synthesizer|SysexMessage|System|SYSTEM_EXCEPTION|SystemColor|SystemException|SystemFlavorMap|TabableView|TabbedPaneUI|TabExpander|TableCellEditor|TableCellRenderer|TableColumn|TableColumnModel|TableColumnModelEvent|TableColumnModelListener|TableHeaderUI|TableModel|TableModelEvent|TableModelListener|TableUI|TableView|TabSet|TabStop|TAG_ALTERNATE_IIOP_ADDRESS|TAG_CODE_SETS|TAG_INTERNET_IOP|TAG_JAVA_CODEBASE|TAG_MULTIPLE_COMPONENTS|TAG_ORB_TYPE|TAG_POLICIES|TagElement|TaggedComponent|TaggedComponentHelper|TaggedComponentHolder|TaggedProfile|TaggedProfileHelper|TaggedProfileHolder|TargetDataLine|TCKind|Templates|TemplatesHandler|Text|TextAction|TextArea|TextAttribute|TextComponent|TextEvent|TextField|TextHitInfo|TextInputCallback|TextLayout|TextListener|TextMeasurer|TextOutputCallback|TextSyntax|TextUI|TexturePaint|Thread|THREAD_POLICY_ID|ThreadDeath|ThreadGroup|ThreadLocal|ThreadPolicy|ThreadPolicyOperations|ThreadPolicyValue|Throwable|Tie|TileObserver|Time|TimeLimitExceededException|Timer|TimerTask|Timestamp|TimeZone|TitledBorder|ToolBarUI|Toolkit|ToolTipManager|ToolTipUI|TooManyListenersException|Track|TRANSACTION_REQUIRED|TRANSACTION_ROLLEDBACK|TransactionRequiredException|TransactionRolledbackException|TransactionService|Transferable|TransferHandler|TransformAttribute|Transformer|TransformerConfigurationException|TransformerException|TransformerFactory|TransformerFactoryConfigurationError|TransformerHandler|TRANSIENT|Transmitter|Transparency|TRANSPORT_RETRY|TreeCellEditor|TreeCellRenderer|TreeExpansionEvent|TreeExpansionListener|TreeMap|TreeModel|TreeModelEvent|TreeModelListener|TreeNode|TreePath|TreeSelectionEvent|TreeSelectionListener|TreeSelectionModel|TreeSet|TreeUI|TreeWillExpandListener|TrustAnchor|TrustManager|TrustManagerFactory|TrustManagerFactorySpi|TypeCode|TypeCodeHolder|TypeMismatch|TypeMismatchHelper|Types|UID|UIDefaults|UIManager|UIResource|ULongLongSeqHelper|ULongLongSeqHolder|ULongSeqHelper|ULongSeqHolder|UndeclaredThrowableException|UndoableEdit|UndoableEditEvent|UndoableEditListener|UndoableEditSupport|UndoManager|UnexpectedException|UnicastRemoteObject|UnionMember|UnionMemberHelper|UNKNOWN|UnknownEncoding|UnknownEncodingHelper|UnknownError|UnknownException|UnknownGroupException|UnknownHostException|UnknownObjectException|UnknownServiceException|UnknownUserException|UnknownUserExceptionHelper|UnknownUserExceptionHolder|UnmappableCharacterException|UnmarshalException|UnmodifiableSetException|UnrecoverableKeyException|Unreferenced|UnresolvedAddressException|UnresolvedPermission|UnsatisfiedLinkError|UnsolicitedNotification|UnsolicitedNotificationEvent|UnsolicitedNotificationListener|UNSUPPORTED_POLICY|UNSUPPORTED_POLICY_VALUE|UnsupportedAddressTypeException|UnsupportedAudioFileException|UnsupportedCallbackException|UnsupportedCharsetException|UnsupportedClassVersionError|UnsupportedEncodingException|UnsupportedFlavorException|UnsupportedLookAndFeelException|UnsupportedOperationException|URI|URIException|URIResolver|URISyntax|URISyntaxException|URL|URLClassLoader|URLConnection|URLDecoder|URLEncoder|URLStreamHandler|URLStreamHandlerFactory|URLStringHelper|USER_EXCEPTION|UserException|UShortSeqHelper|UShortSeqHolder|UTFDataFormatException|Util|UtilDelegate|Utilities|ValueBase|ValueBaseHelper|ValueBaseHolder|ValueFactory|ValueHandler|ValueMember|ValueMemberHelper|VariableHeightLayoutCache|Vector|VerifyError|VersionSpecHelper|VetoableChangeListener|VetoableChangeListenerProxy|VetoableChangeSupport|View|ViewFactory|ViewportLayout|ViewportUI|VirtualMachineError|Visibility|VisibilityHelper|VM_ABSTRACT|VM_CUSTOM|VM_NONE|VM_TRUNCATABLE|VMID|VoiceStatus|Void|VolatileImage|WCharSeqHelper|WCharSeqHolder|WeakHashMap|WeakReference|Window|WindowAdapter|WindowConstants|WindowEvent|WindowFocusListener|WindowListener|WindowStateListener|WrappedPlainView|WritableByteChannel|WritableRaster|WritableRenderedImage|WriteAbortedException|Writer|WrongAdapter|WrongAdapterHelper|WrongPolicy|WrongPolicyHelper|WrongTransaction|WrongTransactionHelper|WrongTransactionHolder|WStringSeqHelper|WStringSeqHolder|WStringValueHelper|X500Principal|X500PrivateCredential|X509Certificate|X509CertSelector|X509CRL|X509CRLEntry|X509CRLSelector|X509EncodedKeySpec|X509Extension|X509KeyManager|X509TrustManager|XAConnection|XADataSource|XAException|XAResource|Xid|XMLDecoder|XMLEncoder|XMLFilter|XMLFilterImpl|XMLFormatter|XMLReader|XMLReaderAdapter|XMLReaderFactory|ZipEntry|ZipException|ZipFile|ZipInputStream|ZipOutputStream|ZoneView|_BindingIteratorImplBase|_BindingIteratorStub|_DynAnyFactoryStub|_DynAnyStub|_DynArrayStub|_DynEnumStub|_DynFixedStub|_DynSequenceStub|_DynStructStub|_DynUnionStub|_DynValueStub|_IDLTypeStub|_NamingContextExtStub|_NamingContextImplBase|_NamingContextStub|_PolicyStub|_Remote_Stub|_ServantActivatorStub|_ServantLocatorStub)$/',
- ),
- 8 =>
- array (
- ),
- 9 =>
- array (
- ),
- 10 =>
- array (
- ),
- 11 =>
- array (
- ),
- 12 =>
- array (
- ),
- ),
- 0 =>
- array (
- 0 => -1,
- 1 => -1,
- 2 => -1,
- 3 => -1,
- 4 => -1,
- 5 => -1,
- 6 => -1,
- 7 =>
- array (
- 'types' => '/^(boolean|byte|char|const|double|final|float|int|long|short|static|void)$/',
- 'reserved' => '/^(import|package|abstract|break|case|catch|class|continue|default|do|else|extends|false|finally|for|goto|if|implements|instanceof|interface|native|new|null|private|protected|public|return|super|strictfp|switch|synchronized|this|throws|throw|transient|true|try|volatile|while)$/',
- 'builtin' => '/^(AbstractAction|AbstractBorder|AbstractButton|AbstractCellEditor|AbstractCollection|AbstractColorChooserPanel|AbstractDocument|AbstractInterruptibleChannel|AbstractLayoutCache|AbstractList|AbstractListModel|AbstractMap|AbstractMethodError|AbstractPreferences|AbstractSelectableChannel|AbstractSelectionKey|AbstractSelector|AbstractSequentialList|AbstractSet|AbstractSpinnerModel|AbstractTableModel|AbstractUndoableEdit|AbstractWriter|AccessControlContext|AccessControlException|AccessController|AccessException|Accessible|AccessibleAction|AccessibleBundle|AccessibleComponent|AccessibleContext|AccessibleEditableText|AccessibleExtendedComponent|AccessibleExtendedTable|AccessibleHyperlink|AccessibleHypertext|AccessibleIcon|AccessibleKeyBinding|AccessibleObject|AccessibleRelation|AccessibleRelationSet|AccessibleResourceBundle|AccessibleRole|AccessibleSelection|AccessibleState|AccessibleStateSet|AccessibleTable|AccessibleTableModelChange|AccessibleText|AccessibleValue|AccountExpiredException|Acl|AclEntry|AclNotFoundException|Action|ActionEvent|ActionListener|ActionMap|ActionMapUIResource|Activatable|ActivateFailedException|ActivationDesc|ActivationException|ActivationGroup|ActivationGroup_Stub|ActivationGroupDesc|ActivationGroupID|ActivationID|ActivationInstantiator|ActivationMonitor|ActivationSystem|Activator|ActiveEvent|AdapterActivator|AdapterActivatorOperations|AdapterAlreadyExists|AdapterAlreadyExistsHelper|AdapterInactive|AdapterInactiveHelper|AdapterNonExistent|AdapterNonExistentHelper|AddressHelper|Adjustable|AdjustmentEvent|AdjustmentListener|Adler32|AffineTransform|AffineTransformOp|AlgorithmParameterGenerator|AlgorithmParameterGeneratorSpi|AlgorithmParameters|AlgorithmParameterSpec|AlgorithmParametersSpi|AllPermission|AlphaComposite|AlreadyBound|AlreadyBoundException|AlreadyBoundHelper|AlreadyBoundHolder|AlreadyConnectedException|AncestorEvent|AncestorListener|Annotation|Any|AnyHolder|AnySeqHelper|AnySeqHolder|AppConfigurationEntry|Applet|AppletContext|AppletInitializer|AppletStub|ApplicationException|Arc2D|Area|AreaAveragingScaleFilter|ARG_IN|ARG_INOUT|ARG_OUT|ArithmeticException|Array|ArrayIndexOutOfBoundsException|ArrayList|Arrays|ArrayStoreException|AssertionError|AsyncBoxView|AsynchronousCloseException|Attr|Attribute|AttributedCharacterIterator|AttributedString|AttributeException|AttributeInUseException|AttributeList|AttributeListImpl|AttributeModificationException|Attributes|AttributeSet|AttributeSetUtilities|AttributesImpl|AudioClip|AudioFileFormat|AudioFileReader|AudioFileWriter|AudioFormat|AudioInputStream|AudioPermission|AudioSystem|AuthenticationException|AuthenticationNotSupportedException|Authenticator|AuthPermission|Autoscroll|AWTError|AWTEvent|AWTEventListener|AWTEventListenerProxy|AWTEventMulticaster|AWTException|AWTKeyStroke|AWTPermission|BackingStoreException|BAD_CONTEXT|BAD_INV_ORDER|BAD_OPERATION|BAD_PARAM|BAD_POLICY|BAD_POLICY_TYPE|BAD_POLICY_VALUE|BAD_TYPECODE|BadKind|BadLocationException|BadPaddingException|BandCombineOp|BandedSampleModel|BasicArrowButton|BasicAttribute|BasicAttributes|BasicBorders|BasicButtonListener|BasicButtonUI|BasicCheckBoxMenuItemUI|BasicCheckBoxUI|BasicColorChooserUI|BasicComboBoxEditor|BasicComboBoxRenderer|BasicComboBoxUI|BasicComboPopup|BasicDesktopIconUI|BasicDesktopPaneUI|BasicDirectoryModel|BasicEditorPaneUI|BasicFileChooserUI|BasicFormattedTextFieldUI|BasicGraphicsUtils|BasicHTML|BasicIconFactory|BasicInternalFrameTitlePane|BasicInternalFrameUI|BasicLabelUI|BasicListUI|BasicLookAndFeel|BasicMenuBarUI|BasicMenuItemUI|BasicMenuUI|BasicOptionPaneUI|BasicPanelUI|BasicPasswordFieldUI|BasicPermission|BasicPopupMenuSeparatorUI|BasicPopupMenuUI|BasicProgressBarUI|BasicRadioButtonMenuItemUI|BasicRadioButtonUI|BasicRootPaneUI|BasicScrollBarUI|BasicScrollPaneUI|BasicSeparatorUI|BasicSliderUI|BasicSpinnerUI|BasicSplitPaneDivider|BasicSplitPaneUI|BasicStroke|BasicTabbedPaneUI|BasicTableHeaderUI|BasicTableUI|BasicTextAreaUI|BasicTextFieldUI|BasicTextPaneUI|BasicTextUI|BasicToggleButtonUI|BasicToolBarSeparatorUI|BasicToolBarUI|BasicToolTipUI|BasicTreeUI|BasicViewportUI|BatchUpdateException|BeanContext|BeanContextChild|BeanContextChildComponentProxy|BeanContextChildSupport|BeanContextContainerProxy|BeanContextEvent|BeanContextMembershipEvent|BeanContextMembershipListener|BeanContextProxy|BeanContextServiceAvailableEvent|BeanContextServiceProvider|BeanContextServiceProviderBeanInfo|BeanContextServiceRevokedEvent|BeanContextServiceRevokedListener|BeanContextServices|BeanContextServicesListener|BeanContextServicesSupport|BeanContextSupport|BeanDescriptor|BeanInfo|Beans|BevelBorder|Bidi|BigDecimal|BigInteger|BinaryRefAddr|BindException|Binding|BindingHelper|BindingHolder|BindingIterator|BindingIteratorHelper|BindingIteratorHolder|BindingIteratorOperations|BindingIteratorPOA|BindingListHelper|BindingListHolder|BindingType|BindingTypeHelper|BindingTypeHolder|BitSet|Blob|BlockView|Book|Boolean|BooleanControl|BooleanHolder|BooleanSeqHelper|BooleanSeqHolder|Border|BorderFactory|BorderLayout|BorderUIResource|BoundedRangeModel|Bounds|Box|BoxedValueHelper|BoxLayout|BoxView|BreakIterator|Buffer|BufferCapabilities|BufferedImage|BufferedImageFilter|BufferedImageOp|BufferedInputStream|BufferedOutputStream|BufferedReader|BufferedWriter|BufferOverflowException|BufferStrategy|BufferUnderflowException|Button|ButtonGroup|ButtonModel|ButtonUI|Byte|ByteArrayInputStream|ByteArrayOutputStream|ByteBuffer|ByteChannel|ByteHolder|ByteLookupTable|ByteOrder|Calendar|CallableStatement|Callback|CallbackHandler|CancelablePrintJob|CancelledKeyException|CannotProceed|CannotProceedException|CannotProceedHelper|CannotProceedHolder|CannotRedoException|CannotUndoException|Canvas|CardLayout|Caret|CaretEvent|CaretListener|CDATASection|CellEditor|CellEditorListener|CellRendererPane|Certificate|CertificateEncodingException|CertificateException|CertificateExpiredException|CertificateFactory|CertificateFactorySpi|CertificateNotYetValidException|CertificateParsingException|CertPath|CertPathBuilder|CertPathBuilderException|CertPathBuilderResult|CertPathBuilderSpi|CertPathParameters|CertPathValidator|CertPathValidatorException|CertPathValidatorResult|CertPathValidatorSpi|CertSelector|CertStore|CertStoreException|CertStoreParameters|CertStoreSpi|ChangedCharSetException|ChangeEvent|ChangeListener|Channel|ChannelBinding|Channels|Character|CharacterCodingException|CharacterData|CharacterIterator|CharArrayReader|CharArrayWriter|CharBuffer|CharConversionException|CharHolder|CharSeqHelper|CharSeqHolder|CharSequence|Charset|CharsetDecoder|CharsetEncoder|CharsetProvider|Checkbox|CheckboxGroup|CheckboxMenuItem|CheckedInputStream|CheckedOutputStream|Checksum|Choice|ChoiceCallback|ChoiceFormat|Chromaticity|Cipher|CipherInputStream|CipherOutputStream|CipherSpi|Class|ClassCastException|ClassCircularityError|ClassDesc|ClassFormatError|ClassLoader|ClassNotFoundException|ClientRequestInfo|ClientRequestInfoOperations|ClientRequestInterceptor|ClientRequestInterceptorOperations|Clip|Clipboard|ClipboardOwner|Clob|Cloneable|CloneNotSupportedException|ClosedByInterruptException|ClosedChannelException|ClosedSelectorException|CMMException|Codec|CodecFactory|CodecFactoryHelper|CodecFactoryOperations|CodecOperations|CoderMalfunctionError|CoderResult|CodeSets|CodeSource|CodingErrorAction|CollationElementIterator|CollationKey|Collator|Collection|CollectionCertStoreParameters|Collections|Color|ColorChooserComponentFactory|ColorChooserUI|ColorConvertOp|ColorModel|ColorSelectionModel|ColorSpace|ColorSupported|ColorUIResource|ComboBoxEditor|ComboBoxModel|ComboBoxUI|ComboPopup|COMM_FAILURE|Comment|CommunicationException|Comparable|Comparator|Compiler|CompletionStatus|CompletionStatusHelper|Component|ComponentAdapter|ComponentColorModel|ComponentEvent|ComponentIdHelper|ComponentInputMap|ComponentInputMapUIResource|ComponentListener|ComponentOrientation|ComponentSampleModel|ComponentUI|ComponentView|Composite|CompositeContext|CompositeName|CompositeView|CompoundBorder|CompoundControl|CompoundEdit|CompoundName|Compression|ConcurrentModificationException|Configuration|ConfigurationException|ConfirmationCallback|ConnectException|ConnectIOException|Connection|ConnectionEvent|ConnectionEventListener|ConnectionPendingException|ConnectionPoolDataSource|ConsoleHandler|Constructor|Container|ContainerAdapter|ContainerEvent|ContainerListener|ContainerOrderFocusTraversalPolicy|ContentHandler|ContentHandlerFactory|ContentModel|Context|ContextList|ContextNotEmptyException|ContextualRenderedImageFactory|Control|ControlFactory|ControllerEventListener|ConvolveOp|CookieHolder|Copies|CopiesSupported|CRC32|CredentialExpiredException|CRL|CRLException|CRLSelector|CropImageFilter|CSS|CTX_RESTRICT_SCOPE|CubicCurve2D|Currency|Current|CurrentHelper|CurrentHolder|CurrentOperations|Cursor|Customizer|CustomMarshal|CustomValue|DATA_CONVERSION|DatabaseMetaData|DataBuffer|DataBufferByte|DataBufferDouble|DataBufferFloat|DataBufferInt|DataBufferShort|DataBufferUShort|DataFlavor|DataFormatException|DatagramChannel|DatagramPacket|DatagramSocket|DatagramSocketImpl|DatagramSocketImplFactory|DataInput|DataInputStream|DataLine|DataOutput|DataOutputStream|DataSource|DataTruncation|Date|DateFormat|DateFormatSymbols|DateFormatter|DateTimeAtCompleted|DateTimeAtCreation|DateTimeAtProcessing|DateTimeSyntax|DebugGraphics|DecimalFormat|DecimalFormatSymbols|DeclHandler|DefaultBoundedRangeModel|DefaultButtonModel|DefaultCaret|DefaultCellEditor|DefaultColorSelectionModel|DefaultComboBoxModel|DefaultDesktopManager|DefaultEditorKit|DefaultFocusManager|DefaultFocusTraversalPolicy|DefaultFormatter|DefaultFormatterFactory|DefaultHandler|DefaultHighlighter|DefaultKeyboardFocusManager|DefaultListCellRenderer|DefaultListModel|DefaultListSelectionModel|DefaultMenuLayout|DefaultMetalTheme|DefaultMutableTreeNode|DefaultPersistenceDelegate|DefaultSingleSelectionModel|DefaultStyledDocument|DefaultTableCellRenderer|DefaultTableColumnModel|DefaultTableModel|DefaultTextUI|DefaultTreeCellEditor|DefaultTreeCellRenderer|DefaultTreeModel|DefaultTreeSelectionModel|DefinitionKind|DefinitionKindHelper|Deflater|DeflaterOutputStream|Delegate|DelegationPermission|DESedeKeySpec|DesignMode|DESKeySpec|DesktopIconUI|DesktopManager|DesktopPaneUI|Destination|Destroyable|DestroyFailedException|DGC|DHGenParameterSpec|DHKey|DHParameterSpec|DHPrivateKey|DHPrivateKeySpec|DHPublicKey|DHPublicKeySpec|Dialog|Dictionary|DigestException|DigestInputStream|DigestOutputStream|Dimension|Dimension2D|DimensionUIResource|DirContext|DirectColorModel|DirectoryManager|DirObjectFactory|DirStateFactory|DisplayMode|DnDConstants|Doc|DocAttribute|DocAttributeSet|DocFlavor|DocPrintJob|Document|DocumentBuilder|DocumentBuilderFactory|DocumentEvent|DocumentFilter|DocumentFragment|DocumentHandler|DocumentListener|DocumentName|DocumentParser|DocumentType|DomainCombiner|DomainManager|DomainManagerOperations|DOMException|DOMImplementation|DOMLocator|DOMResult|DOMSource|Double|DoubleBuffer|DoubleHolder|DoubleSeqHelper|DoubleSeqHolder|DragGestureEvent|DragGestureListener|DragGestureRecognizer|DragSource|DragSourceAdapter|DragSourceContext|DragSourceDragEvent|DragSourceDropEvent|DragSourceEvent|DragSourceListener|DragSourceMotionListener|Driver|DriverManager|DriverPropertyInfo|DropTarget|DropTargetAdapter|DropTargetContext|DropTargetDragEvent|DropTargetDropEvent|DropTargetEvent|DropTargetListener|DSAKey|DSAKeyPairGenerator|DSAParameterSpec|DSAParams|DSAPrivateKey|DSAPrivateKeySpec|DSAPublicKey|DSAPublicKeySpec|DTD|DTDConstants|DTDHandler|DuplicateName|DuplicateNameHelper|DynamicImplementation|DynAny|DynAnyFactory|DynAnyFactoryHelper|DynAnyFactoryOperations|DynAnyHelper|DynAnyOperations|DynAnySeqHelper|DynArray|DynArrayHelper|DynArrayOperations|DynEnum|DynEnumHelper|DynEnumOperations|DynFixed|DynFixedHelper|DynFixedOperations|DynSequence|DynSequenceHelper|DynSequenceOperations|DynStruct|DynStructHelper|DynStructOperations|DynUnion|DynUnionHelper|DynUnionOperations|DynValue|DynValueBox|DynValueBoxOperations|DynValueCommon|DynValueCommonOperations|DynValueHelper|DynValueOperations|EditorKit|Element|ElementIterator|Ellipse2D|EmptyBorder|EmptyStackException|EncodedKeySpec|Encoder|Encoding|ENCODING_CDR_ENCAPS|EncryptedPrivateKeyInfo|Entity|EntityReference|EntityResolver|EnumControl|Enumeration|EnumSyntax|Environment|EOFException|Error|ErrorHandler|ErrorListener|ErrorManager|EtchedBorder|Event|EventContext|EventDirContext|EventHandler|EventListener|EventListenerList|EventListenerProxy|EventObject|EventQueue|EventSetDescriptor|Exception|ExceptionInInitializerError|ExceptionList|ExceptionListener|ExemptionMechanism|ExemptionMechanismException|ExemptionMechanismSpi|ExpandVetoException|ExportException|Expression|ExtendedRequest|ExtendedResponse|Externalizable|FactoryConfigurationError|FailedLoginException|FeatureDescriptor|Fidelity|Field|FieldNameHelper|FieldPosition|FieldView|File|FileCacheImageInputStream|FileCacheImageOutputStream|FileChannel|FileChooserUI|FileDescriptor|FileDialog|FileFilter|FileHandler|FileImageInputStream|FileImageOutputStream|FileInputStream|FileLock|FileLockInterruptionException|FilenameFilter|FileNameMap|FileNotFoundException|FileOutputStream|FilePermission|FileReader|FileSystemView|FileView|FileWriter|Filter|FilteredImageSource|FilterInputStream|FilterOutputStream|FilterReader|FilterWriter|Finishings|FixedHeightLayoutCache|FixedHolder|FlatteningPathIterator|FlavorException|FlavorMap|FlavorTable|Float|FloatBuffer|FloatControl|FloatHolder|FloatSeqHelper|FloatSeqHolder|FlowLayout|FlowView|FocusAdapter|FocusEvent|FocusListener|FocusManager|FocusTraversalPolicy|Font|FontFormatException|FontMetrics|FontRenderContext|FontUIResource|Format|FormatConversionProvider|FormatMismatch|FormatMismatchHelper|Formatter|FormView|ForwardRequest|ForwardRequestHelper|Frame|FREE_MEM|GapContent|GatheringByteChannel|GeneralPath|GeneralSecurityException|GlyphJustificationInfo|GlyphMetrics|GlyphVector|GlyphView|GradientPaint|GraphicAttribute|Graphics|Graphics2D|GraphicsConfigTemplate|GraphicsConfiguration|GraphicsDevice|GraphicsEnvironment|GrayFilter|GregorianCalendar|GridBagConstraints|GridBagLayout|GridLayout|Group|GSSContext|GSSCredential|GSSException|GSSManager|GSSName|Guard|GuardedObject|GZIPInputStream|GZIPOutputStream|Handler|HandlerBase|HandshakeCompletedEvent|HandshakeCompletedListener|HasControls|HashAttributeSet|HashDocAttributeSet|HashMap|HashPrintJobAttributeSet|HashPrintRequestAttributeSet|HashPrintServiceAttributeSet|HashSet|Hashtable|HeadlessException|HierarchyBoundsAdapter|HierarchyBoundsListener|HierarchyEvent|HierarchyListener|Highlighter|HostnameVerifier|HTML|HTMLDocument|HTMLEditorKit|HTMLFrameHyperlinkEvent|HTMLWriter|HttpsURLConnection|HttpURLConnection|HyperlinkEvent|HyperlinkListener|ICC_ColorSpace|ICC_Profile|ICC_ProfileGray|ICC_ProfileRGB|Icon|IconUIResource|IconView|ID_ASSIGNMENT_POLICY_ID|ID_UNIQUENESS_POLICY_ID|IdAssignmentPolicy|IdAssignmentPolicyOperations|IdAssignmentPolicyValue|IdentifierHelper|Identity|IdentityHashMap|IdentityScope|IDLEntity|IDLType|IDLTypeHelper|IDLTypeOperations|IdUniquenessPolicy|IdUniquenessPolicyOperations|IdUniquenessPolicyValue|IIOByteBuffer|IIOException|IIOImage|IIOInvalidTreeException|IIOMetadata|IIOMetadataController|IIOMetadataFormat|IIOMetadataFormatImpl|IIOMetadataNode|IIOParam|IIOParamController|IIOReadProgressListener|IIOReadUpdateListener|IIOReadWarningListener|IIORegistry|IIOServiceProvider|IIOWriteProgressListener|IIOWriteWarningListener|IllegalAccessError|IllegalAccessException|IllegalArgumentException|IllegalBlockingModeException|IllegalBlockSizeException|IllegalCharsetNameException|IllegalComponentStateException|IllegalMonitorStateException|IllegalPathStateException|IllegalSelectorException|IllegalStateException|IllegalThreadStateException|Image|ImageCapabilities|ImageConsumer|ImageFilter|ImageGraphicAttribute|ImageIcon|ImageInputStream|ImageInputStreamImpl|ImageInputStreamSpi|ImageIO|ImageObserver|ImageOutputStream|ImageOutputStreamImpl|ImageOutputStreamSpi|ImageProducer|ImageReader|ImageReaderSpi|ImageReaderWriterSpi|ImageReadParam|ImageTranscoder|ImageTranscoderSpi|ImageTypeSpecifier|ImageView|ImageWriteParam|ImageWriter|ImageWriterSpi|ImagingOpException|IMP_LIMIT|IMPLICIT_ACTIVATION_POLICY_ID|ImplicitActivationPolicy|ImplicitActivationPolicyOperations|ImplicitActivationPolicyValue|IncompatibleClassChangeError|InconsistentTypeCode|InconsistentTypeCodeHelper|IndexColorModel|IndexedPropertyDescriptor|IndexOutOfBoundsException|IndirectionException|Inet4Address|Inet6Address|InetAddress|InetSocketAddress|Inflater|InflaterInputStream|InheritableThreadLocal|InitialContext|InitialContextFactory|InitialContextFactoryBuilder|InitialDirContext|INITIALIZE|InitialLdapContext|InlineView|InputContext|InputEvent|InputMap|InputMapUIResource|InputMethod|InputMethodContext|InputMethodDescriptor|InputMethodEvent|InputMethodHighlight|InputMethodListener|InputMethodRequests|InputSource|InputStream|InputStreamReader|InputSubset|InputVerifier|Insets|InsetsUIResource|InstantiationError|InstantiationException|Instrument|InsufficientResourcesException|IntBuffer|Integer|IntegerSyntax|Interceptor|InterceptorOperations|INTERNAL|InternalError|InternalFrameAdapter|InternalFrameEvent|InternalFrameFocusTraversalPolicy|InternalFrameListener|InternalFrameUI|InternationalFormatter|InterruptedException|InterruptedIOException|InterruptedNamingException|InterruptibleChannel|INTF_REPOS|IntHolder|IntrospectionException|Introspector|INV_FLAG|INV_IDENT|INV_OBJREF|INV_POLICY|Invalid|INVALID_TRANSACTION|InvalidAddress|InvalidAddressHelper|InvalidAddressHolder|InvalidAlgorithmParameterException|InvalidAttributeIdentifierException|InvalidAttributesException|InvalidAttributeValueException|InvalidClassException|InvalidDnDOperationException|InvalidKeyException|InvalidKeySpecException|InvalidMarkException|InvalidMidiDataException|InvalidName|InvalidNameException|InvalidNameHelper|InvalidNameHolder|InvalidObjectException|InvalidParameterException|InvalidParameterSpecException|InvalidPolicy|InvalidPolicyHelper|InvalidPreferencesFormatException|InvalidSearchControlsException|InvalidSearchFilterException|InvalidSeq|InvalidSlot|InvalidSlotHelper|InvalidTransactionException|InvalidTypeForEncoding|InvalidTypeForEncodingHelper|InvalidValue|InvalidValueHelper|InvocationEvent|InvocationHandler|InvocationTargetException|InvokeHandler|IOException|IOR|IORHelper|IORHolder|IORInfo|IORInfoOperations|IORInterceptor|IORInterceptorOperations|IRObject|IRObjectOperations|IstringHelper|ItemEvent|ItemListener|ItemSelectable|Iterator|IvParameterSpec|JApplet|JarEntry|JarException|JarFile|JarInputStream|JarOutputStream|JarURLConnection|JButton|JCheckBox|JCheckBoxMenuItem|JColorChooser|JComboBox|JComponent|JDesktopPane|JDialog|JEditorPane|JFileChooser|JFormattedTextField|JFrame|JInternalFrame|JLabel|JLayeredPane|JList|JMenu|JMenuBar|JMenuItem|JobAttributes|JobHoldUntil|JobImpressions|JobImpressionsCompleted|JobImpressionsSupported|JobKOctets|JobKOctetsProcessed|JobKOctetsSupported|JobMediaSheets|JobMediaSheetsCompleted|JobMediaSheetsSupported|JobMessageFromOperator|JobName|JobOriginatingUserName|JobPriority|JobPrioritySupported|JobSheets|JobState|JobStateReason|JobStateReasons|JOptionPane|JPanel|JPasswordField|JPEGHuffmanTable|JPEGImageReadParam|JPEGImageWriteParam|JPEGQTable|JPopupMenu|JProgressBar|JRadioButton|JRadioButtonMenuItem|JRootPane|JScrollBar|JScrollPane|JSeparator|JSlider|JSpinner|JSplitPane|JTabbedPane|JTable|JTableHeader|JTextArea|JTextComponent|JTextField|JTextPane|JToggleButton|JToolBar|JToolTip|JTree|JViewport|JWindow|KerberosKey|KerberosPrincipal|KerberosTicket|Kernel|Key|KeyAdapter|KeyAgreement|KeyAgreementSpi|KeyboardFocusManager|KeyEvent|KeyEventDispatcher|KeyEventPostProcessor|KeyException|KeyFactory|KeyFactorySpi|KeyGenerator|KeyGeneratorSpi|KeyListener|KeyManagementException|KeyManager|KeyManagerFactory|KeyManagerFactorySpi|Keymap|KeyPair|KeyPairGenerator|KeyPairGeneratorSpi|KeySpec|KeyStore|KeyStoreException|KeyStoreSpi|KeyStroke|Label|LabelUI|LabelView|LanguageCallback|LastOwnerException|LayeredHighlighter|LayoutFocusTraversalPolicy|LayoutManager|LayoutManager2|LayoutQueue|LDAPCertStoreParameters|LdapContext|LdapReferralException|Lease|Level|LexicalHandler|LIFESPAN_POLICY_ID|LifespanPolicy|LifespanPolicyOperations|LifespanPolicyValue|LimitExceededException|Line|Line2D|LineBorder|LineBreakMeasurer|LineEvent|LineListener|LineMetrics|LineNumberInputStream|LineNumberReader|LineUnavailableException|LinkageError|LinkedHashMap|LinkedHashSet|LinkedList|LinkException|LinkLoopException|LinkRef|List|ListCellRenderer|ListDataEvent|ListDataListener|ListIterator|ListModel|ListResourceBundle|ListSelectionEvent|ListSelectionListener|ListSelectionModel|ListUI|ListView|LoaderHandler|Locale|LocalObject|LocateRegistry|LOCATION_FORWARD|Locator|LocatorImpl|Logger|LoggingPermission|LoginContext|LoginException|LoginModule|LogManager|LogRecord|LogStream|Long|LongBuffer|LongHolder|LongLongSeqHelper|LongLongSeqHolder|LongSeqHelper|LongSeqHolder|LookAndFeel|LookupOp|LookupTable|Mac|MacSpi|MalformedInputException|MalformedLinkException|MalformedURLException|ManagerFactoryParameters|Manifest|Map|MappedByteBuffer|MARSHAL|MarshalException|MarshalledObject|MaskFormatter|Matcher|Math|MatteBorder|Media|MediaName|MediaPrintableArea|MediaSize|MediaSizeName|MediaTracker|MediaTray|Member|MemoryCacheImageInputStream|MemoryCacheImageOutputStream|MemoryHandler|MemoryImageSource|Menu|MenuBar|MenuBarUI|MenuComponent|MenuContainer|MenuDragMouseEvent|MenuDragMouseListener|MenuElement|MenuEvent|MenuItem|MenuItemUI|MenuKeyEvent|MenuKeyListener|MenuListener|MenuSelectionManager|MenuShortcut|MessageDigest|MessageDigestSpi|MessageFormat|MessageProp|MetaEventListener|MetalBorders|MetalButtonUI|MetalCheckBoxIcon|MetalCheckBoxUI|MetalComboBoxButton|MetalComboBoxEditor|MetalComboBoxIcon|MetalComboBoxUI|MetalDesktopIconUI|MetalFileChooserUI|MetalIconFactory|MetalInternalFrameTitlePane|MetalInternalFrameUI|MetalLabelUI|MetalLookAndFeel|MetalPopupMenuSeparatorUI|MetalProgressBarUI|MetalRadioButtonUI|MetalRootPaneUI|MetalScrollBarUI|MetalScrollButton|MetalScrollPaneUI|MetalSeparatorUI|MetalSliderUI|MetalSplitPaneUI|MetalTabbedPaneUI|MetalTextFieldUI|MetalTheme|MetalToggleButtonUI|MetalToolBarUI|MetalToolTipUI|MetalTreeUI|MetaMessage|Method|MethodDescriptor|MidiChannel|MidiDevice|MidiDeviceProvider|MidiEvent|MidiFileFormat|MidiFileReader|MidiFileWriter|MidiMessage|MidiSystem|MidiUnavailableException|MimeTypeParseException|MinimalHTMLWriter|MissingResourceException|Mixer|MixerProvider|ModificationItem|Modifier|MouseAdapter|MouseDragGestureRecognizer|MouseEvent|MouseInputAdapter|MouseInputListener|MouseListener|MouseMotionAdapter|MouseMotionListener|MouseWheelEvent|MouseWheelListener|MultiButtonUI|MulticastSocket|MultiColorChooserUI|MultiComboBoxUI|MultiDesktopIconUI|MultiDesktopPaneUI|MultiDoc|MultiDocPrintJob|MultiDocPrintService|MultiFileChooserUI|MultiInternalFrameUI|MultiLabelUI|MultiListUI|MultiLookAndFeel|MultiMenuBarUI|MultiMenuItemUI|MultiOptionPaneUI|MultiPanelUI|MultiPixelPackedSampleModel|MultipleComponentProfileHelper|MultipleComponentProfileHolder|MultipleDocumentHandling|MultipleMaster|MultiPopupMenuUI|MultiProgressBarUI|MultiRootPaneUI|MultiScrollBarUI|MultiScrollPaneUI|MultiSeparatorUI|MultiSliderUI|MultiSpinnerUI|MultiSplitPaneUI|MultiTabbedPaneUI|MultiTableHeaderUI|MultiTableUI|MultiTextUI|MultiToolBarUI|MultiToolTipUI|MultiTreeUI|MultiViewportUI|MutableAttributeSet|MutableComboBoxModel|MutableTreeNode|Name|NameAlreadyBoundException|NameCallback|NameClassPair|NameComponent|NameComponentHelper|NameComponentHolder|NamedNodeMap|NamedValue|NameDynAnyPair|NameDynAnyPairHelper|NameDynAnyPairSeqHelper|NameHelper|NameHolder|NameNotFoundException|NameParser|NamespaceChangeListener|NamespaceSupport|NameValuePair|NameValuePairHelper|NameValuePairSeqHelper|Naming|NamingContext|NamingContextExt|NamingContextExtHelper|NamingContextExtHolder|NamingContextExtOperations|NamingContextExtPOA|NamingContextHelper|NamingContextHolder|NamingContextOperations|NamingContextPOA|NamingEnumeration|NamingEvent|NamingException|NamingExceptionEvent|NamingListener|NamingManager|NamingSecurityException|NavigationFilter|NegativeArraySizeException|NetPermission|NetworkInterface|NO_IMPLEMENT|NO_MEMORY|NO_PERMISSION|NO_RESOURCES|NO_RESPONSE|NoClassDefFoundError|NoConnectionPendingException|NoContext|NoContextHelper|Node|NodeChangeEvent|NodeChangeListener|NodeList|NoInitialContextException|NoninvertibleTransformException|NonReadableChannelException|NonWritableChannelException|NoPermissionException|NoRouteToHostException|NoServant|NoServantHelper|NoSuchAlgorithmException|NoSuchAttributeException|NoSuchElementException|NoSuchFieldError|NoSuchFieldException|NoSuchMethodError|NoSuchMethodException|NoSuchObjectException|NoSuchPaddingException|NoSuchProviderException|NotActiveException|Notation|NotBoundException|NotContextException|NotEmpty|NotEmptyHelper|NotEmptyHolder|NotFound|NotFoundHelper|NotFoundHolder|NotFoundReason|NotFoundReasonHelper|NotFoundReasonHolder|NotOwnerException|NotSerializableException|NotYetBoundException|NotYetConnectedException|NullCipher|NullPointerException|Number|NumberFormat|NumberFormatException|NumberFormatter|NumberOfDocuments|NumberOfInterveningJobs|NumberUp|NumberUpSupported|NumericShaper|NVList|OBJ_ADAPTER|Object|OBJECT_NOT_EXIST|ObjectAlreadyActive|ObjectAlreadyActiveHelper|ObjectChangeListener|ObjectFactory|ObjectFactoryBuilder|ObjectHelper|ObjectHolder|ObjectIdHelper|ObjectImpl|ObjectInput|ObjectInputStream|ObjectInputValidation|ObjectNotActive|ObjectNotActiveHelper|ObjectOutput|ObjectOutputStream|ObjectStreamClass|ObjectStreamConstants|ObjectStreamException|ObjectStreamField|ObjectView|ObjID|Observable|Observer|OctetSeqHelper|OctetSeqHolder|Oid|OMGVMCID|OpenType|Operation|OperationNotSupportedException|Option|OptionalDataException|OptionPaneUI|ORB|ORBInitializer|ORBInitializerOperations|ORBInitInfo|ORBInitInfoOperations|OrientationRequested|OutOfMemoryError|OutputDeviceAssigned|OutputKeys|OutputStream|OutputStreamWriter|OverlappingFileLockException|OverlayLayout|Owner|Package|PackedColorModel|Pageable|PageAttributes|PageFormat|PageRanges|PagesPerMinute|PagesPerMinuteColor|Paint|PaintContext|PaintEvent|Panel|PanelUI|Paper|ParagraphView|Parameter|ParameterBlock|ParameterDescriptor|ParameterMetaData|ParameterMode|ParameterModeHelper|ParameterModeHolder|ParseException|ParsePosition|Parser|ParserAdapter|ParserConfigurationException|ParserDelegator|ParserFactory|PartialResultException|PasswordAuthentication|PasswordCallback|PasswordView|Patch|PathIterator|Pattern|PatternSyntaxException|PBEKey|PBEKeySpec|PBEParameterSpec|PDLOverrideSupported|Permission|PermissionCollection|Permissions|PERSIST_STORE|PersistenceDelegate|PhantomReference|Pipe|PipedInputStream|PipedOutputStream|PipedReader|PipedWriter|PixelGrabber|PixelInterleavedSampleModel|PKCS8EncodedKeySpec|PKIXBuilderParameters|PKIXCertPathBuilderResult|PKIXCertPathChecker|PKIXCertPathValidatorResult|PKIXParameters|PlainDocument|PlainView|POA|POAHelper|POAManager|POAManagerOperations|POAOperations|Point|Point2D|Policy|PolicyError|PolicyErrorCodeHelper|PolicyErrorHelper|PolicyErrorHolder|PolicyFactory|PolicyFactoryOperations|PolicyHelper|PolicyHolder|PolicyListHelper|PolicyListHolder|PolicyNode|PolicyOperations|PolicyQualifierInfo|PolicyTypeHelper|Polygon|PooledConnection|Popup|PopupFactory|PopupMenu|PopupMenuEvent|PopupMenuListener|PopupMenuUI|Port|PortableRemoteObject|PortableRemoteObjectDelegate|PortUnreachableException|Position|PreferenceChangeEvent|PreferenceChangeListener|Preferences|PreferencesFactory|PreparedStatement|PresentationDirection|Principal|PrincipalHolder|Printable|PrinterAbortException|PrinterException|PrinterGraphics|PrinterInfo|PrinterIOException|PrinterIsAcceptingJobs|PrinterJob|PrinterLocation|PrinterMakeAndModel|PrinterMessageFromOperator|PrinterMoreInfo|PrinterMoreInfoManufacturer|PrinterName|PrinterResolution|PrinterState|PrinterStateReason|PrinterStateReasons|PrinterURI|PrintEvent|PrintException|PrintGraphics|PrintJob|PrintJobAdapter|PrintJobAttribute|PrintJobAttributeEvent|PrintJobAttributeListener|PrintJobAttributeSet|PrintJobEvent|PrintJobListener|PrintQuality|PrintRequestAttribute|PrintRequestAttributeSet|PrintService|PrintServiceAttribute|PrintServiceAttributeEvent|PrintServiceAttributeListener|PrintServiceAttributeSet|PrintServiceLookup|PrintStream|PrintWriter|PRIVATE_MEMBER|PrivateCredentialPermission|PrivateKey|PrivilegedAction|PrivilegedActionException|PrivilegedExceptionAction|Process|ProcessingInstruction|ProfileDataException|ProfileIdHelper|ProgressBarUI|ProgressMonitor|ProgressMonitorInputStream|Properties|PropertyChangeEvent|PropertyChangeListener|PropertyChangeListenerProxy|PropertyChangeSupport|PropertyDescriptor|PropertyEditor|PropertyEditorManager|PropertyEditorSupport|PropertyPermission|PropertyResourceBundle|PropertyVetoException|ProtectionDomain|ProtocolException|Provider|ProviderException|Proxy|PSSParameterSpec|PUBLIC_MEMBER|PublicKey|PushbackInputStream|PushbackReader|QuadCurve2D|QueuedJobCount|Random|RandomAccess|RandomAccessFile|Raster|RasterFormatException|RasterOp|RC2ParameterSpec|RC5ParameterSpec|ReadableByteChannel|Reader|ReadOnlyBufferException|Receiver|Rectangle|Rectangle2D|RectangularShape|Ref|RefAddr|Reference|Referenceable|ReferenceQueue|ReferenceUriSchemesSupported|ReferralException|ReflectPermission|Refreshable|RefreshFailedException|RegisterableService|Registry|RegistryHandler|RemarshalException|Remote|RemoteCall|RemoteException|RemoteObject|RemoteRef|RemoteServer|RemoteStub|RenderableImage|RenderableImageOp|RenderableImageProducer|RenderContext|RenderedImage|RenderedImageFactory|Renderer|RenderingHints|RepaintManager|ReplicateScaleFilter|RepositoryIdHelper|Request|REQUEST_PROCESSING_POLICY_ID|RequestInfo|RequestInfoOperations|RequestingUserName|RequestProcessingPolicy|RequestProcessingPolicyOperations|RequestProcessingPolicyValue|RescaleOp|ResolutionSyntax|Resolver|ResolveResult|ResourceBundle|ResponseHandler|Result|ResultSet|ResultSetMetaData|ReverbType|RGBImageFilter|RMIClassLoader|RMIClassLoaderSpi|RMIClientSocketFactory|RMIFailureHandler|RMISecurityException|RMISecurityManager|RMIServerSocketFactory|RMISocketFactory|Robot|RootPaneContainer|RootPaneUI|RoundRectangle2D|RowMapper|RowSet|RowSetEvent|RowSetInternal|RowSetListener|RowSetMetaData|RowSetReader|RowSetWriter|RSAKey|RSAKeyGenParameterSpec|RSAMultiPrimePrivateCrtKey|RSAMultiPrimePrivateCrtKeySpec|RSAOtherPrimeInfo|RSAPrivateCrtKey|RSAPrivateCrtKeySpec|RSAPrivateKey|RSAPrivateKeySpec|RSAPublicKey|RSAPublicKeySpec|RTFEditorKit|RuleBasedCollator|Runnable|Runtime|RunTime|RuntimeException|RunTimeOperations|RuntimePermission|SampleModel|Savepoint|SAXException|SAXNotRecognizedException|SAXNotSupportedException|SAXParseException|SAXParser|SAXParserFactory|SAXResult|SAXSource|SAXTransformerFactory|ScatteringByteChannel|SchemaViolationException|Scrollable|Scrollbar|ScrollBarUI|ScrollPane|ScrollPaneAdjustable|ScrollPaneConstants|ScrollPaneLayout|ScrollPaneUI|SealedObject|SearchControls|SearchResult|SecretKey|SecretKeyFactory|SecretKeyFactorySpi|SecretKeySpec|SecureClassLoader|SecureRandom|SecureRandomSpi|Security|SecurityException|SecurityManager|SecurityPermission|Segment|SelectableChannel|SelectionKey|Selector|SelectorProvider|SeparatorUI|Sequence|SequenceInputStream|Sequencer|Serializable|SerializablePermission|Servant|SERVANT_RETENTION_POLICY_ID|ServantActivator|ServantActivatorHelper|ServantActivatorOperations|ServantActivatorPOA|ServantAlreadyActive|ServantAlreadyActiveHelper|ServantLocator|ServantLocatorHelper|ServantLocatorOperations|ServantLocatorPOA|ServantManager|ServantManagerOperations|ServantNotActive|ServantNotActiveHelper|ServantObject|ServantRetentionPolicy|ServantRetentionPolicyOperations|ServantRetentionPolicyValue|ServerCloneException|ServerError|ServerException|ServerNotActiveException|ServerRef|ServerRequest|ServerRequestInfo|ServerRequestInfoOperations|ServerRequestInterceptor|ServerRequestInterceptorOperations|ServerRuntimeException|ServerSocket|ServerSocketChannel|ServerSocketFactory|ServiceContext|ServiceContextHelper|ServiceContextHolder|ServiceContextListHelper|ServiceContextListHolder|ServiceDetail|ServiceDetailHelper|ServiceIdHelper|ServiceInformation|ServiceInformationHelper|ServiceInformationHolder|ServicePermission|ServiceRegistry|ServiceUI|ServiceUIFactory|ServiceUnavailableException|Set|SetOfIntegerSyntax|SetOverrideType|SetOverrideTypeHelper|Severity|Shape|ShapeGraphicAttribute|SheetCollate|Short|ShortBuffer|ShortBufferException|ShortHolder|ShortLookupTable|ShortMessage|ShortSeqHelper|ShortSeqHolder|Sides|Signature|SignatureException|SignatureSpi|SignedObject|Signer|SimpleAttributeSet|SimpleBeanInfo|SimpleDateFormat|SimpleDoc|SimpleFormatter|SimpleTimeZone|SinglePixelPackedSampleModel|SingleSelectionModel|Size2DSyntax|SizeLimitExceededException|SizeRequirements|SizeSequence|Skeleton|SkeletonMismatchException|SkeletonNotFoundException|SliderUI|Socket|SocketAddress|SocketChannel|SocketException|SocketFactory|SocketHandler|SocketImpl|SocketImplFactory|SocketOptions|SocketPermission|SocketSecurityException|SocketTimeoutException|SoftBevelBorder|SoftReference|SortedMap|SortedSet|SortingFocusTraversalPolicy|Soundbank|SoundbankReader|SoundbankResource|Source|SourceDataLine|SourceLocator|SpinnerDateModel|SpinnerListModel|SpinnerModel|SpinnerNumberModel|SpinnerUI|SplitPaneUI|Spring|SpringLayout|SQLData|SQLException|SQLInput|SQLOutput|SQLPermission|SQLWarning|SSLContext|SSLContextSpi|SSLException|SSLHandshakeException|SSLKeyException|SSLPeerUnverifiedException|SSLPermission|SSLProtocolException|SSLServerSocket|SSLServerSocketFactory|SSLSession|SSLSessionBindingEvent|SSLSessionBindingListener|SSLSessionContext|SSLSocket|SSLSocketFactory|Stack|StackOverflowError|StackTraceElement|StartTlsRequest|StartTlsResponse|State|StateEdit|StateEditable|StateFactory|Statement|Streamable|StreamableValue|StreamCorruptedException|StreamHandler|StreamPrintService|StreamPrintServiceFactory|StreamResult|StreamSource|StreamTokenizer|StrictMath|String|StringBuffer|StringBufferInputStream|StringCharacterIterator|StringContent|StringHolder|StringIndexOutOfBoundsException|StringNameHelper|StringReader|StringRefAddr|StringSelection|StringSeqHelper|StringSeqHolder|StringTokenizer|StringValueHelper|StringWriter|Stroke|Struct|StructMember|StructMemberHelper|Stub|StubDelegate|StubNotFoundException|Style|StyleConstants|StyleContext|StyledDocument|StyledEditorKit|StyleSheet|Subject|SubjectDomainCombiner|SUCCESSFUL|SupportedValuesAttribute|SwingConstants|SwingPropertyChangeSupport|SwingUtilities|SYNC_WITH_TRANSPORT|SyncFailedException|SyncScopeHelper|Synthesizer|SysexMessage|System|SYSTEM_EXCEPTION|SystemColor|SystemException|SystemFlavorMap|TabableView|TabbedPaneUI|TabExpander|TableCellEditor|TableCellRenderer|TableColumn|TableColumnModel|TableColumnModelEvent|TableColumnModelListener|TableHeaderUI|TableModel|TableModelEvent|TableModelListener|TableUI|TableView|TabSet|TabStop|TAG_ALTERNATE_IIOP_ADDRESS|TAG_CODE_SETS|TAG_INTERNET_IOP|TAG_JAVA_CODEBASE|TAG_MULTIPLE_COMPONENTS|TAG_ORB_TYPE|TAG_POLICIES|TagElement|TaggedComponent|TaggedComponentHelper|TaggedComponentHolder|TaggedProfile|TaggedProfileHelper|TaggedProfileHolder|TargetDataLine|TCKind|Templates|TemplatesHandler|Text|TextAction|TextArea|TextAttribute|TextComponent|TextEvent|TextField|TextHitInfo|TextInputCallback|TextLayout|TextListener|TextMeasurer|TextOutputCallback|TextSyntax|TextUI|TexturePaint|Thread|THREAD_POLICY_ID|ThreadDeath|ThreadGroup|ThreadLocal|ThreadPolicy|ThreadPolicyOperations|ThreadPolicyValue|Throwable|Tie|TileObserver|Time|TimeLimitExceededException|Timer|TimerTask|Timestamp|TimeZone|TitledBorder|ToolBarUI|Toolkit|ToolTipManager|ToolTipUI|TooManyListenersException|Track|TRANSACTION_REQUIRED|TRANSACTION_ROLLEDBACK|TransactionRequiredException|TransactionRolledbackException|TransactionService|Transferable|TransferHandler|TransformAttribute|Transformer|TransformerConfigurationException|TransformerException|TransformerFactory|TransformerFactoryConfigurationError|TransformerHandler|TRANSIENT|Transmitter|Transparency|TRANSPORT_RETRY|TreeCellEditor|TreeCellRenderer|TreeExpansionEvent|TreeExpansionListener|TreeMap|TreeModel|TreeModelEvent|TreeModelListener|TreeNode|TreePath|TreeSelectionEvent|TreeSelectionListener|TreeSelectionModel|TreeSet|TreeUI|TreeWillExpandListener|TrustAnchor|TrustManager|TrustManagerFactory|TrustManagerFactorySpi|TypeCode|TypeCodeHolder|TypeMismatch|TypeMismatchHelper|Types|UID|UIDefaults|UIManager|UIResource|ULongLongSeqHelper|ULongLongSeqHolder|ULongSeqHelper|ULongSeqHolder|UndeclaredThrowableException|UndoableEdit|UndoableEditEvent|UndoableEditListener|UndoableEditSupport|UndoManager|UnexpectedException|UnicastRemoteObject|UnionMember|UnionMemberHelper|UNKNOWN|UnknownEncoding|UnknownEncodingHelper|UnknownError|UnknownException|UnknownGroupException|UnknownHostException|UnknownObjectException|UnknownServiceException|UnknownUserException|UnknownUserExceptionHelper|UnknownUserExceptionHolder|UnmappableCharacterException|UnmarshalException|UnmodifiableSetException|UnrecoverableKeyException|Unreferenced|UnresolvedAddressException|UnresolvedPermission|UnsatisfiedLinkError|UnsolicitedNotification|UnsolicitedNotificationEvent|UnsolicitedNotificationListener|UNSUPPORTED_POLICY|UNSUPPORTED_POLICY_VALUE|UnsupportedAddressTypeException|UnsupportedAudioFileException|UnsupportedCallbackException|UnsupportedCharsetException|UnsupportedClassVersionError|UnsupportedEncodingException|UnsupportedFlavorException|UnsupportedLookAndFeelException|UnsupportedOperationException|URI|URIException|URIResolver|URISyntax|URISyntaxException|URL|URLClassLoader|URLConnection|URLDecoder|URLEncoder|URLStreamHandler|URLStreamHandlerFactory|URLStringHelper|USER_EXCEPTION|UserException|UShortSeqHelper|UShortSeqHolder|UTFDataFormatException|Util|UtilDelegate|Utilities|ValueBase|ValueBaseHelper|ValueBaseHolder|ValueFactory|ValueHandler|ValueMember|ValueMemberHelper|VariableHeightLayoutCache|Vector|VerifyError|VersionSpecHelper|VetoableChangeListener|VetoableChangeListenerProxy|VetoableChangeSupport|View|ViewFactory|ViewportLayout|ViewportUI|VirtualMachineError|Visibility|VisibilityHelper|VM_ABSTRACT|VM_CUSTOM|VM_NONE|VM_TRUNCATABLE|VMID|VoiceStatus|Void|VolatileImage|WCharSeqHelper|WCharSeqHolder|WeakHashMap|WeakReference|Window|WindowAdapter|WindowConstants|WindowEvent|WindowFocusListener|WindowListener|WindowStateListener|WrappedPlainView|WritableByteChannel|WritableRaster|WritableRenderedImage|WriteAbortedException|Writer|WrongAdapter|WrongAdapterHelper|WrongPolicy|WrongPolicyHelper|WrongTransaction|WrongTransactionHelper|WrongTransactionHolder|WStringSeqHelper|WStringSeqHolder|WStringValueHelper|X500Principal|X500PrivateCredential|X509Certificate|X509CertSelector|X509CRL|X509CRLEntry|X509CRLSelector|X509EncodedKeySpec|X509Extension|X509KeyManager|X509TrustManager|XAConnection|XADataSource|XAException|XAResource|Xid|XMLDecoder|XMLEncoder|XMLFilter|XMLFilterImpl|XMLFormatter|XMLReader|XMLReaderAdapter|XMLReaderFactory|ZipEntry|ZipException|ZipFile|ZipInputStream|ZipOutputStream|ZoneView|_BindingIteratorImplBase|_BindingIteratorStub|_DynAnyFactoryStub|_DynAnyStub|_DynArrayStub|_DynEnumStub|_DynFixedStub|_DynSequenceStub|_DynStructStub|_DynUnionStub|_DynValueStub|_IDLTypeStub|_NamingContextExtStub|_NamingContextImplBase|_NamingContextStub|_PolicyStub|_Remote_Stub|_ServantActivatorStub|_ServantLocatorStub)$/',
- ),
- 8 =>
- array (
- ),
- 9 =>
- array (
- ),
- 10 =>
- array (
- ),
- 11 =>
- array (
- ),
- 12 =>
- array (
- ),
- ),
- 1 =>
- array (
- 0 => -1,
- 1 => -1,
- 2 => -1,
- 3 => -1,
- 4 => -1,
- 5 => -1,
- 6 => -1,
- 7 =>
- array (
- 'types' => '/^(boolean|byte|char|const|double|final|float|int|long|short|static|void)$/',
- 'reserved' => '/^(import|package|abstract|break|case|catch|class|continue|default|do|else|extends|false|finally|for|goto|if|implements|instanceof|interface|native|new|null|private|protected|public|return|super|strictfp|switch|synchronized|this|throws|throw|transient|true|try|volatile|while)$/',
- 'builtin' => '/^(AbstractAction|AbstractBorder|AbstractButton|AbstractCellEditor|AbstractCollection|AbstractColorChooserPanel|AbstractDocument|AbstractInterruptibleChannel|AbstractLayoutCache|AbstractList|AbstractListModel|AbstractMap|AbstractMethodError|AbstractPreferences|AbstractSelectableChannel|AbstractSelectionKey|AbstractSelector|AbstractSequentialList|AbstractSet|AbstractSpinnerModel|AbstractTableModel|AbstractUndoableEdit|AbstractWriter|AccessControlContext|AccessControlException|AccessController|AccessException|Accessible|AccessibleAction|AccessibleBundle|AccessibleComponent|AccessibleContext|AccessibleEditableText|AccessibleExtendedComponent|AccessibleExtendedTable|AccessibleHyperlink|AccessibleHypertext|AccessibleIcon|AccessibleKeyBinding|AccessibleObject|AccessibleRelation|AccessibleRelationSet|AccessibleResourceBundle|AccessibleRole|AccessibleSelection|AccessibleState|AccessibleStateSet|AccessibleTable|AccessibleTableModelChange|AccessibleText|AccessibleValue|AccountExpiredException|Acl|AclEntry|AclNotFoundException|Action|ActionEvent|ActionListener|ActionMap|ActionMapUIResource|Activatable|ActivateFailedException|ActivationDesc|ActivationException|ActivationGroup|ActivationGroup_Stub|ActivationGroupDesc|ActivationGroupID|ActivationID|ActivationInstantiator|ActivationMonitor|ActivationSystem|Activator|ActiveEvent|AdapterActivator|AdapterActivatorOperations|AdapterAlreadyExists|AdapterAlreadyExistsHelper|AdapterInactive|AdapterInactiveHelper|AdapterNonExistent|AdapterNonExistentHelper|AddressHelper|Adjustable|AdjustmentEvent|AdjustmentListener|Adler32|AffineTransform|AffineTransformOp|AlgorithmParameterGenerator|AlgorithmParameterGeneratorSpi|AlgorithmParameters|AlgorithmParameterSpec|AlgorithmParametersSpi|AllPermission|AlphaComposite|AlreadyBound|AlreadyBoundException|AlreadyBoundHelper|AlreadyBoundHolder|AlreadyConnectedException|AncestorEvent|AncestorListener|Annotation|Any|AnyHolder|AnySeqHelper|AnySeqHolder|AppConfigurationEntry|Applet|AppletContext|AppletInitializer|AppletStub|ApplicationException|Arc2D|Area|AreaAveragingScaleFilter|ARG_IN|ARG_INOUT|ARG_OUT|ArithmeticException|Array|ArrayIndexOutOfBoundsException|ArrayList|Arrays|ArrayStoreException|AssertionError|AsyncBoxView|AsynchronousCloseException|Attr|Attribute|AttributedCharacterIterator|AttributedString|AttributeException|AttributeInUseException|AttributeList|AttributeListImpl|AttributeModificationException|Attributes|AttributeSet|AttributeSetUtilities|AttributesImpl|AudioClip|AudioFileFormat|AudioFileReader|AudioFileWriter|AudioFormat|AudioInputStream|AudioPermission|AudioSystem|AuthenticationException|AuthenticationNotSupportedException|Authenticator|AuthPermission|Autoscroll|AWTError|AWTEvent|AWTEventListener|AWTEventListenerProxy|AWTEventMulticaster|AWTException|AWTKeyStroke|AWTPermission|BackingStoreException|BAD_CONTEXT|BAD_INV_ORDER|BAD_OPERATION|BAD_PARAM|BAD_POLICY|BAD_POLICY_TYPE|BAD_POLICY_VALUE|BAD_TYPECODE|BadKind|BadLocationException|BadPaddingException|BandCombineOp|BandedSampleModel|BasicArrowButton|BasicAttribute|BasicAttributes|BasicBorders|BasicButtonListener|BasicButtonUI|BasicCheckBoxMenuItemUI|BasicCheckBoxUI|BasicColorChooserUI|BasicComboBoxEditor|BasicComboBoxRenderer|BasicComboBoxUI|BasicComboPopup|BasicDesktopIconUI|BasicDesktopPaneUI|BasicDirectoryModel|BasicEditorPaneUI|BasicFileChooserUI|BasicFormattedTextFieldUI|BasicGraphicsUtils|BasicHTML|BasicIconFactory|BasicInternalFrameTitlePane|BasicInternalFrameUI|BasicLabelUI|BasicListUI|BasicLookAndFeel|BasicMenuBarUI|BasicMenuItemUI|BasicMenuUI|BasicOptionPaneUI|BasicPanelUI|BasicPasswordFieldUI|BasicPermission|BasicPopupMenuSeparatorUI|BasicPopupMenuUI|BasicProgressBarUI|BasicRadioButtonMenuItemUI|BasicRadioButtonUI|BasicRootPaneUI|BasicScrollBarUI|BasicScrollPaneUI|BasicSeparatorUI|BasicSliderUI|BasicSpinnerUI|BasicSplitPaneDivider|BasicSplitPaneUI|BasicStroke|BasicTabbedPaneUI|BasicTableHeaderUI|BasicTableUI|BasicTextAreaUI|BasicTextFieldUI|BasicTextPaneUI|BasicTextUI|BasicToggleButtonUI|BasicToolBarSeparatorUI|BasicToolBarUI|BasicToolTipUI|BasicTreeUI|BasicViewportUI|BatchUpdateException|BeanContext|BeanContextChild|BeanContextChildComponentProxy|BeanContextChildSupport|BeanContextContainerProxy|BeanContextEvent|BeanContextMembershipEvent|BeanContextMembershipListener|BeanContextProxy|BeanContextServiceAvailableEvent|BeanContextServiceProvider|BeanContextServiceProviderBeanInfo|BeanContextServiceRevokedEvent|BeanContextServiceRevokedListener|BeanContextServices|BeanContextServicesListener|BeanContextServicesSupport|BeanContextSupport|BeanDescriptor|BeanInfo|Beans|BevelBorder|Bidi|BigDecimal|BigInteger|BinaryRefAddr|BindException|Binding|BindingHelper|BindingHolder|BindingIterator|BindingIteratorHelper|BindingIteratorHolder|BindingIteratorOperations|BindingIteratorPOA|BindingListHelper|BindingListHolder|BindingType|BindingTypeHelper|BindingTypeHolder|BitSet|Blob|BlockView|Book|Boolean|BooleanControl|BooleanHolder|BooleanSeqHelper|BooleanSeqHolder|Border|BorderFactory|BorderLayout|BorderUIResource|BoundedRangeModel|Bounds|Box|BoxedValueHelper|BoxLayout|BoxView|BreakIterator|Buffer|BufferCapabilities|BufferedImage|BufferedImageFilter|BufferedImageOp|BufferedInputStream|BufferedOutputStream|BufferedReader|BufferedWriter|BufferOverflowException|BufferStrategy|BufferUnderflowException|Button|ButtonGroup|ButtonModel|ButtonUI|Byte|ByteArrayInputStream|ByteArrayOutputStream|ByteBuffer|ByteChannel|ByteHolder|ByteLookupTable|ByteOrder|Calendar|CallableStatement|Callback|CallbackHandler|CancelablePrintJob|CancelledKeyException|CannotProceed|CannotProceedException|CannotProceedHelper|CannotProceedHolder|CannotRedoException|CannotUndoException|Canvas|CardLayout|Caret|CaretEvent|CaretListener|CDATASection|CellEditor|CellEditorListener|CellRendererPane|Certificate|CertificateEncodingException|CertificateException|CertificateExpiredException|CertificateFactory|CertificateFactorySpi|CertificateNotYetValidException|CertificateParsingException|CertPath|CertPathBuilder|CertPathBuilderException|CertPathBuilderResult|CertPathBuilderSpi|CertPathParameters|CertPathValidator|CertPathValidatorException|CertPathValidatorResult|CertPathValidatorSpi|CertSelector|CertStore|CertStoreException|CertStoreParameters|CertStoreSpi|ChangedCharSetException|ChangeEvent|ChangeListener|Channel|ChannelBinding|Channels|Character|CharacterCodingException|CharacterData|CharacterIterator|CharArrayReader|CharArrayWriter|CharBuffer|CharConversionException|CharHolder|CharSeqHelper|CharSeqHolder|CharSequence|Charset|CharsetDecoder|CharsetEncoder|CharsetProvider|Checkbox|CheckboxGroup|CheckboxMenuItem|CheckedInputStream|CheckedOutputStream|Checksum|Choice|ChoiceCallback|ChoiceFormat|Chromaticity|Cipher|CipherInputStream|CipherOutputStream|CipherSpi|Class|ClassCastException|ClassCircularityError|ClassDesc|ClassFormatError|ClassLoader|ClassNotFoundException|ClientRequestInfo|ClientRequestInfoOperations|ClientRequestInterceptor|ClientRequestInterceptorOperations|Clip|Clipboard|ClipboardOwner|Clob|Cloneable|CloneNotSupportedException|ClosedByInterruptException|ClosedChannelException|ClosedSelectorException|CMMException|Codec|CodecFactory|CodecFactoryHelper|CodecFactoryOperations|CodecOperations|CoderMalfunctionError|CoderResult|CodeSets|CodeSource|CodingErrorAction|CollationElementIterator|CollationKey|Collator|Collection|CollectionCertStoreParameters|Collections|Color|ColorChooserComponentFactory|ColorChooserUI|ColorConvertOp|ColorModel|ColorSelectionModel|ColorSpace|ColorSupported|ColorUIResource|ComboBoxEditor|ComboBoxModel|ComboBoxUI|ComboPopup|COMM_FAILURE|Comment|CommunicationException|Comparable|Comparator|Compiler|CompletionStatus|CompletionStatusHelper|Component|ComponentAdapter|ComponentColorModel|ComponentEvent|ComponentIdHelper|ComponentInputMap|ComponentInputMapUIResource|ComponentListener|ComponentOrientation|ComponentSampleModel|ComponentUI|ComponentView|Composite|CompositeContext|CompositeName|CompositeView|CompoundBorder|CompoundControl|CompoundEdit|CompoundName|Compression|ConcurrentModificationException|Configuration|ConfigurationException|ConfirmationCallback|ConnectException|ConnectIOException|Connection|ConnectionEvent|ConnectionEventListener|ConnectionPendingException|ConnectionPoolDataSource|ConsoleHandler|Constructor|Container|ContainerAdapter|ContainerEvent|ContainerListener|ContainerOrderFocusTraversalPolicy|ContentHandler|ContentHandlerFactory|ContentModel|Context|ContextList|ContextNotEmptyException|ContextualRenderedImageFactory|Control|ControlFactory|ControllerEventListener|ConvolveOp|CookieHolder|Copies|CopiesSupported|CRC32|CredentialExpiredException|CRL|CRLException|CRLSelector|CropImageFilter|CSS|CTX_RESTRICT_SCOPE|CubicCurve2D|Currency|Current|CurrentHelper|CurrentHolder|CurrentOperations|Cursor|Customizer|CustomMarshal|CustomValue|DATA_CONVERSION|DatabaseMetaData|DataBuffer|DataBufferByte|DataBufferDouble|DataBufferFloat|DataBufferInt|DataBufferShort|DataBufferUShort|DataFlavor|DataFormatException|DatagramChannel|DatagramPacket|DatagramSocket|DatagramSocketImpl|DatagramSocketImplFactory|DataInput|DataInputStream|DataLine|DataOutput|DataOutputStream|DataSource|DataTruncation|Date|DateFormat|DateFormatSymbols|DateFormatter|DateTimeAtCompleted|DateTimeAtCreation|DateTimeAtProcessing|DateTimeSyntax|DebugGraphics|DecimalFormat|DecimalFormatSymbols|DeclHandler|DefaultBoundedRangeModel|DefaultButtonModel|DefaultCaret|DefaultCellEditor|DefaultColorSelectionModel|DefaultComboBoxModel|DefaultDesktopManager|DefaultEditorKit|DefaultFocusManager|DefaultFocusTraversalPolicy|DefaultFormatter|DefaultFormatterFactory|DefaultHandler|DefaultHighlighter|DefaultKeyboardFocusManager|DefaultListCellRenderer|DefaultListModel|DefaultListSelectionModel|DefaultMenuLayout|DefaultMetalTheme|DefaultMutableTreeNode|DefaultPersistenceDelegate|DefaultSingleSelectionModel|DefaultStyledDocument|DefaultTableCellRenderer|DefaultTableColumnModel|DefaultTableModel|DefaultTextUI|DefaultTreeCellEditor|DefaultTreeCellRenderer|DefaultTreeModel|DefaultTreeSelectionModel|DefinitionKind|DefinitionKindHelper|Deflater|DeflaterOutputStream|Delegate|DelegationPermission|DESedeKeySpec|DesignMode|DESKeySpec|DesktopIconUI|DesktopManager|DesktopPaneUI|Destination|Destroyable|DestroyFailedException|DGC|DHGenParameterSpec|DHKey|DHParameterSpec|DHPrivateKey|DHPrivateKeySpec|DHPublicKey|DHPublicKeySpec|Dialog|Dictionary|DigestException|DigestInputStream|DigestOutputStream|Dimension|Dimension2D|DimensionUIResource|DirContext|DirectColorModel|DirectoryManager|DirObjectFactory|DirStateFactory|DisplayMode|DnDConstants|Doc|DocAttribute|DocAttributeSet|DocFlavor|DocPrintJob|Document|DocumentBuilder|DocumentBuilderFactory|DocumentEvent|DocumentFilter|DocumentFragment|DocumentHandler|DocumentListener|DocumentName|DocumentParser|DocumentType|DomainCombiner|DomainManager|DomainManagerOperations|DOMException|DOMImplementation|DOMLocator|DOMResult|DOMSource|Double|DoubleBuffer|DoubleHolder|DoubleSeqHelper|DoubleSeqHolder|DragGestureEvent|DragGestureListener|DragGestureRecognizer|DragSource|DragSourceAdapter|DragSourceContext|DragSourceDragEvent|DragSourceDropEvent|DragSourceEvent|DragSourceListener|DragSourceMotionListener|Driver|DriverManager|DriverPropertyInfo|DropTarget|DropTargetAdapter|DropTargetContext|DropTargetDragEvent|DropTargetDropEvent|DropTargetEvent|DropTargetListener|DSAKey|DSAKeyPairGenerator|DSAParameterSpec|DSAParams|DSAPrivateKey|DSAPrivateKeySpec|DSAPublicKey|DSAPublicKeySpec|DTD|DTDConstants|DTDHandler|DuplicateName|DuplicateNameHelper|DynamicImplementation|DynAny|DynAnyFactory|DynAnyFactoryHelper|DynAnyFactoryOperations|DynAnyHelper|DynAnyOperations|DynAnySeqHelper|DynArray|DynArrayHelper|DynArrayOperations|DynEnum|DynEnumHelper|DynEnumOperations|DynFixed|DynFixedHelper|DynFixedOperations|DynSequence|DynSequenceHelper|DynSequenceOperations|DynStruct|DynStructHelper|DynStructOperations|DynUnion|DynUnionHelper|DynUnionOperations|DynValue|DynValueBox|DynValueBoxOperations|DynValueCommon|DynValueCommonOperations|DynValueHelper|DynValueOperations|EditorKit|Element|ElementIterator|Ellipse2D|EmptyBorder|EmptyStackException|EncodedKeySpec|Encoder|Encoding|ENCODING_CDR_ENCAPS|EncryptedPrivateKeyInfo|Entity|EntityReference|EntityResolver|EnumControl|Enumeration|EnumSyntax|Environment|EOFException|Error|ErrorHandler|ErrorListener|ErrorManager|EtchedBorder|Event|EventContext|EventDirContext|EventHandler|EventListener|EventListenerList|EventListenerProxy|EventObject|EventQueue|EventSetDescriptor|Exception|ExceptionInInitializerError|ExceptionList|ExceptionListener|ExemptionMechanism|ExemptionMechanismException|ExemptionMechanismSpi|ExpandVetoException|ExportException|Expression|ExtendedRequest|ExtendedResponse|Externalizable|FactoryConfigurationError|FailedLoginException|FeatureDescriptor|Fidelity|Field|FieldNameHelper|FieldPosition|FieldView|File|FileCacheImageInputStream|FileCacheImageOutputStream|FileChannel|FileChooserUI|FileDescriptor|FileDialog|FileFilter|FileHandler|FileImageInputStream|FileImageOutputStream|FileInputStream|FileLock|FileLockInterruptionException|FilenameFilter|FileNameMap|FileNotFoundException|FileOutputStream|FilePermission|FileReader|FileSystemView|FileView|FileWriter|Filter|FilteredImageSource|FilterInputStream|FilterOutputStream|FilterReader|FilterWriter|Finishings|FixedHeightLayoutCache|FixedHolder|FlatteningPathIterator|FlavorException|FlavorMap|FlavorTable|Float|FloatBuffer|FloatControl|FloatHolder|FloatSeqHelper|FloatSeqHolder|FlowLayout|FlowView|FocusAdapter|FocusEvent|FocusListener|FocusManager|FocusTraversalPolicy|Font|FontFormatException|FontMetrics|FontRenderContext|FontUIResource|Format|FormatConversionProvider|FormatMismatch|FormatMismatchHelper|Formatter|FormView|ForwardRequest|ForwardRequestHelper|Frame|FREE_MEM|GapContent|GatheringByteChannel|GeneralPath|GeneralSecurityException|GlyphJustificationInfo|GlyphMetrics|GlyphVector|GlyphView|GradientPaint|GraphicAttribute|Graphics|Graphics2D|GraphicsConfigTemplate|GraphicsConfiguration|GraphicsDevice|GraphicsEnvironment|GrayFilter|GregorianCalendar|GridBagConstraints|GridBagLayout|GridLayout|Group|GSSContext|GSSCredential|GSSException|GSSManager|GSSName|Guard|GuardedObject|GZIPInputStream|GZIPOutputStream|Handler|HandlerBase|HandshakeCompletedEvent|HandshakeCompletedListener|HasControls|HashAttributeSet|HashDocAttributeSet|HashMap|HashPrintJobAttributeSet|HashPrintRequestAttributeSet|HashPrintServiceAttributeSet|HashSet|Hashtable|HeadlessException|HierarchyBoundsAdapter|HierarchyBoundsListener|HierarchyEvent|HierarchyListener|Highlighter|HostnameVerifier|HTML|HTMLDocument|HTMLEditorKit|HTMLFrameHyperlinkEvent|HTMLWriter|HttpsURLConnection|HttpURLConnection|HyperlinkEvent|HyperlinkListener|ICC_ColorSpace|ICC_Profile|ICC_ProfileGray|ICC_ProfileRGB|Icon|IconUIResource|IconView|ID_ASSIGNMENT_POLICY_ID|ID_UNIQUENESS_POLICY_ID|IdAssignmentPolicy|IdAssignmentPolicyOperations|IdAssignmentPolicyValue|IdentifierHelper|Identity|IdentityHashMap|IdentityScope|IDLEntity|IDLType|IDLTypeHelper|IDLTypeOperations|IdUniquenessPolicy|IdUniquenessPolicyOperations|IdUniquenessPolicyValue|IIOByteBuffer|IIOException|IIOImage|IIOInvalidTreeException|IIOMetadata|IIOMetadataController|IIOMetadataFormat|IIOMetadataFormatImpl|IIOMetadataNode|IIOParam|IIOParamController|IIOReadProgressListener|IIOReadUpdateListener|IIOReadWarningListener|IIORegistry|IIOServiceProvider|IIOWriteProgressListener|IIOWriteWarningListener|IllegalAccessError|IllegalAccessException|IllegalArgumentException|IllegalBlockingModeException|IllegalBlockSizeException|IllegalCharsetNameException|IllegalComponentStateException|IllegalMonitorStateException|IllegalPathStateException|IllegalSelectorException|IllegalStateException|IllegalThreadStateException|Image|ImageCapabilities|ImageConsumer|ImageFilter|ImageGraphicAttribute|ImageIcon|ImageInputStream|ImageInputStreamImpl|ImageInputStreamSpi|ImageIO|ImageObserver|ImageOutputStream|ImageOutputStreamImpl|ImageOutputStreamSpi|ImageProducer|ImageReader|ImageReaderSpi|ImageReaderWriterSpi|ImageReadParam|ImageTranscoder|ImageTranscoderSpi|ImageTypeSpecifier|ImageView|ImageWriteParam|ImageWriter|ImageWriterSpi|ImagingOpException|IMP_LIMIT|IMPLICIT_ACTIVATION_POLICY_ID|ImplicitActivationPolicy|ImplicitActivationPolicyOperations|ImplicitActivationPolicyValue|IncompatibleClassChangeError|InconsistentTypeCode|InconsistentTypeCodeHelper|IndexColorModel|IndexedPropertyDescriptor|IndexOutOfBoundsException|IndirectionException|Inet4Address|Inet6Address|InetAddress|InetSocketAddress|Inflater|InflaterInputStream|InheritableThreadLocal|InitialContext|InitialContextFactory|InitialContextFactoryBuilder|InitialDirContext|INITIALIZE|InitialLdapContext|InlineView|InputContext|InputEvent|InputMap|InputMapUIResource|InputMethod|InputMethodContext|InputMethodDescriptor|InputMethodEvent|InputMethodHighlight|InputMethodListener|InputMethodRequests|InputSource|InputStream|InputStreamReader|InputSubset|InputVerifier|Insets|InsetsUIResource|InstantiationError|InstantiationException|Instrument|InsufficientResourcesException|IntBuffer|Integer|IntegerSyntax|Interceptor|InterceptorOperations|INTERNAL|InternalError|InternalFrameAdapter|InternalFrameEvent|InternalFrameFocusTraversalPolicy|InternalFrameListener|InternalFrameUI|InternationalFormatter|InterruptedException|InterruptedIOException|InterruptedNamingException|InterruptibleChannel|INTF_REPOS|IntHolder|IntrospectionException|Introspector|INV_FLAG|INV_IDENT|INV_OBJREF|INV_POLICY|Invalid|INVALID_TRANSACTION|InvalidAddress|InvalidAddressHelper|InvalidAddressHolder|InvalidAlgorithmParameterException|InvalidAttributeIdentifierException|InvalidAttributesException|InvalidAttributeValueException|InvalidClassException|InvalidDnDOperationException|InvalidKeyException|InvalidKeySpecException|InvalidMarkException|InvalidMidiDataException|InvalidName|InvalidNameException|InvalidNameHelper|InvalidNameHolder|InvalidObjectException|InvalidParameterException|InvalidParameterSpecException|InvalidPolicy|InvalidPolicyHelper|InvalidPreferencesFormatException|InvalidSearchControlsException|InvalidSearchFilterException|InvalidSeq|InvalidSlot|InvalidSlotHelper|InvalidTransactionException|InvalidTypeForEncoding|InvalidTypeForEncodingHelper|InvalidValue|InvalidValueHelper|InvocationEvent|InvocationHandler|InvocationTargetException|InvokeHandler|IOException|IOR|IORHelper|IORHolder|IORInfo|IORInfoOperations|IORInterceptor|IORInterceptorOperations|IRObject|IRObjectOperations|IstringHelper|ItemEvent|ItemListener|ItemSelectable|Iterator|IvParameterSpec|JApplet|JarEntry|JarException|JarFile|JarInputStream|JarOutputStream|JarURLConnection|JButton|JCheckBox|JCheckBoxMenuItem|JColorChooser|JComboBox|JComponent|JDesktopPane|JDialog|JEditorPane|JFileChooser|JFormattedTextField|JFrame|JInternalFrame|JLabel|JLayeredPane|JList|JMenu|JMenuBar|JMenuItem|JobAttributes|JobHoldUntil|JobImpressions|JobImpressionsCompleted|JobImpressionsSupported|JobKOctets|JobKOctetsProcessed|JobKOctetsSupported|JobMediaSheets|JobMediaSheetsCompleted|JobMediaSheetsSupported|JobMessageFromOperator|JobName|JobOriginatingUserName|JobPriority|JobPrioritySupported|JobSheets|JobState|JobStateReason|JobStateReasons|JOptionPane|JPanel|JPasswordField|JPEGHuffmanTable|JPEGImageReadParam|JPEGImageWriteParam|JPEGQTable|JPopupMenu|JProgressBar|JRadioButton|JRadioButtonMenuItem|JRootPane|JScrollBar|JScrollPane|JSeparator|JSlider|JSpinner|JSplitPane|JTabbedPane|JTable|JTableHeader|JTextArea|JTextComponent|JTextField|JTextPane|JToggleButton|JToolBar|JToolTip|JTree|JViewport|JWindow|KerberosKey|KerberosPrincipal|KerberosTicket|Kernel|Key|KeyAdapter|KeyAgreement|KeyAgreementSpi|KeyboardFocusManager|KeyEvent|KeyEventDispatcher|KeyEventPostProcessor|KeyException|KeyFactory|KeyFactorySpi|KeyGenerator|KeyGeneratorSpi|KeyListener|KeyManagementException|KeyManager|KeyManagerFactory|KeyManagerFactorySpi|Keymap|KeyPair|KeyPairGenerator|KeyPairGeneratorSpi|KeySpec|KeyStore|KeyStoreException|KeyStoreSpi|KeyStroke|Label|LabelUI|LabelView|LanguageCallback|LastOwnerException|LayeredHighlighter|LayoutFocusTraversalPolicy|LayoutManager|LayoutManager2|LayoutQueue|LDAPCertStoreParameters|LdapContext|LdapReferralException|Lease|Level|LexicalHandler|LIFESPAN_POLICY_ID|LifespanPolicy|LifespanPolicyOperations|LifespanPolicyValue|LimitExceededException|Line|Line2D|LineBorder|LineBreakMeasurer|LineEvent|LineListener|LineMetrics|LineNumberInputStream|LineNumberReader|LineUnavailableException|LinkageError|LinkedHashMap|LinkedHashSet|LinkedList|LinkException|LinkLoopException|LinkRef|List|ListCellRenderer|ListDataEvent|ListDataListener|ListIterator|ListModel|ListResourceBundle|ListSelectionEvent|ListSelectionListener|ListSelectionModel|ListUI|ListView|LoaderHandler|Locale|LocalObject|LocateRegistry|LOCATION_FORWARD|Locator|LocatorImpl|Logger|LoggingPermission|LoginContext|LoginException|LoginModule|LogManager|LogRecord|LogStream|Long|LongBuffer|LongHolder|LongLongSeqHelper|LongLongSeqHolder|LongSeqHelper|LongSeqHolder|LookAndFeel|LookupOp|LookupTable|Mac|MacSpi|MalformedInputException|MalformedLinkException|MalformedURLException|ManagerFactoryParameters|Manifest|Map|MappedByteBuffer|MARSHAL|MarshalException|MarshalledObject|MaskFormatter|Matcher|Math|MatteBorder|Media|MediaName|MediaPrintableArea|MediaSize|MediaSizeName|MediaTracker|MediaTray|Member|MemoryCacheImageInputStream|MemoryCacheImageOutputStream|MemoryHandler|MemoryImageSource|Menu|MenuBar|MenuBarUI|MenuComponent|MenuContainer|MenuDragMouseEvent|MenuDragMouseListener|MenuElement|MenuEvent|MenuItem|MenuItemUI|MenuKeyEvent|MenuKeyListener|MenuListener|MenuSelectionManager|MenuShortcut|MessageDigest|MessageDigestSpi|MessageFormat|MessageProp|MetaEventListener|MetalBorders|MetalButtonUI|MetalCheckBoxIcon|MetalCheckBoxUI|MetalComboBoxButton|MetalComboBoxEditor|MetalComboBoxIcon|MetalComboBoxUI|MetalDesktopIconUI|MetalFileChooserUI|MetalIconFactory|MetalInternalFrameTitlePane|MetalInternalFrameUI|MetalLabelUI|MetalLookAndFeel|MetalPopupMenuSeparatorUI|MetalProgressBarUI|MetalRadioButtonUI|MetalRootPaneUI|MetalScrollBarUI|MetalScrollButton|MetalScrollPaneUI|MetalSeparatorUI|MetalSliderUI|MetalSplitPaneUI|MetalTabbedPaneUI|MetalTextFieldUI|MetalTheme|MetalToggleButtonUI|MetalToolBarUI|MetalToolTipUI|MetalTreeUI|MetaMessage|Method|MethodDescriptor|MidiChannel|MidiDevice|MidiDeviceProvider|MidiEvent|MidiFileFormat|MidiFileReader|MidiFileWriter|MidiMessage|MidiSystem|MidiUnavailableException|MimeTypeParseException|MinimalHTMLWriter|MissingResourceException|Mixer|MixerProvider|ModificationItem|Modifier|MouseAdapter|MouseDragGestureRecognizer|MouseEvent|MouseInputAdapter|MouseInputListener|MouseListener|MouseMotionAdapter|MouseMotionListener|MouseWheelEvent|MouseWheelListener|MultiButtonUI|MulticastSocket|MultiColorChooserUI|MultiComboBoxUI|MultiDesktopIconUI|MultiDesktopPaneUI|MultiDoc|MultiDocPrintJob|MultiDocPrintService|MultiFileChooserUI|MultiInternalFrameUI|MultiLabelUI|MultiListUI|MultiLookAndFeel|MultiMenuBarUI|MultiMenuItemUI|MultiOptionPaneUI|MultiPanelUI|MultiPixelPackedSampleModel|MultipleComponentProfileHelper|MultipleComponentProfileHolder|MultipleDocumentHandling|MultipleMaster|MultiPopupMenuUI|MultiProgressBarUI|MultiRootPaneUI|MultiScrollBarUI|MultiScrollPaneUI|MultiSeparatorUI|MultiSliderUI|MultiSpinnerUI|MultiSplitPaneUI|MultiTabbedPaneUI|MultiTableHeaderUI|MultiTableUI|MultiTextUI|MultiToolBarUI|MultiToolTipUI|MultiTreeUI|MultiViewportUI|MutableAttributeSet|MutableComboBoxModel|MutableTreeNode|Name|NameAlreadyBoundException|NameCallback|NameClassPair|NameComponent|NameComponentHelper|NameComponentHolder|NamedNodeMap|NamedValue|NameDynAnyPair|NameDynAnyPairHelper|NameDynAnyPairSeqHelper|NameHelper|NameHolder|NameNotFoundException|NameParser|NamespaceChangeListener|NamespaceSupport|NameValuePair|NameValuePairHelper|NameValuePairSeqHelper|Naming|NamingContext|NamingContextExt|NamingContextExtHelper|NamingContextExtHolder|NamingContextExtOperations|NamingContextExtPOA|NamingContextHelper|NamingContextHolder|NamingContextOperations|NamingContextPOA|NamingEnumeration|NamingEvent|NamingException|NamingExceptionEvent|NamingListener|NamingManager|NamingSecurityException|NavigationFilter|NegativeArraySizeException|NetPermission|NetworkInterface|NO_IMPLEMENT|NO_MEMORY|NO_PERMISSION|NO_RESOURCES|NO_RESPONSE|NoClassDefFoundError|NoConnectionPendingException|NoContext|NoContextHelper|Node|NodeChangeEvent|NodeChangeListener|NodeList|NoInitialContextException|NoninvertibleTransformException|NonReadableChannelException|NonWritableChannelException|NoPermissionException|NoRouteToHostException|NoServant|NoServantHelper|NoSuchAlgorithmException|NoSuchAttributeException|NoSuchElementException|NoSuchFieldError|NoSuchFieldException|NoSuchMethodError|NoSuchMethodException|NoSuchObjectException|NoSuchPaddingException|NoSuchProviderException|NotActiveException|Notation|NotBoundException|NotContextException|NotEmpty|NotEmptyHelper|NotEmptyHolder|NotFound|NotFoundHelper|NotFoundHolder|NotFoundReason|NotFoundReasonHelper|NotFoundReasonHolder|NotOwnerException|NotSerializableException|NotYetBoundException|NotYetConnectedException|NullCipher|NullPointerException|Number|NumberFormat|NumberFormatException|NumberFormatter|NumberOfDocuments|NumberOfInterveningJobs|NumberUp|NumberUpSupported|NumericShaper|NVList|OBJ_ADAPTER|Object|OBJECT_NOT_EXIST|ObjectAlreadyActive|ObjectAlreadyActiveHelper|ObjectChangeListener|ObjectFactory|ObjectFactoryBuilder|ObjectHelper|ObjectHolder|ObjectIdHelper|ObjectImpl|ObjectInput|ObjectInputStream|ObjectInputValidation|ObjectNotActive|ObjectNotActiveHelper|ObjectOutput|ObjectOutputStream|ObjectStreamClass|ObjectStreamConstants|ObjectStreamException|ObjectStreamField|ObjectView|ObjID|Observable|Observer|OctetSeqHelper|OctetSeqHolder|Oid|OMGVMCID|OpenType|Operation|OperationNotSupportedException|Option|OptionalDataException|OptionPaneUI|ORB|ORBInitializer|ORBInitializerOperations|ORBInitInfo|ORBInitInfoOperations|OrientationRequested|OutOfMemoryError|OutputDeviceAssigned|OutputKeys|OutputStream|OutputStreamWriter|OverlappingFileLockException|OverlayLayout|Owner|Package|PackedColorModel|Pageable|PageAttributes|PageFormat|PageRanges|PagesPerMinute|PagesPerMinuteColor|Paint|PaintContext|PaintEvent|Panel|PanelUI|Paper|ParagraphView|Parameter|ParameterBlock|ParameterDescriptor|ParameterMetaData|ParameterMode|ParameterModeHelper|ParameterModeHolder|ParseException|ParsePosition|Parser|ParserAdapter|ParserConfigurationException|ParserDelegator|ParserFactory|PartialResultException|PasswordAuthentication|PasswordCallback|PasswordView|Patch|PathIterator|Pattern|PatternSyntaxException|PBEKey|PBEKeySpec|PBEParameterSpec|PDLOverrideSupported|Permission|PermissionCollection|Permissions|PERSIST_STORE|PersistenceDelegate|PhantomReference|Pipe|PipedInputStream|PipedOutputStream|PipedReader|PipedWriter|PixelGrabber|PixelInterleavedSampleModel|PKCS8EncodedKeySpec|PKIXBuilderParameters|PKIXCertPathBuilderResult|PKIXCertPathChecker|PKIXCertPathValidatorResult|PKIXParameters|PlainDocument|PlainView|POA|POAHelper|POAManager|POAManagerOperations|POAOperations|Point|Point2D|Policy|PolicyError|PolicyErrorCodeHelper|PolicyErrorHelper|PolicyErrorHolder|PolicyFactory|PolicyFactoryOperations|PolicyHelper|PolicyHolder|PolicyListHelper|PolicyListHolder|PolicyNode|PolicyOperations|PolicyQualifierInfo|PolicyTypeHelper|Polygon|PooledConnection|Popup|PopupFactory|PopupMenu|PopupMenuEvent|PopupMenuListener|PopupMenuUI|Port|PortableRemoteObject|PortableRemoteObjectDelegate|PortUnreachableException|Position|PreferenceChangeEvent|PreferenceChangeListener|Preferences|PreferencesFactory|PreparedStatement|PresentationDirection|Principal|PrincipalHolder|Printable|PrinterAbortException|PrinterException|PrinterGraphics|PrinterInfo|PrinterIOException|PrinterIsAcceptingJobs|PrinterJob|PrinterLocation|PrinterMakeAndModel|PrinterMessageFromOperator|PrinterMoreInfo|PrinterMoreInfoManufacturer|PrinterName|PrinterResolution|PrinterState|PrinterStateReason|PrinterStateReasons|PrinterURI|PrintEvent|PrintException|PrintGraphics|PrintJob|PrintJobAdapter|PrintJobAttribute|PrintJobAttributeEvent|PrintJobAttributeListener|PrintJobAttributeSet|PrintJobEvent|PrintJobListener|PrintQuality|PrintRequestAttribute|PrintRequestAttributeSet|PrintService|PrintServiceAttribute|PrintServiceAttributeEvent|PrintServiceAttributeListener|PrintServiceAttributeSet|PrintServiceLookup|PrintStream|PrintWriter|PRIVATE_MEMBER|PrivateCredentialPermission|PrivateKey|PrivilegedAction|PrivilegedActionException|PrivilegedExceptionAction|Process|ProcessingInstruction|ProfileDataException|ProfileIdHelper|ProgressBarUI|ProgressMonitor|ProgressMonitorInputStream|Properties|PropertyChangeEvent|PropertyChangeListener|PropertyChangeListenerProxy|PropertyChangeSupport|PropertyDescriptor|PropertyEditor|PropertyEditorManager|PropertyEditorSupport|PropertyPermission|PropertyResourceBundle|PropertyVetoException|ProtectionDomain|ProtocolException|Provider|ProviderException|Proxy|PSSParameterSpec|PUBLIC_MEMBER|PublicKey|PushbackInputStream|PushbackReader|QuadCurve2D|QueuedJobCount|Random|RandomAccess|RandomAccessFile|Raster|RasterFormatException|RasterOp|RC2ParameterSpec|RC5ParameterSpec|ReadableByteChannel|Reader|ReadOnlyBufferException|Receiver|Rectangle|Rectangle2D|RectangularShape|Ref|RefAddr|Reference|Referenceable|ReferenceQueue|ReferenceUriSchemesSupported|ReferralException|ReflectPermission|Refreshable|RefreshFailedException|RegisterableService|Registry|RegistryHandler|RemarshalException|Remote|RemoteCall|RemoteException|RemoteObject|RemoteRef|RemoteServer|RemoteStub|RenderableImage|RenderableImageOp|RenderableImageProducer|RenderContext|RenderedImage|RenderedImageFactory|Renderer|RenderingHints|RepaintManager|ReplicateScaleFilter|RepositoryIdHelper|Request|REQUEST_PROCESSING_POLICY_ID|RequestInfo|RequestInfoOperations|RequestingUserName|RequestProcessingPolicy|RequestProcessingPolicyOperations|RequestProcessingPolicyValue|RescaleOp|ResolutionSyntax|Resolver|ResolveResult|ResourceBundle|ResponseHandler|Result|ResultSet|ResultSetMetaData|ReverbType|RGBImageFilter|RMIClassLoader|RMIClassLoaderSpi|RMIClientSocketFactory|RMIFailureHandler|RMISecurityException|RMISecurityManager|RMIServerSocketFactory|RMISocketFactory|Robot|RootPaneContainer|RootPaneUI|RoundRectangle2D|RowMapper|RowSet|RowSetEvent|RowSetInternal|RowSetListener|RowSetMetaData|RowSetReader|RowSetWriter|RSAKey|RSAKeyGenParameterSpec|RSAMultiPrimePrivateCrtKey|RSAMultiPrimePrivateCrtKeySpec|RSAOtherPrimeInfo|RSAPrivateCrtKey|RSAPrivateCrtKeySpec|RSAPrivateKey|RSAPrivateKeySpec|RSAPublicKey|RSAPublicKeySpec|RTFEditorKit|RuleBasedCollator|Runnable|Runtime|RunTime|RuntimeException|RunTimeOperations|RuntimePermission|SampleModel|Savepoint|SAXException|SAXNotRecognizedException|SAXNotSupportedException|SAXParseException|SAXParser|SAXParserFactory|SAXResult|SAXSource|SAXTransformerFactory|ScatteringByteChannel|SchemaViolationException|Scrollable|Scrollbar|ScrollBarUI|ScrollPane|ScrollPaneAdjustable|ScrollPaneConstants|ScrollPaneLayout|ScrollPaneUI|SealedObject|SearchControls|SearchResult|SecretKey|SecretKeyFactory|SecretKeyFactorySpi|SecretKeySpec|SecureClassLoader|SecureRandom|SecureRandomSpi|Security|SecurityException|SecurityManager|SecurityPermission|Segment|SelectableChannel|SelectionKey|Selector|SelectorProvider|SeparatorUI|Sequence|SequenceInputStream|Sequencer|Serializable|SerializablePermission|Servant|SERVANT_RETENTION_POLICY_ID|ServantActivator|ServantActivatorHelper|ServantActivatorOperations|ServantActivatorPOA|ServantAlreadyActive|ServantAlreadyActiveHelper|ServantLocator|ServantLocatorHelper|ServantLocatorOperations|ServantLocatorPOA|ServantManager|ServantManagerOperations|ServantNotActive|ServantNotActiveHelper|ServantObject|ServantRetentionPolicy|ServantRetentionPolicyOperations|ServantRetentionPolicyValue|ServerCloneException|ServerError|ServerException|ServerNotActiveException|ServerRef|ServerRequest|ServerRequestInfo|ServerRequestInfoOperations|ServerRequestInterceptor|ServerRequestInterceptorOperations|ServerRuntimeException|ServerSocket|ServerSocketChannel|ServerSocketFactory|ServiceContext|ServiceContextHelper|ServiceContextHolder|ServiceContextListHelper|ServiceContextListHolder|ServiceDetail|ServiceDetailHelper|ServiceIdHelper|ServiceInformation|ServiceInformationHelper|ServiceInformationHolder|ServicePermission|ServiceRegistry|ServiceUI|ServiceUIFactory|ServiceUnavailableException|Set|SetOfIntegerSyntax|SetOverrideType|SetOverrideTypeHelper|Severity|Shape|ShapeGraphicAttribute|SheetCollate|Short|ShortBuffer|ShortBufferException|ShortHolder|ShortLookupTable|ShortMessage|ShortSeqHelper|ShortSeqHolder|Sides|Signature|SignatureException|SignatureSpi|SignedObject|Signer|SimpleAttributeSet|SimpleBeanInfo|SimpleDateFormat|SimpleDoc|SimpleFormatter|SimpleTimeZone|SinglePixelPackedSampleModel|SingleSelectionModel|Size2DSyntax|SizeLimitExceededException|SizeRequirements|SizeSequence|Skeleton|SkeletonMismatchException|SkeletonNotFoundException|SliderUI|Socket|SocketAddress|SocketChannel|SocketException|SocketFactory|SocketHandler|SocketImpl|SocketImplFactory|SocketOptions|SocketPermission|SocketSecurityException|SocketTimeoutException|SoftBevelBorder|SoftReference|SortedMap|SortedSet|SortingFocusTraversalPolicy|Soundbank|SoundbankReader|SoundbankResource|Source|SourceDataLine|SourceLocator|SpinnerDateModel|SpinnerListModel|SpinnerModel|SpinnerNumberModel|SpinnerUI|SplitPaneUI|Spring|SpringLayout|SQLData|SQLException|SQLInput|SQLOutput|SQLPermission|SQLWarning|SSLContext|SSLContextSpi|SSLException|SSLHandshakeException|SSLKeyException|SSLPeerUnverifiedException|SSLPermission|SSLProtocolException|SSLServerSocket|SSLServerSocketFactory|SSLSession|SSLSessionBindingEvent|SSLSessionBindingListener|SSLSessionContext|SSLSocket|SSLSocketFactory|Stack|StackOverflowError|StackTraceElement|StartTlsRequest|StartTlsResponse|State|StateEdit|StateEditable|StateFactory|Statement|Streamable|StreamableValue|StreamCorruptedException|StreamHandler|StreamPrintService|StreamPrintServiceFactory|StreamResult|StreamSource|StreamTokenizer|StrictMath|String|StringBuffer|StringBufferInputStream|StringCharacterIterator|StringContent|StringHolder|StringIndexOutOfBoundsException|StringNameHelper|StringReader|StringRefAddr|StringSelection|StringSeqHelper|StringSeqHolder|StringTokenizer|StringValueHelper|StringWriter|Stroke|Struct|StructMember|StructMemberHelper|Stub|StubDelegate|StubNotFoundException|Style|StyleConstants|StyleContext|StyledDocument|StyledEditorKit|StyleSheet|Subject|SubjectDomainCombiner|SUCCESSFUL|SupportedValuesAttribute|SwingConstants|SwingPropertyChangeSupport|SwingUtilities|SYNC_WITH_TRANSPORT|SyncFailedException|SyncScopeHelper|Synthesizer|SysexMessage|System|SYSTEM_EXCEPTION|SystemColor|SystemException|SystemFlavorMap|TabableView|TabbedPaneUI|TabExpander|TableCellEditor|TableCellRenderer|TableColumn|TableColumnModel|TableColumnModelEvent|TableColumnModelListener|TableHeaderUI|TableModel|TableModelEvent|TableModelListener|TableUI|TableView|TabSet|TabStop|TAG_ALTERNATE_IIOP_ADDRESS|TAG_CODE_SETS|TAG_INTERNET_IOP|TAG_JAVA_CODEBASE|TAG_MULTIPLE_COMPONENTS|TAG_ORB_TYPE|TAG_POLICIES|TagElement|TaggedComponent|TaggedComponentHelper|TaggedComponentHolder|TaggedProfile|TaggedProfileHelper|TaggedProfileHolder|TargetDataLine|TCKind|Templates|TemplatesHandler|Text|TextAction|TextArea|TextAttribute|TextComponent|TextEvent|TextField|TextHitInfo|TextInputCallback|TextLayout|TextListener|TextMeasurer|TextOutputCallback|TextSyntax|TextUI|TexturePaint|Thread|THREAD_POLICY_ID|ThreadDeath|ThreadGroup|ThreadLocal|ThreadPolicy|ThreadPolicyOperations|ThreadPolicyValue|Throwable|Tie|TileObserver|Time|TimeLimitExceededException|Timer|TimerTask|Timestamp|TimeZone|TitledBorder|ToolBarUI|Toolkit|ToolTipManager|ToolTipUI|TooManyListenersException|Track|TRANSACTION_REQUIRED|TRANSACTION_ROLLEDBACK|TransactionRequiredException|TransactionRolledbackException|TransactionService|Transferable|TransferHandler|TransformAttribute|Transformer|TransformerConfigurationException|TransformerException|TransformerFactory|TransformerFactoryConfigurationError|TransformerHandler|TRANSIENT|Transmitter|Transparency|TRANSPORT_RETRY|TreeCellEditor|TreeCellRenderer|TreeExpansionEvent|TreeExpansionListener|TreeMap|TreeModel|TreeModelEvent|TreeModelListener|TreeNode|TreePath|TreeSelectionEvent|TreeSelectionListener|TreeSelectionModel|TreeSet|TreeUI|TreeWillExpandListener|TrustAnchor|TrustManager|TrustManagerFactory|TrustManagerFactorySpi|TypeCode|TypeCodeHolder|TypeMismatch|TypeMismatchHelper|Types|UID|UIDefaults|UIManager|UIResource|ULongLongSeqHelper|ULongLongSeqHolder|ULongSeqHelper|ULongSeqHolder|UndeclaredThrowableException|UndoableEdit|UndoableEditEvent|UndoableEditListener|UndoableEditSupport|UndoManager|UnexpectedException|UnicastRemoteObject|UnionMember|UnionMemberHelper|UNKNOWN|UnknownEncoding|UnknownEncodingHelper|UnknownError|UnknownException|UnknownGroupException|UnknownHostException|UnknownObjectException|UnknownServiceException|UnknownUserException|UnknownUserExceptionHelper|UnknownUserExceptionHolder|UnmappableCharacterException|UnmarshalException|UnmodifiableSetException|UnrecoverableKeyException|Unreferenced|UnresolvedAddressException|UnresolvedPermission|UnsatisfiedLinkError|UnsolicitedNotification|UnsolicitedNotificationEvent|UnsolicitedNotificationListener|UNSUPPORTED_POLICY|UNSUPPORTED_POLICY_VALUE|UnsupportedAddressTypeException|UnsupportedAudioFileException|UnsupportedCallbackException|UnsupportedCharsetException|UnsupportedClassVersionError|UnsupportedEncodingException|UnsupportedFlavorException|UnsupportedLookAndFeelException|UnsupportedOperationException|URI|URIException|URIResolver|URISyntax|URISyntaxException|URL|URLClassLoader|URLConnection|URLDecoder|URLEncoder|URLStreamHandler|URLStreamHandlerFactory|URLStringHelper|USER_EXCEPTION|UserException|UShortSeqHelper|UShortSeqHolder|UTFDataFormatException|Util|UtilDelegate|Utilities|ValueBase|ValueBaseHelper|ValueBaseHolder|ValueFactory|ValueHandler|ValueMember|ValueMemberHelper|VariableHeightLayoutCache|Vector|VerifyError|VersionSpecHelper|VetoableChangeListener|VetoableChangeListenerProxy|VetoableChangeSupport|View|ViewFactory|ViewportLayout|ViewportUI|VirtualMachineError|Visibility|VisibilityHelper|VM_ABSTRACT|VM_CUSTOM|VM_NONE|VM_TRUNCATABLE|VMID|VoiceStatus|Void|VolatileImage|WCharSeqHelper|WCharSeqHolder|WeakHashMap|WeakReference|Window|WindowAdapter|WindowConstants|WindowEvent|WindowFocusListener|WindowListener|WindowStateListener|WrappedPlainView|WritableByteChannel|WritableRaster|WritableRenderedImage|WriteAbortedException|Writer|WrongAdapter|WrongAdapterHelper|WrongPolicy|WrongPolicyHelper|WrongTransaction|WrongTransactionHelper|WrongTransactionHolder|WStringSeqHelper|WStringSeqHolder|WStringValueHelper|X500Principal|X500PrivateCredential|X509Certificate|X509CertSelector|X509CRL|X509CRLEntry|X509CRLSelector|X509EncodedKeySpec|X509Extension|X509KeyManager|X509TrustManager|XAConnection|XADataSource|XAException|XAResource|Xid|XMLDecoder|XMLEncoder|XMLFilter|XMLFilterImpl|XMLFormatter|XMLReader|XMLReaderAdapter|XMLReaderFactory|ZipEntry|ZipException|ZipFile|ZipInputStream|ZipOutputStream|ZoneView|_BindingIteratorImplBase|_BindingIteratorStub|_DynAnyFactoryStub|_DynAnyStub|_DynArrayStub|_DynEnumStub|_DynFixedStub|_DynSequenceStub|_DynStructStub|_DynUnionStub|_DynValueStub|_IDLTypeStub|_NamingContextExtStub|_NamingContextImplBase|_NamingContextStub|_PolicyStub|_Remote_Stub|_ServantActivatorStub|_ServantLocatorStub)$/',
- ),
- 8 =>
- array (
- ),
- 9 =>
- array (
- ),
- 10 =>
- array (
- ),
- 11 =>
- array (
- ),
- 12 =>
- array (
- ),
- ),
- 2 =>
- array (
- 0 => -1,
- 1 => -1,
- 2 => -1,
- 3 => -1,
- 4 => -1,
- 5 => -1,
- 6 => -1,
- 7 =>
- array (
- 'types' => '/^(boolean|byte|char|const|double|final|float|int|long|short|static|void)$/',
- 'reserved' => '/^(import|package|abstract|break|case|catch|class|continue|default|do|else|extends|false|finally|for|goto|if|implements|instanceof|interface|native|new|null|private|protected|public|return|super|strictfp|switch|synchronized|this|throws|throw|transient|true|try|volatile|while)$/',
- 'builtin' => '/^(AbstractAction|AbstractBorder|AbstractButton|AbstractCellEditor|AbstractCollection|AbstractColorChooserPanel|AbstractDocument|AbstractInterruptibleChannel|AbstractLayoutCache|AbstractList|AbstractListModel|AbstractMap|AbstractMethodError|AbstractPreferences|AbstractSelectableChannel|AbstractSelectionKey|AbstractSelector|AbstractSequentialList|AbstractSet|AbstractSpinnerModel|AbstractTableModel|AbstractUndoableEdit|AbstractWriter|AccessControlContext|AccessControlException|AccessController|AccessException|Accessible|AccessibleAction|AccessibleBundle|AccessibleComponent|AccessibleContext|AccessibleEditableText|AccessibleExtendedComponent|AccessibleExtendedTable|AccessibleHyperlink|AccessibleHypertext|AccessibleIcon|AccessibleKeyBinding|AccessibleObject|AccessibleRelation|AccessibleRelationSet|AccessibleResourceBundle|AccessibleRole|AccessibleSelection|AccessibleState|AccessibleStateSet|AccessibleTable|AccessibleTableModelChange|AccessibleText|AccessibleValue|AccountExpiredException|Acl|AclEntry|AclNotFoundException|Action|ActionEvent|ActionListener|ActionMap|ActionMapUIResource|Activatable|ActivateFailedException|ActivationDesc|ActivationException|ActivationGroup|ActivationGroup_Stub|ActivationGroupDesc|ActivationGroupID|ActivationID|ActivationInstantiator|ActivationMonitor|ActivationSystem|Activator|ActiveEvent|AdapterActivator|AdapterActivatorOperations|AdapterAlreadyExists|AdapterAlreadyExistsHelper|AdapterInactive|AdapterInactiveHelper|AdapterNonExistent|AdapterNonExistentHelper|AddressHelper|Adjustable|AdjustmentEvent|AdjustmentListener|Adler32|AffineTransform|AffineTransformOp|AlgorithmParameterGenerator|AlgorithmParameterGeneratorSpi|AlgorithmParameters|AlgorithmParameterSpec|AlgorithmParametersSpi|AllPermission|AlphaComposite|AlreadyBound|AlreadyBoundException|AlreadyBoundHelper|AlreadyBoundHolder|AlreadyConnectedException|AncestorEvent|AncestorListener|Annotation|Any|AnyHolder|AnySeqHelper|AnySeqHolder|AppConfigurationEntry|Applet|AppletContext|AppletInitializer|AppletStub|ApplicationException|Arc2D|Area|AreaAveragingScaleFilter|ARG_IN|ARG_INOUT|ARG_OUT|ArithmeticException|Array|ArrayIndexOutOfBoundsException|ArrayList|Arrays|ArrayStoreException|AssertionError|AsyncBoxView|AsynchronousCloseException|Attr|Attribute|AttributedCharacterIterator|AttributedString|AttributeException|AttributeInUseException|AttributeList|AttributeListImpl|AttributeModificationException|Attributes|AttributeSet|AttributeSetUtilities|AttributesImpl|AudioClip|AudioFileFormat|AudioFileReader|AudioFileWriter|AudioFormat|AudioInputStream|AudioPermission|AudioSystem|AuthenticationException|AuthenticationNotSupportedException|Authenticator|AuthPermission|Autoscroll|AWTError|AWTEvent|AWTEventListener|AWTEventListenerProxy|AWTEventMulticaster|AWTException|AWTKeyStroke|AWTPermission|BackingStoreException|BAD_CONTEXT|BAD_INV_ORDER|BAD_OPERATION|BAD_PARAM|BAD_POLICY|BAD_POLICY_TYPE|BAD_POLICY_VALUE|BAD_TYPECODE|BadKind|BadLocationException|BadPaddingException|BandCombineOp|BandedSampleModel|BasicArrowButton|BasicAttribute|BasicAttributes|BasicBorders|BasicButtonListener|BasicButtonUI|BasicCheckBoxMenuItemUI|BasicCheckBoxUI|BasicColorChooserUI|BasicComboBoxEditor|BasicComboBoxRenderer|BasicComboBoxUI|BasicComboPopup|BasicDesktopIconUI|BasicDesktopPaneUI|BasicDirectoryModel|BasicEditorPaneUI|BasicFileChooserUI|BasicFormattedTextFieldUI|BasicGraphicsUtils|BasicHTML|BasicIconFactory|BasicInternalFrameTitlePane|BasicInternalFrameUI|BasicLabelUI|BasicListUI|BasicLookAndFeel|BasicMenuBarUI|BasicMenuItemUI|BasicMenuUI|BasicOptionPaneUI|BasicPanelUI|BasicPasswordFieldUI|BasicPermission|BasicPopupMenuSeparatorUI|BasicPopupMenuUI|BasicProgressBarUI|BasicRadioButtonMenuItemUI|BasicRadioButtonUI|BasicRootPaneUI|BasicScrollBarUI|BasicScrollPaneUI|BasicSeparatorUI|BasicSliderUI|BasicSpinnerUI|BasicSplitPaneDivider|BasicSplitPaneUI|BasicStroke|BasicTabbedPaneUI|BasicTableHeaderUI|BasicTableUI|BasicTextAreaUI|BasicTextFieldUI|BasicTextPaneUI|BasicTextUI|BasicToggleButtonUI|BasicToolBarSeparatorUI|BasicToolBarUI|BasicToolTipUI|BasicTreeUI|BasicViewportUI|BatchUpdateException|BeanContext|BeanContextChild|BeanContextChildComponentProxy|BeanContextChildSupport|BeanContextContainerProxy|BeanContextEvent|BeanContextMembershipEvent|BeanContextMembershipListener|BeanContextProxy|BeanContextServiceAvailableEvent|BeanContextServiceProvider|BeanContextServiceProviderBeanInfo|BeanContextServiceRevokedEvent|BeanContextServiceRevokedListener|BeanContextServices|BeanContextServicesListener|BeanContextServicesSupport|BeanContextSupport|BeanDescriptor|BeanInfo|Beans|BevelBorder|Bidi|BigDecimal|BigInteger|BinaryRefAddr|BindException|Binding|BindingHelper|BindingHolder|BindingIterator|BindingIteratorHelper|BindingIteratorHolder|BindingIteratorOperations|BindingIteratorPOA|BindingListHelper|BindingListHolder|BindingType|BindingTypeHelper|BindingTypeHolder|BitSet|Blob|BlockView|Book|Boolean|BooleanControl|BooleanHolder|BooleanSeqHelper|BooleanSeqHolder|Border|BorderFactory|BorderLayout|BorderUIResource|BoundedRangeModel|Bounds|Box|BoxedValueHelper|BoxLayout|BoxView|BreakIterator|Buffer|BufferCapabilities|BufferedImage|BufferedImageFilter|BufferedImageOp|BufferedInputStream|BufferedOutputStream|BufferedReader|BufferedWriter|BufferOverflowException|BufferStrategy|BufferUnderflowException|Button|ButtonGroup|ButtonModel|ButtonUI|Byte|ByteArrayInputStream|ByteArrayOutputStream|ByteBuffer|ByteChannel|ByteHolder|ByteLookupTable|ByteOrder|Calendar|CallableStatement|Callback|CallbackHandler|CancelablePrintJob|CancelledKeyException|CannotProceed|CannotProceedException|CannotProceedHelper|CannotProceedHolder|CannotRedoException|CannotUndoException|Canvas|CardLayout|Caret|CaretEvent|CaretListener|CDATASection|CellEditor|CellEditorListener|CellRendererPane|Certificate|CertificateEncodingException|CertificateException|CertificateExpiredException|CertificateFactory|CertificateFactorySpi|CertificateNotYetValidException|CertificateParsingException|CertPath|CertPathBuilder|CertPathBuilderException|CertPathBuilderResult|CertPathBuilderSpi|CertPathParameters|CertPathValidator|CertPathValidatorException|CertPathValidatorResult|CertPathValidatorSpi|CertSelector|CertStore|CertStoreException|CertStoreParameters|CertStoreSpi|ChangedCharSetException|ChangeEvent|ChangeListener|Channel|ChannelBinding|Channels|Character|CharacterCodingException|CharacterData|CharacterIterator|CharArrayReader|CharArrayWriter|CharBuffer|CharConversionException|CharHolder|CharSeqHelper|CharSeqHolder|CharSequence|Charset|CharsetDecoder|CharsetEncoder|CharsetProvider|Checkbox|CheckboxGroup|CheckboxMenuItem|CheckedInputStream|CheckedOutputStream|Checksum|Choice|ChoiceCallback|ChoiceFormat|Chromaticity|Cipher|CipherInputStream|CipherOutputStream|CipherSpi|Class|ClassCastException|ClassCircularityError|ClassDesc|ClassFormatError|ClassLoader|ClassNotFoundException|ClientRequestInfo|ClientRequestInfoOperations|ClientRequestInterceptor|ClientRequestInterceptorOperations|Clip|Clipboard|ClipboardOwner|Clob|Cloneable|CloneNotSupportedException|ClosedByInterruptException|ClosedChannelException|ClosedSelectorException|CMMException|Codec|CodecFactory|CodecFactoryHelper|CodecFactoryOperations|CodecOperations|CoderMalfunctionError|CoderResult|CodeSets|CodeSource|CodingErrorAction|CollationElementIterator|CollationKey|Collator|Collection|CollectionCertStoreParameters|Collections|Color|ColorChooserComponentFactory|ColorChooserUI|ColorConvertOp|ColorModel|ColorSelectionModel|ColorSpace|ColorSupported|ColorUIResource|ComboBoxEditor|ComboBoxModel|ComboBoxUI|ComboPopup|COMM_FAILURE|Comment|CommunicationException|Comparable|Comparator|Compiler|CompletionStatus|CompletionStatusHelper|Component|ComponentAdapter|ComponentColorModel|ComponentEvent|ComponentIdHelper|ComponentInputMap|ComponentInputMapUIResource|ComponentListener|ComponentOrientation|ComponentSampleModel|ComponentUI|ComponentView|Composite|CompositeContext|CompositeName|CompositeView|CompoundBorder|CompoundControl|CompoundEdit|CompoundName|Compression|ConcurrentModificationException|Configuration|ConfigurationException|ConfirmationCallback|ConnectException|ConnectIOException|Connection|ConnectionEvent|ConnectionEventListener|ConnectionPendingException|ConnectionPoolDataSource|ConsoleHandler|Constructor|Container|ContainerAdapter|ContainerEvent|ContainerListener|ContainerOrderFocusTraversalPolicy|ContentHandler|ContentHandlerFactory|ContentModel|Context|ContextList|ContextNotEmptyException|ContextualRenderedImageFactory|Control|ControlFactory|ControllerEventListener|ConvolveOp|CookieHolder|Copies|CopiesSupported|CRC32|CredentialExpiredException|CRL|CRLException|CRLSelector|CropImageFilter|CSS|CTX_RESTRICT_SCOPE|CubicCurve2D|Currency|Current|CurrentHelper|CurrentHolder|CurrentOperations|Cursor|Customizer|CustomMarshal|CustomValue|DATA_CONVERSION|DatabaseMetaData|DataBuffer|DataBufferByte|DataBufferDouble|DataBufferFloat|DataBufferInt|DataBufferShort|DataBufferUShort|DataFlavor|DataFormatException|DatagramChannel|DatagramPacket|DatagramSocket|DatagramSocketImpl|DatagramSocketImplFactory|DataInput|DataInputStream|DataLine|DataOutput|DataOutputStream|DataSource|DataTruncation|Date|DateFormat|DateFormatSymbols|DateFormatter|DateTimeAtCompleted|DateTimeAtCreation|DateTimeAtProcessing|DateTimeSyntax|DebugGraphics|DecimalFormat|DecimalFormatSymbols|DeclHandler|DefaultBoundedRangeModel|DefaultButtonModel|DefaultCaret|DefaultCellEditor|DefaultColorSelectionModel|DefaultComboBoxModel|DefaultDesktopManager|DefaultEditorKit|DefaultFocusManager|DefaultFocusTraversalPolicy|DefaultFormatter|DefaultFormatterFactory|DefaultHandler|DefaultHighlighter|DefaultKeyboardFocusManager|DefaultListCellRenderer|DefaultListModel|DefaultListSelectionModel|DefaultMenuLayout|DefaultMetalTheme|DefaultMutableTreeNode|DefaultPersistenceDelegate|DefaultSingleSelectionModel|DefaultStyledDocument|DefaultTableCellRenderer|DefaultTableColumnModel|DefaultTableModel|DefaultTextUI|DefaultTreeCellEditor|DefaultTreeCellRenderer|DefaultTreeModel|DefaultTreeSelectionModel|DefinitionKind|DefinitionKindHelper|Deflater|DeflaterOutputStream|Delegate|DelegationPermission|DESedeKeySpec|DesignMode|DESKeySpec|DesktopIconUI|DesktopManager|DesktopPaneUI|Destination|Destroyable|DestroyFailedException|DGC|DHGenParameterSpec|DHKey|DHParameterSpec|DHPrivateKey|DHPrivateKeySpec|DHPublicKey|DHPublicKeySpec|Dialog|Dictionary|DigestException|DigestInputStream|DigestOutputStream|Dimension|Dimension2D|DimensionUIResource|DirContext|DirectColorModel|DirectoryManager|DirObjectFactory|DirStateFactory|DisplayMode|DnDConstants|Doc|DocAttribute|DocAttributeSet|DocFlavor|DocPrintJob|Document|DocumentBuilder|DocumentBuilderFactory|DocumentEvent|DocumentFilter|DocumentFragment|DocumentHandler|DocumentListener|DocumentName|DocumentParser|DocumentType|DomainCombiner|DomainManager|DomainManagerOperations|DOMException|DOMImplementation|DOMLocator|DOMResult|DOMSource|Double|DoubleBuffer|DoubleHolder|DoubleSeqHelper|DoubleSeqHolder|DragGestureEvent|DragGestureListener|DragGestureRecognizer|DragSource|DragSourceAdapter|DragSourceContext|DragSourceDragEvent|DragSourceDropEvent|DragSourceEvent|DragSourceListener|DragSourceMotionListener|Driver|DriverManager|DriverPropertyInfo|DropTarget|DropTargetAdapter|DropTargetContext|DropTargetDragEvent|DropTargetDropEvent|DropTargetEvent|DropTargetListener|DSAKey|DSAKeyPairGenerator|DSAParameterSpec|DSAParams|DSAPrivateKey|DSAPrivateKeySpec|DSAPublicKey|DSAPublicKeySpec|DTD|DTDConstants|DTDHandler|DuplicateName|DuplicateNameHelper|DynamicImplementation|DynAny|DynAnyFactory|DynAnyFactoryHelper|DynAnyFactoryOperations|DynAnyHelper|DynAnyOperations|DynAnySeqHelper|DynArray|DynArrayHelper|DynArrayOperations|DynEnum|DynEnumHelper|DynEnumOperations|DynFixed|DynFixedHelper|DynFixedOperations|DynSequence|DynSequenceHelper|DynSequenceOperations|DynStruct|DynStructHelper|DynStructOperations|DynUnion|DynUnionHelper|DynUnionOperations|DynValue|DynValueBox|DynValueBoxOperations|DynValueCommon|DynValueCommonOperations|DynValueHelper|DynValueOperations|EditorKit|Element|ElementIterator|Ellipse2D|EmptyBorder|EmptyStackException|EncodedKeySpec|Encoder|Encoding|ENCODING_CDR_ENCAPS|EncryptedPrivateKeyInfo|Entity|EntityReference|EntityResolver|EnumControl|Enumeration|EnumSyntax|Environment|EOFException|Error|ErrorHandler|ErrorListener|ErrorManager|EtchedBorder|Event|EventContext|EventDirContext|EventHandler|EventListener|EventListenerList|EventListenerProxy|EventObject|EventQueue|EventSetDescriptor|Exception|ExceptionInInitializerError|ExceptionList|ExceptionListener|ExemptionMechanism|ExemptionMechanismException|ExemptionMechanismSpi|ExpandVetoException|ExportException|Expression|ExtendedRequest|ExtendedResponse|Externalizable|FactoryConfigurationError|FailedLoginException|FeatureDescriptor|Fidelity|Field|FieldNameHelper|FieldPosition|FieldView|File|FileCacheImageInputStream|FileCacheImageOutputStream|FileChannel|FileChooserUI|FileDescriptor|FileDialog|FileFilter|FileHandler|FileImageInputStream|FileImageOutputStream|FileInputStream|FileLock|FileLockInterruptionException|FilenameFilter|FileNameMap|FileNotFoundException|FileOutputStream|FilePermission|FileReader|FileSystemView|FileView|FileWriter|Filter|FilteredImageSource|FilterInputStream|FilterOutputStream|FilterReader|FilterWriter|Finishings|FixedHeightLayoutCache|FixedHolder|FlatteningPathIterator|FlavorException|FlavorMap|FlavorTable|Float|FloatBuffer|FloatControl|FloatHolder|FloatSeqHelper|FloatSeqHolder|FlowLayout|FlowView|FocusAdapter|FocusEvent|FocusListener|FocusManager|FocusTraversalPolicy|Font|FontFormatException|FontMetrics|FontRenderContext|FontUIResource|Format|FormatConversionProvider|FormatMismatch|FormatMismatchHelper|Formatter|FormView|ForwardRequest|ForwardRequestHelper|Frame|FREE_MEM|GapContent|GatheringByteChannel|GeneralPath|GeneralSecurityException|GlyphJustificationInfo|GlyphMetrics|GlyphVector|GlyphView|GradientPaint|GraphicAttribute|Graphics|Graphics2D|GraphicsConfigTemplate|GraphicsConfiguration|GraphicsDevice|GraphicsEnvironment|GrayFilter|GregorianCalendar|GridBagConstraints|GridBagLayout|GridLayout|Group|GSSContext|GSSCredential|GSSException|GSSManager|GSSName|Guard|GuardedObject|GZIPInputStream|GZIPOutputStream|Handler|HandlerBase|HandshakeCompletedEvent|HandshakeCompletedListener|HasControls|HashAttributeSet|HashDocAttributeSet|HashMap|HashPrintJobAttributeSet|HashPrintRequestAttributeSet|HashPrintServiceAttributeSet|HashSet|Hashtable|HeadlessException|HierarchyBoundsAdapter|HierarchyBoundsListener|HierarchyEvent|HierarchyListener|Highlighter|HostnameVerifier|HTML|HTMLDocument|HTMLEditorKit|HTMLFrameHyperlinkEvent|HTMLWriter|HttpsURLConnection|HttpURLConnection|HyperlinkEvent|HyperlinkListener|ICC_ColorSpace|ICC_Profile|ICC_ProfileGray|ICC_ProfileRGB|Icon|IconUIResource|IconView|ID_ASSIGNMENT_POLICY_ID|ID_UNIQUENESS_POLICY_ID|IdAssignmentPolicy|IdAssignmentPolicyOperations|IdAssignmentPolicyValue|IdentifierHelper|Identity|IdentityHashMap|IdentityScope|IDLEntity|IDLType|IDLTypeHelper|IDLTypeOperations|IdUniquenessPolicy|IdUniquenessPolicyOperations|IdUniquenessPolicyValue|IIOByteBuffer|IIOException|IIOImage|IIOInvalidTreeException|IIOMetadata|IIOMetadataController|IIOMetadataFormat|IIOMetadataFormatImpl|IIOMetadataNode|IIOParam|IIOParamController|IIOReadProgressListener|IIOReadUpdateListener|IIOReadWarningListener|IIORegistry|IIOServiceProvider|IIOWriteProgressListener|IIOWriteWarningListener|IllegalAccessError|IllegalAccessException|IllegalArgumentException|IllegalBlockingModeException|IllegalBlockSizeException|IllegalCharsetNameException|IllegalComponentStateException|IllegalMonitorStateException|IllegalPathStateException|IllegalSelectorException|IllegalStateException|IllegalThreadStateException|Image|ImageCapabilities|ImageConsumer|ImageFilter|ImageGraphicAttribute|ImageIcon|ImageInputStream|ImageInputStreamImpl|ImageInputStreamSpi|ImageIO|ImageObserver|ImageOutputStream|ImageOutputStreamImpl|ImageOutputStreamSpi|ImageProducer|ImageReader|ImageReaderSpi|ImageReaderWriterSpi|ImageReadParam|ImageTranscoder|ImageTranscoderSpi|ImageTypeSpecifier|ImageView|ImageWriteParam|ImageWriter|ImageWriterSpi|ImagingOpException|IMP_LIMIT|IMPLICIT_ACTIVATION_POLICY_ID|ImplicitActivationPolicy|ImplicitActivationPolicyOperations|ImplicitActivationPolicyValue|IncompatibleClassChangeError|InconsistentTypeCode|InconsistentTypeCodeHelper|IndexColorModel|IndexedPropertyDescriptor|IndexOutOfBoundsException|IndirectionException|Inet4Address|Inet6Address|InetAddress|InetSocketAddress|Inflater|InflaterInputStream|InheritableThreadLocal|InitialContext|InitialContextFactory|InitialContextFactoryBuilder|InitialDirContext|INITIALIZE|InitialLdapContext|InlineView|InputContext|InputEvent|InputMap|InputMapUIResource|InputMethod|InputMethodContext|InputMethodDescriptor|InputMethodEvent|InputMethodHighlight|InputMethodListener|InputMethodRequests|InputSource|InputStream|InputStreamReader|InputSubset|InputVerifier|Insets|InsetsUIResource|InstantiationError|InstantiationException|Instrument|InsufficientResourcesException|IntBuffer|Integer|IntegerSyntax|Interceptor|InterceptorOperations|INTERNAL|InternalError|InternalFrameAdapter|InternalFrameEvent|InternalFrameFocusTraversalPolicy|InternalFrameListener|InternalFrameUI|InternationalFormatter|InterruptedException|InterruptedIOException|InterruptedNamingException|InterruptibleChannel|INTF_REPOS|IntHolder|IntrospectionException|Introspector|INV_FLAG|INV_IDENT|INV_OBJREF|INV_POLICY|Invalid|INVALID_TRANSACTION|InvalidAddress|InvalidAddressHelper|InvalidAddressHolder|InvalidAlgorithmParameterException|InvalidAttributeIdentifierException|InvalidAttributesException|InvalidAttributeValueException|InvalidClassException|InvalidDnDOperationException|InvalidKeyException|InvalidKeySpecException|InvalidMarkException|InvalidMidiDataException|InvalidName|InvalidNameException|InvalidNameHelper|InvalidNameHolder|InvalidObjectException|InvalidParameterException|InvalidParameterSpecException|InvalidPolicy|InvalidPolicyHelper|InvalidPreferencesFormatException|InvalidSearchControlsException|InvalidSearchFilterException|InvalidSeq|InvalidSlot|InvalidSlotHelper|InvalidTransactionException|InvalidTypeForEncoding|InvalidTypeForEncodingHelper|InvalidValue|InvalidValueHelper|InvocationEvent|InvocationHandler|InvocationTargetException|InvokeHandler|IOException|IOR|IORHelper|IORHolder|IORInfo|IORInfoOperations|IORInterceptor|IORInterceptorOperations|IRObject|IRObjectOperations|IstringHelper|ItemEvent|ItemListener|ItemSelectable|Iterator|IvParameterSpec|JApplet|JarEntry|JarException|JarFile|JarInputStream|JarOutputStream|JarURLConnection|JButton|JCheckBox|JCheckBoxMenuItem|JColorChooser|JComboBox|JComponent|JDesktopPane|JDialog|JEditorPane|JFileChooser|JFormattedTextField|JFrame|JInternalFrame|JLabel|JLayeredPane|JList|JMenu|JMenuBar|JMenuItem|JobAttributes|JobHoldUntil|JobImpressions|JobImpressionsCompleted|JobImpressionsSupported|JobKOctets|JobKOctetsProcessed|JobKOctetsSupported|JobMediaSheets|JobMediaSheetsCompleted|JobMediaSheetsSupported|JobMessageFromOperator|JobName|JobOriginatingUserName|JobPriority|JobPrioritySupported|JobSheets|JobState|JobStateReason|JobStateReasons|JOptionPane|JPanel|JPasswordField|JPEGHuffmanTable|JPEGImageReadParam|JPEGImageWriteParam|JPEGQTable|JPopupMenu|JProgressBar|JRadioButton|JRadioButtonMenuItem|JRootPane|JScrollBar|JScrollPane|JSeparator|JSlider|JSpinner|JSplitPane|JTabbedPane|JTable|JTableHeader|JTextArea|JTextComponent|JTextField|JTextPane|JToggleButton|JToolBar|JToolTip|JTree|JViewport|JWindow|KerberosKey|KerberosPrincipal|KerberosTicket|Kernel|Key|KeyAdapter|KeyAgreement|KeyAgreementSpi|KeyboardFocusManager|KeyEvent|KeyEventDispatcher|KeyEventPostProcessor|KeyException|KeyFactory|KeyFactorySpi|KeyGenerator|KeyGeneratorSpi|KeyListener|KeyManagementException|KeyManager|KeyManagerFactory|KeyManagerFactorySpi|Keymap|KeyPair|KeyPairGenerator|KeyPairGeneratorSpi|KeySpec|KeyStore|KeyStoreException|KeyStoreSpi|KeyStroke|Label|LabelUI|LabelView|LanguageCallback|LastOwnerException|LayeredHighlighter|LayoutFocusTraversalPolicy|LayoutManager|LayoutManager2|LayoutQueue|LDAPCertStoreParameters|LdapContext|LdapReferralException|Lease|Level|LexicalHandler|LIFESPAN_POLICY_ID|LifespanPolicy|LifespanPolicyOperations|LifespanPolicyValue|LimitExceededException|Line|Line2D|LineBorder|LineBreakMeasurer|LineEvent|LineListener|LineMetrics|LineNumberInputStream|LineNumberReader|LineUnavailableException|LinkageError|LinkedHashMap|LinkedHashSet|LinkedList|LinkException|LinkLoopException|LinkRef|List|ListCellRenderer|ListDataEvent|ListDataListener|ListIterator|ListModel|ListResourceBundle|ListSelectionEvent|ListSelectionListener|ListSelectionModel|ListUI|ListView|LoaderHandler|Locale|LocalObject|LocateRegistry|LOCATION_FORWARD|Locator|LocatorImpl|Logger|LoggingPermission|LoginContext|LoginException|LoginModule|LogManager|LogRecord|LogStream|Long|LongBuffer|LongHolder|LongLongSeqHelper|LongLongSeqHolder|LongSeqHelper|LongSeqHolder|LookAndFeel|LookupOp|LookupTable|Mac|MacSpi|MalformedInputException|MalformedLinkException|MalformedURLException|ManagerFactoryParameters|Manifest|Map|MappedByteBuffer|MARSHAL|MarshalException|MarshalledObject|MaskFormatter|Matcher|Math|MatteBorder|Media|MediaName|MediaPrintableArea|MediaSize|MediaSizeName|MediaTracker|MediaTray|Member|MemoryCacheImageInputStream|MemoryCacheImageOutputStream|MemoryHandler|MemoryImageSource|Menu|MenuBar|MenuBarUI|MenuComponent|MenuContainer|MenuDragMouseEvent|MenuDragMouseListener|MenuElement|MenuEvent|MenuItem|MenuItemUI|MenuKeyEvent|MenuKeyListener|MenuListener|MenuSelectionManager|MenuShortcut|MessageDigest|MessageDigestSpi|MessageFormat|MessageProp|MetaEventListener|MetalBorders|MetalButtonUI|MetalCheckBoxIcon|MetalCheckBoxUI|MetalComboBoxButton|MetalComboBoxEditor|MetalComboBoxIcon|MetalComboBoxUI|MetalDesktopIconUI|MetalFileChooserUI|MetalIconFactory|MetalInternalFrameTitlePane|MetalInternalFrameUI|MetalLabelUI|MetalLookAndFeel|MetalPopupMenuSeparatorUI|MetalProgressBarUI|MetalRadioButtonUI|MetalRootPaneUI|MetalScrollBarUI|MetalScrollButton|MetalScrollPaneUI|MetalSeparatorUI|MetalSliderUI|MetalSplitPaneUI|MetalTabbedPaneUI|MetalTextFieldUI|MetalTheme|MetalToggleButtonUI|MetalToolBarUI|MetalToolTipUI|MetalTreeUI|MetaMessage|Method|MethodDescriptor|MidiChannel|MidiDevice|MidiDeviceProvider|MidiEvent|MidiFileFormat|MidiFileReader|MidiFileWriter|MidiMessage|MidiSystem|MidiUnavailableException|MimeTypeParseException|MinimalHTMLWriter|MissingResourceException|Mixer|MixerProvider|ModificationItem|Modifier|MouseAdapter|MouseDragGestureRecognizer|MouseEvent|MouseInputAdapter|MouseInputListener|MouseListener|MouseMotionAdapter|MouseMotionListener|MouseWheelEvent|MouseWheelListener|MultiButtonUI|MulticastSocket|MultiColorChooserUI|MultiComboBoxUI|MultiDesktopIconUI|MultiDesktopPaneUI|MultiDoc|MultiDocPrintJob|MultiDocPrintService|MultiFileChooserUI|MultiInternalFrameUI|MultiLabelUI|MultiListUI|MultiLookAndFeel|MultiMenuBarUI|MultiMenuItemUI|MultiOptionPaneUI|MultiPanelUI|MultiPixelPackedSampleModel|MultipleComponentProfileHelper|MultipleComponentProfileHolder|MultipleDocumentHandling|MultipleMaster|MultiPopupMenuUI|MultiProgressBarUI|MultiRootPaneUI|MultiScrollBarUI|MultiScrollPaneUI|MultiSeparatorUI|MultiSliderUI|MultiSpinnerUI|MultiSplitPaneUI|MultiTabbedPaneUI|MultiTableHeaderUI|MultiTableUI|MultiTextUI|MultiToolBarUI|MultiToolTipUI|MultiTreeUI|MultiViewportUI|MutableAttributeSet|MutableComboBoxModel|MutableTreeNode|Name|NameAlreadyBoundException|NameCallback|NameClassPair|NameComponent|NameComponentHelper|NameComponentHolder|NamedNodeMap|NamedValue|NameDynAnyPair|NameDynAnyPairHelper|NameDynAnyPairSeqHelper|NameHelper|NameHolder|NameNotFoundException|NameParser|NamespaceChangeListener|NamespaceSupport|NameValuePair|NameValuePairHelper|NameValuePairSeqHelper|Naming|NamingContext|NamingContextExt|NamingContextExtHelper|NamingContextExtHolder|NamingContextExtOperations|NamingContextExtPOA|NamingContextHelper|NamingContextHolder|NamingContextOperations|NamingContextPOA|NamingEnumeration|NamingEvent|NamingException|NamingExceptionEvent|NamingListener|NamingManager|NamingSecurityException|NavigationFilter|NegativeArraySizeException|NetPermission|NetworkInterface|NO_IMPLEMENT|NO_MEMORY|NO_PERMISSION|NO_RESOURCES|NO_RESPONSE|NoClassDefFoundError|NoConnectionPendingException|NoContext|NoContextHelper|Node|NodeChangeEvent|NodeChangeListener|NodeList|NoInitialContextException|NoninvertibleTransformException|NonReadableChannelException|NonWritableChannelException|NoPermissionException|NoRouteToHostException|NoServant|NoServantHelper|NoSuchAlgorithmException|NoSuchAttributeException|NoSuchElementException|NoSuchFieldError|NoSuchFieldException|NoSuchMethodError|NoSuchMethodException|NoSuchObjectException|NoSuchPaddingException|NoSuchProviderException|NotActiveException|Notation|NotBoundException|NotContextException|NotEmpty|NotEmptyHelper|NotEmptyHolder|NotFound|NotFoundHelper|NotFoundHolder|NotFoundReason|NotFoundReasonHelper|NotFoundReasonHolder|NotOwnerException|NotSerializableException|NotYetBoundException|NotYetConnectedException|NullCipher|NullPointerException|Number|NumberFormat|NumberFormatException|NumberFormatter|NumberOfDocuments|NumberOfInterveningJobs|NumberUp|NumberUpSupported|NumericShaper|NVList|OBJ_ADAPTER|Object|OBJECT_NOT_EXIST|ObjectAlreadyActive|ObjectAlreadyActiveHelper|ObjectChangeListener|ObjectFactory|ObjectFactoryBuilder|ObjectHelper|ObjectHolder|ObjectIdHelper|ObjectImpl|ObjectInput|ObjectInputStream|ObjectInputValidation|ObjectNotActive|ObjectNotActiveHelper|ObjectOutput|ObjectOutputStream|ObjectStreamClass|ObjectStreamConstants|ObjectStreamException|ObjectStreamField|ObjectView|ObjID|Observable|Observer|OctetSeqHelper|OctetSeqHolder|Oid|OMGVMCID|OpenType|Operation|OperationNotSupportedException|Option|OptionalDataException|OptionPaneUI|ORB|ORBInitializer|ORBInitializerOperations|ORBInitInfo|ORBInitInfoOperations|OrientationRequested|OutOfMemoryError|OutputDeviceAssigned|OutputKeys|OutputStream|OutputStreamWriter|OverlappingFileLockException|OverlayLayout|Owner|Package|PackedColorModel|Pageable|PageAttributes|PageFormat|PageRanges|PagesPerMinute|PagesPerMinuteColor|Paint|PaintContext|PaintEvent|Panel|PanelUI|Paper|ParagraphView|Parameter|ParameterBlock|ParameterDescriptor|ParameterMetaData|ParameterMode|ParameterModeHelper|ParameterModeHolder|ParseException|ParsePosition|Parser|ParserAdapter|ParserConfigurationException|ParserDelegator|ParserFactory|PartialResultException|PasswordAuthentication|PasswordCallback|PasswordView|Patch|PathIterator|Pattern|PatternSyntaxException|PBEKey|PBEKeySpec|PBEParameterSpec|PDLOverrideSupported|Permission|PermissionCollection|Permissions|PERSIST_STORE|PersistenceDelegate|PhantomReference|Pipe|PipedInputStream|PipedOutputStream|PipedReader|PipedWriter|PixelGrabber|PixelInterleavedSampleModel|PKCS8EncodedKeySpec|PKIXBuilderParameters|PKIXCertPathBuilderResult|PKIXCertPathChecker|PKIXCertPathValidatorResult|PKIXParameters|PlainDocument|PlainView|POA|POAHelper|POAManager|POAManagerOperations|POAOperations|Point|Point2D|Policy|PolicyError|PolicyErrorCodeHelper|PolicyErrorHelper|PolicyErrorHolder|PolicyFactory|PolicyFactoryOperations|PolicyHelper|PolicyHolder|PolicyListHelper|PolicyListHolder|PolicyNode|PolicyOperations|PolicyQualifierInfo|PolicyTypeHelper|Polygon|PooledConnection|Popup|PopupFactory|PopupMenu|PopupMenuEvent|PopupMenuListener|PopupMenuUI|Port|PortableRemoteObject|PortableRemoteObjectDelegate|PortUnreachableException|Position|PreferenceChangeEvent|PreferenceChangeListener|Preferences|PreferencesFactory|PreparedStatement|PresentationDirection|Principal|PrincipalHolder|Printable|PrinterAbortException|PrinterException|PrinterGraphics|PrinterInfo|PrinterIOException|PrinterIsAcceptingJobs|PrinterJob|PrinterLocation|PrinterMakeAndModel|PrinterMessageFromOperator|PrinterMoreInfo|PrinterMoreInfoManufacturer|PrinterName|PrinterResolution|PrinterState|PrinterStateReason|PrinterStateReasons|PrinterURI|PrintEvent|PrintException|PrintGraphics|PrintJob|PrintJobAdapter|PrintJobAttribute|PrintJobAttributeEvent|PrintJobAttributeListener|PrintJobAttributeSet|PrintJobEvent|PrintJobListener|PrintQuality|PrintRequestAttribute|PrintRequestAttributeSet|PrintService|PrintServiceAttribute|PrintServiceAttributeEvent|PrintServiceAttributeListener|PrintServiceAttributeSet|PrintServiceLookup|PrintStream|PrintWriter|PRIVATE_MEMBER|PrivateCredentialPermission|PrivateKey|PrivilegedAction|PrivilegedActionException|PrivilegedExceptionAction|Process|ProcessingInstruction|ProfileDataException|ProfileIdHelper|ProgressBarUI|ProgressMonitor|ProgressMonitorInputStream|Properties|PropertyChangeEvent|PropertyChangeListener|PropertyChangeListenerProxy|PropertyChangeSupport|PropertyDescriptor|PropertyEditor|PropertyEditorManager|PropertyEditorSupport|PropertyPermission|PropertyResourceBundle|PropertyVetoException|ProtectionDomain|ProtocolException|Provider|ProviderException|Proxy|PSSParameterSpec|PUBLIC_MEMBER|PublicKey|PushbackInputStream|PushbackReader|QuadCurve2D|QueuedJobCount|Random|RandomAccess|RandomAccessFile|Raster|RasterFormatException|RasterOp|RC2ParameterSpec|RC5ParameterSpec|ReadableByteChannel|Reader|ReadOnlyBufferException|Receiver|Rectangle|Rectangle2D|RectangularShape|Ref|RefAddr|Reference|Referenceable|ReferenceQueue|ReferenceUriSchemesSupported|ReferralException|ReflectPermission|Refreshable|RefreshFailedException|RegisterableService|Registry|RegistryHandler|RemarshalException|Remote|RemoteCall|RemoteException|RemoteObject|RemoteRef|RemoteServer|RemoteStub|RenderableImage|RenderableImageOp|RenderableImageProducer|RenderContext|RenderedImage|RenderedImageFactory|Renderer|RenderingHints|RepaintManager|ReplicateScaleFilter|RepositoryIdHelper|Request|REQUEST_PROCESSING_POLICY_ID|RequestInfo|RequestInfoOperations|RequestingUserName|RequestProcessingPolicy|RequestProcessingPolicyOperations|RequestProcessingPolicyValue|RescaleOp|ResolutionSyntax|Resolver|ResolveResult|ResourceBundle|ResponseHandler|Result|ResultSet|ResultSetMetaData|ReverbType|RGBImageFilter|RMIClassLoader|RMIClassLoaderSpi|RMIClientSocketFactory|RMIFailureHandler|RMISecurityException|RMISecurityManager|RMIServerSocketFactory|RMISocketFactory|Robot|RootPaneContainer|RootPaneUI|RoundRectangle2D|RowMapper|RowSet|RowSetEvent|RowSetInternal|RowSetListener|RowSetMetaData|RowSetReader|RowSetWriter|RSAKey|RSAKeyGenParameterSpec|RSAMultiPrimePrivateCrtKey|RSAMultiPrimePrivateCrtKeySpec|RSAOtherPrimeInfo|RSAPrivateCrtKey|RSAPrivateCrtKeySpec|RSAPrivateKey|RSAPrivateKeySpec|RSAPublicKey|RSAPublicKeySpec|RTFEditorKit|RuleBasedCollator|Runnable|Runtime|RunTime|RuntimeException|RunTimeOperations|RuntimePermission|SampleModel|Savepoint|SAXException|SAXNotRecognizedException|SAXNotSupportedException|SAXParseException|SAXParser|SAXParserFactory|SAXResult|SAXSource|SAXTransformerFactory|ScatteringByteChannel|SchemaViolationException|Scrollable|Scrollbar|ScrollBarUI|ScrollPane|ScrollPaneAdjustable|ScrollPaneConstants|ScrollPaneLayout|ScrollPaneUI|SealedObject|SearchControls|SearchResult|SecretKey|SecretKeyFactory|SecretKeyFactorySpi|SecretKeySpec|SecureClassLoader|SecureRandom|SecureRandomSpi|Security|SecurityException|SecurityManager|SecurityPermission|Segment|SelectableChannel|SelectionKey|Selector|SelectorProvider|SeparatorUI|Sequence|SequenceInputStream|Sequencer|Serializable|SerializablePermission|Servant|SERVANT_RETENTION_POLICY_ID|ServantActivator|ServantActivatorHelper|ServantActivatorOperations|ServantActivatorPOA|ServantAlreadyActive|ServantAlreadyActiveHelper|ServantLocator|ServantLocatorHelper|ServantLocatorOperations|ServantLocatorPOA|ServantManager|ServantManagerOperations|ServantNotActive|ServantNotActiveHelper|ServantObject|ServantRetentionPolicy|ServantRetentionPolicyOperations|ServantRetentionPolicyValue|ServerCloneException|ServerError|ServerException|ServerNotActiveException|ServerRef|ServerRequest|ServerRequestInfo|ServerRequestInfoOperations|ServerRequestInterceptor|ServerRequestInterceptorOperations|ServerRuntimeException|ServerSocket|ServerSocketChannel|ServerSocketFactory|ServiceContext|ServiceContextHelper|ServiceContextHolder|ServiceContextListHelper|ServiceContextListHolder|ServiceDetail|ServiceDetailHelper|ServiceIdHelper|ServiceInformation|ServiceInformationHelper|ServiceInformationHolder|ServicePermission|ServiceRegistry|ServiceUI|ServiceUIFactory|ServiceUnavailableException|Set|SetOfIntegerSyntax|SetOverrideType|SetOverrideTypeHelper|Severity|Shape|ShapeGraphicAttribute|SheetCollate|Short|ShortBuffer|ShortBufferException|ShortHolder|ShortLookupTable|ShortMessage|ShortSeqHelper|ShortSeqHolder|Sides|Signature|SignatureException|SignatureSpi|SignedObject|Signer|SimpleAttributeSet|SimpleBeanInfo|SimpleDateFormat|SimpleDoc|SimpleFormatter|SimpleTimeZone|SinglePixelPackedSampleModel|SingleSelectionModel|Size2DSyntax|SizeLimitExceededException|SizeRequirements|SizeSequence|Skeleton|SkeletonMismatchException|SkeletonNotFoundException|SliderUI|Socket|SocketAddress|SocketChannel|SocketException|SocketFactory|SocketHandler|SocketImpl|SocketImplFactory|SocketOptions|SocketPermission|SocketSecurityException|SocketTimeoutException|SoftBevelBorder|SoftReference|SortedMap|SortedSet|SortingFocusTraversalPolicy|Soundbank|SoundbankReader|SoundbankResource|Source|SourceDataLine|SourceLocator|SpinnerDateModel|SpinnerListModel|SpinnerModel|SpinnerNumberModel|SpinnerUI|SplitPaneUI|Spring|SpringLayout|SQLData|SQLException|SQLInput|SQLOutput|SQLPermission|SQLWarning|SSLContext|SSLContextSpi|SSLException|SSLHandshakeException|SSLKeyException|SSLPeerUnverifiedException|SSLPermission|SSLProtocolException|SSLServerSocket|SSLServerSocketFactory|SSLSession|SSLSessionBindingEvent|SSLSessionBindingListener|SSLSessionContext|SSLSocket|SSLSocketFactory|Stack|StackOverflowError|StackTraceElement|StartTlsRequest|StartTlsResponse|State|StateEdit|StateEditable|StateFactory|Statement|Streamable|StreamableValue|StreamCorruptedException|StreamHandler|StreamPrintService|StreamPrintServiceFactory|StreamResult|StreamSource|StreamTokenizer|StrictMath|String|StringBuffer|StringBufferInputStream|StringCharacterIterator|StringContent|StringHolder|StringIndexOutOfBoundsException|StringNameHelper|StringReader|StringRefAddr|StringSelection|StringSeqHelper|StringSeqHolder|StringTokenizer|StringValueHelper|StringWriter|Stroke|Struct|StructMember|StructMemberHelper|Stub|StubDelegate|StubNotFoundException|Style|StyleConstants|StyleContext|StyledDocument|StyledEditorKit|StyleSheet|Subject|SubjectDomainCombiner|SUCCESSFUL|SupportedValuesAttribute|SwingConstants|SwingPropertyChangeSupport|SwingUtilities|SYNC_WITH_TRANSPORT|SyncFailedException|SyncScopeHelper|Synthesizer|SysexMessage|System|SYSTEM_EXCEPTION|SystemColor|SystemException|SystemFlavorMap|TabableView|TabbedPaneUI|TabExpander|TableCellEditor|TableCellRenderer|TableColumn|TableColumnModel|TableColumnModelEvent|TableColumnModelListener|TableHeaderUI|TableModel|TableModelEvent|TableModelListener|TableUI|TableView|TabSet|TabStop|TAG_ALTERNATE_IIOP_ADDRESS|TAG_CODE_SETS|TAG_INTERNET_IOP|TAG_JAVA_CODEBASE|TAG_MULTIPLE_COMPONENTS|TAG_ORB_TYPE|TAG_POLICIES|TagElement|TaggedComponent|TaggedComponentHelper|TaggedComponentHolder|TaggedProfile|TaggedProfileHelper|TaggedProfileHolder|TargetDataLine|TCKind|Templates|TemplatesHandler|Text|TextAction|TextArea|TextAttribute|TextComponent|TextEvent|TextField|TextHitInfo|TextInputCallback|TextLayout|TextListener|TextMeasurer|TextOutputCallback|TextSyntax|TextUI|TexturePaint|Thread|THREAD_POLICY_ID|ThreadDeath|ThreadGroup|ThreadLocal|ThreadPolicy|ThreadPolicyOperations|ThreadPolicyValue|Throwable|Tie|TileObserver|Time|TimeLimitExceededException|Timer|TimerTask|Timestamp|TimeZone|TitledBorder|ToolBarUI|Toolkit|ToolTipManager|ToolTipUI|TooManyListenersException|Track|TRANSACTION_REQUIRED|TRANSACTION_ROLLEDBACK|TransactionRequiredException|TransactionRolledbackException|TransactionService|Transferable|TransferHandler|TransformAttribute|Transformer|TransformerConfigurationException|TransformerException|TransformerFactory|TransformerFactoryConfigurationError|TransformerHandler|TRANSIENT|Transmitter|Transparency|TRANSPORT_RETRY|TreeCellEditor|TreeCellRenderer|TreeExpansionEvent|TreeExpansionListener|TreeMap|TreeModel|TreeModelEvent|TreeModelListener|TreeNode|TreePath|TreeSelectionEvent|TreeSelectionListener|TreeSelectionModel|TreeSet|TreeUI|TreeWillExpandListener|TrustAnchor|TrustManager|TrustManagerFactory|TrustManagerFactorySpi|TypeCode|TypeCodeHolder|TypeMismatch|TypeMismatchHelper|Types|UID|UIDefaults|UIManager|UIResource|ULongLongSeqHelper|ULongLongSeqHolder|ULongSeqHelper|ULongSeqHolder|UndeclaredThrowableException|UndoableEdit|UndoableEditEvent|UndoableEditListener|UndoableEditSupport|UndoManager|UnexpectedException|UnicastRemoteObject|UnionMember|UnionMemberHelper|UNKNOWN|UnknownEncoding|UnknownEncodingHelper|UnknownError|UnknownException|UnknownGroupException|UnknownHostException|UnknownObjectException|UnknownServiceException|UnknownUserException|UnknownUserExceptionHelper|UnknownUserExceptionHolder|UnmappableCharacterException|UnmarshalException|UnmodifiableSetException|UnrecoverableKeyException|Unreferenced|UnresolvedAddressException|UnresolvedPermission|UnsatisfiedLinkError|UnsolicitedNotification|UnsolicitedNotificationEvent|UnsolicitedNotificationListener|UNSUPPORTED_POLICY|UNSUPPORTED_POLICY_VALUE|UnsupportedAddressTypeException|UnsupportedAudioFileException|UnsupportedCallbackException|UnsupportedCharsetException|UnsupportedClassVersionError|UnsupportedEncodingException|UnsupportedFlavorException|UnsupportedLookAndFeelException|UnsupportedOperationException|URI|URIException|URIResolver|URISyntax|URISyntaxException|URL|URLClassLoader|URLConnection|URLDecoder|URLEncoder|URLStreamHandler|URLStreamHandlerFactory|URLStringHelper|USER_EXCEPTION|UserException|UShortSeqHelper|UShortSeqHolder|UTFDataFormatException|Util|UtilDelegate|Utilities|ValueBase|ValueBaseHelper|ValueBaseHolder|ValueFactory|ValueHandler|ValueMember|ValueMemberHelper|VariableHeightLayoutCache|Vector|VerifyError|VersionSpecHelper|VetoableChangeListener|VetoableChangeListenerProxy|VetoableChangeSupport|View|ViewFactory|ViewportLayout|ViewportUI|VirtualMachineError|Visibility|VisibilityHelper|VM_ABSTRACT|VM_CUSTOM|VM_NONE|VM_TRUNCATABLE|VMID|VoiceStatus|Void|VolatileImage|WCharSeqHelper|WCharSeqHolder|WeakHashMap|WeakReference|Window|WindowAdapter|WindowConstants|WindowEvent|WindowFocusListener|WindowListener|WindowStateListener|WrappedPlainView|WritableByteChannel|WritableRaster|WritableRenderedImage|WriteAbortedException|Writer|WrongAdapter|WrongAdapterHelper|WrongPolicy|WrongPolicyHelper|WrongTransaction|WrongTransactionHelper|WrongTransactionHolder|WStringSeqHelper|WStringSeqHolder|WStringValueHelper|X500Principal|X500PrivateCredential|X509Certificate|X509CertSelector|X509CRL|X509CRLEntry|X509CRLSelector|X509EncodedKeySpec|X509Extension|X509KeyManager|X509TrustManager|XAConnection|XADataSource|XAException|XAResource|Xid|XMLDecoder|XMLEncoder|XMLFilter|XMLFilterImpl|XMLFormatter|XMLReader|XMLReaderAdapter|XMLReaderFactory|ZipEntry|ZipException|ZipFile|ZipInputStream|ZipOutputStream|ZoneView|_BindingIteratorImplBase|_BindingIteratorStub|_DynAnyFactoryStub|_DynAnyStub|_DynArrayStub|_DynEnumStub|_DynFixedStub|_DynSequenceStub|_DynStructStub|_DynUnionStub|_DynValueStub|_IDLTypeStub|_NamingContextExtStub|_NamingContextImplBase|_NamingContextStub|_PolicyStub|_Remote_Stub|_ServantActivatorStub|_ServantLocatorStub)$/',
- ),
- 8 =>
- array (
- ),
- 9 =>
- array (
- ),
- 10 =>
- array (
- ),
- 11 =>
- array (
- ),
- 12 =>
- array (
- ),
- ),
- 3 =>
- array (
- 0 =>
- array (
- ),
- 1 =>
- array (
- ),
- 2 =>
- array (
- ),
- 3 =>
- array (
- ),
- 4 =>
- array (
- ),
- ),
- 4 =>
- array (
- 0 =>
- array (
- ),
- ),
- 5 =>
- array (
- 0 =>
- array (
- ),
- ),
- 6 =>
- array (
- 0 =>
- array (
- ),
- 1 =>
- array (
- ),
- 2 =>
- array (
- ),
- 3 =>
- array (
- ),
- 4 =>
- array (
- ),
- ),
- );
- $this->_parts = array (
- 0 =>
- array (
- 0 => NULL,
- 1 => NULL,
- 2 => NULL,
- 3 => NULL,
- 4 => NULL,
- 5 => NULL,
- 6 => NULL,
- 7 => NULL,
- 8 => NULL,
- 9 => NULL,
- 10 => NULL,
- 11 => NULL,
- 12 => NULL,
- ),
- 1 =>
- array (
- 0 => NULL,
- 1 => NULL,
- 2 => NULL,
- 3 => NULL,
- 4 => NULL,
- 5 => NULL,
- 6 => NULL,
- 7 => NULL,
- 8 => NULL,
- 9 => NULL,
- 10 => NULL,
- 11 => NULL,
- 12 => NULL,
- ),
- 2 =>
- array (
- 0 => NULL,
- 1 => NULL,
- 2 => NULL,
- 3 => NULL,
- 4 => NULL,
- 5 => NULL,
- 6 => NULL,
- 7 => NULL,
- 8 => NULL,
- 9 => NULL,
- 10 => NULL,
- 11 => NULL,
- 12 => NULL,
- ),
- 3 =>
- array (
- 0 => NULL,
- 1 => NULL,
- 2 => NULL,
- 3 => NULL,
- 4 => NULL,
- ),
- 4 =>
- array (
- 0 => NULL,
- ),
- 5 =>
- array (
- 0 => NULL,
- ),
- 6 =>
- array (
- 0 => NULL,
- 1 => NULL,
- 2 => NULL,
- 3 => NULL,
- 4 => NULL,
- ),
- );
- $this->_subst = array (
- -1 =>
- array (
- 0 => false,
- 1 => false,
- 2 => false,
- 3 => false,
- 4 => false,
- 5 => false,
- 6 => false,
- 7 => false,
- 8 => false,
- 9 => false,
- 10 => false,
- 11 => false,
- 12 => false,
- ),
- 0 =>
- array (
- 0 => false,
- 1 => false,
- 2 => false,
- 3 => false,
- 4 => false,
- 5 => false,
- 6 => false,
- 7 => false,
- 8 => false,
- 9 => false,
- 10 => false,
- 11 => false,
- 12 => false,
- ),
- 1 =>
- array (
- 0 => false,
- 1 => false,
- 2 => false,
- 3 => false,
- 4 => false,
- 5 => false,
- 6 => false,
- 7 => false,
- 8 => false,
- 9 => false,
- 10 => false,
- 11 => false,
- 12 => false,
- ),
- 2 =>
- array (
- 0 => false,
- 1 => false,
- 2 => false,
- 3 => false,
- 4 => false,
- 5 => false,
- 6 => false,
- 7 => false,
- 8 => false,
- 9 => false,
- 10 => false,
- 11 => false,
- 12 => false,
- ),
- 3 =>
- array (
- 0 => false,
- 1 => false,
- 2 => false,
- 3 => false,
- 4 => false,
- ),
- 4 =>
- array (
- 0 => false,
- ),
- 5 =>
- array (
- 0 => false,
- ),
- 6 =>
- array (
- 0 => false,
- 1 => false,
- 2 => false,
- 3 => false,
- 4 => false,
- ),
- );
- $this->_conditions = array (
- 'java.builtins' =>
- array (
- 0 =>
- array (
- 0 => 'builtin',
- 1 => true,
- ),
- ),
- );
- $this->_kwmap = array (
- 'types' => 'types',
- 'reserved' => 'reserved',
- 'builtin' => 'builtin',
- );
- $this->_defClass = 'code';
- $this->_checkDefines();
- }
-
-} \ No newline at end of file
diff --git a/library/Text_Highlighter/Text/Highlighter/JAVASCRIPT.php b/library/Text_Highlighter/Text/Highlighter/JAVASCRIPT.php
deleted file mode 100644
index 51eae8f62..000000000
--- a/library/Text_Highlighter/Text/Highlighter/JAVASCRIPT.php
+++ /dev/null
@@ -1,631 +0,0 @@
-<?php
-/**
- * Auto-generated class. JAVASCRIPT syntax highlighting
- *
- * PHP version 4 and 5
- *
- * LICENSE: This source file is subject to version 3.0 of the PHP license
- * that is available through the world-wide-web at the following URI:
- * http://www.php.net/license/3_0.txt. If you did not receive a copy of
- * the PHP License and are unable to obtain it through the web, please
- * send a note to license@php.net so we can mail you a copy immediately.
- *
- * @copyright 2004-2006 Andrey Demenev
- * @license http://www.php.net/license/3_0.txt PHP License
- * @link http://pear.php.net/package/Text_Highlighter
- * @category Text
- * @package Text_Highlighter
- * @version generated from: javascript.xml
- * @author Andrey Demenev <demenev@gmail.com>
- *
- */
-
-/**
- * @ignore
- */
-
-require_once 'Text/Highlighter.php';
-
-/**
- * Auto-generated class. JAVASCRIPT syntax highlighting
- *
- * @author Andrey Demenev <demenev@gmail.com>
- * @category Text
- * @package Text_Highlighter
- * @copyright 2004-2006 Andrey Demenev
- * @license http://www.php.net/license/3_0.txt PHP License
- * @version Release: 0.7.0
- * @link http://pear.php.net/package/Text_Highlighter
- */
-class Text_Highlighter_JAVASCRIPT extends Text_Highlighter
-{
- var $_language = 'javascript';
-
- /**
- * PHP4 Compatible Constructor
- *
- * @param array $options
- * @access public
- */
- function Text_Highlighter_JAVASCRIPT($options=array())
- {
- $this->__construct($options);
- }
-
-
- /**
- * Constructor
- *
- * @param array $options
- * @access public
- */
- function __construct($options=array())
- {
-
- $this->_options = $options;
- $this->_regs = array (
- -1 => '/((?i)\\{)|((?i)\\()|((?i)\\[)|((?i)\\/\\*)|((?i)")|((?i)\')|((?i)\\/\\/)|((?i)[a-z_]\\w*)|((?i)0x\\d*|\\d*\\.?\\d+)/',
- 0 => '/((?i)\\{)|((?i)\\()|((?i)\\[)|((?i)\\/\\*)|((?i)")|((?i)\')|((?i)\\/\\/)|((?i)[a-z_]\\w*)|((?i)0x\\d*|\\d*\\.?\\d+)/',
- 1 => '/((?i)\\{)|((?i)\\()|((?i)\\[)|((?i)\\/\\*)|((?i)")|((?i)\')|((?i)\\/\\/)|((?i)[a-z_]\\w*)|((?i)0x\\d*|\\d*\\.?\\d+)/',
- 2 => '/((?i)\\{)|((?i)\\()|((?i)\\[)|((?i)\\/\\*)|((?i)")|((?i)\')|((?i)\\/\\/)|((?i)[a-z_]\\w*)|((?i)0x\\d*|\\d*\\.?\\d+)/',
- 3 => '/((?i)((https?|ftp):\\/\\/[\\w\\?\\.\\-\\&=\\/%+]+)|(^|[\\s,!?])www\\.\\w+\\.\\w+[\\w\\?\\.\\&=\\/%+]*)|((?i)\\w+[\\.\\w\\-]+@(\\w+[\\.\\w\\-])+)|((?i)\\b(note|fixme):)|((?i)\\$\\w+:.+\\$)/',
- 4 => '/((?i)\\\\\\\\|\\\\"|\\\\\'|\\\\`|\\\\t|\\\\n|\\\\r)/',
- 5 => '/((?i)\\\\\\\\|\\\\"|\\\\\'|\\\\`)/',
- 6 => '/((?i)((https?|ftp):\\/\\/[\\w\\?\\.\\-\\&=\\/%+]+)|(^|[\\s,!?])www\\.\\w+\\.\\w+[\\w\\?\\.\\&=\\/%+]*)|((?i)\\w+[\\.\\w\\-]+@(\\w+[\\.\\w\\-])+)|((?i)\\b(note|fixme):)|((?i)\\$\\w+:.+\\$)/',
- );
- $this->_counts = array (
- -1 =>
- array (
- 0 => 0,
- 1 => 0,
- 2 => 0,
- 3 => 0,
- 4 => 0,
- 5 => 0,
- 6 => 0,
- 7 => 0,
- 8 => 0,
- ),
- 0 =>
- array (
- 0 => 0,
- 1 => 0,
- 2 => 0,
- 3 => 0,
- 4 => 0,
- 5 => 0,
- 6 => 0,
- 7 => 0,
- 8 => 0,
- ),
- 1 =>
- array (
- 0 => 0,
- 1 => 0,
- 2 => 0,
- 3 => 0,
- 4 => 0,
- 5 => 0,
- 6 => 0,
- 7 => 0,
- 8 => 0,
- ),
- 2 =>
- array (
- 0 => 0,
- 1 => 0,
- 2 => 0,
- 3 => 0,
- 4 => 0,
- 5 => 0,
- 6 => 0,
- 7 => 0,
- 8 => 0,
- ),
- 3 =>
- array (
- 0 => 3,
- 1 => 1,
- 2 => 1,
- 3 => 0,
- ),
- 4 =>
- array (
- 0 => 0,
- ),
- 5 =>
- array (
- 0 => 0,
- ),
- 6 =>
- array (
- 0 => 3,
- 1 => 1,
- 2 => 1,
- 3 => 0,
- ),
- );
- $this->_delim = array (
- -1 =>
- array (
- 0 => 'brackets',
- 1 => 'brackets',
- 2 => 'brackets',
- 3 => 'comment',
- 4 => 'quotes',
- 5 => 'quotes',
- 6 => 'comment',
- 7 => '',
- 8 => '',
- ),
- 0 =>
- array (
- 0 => 'brackets',
- 1 => 'brackets',
- 2 => 'brackets',
- 3 => 'comment',
- 4 => 'quotes',
- 5 => 'quotes',
- 6 => 'comment',
- 7 => '',
- 8 => '',
- ),
- 1 =>
- array (
- 0 => 'brackets',
- 1 => 'brackets',
- 2 => 'brackets',
- 3 => 'comment',
- 4 => 'quotes',
- 5 => 'quotes',
- 6 => 'comment',
- 7 => '',
- 8 => '',
- ),
- 2 =>
- array (
- 0 => 'brackets',
- 1 => 'brackets',
- 2 => 'brackets',
- 3 => 'comment',
- 4 => 'quotes',
- 5 => 'quotes',
- 6 => 'comment',
- 7 => '',
- 8 => '',
- ),
- 3 =>
- array (
- 0 => '',
- 1 => '',
- 2 => '',
- 3 => '',
- ),
- 4 =>
- array (
- 0 => '',
- ),
- 5 =>
- array (
- 0 => '',
- ),
- 6 =>
- array (
- 0 => '',
- 1 => '',
- 2 => '',
- 3 => '',
- ),
- );
- $this->_inner = array (
- -1 =>
- array (
- 0 => 'code',
- 1 => 'code',
- 2 => 'code',
- 3 => 'comment',
- 4 => 'string',
- 5 => 'string',
- 6 => 'comment',
- 7 => 'identifier',
- 8 => 'number',
- ),
- 0 =>
- array (
- 0 => 'code',
- 1 => 'code',
- 2 => 'code',
- 3 => 'comment',
- 4 => 'string',
- 5 => 'string',
- 6 => 'comment',
- 7 => 'identifier',
- 8 => 'number',
- ),
- 1 =>
- array (
- 0 => 'code',
- 1 => 'code',
- 2 => 'code',
- 3 => 'comment',
- 4 => 'string',
- 5 => 'string',
- 6 => 'comment',
- 7 => 'identifier',
- 8 => 'number',
- ),
- 2 =>
- array (
- 0 => 'code',
- 1 => 'code',
- 2 => 'code',
- 3 => 'comment',
- 4 => 'string',
- 5 => 'string',
- 6 => 'comment',
- 7 => 'identifier',
- 8 => 'number',
- ),
- 3 =>
- array (
- 0 => 'url',
- 1 => 'url',
- 2 => 'inlinedoc',
- 3 => 'inlinedoc',
- ),
- 4 =>
- array (
- 0 => 'special',
- ),
- 5 =>
- array (
- 0 => 'special',
- ),
- 6 =>
- array (
- 0 => 'url',
- 1 => 'url',
- 2 => 'inlinedoc',
- 3 => 'inlinedoc',
- ),
- );
- $this->_end = array (
- 0 => '/(?i)\\}/',
- 1 => '/(?i)\\)/',
- 2 => '/(?i)\\]/',
- 3 => '/(?i)\\*\\//',
- 4 => '/(?i)"/',
- 5 => '/(?i)\'/',
- 6 => '/(?mi)$/',
- );
- $this->_states = array (
- -1 =>
- array (
- 0 => 0,
- 1 => 1,
- 2 => 2,
- 3 => 3,
- 4 => 4,
- 5 => 5,
- 6 => 6,
- 7 => -1,
- 8 => -1,
- ),
- 0 =>
- array (
- 0 => 0,
- 1 => 1,
- 2 => 2,
- 3 => 3,
- 4 => 4,
- 5 => 5,
- 6 => 6,
- 7 => -1,
- 8 => -1,
- ),
- 1 =>
- array (
- 0 => 0,
- 1 => 1,
- 2 => 2,
- 3 => 3,
- 4 => 4,
- 5 => 5,
- 6 => 6,
- 7 => -1,
- 8 => -1,
- ),
- 2 =>
- array (
- 0 => 0,
- 1 => 1,
- 2 => 2,
- 3 => 3,
- 4 => 4,
- 5 => 5,
- 6 => 6,
- 7 => -1,
- 8 => -1,
- ),
- 3 =>
- array (
- 0 => -1,
- 1 => -1,
- 2 => -1,
- 3 => -1,
- ),
- 4 =>
- array (
- 0 => -1,
- ),
- 5 =>
- array (
- 0 => -1,
- ),
- 6 =>
- array (
- 0 => -1,
- 1 => -1,
- 2 => -1,
- 3 => -1,
- ),
- );
- $this->_keywords = array (
- -1 =>
- array (
- 0 => -1,
- 1 => -1,
- 2 => -1,
- 3 => -1,
- 4 => -1,
- 5 => -1,
- 6 => -1,
- 7 =>
- array (
- 'builtin' => '/^(String|Array|RegExp|Function|Math|Number|Date|Image|window|document|navigator|onAbort|onBlur|onChange|onClick|onDblClick|onDragDrop|onError|onFocus|onKeyDown|onKeyPress|onKeyUp|onLoad|onMouseDown|onMouseOver|onMouseOut|onMouseMove|onMouseUp|onMove|onReset|onResize|onSelect|onSubmit|onUnload)$/',
- 'reserved' => '/^(break|continue|do|while|export|for|in|if|else|import|return|label|switch|case|var|with|delete|new|this|typeof|void|abstract|boolean|byte|catch|char|class|const|debugger|default|double|enum|extends|false|final|finally|float|function|implements|goto|instanceof|int|interface|long|native|null|package|private|protected|public|short|static|super|synchronized|throw|throws|transient|true|try|volatile)$/',
- ),
- 8 =>
- array (
- ),
- ),
- 0 =>
- array (
- 0 => -1,
- 1 => -1,
- 2 => -1,
- 3 => -1,
- 4 => -1,
- 5 => -1,
- 6 => -1,
- 7 =>
- array (
- 'builtin' => '/^(String|Array|RegExp|Function|Math|Number|Date|Image|window|document|navigator|onAbort|onBlur|onChange|onClick|onDblClick|onDragDrop|onError|onFocus|onKeyDown|onKeyPress|onKeyUp|onLoad|onMouseDown|onMouseOver|onMouseOut|onMouseMove|onMouseUp|onMove|onReset|onResize|onSelect|onSubmit|onUnload)$/',
- 'reserved' => '/^(break|continue|do|while|export|for|in|if|else|import|return|label|switch|case|var|with|delete|new|this|typeof|void|abstract|boolean|byte|catch|char|class|const|debugger|default|double|enum|extends|false|final|finally|float|function|implements|goto|instanceof|int|interface|long|native|null|package|private|protected|public|short|static|super|synchronized|throw|throws|transient|true|try|volatile)$/',
- ),
- 8 =>
- array (
- ),
- ),
- 1 =>
- array (
- 0 => -1,
- 1 => -1,
- 2 => -1,
- 3 => -1,
- 4 => -1,
- 5 => -1,
- 6 => -1,
- 7 =>
- array (
- 'builtin' => '/^(String|Array|RegExp|Function|Math|Number|Date|Image|window|document|navigator|onAbort|onBlur|onChange|onClick|onDblClick|onDragDrop|onError|onFocus|onKeyDown|onKeyPress|onKeyUp|onLoad|onMouseDown|onMouseOver|onMouseOut|onMouseMove|onMouseUp|onMove|onReset|onResize|onSelect|onSubmit|onUnload)$/',
- 'reserved' => '/^(break|continue|do|while|export|for|in|if|else|import|return|label|switch|case|var|with|delete|new|this|typeof|void|abstract|boolean|byte|catch|char|class|const|debugger|default|double|enum|extends|false|final|finally|float|function|implements|goto|instanceof|int|interface|long|native|null|package|private|protected|public|short|static|super|synchronized|throw|throws|transient|true|try|volatile)$/',
- ),
- 8 =>
- array (
- ),
- ),
- 2 =>
- array (
- 0 => -1,
- 1 => -1,
- 2 => -1,
- 3 => -1,
- 4 => -1,
- 5 => -1,
- 6 => -1,
- 7 =>
- array (
- 'builtin' => '/^(String|Array|RegExp|Function|Math|Number|Date|Image|window|document|navigator|onAbort|onBlur|onChange|onClick|onDblClick|onDragDrop|onError|onFocus|onKeyDown|onKeyPress|onKeyUp|onLoad|onMouseDown|onMouseOver|onMouseOut|onMouseMove|onMouseUp|onMove|onReset|onResize|onSelect|onSubmit|onUnload)$/',
- 'reserved' => '/^(break|continue|do|while|export|for|in|if|else|import|return|label|switch|case|var|with|delete|new|this|typeof|void|abstract|boolean|byte|catch|char|class|const|debugger|default|double|enum|extends|false|final|finally|float|function|implements|goto|instanceof|int|interface|long|native|null|package|private|protected|public|short|static|super|synchronized|throw|throws|transient|true|try|volatile)$/',
- ),
- 8 =>
- array (
- ),
- ),
- 3 =>
- array (
- 0 =>
- array (
- ),
- 1 =>
- array (
- ),
- 2 =>
- array (
- ),
- 3 =>
- array (
- ),
- ),
- 4 =>
- array (
- 0 =>
- array (
- ),
- ),
- 5 =>
- array (
- 0 =>
- array (
- ),
- ),
- 6 =>
- array (
- 0 =>
- array (
- ),
- 1 =>
- array (
- ),
- 2 =>
- array (
- ),
- 3 =>
- array (
- ),
- ),
- );
- $this->_parts = array (
- 0 =>
- array (
- 0 => NULL,
- 1 => NULL,
- 2 => NULL,
- 3 => NULL,
- 4 => NULL,
- 5 => NULL,
- 6 => NULL,
- 7 => NULL,
- 8 => NULL,
- ),
- 1 =>
- array (
- 0 => NULL,
- 1 => NULL,
- 2 => NULL,
- 3 => NULL,
- 4 => NULL,
- 5 => NULL,
- 6 => NULL,
- 7 => NULL,
- 8 => NULL,
- ),
- 2 =>
- array (
- 0 => NULL,
- 1 => NULL,
- 2 => NULL,
- 3 => NULL,
- 4 => NULL,
- 5 => NULL,
- 6 => NULL,
- 7 => NULL,
- 8 => NULL,
- ),
- 3 =>
- array (
- 0 => NULL,
- 1 => NULL,
- 2 => NULL,
- 3 => NULL,
- ),
- 4 =>
- array (
- 0 => NULL,
- ),
- 5 =>
- array (
- 0 => NULL,
- ),
- 6 =>
- array (
- 0 => NULL,
- 1 => NULL,
- 2 => NULL,
- 3 => NULL,
- ),
- );
- $this->_subst = array (
- -1 =>
- array (
- 0 => false,
- 1 => false,
- 2 => false,
- 3 => false,
- 4 => false,
- 5 => false,
- 6 => false,
- 7 => false,
- 8 => false,
- ),
- 0 =>
- array (
- 0 => false,
- 1 => false,
- 2 => false,
- 3 => false,
- 4 => false,
- 5 => false,
- 6 => false,
- 7 => false,
- 8 => false,
- ),
- 1 =>
- array (
- 0 => false,
- 1 => false,
- 2 => false,
- 3 => false,
- 4 => false,
- 5 => false,
- 6 => false,
- 7 => false,
- 8 => false,
- ),
- 2 =>
- array (
- 0 => false,
- 1 => false,
- 2 => false,
- 3 => false,
- 4 => false,
- 5 => false,
- 6 => false,
- 7 => false,
- 8 => false,
- ),
- 3 =>
- array (
- 0 => false,
- 1 => false,
- 2 => false,
- 3 => false,
- ),
- 4 =>
- array (
- 0 => false,
- ),
- 5 =>
- array (
- 0 => false,
- ),
- 6 =>
- array (
- 0 => false,
- 1 => false,
- 2 => false,
- 3 => false,
- ),
- );
- $this->_conditions = array (
- );
- $this->_kwmap = array (
- 'builtin' => 'builtin',
- 'reserved' => 'reserved',
- );
- $this->_defClass = 'code';
- $this->_checkDefines();
- }
-
-}
diff --git a/library/Text_Highlighter/Text/Highlighter/MYSQL.php b/library/Text_Highlighter/Text/Highlighter/MYSQL.php
deleted file mode 100644
index bdd74cc8b..000000000
--- a/library/Text_Highlighter/Text/Highlighter/MYSQL.php
+++ /dev/null
@@ -1,434 +0,0 @@
-<?php
-/**
- * Auto-generated class. MYSQL syntax highlighting
- *
- * PHP version 4 and 5
- *
- * LICENSE: This source file is subject to version 3.0 of the PHP license
- * that is available through the world-wide-web at the following URI:
- * http://www.php.net/license/3_0.txt. If you did not receive a copy of
- * the PHP License and are unable to obtain it through the web, please
- * send a note to license@php.net so we can mail you a copy immediately.
- *
- * @copyright 2004-2006 Andrey Demenev
- * @license http://www.php.net/license/3_0.txt PHP License
- * @link http://pear.php.net/package/Text_Highlighter
- * @category Text
- * @package Text_Highlighter
- * @version generated from: : mysql.xml,v 1.1 2007/06/03 02:35:28 ssttoo Exp
- * @author Andrey Demenev <demenev@gmail.com>
- *
- */
-
-/**
- * @ignore
- */
-
-require_once 'Text/Highlighter.php';
-
-/**
- * Auto-generated class. MYSQL syntax highlighting
- *
- * @author Andrey Demenev <demenev@gmail.com>
- * @category Text
- * @package Text_Highlighter
- * @copyright 2004-2006 Andrey Demenev
- * @license http://www.php.net/license/3_0.txt PHP License
- * @version Release: @package_version@
- * @link http://pear.php.net/package/Text_Highlighter
- */
-class Text_Highlighter_MYSQL extends Text_Highlighter
-{
- var $_language = 'mysql';
-
- /**
- * PHP4 Compatible Constructor
- *
- * @param array $options
- * @access public
- */
- function Text_Highlighter_MYSQL($options=array())
- {
- $this->__construct($options);
- }
-
-
- /**
- * Constructor
- *
- * @param array $options
- * @access public
- */
- function __construct($options=array())
- {
-
- $this->_options = $options;
- $this->_regs = array (
- -1 => '/((?i)`)|((?i)\\/\\*)|((?i)(#|--\\s).*)|((?i)[a-z_]\\w*(?=\\s*\\())|((?i)[a-z_]\\w*)|((?i)")|((?i)\\()|((?i)\')|((?i)((\\d+|((\\d*\\.\\d+)|(\\d+\\.\\d*)))[eE][+-]?\\d+))|((?i)(\\d*\\.\\d+)|(\\d+\\.\\d*))|((?i)\\d+l?|\\b0l?\\b)|((?i)0[xX][\\da-f]+l?)/',
- 0 => '//',
- 1 => '//',
- 2 => '/((?i)\\\\.)/',
- 3 => '/((?i)`)|((?i)\\/\\*)|((?i)(#|--\\s).*)|((?i)[a-z_]\\w*(?=\\s*\\())|((?i)[a-z_]\\w*)|((?i)")|((?i)\\()|((?i)\')|((?i)((\\d+|((\\d*\\.\\d+)|(\\d+\\.\\d*)))[eE][+-]?\\d+))|((?i)(\\d*\\.\\d+)|(\\d+\\.\\d*))|((?i)\\d+l?|\\b0l?\\b)|((?i)0[xX][\\da-f]+l?)/',
- 4 => '/((?i)\\\\.)/',
- );
- $this->_counts = array (
- -1 =>
- array (
- 0 => 0,
- 1 => 0,
- 2 => 1,
- 3 => 0,
- 4 => 0,
- 5 => 0,
- 6 => 0,
- 7 => 0,
- 8 => 5,
- 9 => 2,
- 10 => 0,
- 11 => 0,
- ),
- 0 =>
- array (
- ),
- 1 =>
- array (
- ),
- 2 =>
- array (
- 0 => 0,
- ),
- 3 =>
- array (
- 0 => 0,
- 1 => 0,
- 2 => 1,
- 3 => 0,
- 4 => 0,
- 5 => 0,
- 6 => 0,
- 7 => 0,
- 8 => 5,
- 9 => 2,
- 10 => 0,
- 11 => 0,
- ),
- 4 =>
- array (
- 0 => 0,
- ),
- );
- $this->_delim = array (
- -1 =>
- array (
- 0 => 'quotes',
- 1 => 'comment',
- 2 => '',
- 3 => '',
- 4 => '',
- 5 => 'quotes',
- 6 => 'brackets',
- 7 => 'quotes',
- 8 => '',
- 9 => '',
- 10 => '',
- 11 => '',
- ),
- 0 =>
- array (
- ),
- 1 =>
- array (
- ),
- 2 =>
- array (
- 0 => '',
- ),
- 3 =>
- array (
- 0 => 'quotes',
- 1 => 'comment',
- 2 => '',
- 3 => '',
- 4 => '',
- 5 => 'quotes',
- 6 => 'brackets',
- 7 => 'quotes',
- 8 => '',
- 9 => '',
- 10 => '',
- 11 => '',
- ),
- 4 =>
- array (
- 0 => '',
- ),
- );
- $this->_inner = array (
- -1 =>
- array (
- 0 => 'identifier',
- 1 => 'comment',
- 2 => 'comment',
- 3 => 'identifier',
- 4 => 'identifier',
- 5 => 'string',
- 6 => 'code',
- 7 => 'string',
- 8 => 'number',
- 9 => 'number',
- 10 => 'number',
- 11 => 'number',
- ),
- 0 =>
- array (
- ),
- 1 =>
- array (
- ),
- 2 =>
- array (
- 0 => 'special',
- ),
- 3 =>
- array (
- 0 => 'identifier',
- 1 => 'comment',
- 2 => 'comment',
- 3 => 'identifier',
- 4 => 'identifier',
- 5 => 'string',
- 6 => 'code',
- 7 => 'string',
- 8 => 'number',
- 9 => 'number',
- 10 => 'number',
- 11 => 'number',
- ),
- 4 =>
- array (
- 0 => 'special',
- ),
- );
- $this->_end = array (
- 0 => '/(?i)`/',
- 1 => '/(?i)\\*\\//',
- 2 => '/(?i)"/',
- 3 => '/(?i)\\)/',
- 4 => '/(?i)\'/',
- );
- $this->_states = array (
- -1 =>
- array (
- 0 => 0,
- 1 => 1,
- 2 => -1,
- 3 => -1,
- 4 => -1,
- 5 => 2,
- 6 => 3,
- 7 => 4,
- 8 => -1,
- 9 => -1,
- 10 => -1,
- 11 => -1,
- ),
- 0 =>
- array (
- ),
- 1 =>
- array (
- ),
- 2 =>
- array (
- 0 => -1,
- ),
- 3 =>
- array (
- 0 => 0,
- 1 => 1,
- 2 => -1,
- 3 => -1,
- 4 => -1,
- 5 => 2,
- 6 => 3,
- 7 => 4,
- 8 => -1,
- 9 => -1,
- 10 => -1,
- 11 => -1,
- ),
- 4 =>
- array (
- 0 => -1,
- ),
- );
- $this->_keywords = array (
- -1 =>
- array (
- 0 => -1,
- 1 => -1,
- 2 =>
- array (
- ),
- 3 =>
- array (
- 'function' => '/^((?i)abs|acos|adddate|ascii|asin|atan|atan2|avg|benchmark|bin|ceiling|char|coalesce|concat|conv|cos|cot|count|curdate|curtime|database|dayname|dayofmonth|dayofweek|dayofyear|decode|degrees|elt|encode|encrypt|exp|extract|field|floor|format|greatest|hex|hour|if|ifnull|insert|instr|interval|isnull|lcase|least|left|length|locate|log|log10|lower|lpad|ltrim|max|md5|mid|min|minute|mod|month|monthname|now|nullif|oct|ord|password|pi|position|pow|power|prepare|quarter|radians|rand|repeat|replace|reverse|right|round|rpad|rtrim|second|sign|sin|soundex|space|sqrt|std|stddev|strcmp|subdate|substring|sum|sysdate|tan|trim|truncate|ucase|upper|user|version|week|weekday|year)$/',
- ),
- 4 =>
- array (
- 'reserved' => '/^((?i)action|add|aggregate|all|alter|after|and|as|asc|avg|avg_row_length|auto_increment|between|bigint|bit|binary|blob|bool|both|by|cascade|case|char|character|change|check|checksum|column|columns|comment|constraint|create|cross|current_date|current_time|current_timestamp|data|database|databases|date|datetime|day|day_hour|day_minute|day_second|dayofmonth|dayofweek|dayofyear|dec|decimal|default|delayed|delay_key_write|delete|desc|describe|distinct|distinctrow|double|drop|end|else|escape|escaped|enclosed|enum|explain|exists|fields|file|first|float|float4|float8|flush|foreign|from|for|full|function|global|grant|grants|group|having|heap|high_priority|hour|hour_minute|hour_second|hosts|identified|ignore|in|index|infile|inner|insert|insert_id|int|integer|interval|int1|int2|int3|int4|int8|into|if|is|isam|join|key|keys|kill|last_insert_id|leading|left|length|like|lines|limit|load|local|lock|logs|long|longblob|longtext|low_priority|max|max_rows|match|mediumblob|mediumtext|mediumint|middleint|min_rows|minute|minute_second|modify|month|monthname|myisam|natural|numeric|no|not|null|on|optimize|option|optionally|or|order|outer|outfile|pack_keys|partial|password|precision|primary|procedure|process|processlist|privileges|read|real|references|reload|regexp|rename|replace|restrict|returns|revoke|rlike|row|rows|second|select|set|show|shutdown|smallint|soname|sql_big_tables|sql_big_selects|sql_low_priority_updates|sql_log_off|sql_log_update|sql_select_limit|sql_small_result|sql_big_result|sql_warnings|straight_join|starting|status|string|table|tables|temporary|terminated|text|then|time|timestamp|tinyblob|tinytext|tinyint|trailing|to|type|use|using|unique|unlock|unsigned|update|usage|values|varchar|variables|varying|varbinary|with|write|when|where|year|year_month|zerofill)$/',
- ),
- 5 => -1,
- 6 => -1,
- 7 => -1,
- 8 =>
- array (
- ),
- 9 =>
- array (
- ),
- 10 =>
- array (
- ),
- 11 =>
- array (
- ),
- ),
- 0 =>
- array (
- ),
- 1 =>
- array (
- ),
- 2 =>
- array (
- 0 =>
- array (
- ),
- ),
- 3 =>
- array (
- 0 => -1,
- 1 => -1,
- 2 =>
- array (
- ),
- 3 =>
- array (
- 'function' => '/^((?i)abs|acos|adddate|ascii|asin|atan|atan2|avg|benchmark|bin|ceiling|char|coalesce|concat|conv|cos|cot|count|curdate|curtime|database|dayname|dayofmonth|dayofweek|dayofyear|decode|degrees|elt|encode|encrypt|exp|extract|field|floor|format|greatest|hex|hour|if|ifnull|insert|instr|interval|isnull|lcase|least|left|length|locate|log|log10|lower|lpad|ltrim|max|md5|mid|min|minute|mod|month|monthname|now|nullif|oct|ord|password|pi|position|pow|power|prepare|quarter|radians|rand|repeat|replace|reverse|right|round|rpad|rtrim|second|sign|sin|soundex|space|sqrt|std|stddev|strcmp|subdate|substring|sum|sysdate|tan|trim|truncate|ucase|upper|user|version|week|weekday|year)$/',
- ),
- 4 =>
- array (
- 'reserved' => '/^((?i)action|add|aggregate|all|alter|after|and|as|asc|avg|avg_row_length|auto_increment|between|bigint|bit|binary|blob|bool|both|by|cascade|case|char|character|change|check|checksum|column|columns|comment|constraint|create|cross|current_date|current_time|current_timestamp|data|database|databases|date|datetime|day|day_hour|day_minute|day_second|dayofmonth|dayofweek|dayofyear|dec|decimal|default|delayed|delay_key_write|delete|desc|describe|distinct|distinctrow|double|drop|end|else|escape|escaped|enclosed|enum|explain|exists|fields|file|first|float|float4|float8|flush|foreign|from|for|full|function|global|grant|grants|group|having|heap|high_priority|hour|hour_minute|hour_second|hosts|identified|ignore|in|index|infile|inner|insert|insert_id|int|integer|interval|int1|int2|int3|int4|int8|into|if|is|isam|join|key|keys|kill|last_insert_id|leading|left|length|like|lines|limit|load|local|lock|logs|long|longblob|longtext|low_priority|max|max_rows|match|mediumblob|mediumtext|mediumint|middleint|min_rows|minute|minute_second|modify|month|monthname|myisam|natural|numeric|no|not|null|on|optimize|option|optionally|or|order|outer|outfile|pack_keys|partial|password|precision|primary|procedure|process|processlist|privileges|read|real|references|reload|regexp|rename|replace|restrict|returns|revoke|rlike|row|rows|second|select|set|show|shutdown|smallint|soname|sql_big_tables|sql_big_selects|sql_low_priority_updates|sql_log_off|sql_log_update|sql_select_limit|sql_small_result|sql_big_result|sql_warnings|straight_join|starting|status|string|table|tables|temporary|terminated|text|then|time|timestamp|tinyblob|tinytext|tinyint|trailing|to|type|use|using|unique|unlock|unsigned|update|usage|values|varchar|variables|varying|varbinary|with|write|when|where|year|year_month|zerofill)$/',
- ),
- 5 => -1,
- 6 => -1,
- 7 => -1,
- 8 =>
- array (
- ),
- 9 =>
- array (
- ),
- 10 =>
- array (
- ),
- 11 =>
- array (
- ),
- ),
- 4 =>
- array (
- 0 =>
- array (
- ),
- ),
- );
- $this->_parts = array (
- 0 =>
- array (
- ),
- 1 =>
- array (
- ),
- 2 =>
- array (
- 0 => NULL,
- ),
- 3 =>
- array (
- 0 => NULL,
- 1 => NULL,
- 2 => NULL,
- 3 => NULL,
- 4 => NULL,
- 5 => NULL,
- 6 => NULL,
- 7 => NULL,
- 8 => NULL,
- 9 => NULL,
- 10 => NULL,
- 11 => NULL,
- ),
- 4 =>
- array (
- 0 => NULL,
- ),
- );
- $this->_subst = array (
- -1 =>
- array (
- 0 => false,
- 1 => false,
- 2 => false,
- 3 => false,
- 4 => false,
- 5 => false,
- 6 => false,
- 7 => false,
- 8 => false,
- 9 => false,
- 10 => false,
- 11 => false,
- ),
- 0 =>
- array (
- ),
- 1 =>
- array (
- ),
- 2 =>
- array (
- 0 => false,
- ),
- 3 =>
- array (
- 0 => false,
- 1 => false,
- 2 => false,
- 3 => false,
- 4 => false,
- 5 => false,
- 6 => false,
- 7 => false,
- 8 => false,
- 9 => false,
- 10 => false,
- 11 => false,
- ),
- 4 =>
- array (
- 0 => false,
- ),
- );
- $this->_conditions = array (
- );
- $this->_kwmap = array (
- 'function' => 'reserved',
- 'reserved' => 'reserved',
- );
- $this->_defClass = 'code';
- $this->_checkDefines();
- }
-
-} \ No newline at end of file
diff --git a/library/Text_Highlighter/Text/Highlighter/PERL.php b/library/Text_Highlighter/Text/Highlighter/PERL.php
deleted file mode 100644
index 277a5ba45..000000000
--- a/library/Text_Highlighter/Text/Highlighter/PERL.php
+++ /dev/null
@@ -1,1352 +0,0 @@
-<?php
-/**
- * Auto-generated class. PERL syntax highlighting
- *
- * This highlighter is EXPERIMENTAL, so that it may work incorrectly.
- * Most rules were created by Mariusz Jakubowski, and extended by me.
- * My knowledge of Perl is poor, and Perl syntax seems too
- * complicated to me.
- *
- * PHP version 4 and 5
- *
- * LICENSE: This source file is subject to version 3.0 of the PHP license
- * that is available through the world-wide-web at the following URI:
- * http://www.php.net/license/3_0.txt. If you did not receive a copy of
- * the PHP License and are unable to obtain it through the web, please
- * send a note to license@php.net so we can mail you a copy immediately.
- *
- * @copyright 2004-2006 Andrey Demenev
- * @license http://www.php.net/license/3_0.txt PHP License
- * @link http://pear.php.net/package/Text_Highlighter
- * @category Text
- * @package Text_Highlighter
- * @version generated from: : perl.xml,v 1.1 2007/06/03 02:35:28 ssttoo Exp
- * @author Mariusz 'kg' Jakubowski <kg@alternatywa.info>
- * @author Andrey Demenev <demenev@gmail.com>
- *
- */
-
-/**
- * @ignore
- */
-
-require_once 'Text/Highlighter.php';
-
-/**
- * Auto-generated class. PERL syntax highlighting
- *
- * @author Mariusz 'kg' Jakubowski <kg@alternatywa.info>
- * @author Andrey Demenev <demenev@gmail.com>
- * @category Text
- * @package Text_Highlighter
- * @copyright 2004-2006 Andrey Demenev
- * @license http://www.php.net/license/3_0.txt PHP License
- * @version Release: @package_version@
- * @link http://pear.php.net/package/Text_Highlighter
- */
-class Text_Highlighter_PERL extends Text_Highlighter
-{
- var $_language = 'perl';
-
- /**
- * PHP4 Compatible Constructor
- *
- * @param array $options
- * @access public
- */
- function Text_Highlighter_PERL($options=array())
- {
- $this->__construct($options);
- }
-
-
- /**
- * Constructor
- *
- * @param array $options
- * @access public
- */
- function __construct($options=array())
- {
-
- $this->_options = $options;
- $this->_regs = array (
- -1 => '/((?m)^(#!)(.*))|((?m)^=\\w+)|(\\{)|(\\()|(\\[)|((use)\\s+([\\w:]*))|([& ](\\w{2,}::)+\\w{2,})|((?Us)\\b(q[wq]\\s*((\\{)|(\\()|(\\[)|(\\<)|([\\W\\S])))(?=(.*)((?(3)\\})(?(4)\\))(?(5)\\])(?(6)\\>)(?(7)\\7))))|((?Us)\\b(q\\s*((\\{)|(\\()|(\\[)|(\\<)|([\\W\\S])))(?=(.*)((?(3)\\})(?(4)\\))(?(5)\\])(?(6)\\>)(?(7)\\7))))|(#.*)|((?x)(s|tr) ([|#~`!@$%^&*-+=\\\\;:\'",.\\/?]) ((\\\\.|[^\\\\])*?) (\\2)((\\\\.|[^\\\\])*?)(\\2[ecgimosx]*))|((?x)(m) ([|#~`!@$%^&*-+=\\\\;:\'",.\\/?]) ((\\\\.|[^\\\\])*?) (\\2[ecgimosx]*))|( \\/)|(\\$#?[1-9\'`@!])|((?i)(\\$#?|[@%*])([a-z1-9_]+::)*([a-z1-9_]+|\\^(?-i)[A-Z]?(?i)))|((?i)\\$([a-z1-9_]+|\\^(?-i)[A-Z]?(?i)))|((?i)(&|\\w+)\'[\\w_\']+\\b)|((?i)(\\{)([a-z1-9]+)(\\}))|((?i)[\\$@%]#?\\{[a-z1-9]+\\})|(`)|(\')|(")|((?i)[a-z_]\\w*)|(\\d*\\.?\\d+)/',
- 0 => '//',
- 1 => '/((?m)^(#!)(.*))|((?m)^=\\w+)|(\\{)|(\\()|(\\[)|((use)\\s+([\\w:]*))|([& ](\\w{2,}::)+\\w{2,})|((?Us)\\b(q[wq]\\s*((\\{)|(\\()|(\\[)|(\\<)|([\\W\\S])))(?=(.*)((?(3)\\})(?(4)\\))(?(5)\\])(?(6)\\>)(?(7)\\7))))|((?Us)\\b(q\\s*((\\{)|(\\()|(\\[)|(\\<)|([\\W\\S])))(?=(.*)((?(3)\\})(?(4)\\))(?(5)\\])(?(6)\\>)(?(7)\\7))))|(#.*)|((?x)(s|tr) ([|#~`!@$%^&*-+=\\\\;:\'",.\\/?]) ((\\\\.|[^\\\\])*?) (\\2)((\\\\.|[^\\\\])*?)(\\2[ecgimosx]*))|((?x)(m) ([|#~`!@$%^&*-+=\\\\;:\'",.\\/?]) ((\\\\.|[^\\\\])*?) (\\2[ecgimosx]*))|( \\/)|(\\$#?[1-9\'`@!])|((?i)(\\$#?|[@%*])([a-z1-9_]+::)*([a-z1-9_]+|\\^(?-i)[A-Z]?(?i)))|((?i)\\$([a-z1-9_]+|\\^(?-i)[A-Z]?(?i)))|((?i)(&|\\w+)\'[\\w_\']+\\b)|((?i)(\\{)([a-z1-9]+)(\\}))|((?i)[\\$@%]#?\\{[a-z1-9]+\\})|(`)|(\')|(")|((?i)[a-z_]\\w*)|(\\d*\\.?\\d+)/',
- 2 => '/((?m)^(#!)(.*))|((?m)^=\\w+)|(\\{)|(\\()|(\\[)|((use)\\s+([\\w:]*))|([& ](\\w{2,}::)+\\w{2,})|((?Us)\\b(q[wq]\\s*((\\{)|(\\()|(\\[)|(\\<)|([\\W\\S])))(?=(.*)((?(3)\\})(?(4)\\))(?(5)\\])(?(6)\\>)(?(7)\\7))))|((?Us)\\b(q\\s*((\\{)|(\\()|(\\[)|(\\<)|([\\W\\S])))(?=(.*)((?(3)\\})(?(4)\\))(?(5)\\])(?(6)\\>)(?(7)\\7))))|(#.*)|((?x)(s|tr) ([|#~`!@$%^&*-+=\\\\;:\'",.\\/?]) ((\\\\.|[^\\\\])*?) (\\2)((\\\\.|[^\\\\])*?)(\\2[ecgimosx]*))|((?x)(m) ([|#~`!@$%^&*-+=\\\\;:\'",.\\/?]) ((\\\\.|[^\\\\])*?) (\\2[ecgimosx]*))|( \\/)|((?i)([a-z1-9_]+)(\\s*=>))|(\\$#?[1-9\'`@!])|((?i)(\\$#?|[@%*])([a-z1-9_]+::)*([a-z1-9_]+|\\^(?-i)[A-Z]?(?i)))|((?i)\\$([a-z1-9_]+|\\^(?-i)[A-Z]?(?i)))|((?i)(&|\\w+)\'[\\w_\']+\\b)|((?i)(\\{)([a-z1-9]+)(\\}))|((?i)[\\$@%]#?\\{[a-z1-9]+\\})|(`)|(\')|(")|((?i)[a-z_]\\w*)|(\\d*\\.?\\d+)/',
- 3 => '/((?m)^(#!)(.*))|((?m)^=\\w+)|(\\{)|(\\()|(\\[)|((use)\\s+([\\w:]*))|([& ](\\w{2,}::)+\\w{2,})|((?Us)\\b(q[wq]\\s*((\\{)|(\\()|(\\[)|(\\<)|([\\W\\S])))(?=(.*)((?(3)\\})(?(4)\\))(?(5)\\])(?(6)\\>)(?(7)\\7))))|((?Us)\\b(q\\s*((\\{)|(\\()|(\\[)|(\\<)|([\\W\\S])))(?=(.*)((?(3)\\})(?(4)\\))(?(5)\\])(?(6)\\>)(?(7)\\7))))|(#.*)|((?x)(s|tr) ([|#~`!@$%^&*-+=\\\\;:\'",.\\/?]) ((\\\\.|[^\\\\])*?) (\\2)((\\\\.|[^\\\\])*?)(\\2[ecgimosx]*))|((?x)(m) ([|#~`!@$%^&*-+=\\\\;:\'",.\\/?]) ((\\\\.|[^\\\\])*?) (\\2[ecgimosx]*))|( \\/)|(\\$#?[1-9\'`@!])|((?i)(\\$#?|[@%*])([a-z1-9_]+::)*([a-z1-9_]+|\\^(?-i)[A-Z]?(?i)))|((?i)\\$([a-z1-9_]+|\\^(?-i)[A-Z]?(?i)))|((?i)(&|\\w+)\'[\\w_\']+\\b)|((?i)(\\{)([a-z1-9]+)(\\}))|((?i)[\\$@%]#?\\{[a-z1-9]+\\})|(`)|(\')|(")|((?i)[a-z_]\\w*)|(\\d*\\.?\\d+)/',
- 4 => '/(\\$#?[1-9\'`@!])|((?i)\\$([a-z1-9_]+|\\^(?-i)[A-Z]?(?i)))|((?i)[\\$@%]#?\\{[a-z1-9]+\\})|(\\\\[\\\\"\'`tnr\\$\\{@])/',
- 5 => '/(\\\\\\\\|\\\\"|\\\\\'|\\\\`)/',
- 6 => '/(\\\\\\/)/',
- 7 => '/(\\$#?[1-9\'`@!])|((?i)\\$([a-z1-9_]+|\\^(?-i)[A-Z]?(?i)))|((?i)[\\$@%]#?\\{[a-z1-9]+\\})|(\\\\\\\\|\\\\"|\\\\\'|\\\\`)/',
- 8 => '/(\\\\\\\\|\\\\"|\\\\\'|\\\\`)/',
- 9 => '/(\\$#?[1-9\'`@!])|((?i)\\$([a-z1-9_]+|\\^(?-i)[A-Z]?(?i)))|((?i)[\\$@%]#?\\{[a-z1-9]+\\})|(\\\\[\\\\"\'`tnr\\$\\{@])/',
- );
- $this->_counts = array (
- -1 =>
- array (
- 0 => 2,
- 1 => 0,
- 2 => 0,
- 3 => 0,
- 4 => 0,
- 5 => 2,
- 6 => 1,
- 7 => 9,
- 8 => 9,
- 9 => 0,
- 10 => 8,
- 11 => 5,
- 12 => 0,
- 13 => 0,
- 14 => 3,
- 15 => 1,
- 16 => 1,
- 17 => 3,
- 18 => 0,
- 19 => 0,
- 20 => 0,
- 21 => 0,
- 22 => 0,
- 23 => 0,
- ),
- 0 =>
- array (
- ),
- 1 =>
- array (
- 0 => 2,
- 1 => 0,
- 2 => 0,
- 3 => 0,
- 4 => 0,
- 5 => 2,
- 6 => 1,
- 7 => 9,
- 8 => 9,
- 9 => 0,
- 10 => 8,
- 11 => 5,
- 12 => 0,
- 13 => 0,
- 14 => 3,
- 15 => 1,
- 16 => 1,
- 17 => 3,
- 18 => 0,
- 19 => 0,
- 20 => 0,
- 21 => 0,
- 22 => 0,
- 23 => 0,
- ),
- 2 =>
- array (
- 0 => 2,
- 1 => 0,
- 2 => 0,
- 3 => 0,
- 4 => 0,
- 5 => 2,
- 6 => 1,
- 7 => 9,
- 8 => 9,
- 9 => 0,
- 10 => 8,
- 11 => 5,
- 12 => 0,
- 13 => 2,
- 14 => 0,
- 15 => 3,
- 16 => 1,
- 17 => 1,
- 18 => 3,
- 19 => 0,
- 20 => 0,
- 21 => 0,
- 22 => 0,
- 23 => 0,
- 24 => 0,
- ),
- 3 =>
- array (
- 0 => 2,
- 1 => 0,
- 2 => 0,
- 3 => 0,
- 4 => 0,
- 5 => 2,
- 6 => 1,
- 7 => 9,
- 8 => 9,
- 9 => 0,
- 10 => 8,
- 11 => 5,
- 12 => 0,
- 13 => 0,
- 14 => 3,
- 15 => 1,
- 16 => 1,
- 17 => 3,
- 18 => 0,
- 19 => 0,
- 20 => 0,
- 21 => 0,
- 22 => 0,
- 23 => 0,
- ),
- 4 =>
- array (
- 0 => 0,
- 1 => 1,
- 2 => 0,
- 3 => 0,
- ),
- 5 =>
- array (
- 0 => 0,
- ),
- 6 =>
- array (
- 0 => 0,
- ),
- 7 =>
- array (
- 0 => 0,
- 1 => 1,
- 2 => 0,
- 3 => 0,
- ),
- 8 =>
- array (
- 0 => 0,
- ),
- 9 =>
- array (
- 0 => 0,
- 1 => 1,
- 2 => 0,
- 3 => 0,
- ),
- );
- $this->_delim = array (
- -1 =>
- array (
- 0 => '',
- 1 => 'comment',
- 2 => 'brackets',
- 3 => 'brackets',
- 4 => 'brackets',
- 5 => '',
- 6 => '',
- 7 => 'quotes',
- 8 => 'quotes',
- 9 => '',
- 10 => '',
- 11 => '',
- 12 => 'quotes',
- 13 => '',
- 14 => '',
- 15 => '',
- 16 => '',
- 17 => '',
- 18 => '',
- 19 => 'quotes',
- 20 => 'quotes',
- 21 => 'quotes',
- 22 => '',
- 23 => '',
- ),
- 0 =>
- array (
- ),
- 1 =>
- array (
- 0 => '',
- 1 => 'comment',
- 2 => 'brackets',
- 3 => 'brackets',
- 4 => 'brackets',
- 5 => '',
- 6 => '',
- 7 => 'quotes',
- 8 => 'quotes',
- 9 => '',
- 10 => '',
- 11 => '',
- 12 => 'quotes',
- 13 => '',
- 14 => '',
- 15 => '',
- 16 => '',
- 17 => '',
- 18 => '',
- 19 => 'quotes',
- 20 => 'quotes',
- 21 => 'quotes',
- 22 => '',
- 23 => '',
- ),
- 2 =>
- array (
- 0 => '',
- 1 => 'comment',
- 2 => 'brackets',
- 3 => 'brackets',
- 4 => 'brackets',
- 5 => '',
- 6 => '',
- 7 => 'quotes',
- 8 => 'quotes',
- 9 => '',
- 10 => '',
- 11 => '',
- 12 => 'quotes',
- 13 => '',
- 14 => '',
- 15 => '',
- 16 => '',
- 17 => '',
- 18 => '',
- 19 => '',
- 20 => 'quotes',
- 21 => 'quotes',
- 22 => 'quotes',
- 23 => '',
- 24 => '',
- ),
- 3 =>
- array (
- 0 => '',
- 1 => 'comment',
- 2 => 'brackets',
- 3 => 'brackets',
- 4 => 'brackets',
- 5 => '',
- 6 => '',
- 7 => 'quotes',
- 8 => 'quotes',
- 9 => '',
- 10 => '',
- 11 => '',
- 12 => 'quotes',
- 13 => '',
- 14 => '',
- 15 => '',
- 16 => '',
- 17 => '',
- 18 => '',
- 19 => 'quotes',
- 20 => 'quotes',
- 21 => 'quotes',
- 22 => '',
- 23 => '',
- ),
- 4 =>
- array (
- 0 => '',
- 1 => '',
- 2 => '',
- 3 => '',
- ),
- 5 =>
- array (
- 0 => '',
- ),
- 6 =>
- array (
- 0 => '',
- ),
- 7 =>
- array (
- 0 => '',
- 1 => '',
- 2 => '',
- 3 => '',
- ),
- 8 =>
- array (
- 0 => '',
- ),
- 9 =>
- array (
- 0 => '',
- 1 => '',
- 2 => '',
- 3 => '',
- ),
- );
- $this->_inner = array (
- -1 =>
- array (
- 0 => 'special',
- 1 => 'comment',
- 2 => 'code',
- 3 => 'code',
- 4 => 'code',
- 5 => 'special',
- 6 => 'special',
- 7 => 'string',
- 8 => 'string',
- 9 => 'comment',
- 10 => 'string',
- 11 => 'string',
- 12 => 'string',
- 13 => 'var',
- 14 => 'var',
- 15 => 'var',
- 16 => 'var',
- 17 => 'var',
- 18 => 'var',
- 19 => 'string',
- 20 => 'string',
- 21 => 'string',
- 22 => 'identifier',
- 23 => 'number',
- ),
- 0 =>
- array (
- ),
- 1 =>
- array (
- 0 => 'special',
- 1 => 'comment',
- 2 => 'code',
- 3 => 'code',
- 4 => 'code',
- 5 => 'special',
- 6 => 'special',
- 7 => 'string',
- 8 => 'string',
- 9 => 'comment',
- 10 => 'string',
- 11 => 'string',
- 12 => 'string',
- 13 => 'var',
- 14 => 'var',
- 15 => 'var',
- 16 => 'var',
- 17 => 'var',
- 18 => 'var',
- 19 => 'string',
- 20 => 'string',
- 21 => 'string',
- 22 => 'identifier',
- 23 => 'number',
- ),
- 2 =>
- array (
- 0 => 'special',
- 1 => 'comment',
- 2 => 'code',
- 3 => 'code',
- 4 => 'code',
- 5 => 'special',
- 6 => 'special',
- 7 => 'string',
- 8 => 'string',
- 9 => 'comment',
- 10 => 'string',
- 11 => 'string',
- 12 => 'string',
- 13 => 'string',
- 14 => 'var',
- 15 => 'var',
- 16 => 'var',
- 17 => 'var',
- 18 => 'var',
- 19 => 'var',
- 20 => 'string',
- 21 => 'string',
- 22 => 'string',
- 23 => 'identifier',
- 24 => 'number',
- ),
- 3 =>
- array (
- 0 => 'special',
- 1 => 'comment',
- 2 => 'code',
- 3 => 'code',
- 4 => 'code',
- 5 => 'special',
- 6 => 'special',
- 7 => 'string',
- 8 => 'string',
- 9 => 'comment',
- 10 => 'string',
- 11 => 'string',
- 12 => 'string',
- 13 => 'var',
- 14 => 'var',
- 15 => 'var',
- 16 => 'var',
- 17 => 'var',
- 18 => 'var',
- 19 => 'string',
- 20 => 'string',
- 21 => 'string',
- 22 => 'identifier',
- 23 => 'number',
- ),
- 4 =>
- array (
- 0 => 'var',
- 1 => 'var',
- 2 => 'var',
- 3 => 'special',
- ),
- 5 =>
- array (
- 0 => 'special',
- ),
- 6 =>
- array (
- 0 => 'string',
- ),
- 7 =>
- array (
- 0 => 'var',
- 1 => 'var',
- 2 => 'var',
- 3 => 'special',
- ),
- 8 =>
- array (
- 0 => 'special',
- ),
- 9 =>
- array (
- 0 => 'var',
- 1 => 'var',
- 2 => 'var',
- 3 => 'special',
- ),
- );
- $this->_end = array (
- 0 => '/(?m)^=cut[^\\n]*/',
- 1 => '/\\}/',
- 2 => '/\\)/',
- 3 => '/\\]/',
- 4 => '/%b2%/',
- 5 => '/%b2%/',
- 6 => '/\\/[cgimosx]*/',
- 7 => '/`/',
- 8 => '/\'/',
- 9 => '/"/',
- );
- $this->_states = array (
- -1 =>
- array (
- 0 => -1,
- 1 => 0,
- 2 => 1,
- 3 => 2,
- 4 => 3,
- 5 => -1,
- 6 => -1,
- 7 => 4,
- 8 => 5,
- 9 => -1,
- 10 => -1,
- 11 => -1,
- 12 => 6,
- 13 => -1,
- 14 => -1,
- 15 => -1,
- 16 => -1,
- 17 => -1,
- 18 => -1,
- 19 => 7,
- 20 => 8,
- 21 => 9,
- 22 => -1,
- 23 => -1,
- ),
- 0 =>
- array (
- ),
- 1 =>
- array (
- 0 => -1,
- 1 => 0,
- 2 => 1,
- 3 => 2,
- 4 => 3,
- 5 => -1,
- 6 => -1,
- 7 => 4,
- 8 => 5,
- 9 => -1,
- 10 => -1,
- 11 => -1,
- 12 => 6,
- 13 => -1,
- 14 => -1,
- 15 => -1,
- 16 => -1,
- 17 => -1,
- 18 => -1,
- 19 => 7,
- 20 => 8,
- 21 => 9,
- 22 => -1,
- 23 => -1,
- ),
- 2 =>
- array (
- 0 => -1,
- 1 => 0,
- 2 => 1,
- 3 => 2,
- 4 => 3,
- 5 => -1,
- 6 => -1,
- 7 => 4,
- 8 => 5,
- 9 => -1,
- 10 => -1,
- 11 => -1,
- 12 => 6,
- 13 => -1,
- 14 => -1,
- 15 => -1,
- 16 => -1,
- 17 => -1,
- 18 => -1,
- 19 => -1,
- 20 => 7,
- 21 => 8,
- 22 => 9,
- 23 => -1,
- 24 => -1,
- ),
- 3 =>
- array (
- 0 => -1,
- 1 => 0,
- 2 => 1,
- 3 => 2,
- 4 => 3,
- 5 => -1,
- 6 => -1,
- 7 => 4,
- 8 => 5,
- 9 => -1,
- 10 => -1,
- 11 => -1,
- 12 => 6,
- 13 => -1,
- 14 => -1,
- 15 => -1,
- 16 => -1,
- 17 => -1,
- 18 => -1,
- 19 => 7,
- 20 => 8,
- 21 => 9,
- 22 => -1,
- 23 => -1,
- ),
- 4 =>
- array (
- 0 => -1,
- 1 => -1,
- 2 => -1,
- 3 => -1,
- ),
- 5 =>
- array (
- 0 => -1,
- ),
- 6 =>
- array (
- 0 => -1,
- ),
- 7 =>
- array (
- 0 => -1,
- 1 => -1,
- 2 => -1,
- 3 => -1,
- ),
- 8 =>
- array (
- 0 => -1,
- ),
- 9 =>
- array (
- 0 => -1,
- 1 => -1,
- 2 => -1,
- 3 => -1,
- ),
- );
- $this->_keywords = array (
- -1 =>
- array (
- 0 =>
- array (
- ),
- 1 => -1,
- 2 => -1,
- 3 => -1,
- 4 => -1,
- 5 =>
- array (
- ),
- 6 =>
- array (
- ),
- 7 => -1,
- 8 => -1,
- 9 =>
- array (
- ),
- 10 =>
- array (
- ),
- 11 =>
- array (
- ),
- 12 => -1,
- 13 =>
- array (
- ),
- 14 =>
- array (
- ),
- 15 =>
- array (
- ),
- 16 =>
- array (
- ),
- 17 =>
- array (
- ),
- 18 =>
- array (
- ),
- 19 => -1,
- 20 => -1,
- 21 => -1,
- 22 =>
- array (
- 'reserved' => '/^(abs|accept|alarm|atan2|bind|binmode|bless|caller|chdir|chmod|chomp|chop|chown|chr|chroot|close|closedir|connect|continue|cos|crypt|dbmclose|dbmopen|defined|delete|die|do|dump|each|endgrent|endhostent|endnetent|endprotoent|endpwent|endservent|eof|eval|exec|exists|exit|exp|fcntl|fileno|flock|fork|format|formline|getc|getgrent|getgrgid|getgrnam|gethostbyaddr|gethostbyname|gethostent|getlogin|getnetbyaddr|getnetbyname|getnetent|getpeername|getpgrp|getppid|getpriority|getprotobyname|getprotobynumber|getprotoent|getpwent|getpwnam|getpwuid|getservbyname|getservbyport|getservent|getsockname|getsockopt|glob|gmtime|goto|grep|hex|import|index|int|ioctl|join|keys|kill|last|lc|lcfirst|length|link|listen|local|localtime|lock|log|lstat|map|mkdir|msgctl|msgget|msgrcv|msgsnd|my|next|no|oct|open|opendir|ord|our|pack|package|pipe|pop|pos|print|printf|prototype|push|quotemeta|rand|read|readdir|readline|readlink|readpipe|recv|redo|ref|rename|require|reset|return|reverse|rewinddir|rindex|rmdir|scalar|seek|seekdir|select|semctl|semget|semop|send|setgrent|sethostent|setnetent|setpgrp|setpriority|setprotoent|setpwent|setservent|setsockopt|shift|shmctl|shmget|shmread|shmwrite|shutdown|sin|sleep|socket|socketpair|sort|splice|split|sprintf|sqrt|srand|stat|study|sub|substr|symlink|syscall|sysopen|sysread|sysseek|system|syswrite|tell|telldir|tie|tied|time|times|truncate|uc|ucfirst|umask|undef|unlink|unpack|unshift|untie|use|utime|values|vec|wait|waitpid|wantarray|warn|write|y)$/',
- 'missingreserved' => '/^(new)$/',
- 'flowcontrol' => '/^(if|else|elsif|while|unless|for|foreach|until|do|continue|not|or|and|eq|ne|gt|lt)$/',
- ),
- 23 =>
- array (
- ),
- ),
- 0 =>
- array (
- ),
- 1 =>
- array (
- 0 =>
- array (
- ),
- 1 => -1,
- 2 => -1,
- 3 => -1,
- 4 => -1,
- 5 =>
- array (
- ),
- 6 =>
- array (
- ),
- 7 => -1,
- 8 => -1,
- 9 =>
- array (
- ),
- 10 =>
- array (
- ),
- 11 =>
- array (
- ),
- 12 => -1,
- 13 =>
- array (
- ),
- 14 =>
- array (
- ),
- 15 =>
- array (
- ),
- 16 =>
- array (
- ),
- 17 =>
- array (
- ),
- 18 =>
- array (
- ),
- 19 => -1,
- 20 => -1,
- 21 => -1,
- 22 =>
- array (
- 'reserved' => '/^(abs|accept|alarm|atan2|bind|binmode|bless|caller|chdir|chmod|chomp|chop|chown|chr|chroot|close|closedir|connect|continue|cos|crypt|dbmclose|dbmopen|defined|delete|die|do|dump|each|endgrent|endhostent|endnetent|endprotoent|endpwent|endservent|eof|eval|exec|exists|exit|exp|fcntl|fileno|flock|fork|format|formline|getc|getgrent|getgrgid|getgrnam|gethostbyaddr|gethostbyname|gethostent|getlogin|getnetbyaddr|getnetbyname|getnetent|getpeername|getpgrp|getppid|getpriority|getprotobyname|getprotobynumber|getprotoent|getpwent|getpwnam|getpwuid|getservbyname|getservbyport|getservent|getsockname|getsockopt|glob|gmtime|goto|grep|hex|import|index|int|ioctl|join|keys|kill|last|lc|lcfirst|length|link|listen|local|localtime|lock|log|lstat|map|mkdir|msgctl|msgget|msgrcv|msgsnd|my|next|no|oct|open|opendir|ord|our|pack|package|pipe|pop|pos|print|printf|prototype|push|quotemeta|rand|read|readdir|readline|readlink|readpipe|recv|redo|ref|rename|require|reset|return|reverse|rewinddir|rindex|rmdir|scalar|seek|seekdir|select|semctl|semget|semop|send|setgrent|sethostent|setnetent|setpgrp|setpriority|setprotoent|setpwent|setservent|setsockopt|shift|shmctl|shmget|shmread|shmwrite|shutdown|sin|sleep|socket|socketpair|sort|splice|split|sprintf|sqrt|srand|stat|study|sub|substr|symlink|syscall|sysopen|sysread|sysseek|system|syswrite|tell|telldir|tie|tied|time|times|truncate|uc|ucfirst|umask|undef|unlink|unpack|unshift|untie|use|utime|values|vec|wait|waitpid|wantarray|warn|write|y)$/',
- 'missingreserved' => '/^(new)$/',
- 'flowcontrol' => '/^(if|else|elsif|while|unless|for|foreach|until|do|continue|not|or|and|eq|ne|gt|lt)$/',
- ),
- 23 =>
- array (
- ),
- ),
- 2 =>
- array (
- 0 =>
- array (
- ),
- 1 => -1,
- 2 => -1,
- 3 => -1,
- 4 => -1,
- 5 =>
- array (
- ),
- 6 =>
- array (
- ),
- 7 => -1,
- 8 => -1,
- 9 =>
- array (
- ),
- 10 =>
- array (
- ),
- 11 =>
- array (
- ),
- 12 => -1,
- 13 =>
- array (
- ),
- 14 =>
- array (
- ),
- 15 =>
- array (
- ),
- 16 =>
- array (
- ),
- 17 =>
- array (
- ),
- 18 =>
- array (
- ),
- 19 =>
- array (
- ),
- 20 => -1,
- 21 => -1,
- 22 => -1,
- 23 =>
- array (
- 'reserved' => '/^(abs|accept|alarm|atan2|bind|binmode|bless|caller|chdir|chmod|chomp|chop|chown|chr|chroot|close|closedir|connect|continue|cos|crypt|dbmclose|dbmopen|defined|delete|die|do|dump|each|endgrent|endhostent|endnetent|endprotoent|endpwent|endservent|eof|eval|exec|exists|exit|exp|fcntl|fileno|flock|fork|format|formline|getc|getgrent|getgrgid|getgrnam|gethostbyaddr|gethostbyname|gethostent|getlogin|getnetbyaddr|getnetbyname|getnetent|getpeername|getpgrp|getppid|getpriority|getprotobyname|getprotobynumber|getprotoent|getpwent|getpwnam|getpwuid|getservbyname|getservbyport|getservent|getsockname|getsockopt|glob|gmtime|goto|grep|hex|import|index|int|ioctl|join|keys|kill|last|lc|lcfirst|length|link|listen|local|localtime|lock|log|lstat|map|mkdir|msgctl|msgget|msgrcv|msgsnd|my|next|no|oct|open|opendir|ord|our|pack|package|pipe|pop|pos|print|printf|prototype|push|quotemeta|rand|read|readdir|readline|readlink|readpipe|recv|redo|ref|rename|require|reset|return|reverse|rewinddir|rindex|rmdir|scalar|seek|seekdir|select|semctl|semget|semop|send|setgrent|sethostent|setnetent|setpgrp|setpriority|setprotoent|setpwent|setservent|setsockopt|shift|shmctl|shmget|shmread|shmwrite|shutdown|sin|sleep|socket|socketpair|sort|splice|split|sprintf|sqrt|srand|stat|study|sub|substr|symlink|syscall|sysopen|sysread|sysseek|system|syswrite|tell|telldir|tie|tied|time|times|truncate|uc|ucfirst|umask|undef|unlink|unpack|unshift|untie|use|utime|values|vec|wait|waitpid|wantarray|warn|write|y)$/',
- 'missingreserved' => '/^(new)$/',
- 'flowcontrol' => '/^(if|else|elsif|while|unless|for|foreach|until|do|continue|not|or|and|eq|ne|gt|lt)$/',
- ),
- 24 =>
- array (
- ),
- ),
- 3 =>
- array (
- 0 =>
- array (
- ),
- 1 => -1,
- 2 => -1,
- 3 => -1,
- 4 => -1,
- 5 =>
- array (
- ),
- 6 =>
- array (
- ),
- 7 => -1,
- 8 => -1,
- 9 =>
- array (
- ),
- 10 =>
- array (
- ),
- 11 =>
- array (
- ),
- 12 => -1,
- 13 =>
- array (
- ),
- 14 =>
- array (
- ),
- 15 =>
- array (
- ),
- 16 =>
- array (
- ),
- 17 =>
- array (
- ),
- 18 =>
- array (
- ),
- 19 => -1,
- 20 => -1,
- 21 => -1,
- 22 =>
- array (
- 'reserved' => '/^(abs|accept|alarm|atan2|bind|binmode|bless|caller|chdir|chmod|chomp|chop|chown|chr|chroot|close|closedir|connect|continue|cos|crypt|dbmclose|dbmopen|defined|delete|die|do|dump|each|endgrent|endhostent|endnetent|endprotoent|endpwent|endservent|eof|eval|exec|exists|exit|exp|fcntl|fileno|flock|fork|format|formline|getc|getgrent|getgrgid|getgrnam|gethostbyaddr|gethostbyname|gethostent|getlogin|getnetbyaddr|getnetbyname|getnetent|getpeername|getpgrp|getppid|getpriority|getprotobyname|getprotobynumber|getprotoent|getpwent|getpwnam|getpwuid|getservbyname|getservbyport|getservent|getsockname|getsockopt|glob|gmtime|goto|grep|hex|import|index|int|ioctl|join|keys|kill|last|lc|lcfirst|length|link|listen|local|localtime|lock|log|lstat|map|mkdir|msgctl|msgget|msgrcv|msgsnd|my|next|no|oct|open|opendir|ord|our|pack|package|pipe|pop|pos|print|printf|prototype|push|quotemeta|rand|read|readdir|readline|readlink|readpipe|recv|redo|ref|rename|require|reset|return|reverse|rewinddir|rindex|rmdir|scalar|seek|seekdir|select|semctl|semget|semop|send|setgrent|sethostent|setnetent|setpgrp|setpriority|setprotoent|setpwent|setservent|setsockopt|shift|shmctl|shmget|shmread|shmwrite|shutdown|sin|sleep|socket|socketpair|sort|splice|split|sprintf|sqrt|srand|stat|study|sub|substr|symlink|syscall|sysopen|sysread|sysseek|system|syswrite|tell|telldir|tie|tied|time|times|truncate|uc|ucfirst|umask|undef|unlink|unpack|unshift|untie|use|utime|values|vec|wait|waitpid|wantarray|warn|write|y)$/',
- 'missingreserved' => '/^(new)$/',
- 'flowcontrol' => '/^(if|else|elsif|while|unless|for|foreach|until|do|continue|not|or|and|eq|ne|gt|lt)$/',
- ),
- 23 =>
- array (
- ),
- ),
- 4 =>
- array (
- 0 =>
- array (
- ),
- 1 =>
- array (
- ),
- 2 =>
- array (
- ),
- 3 =>
- array (
- ),
- ),
- 5 =>
- array (
- 0 =>
- array (
- ),
- ),
- 6 =>
- array (
- 0 =>
- array (
- ),
- ),
- 7 =>
- array (
- 0 =>
- array (
- ),
- 1 =>
- array (
- ),
- 2 =>
- array (
- ),
- 3 =>
- array (
- ),
- ),
- 8 =>
- array (
- 0 =>
- array (
- ),
- ),
- 9 =>
- array (
- 0 =>
- array (
- ),
- 1 =>
- array (
- ),
- 2 =>
- array (
- ),
- 3 =>
- array (
- ),
- ),
- );
- $this->_parts = array (
- 0 =>
- array (
- ),
- 1 =>
- array (
- 0 =>
- array (
- 1 => 'special',
- 2 => 'string',
- ),
- 1 => NULL,
- 2 => NULL,
- 3 => NULL,
- 4 => NULL,
- 5 =>
- array (
- 1 => 'reserved',
- 2 => 'special',
- ),
- 6 => NULL,
- 7 => NULL,
- 8 => NULL,
- 9 => NULL,
- 10 =>
- array (
- 1 => 'quotes',
- 2 => 'quotes',
- 3 => 'string',
- 5 => 'quotes',
- 6 => 'string',
- 8 => 'quotes',
- ),
- 11 =>
- array (
- 1 => 'quotes',
- 2 => 'quotes',
- 3 => 'string',
- 5 => 'quotes',
- ),
- 12 => NULL,
- 13 => NULL,
- 14 => NULL,
- 15 => NULL,
- 16 => NULL,
- 17 =>
- array (
- 1 => 'brackets',
- 2 => 'var',
- 3 => 'brackets',
- ),
- 18 => NULL,
- 19 => NULL,
- 20 => NULL,
- 21 => NULL,
- 22 => NULL,
- 23 => NULL,
- ),
- 2 =>
- array (
- 0 =>
- array (
- 1 => 'special',
- 2 => 'string',
- ),
- 1 => NULL,
- 2 => NULL,
- 3 => NULL,
- 4 => NULL,
- 5 =>
- array (
- 1 => 'reserved',
- 2 => 'special',
- ),
- 6 => NULL,
- 7 => NULL,
- 8 => NULL,
- 9 => NULL,
- 10 =>
- array (
- 1 => 'quotes',
- 2 => 'quotes',
- 3 => 'string',
- 5 => 'quotes',
- 6 => 'string',
- 8 => 'quotes',
- ),
- 11 =>
- array (
- 1 => 'quotes',
- 2 => 'quotes',
- 3 => 'string',
- 5 => 'quotes',
- ),
- 12 => NULL,
- 13 =>
- array (
- 1 => 'string',
- 2 => 'code',
- ),
- 14 => NULL,
- 15 => NULL,
- 16 => NULL,
- 17 => NULL,
- 18 =>
- array (
- 1 => 'brackets',
- 2 => 'var',
- 3 => 'brackets',
- ),
- 19 => NULL,
- 20 => NULL,
- 21 => NULL,
- 22 => NULL,
- 23 => NULL,
- 24 => NULL,
- ),
- 3 =>
- array (
- 0 =>
- array (
- 1 => 'special',
- 2 => 'string',
- ),
- 1 => NULL,
- 2 => NULL,
- 3 => NULL,
- 4 => NULL,
- 5 =>
- array (
- 1 => 'reserved',
- 2 => 'special',
- ),
- 6 => NULL,
- 7 => NULL,
- 8 => NULL,
- 9 => NULL,
- 10 =>
- array (
- 1 => 'quotes',
- 2 => 'quotes',
- 3 => 'string',
- 5 => 'quotes',
- 6 => 'string',
- 8 => 'quotes',
- ),
- 11 =>
- array (
- 1 => 'quotes',
- 2 => 'quotes',
- 3 => 'string',
- 5 => 'quotes',
- ),
- 12 => NULL,
- 13 => NULL,
- 14 => NULL,
- 15 => NULL,
- 16 => NULL,
- 17 =>
- array (
- 1 => 'brackets',
- 2 => 'var',
- 3 => 'brackets',
- ),
- 18 => NULL,
- 19 => NULL,
- 20 => NULL,
- 21 => NULL,
- 22 => NULL,
- 23 => NULL,
- ),
- 4 =>
- array (
- 0 => NULL,
- 1 => NULL,
- 2 => NULL,
- 3 => NULL,
- ),
- 5 =>
- array (
- 0 => NULL,
- ),
- 6 =>
- array (
- 0 => NULL,
- ),
- 7 =>
- array (
- 0 => NULL,
- 1 => NULL,
- 2 => NULL,
- 3 => NULL,
- ),
- 8 =>
- array (
- 0 => NULL,
- ),
- 9 =>
- array (
- 0 => NULL,
- 1 => NULL,
- 2 => NULL,
- 3 => NULL,
- ),
- );
- $this->_subst = array (
- -1 =>
- array (
- 0 => false,
- 1 => false,
- 2 => false,
- 3 => false,
- 4 => false,
- 5 => false,
- 6 => false,
- 7 => true,
- 8 => true,
- 9 => false,
- 10 => false,
- 11 => false,
- 12 => false,
- 13 => false,
- 14 => false,
- 15 => false,
- 16 => false,
- 17 => false,
- 18 => false,
- 19 => false,
- 20 => false,
- 21 => false,
- 22 => false,
- 23 => false,
- ),
- 0 =>
- array (
- ),
- 1 =>
- array (
- 0 => false,
- 1 => false,
- 2 => false,
- 3 => false,
- 4 => false,
- 5 => false,
- 6 => false,
- 7 => true,
- 8 => true,
- 9 => false,
- 10 => false,
- 11 => false,
- 12 => false,
- 13 => false,
- 14 => false,
- 15 => false,
- 16 => false,
- 17 => false,
- 18 => false,
- 19 => false,
- 20 => false,
- 21 => false,
- 22 => false,
- 23 => false,
- ),
- 2 =>
- array (
- 0 => false,
- 1 => false,
- 2 => false,
- 3 => false,
- 4 => false,
- 5 => false,
- 6 => false,
- 7 => true,
- 8 => true,
- 9 => false,
- 10 => false,
- 11 => false,
- 12 => false,
- 13 => false,
- 14 => false,
- 15 => false,
- 16 => false,
- 17 => false,
- 18 => false,
- 19 => false,
- 20 => false,
- 21 => false,
- 22 => false,
- 23 => false,
- 24 => false,
- ),
- 3 =>
- array (
- 0 => false,
- 1 => false,
- 2 => false,
- 3 => false,
- 4 => false,
- 5 => false,
- 6 => false,
- 7 => true,
- 8 => true,
- 9 => false,
- 10 => false,
- 11 => false,
- 12 => false,
- 13 => false,
- 14 => false,
- 15 => false,
- 16 => false,
- 17 => false,
- 18 => false,
- 19 => false,
- 20 => false,
- 21 => false,
- 22 => false,
- 23 => false,
- ),
- 4 =>
- array (
- 0 => false,
- 1 => false,
- 2 => false,
- 3 => false,
- ),
- 5 =>
- array (
- 0 => false,
- ),
- 6 =>
- array (
- 0 => false,
- ),
- 7 =>
- array (
- 0 => false,
- 1 => false,
- 2 => false,
- 3 => false,
- ),
- 8 =>
- array (
- 0 => false,
- ),
- 9 =>
- array (
- 0 => false,
- 1 => false,
- 2 => false,
- 3 => false,
- ),
- );
- $this->_conditions = array (
- );
- $this->_kwmap = array (
- 'reserved' => 'reserved',
- 'missingreserved' => 'reserved',
- 'flowcontrol' => 'reserved',
- );
- $this->_defClass = 'code';
- $this->_checkDefines();
- }
-
-} \ No newline at end of file
diff --git a/library/Text_Highlighter/Text/Highlighter/PHP.php b/library/Text_Highlighter/Text/Highlighter/PHP.php
deleted file mode 100644
index 1ee2e6b90..000000000
--- a/library/Text_Highlighter/Text/Highlighter/PHP.php
+++ /dev/null
@@ -1,1107 +0,0 @@
-<?php
-/**
- * Auto-generated class. PHP syntax highlighting
- *
- * PHP version 4 and 5
- *
- * LICENSE: This source file is subject to version 3.0 of the PHP license
- * that is available through the world-wide-web at the following URI:
- * http://www.php.net/license/3_0.txt. If you did not receive a copy of
- * the PHP License and are unable to obtain it through the web, please
- * send a note to license@php.net so we can mail you a copy immediately.
- *
- * @copyright 2004-2006 Andrey Demenev
- * @license http://www.php.net/license/3_0.txt PHP License
- * @link http://pear.php.net/package/Text_Highlighter
- * @category Text
- * @package Text_Highlighter
- * @version generated from: : php.xml,v 1.1 2007/06/03 02:35:28 ssttoo Exp
- * @author Andrey Demenev <demenev@gmail.com>
- *
- */
-
-/**
- * @ignore
- */
-
-require_once 'Text/Highlighter.php';
-
-/**
- * Auto-generated class. PHP syntax highlighting
- *
- * @author Andrey Demenev <demenev@gmail.com>
- * @category Text
- * @package Text_Highlighter
- * @copyright 2004-2006 Andrey Demenev
- * @license http://www.php.net/license/3_0.txt PHP License
- * @version Release: @package_version@
- * @link http://pear.php.net/package/Text_Highlighter
- */
-class Text_Highlighter_PHP extends Text_Highlighter
-{
- var $_language = 'php';
-
- /**
- * PHP4 Compatible Constructor
- *
- * @param array $options
- * @access public
- */
- function Text_Highlighter_PHP($options=array())
- {
- $this->__construct($options);
- }
-
-
- /**
- * Constructor
- *
- * @param array $options
- * @access public
- */
- function __construct($options=array())
- {
-
- $this->_options = $options;
- $this->_regs = array (
- -1 => '/((?i)\\<\\?(php|=)?)/',
- 0 => '/((?i)\\{)|((?i)\\()|((?i)\\[)|((?i)\\/\\*)|((?i)")|((?i)`)|((?mi)\\<\\<\\<[\\x20\\x09]*(\\w+)$)|((?i)\')|((?i)(#|\\/\\/))|((?i)[a-z_]\\w*)|((?i)\\((array|int|integer|string|bool|boolean|object|float|double)\\))|((?i)0[xX][\\da-f]+)|((?i)\\$[a-z_]\\w*)|((?i)\\d\\d*|\\b0\\b)|((?i)0[0-7]+)|((?i)(\\d*\\.\\d+)|(\\d+\\.\\d*))|((?i)((\\d+|((\\d*\\.\\d+)|(\\d+\\.\\d*)))[eE][+-]?\\d+))/',
- 1 => '/((?i)\\{)|((?i)\\()|((?i)\\[)|((?i)\\/\\*)|((?i)")|((?i)`)|((?mi)\\<\\<\\<[\\x20\\x09]*(\\w+)$)|((?i)\')|((?i)(#|\\/\\/))|((?i)[a-z_]\\w*)|((?i)\\((array|int|integer|string|bool|boolean|object|float|double)\\))|((?i)\\?\\>)|((?i)0[xX][\\da-f]+)|((?i)\\$[a-z_]\\w*)|((?i)\\d\\d*|\\b0\\b)|((?i)0[0-7]+)|((?i)(\\d*\\.\\d+)|(\\d+\\.\\d*))|((?i)((\\d+|((\\d*\\.\\d+)|(\\d+\\.\\d*)))[eE][+-]?\\d+))/',
- 2 => '/((?i)\\{)|((?i)\\()|((?i)\\[)|((?i)\\/\\*)|((?i)")|((?i)`)|((?mi)\\<\\<\\<[\\x20\\x09]*(\\w+)$)|((?i)\')|((?i)(#|\\/\\/))|((?i)[a-z_]\\w*)|((?i)\\((array|int|integer|string|bool|boolean|object|float|double)\\))|((?i)0[xX][\\da-f]+)|((?i)\\$[a-z_]\\w*)|((?i)\\d\\d*|\\b0\\b)|((?i)0[0-7]+)|((?i)(\\d*\\.\\d+)|(\\d+\\.\\d*))|((?i)((\\d+|((\\d*\\.\\d+)|(\\d+\\.\\d*)))[eE][+-]?\\d+))/',
- 3 => '/((?i)\\{)|((?i)\\()|((?i)\\[)|((?i)\\/\\*)|((?i)")|((?i)`)|((?mi)\\<\\<\\<[\\x20\\x09]*(\\w+)$)|((?i)\')|((?i)(#|\\/\\/))|((?i)[a-z_]\\w*)|((?i)\\((array|int|integer|string|bool|boolean|object|float|double)\\))|((?i)0[xX][\\da-f]+)|((?i)\\$[a-z_]\\w*)|((?i)\\d\\d*|\\b0\\b)|((?i)0[0-7]+)|((?i)(\\d*\\.\\d+)|(\\d+\\.\\d*))|((?i)((\\d+|((\\d*\\.\\d+)|(\\d+\\.\\d*)))[eE][+-]?\\d+))/',
- 4 => '/((?i)\\s@\\w+\\s)|((?i)((https?|ftp):\\/\\/[\\w\\?\\.\\-\\&=\\/%+]+)|(^|[\\s,!?])www\\.\\w+\\.\\w+[\\w\\?\\.\\&=\\/%+]*)|((?i)\\w+[\\.\\w\\-]+@(\\w+[\\.\\w\\-])+)|((?i)\\bnote:)|((?i)\\$\\w+\\s*:.*\\$)/',
- 5 => '/((?i)\\\\[\\\\"\'`tnr\\$\\{])|((?i)\\{\\$[a-z_].*\\})|((?i)\\$[a-z_]\\w*)/',
- 6 => '/((?i)\\\\\\\\|\\\\"|\\\\\'|\\\\`)|((?i)\\{\\$[a-z_].*\\})|((?i)\\$[a-z_]\\w*)/',
- 7 => '/((?i)\\\\[\\\\"\'`tnr\\$\\{])|((?i)\\{\\$[a-z_].*\\})|((?i)\\$[a-z_]\\w*)/',
- 8 => '/((?i)\\\\\\\\|\\\\"|\\\\\'|\\\\`)/',
- 9 => '/((?i)\\s@\\w+\\s)|((?i)((https?|ftp):\\/\\/[\\w\\?\\.\\-\\&=\\/%+]+)|(^|[\\s,!?])www\\.\\w+\\.\\w+[\\w\\?\\.\\&=\\/%+]*)|((?i)\\w+[\\.\\w\\-]+@(\\w+[\\.\\w\\-])+)|((?i)\\bnote:)|((?i)\\$\\w+\\s*:.*\\$)/',
- 10 => '//',
- );
- $this->_counts = array (
- -1 =>
- array (
- 0 => 1,
- ),
- 0 =>
- array (
- 0 => 0,
- 1 => 0,
- 2 => 0,
- 3 => 0,
- 4 => 0,
- 5 => 0,
- 6 => 1,
- 7 => 0,
- 8 => 1,
- 9 => 0,
- 10 => 1,
- 11 => 0,
- 12 => 0,
- 13 => 0,
- 14 => 0,
- 15 => 2,
- 16 => 5,
- ),
- 1 =>
- array (
- 0 => 0,
- 1 => 0,
- 2 => 0,
- 3 => 0,
- 4 => 0,
- 5 => 0,
- 6 => 1,
- 7 => 0,
- 8 => 1,
- 9 => 0,
- 10 => 1,
- 11 => 0,
- 12 => 0,
- 13 => 0,
- 14 => 0,
- 15 => 0,
- 16 => 2,
- 17 => 5,
- ),
- 2 =>
- array (
- 0 => 0,
- 1 => 0,
- 2 => 0,
- 3 => 0,
- 4 => 0,
- 5 => 0,
- 6 => 1,
- 7 => 0,
- 8 => 1,
- 9 => 0,
- 10 => 1,
- 11 => 0,
- 12 => 0,
- 13 => 0,
- 14 => 0,
- 15 => 2,
- 16 => 5,
- ),
- 3 =>
- array (
- 0 => 0,
- 1 => 0,
- 2 => 0,
- 3 => 0,
- 4 => 0,
- 5 => 0,
- 6 => 1,
- 7 => 0,
- 8 => 1,
- 9 => 0,
- 10 => 1,
- 11 => 0,
- 12 => 0,
- 13 => 0,
- 14 => 0,
- 15 => 2,
- 16 => 5,
- ),
- 4 =>
- array (
- 0 => 0,
- 1 => 3,
- 2 => 1,
- 3 => 0,
- 4 => 0,
- ),
- 5 =>
- array (
- 0 => 0,
- 1 => 0,
- 2 => 0,
- ),
- 6 =>
- array (
- 0 => 0,
- 1 => 0,
- 2 => 0,
- ),
- 7 =>
- array (
- 0 => 0,
- 1 => 0,
- 2 => 0,
- ),
- 8 =>
- array (
- 0 => 0,
- ),
- 9 =>
- array (
- 0 => 0,
- 1 => 3,
- 2 => 1,
- 3 => 0,
- 4 => 0,
- ),
- 10 =>
- array (
- ),
- );
- $this->_delim = array (
- -1 =>
- array (
- 0 => 'inlinetags',
- ),
- 0 =>
- array (
- 0 => 'brackets',
- 1 => 'brackets',
- 2 => 'brackets',
- 3 => 'comment',
- 4 => 'quotes',
- 5 => 'quotes',
- 6 => 'quotes',
- 7 => 'quotes',
- 8 => 'comment',
- 9 => '',
- 10 => '',
- 11 => '',
- 12 => '',
- 13 => '',
- 14 => '',
- 15 => '',
- 16 => '',
- ),
- 1 =>
- array (
- 0 => 'brackets',
- 1 => 'brackets',
- 2 => 'brackets',
- 3 => 'comment',
- 4 => 'quotes',
- 5 => 'quotes',
- 6 => 'quotes',
- 7 => 'quotes',
- 8 => 'comment',
- 9 => '',
- 10 => '',
- 11 => 'inlinetags',
- 12 => '',
- 13 => '',
- 14 => '',
- 15 => '',
- 16 => '',
- 17 => '',
- ),
- 2 =>
- array (
- 0 => 'brackets',
- 1 => 'brackets',
- 2 => 'brackets',
- 3 => 'comment',
- 4 => 'quotes',
- 5 => 'quotes',
- 6 => 'quotes',
- 7 => 'quotes',
- 8 => 'comment',
- 9 => '',
- 10 => '',
- 11 => '',
- 12 => '',
- 13 => '',
- 14 => '',
- 15 => '',
- 16 => '',
- ),
- 3 =>
- array (
- 0 => 'brackets',
- 1 => 'brackets',
- 2 => 'brackets',
- 3 => 'comment',
- 4 => 'quotes',
- 5 => 'quotes',
- 6 => 'quotes',
- 7 => 'quotes',
- 8 => 'comment',
- 9 => '',
- 10 => '',
- 11 => '',
- 12 => '',
- 13 => '',
- 14 => '',
- 15 => '',
- 16 => '',
- ),
- 4 =>
- array (
- 0 => '',
- 1 => '',
- 2 => '',
- 3 => '',
- 4 => '',
- ),
- 5 =>
- array (
- 0 => '',
- 1 => '',
- 2 => '',
- ),
- 6 =>
- array (
- 0 => '',
- 1 => '',
- 2 => '',
- ),
- 7 =>
- array (
- 0 => '',
- 1 => '',
- 2 => '',
- ),
- 8 =>
- array (
- 0 => '',
- ),
- 9 =>
- array (
- 0 => '',
- 1 => '',
- 2 => '',
- 3 => '',
- 4 => '',
- ),
- 10 =>
- array (
- ),
- );
- $this->_inner = array (
- -1 =>
- array (
- 0 => 'code',
- ),
- 0 =>
- array (
- 0 => 'code',
- 1 => 'code',
- 2 => 'code',
- 3 => 'comment',
- 4 => 'string',
- 5 => 'string',
- 6 => 'string',
- 7 => 'string',
- 8 => 'comment',
- 9 => 'identifier',
- 10 => 'reserved',
- 11 => 'number',
- 12 => 'var',
- 13 => 'number',
- 14 => 'number',
- 15 => 'number',
- 16 => 'number',
- ),
- 1 =>
- array (
- 0 => 'code',
- 1 => 'code',
- 2 => 'code',
- 3 => 'comment',
- 4 => 'string',
- 5 => 'string',
- 6 => 'string',
- 7 => 'string',
- 8 => 'comment',
- 9 => 'identifier',
- 10 => 'reserved',
- 11 => 'default',
- 12 => 'number',
- 13 => 'var',
- 14 => 'number',
- 15 => 'number',
- 16 => 'number',
- 17 => 'number',
- ),
- 2 =>
- array (
- 0 => 'code',
- 1 => 'code',
- 2 => 'code',
- 3 => 'comment',
- 4 => 'string',
- 5 => 'string',
- 6 => 'string',
- 7 => 'string',
- 8 => 'comment',
- 9 => 'identifier',
- 10 => 'reserved',
- 11 => 'number',
- 12 => 'var',
- 13 => 'number',
- 14 => 'number',
- 15 => 'number',
- 16 => 'number',
- ),
- 3 =>
- array (
- 0 => 'code',
- 1 => 'code',
- 2 => 'code',
- 3 => 'comment',
- 4 => 'string',
- 5 => 'string',
- 6 => 'string',
- 7 => 'string',
- 8 => 'comment',
- 9 => 'identifier',
- 10 => 'reserved',
- 11 => 'number',
- 12 => 'var',
- 13 => 'number',
- 14 => 'number',
- 15 => 'number',
- 16 => 'number',
- ),
- 4 =>
- array (
- 0 => 'inlinedoc',
- 1 => 'url',
- 2 => 'url',
- 3 => 'inlinedoc',
- 4 => 'inlinedoc',
- ),
- 5 =>
- array (
- 0 => 'special',
- 1 => 'var',
- 2 => 'var',
- ),
- 6 =>
- array (
- 0 => 'special',
- 1 => 'var',
- 2 => 'var',
- ),
- 7 =>
- array (
- 0 => 'special',
- 1 => 'var',
- 2 => 'var',
- ),
- 8 =>
- array (
- 0 => 'special',
- ),
- 9 =>
- array (
- 0 => 'inlinedoc',
- 1 => 'url',
- 2 => 'url',
- 3 => 'inlinedoc',
- 4 => 'inlinedoc',
- ),
- 10 =>
- array (
- ),
- );
- $this->_end = array (
- 0 => '/(?i)\\?\\>/',
- 1 => '/(?i)\\}/',
- 2 => '/(?i)\\)/',
- 3 => '/(?i)\\]/',
- 4 => '/(?i)\\*\\//',
- 5 => '/(?i)"/',
- 6 => '/(?i)`/',
- 7 => '/(?mi)^%1%;?$/',
- 8 => '/(?i)\'/',
- 9 => '/(?mi)$|(?=\\?\\>)/',
- 10 => '/(?i)\\<\\?(php|=)?/',
- );
- $this->_states = array (
- -1 =>
- array (
- 0 => 0,
- ),
- 0 =>
- array (
- 0 => 1,
- 1 => 2,
- 2 => 3,
- 3 => 4,
- 4 => 5,
- 5 => 6,
- 6 => 7,
- 7 => 8,
- 8 => 9,
- 9 => -1,
- 10 => -1,
- 11 => -1,
- 12 => -1,
- 13 => -1,
- 14 => -1,
- 15 => -1,
- 16 => -1,
- ),
- 1 =>
- array (
- 0 => 1,
- 1 => 2,
- 2 => 3,
- 3 => 4,
- 4 => 5,
- 5 => 6,
- 6 => 7,
- 7 => 8,
- 8 => 9,
- 9 => -1,
- 10 => -1,
- 11 => 10,
- 12 => -1,
- 13 => -1,
- 14 => -1,
- 15 => -1,
- 16 => -1,
- 17 => -1,
- ),
- 2 =>
- array (
- 0 => 1,
- 1 => 2,
- 2 => 3,
- 3 => 4,
- 4 => 5,
- 5 => 6,
- 6 => 7,
- 7 => 8,
- 8 => 9,
- 9 => -1,
- 10 => -1,
- 11 => -1,
- 12 => -1,
- 13 => -1,
- 14 => -1,
- 15 => -1,
- 16 => -1,
- ),
- 3 =>
- array (
- 0 => 1,
- 1 => 2,
- 2 => 3,
- 3 => 4,
- 4 => 5,
- 5 => 6,
- 6 => 7,
- 7 => 8,
- 8 => 9,
- 9 => -1,
- 10 => -1,
- 11 => -1,
- 12 => -1,
- 13 => -1,
- 14 => -1,
- 15 => -1,
- 16 => -1,
- ),
- 4 =>
- array (
- 0 => -1,
- 1 => -1,
- 2 => -1,
- 3 => -1,
- 4 => -1,
- ),
- 5 =>
- array (
- 0 => -1,
- 1 => -1,
- 2 => -1,
- ),
- 6 =>
- array (
- 0 => -1,
- 1 => -1,
- 2 => -1,
- ),
- 7 =>
- array (
- 0 => -1,
- 1 => -1,
- 2 => -1,
- ),
- 8 =>
- array (
- 0 => -1,
- ),
- 9 =>
- array (
- 0 => -1,
- 1 => -1,
- 2 => -1,
- 3 => -1,
- 4 => -1,
- ),
- 10 =>
- array (
- ),
- );
- $this->_keywords = array (
- -1 =>
- array (
- 0 => -1,
- ),
- 0 =>
- array (
- 0 => -1,
- 1 => -1,
- 2 => -1,
- 3 => -1,
- 4 => -1,
- 5 => -1,
- 6 => -1,
- 7 => -1,
- 8 => -1,
- 9 =>
- array (
- 'constants' => '/^(DIRECTORY_SEPARATOR|PATH_SEPARATOR)$/',
- 'reserved' => '/^((?i)echo|foreach|else|if|elseif|for|as|while|break|continue|class|const|declare|switch|case|endfor|endswitch|endforeach|endif|array|default|do|enddeclare|eval|exit|die|extends|function|global|include|include_once|require|require_once|isset|empty|list|new|static|unset|var|return|try|catch|final|throw|public|private|protected|abstract|interface|implements|define|__file__|__line__|__class__|__method__|__function__|null|true|false|and|or|xor)$/',
- ),
- 10 =>
- array (
- ),
- 11 =>
- array (
- ),
- 12 =>
- array (
- ),
- 13 =>
- array (
- ),
- 14 =>
- array (
- ),
- 15 =>
- array (
- ),
- 16 =>
- array (
- ),
- ),
- 1 =>
- array (
- 0 => -1,
- 1 => -1,
- 2 => -1,
- 3 => -1,
- 4 => -1,
- 5 => -1,
- 6 => -1,
- 7 => -1,
- 8 => -1,
- 9 =>
- array (
- 'constants' => '/^(DIRECTORY_SEPARATOR|PATH_SEPARATOR)$/',
- 'reserved' => '/^((?i)echo|foreach|else|if|elseif|for|as|while|break|continue|class|const|declare|switch|case|endfor|endswitch|endforeach|endif|array|default|do|enddeclare|eval|exit|die|extends|function|global|include|include_once|require|require_once|isset|empty|list|new|static|unset|var|return|try|catch|final|throw|public|private|protected|abstract|interface|implements|define|__file__|__line__|__class__|__method__|__function__|null|true|false|and|or|xor)$/',
- ),
- 10 =>
- array (
- ),
- 11 => -1,
- 12 =>
- array (
- ),
- 13 =>
- array (
- ),
- 14 =>
- array (
- ),
- 15 =>
- array (
- ),
- 16 =>
- array (
- ),
- 17 =>
- array (
- ),
- ),
- 2 =>
- array (
- 0 => -1,
- 1 => -1,
- 2 => -1,
- 3 => -1,
- 4 => -1,
- 5 => -1,
- 6 => -1,
- 7 => -1,
- 8 => -1,
- 9 =>
- array (
- 'constants' => '/^(DIRECTORY_SEPARATOR|PATH_SEPARATOR)$/',
- 'reserved' => '/^((?i)echo|foreach|else|if|elseif|for|as|while|break|continue|class|const|declare|switch|case|endfor|endswitch|endforeach|endif|array|default|do|enddeclare|eval|exit|die|extends|function|global|include|include_once|require|require_once|isset|empty|list|new|static|unset|var|return|try|catch|final|throw|public|private|protected|abstract|interface|implements|define|__file__|__line__|__class__|__method__|__function__|null|true|false|and|or|xor)$/',
- ),
- 10 =>
- array (
- ),
- 11 =>
- array (
- ),
- 12 =>
- array (
- ),
- 13 =>
- array (
- ),
- 14 =>
- array (
- ),
- 15 =>
- array (
- ),
- 16 =>
- array (
- ),
- ),
- 3 =>
- array (
- 0 => -1,
- 1 => -1,
- 2 => -1,
- 3 => -1,
- 4 => -1,
- 5 => -1,
- 6 => -1,
- 7 => -1,
- 8 => -1,
- 9 =>
- array (
- 'constants' => '/^(DIRECTORY_SEPARATOR|PATH_SEPARATOR)$/',
- 'reserved' => '/^((?i)echo|foreach|else|if|elseif|for|as|while|break|continue|class|const|declare|switch|case|endfor|endswitch|endforeach|endif|array|default|do|enddeclare|eval|exit|die|extends|function|global|include|include_once|require|require_once|isset|empty|list|new|static|unset|var|return|try|catch|final|throw|public|private|protected|abstract|interface|implements|define|__file__|__line__|__class__|__method__|__function__|null|true|false|and|or|xor)$/',
- ),
- 10 =>
- array (
- ),
- 11 =>
- array (
- ),
- 12 =>
- array (
- ),
- 13 =>
- array (
- ),
- 14 =>
- array (
- ),
- 15 =>
- array (
- ),
- 16 =>
- array (
- ),
- ),
- 4 =>
- array (
- 0 =>
- array (
- ),
- 1 =>
- array (
- ),
- 2 =>
- array (
- ),
- 3 =>
- array (
- ),
- 4 =>
- array (
- ),
- ),
- 5 =>
- array (
- 0 =>
- array (
- ),
- 1 =>
- array (
- ),
- 2 =>
- array (
- ),
- ),
- 6 =>
- array (
- 0 =>
- array (
- ),
- 1 =>
- array (
- ),
- 2 =>
- array (
- ),
- ),
- 7 =>
- array (
- 0 =>
- array (
- ),
- 1 =>
- array (
- ),
- 2 =>
- array (
- ),
- ),
- 8 =>
- array (
- 0 =>
- array (
- ),
- ),
- 9 =>
- array (
- 0 =>
- array (
- ),
- 1 =>
- array (
- ),
- 2 =>
- array (
- ),
- 3 =>
- array (
- ),
- 4 =>
- array (
- ),
- ),
- 10 =>
- array (
- ),
- );
- $this->_parts = array (
- 0 =>
- array (
- 0 => NULL,
- 1 => NULL,
- 2 => NULL,
- 3 => NULL,
- 4 => NULL,
- 5 => NULL,
- 6 => NULL,
- 7 => NULL,
- 8 => NULL,
- 9 => NULL,
- 10 => NULL,
- 11 => NULL,
- 12 => NULL,
- 13 => NULL,
- 14 => NULL,
- 15 => NULL,
- 16 => NULL,
- ),
- 1 =>
- array (
- 0 => NULL,
- 1 => NULL,
- 2 => NULL,
- 3 => NULL,
- 4 => NULL,
- 5 => NULL,
- 6 => NULL,
- 7 => NULL,
- 8 => NULL,
- 9 => NULL,
- 10 => NULL,
- 11 => NULL,
- 12 => NULL,
- 13 => NULL,
- 14 => NULL,
- 15 => NULL,
- 16 => NULL,
- 17 => NULL,
- ),
- 2 =>
- array (
- 0 => NULL,
- 1 => NULL,
- 2 => NULL,
- 3 => NULL,
- 4 => NULL,
- 5 => NULL,
- 6 => NULL,
- 7 => NULL,
- 8 => NULL,
- 9 => NULL,
- 10 => NULL,
- 11 => NULL,
- 12 => NULL,
- 13 => NULL,
- 14 => NULL,
- 15 => NULL,
- 16 => NULL,
- ),
- 3 =>
- array (
- 0 => NULL,
- 1 => NULL,
- 2 => NULL,
- 3 => NULL,
- 4 => NULL,
- 5 => NULL,
- 6 => NULL,
- 7 => NULL,
- 8 => NULL,
- 9 => NULL,
- 10 => NULL,
- 11 => NULL,
- 12 => NULL,
- 13 => NULL,
- 14 => NULL,
- 15 => NULL,
- 16 => NULL,
- ),
- 4 =>
- array (
- 0 => NULL,
- 1 => NULL,
- 2 => NULL,
- 3 => NULL,
- 4 => NULL,
- ),
- 5 =>
- array (
- 0 => NULL,
- 1 => NULL,
- 2 => NULL,
- ),
- 6 =>
- array (
- 0 => NULL,
- 1 => NULL,
- 2 => NULL,
- ),
- 7 =>
- array (
- 0 => NULL,
- 1 => NULL,
- 2 => NULL,
- ),
- 8 =>
- array (
- 0 => NULL,
- ),
- 9 =>
- array (
- 0 => NULL,
- 1 => NULL,
- 2 => NULL,
- 3 => NULL,
- 4 => NULL,
- ),
- 10 =>
- array (
- ),
- );
- $this->_subst = array (
- -1 =>
- array (
- 0 => false,
- ),
- 0 =>
- array (
- 0 => false,
- 1 => false,
- 2 => false,
- 3 => false,
- 4 => false,
- 5 => false,
- 6 => true,
- 7 => false,
- 8 => false,
- 9 => false,
- 10 => false,
- 11 => false,
- 12 => false,
- 13 => false,
- 14 => false,
- 15 => false,
- 16 => false,
- ),
- 1 =>
- array (
- 0 => false,
- 1 => false,
- 2 => false,
- 3 => false,
- 4 => false,
- 5 => false,
- 6 => true,
- 7 => false,
- 8 => false,
- 9 => false,
- 10 => false,
- 11 => false,
- 12 => false,
- 13 => false,
- 14 => false,
- 15 => false,
- 16 => false,
- 17 => false,
- ),
- 2 =>
- array (
- 0 => false,
- 1 => false,
- 2 => false,
- 3 => false,
- 4 => false,
- 5 => false,
- 6 => true,
- 7 => false,
- 8 => false,
- 9 => false,
- 10 => false,
- 11 => false,
- 12 => false,
- 13 => false,
- 14 => false,
- 15 => false,
- 16 => false,
- ),
- 3 =>
- array (
- 0 => false,
- 1 => false,
- 2 => false,
- 3 => false,
- 4 => false,
- 5 => false,
- 6 => true,
- 7 => false,
- 8 => false,
- 9 => false,
- 10 => false,
- 11 => false,
- 12 => false,
- 13 => false,
- 14 => false,
- 15 => false,
- 16 => false,
- ),
- 4 =>
- array (
- 0 => false,
- 1 => false,
- 2 => false,
- 3 => false,
- 4 => false,
- ),
- 5 =>
- array (
- 0 => false,
- 1 => false,
- 2 => false,
- ),
- 6 =>
- array (
- 0 => false,
- 1 => false,
- 2 => false,
- ),
- 7 =>
- array (
- 0 => false,
- 1 => false,
- 2 => false,
- ),
- 8 =>
- array (
- 0 => false,
- ),
- 9 =>
- array (
- 0 => false,
- 1 => false,
- 2 => false,
- 3 => false,
- 4 => false,
- ),
- 10 =>
- array (
- ),
- );
- $this->_conditions = array (
- );
- $this->_kwmap = array (
- 'constants' => 'reserved',
- 'reserved' => 'reserved',
- );
- $this->_defClass = 'code';
- $this->_checkDefines();
- }
-
-} \ No newline at end of file
diff --git a/library/Text_Highlighter/Text/Highlighter/PYTHON.php b/library/Text_Highlighter/Text/Highlighter/PYTHON.php
deleted file mode 100644
index ed4f59dde..000000000
--- a/library/Text_Highlighter/Text/Highlighter/PYTHON.php
+++ /dev/null
@@ -1,647 +0,0 @@
-<?php
-/**
- * Auto-generated class. PYTHON syntax highlighting
- *
- * PHP version 4 and 5
- *
- * LICENSE: This source file is subject to version 3.0 of the PHP license
- * that is available through the world-wide-web at the following URI:
- * http://www.php.net/license/3_0.txt. If you did not receive a copy of
- * the PHP License and are unable to obtain it through the web, please
- * send a note to license@php.net so we can mail you a copy immediately.
- *
- * @copyright 2004-2006 Andrey Demenev
- * @license http://www.php.net/license/3_0.txt PHP License
- * @link http://pear.php.net/package/Text_Highlighter
- * @category Text
- * @package Text_Highlighter
- * @version generated from: : python.xml,v 1.1 2007/06/03 02:35:28 ssttoo Exp
- * @author Andrey Demenev <demenev@gmail.com>
- *
- */
-
-/**
- * @ignore
- */
-
-require_once 'Text/Highlighter.php';
-
-/**
- * Auto-generated class. PYTHON syntax highlighting
- *
- * @author Andrey Demenev <demenev@gmail.com>
- * @category Text
- * @package Text_Highlighter
- * @copyright 2004-2006 Andrey Demenev
- * @license http://www.php.net/license/3_0.txt PHP License
- * @version Release: @package_version@
- * @link http://pear.php.net/package/Text_Highlighter
- */
-class Text_Highlighter_PYTHON extends Text_Highlighter
-{
- var $_language = 'python';
-
- /**
- * PHP4 Compatible Constructor
- *
- * @param array $options
- * @access public
- */
- function Text_Highlighter_PYTHON($options=array())
- {
- $this->__construct($options);
- }
-
-
- /**
- * Constructor
- *
- * @param array $options
- * @access public
- */
- function __construct($options=array())
- {
-
- $this->_options = $options;
- $this->_regs = array (
- -1 => '/((?i)\'\'\')|((?i)""")|((?i)")|((?i)\')|((?i)\\()|((?i)\\[)|((?i)[a-z_]\\w*(?=\\s*\\())|((?i)[a-z_]\\w*)|((?i)((\\d+|((\\d*\\.\\d+)|(\\d+\\.\\d*)))[eE][+-]?\\d+))|((?i)((\\d*\\.\\d+)|(\\d+\\.\\d*)|(\\d+))j)|((?i)(\\d*\\.\\d+)|(\\d+\\.\\d*))|((?i)\\d+l?|\\b0l?\\b)|((?i)0[xX][\\da-f]+l?)|((?i)0[0-7]+l?)|((?i)#.+)/',
- 0 => '/((?i)\\\\.)/',
- 1 => '/((?i)\\\\.)/',
- 2 => '/((?i)\\\\.)/',
- 3 => '/((?i)\\\\.)/',
- 4 => '/((?i)\'\'\')|((?i)""")|((?i)")|((?i)\')|((?i)\\()|((?i)\\[)|((?i)[a-z_]\\w*(?=\\s*\\())|((?i)[a-z_]\\w*)|((?i)((\\d+|((\\d*\\.\\d+)|(\\d+\\.\\d*)))[eE][+-]?\\d+))|((?i)((\\d*\\.\\d+)|(\\d+\\.\\d*)|(\\d+))j)|((?i)(\\d*\\.\\d+)|(\\d+\\.\\d*))|((?i)\\d+l?|\\b0l?\\b)|((?i)0[xX][\\da-f]+l?)|((?i)0[0-7]+l?)|((?i)#.+)/',
- 5 => '/((?i)\'\'\')|((?i)""")|((?i)")|((?i)\')|((?i)\\()|((?i)\\[)|((?i)[a-z_]\\w*(?=\\s*\\())|((?i)[a-z_]\\w*)|((?i)((\\d+|((\\d*\\.\\d+)|(\\d+\\.\\d*)))[eE][+-]?\\d+))|((?i)((\\d*\\.\\d+)|(\\d+\\.\\d*)|(\\d+))j)|((?i)(\\d*\\.\\d+)|(\\d+\\.\\d*))|((?i)\\d+l?|\\b0l?\\b)|((?i)0[xX][\\da-f]+l?)|((?i)0[0-7]+l?)|((?i)#.+)/',
- );
- $this->_counts = array (
- -1 =>
- array (
- 0 => 0,
- 1 => 0,
- 2 => 0,
- 3 => 0,
- 4 => 0,
- 5 => 0,
- 6 => 0,
- 7 => 0,
- 8 => 5,
- 9 => 4,
- 10 => 2,
- 11 => 0,
- 12 => 0,
- 13 => 0,
- 14 => 0,
- ),
- 0 =>
- array (
- 0 => 0,
- ),
- 1 =>
- array (
- 0 => 0,
- ),
- 2 =>
- array (
- 0 => 0,
- ),
- 3 =>
- array (
- 0 => 0,
- ),
- 4 =>
- array (
- 0 => 0,
- 1 => 0,
- 2 => 0,
- 3 => 0,
- 4 => 0,
- 5 => 0,
- 6 => 0,
- 7 => 0,
- 8 => 5,
- 9 => 4,
- 10 => 2,
- 11 => 0,
- 12 => 0,
- 13 => 0,
- 14 => 0,
- ),
- 5 =>
- array (
- 0 => 0,
- 1 => 0,
- 2 => 0,
- 3 => 0,
- 4 => 0,
- 5 => 0,
- 6 => 0,
- 7 => 0,
- 8 => 5,
- 9 => 4,
- 10 => 2,
- 11 => 0,
- 12 => 0,
- 13 => 0,
- 14 => 0,
- ),
- );
- $this->_delim = array (
- -1 =>
- array (
- 0 => 'quotes',
- 1 => 'quotes',
- 2 => 'quotes',
- 3 => 'quotes',
- 4 => 'brackets',
- 5 => 'brackets',
- 6 => '',
- 7 => '',
- 8 => '',
- 9 => '',
- 10 => '',
- 11 => '',
- 12 => '',
- 13 => '',
- 14 => '',
- ),
- 0 =>
- array (
- 0 => '',
- ),
- 1 =>
- array (
- 0 => '',
- ),
- 2 =>
- array (
- 0 => '',
- ),
- 3 =>
- array (
- 0 => '',
- ),
- 4 =>
- array (
- 0 => 'quotes',
- 1 => 'quotes',
- 2 => 'quotes',
- 3 => 'quotes',
- 4 => 'brackets',
- 5 => 'brackets',
- 6 => '',
- 7 => '',
- 8 => '',
- 9 => '',
- 10 => '',
- 11 => '',
- 12 => '',
- 13 => '',
- 14 => '',
- ),
- 5 =>
- array (
- 0 => 'quotes',
- 1 => 'quotes',
- 2 => 'quotes',
- 3 => 'quotes',
- 4 => 'brackets',
- 5 => 'brackets',
- 6 => '',
- 7 => '',
- 8 => '',
- 9 => '',
- 10 => '',
- 11 => '',
- 12 => '',
- 13 => '',
- 14 => '',
- ),
- );
- $this->_inner = array (
- -1 =>
- array (
- 0 => 'string',
- 1 => 'string',
- 2 => 'string',
- 3 => 'string',
- 4 => 'code',
- 5 => 'code',
- 6 => 'identifier',
- 7 => 'identifier',
- 8 => 'number',
- 9 => 'number',
- 10 => 'number',
- 11 => 'number',
- 12 => 'number',
- 13 => 'number',
- 14 => 'comment',
- ),
- 0 =>
- array (
- 0 => 'special',
- ),
- 1 =>
- array (
- 0 => 'special',
- ),
- 2 =>
- array (
- 0 => 'special',
- ),
- 3 =>
- array (
- 0 => 'special',
- ),
- 4 =>
- array (
- 0 => 'string',
- 1 => 'string',
- 2 => 'string',
- 3 => 'string',
- 4 => 'code',
- 5 => 'code',
- 6 => 'identifier',
- 7 => 'identifier',
- 8 => 'number',
- 9 => 'number',
- 10 => 'number',
- 11 => 'number',
- 12 => 'number',
- 13 => 'number',
- 14 => 'comment',
- ),
- 5 =>
- array (
- 0 => 'string',
- 1 => 'string',
- 2 => 'string',
- 3 => 'string',
- 4 => 'code',
- 5 => 'code',
- 6 => 'identifier',
- 7 => 'identifier',
- 8 => 'number',
- 9 => 'number',
- 10 => 'number',
- 11 => 'number',
- 12 => 'number',
- 13 => 'number',
- 14 => 'comment',
- ),
- );
- $this->_end = array (
- 0 => '/(?i)\'\'\'/',
- 1 => '/(?i)"""/',
- 2 => '/(?i)"/',
- 3 => '/(?i)\'/',
- 4 => '/(?i)\\)/',
- 5 => '/(?i)\\]/',
- );
- $this->_states = array (
- -1 =>
- array (
- 0 => 0,
- 1 => 1,
- 2 => 2,
- 3 => 3,
- 4 => 4,
- 5 => 5,
- 6 => -1,
- 7 => -1,
- 8 => -1,
- 9 => -1,
- 10 => -1,
- 11 => -1,
- 12 => -1,
- 13 => -1,
- 14 => -1,
- ),
- 0 =>
- array (
- 0 => -1,
- ),
- 1 =>
- array (
- 0 => -1,
- ),
- 2 =>
- array (
- 0 => -1,
- ),
- 3 =>
- array (
- 0 => -1,
- ),
- 4 =>
- array (
- 0 => 0,
- 1 => 1,
- 2 => 2,
- 3 => 3,
- 4 => 4,
- 5 => 5,
- 6 => -1,
- 7 => -1,
- 8 => -1,
- 9 => -1,
- 10 => -1,
- 11 => -1,
- 12 => -1,
- 13 => -1,
- 14 => -1,
- ),
- 5 =>
- array (
- 0 => 0,
- 1 => 1,
- 2 => 2,
- 3 => 3,
- 4 => 4,
- 5 => 5,
- 6 => -1,
- 7 => -1,
- 8 => -1,
- 9 => -1,
- 10 => -1,
- 11 => -1,
- 12 => -1,
- 13 => -1,
- 14 => -1,
- ),
- );
- $this->_keywords = array (
- -1 =>
- array (
- 0 => -1,
- 1 => -1,
- 2 => -1,
- 3 => -1,
- 4 => -1,
- 5 => -1,
- 6 =>
- array (
- 'builtin' => '/^(__import__|abs|apply|basestring|bool|buffer|callable|chr|classmethod|cmp|coerce|compile|complex|delattr|dict|dir|divmod|enumerate|eval|execfile|file|filter|float|getattr|globals|hasattr|hash|help|hex|id|input|int|intern|isinstance|issubclass|iter|len|list|locals|long|map|max|min|object|oct|open|ord|pow|property|range|raw_input|reduce|reload|repr|round|setattr|slice|staticmethod|sum|super|str|tuple|type|unichr|unicode|vars|xrange|zip)$/',
- ),
- 7 =>
- array (
- 'reserved' => '/^(and|del|for|is|raise|assert|elif|from|lambda|return|break|else|global|not|try|class|except|if|or|while|continue|exec|import|pass|yield|def|finally|in|print|False|True|None|NotImplemented|Ellipsis|Exception|SystemExit|StopIteration|StandardError|KeyboardInterrupt|ImportError|EnvironmentError|IOError|OSError|WindowsError|EOFError|RuntimeError|NotImplementedError|NameError|UnboundLocalError|AttributeError|SyntaxError|IndentationError|TabError|TypeError|AssertionError|LookupError|IndexError|KeyError|ArithmeticError|OverflowError|ZeroDivisionError|FloatingPointError|ValueError|UnicodeError|UnicodeEncodeError|UnicodeDecodeError|UnicodeTranslateError|ReferenceError|SystemError|MemoryError|Warning|UserWarning|DeprecationWarning|PendingDeprecationWarning|SyntaxWarning|OverflowWarning|RuntimeWarning|FutureWarning)$/',
- ),
- 8 =>
- array (
- ),
- 9 =>
- array (
- ),
- 10 =>
- array (
- ),
- 11 =>
- array (
- ),
- 12 =>
- array (
- ),
- 13 =>
- array (
- ),
- 14 =>
- array (
- ),
- ),
- 0 =>
- array (
- 0 =>
- array (
- ),
- ),
- 1 =>
- array (
- 0 =>
- array (
- ),
- ),
- 2 =>
- array (
- 0 =>
- array (
- ),
- ),
- 3 =>
- array (
- 0 =>
- array (
- ),
- ),
- 4 =>
- array (
- 0 => -1,
- 1 => -1,
- 2 => -1,
- 3 => -1,
- 4 => -1,
- 5 => -1,
- 6 =>
- array (
- 'builtin' => '/^(__import__|abs|apply|basestring|bool|buffer|callable|chr|classmethod|cmp|coerce|compile|complex|delattr|dict|dir|divmod|enumerate|eval|execfile|file|filter|float|getattr|globals|hasattr|hash|help|hex|id|input|int|intern|isinstance|issubclass|iter|len|list|locals|long|map|max|min|object|oct|open|ord|pow|property|range|raw_input|reduce|reload|repr|round|setattr|slice|staticmethod|sum|super|str|tuple|type|unichr|unicode|vars|xrange|zip)$/',
- ),
- 7 =>
- array (
- 'reserved' => '/^(and|del|for|is|raise|assert|elif|from|lambda|return|break|else|global|not|try|class|except|if|or|while|continue|exec|import|pass|yield|def|finally|in|print|False|True|None|NotImplemented|Ellipsis|Exception|SystemExit|StopIteration|StandardError|KeyboardInterrupt|ImportError|EnvironmentError|IOError|OSError|WindowsError|EOFError|RuntimeError|NotImplementedError|NameError|UnboundLocalError|AttributeError|SyntaxError|IndentationError|TabError|TypeError|AssertionError|LookupError|IndexError|KeyError|ArithmeticError|OverflowError|ZeroDivisionError|FloatingPointError|ValueError|UnicodeError|UnicodeEncodeError|UnicodeDecodeError|UnicodeTranslateError|ReferenceError|SystemError|MemoryError|Warning|UserWarning|DeprecationWarning|PendingDeprecationWarning|SyntaxWarning|OverflowWarning|RuntimeWarning|FutureWarning)$/',
- ),
- 8 =>
- array (
- ),
- 9 =>
- array (
- ),
- 10 =>
- array (
- ),
- 11 =>
- array (
- ),
- 12 =>
- array (
- ),
- 13 =>
- array (
- ),
- 14 =>
- array (
- ),
- ),
- 5 =>
- array (
- 0 => -1,
- 1 => -1,
- 2 => -1,
- 3 => -1,
- 4 => -1,
- 5 => -1,
- 6 =>
- array (
- 'builtin' => '/^(__import__|abs|apply|basestring|bool|buffer|callable|chr|classmethod|cmp|coerce|compile|complex|delattr|dict|dir|divmod|enumerate|eval|execfile|file|filter|float|getattr|globals|hasattr|hash|help|hex|id|input|int|intern|isinstance|issubclass|iter|len|list|locals|long|map|max|min|object|oct|open|ord|pow|property|range|raw_input|reduce|reload|repr|round|setattr|slice|staticmethod|sum|super|str|tuple|type|unichr|unicode|vars|xrange|zip)$/',
- ),
- 7 =>
- array (
- 'reserved' => '/^(and|del|for|is|raise|assert|elif|from|lambda|return|break|else|global|not|try|class|except|if|or|while|continue|exec|import|pass|yield|def|finally|in|print|False|True|None|NotImplemented|Ellipsis|Exception|SystemExit|StopIteration|StandardError|KeyboardInterrupt|ImportError|EnvironmentError|IOError|OSError|WindowsError|EOFError|RuntimeError|NotImplementedError|NameError|UnboundLocalError|AttributeError|SyntaxError|IndentationError|TabError|TypeError|AssertionError|LookupError|IndexError|KeyError|ArithmeticError|OverflowError|ZeroDivisionError|FloatingPointError|ValueError|UnicodeError|UnicodeEncodeError|UnicodeDecodeError|UnicodeTranslateError|ReferenceError|SystemError|MemoryError|Warning|UserWarning|DeprecationWarning|PendingDeprecationWarning|SyntaxWarning|OverflowWarning|RuntimeWarning|FutureWarning)$/',
- ),
- 8 =>
- array (
- ),
- 9 =>
- array (
- ),
- 10 =>
- array (
- ),
- 11 =>
- array (
- ),
- 12 =>
- array (
- ),
- 13 =>
- array (
- ),
- 14 =>
- array (
- ),
- ),
- );
- $this->_parts = array (
- 0 =>
- array (
- 0 => NULL,
- ),
- 1 =>
- array (
- 0 => NULL,
- ),
- 2 =>
- array (
- 0 => NULL,
- ),
- 3 =>
- array (
- 0 => NULL,
- ),
- 4 =>
- array (
- 0 => NULL,
- 1 => NULL,
- 2 => NULL,
- 3 => NULL,
- 4 => NULL,
- 5 => NULL,
- 6 => NULL,
- 7 => NULL,
- 8 => NULL,
- 9 => NULL,
- 10 => NULL,
- 11 => NULL,
- 12 => NULL,
- 13 => NULL,
- 14 => NULL,
- ),
- 5 =>
- array (
- 0 => NULL,
- 1 => NULL,
- 2 => NULL,
- 3 => NULL,
- 4 => NULL,
- 5 => NULL,
- 6 => NULL,
- 7 => NULL,
- 8 => NULL,
- 9 => NULL,
- 10 => NULL,
- 11 => NULL,
- 12 => NULL,
- 13 => NULL,
- 14 => NULL,
- ),
- );
- $this->_subst = array (
- -1 =>
- array (
- 0 => false,
- 1 => false,
- 2 => false,
- 3 => false,
- 4 => false,
- 5 => false,
- 6 => false,
- 7 => false,
- 8 => false,
- 9 => false,
- 10 => false,
- 11 => false,
- 12 => false,
- 13 => false,
- 14 => false,
- ),
- 0 =>
- array (
- 0 => false,
- ),
- 1 =>
- array (
- 0 => false,
- ),
- 2 =>
- array (
- 0 => false,
- ),
- 3 =>
- array (
- 0 => false,
- ),
- 4 =>
- array (
- 0 => false,
- 1 => false,
- 2 => false,
- 3 => false,
- 4 => false,
- 5 => false,
- 6 => false,
- 7 => false,
- 8 => false,
- 9 => false,
- 10 => false,
- 11 => false,
- 12 => false,
- 13 => false,
- 14 => false,
- ),
- 5 =>
- array (
- 0 => false,
- 1 => false,
- 2 => false,
- 3 => false,
- 4 => false,
- 5 => false,
- 6 => false,
- 7 => false,
- 8 => false,
- 9 => false,
- 10 => false,
- 11 => false,
- 12 => false,
- 13 => false,
- 14 => false,
- ),
- );
- $this->_conditions = array (
- );
- $this->_kwmap = array (
- 'builtin' => 'builtin',
- 'reserved' => 'reserved',
- );
- $this->_defClass = 'code';
- $this->_checkDefines();
- }
-
-} \ No newline at end of file
diff --git a/library/Text_Highlighter/Text/Highlighter/RUBY.php b/library/Text_Highlighter/Text/Highlighter/RUBY.php
deleted file mode 100644
index ce20e9f2e..000000000
--- a/library/Text_Highlighter/Text/Highlighter/RUBY.php
+++ /dev/null
@@ -1,825 +0,0 @@
-<?php
-/**
- * Auto-generated class. RUBY syntax highlighting
- *
- *
- * FIXME: While this construction : s.split /z/i
- * is valid, regular expression is not recognized as such
- * (/ folowing an identifier or number is not recognized as
- * start of RE), making highlighting improper
- *
- * %q(a (nested) string) does not get highlighted correctly
- *
- *
- * PHP version 4 and 5
- *
- * LICENSE: This source file is subject to version 3.0 of the PHP license
- * that is available through the world-wide-web at the following URI:
- * http://www.php.net/license/3_0.txt. If you did not receive a copy of
- * the PHP License and are unable to obtain it through the web, please
- * send a note to license@php.net so we can mail you a copy immediately.
- *
- * @copyright 2004-2006 Andrey Demenev
- * @license http://www.php.net/license/3_0.txt PHP License
- * @link http://pear.php.net/package/Text_Highlighter
- * @category Text
- * @package Text_Highlighter
- * @version generated from: : ruby.xml,v 1.1 2007/06/03 02:35:28 ssttoo Exp
- * @author Andrey Demenev <demenev@gmail.com>
- *
- */
-
-/**
- * @ignore
- */
-
-require_once 'Text/Highlighter.php';
-
-/**
- * Auto-generated class. RUBY syntax highlighting
- *
- * @author Andrey Demenev <demenev@gmail.com>
- * @category Text
- * @package Text_Highlighter
- * @copyright 2004-2006 Andrey Demenev
- * @license http://www.php.net/license/3_0.txt PHP License
- * @version Release: @package_version@
- * @link http://pear.php.net/package/Text_Highlighter
- */
-class Text_Highlighter_RUBY extends Text_Highlighter
-{
- var $_language = 'ruby';
-
- /**
- * PHP4 Compatible Constructor
- *
- * @param array $options
- * @access public
- */
- function Text_Highlighter_RUBY($options=array())
- {
- $this->__construct($options);
- }
-
-
- /**
- * Constructor
- *
- * @param array $options
- * @access public
- */
- function __construct($options=array())
- {
-
- $this->_options = $options;
- $this->_regs = array (
- -1 => '/((?mi)^__END__$)|((?i)")|((?i)%[Qx]([!"#\\$%&\'+\\-*.\\/:;=?@^`|~{<\\[(]))|((?i)\')|((?i)%[wq]([!"#\\$%&\'+\\-*.\\/:;=?@^`|~{<\\[(]))|((?i)\\$(\\W|\\w+))|((?ii)@@?[_a-z][\\d_a-z]*)|((?i)\\()|((?i)\\[)|((?i)[a-z_]\\w*)|((?i)((\\d+|((\\d*\\.\\d+)|(\\d+\\.\\d*)))[eE][+-]?\\d+))|((?i)(\\d*\\.\\d+)|(\\d+\\.\\d*))|((?i)0[xX][\\da-f]+l?)|((?i)\\d+l?|\\b0l?\\b)|((?i)0[0-7]+l?)|((?mi)^=begin$)|((?i)#)|((?i)\\s*\\/)/',
- 0 => '//',
- 1 => '/((?i)\\\\.)/',
- 2 => '/((?i)\\\\.)/',
- 3 => '/((?i)\\\\.)/',
- 4 => '/((?i)\\\\.)/',
- 5 => '/((?mi)^__END__$)|((?i)")|((?i)%[Qx]([!"#\\$%&\'+\\-*.\\/:;=?@^`|~{<\\[(]))|((?i)\')|((?i)%[wq]([!"#\\$%&\'+\\-*.\\/:;=?@^`|~{<\\[(]))|((?i)\\$(\\W|\\w+))|((?ii)@@?[_a-z][\\d_a-z]*)|((?i)\\()|((?i)\\[)|((?i)[a-z_]\\w*)|((?i)((\\d+|((\\d*\\.\\d+)|(\\d+\\.\\d*)))[eE][+-]?\\d+))|((?i)(\\d*\\.\\d+)|(\\d+\\.\\d*))|((?i)0[xX][\\da-f]+l?)|((?i)\\d+l?|\\b0l?\\b)|((?i)0[0-7]+l?)|((?mi)^=begin$)|((?i)#)|((?i)\\s*\\/)/',
- 6 => '/((?mi)^__END__$)|((?i)")|((?i)%[Qx]([!"#\\$%&\'+\\-*.\\/:;=?@^`|~{<\\[(]))|((?i)\')|((?i)%[wq]([!"#\\$%&\'+\\-*.\\/:;=?@^`|~{<\\[(]))|((?i)\\$(\\W|\\w+))|((?ii)@@?[_a-z][\\d_a-z]*)|((?i)\\()|((?i)\\[)|((?i)[a-z_]\\w*)|((?i)((\\d+|((\\d*\\.\\d+)|(\\d+\\.\\d*)))[eE][+-]?\\d+))|((?i)(\\d*\\.\\d+)|(\\d+\\.\\d*))|((?i)0[xX][\\da-f]+l?)|((?i)\\d+l?|\\b0l?\\b)|((?i)0[0-7]+l?)|((?mi)^=begin$)|((?i)#)|((?i)\\s*\\/)/',
- 7 => '/((?i)\\$\\w+\\s*:.+\\$)/',
- 8 => '/((?i)\\$\\w+\\s*:.+\\$)/',
- 9 => '/((?i)\\\\.)/',
- );
- $this->_counts = array (
- -1 =>
- array (
- 0 => 0,
- 1 => 0,
- 2 => 1,
- 3 => 0,
- 4 => 1,
- 5 => 1,
- 6 => 0,
- 7 => 0,
- 8 => 0,
- 9 => 0,
- 10 => 5,
- 11 => 2,
- 12 => 0,
- 13 => 0,
- 14 => 0,
- 15 => 0,
- 16 => 0,
- 17 => 0,
- ),
- 0 =>
- array (
- ),
- 1 =>
- array (
- 0 => 0,
- ),
- 2 =>
- array (
- 0 => 0,
- ),
- 3 =>
- array (
- 0 => 0,
- ),
- 4 =>
- array (
- 0 => 0,
- ),
- 5 =>
- array (
- 0 => 0,
- 1 => 0,
- 2 => 1,
- 3 => 0,
- 4 => 1,
- 5 => 1,
- 6 => 0,
- 7 => 0,
- 8 => 0,
- 9 => 0,
- 10 => 5,
- 11 => 2,
- 12 => 0,
- 13 => 0,
- 14 => 0,
- 15 => 0,
- 16 => 0,
- 17 => 0,
- ),
- 6 =>
- array (
- 0 => 0,
- 1 => 0,
- 2 => 1,
- 3 => 0,
- 4 => 1,
- 5 => 1,
- 6 => 0,
- 7 => 0,
- 8 => 0,
- 9 => 0,
- 10 => 5,
- 11 => 2,
- 12 => 0,
- 13 => 0,
- 14 => 0,
- 15 => 0,
- 16 => 0,
- 17 => 0,
- ),
- 7 =>
- array (
- 0 => 0,
- ),
- 8 =>
- array (
- 0 => 0,
- ),
- 9 =>
- array (
- 0 => 0,
- ),
- );
- $this->_delim = array (
- -1 =>
- array (
- 0 => 'reserved',
- 1 => 'quotes',
- 2 => 'quotes',
- 3 => 'quotes',
- 4 => 'quotes',
- 5 => '',
- 6 => '',
- 7 => 'brackets',
- 8 => 'brackets',
- 9 => '',
- 10 => '',
- 11 => '',
- 12 => '',
- 13 => '',
- 14 => '',
- 15 => 'comment',
- 16 => 'comment',
- 17 => 'quotes',
- ),
- 0 =>
- array (
- ),
- 1 =>
- array (
- 0 => '',
- ),
- 2 =>
- array (
- 0 => '',
- ),
- 3 =>
- array (
- 0 => '',
- ),
- 4 =>
- array (
- 0 => '',
- ),
- 5 =>
- array (
- 0 => 'reserved',
- 1 => 'quotes',
- 2 => 'quotes',
- 3 => 'quotes',
- 4 => 'quotes',
- 5 => '',
- 6 => '',
- 7 => 'brackets',
- 8 => 'brackets',
- 9 => '',
- 10 => '',
- 11 => '',
- 12 => '',
- 13 => '',
- 14 => '',
- 15 => 'comment',
- 16 => 'comment',
- 17 => 'quotes',
- ),
- 6 =>
- array (
- 0 => 'reserved',
- 1 => 'quotes',
- 2 => 'quotes',
- 3 => 'quotes',
- 4 => 'quotes',
- 5 => '',
- 6 => '',
- 7 => 'brackets',
- 8 => 'brackets',
- 9 => '',
- 10 => '',
- 11 => '',
- 12 => '',
- 13 => '',
- 14 => '',
- 15 => 'comment',
- 16 => 'comment',
- 17 => 'quotes',
- ),
- 7 =>
- array (
- 0 => '',
- ),
- 8 =>
- array (
- 0 => '',
- ),
- 9 =>
- array (
- 0 => '',
- ),
- );
- $this->_inner = array (
- -1 =>
- array (
- 0 => 'comment',
- 1 => 'string',
- 2 => 'string',
- 3 => 'string',
- 4 => 'string',
- 5 => 'var',
- 6 => 'var',
- 7 => 'code',
- 8 => 'code',
- 9 => 'identifier',
- 10 => 'number',
- 11 => 'number',
- 12 => 'number',
- 13 => 'number',
- 14 => 'number',
- 15 => 'comment',
- 16 => 'comment',
- 17 => 'string',
- ),
- 0 =>
- array (
- ),
- 1 =>
- array (
- 0 => 'special',
- ),
- 2 =>
- array (
- 0 => 'special',
- ),
- 3 =>
- array (
- 0 => 'special',
- ),
- 4 =>
- array (
- 0 => 'special',
- ),
- 5 =>
- array (
- 0 => 'comment',
- 1 => 'string',
- 2 => 'string',
- 3 => 'string',
- 4 => 'string',
- 5 => 'var',
- 6 => 'var',
- 7 => 'code',
- 8 => 'code',
- 9 => 'identifier',
- 10 => 'number',
- 11 => 'number',
- 12 => 'number',
- 13 => 'number',
- 14 => 'number',
- 15 => 'comment',
- 16 => 'comment',
- 17 => 'string',
- ),
- 6 =>
- array (
- 0 => 'comment',
- 1 => 'string',
- 2 => 'string',
- 3 => 'string',
- 4 => 'string',
- 5 => 'var',
- 6 => 'var',
- 7 => 'code',
- 8 => 'code',
- 9 => 'identifier',
- 10 => 'number',
- 11 => 'number',
- 12 => 'number',
- 13 => 'number',
- 14 => 'number',
- 15 => 'comment',
- 16 => 'comment',
- 17 => 'string',
- ),
- 7 =>
- array (
- 0 => 'inlinedoc',
- ),
- 8 =>
- array (
- 0 => 'inlinedoc',
- ),
- 9 =>
- array (
- 0 => 'special',
- ),
- );
- $this->_end = array (
- 0 => '/(?i)$/',
- 1 => '/(?i)"/',
- 2 => '/(?i)%b1%/',
- 3 => '/(?i)\'/',
- 4 => '/(?i)%b1%/',
- 5 => '/(?i)\\)/',
- 6 => '/(?i)\\]/',
- 7 => '/(?mi)^=end$/',
- 8 => '/(?mi)$/',
- 9 => '/(?i)\\/[iomx]*/',
- );
- $this->_states = array (
- -1 =>
- array (
- 0 => 0,
- 1 => 1,
- 2 => 2,
- 3 => 3,
- 4 => 4,
- 5 => -1,
- 6 => -1,
- 7 => 5,
- 8 => 6,
- 9 => -1,
- 10 => -1,
- 11 => -1,
- 12 => -1,
- 13 => -1,
- 14 => -1,
- 15 => 7,
- 16 => 8,
- 17 => 9,
- ),
- 0 =>
- array (
- ),
- 1 =>
- array (
- 0 => -1,
- ),
- 2 =>
- array (
- 0 => -1,
- ),
- 3 =>
- array (
- 0 => -1,
- ),
- 4 =>
- array (
- 0 => -1,
- ),
- 5 =>
- array (
- 0 => 0,
- 1 => 1,
- 2 => 2,
- 3 => 3,
- 4 => 4,
- 5 => -1,
- 6 => -1,
- 7 => 5,
- 8 => 6,
- 9 => -1,
- 10 => -1,
- 11 => -1,
- 12 => -1,
- 13 => -1,
- 14 => -1,
- 15 => 7,
- 16 => 8,
- 17 => 9,
- ),
- 6 =>
- array (
- 0 => 0,
- 1 => 1,
- 2 => 2,
- 3 => 3,
- 4 => 4,
- 5 => -1,
- 6 => -1,
- 7 => 5,
- 8 => 6,
- 9 => -1,
- 10 => -1,
- 11 => -1,
- 12 => -1,
- 13 => -1,
- 14 => -1,
- 15 => 7,
- 16 => 8,
- 17 => 9,
- ),
- 7 =>
- array (
- 0 => -1,
- ),
- 8 =>
- array (
- 0 => -1,
- ),
- 9 =>
- array (
- 0 => -1,
- ),
- );
- $this->_keywords = array (
- -1 =>
- array (
- 0 => -1,
- 1 => -1,
- 2 => -1,
- 3 => -1,
- 4 => -1,
- 5 =>
- array (
- ),
- 6 =>
- array (
- ),
- 7 => -1,
- 8 => -1,
- 9 =>
- array (
- 'reserved' => '/^(__FILE__|require|and|def|end|in|or|self|unless|__LINE__|begin|defined?|ensure|module|redo|super|until|BEGIN|break|do|false|next|rescue|then|when|END|case|else|for|nil|retry|true|while|alias|module_function|private|public|protected|attr_reader|attr_writer|attr_accessor|class|elsif|if|not|return|undef|yield)$/',
- ),
- 10 =>
- array (
- ),
- 11 =>
- array (
- ),
- 12 =>
- array (
- ),
- 13 =>
- array (
- ),
- 14 =>
- array (
- ),
- 15 => -1,
- 16 => -1,
- 17 => -1,
- ),
- 0 =>
- array (
- ),
- 1 =>
- array (
- 0 =>
- array (
- ),
- ),
- 2 =>
- array (
- 0 =>
- array (
- ),
- ),
- 3 =>
- array (
- 0 =>
- array (
- ),
- ),
- 4 =>
- array (
- 0 =>
- array (
- ),
- ),
- 5 =>
- array (
- 0 => -1,
- 1 => -1,
- 2 => -1,
- 3 => -1,
- 4 => -1,
- 5 =>
- array (
- ),
- 6 =>
- array (
- ),
- 7 => -1,
- 8 => -1,
- 9 =>
- array (
- 'reserved' => '/^(__FILE__|require|and|def|end|in|or|self|unless|__LINE__|begin|defined?|ensure|module|redo|super|until|BEGIN|break|do|false|next|rescue|then|when|END|case|else|for|nil|retry|true|while|alias|module_function|private|public|protected|attr_reader|attr_writer|attr_accessor|class|elsif|if|not|return|undef|yield)$/',
- ),
- 10 =>
- array (
- ),
- 11 =>
- array (
- ),
- 12 =>
- array (
- ),
- 13 =>
- array (
- ),
- 14 =>
- array (
- ),
- 15 => -1,
- 16 => -1,
- 17 => -1,
- ),
- 6 =>
- array (
- 0 => -1,
- 1 => -1,
- 2 => -1,
- 3 => -1,
- 4 => -1,
- 5 =>
- array (
- ),
- 6 =>
- array (
- ),
- 7 => -1,
- 8 => -1,
- 9 =>
- array (
- 'reserved' => '/^(__FILE__|require|and|def|end|in|or|self|unless|__LINE__|begin|defined?|ensure|module|redo|super|until|BEGIN|break|do|false|next|rescue|then|when|END|case|else|for|nil|retry|true|while|alias|module_function|private|public|protected|attr_reader|attr_writer|attr_accessor|class|elsif|if|not|return|undef|yield)$/',
- ),
- 10 =>
- array (
- ),
- 11 =>
- array (
- ),
- 12 =>
- array (
- ),
- 13 =>
- array (
- ),
- 14 =>
- array (
- ),
- 15 => -1,
- 16 => -1,
- 17 => -1,
- ),
- 7 =>
- array (
- 0 =>
- array (
- ),
- ),
- 8 =>
- array (
- 0 =>
- array (
- ),
- ),
- 9 =>
- array (
- 0 =>
- array (
- ),
- ),
- );
- $this->_parts = array (
- 0 =>
- array (
- ),
- 1 =>
- array (
- 0 => NULL,
- ),
- 2 =>
- array (
- 0 => NULL,
- ),
- 3 =>
- array (
- 0 => NULL,
- ),
- 4 =>
- array (
- 0 => NULL,
- ),
- 5 =>
- array (
- 0 => NULL,
- 1 => NULL,
- 2 => NULL,
- 3 => NULL,
- 4 => NULL,
- 5 => NULL,
- 6 => NULL,
- 7 => NULL,
- 8 => NULL,
- 9 => NULL,
- 10 => NULL,
- 11 => NULL,
- 12 => NULL,
- 13 => NULL,
- 14 => NULL,
- 15 => NULL,
- 16 => NULL,
- 17 => NULL,
- ),
- 6 =>
- array (
- 0 => NULL,
- 1 => NULL,
- 2 => NULL,
- 3 => NULL,
- 4 => NULL,
- 5 => NULL,
- 6 => NULL,
- 7 => NULL,
- 8 => NULL,
- 9 => NULL,
- 10 => NULL,
- 11 => NULL,
- 12 => NULL,
- 13 => NULL,
- 14 => NULL,
- 15 => NULL,
- 16 => NULL,
- 17 => NULL,
- ),
- 7 =>
- array (
- 0 => NULL,
- ),
- 8 =>
- array (
- 0 => NULL,
- ),
- 9 =>
- array (
- 0 => NULL,
- ),
- );
- $this->_subst = array (
- -1 =>
- array (
- 0 => false,
- 1 => false,
- 2 => true,
- 3 => false,
- 4 => true,
- 5 => false,
- 6 => false,
- 7 => false,
- 8 => false,
- 9 => false,
- 10 => false,
- 11 => false,
- 12 => false,
- 13 => false,
- 14 => false,
- 15 => false,
- 16 => false,
- 17 => false,
- ),
- 0 =>
- array (
- ),
- 1 =>
- array (
- 0 => false,
- ),
- 2 =>
- array (
- 0 => false,
- ),
- 3 =>
- array (
- 0 => false,
- ),
- 4 =>
- array (
- 0 => false,
- ),
- 5 =>
- array (
- 0 => false,
- 1 => false,
- 2 => true,
- 3 => false,
- 4 => true,
- 5 => false,
- 6 => false,
- 7 => false,
- 8 => false,
- 9 => false,
- 10 => false,
- 11 => false,
- 12 => false,
- 13 => false,
- 14 => false,
- 15 => false,
- 16 => false,
- 17 => false,
- ),
- 6 =>
- array (
- 0 => false,
- 1 => false,
- 2 => true,
- 3 => false,
- 4 => true,
- 5 => false,
- 6 => false,
- 7 => false,
- 8 => false,
- 9 => false,
- 10 => false,
- 11 => false,
- 12 => false,
- 13 => false,
- 14 => false,
- 15 => false,
- 16 => false,
- 17 => false,
- ),
- 7 =>
- array (
- 0 => false,
- ),
- 8 =>
- array (
- 0 => false,
- ),
- 9 =>
- array (
- 0 => false,
- ),
- );
- $this->_conditions = array (
- );
- $this->_kwmap = array (
- 'reserved' => 'reserved',
- );
- $this->_defClass = 'code';
- $this->_checkDefines();
- }
-
-} \ No newline at end of file
diff --git a/library/Text_Highlighter/Text/Highlighter/Renderer.php b/library/Text_Highlighter/Text/Highlighter/Renderer.php
deleted file mode 100644
index cb8993ff8..000000000
--- a/library/Text_Highlighter/Text/Highlighter/Renderer.php
+++ /dev/null
@@ -1,164 +0,0 @@
-<?php
-/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
-/**
- * Abstract base class for Highlighter renderers
- *
- * PHP versions 4 and 5
- *
- * LICENSE: This source file is subject to version 3.0 of the PHP license
- * that is available through the world-wide-web at the following URI:
- * http://www.php.net/license/3_0.txt. If you did not receive a copy of
- * the PHP License and are unable to obtain it through the web, please
- * send a note to license@php.net so we can mail you a copy immediately.
- *
- * @category Text
- * @package Text_Highlighter
- * @author Andrey Demenev <demenev@gmail.com>
- * @copyright 2004-2006 Andrey Demenev
- * @license http://www.php.net/license/3_0.txt PHP License
- * @version CVS: $Id$
- * @link http://pear.php.net/package/Text_Highlighter
- */
-
-/**
- * Abstract base class for Highlighter renderers
- *
- * @author Andrey Demenev <demenev@gmail.com>
- * @category Text
- * @package Text_Highlighter
- * @copyright 2004-2006 Andrey Demenev
- * @license http://www.php.net/license/3_0.txt PHP License
- * @version Release: @package_version@
- * @link http://pear.php.net/package/Text_Highlighter
- * @abstract
- */
-
-class Text_Highlighter_Renderer
-{
- /**
- * Renderer options
- *
- * @var array
- * @access protected
- */
- var $_options = array();
-
- /**
- * Current language
- *
- * @var string
- * @access protected
- */
- var $_language = '';
-
- /**
- * Constructor
- *
- * @access public
- *
- * @param array $options Rendering options. Renderer-specific.
- */
- function __construct($options = array())
- {
- $this->_options = $options;
- }
-
- /**
- * PHP4 compatable constructor
- *
- * @access public
- *
- * @param array $options Rendering options. Renderer-specific.
- */
- function Text_Highlighter_Renderer($options = array())
- {
- $this->__construct($options);
- }
-
- /**
- * Resets renderer state
- *
- * @access public
- *
- * @param array $options Rendering options. Renderer-specific.
- */
- function reset()
- {
- return;
- }
-
- /**
- * Preprocesses code
- *
- * @access public
- *
- * @param string $str Code to preprocess
- * @return string Preprocessed code
- */
- function preprocess($str)
- {
- return $str;
- }
-
- /**
- * Accepts next token
- *
- * @abstract
- * @access public
- *
- * @param string $class Token class
- * @param string $content Token content
- */
- function acceptToken($class, $content)
- {
- return;
- }
-
- /**
- * Signals that no more tokens are available
- *
- * @access public
- *
- */
- function finalize()
- {
- return;
- }
-
- /**
- * Get generated output
- *
- * @abstract
- * @return mixed Renderer-specific
- * @access public
- *
- */
- function getOutput()
- {
- return;
- }
-
- /**
- * Set current language
- *
- * @abstract
- * @return void
- * @access public
- *
- */
- function setCurrentLanguage($lang)
- {
- $this->_language = $lang;
- }
-
-}
-
-/*
- * Local variables:
- * tab-width: 4
- * c-basic-offset: 4
- * c-hanging-comment-ender-p: nil
- * End:
- */
-
-?>
diff --git a/library/Text_Highlighter/Text/Highlighter/Renderer/Array.php b/library/Text_Highlighter/Text/Highlighter/Renderer/Array.php
deleted file mode 100644
index edf6290f8..000000000
--- a/library/Text_Highlighter/Text/Highlighter/Renderer/Array.php
+++ /dev/null
@@ -1,202 +0,0 @@
-<?php
-/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
-/**
- * Array renderer.
- *
- * Produces an array that contains class names and content pairs.
- * The array can be enumerated or associative. Associative means
- * <code>class =&gt; content</code> pairs.
- * Based on the HTML renderer by Andrey Demenev.
- *
- * LICENSE: This source file is subject to version 3.0 of the PHP license
- * that is available through the world-wide-web at the following URI:
- * http://www.php.net/license/3_0.txt. If you did not receive a copy of
- * the PHP License and are unable to obtain it through the web, please
- * send a note to license@php.net so we can mail you a copy immediately.
- *
- * @category Text
- * @package Text_Highlighter
- * @author Stoyan Stefanov <ssttoo@gmail.com>
- * @copyright 2006 Stoyan Stefanov
- * @license http://www.php.net/license/3_0.txt PHP License
- * @version CVS: $Id$
- * @link http://pear.php.net/package/Text_Highlighter
- */
-
-/**
- * @ignore
- */
-
-require_once 'Text/Highlighter/Renderer.php';
-
-/**
- * Array renderer, based on Andrey Demenev's HTML renderer.
- *
- * In addition to the options supported by the HTML renderer,
- * the following options were also introduced:
- * <ul><li>htmlspecialchars - whether or not htmlspecialchars() will
- * be called on the content, default TRUE</li>
- * <li>enumerated - type of array produced, default FALSE,
- * meaning associative array</li>
- * </ul>
- *
- *
- * @author Stoyan Stefanov <ssttoo@gmail.com>
- * @category Text
- * @package Text_Highlighter
- * @copyright 2006 Stoyan Stefanov
- * @license http://www.php.net/license/3_0.txt PHP License
- * @version Release: 0.5.0
- * @link http://pear.php.net/package/Text_Highlighter
- */
-
-class Text_Highlighter_Renderer_Array extends Text_Highlighter_Renderer
-{
-
- /**#@+
- * @access private
- */
-
- /**
- * Tab size
- *
- * @var integer
- */
- var $_tabsize = 4;
-
- /**
- * Should htmlentities() will be called
- *
- * @var boolean
- */
- var $_htmlspecialchars = true;
-
- /**
- * Enumerated or associative array
- *
- * @var integer
- */
- var $_enumerated = false;
-
- /**
- * Array containing highlighting rules
- *
- * @var array
- */
- var $_output = array();
-
- /**#@-*/
-
- /**
- * Preprocesses code
- *
- * @access public
- *
- * @param string $str Code to preprocess
- * @return string Preprocessed code
- */
- function preprocess($str)
- {
- // normalize whitespace and tabs
- $str = str_replace("\r\n","\n", $str);
- $str = str_replace("\r","\n", $str);
- // some browsers refuse to display empty lines
- $str = preg_replace('~^$~m'," ", $str);
- $str = str_replace("\t",str_repeat(' ', $this->_tabsize), $str);
- return rtrim($str);
- }
-
-
- /**
- * Resets renderer state
- *
- * Descendents of Text_Highlighter call this method from the constructor,
- * passing $options they get as parameter.
- *
- * @access protected
- */
- function reset()
- {
- $this->_output = array();
- $this->_lastClass = 'default';
- if (isset($this->_options['tabsize'])) {
- $this->_tabsize = $this->_options['tabsize'];
- }
- if (isset($this->_options['htmlspecialchars'])) {
- $this->_htmlspecialchars = $this->_options['htmlspecialchars'];
- }
- if (isset($this->_options['enumerated'])) {
- $this->_enumerated = $this->_options['enumerated'];
- }
- }
-
-
-
- /**
- * Accepts next token
- *
- * @abstract
- * @access public
- * @param string $class Token class
- * @param string $content Token content
- */
- function acceptToken($class, $content)
- {
-
- if(! is_array($this->_output)) {
- $this->_output = array();
- }
- $theClass = $this->_getFullClassName($class);
- if ($this->_htmlspecialchars) {
- $content = htmlspecialchars($content);
- }
- if ($this->_enumerated) {
- $this->_output[] = array($class, $content);
- } else {
- $this->_output[][$class] = $content;
- }
- $this->_lastClass = $class;
-
- }
-
-
- /**
- * Given a CSS class name, returns the class name
- * with language name prepended, if necessary
- *
- * @access private
- *
- * @param string $class Token class
- */
- function _getFullClassName($class)
- {
- if (!empty($this->_options['use_language'])) {
- $theClass = $this->_language . '-' . $class;
- } else {
- $theClass = $class;
- }
- return $theClass;
- }
-
- /**
- * Get generated output
- *
- * @abstract
- * @return array Highlighted code as an array
- * @access public
- */
- function getOutput()
- {
- return $this->_output;
- }
-}
-
-/*
- * Local variables:
- * tab-width: 4
- * c-basic-offset: 4
- * c-hanging-comment-ender-p: nil
- * End:
- */
-
-?>
diff --git a/library/Text_Highlighter/Text/Highlighter/Renderer/BB.php b/library/Text_Highlighter/Text/Highlighter/Renderer/BB.php
deleted file mode 100644
index abd77cfd8..000000000
--- a/library/Text_Highlighter/Text/Highlighter/Renderer/BB.php
+++ /dev/null
@@ -1,238 +0,0 @@
-<?php
-/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
-/**
- * BB code renderer.
- *
- * This BB renderer produces BB code, ready to be pasted in bulletin boards and
- * other applications that accept BB code. Based on the HTML renderer by Andrey Demenev.
- *
- * LICENSE: This source file is subject to version 3.0 of the PHP license
- * that is available through the world-wide-web at the following URI:
- * http://www.php.net/license/3_0.txt. If you did not receive a copy of
- * the PHP License and are unable to obtain it through the web, please
- * send a note to license@php.net so we can mail you a copy immediately.
- *
- * @category Text
- * @package Text_Highlighter
- * @author Stoyan Stefanov <ssttoo@gmail.com>
- * @copyright 2005 Stoyan Stefanov
- * @license http://www.php.net/license/3_0.txt PHP License
- * @version CVS: $Id$
- * @link http://pear.php.net/package/Text_Highlighter
- */
-
-/**
- * @ignore
- */
-
-require_once 'Text/Highlighter/Renderer.php';
-
-/**
- * BB code renderer, based on Andrey Demenev's HTML renderer.
- *
- * Elements of $options argument of constructor (each being optional):
- *
- * - 'numbers' - Line numbering TRUE or FALSE
- * - 'tabsize' - Tab size, default is 4
- * - 'bb_tags' - An array containing three BB tags, see below
- * - 'tag_brackets' - An array that conains opening and closing tags, [ and ]
- * - 'colors' - An array with all the colors to be used for highlighting
- *
- * The default BB tags are:
- * - 'color' => 'color'
- * - 'list' => 'list'
- * - 'list_item' => '*'
- *
- * The default colors for the highlighter are:
- * - 'default' => 'Black',
- * - 'code' => 'Gray',
- * - 'brackets' => 'Olive',
- * - 'comment' => 'Orange',
- * - 'mlcomment' => 'Orange',
- * - 'quotes' => 'Darkred',
- * - 'string' => 'Red',
- * - 'identifier' => 'Blue',
- * - 'builtin' => 'Teal',
- * - 'reserved' => 'Green',
- * - 'inlinedoc' => 'Blue',
- * - 'var' => 'Darkblue',
- * - 'url' => 'Blue',
- * - 'special' => 'Navy',
- * - 'number' => 'Maroon',
- * - 'inlinetags' => 'Blue',
- *
- *
- * @author Stoyan Stefanov <ssttoo@gmail.com>
- * @category Text
- * @package Text_Highlighter
- * @copyright 20045 Stoyan Stefanov
- * @license http://www.php.net/license/3_0.txt PHP License
- * @version Release: 0.5.0
- * @link http://pear.php.net/package/Text_Highlighter
- */
-
-class Text_Highlighter_Renderer_BB extends Text_Highlighter_Renderer_Array
-{
-
- /**#@+
- * @access private
- */
-
- /**
- * Line numbering - will use the specified BB tag for listings
- *
- * @var boolean
- */
- var $_numbers = false;
-
- /**
- * BB tags to be used
- *
- * @var array
- */
- var $_bb_tags = array (
- 'color' => 'color',
- 'list' => 'list',
- 'list_item' => '*',
- 'code' => 'code',
- );
-
- /**
- * BB brackets - [ and ]
- *
- * @var array
- */
- var $_tag_brackets = array ('start' => '[', 'end' => ']');
-
- /**
- * Colors map
- *
- * @var boolean
- */
- var $_colors = array(
- 'default' => 'Black',
- 'code' => 'Gray',
- 'brackets' => 'Olive',
- 'comment' => 'Orange',
- 'mlcomment' => 'Orange',
- 'quotes' => 'Darkred',
- 'string' => 'Red',
- 'identifier' => 'Blue',
- 'builtin' => 'Teal',
- 'reserved' => 'Green',
- 'inlinedoc' => 'Blue',
- 'var' => 'Darkblue',
- 'url' => 'Blue',
- 'special' => 'Navy',
- 'number' => 'Maroon',
- 'inlinetags' => 'Blue',
- );
-
- /**#@-*/
-
- /**
- * Resets renderer state
- *
- * @access protected
- *
- *
- * Descendents of Text_Highlighter call this method from the constructor,
- * passing $options they get as parameter.
- */
- function reset()
- {
- parent::reset();
- if (isset($this->_options['numbers'])) {
- $this->_numbers = $this->_options['numbers'];
- }
- if (isset($this->_options['bb_tags'])) {
- $this->_bb_tags = array_merge($this->_bb_tags, $this->_options['bb_tags']);
- }
- if (isset($this->_options['tag_brackets'])) {
- $this->_tag_brackets = array_merge($this->_tag_brackets, $this->_options['tag_brackets']);
- }
- if (isset($this->_options['colors'])) {
- $this->_colors = array_merge($this->_colors, $this->_options['colors']);
- }
- }
-
-
- /**
- * Signals that no more tokens are available
- *
- * @abstract
- * @access public
- *
- */
- function finalize()
- {
-
- // get parent's output
- parent::finalize();
- $output = parent::getOutput();
-
- $bb_output = '';
-
- $color_start = $this->_tag_brackets['start'] . $this->_bb_tags['color'] . '=%s' . $this->_tag_brackets['end'];
- $color_end = $this->_tag_brackets['start'] . '/' . $this->_bb_tags['color'] . $this->_tag_brackets['end'];
-
- // loop through each class=>content pair
- foreach ($output AS $token) {
-
- if ($this->_enumerated) {
- $class = $token[0];
- $content = $token[1];
- } else {
- $key = key($token);
- $class = $key;
- $content = $token[$key];
- }
-
- $iswhitespace = ctype_space($content);
- if (!$iswhitespace && !empty($this->_colors[$class])) {
- $bb_output .= sprintf($color_start, $this->_colors[$class]);
- $bb_output .= $content;
- $bb_output .= $color_end;
- } else {
- $bb_output .= $content;
- }
- }
-
- if ($this->_numbers) {
-
- $item_tag = $this->_tag_brackets['start'] .
- $this->_bb_tags['list_item'] .
- $this->_tag_brackets['end'];
- $this->_output = $item_tag . str_replace("\n", "\n". $item_tag .' ', $bb_output);
- $this->_output = $this->_tag_brackets['start'] .
- $this->_bb_tags['list'] .
- $this->_tag_brackets['end'] .
- $this->_output .
- $this->_tag_brackets['start'] .
- '/'.
- $this->_bb_tags['list'] .
- $this->_tag_brackets['end']
- ;
- } else {
- $this->_output = $this->_tag_brackets['start'] .
- $this->_bb_tags['code'] .
- $this->_tag_brackets['end'] .
- $bb_output .
- $this->_tag_brackets['start'] .
- '/' .
- $this->_bb_tags['code'] .
- $this->_tag_brackets['end'];
- }
- }
-
-}
-
-/*
- * Local variables:
- * tab-width: 4
- * c-basic-offset: 4
- * c-hanging-comment-ender-p: nil
- * End:
- */
-
-?>
diff --git a/library/Text_Highlighter/Text/Highlighter/Renderer/Console.php b/library/Text_Highlighter/Text/Highlighter/Renderer/Console.php
deleted file mode 100644
index d7b1fba88..000000000
--- a/library/Text_Highlighter/Text/Highlighter/Renderer/Console.php
+++ /dev/null
@@ -1,208 +0,0 @@
-<?php
-/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
-/**
- * Console renderer
- *
- * PHP versions 4 and 5
- *
- * LICENSE: This source file is subject to version 3.0 of the PHP license
- * that is available through the world-wide-web at the following URI:
- * http://www.php.net/license/3_0.txt. If you did not receive a copy of
- * the PHP License and are unable to obtain it through the web, please
- * send a note to license@php.net so we can mail you a copy immediately.
- *
- * @category Text
- * @package Text_Highlighter
- * @author Andrey Demenev <demenev@gmail.com>
- * @copyright 2004-2006 Andrey Demenev
- * @license http://www.php.net/license/3_0.txt PHP License
- * @version CVS: $Id$
- * @link http://pear.php.net/package/Text_Highlighter
- */
-
-/**
- * @ignore
- */
-
-require_once 'Text/Highlighter/Renderer.php';
-
-define ('HL_CONSOLE_DEFCOLOR', "\033[0m");
-
-/**
- * Console renderer
- *
- * Suitable for displaying text on color-capable terminals, directly
- * or trough less -r
- *
- * Elements of $options argument of constructor (each being optional):
- *
- * - 'numbers' - whether to add line numbers
- * - 'tabsize' - Tab size
- * - 'colors' - additional colors
- *
- * @author Andrey Demenev <demenev@gmail.com>
- * @category Text
- * @package Text_Highlighter
- * @copyright 2004-2006 Andrey Demenev
- * @license http://www.php.net/license/3_0.txt PHP License
- * @version Release: @package_version@
- * @link http://pear.php.net/package/Text_Highlighter
- */
-
-class Text_Highlighter_Renderer_Console extends Text_Highlighter_Renderer
-{
-
- /**#@+
- * @access private
- */
-
- /**
- * class of last outputted text chunk
- *
- * @var string
- */
- var $_lastClass;
-
- /**
- * Line numbering
- *
- * @var boolean
- */
- var $_numbers = false;
-
- /**
- * Tab size
- *
- * @var integer
- */
- var $_tabsize = 4;
-
- /**
- * Highlighted code
- *
- * @var string
- */
- var $_output = '';
-
- /**#@-*/
-
- var $_colors = array();
-
- var $_defColors = array(
- 'default' => "\033[0m",
- 'inlinetags' => "\033[31m",
- 'brackets' => "\033[36m",
- 'quotes' => "\033[34m",
- 'inlinedoc' => "\033[34m",
- 'var' => "\033[1m",
- 'types' => "\033[32m",
- 'number' => "\033[32m",
- 'string' => "\033[31m",
- 'reserved' => "\033[35m",
- 'comment' => "\033[33m",
- 'mlcomment' => "\033[33m",
- );
-
- function preprocess($str)
- {
- // normalize whitespace and tabs
- $str = str_replace("\r\n","\n", $str);
- $str = str_replace("\t",str_repeat(' ', $this->_tabsize), $str);
- return rtrim($str);
- }
-
-
- /**
- * Resets renderer state
- *
- * @access protected
- *
- *
- * Descendents of Text_Highlighter call this method from the constructor,
- * passing $options they get as parameter.
- */
- function reset()
- {
- $this->_lastClass = '';
- if (isset($this->_options['numbers'])) {
- $this->_numbers = (bool)$this->_options['numbers'];
- } else {
- $this->_numbers = false;
- }
- if (isset($this->_options['tabsize'])) {
- $this->_tabsize = $this->_options['tabsize'];
- } else {
- $this->_tabsize = 4;
- }
- if (isset($this->_options['colors'])) {
- $this->_colors = array_merge($this->_defColors, $this->_options['colors']);
- } else {
- $this->_colors = $this->_defColors;
- }
- $this->_output = '';
- }
-
-
-
- /**
- * Accepts next token
- *
- * @access public
- *
- * @param string $class Token class
- * @param string $content Token content
- */
- function acceptToken($class, $content)
- {
- if (isset($this->_colors[$class])) {
- $color = $this->_colors[$class];
- } else {
- $color = $this->_colors['default'];
- }
- if ($this->_lastClass != $class) {
- $this->_output .= $color;
- }
- $content = str_replace("\n", $this->_colors['default'] . "\n" . $color, $content);
- $content .= $this->_colors['default'];
- $this->_output .= $content;
- }
-
- /**
- * Signals that no more tokens are available
- *
- * @access public
- *
- */
- function finalize()
- {
- if ($this->_numbers) {
- $nlines = substr_count($this->_output, "\n") + 1;
- $len = strlen($nlines);
- $i = 1;
- $this->_output = preg_replace('~^~em', '" " . str_pad($i++, $len, " ", STR_PAD_LEFT) . ": "', $this->_output);
- }
- $this->_output .= HL_CONSOLE_DEFCOLOR . "\n";
- }
-
- /**
- * Get generated output
- *
- * @return string Highlighted code
- * @access public
- *
- */
- function getOutput()
- {
- return $this->_output;
- }
-}
-
-/*
- * Local variables:
- * tab-width: 4
- * c-basic-offset: 4
- * c-hanging-comment-ender-p: nil
- * End:
- */
-
-?>
diff --git a/library/Text_Highlighter/Text/Highlighter/Renderer/Html.php b/library/Text_Highlighter/Text/Highlighter/Renderer/Html.php
deleted file mode 100644
index 5d6e56ae1..000000000
--- a/library/Text_Highlighter/Text/Highlighter/Renderer/Html.php
+++ /dev/null
@@ -1,465 +0,0 @@
-<?php
-/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
-/**
- * HTML renderer
- *
- * PHP versions 4 and 5
- *
- * LICENSE: This source file is subject to version 3.0 of the PHP license
- * that is available through the world-wide-web at the following URI:
- * http://www.php.net/license/3_0.txt. If you did not receive a copy of
- * the PHP License and are unable to obtain it through the web, please
- * send a note to license@php.net so we can mail you a copy immediately.
- *
- * @category Text
- * @package Text_Highlighter
- * @author Andrey Demenev <demenev@gmail.com>
- * @copyright 2004-2006 Andrey Demenev
- * @license http://www.php.net/license/3_0.txt PHP License
- * @version CVS: $Id$
- * @link http://pear.php.net/package/Text_Highlighter
- */
-
-/**
- * @ignore
- */
-
-require_once 'Text/Highlighter/Renderer.php';
-require_once 'Text/Highlighter/Renderer/Array.php';
-
-// BC trick : only define constants if Text/Highlighter.php
-// is not yet included
-if (!defined('HL_NUMBERS_LI')) {
- /**#@+
- * Constant for use with $options['numbers']
- */
- /**
- * use numbered list, deprecated, use HL_NUMBERS_OL instaed
- * @deprecated
- */
- define ('HL_NUMBERS_LI' , 1);
- /**
- * Use 2-column table with line numbers in left column and code in right column.
- */
- define ('HL_NUMBERS_TABLE' , 2);
- /**#@-*/
-}
-
-
-/**#@+
- * Constant for use with $options['numbers']
- */
-/**
- * Use numbered list
- */
-define ('HL_NUMBERS_OL', 1);
-/**
- * Use non-numbered list
- */
-define ('HL_NUMBERS_UL', 3);
-/**#@-*/
-
-
-/**
- * HTML renderer
- *
- * Elements of $options argument of constructor (each being optional):
- *
- * - 'numbers' - Line numbering style 0 or {@link HL_NUMBERS_TABLE}
- * or {@link HL_NUMBERS_UL} or {@link HL_NUMBERS_OL}
- * - 'numbers_start' - starting number for numbered lines
- * - 'tabsize' - Tab size
- * - 'style_map' - Mapping of keywords to formatting rules using inline styles
- * - 'class_map' - Mapping of keywords to formatting rules using class names
- * - 'doclinks' - array that has keys "url", "target" and "elements", used for
- * generating links to online documentation
- * - 'use_language' - class names will be prefixed with language, like "php-reserved" or "css-code"
- *
- * Example of setting documentation links:
- * $options['doclinks'] = array(
- * 'url' => 'http://php.net/%s',
- * 'target' => '_blank',
- * 'elements' => array('reserved', 'identifier')
- * );
- *
- * Example of setting class names map:
- * $options['class_map'] = array(
- * 'main' => 'my-main',
- * 'table' => 'my-table',
- * 'gutter' => 'my-gutter',
- * 'brackets' => 'my-brackets',
- * 'builtin' => 'my-builtin',
- * 'code' => 'my-code',
- * 'comment' => 'my-comment',
- * 'default' => 'my-default',
- * 'identifier' => 'my-identifier',
- * 'inlinedoc' => 'my-inlinedoc',
- * 'inlinetags' => 'my-inlinetags',
- * 'mlcomment' => 'my-mlcomment',
- * 'number' => 'my-number',
- * 'quotes' => 'my-quotes',
- * 'reserved' => 'my-reserved',
- * 'special' => 'my-special',
- * 'string' => 'my-string',
- * 'url' => 'my-url',
- * 'var' => 'my-var',
- * );
- *
- * Example of setting styles mapping:
- * $options['style_map'] = array(
- * 'main' => 'color: black',
- * 'table' => 'border: 1px solid black',
- * 'gutter' => 'background-color: yellow',
- * 'brackets' => 'color: blue',
- * 'builtin' => 'color: red',
- * 'code' => 'color: green',
- * 'comment' => 'color: orange',
- * // ....
- * );
- *
- *
- * @author Andrey Demenev <demenev@gmail.com>
- * @category Text
- * @package Text_Highlighter
- * @copyright 2004-2006 Andrey Demenev
- * @license http://www.php.net/license/3_0.txt PHP License
- * @version Release: @package_version@
- * @link http://pear.php.net/package/Text_Highlighter
- */
-
-class Text_Highlighter_Renderer_Html extends Text_Highlighter_Renderer_Array
-{
-
- /**#@+
- * @access private
- */
-
- /**
- * Line numbering style
- *
- * @var integer
- */
- var $_numbers = 0;
-
- /**
- * For numberered lines - where to start
- *
- * @var integer
- */
- var $_numbers_start = 0;
-
- /**
- * Tab size
- *
- * @var integer
- */
- var $_tabsize = 4;
-
- /**
- * Highlighted code
- *
- * @var string
- */
- var $_output = '';
-
- /**
- * Mapping of keywords to formatting rules using inline styles
- *
- * @var array
- */
- var $_style_map = array();
-
- /**
- * Mapping of keywords to formatting rules using class names
- *
- * @var array
- */
- var $_class_map = array(
- 'main' => 'hl-main',
- 'table' => 'hl-table',
- 'gutter' => 'hl-gutter',
- 'brackets' => 'hl-brackets',
- 'builtin' => 'hl-builtin',
- 'code' => 'hl-code',
- 'comment' => 'hl-comment',
- 'default' => 'hl-default',
- 'identifier' => 'hl-identifier',
- 'inlinedoc' => 'hl-inlinedoc',
- 'inlinetags' => 'hl-inlinetags',
- 'mlcomment' => 'hl-mlcomment',
- 'number' => 'hl-number',
- 'prepro' => 'hl-prepro',
- 'quotes' => 'hl-quotes',
- 'reserved' => 'hl-reserved',
- 'special' => 'hl-special',
- 'string' => 'hl-string',
- 'types' => 'hl-types',
- 'url' => 'hl-url',
- 'var' => 'hl-var',
- );
-
- /**
- * Setup for links to online documentation
- *
- * This is an array with keys:
- * - url, ex. http://php.net/%s
- * - target, ex. _blank, default - no target
- * - elements, default is <code>array('reserved', 'identifier')</code>
- *
- * @var array
- */
- var $_doclinks = array();
-
- /**#@-*/
-
-
- /**
- * Resets renderer state
- *
- * @access protected
- *
- *
- * Descendents of Text_Highlighter call this method from the constructor,
- * passing $options they get as parameter.
- */
- function reset()
- {
- $this->_output = '';
- if (isset($this->_options['numbers'])) {
- $this->_numbers = (int)$this->_options['numbers'];
- if ($this->_numbers != HL_NUMBERS_LI
- && $this->_numbers != HL_NUMBERS_UL
- && $this->_numbers != HL_NUMBERS_OL
- && $this->_numbers != HL_NUMBERS_TABLE
- ) {
- $this->_numbers = 0;
- }
- }
- if (isset($this->_options['tabsize'])) {
- $this->_tabsize = $this->_options['tabsize'];
- }
- if (isset($this->_options['numbers_start'])) {
- $this->_numbers_start = intval($this->_options['numbers_start']);
- }
- if (isset($this->_options['doclinks']) &&
- is_array($this->_options['doclinks']) &&
- !empty($this->_options['doclinks']['url'])
- ) {
-
- $this->_doclinks = $this->_options['doclinks']; // keys: url, target, elements array
-
- if (empty($this->_options['doclinks']['elements'])) {
- $this->_doclinks['elements'] = array('reserved', 'identifier');
- }
- }
- if (isset($this->_options['style_map'])) {
- $this->_style_map = $this->_options['style_map'];
- }
- if (isset($this->_options['class_map'])) {
- $this->_class_map = array_merge($this->_class_map, $this->_options['class_map']);
- }
- $this->_htmlspecialchars = true;
-
- }
-
-
- /**
- * Given a CSS class name, returns the class name
- * with language name prepended, if necessary
- *
- * @access private
- *
- * @param string $class Token class
- */
- function _getFullClassName($class)
- {
- if (!empty($this->_options['use_language'])) {
- $the_class = $this->_language . '-' . $class;
- } else {
- $the_class = $class;
- }
- return $the_class;
- }
-
- /**
- * Signals that no more tokens are available
- *
- * @access public
- */
- function finalize()
- {
-
- // get parent's output
- parent::finalize();
- $output = parent::getOutput();
-
- $html_output = '';
-
- $numbers_li = false;
-
- if (
- $this->_numbers == HL_NUMBERS_LI ||
- $this->_numbers == HL_NUMBERS_UL ||
- $this->_numbers == HL_NUMBERS_OL
- )
- {
- $numbers_li = true;
- }
-
- // loop through each class=>content pair
- foreach ($output AS $token) {
-
- if ($this->_enumerated) {
- $key = false;
- $the_class = $token[0];
- $content = $token[1];
- } else {
- $key = key($token);
- $the_class = $key;
- $content = $token[$key];
- }
-
- $span = $this->_getStyling($the_class);
- $decorated_output = $this->_decorate($content, $key);
-
-
- if ($numbers_li == true) {
- // end span tags before end of li, and re-open on next line
- $lastSpanTag = str_replace("%s</span>", "", $span);
- $span = sprintf($span, $decorated_output);
- $span = str_replace("\n", "</span></li>\n<li>$lastSpanTag&nbsp;", $span);
- $html_output .= $span;
- } else {
- $html_output .= sprintf($span, $decorated_output);
- }
-
-
- }
-
- // format lists
- if (!empty($this->_numbers) && $numbers_li == true) {
-
-
- // additional whitespace for browsers that do not display
- // empty list items correctly
- $this->_output = '<li>&nbsp;' . $html_output . '</li>';
-
- $start = '';
- if ($this->_numbers == HL_NUMBERS_OL && intval($this->_numbers_start) > 0) {
- $start = ' start="' . $this->_numbers_start . '"';
- }
-
- $list_tag = 'ol';
- if ($this->_numbers == HL_NUMBERS_UL) {
- $list_tag = 'ul';
- }
-
-
- $this->_output = '<' . $list_tag . $start
- . ' ' . $this->_getStyling('main', false) . '>'
- . $this->_output . '</'. $list_tag .'>';
-
- // render a table
- } else if ($this->_numbers == HL_NUMBERS_TABLE) {
-
-
- $start_number = 0;
- if (intval($this->_numbers_start)) {
- $start_number = $this->_numbers_start - 1;
- }
-
- $numbers = '';
-
- $nlines = substr_count($html_output,"\n")+1;
- for ($i=1; $i <= $nlines; $i++) {
- $numbers .= ($start_number + $i) . "\n";
- }
- $this->_output = '<table ' . $this->_getStyling('table', false) . ' width="100%"><tr>' .
- '<td '. $this->_getStyling('gutter', false) .' align="right" valign="top">' .
- '<pre>' . $numbers . '</pre></td><td '. $this->_getStyling('main', false) .
- ' valign="top"><pre>' .
- $html_output . '</pre></td></tr></table>';
- }
- if (!$this->_numbers) {
- $this->_output = '<pre>' . $html_output . '</pre>';
- }
- $this->_output = '<div ' . $this->_getStyling('main', false) . '>' . $this->_output . '</div>';
- }
-
-
- /**
- * Provides additional formatting to a keyword
- *
- * @param string $content Keyword
- * @return string Keyword with additional formatting
- * @access public
- *
- */
- function _decorate($content, $key = false)
- {
- // links to online documentation
- if (!empty($this->_doclinks) &&
- !empty($this->_doclinks['url']) &&
- in_array($key, $this->_doclinks['elements'])
- ) {
-
- $link = '<a href="'. sprintf($this->_doclinks['url'], $content) . '"';
- if (!empty($this->_doclinks['target'])) {
- $link.= ' target="' . $this->_doclinks['target'] . '"';
- }
- $link .= '>';
- $link.= $content;
- $link.= '</a>';
-
- $content = $link;
-
- }
-
- return $content;
- }
-
- /**
- * Returns <code>class</code> and/or <code>style</code> attribute,
- * optionally enclosed in a <code>span</code> tag
- *
- * @param string $class Class name
- * @paran boolean $span_tag Whether or not to return styling attributes in a <code>&gt;span&lt;</code> tag
- * @return string <code>span</code> tag or just a <code>class</code> and/or <code>style</code> attributes
- * @access private
- */
- function _getStyling($class, $span_tag = true)
- {
- $attrib = '';
- if (!empty($this->_style_map) &&
- !empty($this->_style_map[$class])
- ) {
- $attrib = 'style="'. $this->_style_map[$class] .'"';
- }
- if (!empty($this->_class_map) &&
- !empty($this->_class_map[$class])
- ) {
- if ($attrib) {
- $attrib .= ' ';
- }
- $attrib .= 'class="'. $this->_getFullClassName($this->_class_map[$class]) .'"';
- }
-
- if ($span_tag) {
- $span = '<span ' . $attrib . '>%s</span>';
- return $span;
- } else {
- return $attrib;
- }
-
- }
-}
-
-/*
- * Local variables:
- * tab-width: 4
- * c-basic-offset: 4
- * c-hanging-comment-ender-p: nil
- * End:
- */
-
-?>
diff --git a/library/Text_Highlighter/Text/Highlighter/Renderer/HtmlTags.php b/library/Text_Highlighter/Text/Highlighter/Renderer/HtmlTags.php
deleted file mode 100644
index 68e01d3e0..000000000
--- a/library/Text_Highlighter/Text/Highlighter/Renderer/HtmlTags.php
+++ /dev/null
@@ -1,187 +0,0 @@
-<?php
-/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
-/**
- * HTML renderer that uses only basic html tags
- *
- * PHP versions 4 and 5. Based on the "normal" HTML renderer by Andrey Demenev.
- * It's designed to work with user agents that support only a limited number of
- * HTML tags. Like the iPod which supports only b, i, u and a.
- *
- * LICENSE: This source file is subject to version 3.0 of the PHP license
- * that is available through the world-wide-web at the following URI:
- * http://www.php.net/license/3_0.txt. If you did not receive a copy of
- * the PHP License and are unable to obtain it through the web, please
- * send a note to license@php.net so we can mail you a copy immediately.
- *
- * @category Text
- * @package Text_Highlighter
- * @author Stoyan Stefanov <ssttoo@gmail.com>
- * @copyright 2005 Stoyan Stefanov
- * @license http://www.php.net/license/3_0.txt PHP License
- * @version CVS: $Id$
- * @link http://pear.php.net/package/Text_Highlighter
- */
-
-/**
- * @ignore
- */
-
-require_once 'Text/Highlighter/Renderer.php';
-require_once 'Text/Highlighter/Renderer/Array.php';
-
-/**
- * HTML basic tags renderer, based on Andrey Demenev's HTML renderer.
- *
- * Elements of $options argument of constructor (each being optional):
- *
- * - 'numbers' - Line numbering TRUE or FALSE. Default is FALSE.
- * - 'tabsize' - Tab size, default is 4.
- * - 'tags' - Array, containing the tags to be used for highlighting
- *
- * Here's the listing of the default tags:
- * - 'default' => '',
- * - 'code' => '',
- * - 'brackets' => 'b',
- * - 'comment' => 'i',
- * - 'mlcomment' => 'i',
- * - 'quotes' => '',
- * - 'string' => 'i',
- * - 'identifier' => 'b',
- * - 'builtin' => 'b',
- * - 'reserved' => 'u',
- * - 'inlinedoc' => 'i',
- * - 'var' => 'b',
- * - 'url' => 'i',
- * - 'special' => '',
- * - 'number' => '',
- * - 'inlinetags' => ''
- *
- * @author Stoyan Stefanov <ssttoo@gmail.com>
- * @category Text
- * @package Text_Highlighter
- * @copyright 2005 Stoyan Stefanov
- * @license http://www.php.net/license/3_0.txt PHP License
- * @version Release: 0.5.0
- * @link http://pear.php.net/package/Text_Highlighter
- */
-
-class Text_Highlighter_Renderer_HtmlTags extends Text_Highlighter_Renderer_Array
-{
-
- /**#@+
- * @access private
- */
-
- /**
- * Line numbering - will use 'ol' tag
- *
- * @var boolean
- */
- var $_numbers = false;
-
- /**
- * HTML tags map
- *
- * @var array
- */
- var $_hilite_tags = array(
- 'default' => '',
- 'code' => '',
- 'brackets' => 'b',
- 'comment' => 'i',
- 'mlcomment' => 'i',
- 'quotes' => '',
- 'string' => 'i',
- 'identifier' => 'b',
- 'builtin' => 'b',
- 'reserved' => 'u',
- 'inlinedoc' => 'i',
- 'var' => 'b',
- 'url' => 'i',
- 'special' => '',
- 'number' => '',
- 'inlinetags' => '',
- );
-
- /**#@-*/
-
- /**
- * Resets renderer state
- *
- * @access protected
- *
- *
- * Descendents of Text_Highlighter call this method from the constructor,
- * passing $options they get as parameter.
- */
- function reset()
- {
- parent::reset();
- if (isset($this->_options['numbers'])) {
- $this->_numbers = $this->_options['numbers'];
- }
- if (isset($this->_options['tags'])) {
- $this->_hilite_tags = array_merge($this->_tags, $this->_options['tags']);
- }
- }
-
-
- /**
- * Signals that no more tokens are available
- *
- * @abstract
- * @access public
- *
- */
- function finalize()
- {
-
- // get parent's output
- parent::finalize();
- $output = parent::getOutput();
-
- $html_output = '';
-
- // loop through each class=>content pair
- foreach ($output AS $token) {
-
- if ($this->_enumerated) {
- $class = $token[0];
- $content = $token[1];
- } else {
- $key = key($token);
- $class = $key;
- $content = $token[$key];
- }
-
- $iswhitespace = ctype_space($content);
- if (!$iswhitespace && !empty($this->_hilite_tags[$class])) {
- $html_output .= '<'. $this->_hilite_tags[$class] . '>' . $content . '</'. $this->_hilite_tags[$class] . '>';
- } else {
- $html_output .= $content;
- }
- }
-
-
- if ($this->_numbers) {
- /* additional whitespace for browsers that do not display
- empty list items correctly */
- $html_output = '<li>&nbsp;' . str_replace("\n", "</li>\n<li>&nbsp;", $html_output) . '</li>';
- $this->_output = '<ol>' . str_replace(' ', '&nbsp;', $html_output) . '</ol>';
- } else {
- $this->_output = '<pre>' . $html_output . '</pre>';
- }
- }
-
-
-}
-
-/*
- * Local variables:
- * tab-width: 4
- * c-basic-offset: 4
- * c-hanging-comment-ender-p: nil
- * End:
- */
-
-?>
diff --git a/library/Text_Highlighter/Text/Highlighter/Renderer/JSON.php b/library/Text_Highlighter/Text/Highlighter/Renderer/JSON.php
deleted file mode 100644
index d4c926161..000000000
--- a/library/Text_Highlighter/Text/Highlighter/Renderer/JSON.php
+++ /dev/null
@@ -1,86 +0,0 @@
-<?php
-/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
-/**
- * JSON renderer.
- *
- * Based on the HTML renderer by Andrey Demenev.
- *
- * LICENSE: This source file is subject to version 3.0 of the PHP license
- * that is available through the world-wide-web at the following URI:
- * http://www.php.net/license/3_0.txt. If you did not receive a copy of
- * the PHP License and are unable to obtain it through the web, please
- * send a note to license@php.net so we can mail you a copy immediately.
- *
- * @category Text
- * @package Text_Highlighter
- * @author Stoyan Stefanov <ssttoo@gmail.com>
- * @copyright 2006 Stoyan Stefanov
- * @license http://www.php.net/license/3_0.txt PHP License
- * @version CVS: $Id$
- * @link http://pear.php.net/package/Text_Highlighter
- */
-
-/**
- * @ignore
- */
-
-require_once 'Text/Highlighter/Renderer.php';
-require_once 'Text/Highlighter/Renderer/Array.php';
-
-/**
- * JSON renderer, based on Andrey Demenev's HTML renderer.
- *
- * @author Stoyan Stefanov <ssttoo@gmail.com>
- * @category Text
- * @package Text_Highlighter
- * @copyright 2006 Stoyan Stefanov
- * @license http://www.php.net/license/3_0.txt PHP License
- * @version Release: 0.5.0
- * @link http://pear.php.net/package/Text_Highlighter
- */
-
-class Text_Highlighter_Renderer_JSON extends Text_Highlighter_Renderer_Array
-{
-
- /**
- * Signals that no more tokens are available
- *
- * @abstract
- * @access public
- */
- function finalize()
- {
-
- parent::finalize();
- $output = parent::getOutput();
-
- $json_array = array();
-
- foreach ($output AS $token) {
-
- if ($this->_enumerated) {
- $json_array[] = '["' . $token[0] . '","' . $token[1] . '"]';
- } else {
- $key = key($token);
- $json_array[] = '{"class": "' . $key . '","content":"' . $token[$key] . '"}';
- }
-
- }
-
- $this->_output = '['. implode(',', $json_array) .']';
- $this->_output = str_replace("\n", '\n', $this->_output);
-
- }
-
-
-}
-
-/*
- * Local variables:
- * tab-width: 4
- * c-basic-offset: 4
- * c-hanging-comment-ender-p: nil
- * End:
- */
-
-?> \ No newline at end of file
diff --git a/library/Text_Highlighter/Text/Highlighter/Renderer/XML.php b/library/Text_Highlighter/Text/Highlighter/Renderer/XML.php
deleted file mode 100644
index 7b6fb2106..000000000
--- a/library/Text_Highlighter/Text/Highlighter/Renderer/XML.php
+++ /dev/null
@@ -1,104 +0,0 @@
-<?php
-/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
-/**
- * XML renderer.
- *
- * Based on the HTML renderer by Andrey Demenev.
- *
- * LICENSE: This source file is subject to version 3.0 of the PHP license
- * that is available through the world-wide-web at the following URI:
- * http://www.php.net/license/3_0.txt. If you did not receive a copy of
- * the PHP License and are unable to obtain it through the web, please
- * send a note to license@php.net so we can mail you a copy immediately.
- *
- * @category Text
- * @package Text_Highlighter
- * @author Stoyan Stefanov <ssttoo@gmail.com>
- * @copyright 2006 Stoyan Stefanov
- * @license http://www.php.net/license/3_0.txt PHP License
- * @version CVS: $Id$
- * @link http://pear.php.net/package/Text_Highlighter
- */
-
-/**
- * @ignore
- */
-
-require_once 'Text/Highlighter/Renderer.php';
-require_once 'Text/Highlighter/Renderer/Array.php';
-require_once 'XML/Serializer.php';
-
-/**
- * XML renderer, based on Andrey Demenev's HTML renderer.
- *
- * @author Stoyan Stefanov <ssttoo@gmail.com>
- * @category Text
- * @package Text_Highlighter
- * @copyright 2006 Stoyan Stefanov
- * @license http://www.php.net/license/3_0.txt PHP License
- * @version Release: 0.5.0
- * @link http://pear.php.net/package/Text_Highlighter
- */
-
-class Text_Highlighter_Renderer_XML extends Text_Highlighter_Renderer_Array
-{
-
-
- /**
- * Options for XML_Serializer
- *
- * @access private
- * @var array
- */
- var $_serializer_options = array();
-
-
- /**
- * Resets renderer state
- *
- * Descendents of Text_Highlighter call this method from the constructor,
- * passing $options they get as parameter.
- *
- * @access protected
- */
- function reset()
- {
- parent::reset();
- if (isset($this->_options['xml_serializer'])) {
- $this->_serializer_options = $this->_options['xml_serializer'];
- }
- }
-
-
- /**
- * Signals that no more tokens are available
- *
- * @abstract
- * @access public
- */
- function finalize()
- {
-
- // call parent's finalize(), then serialize array into XML
- parent::finalize();
- $output = parent::getOutput();
-
- $serializer = new XML_Serializer($this->_serializer_options);
- $result = $serializer->serialize($output);
- if ($result === true) {
- $this->_output = $serializer->getSerializedData();
- }
- }
-
-
-}
-
-/*
- * Local variables:
- * tab-width: 4
- * c-basic-offset: 4
- * c-hanging-comment-ender-p: nil
- * End:
- */
-
-?>
diff --git a/library/Text_Highlighter/Text/Highlighter/SH.php b/library/Text_Highlighter/Text/Highlighter/SH.php
deleted file mode 100644
index ff779868f..000000000
--- a/library/Text_Highlighter/Text/Highlighter/SH.php
+++ /dev/null
@@ -1,1225 +0,0 @@
-<?php
-/**
- * Auto-generated class. SH syntax highlighting
- *
- * This highlighter is EXPERIMENTAL. It may work incorrectly.
- * It is a crude hack of the perl syntax, which itself wasn't so good.
- * But this seems to work OK.
- *
- *
- * PHP version 4 and 5
- *
- * LICENSE: This source file is subject to version 3.0 of the PHP license
- * that is available through the world-wide-web at the following URI:
- * http://www.php.net/license/3_0.txt. If you did not receive a copy of
- * the PHP License and are unable to obtain it through the web, please
- * send a note to license@php.net so we can mail you a copy immediately.
- *
- * @copyright 2004-2006 Andrey Demenev
- * @license http://www.php.net/license/3_0.txt PHP License
- * @link http://pear.php.net/package/Text_Highlighter
- * @category Text
- * @package Text_Highlighter
- * @version generated from: : sh.xml,v 1.2 2007/06/14 00:15:50 ssttoo Exp
- * @author Noah Spurrier <noah@noah.org>
- *
- */
-
-/**
- * @ignore
- */
-
-require_once 'Text/Highlighter.php';
-
-/**
- * Auto-generated class. SH syntax highlighting
- *
- * @author Noah Spurrier <noah@noah.org>
- * @category Text
- * @package Text_Highlighter
- * @copyright 2004-2006 Andrey Demenev
- * @license http://www.php.net/license/3_0.txt PHP License
- * @version Release: @package_version@
- * @link http://pear.php.net/package/Text_Highlighter
- */
-class Text_Highlighter_SH extends Text_Highlighter
-{
- var $_language = 'sh';
-
- /**
- * PHP4 Compatible Constructor
- *
- * @param array $options
- * @access public
- */
- function Text_Highlighter_SH($options=array())
- {
- $this->__construct($options);
- }
-
-
- /**
- * Constructor
- *
- * @param array $options
- * @access public
- */
- function __construct($options=array())
- {
-
- $this->_options = $options;
- $this->_regs = array (
- -1 => '/((?m)^(#!)(.*))|(\\{)|(\\()|(\\[)|((use)\\s+([\\w:]*))|((?Us)\\b(q[wq]\\s*((\\{)|(\\()|(\\[)|(\\<)|([\\W\\S])))(?=(.*)((?(3)\\})(?(4)\\))(?(5)\\])(?(6)\\>)(?(7)\\7))))|((?Us)\\b(q\\s*((\\{)|(\\()|(\\[)|(\\<)|([\\W\\S])))(?=(.*)((?(3)\\})(?(4)\\))(?(5)\\])(?(6)\\>)(?(7)\\7))))|(#.*)|((?x)(s|tr) ([|#~`!@$%^&*-+=\\\\;:\'",.\\/?]) ((\\\\.|[^\\\\])*?) (\\2)((\\\\.|[^\\\\])*?)(\\2[ecgimosx]*))|((?x)(m) ([|#~`!@$%^&*-+=\\\\;:\'",.\\/?]) ((\\\\.|[^\\\\])*?) (\\2[ecgimosx]*))|( \\/)|(\\$#?[1-9\'`@!])|((?i)(\\$#?|[@%*])([a-z1-9_]+::)*([a-z1-9_]+|\\^(?-i)[A-Z]?(?i)))|((?i)\\$([a-z1-9_]+|\\^(?-i)[A-Z]?(?i)))|((?i)(\\{)([a-z1-9]+)(\\}))|((?i)[\\$@%]#?\\{[a-z1-9]+\\})|(`)|(\')|(")|((?i)[a-z_]\\w*)|(\\d*\\.?\\d+)/',
- 0 => '/((?m)^(#!)(.*))|(\\{)|(\\()|(\\[)|((use)\\s+([\\w:]*))|((?Us)\\b(q[wq]\\s*((\\{)|(\\()|(\\[)|(\\<)|([\\W\\S])))(?=(.*)((?(3)\\})(?(4)\\))(?(5)\\])(?(6)\\>)(?(7)\\7))))|((?Us)\\b(q\\s*((\\{)|(\\()|(\\[)|(\\<)|([\\W\\S])))(?=(.*)((?(3)\\})(?(4)\\))(?(5)\\])(?(6)\\>)(?(7)\\7))))|(#.*)|((?x)(s|tr) ([|#~`!@$%^&*-+=\\\\;:\'",.\\/?]) ((\\\\.|[^\\\\])*?) (\\2)((\\\\.|[^\\\\])*?)(\\2[ecgimosx]*))|((?x)(m) ([|#~`!@$%^&*-+=\\\\;:\'",.\\/?]) ((\\\\.|[^\\\\])*?) (\\2[ecgimosx]*))|( \\/)|(\\$#?[1-9\'`@!])|((?i)(\\$#?|[@%*])([a-z1-9_]+::)*([a-z1-9_]+|\\^(?-i)[A-Z]?(?i)))|((?i)\\$([a-z1-9_]+|\\^(?-i)[A-Z]?(?i)))|((?i)(\\{)([a-z1-9]+)(\\}))|((?i)[\\$@%]#?\\{[a-z1-9]+\\})|(`)|(\')|(")|((?i)[a-z_]\\w*)|(\\d*\\.?\\d+)/',
- 1 => '/((?m)^(#!)(.*))|(\\{)|(\\()|(\\[)|((use)\\s+([\\w:]*))|((?Us)\\b(q[wq]\\s*((\\{)|(\\()|(\\[)|(\\<)|([\\W\\S])))(?=(.*)((?(3)\\})(?(4)\\))(?(5)\\])(?(6)\\>)(?(7)\\7))))|((?Us)\\b(q\\s*((\\{)|(\\()|(\\[)|(\\<)|([\\W\\S])))(?=(.*)((?(3)\\})(?(4)\\))(?(5)\\])(?(6)\\>)(?(7)\\7))))|(#.*)|((?x)(s|tr) ([|#~`!@$%^&*-+=\\\\;:\'",.\\/?]) ((\\\\.|[^\\\\])*?) (\\2)((\\\\.|[^\\\\])*?)(\\2[ecgimosx]*))|((?x)(m) ([|#~`!@$%^&*-+=\\\\;:\'",.\\/?]) ((\\\\.|[^\\\\])*?) (\\2[ecgimosx]*))|( \\/)|((?i)([a-z1-9_]+)(\\s*=>))|(\\$#?[1-9\'`@!])|((?i)(\\$#?|[@%*])([a-z1-9_]+::)*([a-z1-9_]+|\\^(?-i)[A-Z]?(?i)))|((?i)\\$([a-z1-9_]+|\\^(?-i)[A-Z]?(?i)))|((?i)(\\{)([a-z1-9]+)(\\}))|((?i)[\\$@%]#?\\{[a-z1-9]+\\})|(`)|(\')|(")|((?i)[a-z_]\\w*)|(\\d*\\.?\\d+)/',
- 2 => '/((?m)^(#!)(.*))|(\\{)|(\\()|(\\[)|((use)\\s+([\\w:]*))|((?Us)\\b(q[wq]\\s*((\\{)|(\\()|(\\[)|(\\<)|([\\W\\S])))(?=(.*)((?(3)\\})(?(4)\\))(?(5)\\])(?(6)\\>)(?(7)\\7))))|((?Us)\\b(q\\s*((\\{)|(\\()|(\\[)|(\\<)|([\\W\\S])))(?=(.*)((?(3)\\})(?(4)\\))(?(5)\\])(?(6)\\>)(?(7)\\7))))|(#.*)|((?x)(s|tr) ([|#~`!@$%^&*-+=\\\\;:\'",.\\/?]) ((\\\\.|[^\\\\])*?) (\\2)((\\\\.|[^\\\\])*?)(\\2[ecgimosx]*))|((?x)(m) ([|#~`!@$%^&*-+=\\\\;:\'",.\\/?]) ((\\\\.|[^\\\\])*?) (\\2[ecgimosx]*))|( \\/)|(\\$#?[1-9\'`@!])|((?i)(\\$#?|[@%*])([a-z1-9_]+::)*([a-z1-9_]+|\\^(?-i)[A-Z]?(?i)))|((?i)\\$([a-z1-9_]+|\\^(?-i)[A-Z]?(?i)))|((?i)(\\{)([a-z1-9]+)(\\}))|((?i)[\\$@%]#?\\{[a-z1-9]+\\})|(`)|(\')|(")|((?i)[a-z_]\\w*)|(\\d*\\.?\\d+)/',
- 3 => '/(\\$#?[1-9\'`@!])|((?i)\\$([a-z1-9_]+|\\^(?-i)[A-Z]?(?i)))|((?i)[\\$@%]#?\\{[a-z1-9]+\\})|(\\\\[\\\\"\'`tnr\\$\\{@])/',
- 4 => '/(\\\\\\\\|\\\\"|\\\\\'|\\\\`)/',
- 5 => '/(\\\\\\/)/',
- 6 => '/(\\$#?[1-9\'`@!])|((?i)\\$([a-z1-9_]+|\\^(?-i)[A-Z]?(?i)))|((?i)[\\$@%]#?\\{[a-z1-9]+\\})|(\\\\\\\\|\\\\"|\\\\\'|\\\\`)/',
- 7 => '/(\\\\\\\\|\\\\"|\\\\\'|\\\\`)/',
- 8 => '/(\\$#?[1-9\'`@!])|((?i)\\$([a-z1-9_]+|\\^(?-i)[A-Z]?(?i)))|((?i)[\\$@%]#?\\{[a-z1-9]+\\})|(\\\\[\\\\"\'`tnr\\$\\{@])/',
- );
- $this->_counts = array (
- -1 =>
- array (
- 0 => 2,
- 1 => 0,
- 2 => 0,
- 3 => 0,
- 4 => 2,
- 5 => 9,
- 6 => 9,
- 7 => 0,
- 8 => 8,
- 9 => 5,
- 10 => 0,
- 11 => 0,
- 12 => 3,
- 13 => 1,
- 14 => 3,
- 15 => 0,
- 16 => 0,
- 17 => 0,
- 18 => 0,
- 19 => 0,
- 20 => 0,
- ),
- 0 =>
- array (
- 0 => 2,
- 1 => 0,
- 2 => 0,
- 3 => 0,
- 4 => 2,
- 5 => 9,
- 6 => 9,
- 7 => 0,
- 8 => 8,
- 9 => 5,
- 10 => 0,
- 11 => 0,
- 12 => 3,
- 13 => 1,
- 14 => 3,
- 15 => 0,
- 16 => 0,
- 17 => 0,
- 18 => 0,
- 19 => 0,
- 20 => 0,
- ),
- 1 =>
- array (
- 0 => 2,
- 1 => 0,
- 2 => 0,
- 3 => 0,
- 4 => 2,
- 5 => 9,
- 6 => 9,
- 7 => 0,
- 8 => 8,
- 9 => 5,
- 10 => 0,
- 11 => 2,
- 12 => 0,
- 13 => 3,
- 14 => 1,
- 15 => 3,
- 16 => 0,
- 17 => 0,
- 18 => 0,
- 19 => 0,
- 20 => 0,
- 21 => 0,
- ),
- 2 =>
- array (
- 0 => 2,
- 1 => 0,
- 2 => 0,
- 3 => 0,
- 4 => 2,
- 5 => 9,
- 6 => 9,
- 7 => 0,
- 8 => 8,
- 9 => 5,
- 10 => 0,
- 11 => 0,
- 12 => 3,
- 13 => 1,
- 14 => 3,
- 15 => 0,
- 16 => 0,
- 17 => 0,
- 18 => 0,
- 19 => 0,
- 20 => 0,
- ),
- 3 =>
- array (
- 0 => 0,
- 1 => 1,
- 2 => 0,
- 3 => 0,
- ),
- 4 =>
- array (
- 0 => 0,
- ),
- 5 =>
- array (
- 0 => 0,
- ),
- 6 =>
- array (
- 0 => 0,
- 1 => 1,
- 2 => 0,
- 3 => 0,
- ),
- 7 =>
- array (
- 0 => 0,
- ),
- 8 =>
- array (
- 0 => 0,
- 1 => 1,
- 2 => 0,
- 3 => 0,
- ),
- );
- $this->_delim = array (
- -1 =>
- array (
- 0 => '',
- 1 => 'brackets',
- 2 => 'brackets',
- 3 => 'brackets',
- 4 => '',
- 5 => 'quotes',
- 6 => 'quotes',
- 7 => '',
- 8 => '',
- 9 => '',
- 10 => 'quotes',
- 11 => '',
- 12 => '',
- 13 => '',
- 14 => '',
- 15 => '',
- 16 => 'quotes',
- 17 => 'quotes',
- 18 => 'quotes',
- 19 => '',
- 20 => '',
- ),
- 0 =>
- array (
- 0 => '',
- 1 => 'brackets',
- 2 => 'brackets',
- 3 => 'brackets',
- 4 => '',
- 5 => 'quotes',
- 6 => 'quotes',
- 7 => '',
- 8 => '',
- 9 => '',
- 10 => 'quotes',
- 11 => '',
- 12 => '',
- 13 => '',
- 14 => '',
- 15 => '',
- 16 => 'quotes',
- 17 => 'quotes',
- 18 => 'quotes',
- 19 => '',
- 20 => '',
- ),
- 1 =>
- array (
- 0 => '',
- 1 => 'brackets',
- 2 => 'brackets',
- 3 => 'brackets',
- 4 => '',
- 5 => 'quotes',
- 6 => 'quotes',
- 7 => '',
- 8 => '',
- 9 => '',
- 10 => 'quotes',
- 11 => '',
- 12 => '',
- 13 => '',
- 14 => '',
- 15 => '',
- 16 => '',
- 17 => 'quotes',
- 18 => 'quotes',
- 19 => 'quotes',
- 20 => '',
- 21 => '',
- ),
- 2 =>
- array (
- 0 => '',
- 1 => 'brackets',
- 2 => 'brackets',
- 3 => 'brackets',
- 4 => '',
- 5 => 'quotes',
- 6 => 'quotes',
- 7 => '',
- 8 => '',
- 9 => '',
- 10 => 'quotes',
- 11 => '',
- 12 => '',
- 13 => '',
- 14 => '',
- 15 => '',
- 16 => 'quotes',
- 17 => 'quotes',
- 18 => 'quotes',
- 19 => '',
- 20 => '',
- ),
- 3 =>
- array (
- 0 => '',
- 1 => '',
- 2 => '',
- 3 => '',
- ),
- 4 =>
- array (
- 0 => '',
- ),
- 5 =>
- array (
- 0 => '',
- ),
- 6 =>
- array (
- 0 => '',
- 1 => '',
- 2 => '',
- 3 => '',
- ),
- 7 =>
- array (
- 0 => '',
- ),
- 8 =>
- array (
- 0 => '',
- 1 => '',
- 2 => '',
- 3 => '',
- ),
- );
- $this->_inner = array (
- -1 =>
- array (
- 0 => 'special',
- 1 => 'code',
- 2 => 'code',
- 3 => 'code',
- 4 => 'special',
- 5 => 'string',
- 6 => 'string',
- 7 => 'comment',
- 8 => 'string',
- 9 => 'string',
- 10 => 'string',
- 11 => 'var',
- 12 => 'var',
- 13 => 'var',
- 14 => 'var',
- 15 => 'var',
- 16 => 'string',
- 17 => 'string',
- 18 => 'string',
- 19 => 'identifier',
- 20 => 'number',
- ),
- 0 =>
- array (
- 0 => 'special',
- 1 => 'code',
- 2 => 'code',
- 3 => 'code',
- 4 => 'special',
- 5 => 'string',
- 6 => 'string',
- 7 => 'comment',
- 8 => 'string',
- 9 => 'string',
- 10 => 'string',
- 11 => 'var',
- 12 => 'var',
- 13 => 'var',
- 14 => 'var',
- 15 => 'var',
- 16 => 'string',
- 17 => 'string',
- 18 => 'string',
- 19 => 'identifier',
- 20 => 'number',
- ),
- 1 =>
- array (
- 0 => 'special',
- 1 => 'code',
- 2 => 'code',
- 3 => 'code',
- 4 => 'special',
- 5 => 'string',
- 6 => 'string',
- 7 => 'comment',
- 8 => 'string',
- 9 => 'string',
- 10 => 'string',
- 11 => 'string',
- 12 => 'var',
- 13 => 'var',
- 14 => 'var',
- 15 => 'var',
- 16 => 'var',
- 17 => 'string',
- 18 => 'string',
- 19 => 'string',
- 20 => 'identifier',
- 21 => 'number',
- ),
- 2 =>
- array (
- 0 => 'special',
- 1 => 'code',
- 2 => 'code',
- 3 => 'code',
- 4 => 'special',
- 5 => 'string',
- 6 => 'string',
- 7 => 'comment',
- 8 => 'string',
- 9 => 'string',
- 10 => 'string',
- 11 => 'var',
- 12 => 'var',
- 13 => 'var',
- 14 => 'var',
- 15 => 'var',
- 16 => 'string',
- 17 => 'string',
- 18 => 'string',
- 19 => 'identifier',
- 20 => 'number',
- ),
- 3 =>
- array (
- 0 => 'var',
- 1 => 'var',
- 2 => 'var',
- 3 => 'special',
- ),
- 4 =>
- array (
- 0 => 'special',
- ),
- 5 =>
- array (
- 0 => 'string',
- ),
- 6 =>
- array (
- 0 => 'var',
- 1 => 'var',
- 2 => 'var',
- 3 => 'special',
- ),
- 7 =>
- array (
- 0 => 'special',
- ),
- 8 =>
- array (
- 0 => 'var',
- 1 => 'var',
- 2 => 'var',
- 3 => 'special',
- ),
- );
- $this->_end = array (
- 0 => '/\\}/',
- 1 => '/\\)/',
- 2 => '/\\]/',
- 3 => '/%b2%/',
- 4 => '/%b2%/',
- 5 => '/\\/[cgimosx]*/',
- 6 => '/`/',
- 7 => '/\'/',
- 8 => '/"/',
- );
- $this->_states = array (
- -1 =>
- array (
- 0 => -1,
- 1 => 0,
- 2 => 1,
- 3 => 2,
- 4 => -1,
- 5 => 3,
- 6 => 4,
- 7 => -1,
- 8 => -1,
- 9 => -1,
- 10 => 5,
- 11 => -1,
- 12 => -1,
- 13 => -1,
- 14 => -1,
- 15 => -1,
- 16 => 6,
- 17 => 7,
- 18 => 8,
- 19 => -1,
- 20 => -1,
- ),
- 0 =>
- array (
- 0 => -1,
- 1 => 0,
- 2 => 1,
- 3 => 2,
- 4 => -1,
- 5 => 3,
- 6 => 4,
- 7 => -1,
- 8 => -1,
- 9 => -1,
- 10 => 5,
- 11 => -1,
- 12 => -1,
- 13 => -1,
- 14 => -1,
- 15 => -1,
- 16 => 6,
- 17 => 7,
- 18 => 8,
- 19 => -1,
- 20 => -1,
- ),
- 1 =>
- array (
- 0 => -1,
- 1 => 0,
- 2 => 1,
- 3 => 2,
- 4 => -1,
- 5 => 3,
- 6 => 4,
- 7 => -1,
- 8 => -1,
- 9 => -1,
- 10 => 5,
- 11 => -1,
- 12 => -1,
- 13 => -1,
- 14 => -1,
- 15 => -1,
- 16 => -1,
- 17 => 6,
- 18 => 7,
- 19 => 8,
- 20 => -1,
- 21 => -1,
- ),
- 2 =>
- array (
- 0 => -1,
- 1 => 0,
- 2 => 1,
- 3 => 2,
- 4 => -1,
- 5 => 3,
- 6 => 4,
- 7 => -1,
- 8 => -1,
- 9 => -1,
- 10 => 5,
- 11 => -1,
- 12 => -1,
- 13 => -1,
- 14 => -1,
- 15 => -1,
- 16 => 6,
- 17 => 7,
- 18 => 8,
- 19 => -1,
- 20 => -1,
- ),
- 3 =>
- array (
- 0 => -1,
- 1 => -1,
- 2 => -1,
- 3 => -1,
- ),
- 4 =>
- array (
- 0 => -1,
- ),
- 5 =>
- array (
- 0 => -1,
- ),
- 6 =>
- array (
- 0 => -1,
- 1 => -1,
- 2 => -1,
- 3 => -1,
- ),
- 7 =>
- array (
- 0 => -1,
- ),
- 8 =>
- array (
- 0 => -1,
- 1 => -1,
- 2 => -1,
- 3 => -1,
- ),
- );
- $this->_keywords = array (
- -1 =>
- array (
- 0 =>
- array (
- ),
- 1 => -1,
- 2 => -1,
- 3 => -1,
- 4 =>
- array (
- ),
- 5 => -1,
- 6 => -1,
- 7 =>
- array (
- ),
- 8 =>
- array (
- ),
- 9 =>
- array (
- ),
- 10 => -1,
- 11 =>
- array (
- ),
- 12 =>
- array (
- ),
- 13 =>
- array (
- ),
- 14 =>
- array (
- ),
- 15 =>
- array (
- ),
- 16 => -1,
- 17 => -1,
- 18 => -1,
- 19 =>
- array (
- 'reserved' => '/^(cd|cp|rm|echo|printf|exit|cut|join|comm|fmt|grep|egrep|fgrep|sed|awk|yes|false|true|test|expr|tee|basename|dirname|pathchk|pwd|stty|tty|env|printenv|id|logname|whoami|groups|users|who|date|uname|hostname|chroot|nice|nohup|sleep|factor|seq|getopt|getopts|options|shift)$/',
- 'flowcontrol' => '/^(if|fi|then|else|elif|case|esac|while|done|for|in|function|until|do|select|time|read|set)$/',
- ),
- 20 =>
- array (
- ),
- ),
- 0 =>
- array (
- 0 =>
- array (
- ),
- 1 => -1,
- 2 => -1,
- 3 => -1,
- 4 =>
- array (
- ),
- 5 => -1,
- 6 => -1,
- 7 =>
- array (
- ),
- 8 =>
- array (
- ),
- 9 =>
- array (
- ),
- 10 => -1,
- 11 =>
- array (
- ),
- 12 =>
- array (
- ),
- 13 =>
- array (
- ),
- 14 =>
- array (
- ),
- 15 =>
- array (
- ),
- 16 => -1,
- 17 => -1,
- 18 => -1,
- 19 =>
- array (
- 'reserved' => '/^(cd|cp|rm|echo|printf|exit|cut|join|comm|fmt|grep|egrep|fgrep|sed|awk|yes|false|true|test|expr|tee|basename|dirname|pathchk|pwd|stty|tty|env|printenv|id|logname|whoami|groups|users|who|date|uname|hostname|chroot|nice|nohup|sleep|factor|seq|getopt|getopts|options|shift)$/',
- 'flowcontrol' => '/^(if|fi|then|else|elif|case|esac|while|done|for|in|function|until|do|select|time|read|set)$/',
- ),
- 20 =>
- array (
- ),
- ),
- 1 =>
- array (
- 0 =>
- array (
- ),
- 1 => -1,
- 2 => -1,
- 3 => -1,
- 4 =>
- array (
- ),
- 5 => -1,
- 6 => -1,
- 7 =>
- array (
- ),
- 8 =>
- array (
- ),
- 9 =>
- array (
- ),
- 10 => -1,
- 11 =>
- array (
- ),
- 12 =>
- array (
- ),
- 13 =>
- array (
- ),
- 14 =>
- array (
- ),
- 15 =>
- array (
- ),
- 16 =>
- array (
- ),
- 17 => -1,
- 18 => -1,
- 19 => -1,
- 20 =>
- array (
- 'reserved' => '/^(cd|cp|rm|echo|printf|exit|cut|join|comm|fmt|grep|egrep|fgrep|sed|awk|yes|false|true|test|expr|tee|basename|dirname|pathchk|pwd|stty|tty|env|printenv|id|logname|whoami|groups|users|who|date|uname|hostname|chroot|nice|nohup|sleep|factor|seq|getopt|getopts|options|shift)$/',
- 'flowcontrol' => '/^(if|fi|then|else|elif|case|esac|while|done|for|in|function|until|do|select|time|read|set)$/',
- ),
- 21 =>
- array (
- ),
- ),
- 2 =>
- array (
- 0 =>
- array (
- ),
- 1 => -1,
- 2 => -1,
- 3 => -1,
- 4 =>
- array (
- ),
- 5 => -1,
- 6 => -1,
- 7 =>
- array (
- ),
- 8 =>
- array (
- ),
- 9 =>
- array (
- ),
- 10 => -1,
- 11 =>
- array (
- ),
- 12 =>
- array (
- ),
- 13 =>
- array (
- ),
- 14 =>
- array (
- ),
- 15 =>
- array (
- ),
- 16 => -1,
- 17 => -1,
- 18 => -1,
- 19 =>
- array (
- 'reserved' => '/^(cd|cp|rm|echo|printf|exit|cut|join|comm|fmt|grep|egrep|fgrep|sed|awk|yes|false|true|test|expr|tee|basename|dirname|pathchk|pwd|stty|tty|env|printenv|id|logname|whoami|groups|users|who|date|uname|hostname|chroot|nice|nohup|sleep|factor|seq|getopt|getopts|options|shift)$/',
- 'flowcontrol' => '/^(if|fi|then|else|elif|case|esac|while|done|for|in|function|until|do|select|time|read|set)$/',
- ),
- 20 =>
- array (
- ),
- ),
- 3 =>
- array (
- 0 =>
- array (
- ),
- 1 =>
- array (
- ),
- 2 =>
- array (
- ),
- 3 =>
- array (
- ),
- ),
- 4 =>
- array (
- 0 =>
- array (
- ),
- ),
- 5 =>
- array (
- 0 =>
- array (
- ),
- ),
- 6 =>
- array (
- 0 =>
- array (
- ),
- 1 =>
- array (
- ),
- 2 =>
- array (
- ),
- 3 =>
- array (
- ),
- ),
- 7 =>
- array (
- 0 =>
- array (
- ),
- ),
- 8 =>
- array (
- 0 =>
- array (
- ),
- 1 =>
- array (
- ),
- 2 =>
- array (
- ),
- 3 =>
- array (
- ),
- ),
- );
- $this->_parts = array (
- 0 =>
- array (
- 0 =>
- array (
- 1 => 'special',
- 2 => 'string',
- ),
- 1 => NULL,
- 2 => NULL,
- 3 => NULL,
- 4 =>
- array (
- 1 => 'reserved',
- 2 => 'special',
- ),
- 5 => NULL,
- 6 => NULL,
- 7 => NULL,
- 8 =>
- array (
- 1 => 'quotes',
- 2 => 'quotes',
- 3 => 'string',
- 5 => 'quotes',
- 6 => 'string',
- 8 => 'quotes',
- ),
- 9 =>
- array (
- 1 => 'quotes',
- 2 => 'quotes',
- 3 => 'string',
- 5 => 'quotes',
- ),
- 10 => NULL,
- 11 => NULL,
- 12 => NULL,
- 13 => NULL,
- 14 =>
- array (
- 1 => 'brackets',
- 2 => 'var',
- 3 => 'brackets',
- ),
- 15 => NULL,
- 16 => NULL,
- 17 => NULL,
- 18 => NULL,
- 19 => NULL,
- 20 => NULL,
- ),
- 1 =>
- array (
- 0 =>
- array (
- 1 => 'special',
- 2 => 'string',
- ),
- 1 => NULL,
- 2 => NULL,
- 3 => NULL,
- 4 =>
- array (
- 1 => 'reserved',
- 2 => 'special',
- ),
- 5 => NULL,
- 6 => NULL,
- 7 => NULL,
- 8 =>
- array (
- 1 => 'quotes',
- 2 => 'quotes',
- 3 => 'string',
- 5 => 'quotes',
- 6 => 'string',
- 8 => 'quotes',
- ),
- 9 =>
- array (
- 1 => 'quotes',
- 2 => 'quotes',
- 3 => 'string',
- 5 => 'quotes',
- ),
- 10 => NULL,
- 11 =>
- array (
- 1 => 'string',
- 2 => 'code',
- ),
- 12 => NULL,
- 13 => NULL,
- 14 => NULL,
- 15 =>
- array (
- 1 => 'brackets',
- 2 => 'var',
- 3 => 'brackets',
- ),
- 16 => NULL,
- 17 => NULL,
- 18 => NULL,
- 19 => NULL,
- 20 => NULL,
- 21 => NULL,
- ),
- 2 =>
- array (
- 0 =>
- array (
- 1 => 'special',
- 2 => 'string',
- ),
- 1 => NULL,
- 2 => NULL,
- 3 => NULL,
- 4 =>
- array (
- 1 => 'reserved',
- 2 => 'special',
- ),
- 5 => NULL,
- 6 => NULL,
- 7 => NULL,
- 8 =>
- array (
- 1 => 'quotes',
- 2 => 'quotes',
- 3 => 'string',
- 5 => 'quotes',
- 6 => 'string',
- 8 => 'quotes',
- ),
- 9 =>
- array (
- 1 => 'quotes',
- 2 => 'quotes',
- 3 => 'string',
- 5 => 'quotes',
- ),
- 10 => NULL,
- 11 => NULL,
- 12 => NULL,
- 13 => NULL,
- 14 =>
- array (
- 1 => 'brackets',
- 2 => 'var',
- 3 => 'brackets',
- ),
- 15 => NULL,
- 16 => NULL,
- 17 => NULL,
- 18 => NULL,
- 19 => NULL,
- 20 => NULL,
- ),
- 3 =>
- array (
- 0 => NULL,
- 1 => NULL,
- 2 => NULL,
- 3 => NULL,
- ),
- 4 =>
- array (
- 0 => NULL,
- ),
- 5 =>
- array (
- 0 => NULL,
- ),
- 6 =>
- array (
- 0 => NULL,
- 1 => NULL,
- 2 => NULL,
- 3 => NULL,
- ),
- 7 =>
- array (
- 0 => NULL,
- ),
- 8 =>
- array (
- 0 => NULL,
- 1 => NULL,
- 2 => NULL,
- 3 => NULL,
- ),
- );
- $this->_subst = array (
- -1 =>
- array (
- 0 => false,
- 1 => false,
- 2 => false,
- 3 => false,
- 4 => false,
- 5 => true,
- 6 => true,
- 7 => false,
- 8 => false,
- 9 => false,
- 10 => false,
- 11 => false,
- 12 => false,
- 13 => false,
- 14 => false,
- 15 => false,
- 16 => false,
- 17 => false,
- 18 => false,
- 19 => false,
- 20 => false,
- ),
- 0 =>
- array (
- 0 => false,
- 1 => false,
- 2 => false,
- 3 => false,
- 4 => false,
- 5 => true,
- 6 => true,
- 7 => false,
- 8 => false,
- 9 => false,
- 10 => false,
- 11 => false,
- 12 => false,
- 13 => false,
- 14 => false,
- 15 => false,
- 16 => false,
- 17 => false,
- 18 => false,
- 19 => false,
- 20 => false,
- ),
- 1 =>
- array (
- 0 => false,
- 1 => false,
- 2 => false,
- 3 => false,
- 4 => false,
- 5 => true,
- 6 => true,
- 7 => false,
- 8 => false,
- 9 => false,
- 10 => false,
- 11 => false,
- 12 => false,
- 13 => false,
- 14 => false,
- 15 => false,
- 16 => false,
- 17 => false,
- 18 => false,
- 19 => false,
- 20 => false,
- 21 => false,
- ),
- 2 =>
- array (
- 0 => false,
- 1 => false,
- 2 => false,
- 3 => false,
- 4 => false,
- 5 => true,
- 6 => true,
- 7 => false,
- 8 => false,
- 9 => false,
- 10 => false,
- 11 => false,
- 12 => false,
- 13 => false,
- 14 => false,
- 15 => false,
- 16 => false,
- 17 => false,
- 18 => false,
- 19 => false,
- 20 => false,
- ),
- 3 =>
- array (
- 0 => false,
- 1 => false,
- 2 => false,
- 3 => false,
- ),
- 4 =>
- array (
- 0 => false,
- ),
- 5 =>
- array (
- 0 => false,
- ),
- 6 =>
- array (
- 0 => false,
- 1 => false,
- 2 => false,
- 3 => false,
- ),
- 7 =>
- array (
- 0 => false,
- ),
- 8 =>
- array (
- 0 => false,
- 1 => false,
- 2 => false,
- 3 => false,
- ),
- );
- $this->_conditions = array (
- );
- $this->_kwmap = array (
- 'reserved' => 'reserved',
- 'flowcontrol' => 'reserved',
- );
- $this->_defClass = 'code';
- $this->_checkDefines();
- }
-
-} \ No newline at end of file
diff --git a/library/Text_Highlighter/Text/Highlighter/SQL.php b/library/Text_Highlighter/Text/Highlighter/SQL.php
deleted file mode 100644
index 824864033..000000000
--- a/library/Text_Highlighter/Text/Highlighter/SQL.php
+++ /dev/null
@@ -1,419 +0,0 @@
-<?php
-/**
- * Auto-generated class. SQL syntax highlighting
- *
- * Based on SQL-99
- *
- * PHP version 4 and 5
- *
- * LICENSE: This source file is subject to version 3.0 of the PHP license
- * that is available through the world-wide-web at the following URI:
- * http://www.php.net/license/3_0.txt. If you did not receive a copy of
- * the PHP License and are unable to obtain it through the web, please
- * send a note to license@php.net so we can mail you a copy immediately.
- *
- * @copyright 2004-2006 Andrey Demenev
- * @license http://www.php.net/license/3_0.txt PHP License
- * @link http://pear.php.net/package/Text_Highlighter
- * @category Text
- * @package Text_Highlighter
- * @version generated from: : sql.xml,v 1.1 2007/06/03 02:35:28 ssttoo Exp
- * @author Andrey Demenev <demenev@gmail.com>
- *
- */
-
-/**
- * @ignore
- */
-
-require_once 'Text/Highlighter.php';
-
-/**
- * Auto-generated class. SQL syntax highlighting
- *
- * @author Andrey Demenev <demenev@gmail.com>
- * @category Text
- * @package Text_Highlighter
- * @copyright 2004-2006 Andrey Demenev
- * @license http://www.php.net/license/3_0.txt PHP License
- * @version Release: @package_version@
- * @link http://pear.php.net/package/Text_Highlighter
- */
-class Text_Highlighter_SQL extends Text_Highlighter
-{
- var $_language = 'sql';
-
- /**
- * PHP4 Compatible Constructor
- *
- * @param array $options
- * @access public
- */
- function Text_Highlighter_SQL($options=array())
- {
- $this->__construct($options);
- }
-
-
- /**
- * Constructor
- *
- * @param array $options
- * @access public
- */
- function __construct($options=array())
- {
-
- $this->_options = $options;
- $this->_regs = array (
- -1 => '/((?i)`)|((?i)\\/\\*)|((?i)(#|--\\s).*)|((?i)[a-z_]\\w*)|((?i)")|((?i)\\()|((?i)\')|((?i)((\\d+|((\\d*\\.\\d+)|(\\d+\\.\\d*)))[eE][+-]?\\d+))|((?i)(\\d*\\.\\d+)|(\\d+\\.\\d*))|((?i)\\d+l?|\\b0l?\\b)|((?i)0[xX][\\da-f]+l?)/',
- 0 => '//',
- 1 => '//',
- 2 => '/((?i)\\\\.)/',
- 3 => '/((?i)`)|((?i)\\/\\*)|((?i)(#|--\\s).*)|((?i)[a-z_]\\w*)|((?i)")|((?i)\\()|((?i)\')|((?i)((\\d+|((\\d*\\.\\d+)|(\\d+\\.\\d*)))[eE][+-]?\\d+))|((?i)(\\d*\\.\\d+)|(\\d+\\.\\d*))|((?i)\\d+l?|\\b0l?\\b)|((?i)0[xX][\\da-f]+l?)/',
- 4 => '/((?i)\\\\.)/',
- );
- $this->_counts = array (
- -1 =>
- array (
- 0 => 0,
- 1 => 0,
- 2 => 1,
- 3 => 0,
- 4 => 0,
- 5 => 0,
- 6 => 0,
- 7 => 5,
- 8 => 2,
- 9 => 0,
- 10 => 0,
- ),
- 0 =>
- array (
- ),
- 1 =>
- array (
- ),
- 2 =>
- array (
- 0 => 0,
- ),
- 3 =>
- array (
- 0 => 0,
- 1 => 0,
- 2 => 1,
- 3 => 0,
- 4 => 0,
- 5 => 0,
- 6 => 0,
- 7 => 5,
- 8 => 2,
- 9 => 0,
- 10 => 0,
- ),
- 4 =>
- array (
- 0 => 0,
- ),
- );
- $this->_delim = array (
- -1 =>
- array (
- 0 => 'quotes',
- 1 => 'comment',
- 2 => '',
- 3 => '',
- 4 => 'quotes',
- 5 => 'brackets',
- 6 => 'quotes',
- 7 => '',
- 8 => '',
- 9 => '',
- 10 => '',
- ),
- 0 =>
- array (
- ),
- 1 =>
- array (
- ),
- 2 =>
- array (
- 0 => '',
- ),
- 3 =>
- array (
- 0 => 'quotes',
- 1 => 'comment',
- 2 => '',
- 3 => '',
- 4 => 'quotes',
- 5 => 'brackets',
- 6 => 'quotes',
- 7 => '',
- 8 => '',
- 9 => '',
- 10 => '',
- ),
- 4 =>
- array (
- 0 => '',
- ),
- );
- $this->_inner = array (
- -1 =>
- array (
- 0 => 'identifier',
- 1 => 'comment',
- 2 => 'comment',
- 3 => 'identifier',
- 4 => 'string',
- 5 => 'code',
- 6 => 'string',
- 7 => 'number',
- 8 => 'number',
- 9 => 'number',
- 10 => 'number',
- ),
- 0 =>
- array (
- ),
- 1 =>
- array (
- ),
- 2 =>
- array (
- 0 => 'special',
- ),
- 3 =>
- array (
- 0 => 'identifier',
- 1 => 'comment',
- 2 => 'comment',
- 3 => 'identifier',
- 4 => 'string',
- 5 => 'code',
- 6 => 'string',
- 7 => 'number',
- 8 => 'number',
- 9 => 'number',
- 10 => 'number',
- ),
- 4 =>
- array (
- 0 => 'special',
- ),
- );
- $this->_end = array (
- 0 => '/(?i)`/',
- 1 => '/(?i)\\*\\//',
- 2 => '/(?i)"/',
- 3 => '/(?i)\\)/',
- 4 => '/(?i)\'/',
- );
- $this->_states = array (
- -1 =>
- array (
- 0 => 0,
- 1 => 1,
- 2 => -1,
- 3 => -1,
- 4 => 2,
- 5 => 3,
- 6 => 4,
- 7 => -1,
- 8 => -1,
- 9 => -1,
- 10 => -1,
- ),
- 0 =>
- array (
- ),
- 1 =>
- array (
- ),
- 2 =>
- array (
- 0 => -1,
- ),
- 3 =>
- array (
- 0 => 0,
- 1 => 1,
- 2 => -1,
- 3 => -1,
- 4 => 2,
- 5 => 3,
- 6 => 4,
- 7 => -1,
- 8 => -1,
- 9 => -1,
- 10 => -1,
- ),
- 4 =>
- array (
- 0 => -1,
- ),
- );
- $this->_keywords = array (
- -1 =>
- array (
- 0 => -1,
- 1 => -1,
- 2 =>
- array (
- ),
- 3 =>
- array (
- 'reserved' => '/^((?i)absolute|action|add|admin|after|aggregate|alias|all|allocate|alter|and|any|are|array|as|asc|assertion|at|authorization|before|begin|binary|bit|blob|boolean|both|breadth|by|call|cascade|cascaded|case|cast|catalog|char|character|check|class|clob|close|collate|collation|column|commit|completion|connect|connection|constraint|constraints|constructor|continue|corresponding|create|cross|cube|current|current_date|current_path|current_role|current_time|current_timestamp|current_user|cursor|cycle|data|date|day|deallocate|dec|decimal|declare|default|deferrable|deferred|delete|depth|deref|desc|describe|descriptor|destroy|destructor|deterministic|diagnostics|dictionary|disconnect|distinct|domain|double|drop|dynamic|each|else|end|end-exec|equals|escape|every|except|exception|exec|execute|external|false|fetch|first|float|for|foreign|found|free|from|full|function|general|get|global|go|goto|grant|group|grouping|having|host|hour|identity|ignore|immediate|in|indicator|initialize|initially|inner|inout|input|insert|int|integer|intersect|interval|into|is|isolation|iterate|join|key|language|large|last|lateral|leading|left|less|level|like|limit|local|localtime|localtimestamp|locator|map|match|minute|modifies|modify|module|month|names|national|natural|nchar|nclob|new|next|no|none|not|null|numeric|object|of|off|old|on|only|open|operation|option|or|order|ordinality|out|outer|output|pad|parameter|parameters|partial|path|postfix|precision|prefix|preorder|prepare|preserve|primary|prior|privileges|procedure|public|read|reads|real|recursive|ref|references|referencing|relative|restrict|result|return|returns|revoke|right|role|rollback|rollup|routine|row|rows|savepoint|schema|scope|scroll|search|second|section|select|sequence|session|session_user|set|sets|size|smallint|some|space|specific|specifictype|sql|sqlexception|sqlstate|sqlwarning|start|state|statement|static|structure|system_user|table|temporary|terminate|than|then|time|timestamp|timezone_hour|timezone_minute|to|trailing|transaction|translation|treat|trigger|true|under|union|unique|unknown|unnest|update|usage|user|using|value|values|varchar|variable|varying|view|when|whenever|where|with|without|work|write|year|zone)$/',
- 'keyword' => '/^((?i)abs|ada|asensitive|assignment|asymmetric|atomic|avg|between|bitvar|bit_length|c|called|cardinality|catalog_name|chain|character_length|character_set_catalog|character_set_name|character_set_schema|char_length|checked|class_origin|coalesce|cobol|collation_catalog|collation_name|collation_schema|column_name|command_function|command_function_code|committed|condition_number|connection_name|constraint_catalog|constraint_name|constraint_schema|contains|convert|count|cursor_name|datetime_interval_code|datetime_interval_precision|defined|definer|dispatch|dynamic_function|dynamic_function_code|existing|exists|extract|final|fortran|g|generated|granted|hierarchy|hold|implementation|infix|insensitive|instance|instantiable|invoker|k|key_member|key_type|length|lower|m|max|message_length|message_octet_length|message_text|method|min|mod|more|mumps|name|nullable|nullif|number|octet_length|options|overlaps|overlay|overriding|parameter_mode|parameter_name|parameter_ordinal_position|parameter_specific_catalog|parameter_specific_name|parameter_specific_schema|pascal|pli|position|repeatable|returned_length|returned_octet_length|returned_sqlstate|routine_catalog|routine_name|routine_schema|row_count|scale|schema_name|security|self|sensitive|serializable|server_name|similar|simple|source|specific_name|style|subclass_origin|sublist|substring|sum|symmetric|system|table_name|transactions_committed|transactions_rolled_back|transaction_active|transform|transforms|translate|trigger_catalog|trigger_name|trigger_schema|trim|type|uncommitted|unnamed|upper|user_defined_type_catalog|user_defined_type_name|user_defined_type_schema)$/',
- ),
- 4 => -1,
- 5 => -1,
- 6 => -1,
- 7 =>
- array (
- ),
- 8 =>
- array (
- ),
- 9 =>
- array (
- ),
- 10 =>
- array (
- ),
- ),
- 0 =>
- array (
- ),
- 1 =>
- array (
- ),
- 2 =>
- array (
- 0 =>
- array (
- ),
- ),
- 3 =>
- array (
- 0 => -1,
- 1 => -1,
- 2 =>
- array (
- ),
- 3 =>
- array (
- 'reserved' => '/^((?i)absolute|action|add|admin|after|aggregate|alias|all|allocate|alter|and|any|are|array|as|asc|assertion|at|authorization|before|begin|binary|bit|blob|boolean|both|breadth|by|call|cascade|cascaded|case|cast|catalog|char|character|check|class|clob|close|collate|collation|column|commit|completion|connect|connection|constraint|constraints|constructor|continue|corresponding|create|cross|cube|current|current_date|current_path|current_role|current_time|current_timestamp|current_user|cursor|cycle|data|date|day|deallocate|dec|decimal|declare|default|deferrable|deferred|delete|depth|deref|desc|describe|descriptor|destroy|destructor|deterministic|diagnostics|dictionary|disconnect|distinct|domain|double|drop|dynamic|each|else|end|end-exec|equals|escape|every|except|exception|exec|execute|external|false|fetch|first|float|for|foreign|found|free|from|full|function|general|get|global|go|goto|grant|group|grouping|having|host|hour|identity|ignore|immediate|in|indicator|initialize|initially|inner|inout|input|insert|int|integer|intersect|interval|into|is|isolation|iterate|join|key|language|large|last|lateral|leading|left|less|level|like|limit|local|localtime|localtimestamp|locator|map|match|minute|modifies|modify|module|month|names|national|natural|nchar|nclob|new|next|no|none|not|null|numeric|object|of|off|old|on|only|open|operation|option|or|order|ordinality|out|outer|output|pad|parameter|parameters|partial|path|postfix|precision|prefix|preorder|prepare|preserve|primary|prior|privileges|procedure|public|read|reads|real|recursive|ref|references|referencing|relative|restrict|result|return|returns|revoke|right|role|rollback|rollup|routine|row|rows|savepoint|schema|scope|scroll|search|second|section|select|sequence|session|session_user|set|sets|size|smallint|some|space|specific|specifictype|sql|sqlexception|sqlstate|sqlwarning|start|state|statement|static|structure|system_user|table|temporary|terminate|than|then|time|timestamp|timezone_hour|timezone_minute|to|trailing|transaction|translation|treat|trigger|true|under|union|unique|unknown|unnest|update|usage|user|using|value|values|varchar|variable|varying|view|when|whenever|where|with|without|work|write|year|zone)$/',
- 'keyword' => '/^((?i)abs|ada|asensitive|assignment|asymmetric|atomic|avg|between|bitvar|bit_length|c|called|cardinality|catalog_name|chain|character_length|character_set_catalog|character_set_name|character_set_schema|char_length|checked|class_origin|coalesce|cobol|collation_catalog|collation_name|collation_schema|column_name|command_function|command_function_code|committed|condition_number|connection_name|constraint_catalog|constraint_name|constraint_schema|contains|convert|count|cursor_name|datetime_interval_code|datetime_interval_precision|defined|definer|dispatch|dynamic_function|dynamic_function_code|existing|exists|extract|final|fortran|g|generated|granted|hierarchy|hold|implementation|infix|insensitive|instance|instantiable|invoker|k|key_member|key_type|length|lower|m|max|message_length|message_octet_length|message_text|method|min|mod|more|mumps|name|nullable|nullif|number|octet_length|options|overlaps|overlay|overriding|parameter_mode|parameter_name|parameter_ordinal_position|parameter_specific_catalog|parameter_specific_name|parameter_specific_schema|pascal|pli|position|repeatable|returned_length|returned_octet_length|returned_sqlstate|routine_catalog|routine_name|routine_schema|row_count|scale|schema_name|security|self|sensitive|serializable|server_name|similar|simple|source|specific_name|style|subclass_origin|sublist|substring|sum|symmetric|system|table_name|transactions_committed|transactions_rolled_back|transaction_active|transform|transforms|translate|trigger_catalog|trigger_name|trigger_schema|trim|type|uncommitted|unnamed|upper|user_defined_type_catalog|user_defined_type_name|user_defined_type_schema)$/',
- ),
- 4 => -1,
- 5 => -1,
- 6 => -1,
- 7 =>
- array (
- ),
- 8 =>
- array (
- ),
- 9 =>
- array (
- ),
- 10 =>
- array (
- ),
- ),
- 4 =>
- array (
- 0 =>
- array (
- ),
- ),
- );
- $this->_parts = array (
- 0 =>
- array (
- ),
- 1 =>
- array (
- ),
- 2 =>
- array (
- 0 => NULL,
- ),
- 3 =>
- array (
- 0 => NULL,
- 1 => NULL,
- 2 => NULL,
- 3 => NULL,
- 4 => NULL,
- 5 => NULL,
- 6 => NULL,
- 7 => NULL,
- 8 => NULL,
- 9 => NULL,
- 10 => NULL,
- ),
- 4 =>
- array (
- 0 => NULL,
- ),
- );
- $this->_subst = array (
- -1 =>
- array (
- 0 => false,
- 1 => false,
- 2 => false,
- 3 => false,
- 4 => false,
- 5 => false,
- 6 => false,
- 7 => false,
- 8 => false,
- 9 => false,
- 10 => false,
- ),
- 0 =>
- array (
- ),
- 1 =>
- array (
- ),
- 2 =>
- array (
- 0 => false,
- ),
- 3 =>
- array (
- 0 => false,
- 1 => false,
- 2 => false,
- 3 => false,
- 4 => false,
- 5 => false,
- 6 => false,
- 7 => false,
- 8 => false,
- 9 => false,
- 10 => false,
- ),
- 4 =>
- array (
- 0 => false,
- ),
- );
- $this->_conditions = array (
- );
- $this->_kwmap = array (
- 'reserved' => 'reserved',
- 'keyword' => 'var',
- );
- $this->_defClass = 'code';
- $this->_checkDefines();
- }
-
-} \ No newline at end of file
diff --git a/library/Text_Highlighter/Text/Highlighter/VBSCRIPT.php b/library/Text_Highlighter/Text/Highlighter/VBSCRIPT.php
deleted file mode 100644
index 31a7c7c9e..000000000
--- a/library/Text_Highlighter/Text/Highlighter/VBSCRIPT.php
+++ /dev/null
@@ -1,318 +0,0 @@
-<?php
-/**
- * Auto-generated class. VBSCRIPT syntax highlighting
- *
- * PHP version 4 and 5
- *
- * LICENSE: This source file is subject to version 3.0 of the PHP license
- * that is available through the world-wide-web at the following URI:
- * http://www.php.net/license/3_0.txt. If you did not receive a copy of
- * the PHP License and are unable to obtain it through the web, please
- * send a note to license@php.net so we can mail you a copy immediately.
- *
- * @copyright 2004-2006 Andrey Demenev
- * @license http://www.php.net/license/3_0.txt PHP License
- * @link http://pear.php.net/package/Text_Highlighter
- * @category Text
- * @package Text_Highlighter
- * @version generated from: vbscript.xml
- * @author Daniel Fruzynski <daniel-AT-poradnik-webmastera.com>
- *
- */
-
-/**
- * @ignore
- */
-
-require_once 'Text/Highlighter.php';
-
-/**
- * Auto-generated class. VBSCRIPT syntax highlighting
- *
- * @author Daniel Fruzynski <daniel-AT-poradnik-webmastera.com>
- * @category Text
- * @package Text_Highlighter
- * @copyright 2004-2006 Andrey Demenev
- * @license http://www.php.net/license/3_0.txt PHP License
- * @version Release: 0.7.0
- * @link http://pear.php.net/package/Text_Highlighter
- */
-class Text_Highlighter_VBSCRIPT extends Text_Highlighter
-{
- var $_language = 'vbscript';
-
- /**
- * PHP4 Compatible Constructor
- *
- * @param array $options
- * @access public
- */
- function Text_Highlighter_VBSCRIPT($options=array())
- {
- $this->__construct($options);
- }
-
-
- /**
- * Constructor
- *
- * @param array $options
- * @access public
- */
- function __construct($options=array())
- {
-
- $this->_options = $options;
- $this->_regs = array (
- -1 => '/((?i)\\()|((?i)")|((?i)\'|[Rr][Ee][Mm]\\b)|((?i)\\d*\\.?\\d+)|((?i)&H[0-9a-fA-F]+)|((?i)[a-z_]\\w*)/',
- 0 => '/((?i)\\()|((?i)")|((?i)\'|[Rr][Ee][Mm]\\b)|((?i)\\d*\\.?\\d+)|((?i)&H[0-9a-fA-F]+)|((?i)[a-z_]\\w*)/',
- 1 => '//',
- 2 => '/((?i)((https?|ftp):\\/\\/[\\w\\?\\.\\-\\&=\\/%+]+)|(^|[\\s,!?])www\\.\\w+\\.\\w+[\\w\\?\\.\\&=\\/%+]*)|((?i)\\w+[\\.\\w\\-]+@(\\w+[\\.\\w\\-])+)|((?i)\\b(note|fixme):)|((?i)\\$\\w+:.+\\$)/',
- );
- $this->_counts = array (
- -1 =>
- array (
- 0 => 0,
- 1 => 0,
- 2 => 0,
- 3 => 0,
- 4 => 0,
- 5 => 0,
- ),
- 0 =>
- array (
- 0 => 0,
- 1 => 0,
- 2 => 0,
- 3 => 0,
- 4 => 0,
- 5 => 0,
- ),
- 1 =>
- array (
- ),
- 2 =>
- array (
- 0 => 3,
- 1 => 1,
- 2 => 1,
- 3 => 0,
- ),
- );
- $this->_delim = array (
- -1 =>
- array (
- 0 => 'brackets',
- 1 => 'quotes',
- 2 => 'comment',
- 3 => '',
- 4 => '',
- 5 => '',
- ),
- 0 =>
- array (
- 0 => 'brackets',
- 1 => 'quotes',
- 2 => 'comment',
- 3 => '',
- 4 => '',
- 5 => '',
- ),
- 1 =>
- array (
- ),
- 2 =>
- array (
- 0 => '',
- 1 => '',
- 2 => '',
- 3 => '',
- ),
- );
- $this->_inner = array (
- -1 =>
- array (
- 0 => 'code',
- 1 => 'string',
- 2 => 'comment',
- 3 => 'number',
- 4 => 'number',
- 5 => 'identifier',
- ),
- 0 =>
- array (
- 0 => 'code',
- 1 => 'string',
- 2 => 'comment',
- 3 => 'number',
- 4 => 'number',
- 5 => 'identifier',
- ),
- 1 =>
- array (
- ),
- 2 =>
- array (
- 0 => 'url',
- 1 => 'url',
- 2 => 'inlinedoc',
- 3 => 'inlinedoc',
- ),
- );
- $this->_end = array (
- 0 => '/(?i)\\)/',
- 1 => '/(?i)"/',
- 2 => '/(?mi)$/',
- );
- $this->_states = array (
- -1 =>
- array (
- 0 => 0,
- 1 => 1,
- 2 => 2,
- 3 => -1,
- 4 => -1,
- 5 => -1,
- ),
- 0 =>
- array (
- 0 => 0,
- 1 => 1,
- 2 => 2,
- 3 => -1,
- 4 => -1,
- 5 => -1,
- ),
- 1 =>
- array (
- ),
- 2 =>
- array (
- 0 => -1,
- 1 => -1,
- 2 => -1,
- 3 => -1,
- ),
- );
- $this->_keywords = array (
- -1 =>
- array (
- 0 => -1,
- 1 => -1,
- 2 => -1,
- 3 =>
- array (
- ),
- 4 =>
- array (
- ),
- 5 =>
- array (
- 'constants' => '/^((?i)vbblack|vbred|vbgreen|vbyellow|vbblue|vbmagenta|vbcyan|vbwhite|vbbinarycompare|vbtextcompare|vbsunday|vbmonday|vbtuesday|vbwednesday|vbthursday|vbfriday|vbsaturday|vbusesystemdayofweek|vbfirstjan1|vbfirstfourdays|vbfirstfullweek|vbgeneraldate|vblongdate|vbshortdate|vblongtime|vbshorttime|vbobjecterror|vbokonly|vbokcancel|vbabortretryignore|vbyesnocancel|vbyesno|vbretrycancel|vbcritical|vbquestion|vbexclamation|vbinformation|vbdefaultbutton1|vbdefaultbutton2|vbdefaultbutton3|vbdefaultbutton4|vbapplicationmodal|vbsystemmodal|vbok|vbcancel|vbabort|vbretry|vbignore|vbyes|vbno|vbcr|vbcrlf|vbformfeed|vblf|vbnewline|vbnullchar|vbnullstring|vbtab|vbverticaltab|vbusedefault|vbtrue|vbfalse|vbempty|vbnull|vbinteger|vblong|vbsingle|vbdouble|vbcurrency|vbdate|vbstring|vbobject|vberror|vbboolean|vbvariant|vbdataobject|vbdecimal|vbbyte|vbarray)$/',
- 'functions' => '/^((?i)abs|array|asc|atn|cbool|cbyte|ccur|cdate|cdbl|chr|cint|clng|cos|createobject|csng|cstr|date|dateadd|datediff|datepart|dateserial|datevalue|day|escape|eval|exp|filter|formatcurrency|formatdatetime|formatnumber|formatpercent|getlocale|getobject|getref|hex|hour|inputbox|instr|instrrev|int|fix|isarray|isdate|isempty|isnull|isnumeric|isobject|join|lbound|lcase|left|len|loadpicture|log|ltrim|rtrim|trim|mid|minute|month|monthname|msgbox|now|oct|replace|rgb|right|rnd|round|scriptengine|scriptenginebuildversion|scriptenginemajorversion|scriptengineminorversion|second|setlocale|sgn|sin|space|split|sqr|strcomp|string|strreverse|tan|time|timer|timeserial|timevalue|typename|ubound|ucase|unescape|vartype|weekday|weekdayname|year)$/',
- 'builtin' => '/^((?i)debug|err|match|regexp)$/',
- 'reserved' => '/^((?i)empty|false|nothing|null|true|and|eqv|imp|is|mod|not|or|xor|call|class|end|const|public|private|dim|do|while|until|exit|loop|erase|execute|executeglobal|for|each|in|to|step|next|function|default|if|then|else|elseif|on|error|resume|goto|option|explicit|property|get|let|set|randomize|redim|preserve|select|case|stop|sub|wend|with)$/',
- ),
- ),
- 0 =>
- array (
- 0 => -1,
- 1 => -1,
- 2 => -1,
- 3 =>
- array (
- ),
- 4 =>
- array (
- ),
- 5 =>
- array (
- 'constants' => '/^((?i)vbblack|vbred|vbgreen|vbyellow|vbblue|vbmagenta|vbcyan|vbwhite|vbbinarycompare|vbtextcompare|vbsunday|vbmonday|vbtuesday|vbwednesday|vbthursday|vbfriday|vbsaturday|vbusesystemdayofweek|vbfirstjan1|vbfirstfourdays|vbfirstfullweek|vbgeneraldate|vblongdate|vbshortdate|vblongtime|vbshorttime|vbobjecterror|vbokonly|vbokcancel|vbabortretryignore|vbyesnocancel|vbyesno|vbretrycancel|vbcritical|vbquestion|vbexclamation|vbinformation|vbdefaultbutton1|vbdefaultbutton2|vbdefaultbutton3|vbdefaultbutton4|vbapplicationmodal|vbsystemmodal|vbok|vbcancel|vbabort|vbretry|vbignore|vbyes|vbno|vbcr|vbcrlf|vbformfeed|vblf|vbnewline|vbnullchar|vbnullstring|vbtab|vbverticaltab|vbusedefault|vbtrue|vbfalse|vbempty|vbnull|vbinteger|vblong|vbsingle|vbdouble|vbcurrency|vbdate|vbstring|vbobject|vberror|vbboolean|vbvariant|vbdataobject|vbdecimal|vbbyte|vbarray)$/',
- 'functions' => '/^((?i)abs|array|asc|atn|cbool|cbyte|ccur|cdate|cdbl|chr|cint|clng|cos|createobject|csng|cstr|date|dateadd|datediff|datepart|dateserial|datevalue|day|escape|eval|exp|filter|formatcurrency|formatdatetime|formatnumber|formatpercent|getlocale|getobject|getref|hex|hour|inputbox|instr|instrrev|int|fix|isarray|isdate|isempty|isnull|isnumeric|isobject|join|lbound|lcase|left|len|loadpicture|log|ltrim|rtrim|trim|mid|minute|month|monthname|msgbox|now|oct|replace|rgb|right|rnd|round|scriptengine|scriptenginebuildversion|scriptenginemajorversion|scriptengineminorversion|second|setlocale|sgn|sin|space|split|sqr|strcomp|string|strreverse|tan|time|timer|timeserial|timevalue|typename|ubound|ucase|unescape|vartype|weekday|weekdayname|year)$/',
- 'builtin' => '/^((?i)debug|err|match|regexp)$/',
- 'reserved' => '/^((?i)empty|false|nothing|null|true|and|eqv|imp|is|mod|not|or|xor|call|class|end|const|public|private|dim|do|while|until|exit|loop|erase|execute|executeglobal|for|each|in|to|step|next|function|default|if|then|else|elseif|on|error|resume|goto|option|explicit|property|get|let|set|randomize|redim|preserve|select|case|stop|sub|wend|with)$/',
- ),
- ),
- 1 =>
- array (
- ),
- 2 =>
- array (
- 0 =>
- array (
- ),
- 1 =>
- array (
- ),
- 2 =>
- array (
- ),
- 3 =>
- array (
- ),
- ),
- );
- $this->_parts = array (
- 0 =>
- array (
- 0 => NULL,
- 1 => NULL,
- 2 => NULL,
- 3 => NULL,
- 4 => NULL,
- 5 => NULL,
- ),
- 1 =>
- array (
- ),
- 2 =>
- array (
- 0 => NULL,
- 1 => NULL,
- 2 => NULL,
- 3 => NULL,
- ),
- );
- $this->_subst = array (
- -1 =>
- array (
- 0 => false,
- 1 => false,
- 2 => false,
- 3 => false,
- 4 => false,
- 5 => false,
- ),
- 0 =>
- array (
- 0 => false,
- 1 => false,
- 2 => false,
- 3 => false,
- 4 => false,
- 5 => false,
- ),
- 1 =>
- array (
- ),
- 2 =>
- array (
- 0 => false,
- 1 => false,
- 2 => false,
- 3 => false,
- ),
- );
- $this->_conditions = array (
- );
- $this->_kwmap = array (
- 'constants' => 'builtin',
- 'functions' => 'builtin',
- 'builtin' => 'builtin',
- 'reserved' => 'reserved',
- );
- $this->_defClass = 'code';
- $this->_checkDefines();
- }
-
-}
diff --git a/library/Text_Highlighter/Text/Highlighter/XML.php b/library/Text_Highlighter/Text/Highlighter/XML.php
deleted file mode 100644
index 2d85db5fd..000000000
--- a/library/Text_Highlighter/Text/Highlighter/XML.php
+++ /dev/null
@@ -1,263 +0,0 @@
-<?php
-/**
- * Auto-generated class. XML syntax highlighting
- *
- * PHP version 4 and 5
- *
- * LICENSE: This source file is subject to version 3.0 of the PHP license
- * that is available through the world-wide-web at the following URI:
- * http://www.php.net/license/3_0.txt. If you did not receive a copy of
- * the PHP License and are unable to obtain it through the web, please
- * send a note to license@php.net so we can mail you a copy immediately.
- *
- * @copyright 2004-2006 Andrey Demenev
- * @license http://www.php.net/license/3_0.txt PHP License
- * @link http://pear.php.net/package/Text_Highlighter
- * @category Text
- * @package Text_Highlighter
- * @version generated from: : xml.xml,v 1.1 2007/06/03 02:35:28 ssttoo Exp
- * @author Andrey Demenev <demenev@gmail.com>
- *
- */
-
-/**
- * @ignore
- */
-
-require_once 'Text/Highlighter.php';
-
-/**
- * Auto-generated class. XML syntax highlighting
- *
- * @author Andrey Demenev <demenev@gmail.com>
- * @category Text
- * @package Text_Highlighter
- * @copyright 2004-2006 Andrey Demenev
- * @license http://www.php.net/license/3_0.txt PHP License
- * @version Release: @package_version@
- * @link http://pear.php.net/package/Text_Highlighter
- */
-class Text_Highlighter_XML extends Text_Highlighter
-{
- var $_language = 'xml';
-
- /**
- * PHP4 Compatible Constructor
- *
- * @param array $options
- * @access public
- */
- function Text_Highlighter_XML($options=array())
- {
- $this->__construct($options);
- }
-
-
- /**
- * Constructor
- *
- * @param array $options
- * @access public
- */
- function __construct($options=array())
- {
-
- $this->_options = $options;
- $this->_regs = array (
- -1 => '/((?i)\\<\\!\\[CDATA\\[)|((?i)\\<!--)|((?i)\\<[\\?\\/]?)|((?i)(&|%)[\\w\\-\\.]+;)/',
- 0 => '//',
- 1 => '//',
- 2 => '/((?i)(?<=[\\<\\/?])[\\w\\-\\:]+)|((?i)[\\w\\-\\:]+)|((?i)")/',
- 3 => '/((?i)(&|%)[\\w\\-\\.]+;)/',
- );
- $this->_counts = array (
- -1 =>
- array (
- 0 => 0,
- 1 => 0,
- 2 => 0,
- 3 => 1,
- ),
- 0 =>
- array (
- ),
- 1 =>
- array (
- ),
- 2 =>
- array (
- 0 => 0,
- 1 => 0,
- 2 => 0,
- ),
- 3 =>
- array (
- 0 => 1,
- ),
- );
- $this->_delim = array (
- -1 =>
- array (
- 0 => 'comment',
- 1 => 'comment',
- 2 => 'brackets',
- 3 => '',
- ),
- 0 =>
- array (
- ),
- 1 =>
- array (
- ),
- 2 =>
- array (
- 0 => '',
- 1 => '',
- 2 => 'quotes',
- ),
- 3 =>
- array (
- 0 => '',
- ),
- );
- $this->_inner = array (
- -1 =>
- array (
- 0 => 'comment',
- 1 => 'comment',
- 2 => 'code',
- 3 => 'special',
- ),
- 0 =>
- array (
- ),
- 1 =>
- array (
- ),
- 2 =>
- array (
- 0 => 'reserved',
- 1 => 'var',
- 2 => 'string',
- ),
- 3 =>
- array (
- 0 => 'special',
- ),
- );
- $this->_end = array (
- 0 => '/(?i)\\]\\]\\>/',
- 1 => '/(?i)--\\>/',
- 2 => '/(?i)[\\/\\?]?\\>/',
- 3 => '/(?i)"/',
- );
- $this->_states = array (
- -1 =>
- array (
- 0 => 0,
- 1 => 1,
- 2 => 2,
- 3 => -1,
- ),
- 0 =>
- array (
- ),
- 1 =>
- array (
- ),
- 2 =>
- array (
- 0 => -1,
- 1 => -1,
- 2 => 3,
- ),
- 3 =>
- array (
- 0 => -1,
- ),
- );
- $this->_keywords = array (
- -1 =>
- array (
- 0 => -1,
- 1 => -1,
- 2 => -1,
- 3 =>
- array (
- ),
- ),
- 0 =>
- array (
- ),
- 1 =>
- array (
- ),
- 2 =>
- array (
- 0 =>
- array (
- ),
- 1 =>
- array (
- ),
- 2 => -1,
- ),
- 3 =>
- array (
- 0 =>
- array (
- ),
- ),
- );
- $this->_parts = array (
- 0 =>
- array (
- ),
- 1 =>
- array (
- ),
- 2 =>
- array (
- 0 => NULL,
- 1 => NULL,
- 2 => NULL,
- ),
- 3 =>
- array (
- 0 => NULL,
- ),
- );
- $this->_subst = array (
- -1 =>
- array (
- 0 => false,
- 1 => false,
- 2 => false,
- 3 => false,
- ),
- 0 =>
- array (
- ),
- 1 =>
- array (
- ),
- 2 =>
- array (
- 0 => false,
- 1 => false,
- 2 => false,
- ),
- 3 =>
- array (
- 0 => false,
- ),
- );
- $this->_conditions = array (
- );
- $this->_kwmap = array (
- );
- $this->_defClass = 'code';
- $this->_checkDefines();
- }
-
-} \ No newline at end of file
diff --git a/library/Text_Highlighter/abap.xml b/library/Text_Highlighter/abap.xml
deleted file mode 100644
index 06d26e507..000000000
--- a/library/Text_Highlighter/abap.xml
+++ /dev/null
@@ -1,802 +0,0 @@
-<?xml version="1.0"?>
-<!-- $Id: abap.xml,v 1.1 2007-06-03 02:35:28 ssttoo Exp $ -->
-
-<highlight lang="abap" case = "no">
-
- <authors>
- <author name="Stoyan Stefanov" email ="ssttoo@gmail.com"/>
- </authors>
-
-
- <default innerClass="code" />
-
-
- <region name="block" delimClass="brackets" innerClass="code" start="\{" end="\}">
- <contains all="yes"/>
- </region>
-
- <region name="brackets" delimClass="brackets" innerClass="code" start="\(" end="\)">
- <contains all="yes"/>
- </region>
-
- <region name="sqbrackets" delimClass="brackets" innerClass="code" start="\[" end="\]">
- <contains all="yes"/>
- </region>
-
- <region name="comment" start="^\*|&quot;" end="/$/m" innerClass="comment">
- <contains all="no"/>
- </region>
-
- <region name="strsingle" delimClass="quotes" innerClass="string" start="'" end="'" />
-
- <block name="identifier" match="[a-zA-Z_]\w*" innerClass="identifier" contained="yes"/>
-
- <block name="hexinteger" match="0[xX][\da-f]+" innerClass="number" contained="yes"/>
-
- <block name="integer" match="\d\d*|\b0\b" innerClass="number" contained="yes"/>
-
- <block name="octinteger" match="0[0-7]+" innerClass="number" contained="yes"/>
-
- <block name="float" match="(\d*\.\d+)|(\d+\.\d*)" innerClass="number" contained="yes"/>
-
-
- <block name="identifier" match="[a-z_\-]\w*" innerClass="identifier" case="no"/>
-
- <keywords name="sy" inherits="identifier" innerClass="reserved">
- <keyword match="SCREEN-NAME"/>
- <keyword match="SCREEN-GROUP1"/>
- <keyword match="SCREEN-GROUP2"/>
- <keyword match="SCREEN-GROUP3"/>
- <keyword match="SCREEN-GROUP4"/>
- <keyword match="SCREEN-REQUIRED"/>
- <keyword match="SCREEN-INPUT"/>
- <keyword match="SCREEN-OUTPUT"/>
- <keyword match="SCREEN-INTENSIFIED"/>
- <keyword match="SCREEN-INVISIBLE"/>
- <keyword match="SCREEN-LENGTH"/>
- <keyword match="SCREEN-ACTIVE"/>
- <keyword match="SY-INDEX"/>
- <keyword match="SY-PAGNO"/>
- <keyword match="SY-TABIX"/>
- <keyword match="SY-TFILL"/>
- <keyword match="SY-TLOPC"/>
- <keyword match="SY-TMAXL"/>
- <keyword match="SY-TOCCU"/>
- <keyword match="SY-TTABC"/>
- <keyword match="SY-TSTIS"/>
- <keyword match="SY-TTABI"/>
- <keyword match="SY-DBCNT"/>
- <keyword match="SY-FDPOS"/>
- <keyword match="SY-COLNO"/>
- <keyword match="SY-LINCT"/>
- <keyword match="SY-LINNO"/>
- <keyword match="SY-LINSZ"/>
- <keyword match="SY-PAGCT"/>
- <keyword match="SY-MACOL"/>
- <keyword match="SY-MAROW"/>
- <keyword match="SY-TLENG"/>
- <keyword match="SY-SFOFF"/>
- <keyword match="SY-WILLI"/>
- <keyword match="SY-LILLI"/>
- <keyword match="SY-SUBRC"/>
- <keyword match="SY-FLENG"/>
- <keyword match="SY-CUCOL"/>
- <keyword match="SY-CUROW"/>
- <keyword match="SY-LSIND"/>
- <keyword match="SY-LISTI"/>
- <keyword match="SY-STEPL"/>
- <keyword match="SY-TPAGI"/>
- <keyword match="SY-WINX1"/>
- <keyword match="SY-WINY1"/>
- <keyword match="SY-WINX2"/>
- <keyword match="SY-WINY2"/>
- <keyword match="SY-WINCO"/>
- <keyword match="SY-WINRO"/>
- <keyword match="SY-WINDI"/>
- <keyword match="SY-SROWS"/>
- <keyword match="SY-SCOLS"/>
- <keyword match="SY-LOOPC"/>
- <keyword match="SY-FOLEN"/>
- <keyword match="SY-FODEC"/>
- <keyword match="SY-TZONE"/>
- <keyword match="SY-DAYST"/>
- <keyword match="SY-FTYPE"/>
- <keyword match="SY-APPLI"/>
- <keyword match="SY-FDAYW"/>
- <keyword match="SY-CCURS"/>
- <keyword match="SY-CCURT"/>
- <keyword match="SY-DEBUG"/>
- <keyword match="SY-CTYPE"/>
- <keyword match="SY-INPUT"/>
- <keyword match="SY-LANGU"/>
- <keyword match="SY-MODNO"/>
- <keyword match="SY-BATCH"/>
- <keyword match="SY-BINPT"/>
- <keyword match="SY-CALLD"/>
- <keyword match="SY-DYNNR"/>
- <keyword match="SY-DYNGR"/>
- <keyword match="SY-NEWPA"/>
- <keyword match="SY-PRI40"/>
- <keyword match="SY-RSTRT"/>
- <keyword match="SY-WTITL"/>
- <keyword match="SY-CPAGE"/>
- <keyword match="SY-DBNAM"/>
- <keyword match="SY-MANDT"/>
- <keyword match="SY-PREFX"/>
- <keyword match="SY-FMKEY"/>
- <keyword match="SY-PEXPI"/>
- <keyword match="SY-PRINI"/>
- <keyword match="SY-PRIMM"/>
- <keyword match="SY-PRREL"/>
- <keyword match="SY-PLAYO"/>
- <keyword match="SY-PRBIG"/>
- <keyword match="SY-PLAYP"/>
- <keyword match="SY-PRNEW"/>
- <keyword match="SY-PRLOG"/>
- <keyword match="SY-PDEST"/>
- <keyword match="SY-PLIST"/>
- <keyword match="SY-PAUTH"/>
- <keyword match="SY-PRDSN"/>
- <keyword match="SY-PNWPA"/>
- <keyword match="SY-CALLR"/>
- <keyword match="SY-REPI2"/>
- <keyword match="SY-RTITL"/>
- <keyword match="SY-PRREC"/>
- <keyword match="SY-PRTXT"/>
- <keyword match="SY-PRABT"/>
- <keyword match="SY-LPASS"/>
- <keyword match="SY-NRPAG"/>
- <keyword match="SY-PAART"/>
- <keyword match="SY-PRCOP"/>
- <keyword match="SY-BATZS"/>
- <keyword match="SY-BSPLD"/>
- <keyword match="SY-BREP4"/>
- <keyword match="SY-BATZO"/>
- <keyword match="SY-BATZD"/>
- <keyword match="SY-BATZW"/>
- <keyword match="SY-BATZM"/>
- <keyword match="SY-CTABL"/>
- <keyword match="SY-DBSYS"/>
- <keyword match="SY-DCSYS"/>
- <keyword match="SY-MACDB"/>
- <keyword match="SY-SYSID"/>
- <keyword match="SY-OPSYS"/>
- <keyword match="SY-PFKEY"/>
- <keyword match="SY-SAPRL"/>
- <keyword match="SY-TCODE"/>
- <keyword match="SY-UCOMM"/>
- <keyword match="SY-CFWAE"/>
- <keyword match="SY-CHWAE"/>
- <keyword match="SY-SPONO"/>
- <keyword match="SY-SPONR"/>
- <keyword match="SY-WAERS"/>
- <keyword match="SY-CDATE"/>
- <keyword match="SY-DATUM"/>
- <keyword match="SY-SLSET"/>
- <keyword match="SY-SUBTY"/>
- <keyword match="SY-SUBCS"/>
- <keyword match="SY-GROUP"/>
- <keyword match="SY-FFILE"/>
- <keyword match="SY-UZEIT"/>
- <keyword match="SY-DSNAM"/>
- <keyword match="SY-REPID"/>
- <keyword match="SY-TABID"/>
- <keyword match="SY-TFDSN"/>
- <keyword match="SY-UNAME"/>
- <keyword match="SY-LSTAT"/>
- <keyword match="SY-ABCDE"/>
- <keyword match="SY-MARKY"/>
- <keyword match="SY-SFNAM"/>
- <keyword match="SY-TNAME"/>
- <keyword match="SY-MSGLI"/>
- <keyword match="SY-TITLE"/>
- <keyword match="SY-ENTRY"/>
- <keyword match="SY-LISEL"/>
- <keyword match="SY-ULINE"/>
- <keyword match="SY-XCODE"/>
- <keyword match="SY-CPROG"/>
- <keyword match="SY-XPROG"/>
- <keyword match="SY-XFORM"/>
- <keyword match="SY-LDBPG"/>
- <keyword match="SY-TVAR0"/>
- <keyword match="SY-TVAR1"/>
- <keyword match="SY-TVAR2"/>
- <keyword match="SY-TVAR3"/>
- <keyword match="SY-TVAR4"/>
- <keyword match="SY-TVAR5"/>
- <keyword match="SY-TVAR6"/>
- <keyword match="SY-TVAR7"/>
- <keyword match="SY-TVAR8"/>
- <keyword match="SY-TVAR9"/>
- <keyword match="SY-MSGID"/>
- <keyword match="SY-MSGTY"/>
- <keyword match="SY-MSGNO"/>
- <keyword match="SY-MSGV1"/>
- <keyword match="SY-MSGV2"/>
- <keyword match="SY-MSGV3"/>
- <keyword match="SY-MSGV4"/>
- <keyword match="SY-ONCOM"/>
- <keyword match="SY-VLINE"/>
- <keyword match="SY-WINSL"/>
- <keyword match="SY-STACO"/>
- <keyword match="SY-STARO"/>
- <keyword match="SY-DATAR"/>
- <keyword match="SY-HOST"/>
- <keyword match="SY-LOCDB"/>
- <keyword match="SY-LOCOP"/>
- <keyword match="SY-DATLO"/>
- <keyword match="SY-TIMLO"/>
- <keyword match="SY-ZONLO"/>
- <keyword match="SYST-INDEX"/>
- <keyword match="SYST-PAGNO"/>
- <keyword match="SYST-TABIX"/>
- <keyword match="SYST-TFILL"/>
- <keyword match="SYST-TLOPC"/>
- <keyword match="SYST-TMAXL"/>
- <keyword match="SYST-TOCCU"/>
- <keyword match="SYST-TTABC"/>
- <keyword match="SYST-TSTIS"/>
- <keyword match="SYST-TTABI"/>
- <keyword match="SYST-DBCNT"/>
- <keyword match="SYST-FDPOS"/>
- <keyword match="SYST-COLNO"/>
- <keyword match="SYST-LINCT"/>
- <keyword match="SYST-LINNO"/>
- <keyword match="SYST-LINSZ"/>
- <keyword match="SYST-PAGCT"/>
- <keyword match="SYST-MACOL"/>
- <keyword match="SYST-MAROW"/>
- <keyword match="SYST-TLENG"/>
- <keyword match="SYST-SFOFF"/>
- <keyword match="SYST-WILLI"/>
- <keyword match="SYST-LILLI"/>
- <keyword match="SYST-SUBRC"/>
- <keyword match="SYST-FLENG"/>
- <keyword match="SYST-CUCOL"/>
- <keyword match="SYST-CUROW"/>
- <keyword match="SYST-LSIND"/>
- <keyword match="SYST-LISTI"/>
- <keyword match="SYST-STEPL"/>
- <keyword match="SYST-TPAGI"/>
- <keyword match="SYST-WINX1"/>
- <keyword match="SYST-WINY1"/>
- <keyword match="SYST-WINX2"/>
- <keyword match="SYST-WINY2"/>
- <keyword match="SYST-WINCO"/>
- <keyword match="SYST-WINRO"/>
- <keyword match="SYST-WINDI"/>
- <keyword match="SYST-SROWS"/>
- <keyword match="SYST-SCOLS"/>
- <keyword match="SYST-LOOPC"/>
- <keyword match="SYST-FOLEN"/>
- <keyword match="SYST-FODEC"/>
- <keyword match="SYST-TZONE"/>
- <keyword match="SYST-DAYST"/>
- <keyword match="SYST-FTYPE"/>
- <keyword match="SYST-APPLI"/>
- <keyword match="SYST-FDAYW"/>
- <keyword match="SYST-CCURS"/>
- <keyword match="SYST-CCURT"/>
- <keyword match="SYST-DEBUG"/>
- <keyword match="SYST-CTYPE"/>
- <keyword match="SYST-INPUT"/>
- <keyword match="SYST-LANGU"/>
- <keyword match="SYST-MODNO"/>
- <keyword match="SYST-BATCH"/>
- <keyword match="SYST-BINPT"/>
- <keyword match="SYST-CALLD"/>
- <keyword match="SYST-DYNNR"/>
- <keyword match="SYST-DYNGR"/>
- <keyword match="SYST-NEWPA"/>
- <keyword match="SYST-PRI40"/>
- <keyword match="SYST-RSTRT"/>
- <keyword match="SYST-WTITL"/>
- <keyword match="SYST-CPAGE"/>
- <keyword match="SYST-DBNAM"/>
- <keyword match="SYST-MANDT"/>
- <keyword match="SYST-PREFX"/>
- <keyword match="SYST-FMKEY"/>
- <keyword match="SYST-PEXPI"/>
- <keyword match="SYST-PRINI"/>
- <keyword match="SYST-PRIMM"/>
- <keyword match="SYST-PRREL"/>
- <keyword match="SYST-PLAYO"/>
- <keyword match="SYST-PRBIG"/>
- <keyword match="SYST-PLAYP"/>
- <keyword match="SYST-PRNEW"/>
- <keyword match="SYST-PRLOG"/>
- <keyword match="SYST-PDEST"/>
- <keyword match="SYST-PLIST"/>
- <keyword match="SYST-PAUTH"/>
- <keyword match="SYST-PRDSN"/>
- <keyword match="SYST-PNWPA"/>
- <keyword match="SYST-CALLR"/>
- <keyword match="SYST-REPI2"/>
- <keyword match="SYST-RTITL"/>
- <keyword match="SYST-PRREC"/>
- <keyword match="SYST-PRTXT"/>
- <keyword match="SYST-PRABT"/>
- <keyword match="SYST-LPASS"/>
- <keyword match="SYST-NRPAG"/>
- <keyword match="SYST-PAART"/>
- <keyword match="SYST-PRCOP"/>
- <keyword match="SYST-BATZS"/>
- <keyword match="SYST-BSPLD"/>
- <keyword match="SYST-BREP4"/>
- <keyword match="SYST-BATZO"/>
- <keyword match="SYST-BATZD"/>
- <keyword match="SYST-BATZW"/>
- <keyword match="SYST-BATZM"/>
- <keyword match="SYST-CTABL"/>
- <keyword match="SYST-DBSYS"/>
- <keyword match="SYST-DCSYS"/>
- <keyword match="SYST-MACDB"/>
- <keyword match="SYST-SYSID"/>
- <keyword match="SYST-OPSYS"/>
- <keyword match="SYST-PFKEY"/>
- <keyword match="SYST-SAPRL"/>
- <keyword match="SYST-TCODE"/>
- <keyword match="SYST-UCOMM"/>
- <keyword match="SYST-CFWAE"/>
- <keyword match="SYST-CHWAE"/>
- <keyword match="SYST-SPONO"/>
- <keyword match="SYST-SPONR"/>
- <keyword match="SYST-WAERS"/>
- <keyword match="SYST-CDATE"/>
- <keyword match="SYST-DATUM"/>
- <keyword match="SYST-SLSET"/>
- <keyword match="SYST-SUBTY"/>
- <keyword match="SYST-SUBCS"/>
- <keyword match="SYST-GROUP"/>
- <keyword match="SYST-FFILE"/>
- <keyword match="SYST-UZEIT"/>
- <keyword match="SYST-DSNAM"/>
- <keyword match="SYST-REPID"/>
- <keyword match="SYST-TABID"/>
- <keyword match="SYST-TFDSN"/>
- <keyword match="SYST-UNAME"/>
- <keyword match="SYST-LSTAT"/>
- <keyword match="SYST-ABCDE"/>
- <keyword match="SYST-MARKY"/>
- <keyword match="SYST-SFNAM"/>
- <keyword match="SYST-TNAME"/>
- <keyword match="SYST-MSGLI"/>
- <keyword match="SYST-TITLE"/>
- <keyword match="SYST-ENTRY"/>
- <keyword match="SYST-LISEL"/>
- <keyword match="SYST-ULINE"/>
- <keyword match="SYST-XCODE"/>
- <keyword match="SYST-CPROG"/>
- <keyword match="SYST-XPROG"/>
- <keyword match="SYST-XFORM"/>
- <keyword match="SYST-LDBPG"/>
- <keyword match="SYST-TVAR0"/>
- <keyword match="SYST-TVAR1"/>
- <keyword match="SYST-TVAR2"/>
- <keyword match="SYST-TVAR3"/>
- <keyword match="SYST-TVAR4"/>
- <keyword match="SYST-TVAR5"/>
- <keyword match="SYST-TVAR6"/>
- <keyword match="SYST-TVAR7"/>
- <keyword match="SYST-TVAR8"/>
- <keyword match="SYST-TVAR9"/>
- <keyword match="SYST-MSGID"/>
- <keyword match="SYST-MSGTY"/>
- <keyword match="SYST-MSGNO"/>
- <keyword match="SYST-MSGV1"/>
- <keyword match="SYST-MSGV2"/>
- <keyword match="SYST-MSGV3"/>
- <keyword match="SYST-MSGV4"/>
- <keyword match="SYST-ONCOM"/>
- <keyword match="SYST-VLINE"/>
- <keyword match="SYST-WINSL"/>
- <keyword match="SYST-STACO"/>
- <keyword match="SYST-STARO"/>
- <keyword match="SYST-DATAR"/>
- <keyword match="SYST-HOST"/>
- <keyword match="SYST-LOCDB"/>
- <keyword match="SYST-LOCOP"/>
- <keyword match="SYST-DATLO"/>
- <keyword match="SYST-TIMLO"/>
- <keyword match="SYST-ZONLO"/>
- </keywords>
-
-
- <keywords name="reserved" inherits="identifier" innerClass="reserved">
- <keyword match="ABS"/>
- <keyword match="ACOS"/>
- <keyword match="ADD"/>
- <keyword match="ADD-CORRESPONDING"/>
- <keyword match="ADJACENT"/>
- <keyword match="AFTER"/>
- <keyword match="ALIASES"/>
- <keyword match="ALL"/>
- <keyword match="ANALYZER"/>
- <keyword match="AND"/>
- <keyword match="ANY"/>
- <keyword match="APPEND"/>
- <keyword match="AS"/>
- <keyword match="ASCENDING"/>
- <keyword match="ASIN"/>
- <keyword match="ASSIGN"/>
- <keyword match="ASSIGNED"/>
- <keyword match="ASSIGNING"/>
- <keyword match="AT"/>
- <keyword match="ATAN"/>
- <keyword match="AUTHORITY-CHECK"/>
- <keyword match="AVG"/>
- <keyword match="BACK"/>
- <keyword match="BEFORE"/>
- <keyword match="BEGIN"/>
- <keyword match="BINARY"/>
- <keyword match="BIT"/>
- <keyword match="BIT-AND"/>
- <keyword match="BIT-NOT"/>
- <keyword match="BIT-OR"/>
- <keyword match="BIT-XOR"/>
- <keyword match="BLANK"/>
- <keyword match="BLOCK"/>
- <keyword match="BREAK-POINT"/>
- <keyword match="BUFFER"/>
- <keyword match="BY"/>
- <keyword match="C"/>
- <keyword match="CALL"/>
- <keyword match="CASE"/>
- <keyword match="CATCH"/>
- <keyword match="CEIL"/>
- <keyword match="CENTERED"/>
- <keyword match="CHAIN"/>
- <keyword match="CHANGE"/>
- <keyword match="CHANGING"/>
- <keyword match="CHECK"/>
- <keyword match="CHECKBOX"/>
- <keyword match="CLASS"/>
- <keyword match="CLASS-DATA"/>
- <keyword match="CLASS-EVENTS"/>
- <keyword match="CLASS-METHODS"/>
- <keyword match="CLASS-POOL"/>
- <keyword match="CLEAR"/>
- <keyword match="CLIENT"/>
- <keyword match="CLOSE"/>
- <keyword match="CNT"/>
- <keyword match="CODE"/>
- <keyword match="COLLECT"/>
- <keyword match="COLOR"/>
- <keyword match="COMMENT"/>
- <keyword match="COMMIT"/>
- <keyword match="COMMUNICATION"/>
- <keyword match="COMPUTE"/>
- <keyword match="CONCATENATE"/>
- <keyword match="CONDENSE"/>
- <keyword match="CONSTANTS"/>
- <keyword match="CONTEXT"/>
- <keyword match="CONTEXTS"/>
- <keyword match="CONTINUE"/>
- <keyword match="CONTROL"/>
- <keyword match="CONTROLS"/>
- <keyword match="CONVERT"/>
- <keyword match="COPY"/>
- <keyword match="CORRESPONDING"/>
- <keyword match="COS"/>
- <keyword match="COSH"/>
- <keyword match="COUNT"/>
- <keyword match="COUNTRY"/>
- <keyword match="CREATE"/>
- <keyword match="CURRENCY"/>
- <keyword match="CURSOR"/>
- <keyword match="CUSTOMER-FUNCTION"/>
- <keyword match="DATA"/>
- <keyword match="DATABASE"/>
- <keyword match="DATASET"/>
- <keyword match="DELETE"/>
- <keyword match="DECIMALS"/>
- <keyword match="DEFAULT"/>
- <keyword match="DEFINE"/>
- <keyword match="DELETE"/>
- <keyword match="DEMAND"/>
- <keyword match="DESCENDING"/>
- <keyword match="DESCRIBE"/>
- <keyword match="DIALOG"/>
- <keyword match="DISTINCT"/>
- <keyword match="DIV"/>
- <keyword match="DIVIDE"/>
- <keyword match="DIVIDE-CORRESPONDING"/>
- <keyword match="DO"/>
- <keyword match="DUPLICATES"/>
- <keyword match="DYNPRO"/>
- <keyword match="EDIT"/>
- <keyword match="EDITOR-CALL"/>
- <keyword match="ELSE"/>
- <keyword match="ELSEIF"/>
- <keyword match="END"/>
- <keyword match="END-OF-DEFINITION"/>
- <keyword match="END-OF-PAGE"/>
- <keyword match="END-OF-SELECTION"/>
- <keyword match="ENDAT"/>
- <keyword match="ENDCASE"/>
- <keyword match="ENDCATCH"/>
- <keyword match="ENDCHAIN"/>
- <keyword match="ENDCLASS"/>
- <keyword match="ENDDO"/>
- <keyword match="ENDEXEC"/>
- <keyword match="ENDFORM"/>
- <keyword match="ENDFUNCTION"/>
- <keyword match="ENDIF"/>
- <keyword match="ENDINTERFACE"/>
- <keyword match="ENDLOOP"/>
- <keyword match="ENDMETHOD"/>
- <keyword match="ENDMODULE"/>
- <keyword match="ENDON"/>
- <keyword match="ENDPROVIDE"/>
- <keyword match="ENDSELECT"/>
- <keyword match="ENDWHILE"/>
- <keyword match="ENTRIES"/>
- <keyword match="EVENTS"/>
- <keyword match="EXEC"/>
- <keyword match="EXIT"/>
- <keyword match="EXIT-COMMAND"/>
- <keyword match="EXP"/>
- <keyword match="EXPONENT"/>
- <keyword match="EXPORT"/>
- <keyword match="EXPORTING"/>
- <keyword match="EXCEPTIONS"/>
- <keyword match="EXTENDED"/>
- <keyword match="EXTRACT"/>
- <keyword match="FETCH"/>
- <keyword match="FIELD"/>
- <keyword match="FIELD-GROUPS"/>
- <keyword match="FIELD-SYMBOLS"/>
- <keyword match="FIELDS"/>
- <keyword match="FLOOR"/>
- <keyword match="FOR"/>
- <keyword match="FORM"/>
- <keyword match="FORMAT"/>
- <keyword match="FRAC"/>
- <keyword match="FRAME"/>
- <keyword match="FREE"/>
- <keyword match="FROM"/>
- <keyword match="FUNCTION"/>
- <keyword match="FUNCTION-POOL"/>
- <keyword match="GENERATE"/>
- <keyword match="GET"/>
- <keyword match="GROUP"/>
- <keyword match="HASHED"/>
- <keyword match="HEADER"/>
- <keyword match="HELP-ID"/>
- <keyword match="HELP-REQUEST"/>
- <keyword match="HIDE"/>
- <keyword match="HOTSPOT"/>
- <keyword match="ICON"/>
- <keyword match="ID"/>
- <keyword match="IF"/>
- <keyword match="IMPORT"/>
- <keyword match="IMPORTING"/>
- <keyword match="INCLUDE"/>
- <keyword match="INDEX"/>
- <keyword match="INFOTYPES"/>
- <keyword match="INITIALIZATION"/>
- <keyword match="INNER"/>
- <keyword match="INPUT"/>
- <keyword match="INSERT"/>
- <keyword match="INTENSIFIED"/>
- <keyword match="INTERFACE"/>
- <keyword match="INTERFACE-POOL"/>
- <keyword match="INTERFACES"/>
- <keyword match="INTO"/>
- <keyword match="INVERSE"/>
- <keyword match="JOIN"/>
- <keyword match="KEY"/>
- <keyword match="LANGUAGE"/>
- <keyword match="LAST"/>
- <keyword match="LEAVE"/>
- <keyword match="LEFT"/>
- <keyword match="LEFT-JUSTIFIED"/>
- <keyword match="LIKE"/>
- <keyword match="LINE"/>
- <keyword match="LINE-COUNT"/>
- <keyword match="LINE-SELECTION"/>
- <keyword match="LINE-SIZE"/>
- <keyword match="LINES"/>
- <keyword match="LIST-PROCESSING"/>
- <keyword match="LOAD"/>
- <keyword match="LOAD-OF-PROGRAM"/>
- <keyword match="LOCAL"/>
- <keyword match="LOCALE"/>
- <keyword match="LOG"/>
- <keyword match="LOG10"/>
- <keyword match="LOOP"/>
- <keyword match="M"/>
- <keyword match="MARGIN"/>
- <keyword match="MASK"/>
- <keyword match="MATCHCODE"/>
- <keyword match="MAX"/>
- <keyword match="MEMORY"/>
- <keyword match="MESSAGE"/>
- <keyword match="MESSAGE-ID"/>
- <keyword match="MESSAGES"/>
- <keyword match="METHOD"/>
- <keyword match="METHODS"/>
- <keyword match="MIN"/>
- <keyword match="MOD"/>
- <keyword match="MODE"/>
- <keyword match="MODIF"/>
- <keyword match="MODIFY"/>
- <keyword match="MODULE"/>
- <keyword match="MOVE"/>
- <keyword match="MOVE-CORRESPONDING"/>
- <keyword match="MULTIPLY"/>
- <keyword match="MULTIPLY-CORRESPONDING"/>
- <keyword match="NEW"/>
- <keyword match="NEW-LINE"/>
- <keyword match="NEW-PAGE"/>
- <keyword match="NEXT"/>
- <keyword match="NO"/>
- <keyword match="NO-GAP"/>
- <keyword match="NO-GAPS"/>
- <keyword match="NO-HEADING"/>
- <keyword match="NO-SCROLLING"/>
- <keyword match="NO-SIGN"/>
- <keyword match="NO-TITLE"/>
- <keyword match="NO-ZERO"/>
- <keyword match="NODES"/>
- <keyword match="NON-UNIQUE"/>
- <keyword match="O"/>
- <keyword match="OBJECT"/>
- <keyword match="OBLIGATORY"/>
- <keyword match="OCCURS"/>
- <keyword match="OF"/>
- <keyword match="OFF"/>
- <keyword match="ON"/>
- <keyword match="OPEN"/>
- <keyword match="OR"/>
- <keyword match="ORDER"/>
- <keyword match="OTHERS"/>
- <keyword match="OUTER"/>
- <keyword match="OUTPUT"/>
- <keyword match="OVERLAY"/>
- <keyword match="PACK"/>
- <keyword match="PAGE"/>
- <keyword match="PARAMETER"/>
- <keyword match="PARAMETERS"/>
- <keyword match="PERFORM"/>
- <keyword match="PF-STATUS"/>
- <keyword match="POSITION"/>
- <keyword match="PRINT"/>
- <keyword match="PRINT-CONTROL"/>
- <keyword match="PRIVATE"/>
- <keyword match="PROCESS"/>
- <keyword match="PROGRAM"/>
- <keyword match="PROPERTY"/>
- <keyword match="PROTECTED"/>
- <keyword match="PROVIDE"/>
- <keyword match="PUBLIC"/>
- <keyword match="PUT"/>
- <keyword match="RADIOBUTTON"/>
- <keyword match="RAISE"/>
- <keyword match="RAISING"/>
- <keyword match="RANGE"/>
- <keyword match="RANGES"/>
- <keyword match="READ"/>
- <keyword match="RECEIVE"/>
- <keyword match="REFRESH"/>
- <keyword match="REJECT"/>
- <keyword match="REPLACE"/>
- <keyword match="REPORT"/>
- <keyword match="REQUESTED"/>
- <keyword match="RESERVE"/>
- <keyword match="RESET"/>
- <keyword match="RIGHT-JUSTIFIED"/>
- <keyword match="ROLLBACK"/>
- <keyword match="ROUND"/>
- <keyword match="ROWS"/>
- <keyword match="RTTI"/>
- <keyword match="RUN"/>
- <keyword match="SCAN"/>
- <keyword match="SCREEN"/>
- <keyword match="SEARCH"/>
- <keyword match="SEPARATED"/>
- <keyword match="SCROLL"/>
- <keyword match="SCROLL-BOUNDARY"/>
- <keyword match="SEARCH"/>
- <keyword match="SELECT"/>
- <keyword match="SELECT-OPTIONS"/>
- <keyword match="SELECTION-SCREEN"/>
- <keyword match="SELECTION-TABLE"/>
- <keyword match="SET"/>
- <keyword match="SHARED"/>
- <keyword match="SHIFT"/>
- <keyword match="SIGN"/>
- <keyword match="SIN"/>
- <keyword match="SINGLE"/>
- <keyword match="SINH"/>
- <keyword match="SIZE"/>
- <keyword match="SKIP"/>
- <keyword match="SORT"/>
- <keyword match="SORTED"/>
- <keyword match="SPLIT"/>
- <keyword match="SQL"/>
- <keyword match="SQRT"/>
- <keyword match="STAMP"/>
- <keyword match="STANDARD"/>
- <keyword match="START-OF-SELECTION"/>
- <keyword match="STATICS"/>
- <keyword match="STOP"/>
- <keyword match="STRING"/>
- <keyword match="STRLEN"/>
- <keyword match="STRUCTURE"/>
- <keyword match="SUBMIT"/>
- <keyword match="SUBTRACT"/>
- <keyword match="SUBTRACT-CORRESPONDING"/>
- <keyword match="SUM"/>
- <keyword match="SUPPLY"/>
- <keyword match="SUPPRESS"/>
- <keyword match="SYMBOL"/>
- <keyword match="SYNTAX-CHECK"/>
- <keyword match="SYNTAX-TRACE"/>
- <keyword match="SYSTEM-CALL"/>
- <keyword match="SYSTEM-EXCEPTIONS"/>
- <keyword match="TABLE"/>
- <keyword match="TABLE_LINE"/>
- <keyword match="TABLES"/>
- <keyword match="TAN"/>
- <keyword match="TANH"/>
- <keyword match="TEXT"/>
- <keyword match="TEXTPOOL"/>
- <keyword match="TIME"/>
- <keyword match="TIMES"/>
- <keyword match="TITLE"/>
- <keyword match="TITLEBAR"/>
- <keyword match="TO"/>
- <keyword match="TOP-OF-PAGE"/>
- <keyword match="TRANSACTION"/>
- <keyword match="TRANSFER"/>
- <keyword match="TRANSLATE"/>
- <keyword match="TRANSPORTING"/>
- <keyword match="TRUNC"/>
- <keyword match="TYPE"/>
- <keyword match="TYPE-POOL"/>
- <keyword match="TYPE-POOLS"/>
- <keyword match="TYPES"/>
- <keyword match="ULINE"/>
- <keyword match="UNDER"/>
- <keyword match="UNIQUE"/>
- <keyword match="UNIT"/>
- <keyword match="UNPACK"/>
- <keyword match="UP"/>
- <keyword match="UPDATE"/>
- <keyword match="USER-COMMAND"/>
- <keyword match="USING"/>
- <keyword match="VALUE"/>
- <keyword match="VALUE-REQUEST"/>
- <keyword match="VALUES"/>
- <keyword match="VARY"/>
- <keyword match="WHEN"/>
- <keyword match="WHERE"/>
- <keyword match="WHILE"/>
- <keyword match="WINDOW"/>
- <keyword match="WITH"/>
- <keyword match="WITH-TITLE"/>
- <keyword match="WORK"/>
- <keyword match="WRITE"/>
- <keyword match="X"/>
- <keyword match="XSTRING"/>
- <keyword match="Z"/>
- <keyword match="ZONE"/>
- </keywords>
-
-
- <keywords name="constants" inherits="identifier" innerClass="reserved">
- <keyword match="INITIAL"/>
- <keyword match="NULL"/>
- <keyword match="SPACE"/>
- <keyword match="COL_BACKGROUND"/>
- <keyword match="COL_HEADING"/>
- <keyword match="COL_NORMAL"/>
- <keyword match="COL_TOTAL"/>
- <keyword match="COL_KEY"/>
- <keyword match="COL_POSITIVE"/>
- <keyword match="COL_NEGATIVE"/>
- <keyword match="COL_GROUP"/>
- </keywords>
-
-</highlight>
diff --git a/library/Text_Highlighter/avrc.xml b/library/Text_Highlighter/avrc.xml
deleted file mode 100644
index dec571e13..000000000
--- a/library/Text_Highlighter/avrc.xml
+++ /dev/null
@@ -1,316 +0,0 @@
-<?xml version="1.0"?>
-<!-- $Id: avrc.xml,v 1.1 2008-07-31 23:05:38 ssttoo Exp $ -->
-
-<highlight lang="AVRC" case="no">
-
- <authors>
- <author name="Andrey Demenev" email="demenev@gmail.com"/>
- </authors>
-
- <comment>
- C/C++ highlighter specific to Atmel AVR microcontrollers
- </comment>
-
- <default innerClass="code" />
-
- <block name="escaped" match="\\" innerClass="special" contained="yes">
- <onlyin region="strdouble"/>
- </block>
-
- <region name="strdouble" delimClass="quotes" innerClass="string" start="&quot;" end="&quot;"/>
-
- <region name="block" delimClass="brackets" innerClass="code" start="\{" end="\}">
- <contains all="yes"/>
- </region>
-
- <region name="brackets" delimClass="brackets" innerClass="code" start="\(" end="\)">
- <contains all="yes"/>
- </region>
-
- <region name="sqbrackets" delimClass="brackets" innerClass="code" start="\[" end="\]">
- <contains all="yes"/>
- </region>
-
- <block name="identifier" match="[a-z_]\w*" innerClass="identifier" case="no"/>
-
- <block name="hexinteger" match="\b0[xX][\da-f]+" innerClass="number"/>
- <block name="integer" match="\b\d\d*|\b0\b" innerClass="number"/>
- <block name="octinteger" match="\b0[0-7]+" innerClass="number"/>
- <block name="float" match="\b(\d*\.\d+)|(\d+\.\d*)" innerClass="number"/>
-
-
- <region name="strincl" delimClass="quotes" innerClass="string" start="&lt;" end="&gt;">
- <onlyin region="include" />
- </region>
-
- <!-- <block name="preprocessor" match="^#[azAZ_]\w*" innerClass="prepro"/> -->
- <region name="include" innerClass="prepro" start="/^[ \t]*#include/m" end="/(?&lt;!\\)$/m">
- <contains region="strdouble"/>
- <contains region="strincl"/>
- </region>
-
- <region name="preprocessor" delimClass="prepro" innerClass="code" start="/^[ \t]*#[ \t]*[a-z]+/mi" end="/(?&lt;!\\)$/m">
- <contains region="comment"/>
- <contains region="mlcomment"/>
- <contains region="strdouble"/>
- <contains region="brackets"/>
- <contains region="block"/>
- <contains block="identifier"/>
- <contains block="integer"/>
- <contains block="hexinteger"/>
- <contains block="octinteger"/>
- <contains block="float"/>
-
- </region>
-
- <block name="number" match="\d*\.?\d+" innerClass="number"/>
-
-
- <region name="mlcomment" innerClass="mlcomment" start="\/\*" end="\*\/" >
- <contains block="cvstag"/>
- </region>
-
- <block name="cvstag" match="\$\w+\s*:.+\$" innerClass="inlinedoc">
-
- <onlyin region="mlcomment"/>
- <onlyin region="comment"/>
- </block>
-
- <region name="comment" start="\/\/.+" end="/$/m" innerClass="comment" delimClass="comment">
- <contains block="cvstag"/>
- </region>
-
- <keywords name="reserved" inherits="identifier" innerClass="reserved" case="yes">
- <keyword match="and" />
- <keyword match="and_eq" />
- <keyword match="asm" />
-
- <keyword match="bitand" />
- <keyword match="bitor" />
- <keyword match="break" />
- <keyword match="case" />
- <keyword match="catch" />
- <keyword match="compl" />
-
- <keyword match="const_cast" />
- <keyword match="continue" />
- <keyword match="default" />
- <keyword match="delete" />
- <keyword match="do" />
- <keyword match="dynamic_cast" />
-
- <keyword match="else" />
- <keyword match="for" />
- <keyword match="fortran" />
- <keyword match="friend" />
- <keyword match="goto" />
- <keyword match="if" />
-
- <keyword match="new" />
- <keyword match="not" />
- <keyword match="not_eq" />
- <keyword match="operator" />
- <keyword match="or" />
- <keyword match="or_eq" />
-
- <keyword match="private" />
- <keyword match="protected" />
- <keyword match="public" />
- <keyword match="reinterpret_cast" />
- <keyword match="return" />
- <keyword match="sizeof" />
-
- <keyword match="static_cast" />
- <keyword match="switch" />
- <keyword match="this" />
- <keyword match="throw" />
- <keyword match="try" />
- <keyword match="typeid" />
-
- <keyword match="using" />
- <keyword match="while" />
- <keyword match="xor" />
- <keyword match="xor_eq" />
-
- <keyword match="false" />
- <keyword match="true" />
- </keywords>
-
- <keywords name="registers" inherits="identifier" innerClass="reserved" case="yes">
- <keyword match="ACSR" />
- <keyword match="ADCH" />
- <keyword match="ADCL" />
- <keyword match="ADCSRA" />
- <keyword match="ADMUX" />
- <keyword match="ASSR" />
- <keyword match="DDRA" />
- <keyword match="DDRB" />
- <keyword match="DDRC" />
- <keyword match="DDRD" />
- <keyword match="DDRE" />
- <keyword match="DDRF" />
- <keyword match="DDRG" />
- <keyword match="EEARH" />
- <keyword match="EEARL" />
- <keyword match="EECR" />
- <keyword match="EEDR" />
- <keyword match="EICRA" />
- <keyword match="EICRB" />
- <keyword match="EIFR" />
- <keyword match="EIMSK" />
- <keyword match="ETIFR" />
- <keyword match="ETIMSK" />
- <keyword match="GICR" />
- <keyword match="GIFR" />
- <keyword match="ICR1H" />
- <keyword match="ICR1L" />
- <keyword match="ICR3H" />
- <keyword match="ICR3L" />
- <keyword match="MCUCR" />
- <keyword match="MCUCSR" />
- <keyword match="OCDR" />
- <keyword match="OCR0" />
- <keyword match="OCR1AH" />
- <keyword match="OCR1AL" />
- <keyword match="OCR1BH" />
- <keyword match="OCR1BL" />
- <keyword match="OCR1CH" />
- <keyword match="OCR1CL" />
- <keyword match="OCR2" />
- <keyword match="OCR3AH" />
- <keyword match="OCR3AL" />
- <keyword match="OCR3BH" />
- <keyword match="OCR3BL" />
- <keyword match="OCR3CH" />
- <keyword match="OCR3CL" />
- <keyword match="OSCCAL" />
- <keyword match="PINA" />
- <keyword match="PINB" />
- <keyword match="PINC" />
- <keyword match="PIND" />
- <keyword match="PINE" />
- <keyword match="PINF" />
- <keyword match="PING" />
- <keyword match="PORTA" />
- <keyword match="PORTB" />
- <keyword match="PORTC" />
- <keyword match="PORTD" />
- <keyword match="PORTE" />
- <keyword match="PORTF" />
- <keyword match="PORTG" />
- <keyword match="RAMPZ" />
- <keyword match="SFIOR" />
- <keyword match="SPCR" />
- <keyword match="SPDR" />
- <keyword match="SPH" />
- <keyword match="SPL" />
- <keyword match="SPMCR" />
- <keyword match="SPMCSR" />
- <keyword match="SPSR" />
- <keyword match="SREG" />
- <keyword match="TCCR0" />
- <keyword match="TCCR1A" />
- <keyword match="TCCR1B" />
- <keyword match="TCCR1C" />
- <keyword match="TCCR2" />
- <keyword match="TCCR3A" />
- <keyword match="TCCR3B" />
- <keyword match="TCCR3C" />
- <keyword match="TCNT0" />
- <keyword match="TCNT1H" />
- <keyword match="TCNT1L" />
- <keyword match="TCNT2" />
- <keyword match="TCNT3H" />
- <keyword match="TCNT3L" />
- <keyword match="TIFR" />
- <keyword match="TIMSK" />
- <keyword match="TWAR" />
- <keyword match="TWBR" />
- <keyword match="TWCR" />
- <keyword match="TWDR" />
- <keyword match="TWSR" />
- <keyword match="UBRR0H" />
- <keyword match="UBRR0L" />
- <keyword match="UBRR1H" />
- <keyword match="UBRR1L" />
- <keyword match="UBRRH" />
- <keyword match="UBRRL" />
- <keyword match="UCSR0A" />
- <keyword match="UCSR0B" />
- <keyword match="UCSR0C" />
- <keyword match="UCSR1A" />
- <keyword match="UCSR1B" />
- <keyword match="UCSR1C" />
- <keyword match="UCSRA" />
- <keyword match="UCSRB" />
- <keyword match="UCSRC" />
- <keyword match="UDR" />
- <keyword match="UDR0" />
- <keyword match="UDR1" />
- <keyword match="WDTCR" />
- <keyword match="XDIV" />
- <keyword match="XMCRA" />
- <keyword match="XMCRB" />
- </keywords>
-
- <keywords name="types" inherits="identifier" innerClass="types" case="yes">
-
- <keyword match="auto" />
- <keyword match="bool" />
- <keyword match="char" />
- <keyword match="class" />
- <keyword match="const" />
- <keyword match="double" />
-
- <keyword match="enum" />
- <keyword match="explicit" />
- <keyword match="export" />
- <keyword match="extern" />
- <keyword match="float" />
- <keyword match="inline" />
-
- <keyword match="int" />
- <keyword match="long" />
- <keyword match="mutable" />
- <keyword match="namespace" />
- <keyword match="register" />
- <keyword match="short" />
-
- <keyword match="signed" />
- <keyword match="static" />
- <keyword match="struct" />
- <keyword match="template" />
- <keyword match="typedef" />
- <keyword match="typename" />
-
- <keyword match="union" />
- <keyword match="unsigned" />
- <keyword match="virtual" />
- <keyword match="void" />
- <keyword match="volatile" />
- <keyword match="wchar_t" />
-
- </keywords>
-
- <keywords name="Common Macros" inherits="identifier" innerClass="prepro" case="yes">
- <keyword match="NULL" />
- <keyword match="TRUE" />
- <keyword match="FALSE" />
- <keyword match="MAX" />
-
- <keyword match="MIN" />
- <keyword match="__LINE__" />
- <keyword match="__DATA__" />
- <keyword match="__FILE__" />
- <keyword match="__TIME__" />
- <keyword match="__STDC__" />
-
- </keywords>
-
-
- <!--
- <keywords name="reserved" inherits="identifier" innerClass="reserved" case="yes">
- -->
-
-</highlight>
-
diff --git a/library/Text_Highlighter/cpp.xml b/library/Text_Highlighter/cpp.xml
deleted file mode 100644
index 2cbaa930f..000000000
--- a/library/Text_Highlighter/cpp.xml
+++ /dev/null
@@ -1,201 +0,0 @@
-<?xml version="1.0"?>
-<!-- $Id: cpp.xml,v 1.2 2008-07-31 23:06:30 ssttoo Exp $ -->
-
-<highlight lang="CPP" case="no">
-
- <authors>
- <author name="Aaron Kalin"/>
- <author name="Andrey Demenev" email="demenev@gmail.com"/>
- </authors>
-
- <comment>
-Thanks to Aaron Kalin for initial
-implementation of this highlighter
- </comment>
-
- <default innerClass="code" />
-
- <block name="escaped" match="\\" innerClass="special" contained="yes">
- <onlyin region="strdouble"/>
- </block>
-
- <region name="strdouble" delimClass="quotes" innerClass="string" start="&quot;" end="&quot;"/>
-
- <region name="block" delimClass="brackets" innerClass="code" start="\{" end="\}">
- <contains all="yes"/>
- </region>
-
- <region name="brackets" delimClass="brackets" innerClass="code" start="\(" end="\)">
- <contains all="yes"/>
- </region>
-
- <region name="sqbrackets" delimClass="brackets" innerClass="code" start="\[" end="\]">
- <contains all="yes"/>
- </region>
-
- <block name="identifier" match="[a-z_]\w*" innerClass="identifier" case="no"/>
-
- <block name="hexinteger" match="\b0[xX][\da-f]+" innerClass="number"/>
- <block name="integer" match="\b\d\d*|\b0\b" innerClass="number"/>
- <block name="octinteger" match="\b0[0-7]+" innerClass="number"/>
- <block name="float" match="\b(\d*\.\d+)|(\d+\.\d*)" innerClass="number"/>
-
-
- <region name="strincl" delimClass="quotes" innerClass="string" start="&lt;" end="&gt;">
- <onlyin region="include" />
- </region>
-
- <!-- <block name="preprocessor" match="^#[azAZ_]\w*" innerClass="prepro"/> -->
- <region name="include" innerClass="prepro" start="/^[ \t]*#include/m" end="/(?&lt;!\\)$/m">
- <contains region="strdouble"/>
- <contains region="strincl"/>
- </region>
-
- <region name="preprocessor" delimClass="prepro" innerClass="code" start="/^[ \t]*#[ \t]*[a-z]+/mi" end="/(?&lt;!\\)$/m">
- <contains region="comment"/>
- <contains region="mlcomment"/>
- <contains region="strdouble"/>
- <contains region="brackets"/>
- <contains region="block"/>
- <contains block="identifier"/>
- <contains block="integer"/>
- <contains block="hexinteger"/>
- <contains block="octinteger"/>
- <contains block="float"/>
-
- </region>
-
- <block name="number" match="\d*\.?\d+" innerClass="number"/>
-
-
- <region name="mlcomment" innerClass="mlcomment" start="\/\*" end="\*\/" >
- <contains block="cvstag"/>
- </region>
-
- <block name="cvstag" match="\$\w+\s*:.+\$" innerClass="inlinedoc">
-
- <onlyin region="mlcomment"/>
- <onlyin region="comment"/>
- </block>
-
- <region name="comment" start="\/\/.+" end="/$/m" innerClass="comment" delimClass="comment">
- <contains block="cvstag"/>
- </region>
-
- <keywords name="reserved" inherits="identifier" innerClass="reserved" case="yes">
- <keyword match="and" />
- <keyword match="and_eq" />
- <keyword match="asm" />
-
- <keyword match="bitand" />
- <keyword match="bitor" />
- <keyword match="break" />
- <keyword match="case" />
- <keyword match="catch" />
- <keyword match="compl" />
-
- <keyword match="const_cast" />
- <keyword match="continue" />
- <keyword match="default" />
- <keyword match="delete" />
- <keyword match="do" />
- <keyword match="dynamic_cast" />
-
- <keyword match="else" />
- <keyword match="for" />
- <keyword match="fortran" />
- <keyword match="friend" />
- <keyword match="goto" />
- <keyword match="if" />
-
- <keyword match="new" />
- <keyword match="not" />
- <keyword match="not_eq" />
- <keyword match="operator" />
- <keyword match="or" />
- <keyword match="or_eq" />
-
- <keyword match="private" />
- <keyword match="protected" />
- <keyword match="public" />
- <keyword match="reinterpret_cast" />
- <keyword match="return" />
- <keyword match="sizeof" />
-
- <keyword match="static_cast" />
- <keyword match="switch" />
- <keyword match="this" />
- <keyword match="throw" />
- <keyword match="try" />
- <keyword match="typeid" />
-
- <keyword match="using" />
- <keyword match="while" />
- <keyword match="xor" />
- <keyword match="xor_eq" />
-
- <keyword match="false" />
- <keyword match="true" />
- </keywords>
-
- <keywords name="types" inherits="identifier" innerClass="types" case="yes">
-
- <keyword match="auto" />
- <keyword match="bool" />
- <keyword match="char" />
- <keyword match="class" />
- <keyword match="const" />
- <keyword match="double" />
-
- <keyword match="enum" />
- <keyword match="explicit" />
- <keyword match="export" />
- <keyword match="extern" />
- <keyword match="float" />
- <keyword match="inline" />
-
- <keyword match="int" />
- <keyword match="long" />
- <keyword match="mutable" />
- <keyword match="namespace" />
- <keyword match="register" />
- <keyword match="short" />
-
- <keyword match="signed" />
- <keyword match="static" />
- <keyword match="struct" />
- <keyword match="template" />
- <keyword match="typedef" />
- <keyword match="typename" />
-
- <keyword match="union" />
- <keyword match="unsigned" />
- <keyword match="virtual" />
- <keyword match="void" />
- <keyword match="volatile" />
- <keyword match="wchar_t" />
-
- </keywords>
-
- <keywords name="Common Macros" inherits="identifier" innerClass="prepro" case="yes">
- <keyword match="NULL" />
- <keyword match="TRUE" />
- <keyword match="FALSE" />
- <keyword match="MAX" />
-
- <keyword match="MIN" />
- <keyword match="__LINE__" />
- <keyword match="__DATA__" />
- <keyword match="__FILE__" />
- <keyword match="__TIME__" />
- <keyword match="__STDC__" />
-
- </keywords>
-
-
- <!--
- <keywords name="reserved" inherits="identifier" innerClass="reserved" case="yes">
- -->
-
-</highlight>
-
diff --git a/library/Text_Highlighter/css.xml b/library/Text_Highlighter/css.xml
deleted file mode 100644
index 2473bcfb7..000000000
--- a/library/Text_Highlighter/css.xml
+++ /dev/null
@@ -1,368 +0,0 @@
-<?xml version="1.0"?>
-<!-- $Id: css.xml,v 1.2 2008-01-01 23:45:07 ssttoo Exp $ -->
-
-<highlight lang="css" case="no">
-
- <authors>
- <author name="Andrey Demenev" email="demenev@gmail.com"/>
- </authors>
-
-
- <default innerClass="code" />
-
-
- <region name="mlcomment" innerClass="comment" start="\/\*" end="\*\/" >
-
- </region>
-
-
- <block name="atrule" match="(@[a-z\d]+)"
- innerClass="var" never-contained="yes"/>
-
- <region name="property" start="[a-z][a-z\d\-]*\s*:" end="(?=;|\})"
- innerClass="code" delimClass="reserved" contained="yes"/>
-
- <block name="selector" match="(((\.|#)?[a-z]+[a-z\d\-]*(?![a-z\d\-]))|(\*))(?!\s*:\s*[\s\{])"
- innerClass="identifier" >
- </block>
-
- <block name="pseudo" match=":[a-z][a-z\d\-]*"
- innerClass="special" />
-
- <block name="bescaped" match="\\[\\(\\)\\]"
- innerClass="string" contained="yes"/>
-
-
- <region name="paramselector" start="\[" end="\]" innerClass="code"
- delimClass="brackets" >
- <contains block="paramname" />
- <not-contains block="identifier" />
- <contains region="strdouble" />
- <contains region="strsingle" />
- </region>
-
- <region name="block" start="\{" end="\}" innerClass="code"
- delimClass="brackets" >
- <contains region="block" />
- <contains region="property" />
- <contains block="selector" />
- <contains region="mlcomment" />
- </region>
-
- <region name="brackets" start="\(" end="\)" innerClass="string"
- delimClass="brackets" contained="yes">
- <contains block="bescaped"/>
- </region>
-
- <region name="strsingle" delimClass="quotes" innerClass="string" start="'" end="'" contained="yes"/>
-
- <block name="escaped" match="\\\\|\\&quot;|\\'|\\`" innerClass="special" contained="yes">
- <onlyin region="strsingle"/>
- </block>
-
- <block name="descaped" match="\\\\|\\&quot;|\\'|\\`|\\t|\\n|\\r" innerClass="special" contained="yes">
- <onlyin region="strdouble"/>
- </block>
-
- <region name="strdouble" delimClass="quotes" innerClass="string"
- start="&quot;" end="&quot;" contained="yes" />
-
- <block name="measure" match="\d*\.?\d+(\%|em|ex|pc|pt|px|in|mm|cm)"
- innerClass="number" contained="yes">
- <onlyin region="property"/>
- <partClass index="1" innerClass="string" />
- </block>
-
- <block name="number" match="\d*\.?\d+" innerClass="number" contained="yes" >
- <onlyin region="property"/>
- </block>
-
- <block name="identifier" match="[a-z][a-z\d\-]*"
- innerClass="code" contained="yes">
- <onlyin region="property"/>
- </block>
-
- <block name="hexcolor" match="#([\da-f]{6}|[\da-f]{3})\b" innerClass="var" contained="yes">
- <onlyin region="property"/>
- </block>
-
- <block name="paramname" match="[\w\-\:]+" innerClass="var" contained="yes">
- <onlyin region="paramselector"/>
- </block>
-
- <keywords name="propertyValue" inherits="identifier" innerClass="string" case = "no">
- <word name="left-side"/>
- <keyword match="far-left"/>
- <keyword match="left"/>
- <keyword match="center-left"/>
- <keyword match="center-right"/>
- <keyword match="center"/>
- <keyword match="far-right"/>
- <keyword match="right-side"/>
- <keyword match="right"/>
- <keyword match="behind"/>
- <keyword match="leftwards"/>
- <keyword match="rightwards"/>
- <keyword match="inherit"/>
- <keyword match="scroll"/>
- <keyword match="fixed"/>
- <keyword match="transparent"/>
- <keyword match="none"/>
- <keyword match="repeat-x"/>
- <keyword match="repeat-y"/>
- <keyword match="repeat"/>
- <keyword match="no-repeat"/>
- <keyword match="collapse"/>
- <keyword match="separate"/>
- <keyword match="auto"/>
- <keyword match="top"/>
- <keyword match="bottom"/>
- <keyword match="both"/>
- <keyword match="open-quote"/>
- <keyword match="close-quote"/>
- <keyword match="no-open-quote"/>
- <keyword match="no-close-quote"/>
- <keyword match="crosshair"/>
- <keyword match="default"/>
- <keyword match="pointer"/>
- <keyword match="move"/>
- <keyword match="e-resize"/>
- <keyword match="ne-resize"/>
- <keyword match="nw-resize"/>
- <keyword match="n-resize"/>
- <keyword match="se-resize"/>
- <keyword match="sw-resize"/>
- <keyword match="s-resize"/>
- <keyword match="text"/>
- <keyword match="wait"/>
- <keyword match="help"/>
- <keyword match="ltr"/>
- <keyword match="rtl"/>
- <keyword match="inline"/>
- <keyword match="block"/>
- <keyword match="list-item"/>
- <keyword match="run-in"/>
- <keyword match="compact"/>
- <keyword match="marker"/>
- <keyword match="table"/>
- <keyword match="inline-table"/>
- <keyword match="table-row-group"/>
- <keyword match="table-header-group"/>
- <keyword match="table-footer-group"/>
- <keyword match="table-row"/>
- <keyword match="table-column-group"/>
- <keyword match="table-column"/>
- <keyword match="table-cell"/>
- <keyword match="table-caption"/>
- <keyword match="below"/>
- <keyword match="level"/>
- <keyword match="above"/>
- <keyword match="higher"/>
- <keyword match="lower"/>
- <keyword match="show"/>
- <keyword match="hide"/>
- <keyword match="caption"/>
- <keyword match="icon"/>
- <keyword match="menu"/>
- <keyword match="message-box"/>
- <keyword match="small-caption"/>
- <keyword match="status-bar"/>
- <keyword match="normal"/>
- <keyword match="wider"/>
- <keyword match="narrower"/>
- <keyword match="ultra-condensed"/>
- <keyword match="extra-condensed"/>
- <keyword match="condensed"/>
- <keyword match="semi-condensed"/>
- <keyword match="semi-expanded"/>
- <keyword match="expanded"/>
- <keyword match="extra-expanded"/>
- <keyword match="ultra-expanded"/>
- <keyword match="italic"/>
- <keyword match="oblique"/>
- <keyword match="small-caps"/>
- <keyword match="bold"/>
- <keyword match="bolder"/>
- <keyword match="lighter"/>
- <keyword match="inside"/>
- <keyword match="outside"/>
- <keyword match="disc"/>
- <keyword match="circle"/>
- <keyword match="square"/>
- <keyword match="decimal"/>
- <keyword match="decimal-leading-zero"/>
- <keyword match="lower-roman"/>
- <keyword match="upper-roman"/>
- <keyword match="lower-greek"/>
- <keyword match="lower-alpha"/>
- <keyword match="lower-latin"/>
- <keyword match="upper-alpha"/>
- <keyword match="upper-latin"/>
- <keyword match="hebrew"/>
- <keyword match="armenian"/>
- <keyword match="georgian"/>
- <keyword match="cjk-ideographic"/>
- <keyword match="hiragana"/>
- <keyword match="katakana"/>
- <keyword match="hiragana-iroha"/>
- <keyword match="katakana-iroha"/>
- <keyword match="crop"/>
- <keyword match="cross"/>
- <keyword match="invert"/>
- <keyword match="visible"/>
- <keyword match="hidden"/>
- <keyword match="always"/>
- <keyword match="avoid"/>
- <keyword match="x-low"/>
- <keyword match="low"/>
- <keyword match="medium"/>
- <keyword match="high"/>
- <keyword match="x-high"/>
- <keyword match="mix?"/>
- <keyword match="repeat?"/>
- <keyword match="static"/>
- <keyword match="relative"/>
- <keyword match="absolute"/>
- <keyword match="portrait"/>
- <keyword match="landscape"/>
- <keyword match="spell-out"/>
- <keyword match="once"/>
- <keyword match="digits"/>
- <keyword match="continuous"/>
- <keyword match="code"/>
- <keyword match="x-slow"/>
- <keyword match="slow"/>
- <keyword match="fast"/>
- <keyword match="x-fast"/>
- <keyword match="faster"/>
- <keyword match="slower"/>
- <keyword match="justify"/>
- <keyword match="underline"/>
- <keyword match="overline"/>
- <keyword match="line-through"/>
- <keyword match="blink"/>
- <keyword match="capitalize"/>
- <keyword match="uppercase"/>
- <keyword match="lowercase"/>
- <keyword match="embed"/>
- <keyword match="bidi-override"/>
- <keyword match="baseline"/>
- <keyword match="sub"/>
- <keyword match="super"/>
- <keyword match="text-top"/>
- <keyword match="middle"/>
- <keyword match="text-bottom"/>
- <keyword match="silent"/>
- <keyword match="x-soft"/>
- <keyword match="soft"/>
- <keyword match="loud"/>
- <keyword match="x-loud"/>
- <keyword match="pre"/>
- <keyword match="nowrap"/>
- <keyword match="serif"/>
- <keyword match="sans-serif"/>
- <keyword match="cursive"/>
- <keyword match="fantasy"/>
- <keyword match="monospace"/>
- <keyword match="empty"/>
- <keyword match="string"/>
- <keyword match="strict"/>
- <keyword match="loose"/>
- <keyword match="char"/>
- <keyword match="true"/>
- <keyword match="false"/>
- <keyword match="dotted"/>
- <keyword match="dashed"/>
- <keyword match="solid"/>
- <keyword match="double"/>
- <keyword match="groove"/>
- <keyword match="ridge"/>
- <keyword match="inset"/>
- <keyword match="outset"/>
- <keyword match="larger"/>
- <keyword match="smaller"/>
- <keyword match="xx-small"/>
- <keyword match="x-small"/>
- <keyword match="small"/>
- <keyword match="large"/>
- <keyword match="x-large"/>
- <keyword match="xx-large"/>
- <keyword match="all"/>
- <keyword match="newspaper"/>
- <keyword match="distribute"/>
- <keyword match="distribute-all-lines"/>
- <keyword match="distribute-center-last"/>
- <keyword match="inter-word"/>
- <keyword match="inter-ideograph"/>
- <keyword match="inter-cluster"/>
- <keyword match="kashida"/>
- <keyword match="ideograph-alpha"/>
- <keyword match="ideograph-numeric"/>
- <keyword match="ideograph-parenthesis"/>
- <keyword match="ideograph-space"/>
- <keyword match="keep-all"/>
- <keyword match="break-all"/>
- <keyword match="break-word"/>
- <keyword match="lr-tb"/>
- <keyword match="tb-rl"/>
- <keyword match="thin"/>
- <keyword match="thick"/>
- <keyword match="inline-block"/>
- <keyword match="w-resize"/>
- <keyword match="hand"/>
- <keyword match="distribute-letter"/>
- <keyword match="distribute-space"/>
- <keyword match="whitespace"/>
- <keyword match="male"/>
- <keyword match="female"/>
- <keyword match="child"/>
- </keywords>
-
-
- <keywords name="namedcolor" inherits="identifier" innerClass="var" case = "no">
- <keyword match="aqua"/>
- <keyword match="black"/>
- <keyword match="blue"/>
- <keyword match="fuchsia"/>
- <keyword match="gray"/>
- <keyword match="green"/>
- <keyword match="lime"/>
- <keyword match="maroon"/>
- <keyword match="navy"/>
- <keyword match="olive"/>
- <keyword match="purple"/>
- <keyword match="red"/>
- <keyword match="silver"/>
- <keyword match="teal"/>
- <keyword match="white"/>
- <keyword match="yellow"/>
- <keyword match="ActiveBorder"/>
- <keyword match="ActiveCaption"/>
- <keyword match="AppWorkspace"/>
- <keyword match="Background"/>
- <keyword match="ButtonFace"/>
- <keyword match="ButtonHighlight"/>
- <keyword match="ButtonShadow"/>
- <keyword match="ButtonText"/>
- <keyword match="CaptionText"/>
- <keyword match="GrayText"/>
- <keyword match="Highlight"/>
- <keyword match="HighlightText"/>
- <keyword match="InactiveBorder"/>
- <keyword match="InactiveCaption"/>
- <keyword match="InactiveCaptionText"/>
- <keyword match="InfoBackground"/>
- <keyword match="InfoText"/>
- <keyword match="Menu"/>
- <keyword match="MenuText"/>
- <keyword match="Scrollbar"/>
- <keyword match="ThreeDDarkShadow"/>
- <keyword match="ThreeDFace"/>
- <keyword match="ThreeDHighlight"/>
- <keyword match="ThreeDLightShadow"/>
- <keyword match="ThreeDShadow"/>
- <keyword match="Window"/>
- <keyword match="WindowFrame"/>
- <keyword match="WindowText"/>
- </keywords>
-</highlight>
diff --git a/library/Text_Highlighter/diff.xml b/library/Text_Highlighter/diff.xml
deleted file mode 100644
index d088f9257..000000000
--- a/library/Text_Highlighter/diff.xml
+++ /dev/null
@@ -1,45 +0,0 @@
-<?xml version="1.0"?>
-<!-- $Id: diff.xml,v 1.1 2007-06-03 02:35:28 ssttoo Exp $ -->
-
-<highlight lang="diff" case="yes">
-
- <authors>
- <author name="Andrey Demenev" email="demenev@gmail.com"/>
- </authors>
-
-
- <default innerClass="default" />
-
- <block name="noNewLine" match="/^\\\sNo\snewline.+$/m" innerClass="special"/>
-
- <block name="diffSeparator" match="/^\-\-\-$/m" innerClass="code"/>
-
- <block name="diffCmdLine" match="/^(diff\s+\-|Only\s+|Index).*$/m" innerClass="var"/>
- <block name="diffFiles" match="/^(\-\-\-|\+\+\+)\s.+$/m" innerClass="reserved"/>
-
- <block name="contextOrg" match="/^\*.*$/m" innerClass="quotes"/>
- <block name="contextNew" match="/^\+.*$/m" innerClass="string"/>
- <block name="contextChg" match="/^!.*$/m" innerClass="inlinedoc"/>
-
- <block name="defOrg" match="/^\&lt;\s.*$/m" innerClass="quotes"/>
- <block name="defNew" match="/^\&gt;\s.*$/m" innerClass="string"/>
- <block name="defChg" match="/^\d+(\,\d+)?[acd]\d+(,\d+)?$/m" innerClass="code"/>
-
- <block name="uniOrg" match="/^\-.*$/m" innerClass="quotes"/>
- <block name="uniNew" match="/^\+.*$/m" innerClass="string"/>
- <block name="uniChg" match="/^@@.+@@$/m" innerClass="code"/>
-
- <block name="normOrg" match="/^d\d+\s\d+$/m" innerClass="code"/>
- <region name="normNew" start="/^a\d+\s\d+$/m" end="/(?=^[ad]\d+\s\d+)/m" innerClass="var" delimClass="code"/>
-
- <region name="edNew" start="/^(\d+)(,\d+)?(a)$/m" end="/^(\.)$/m" innerClass="string" delimClass="code"/>
- <region name="edChg" start="/^(\d+)(,\d+)?(c)$/m" end="/^(\.)$/m" innerClass="inlinedoc" delimClass="code"/>
- <block name="edDel" match="/^(\d+)(,\d+)?(d)$/m" innerClass="code"/>
-
- <region name="fedNew" start="/^a(\d+)(\s\d+)?$/m" end="/^(\.)$/m" innerClass="string" delimClass="code"/>
- <region name="fedChg" start="/^c(\d+)(\s\d+)?$/m" end="/^(\.)$/m" innerClass="inlinedoc" delimClass="code"/>
- <block name="fedDel" match="/^d(\d+)(\s\d+)?$/m"
- innerClass="code"/>
-
-
-</highlight>
diff --git a/library/Text_Highlighter/dtd.xml b/library/Text_Highlighter/dtd.xml
deleted file mode 100644
index 18fa07db7..000000000
--- a/library/Text_Highlighter/dtd.xml
+++ /dev/null
@@ -1,66 +0,0 @@
-<?xml version="1.0"?>
-<!-- $Id: dtd.xml,v 1.1 2007-06-03 02:35:28 ssttoo Exp $ -->
-
-<highlight lang="dtd" case="yes">
-
- <authors>
- <author name="Andrey Demenev" email="demenev@gmail.com"/>
- </authors>
-
-
- <default innerClass="code" />
-
- <region name="comment" delimClass="comment" innerClass="comment"
- start="\&lt;!--" end="--\&gt;">
- </region>
-
- <region name="redecl" start="\&lt;\!\[" end="\]\]\&gt;" delimClass="brackets"
- innerClass="code" never-contained="yes">
- <contains all="yes" />
- </region>
-
- <region name="tag" start="\&lt;" end="\&gt;" delimClass="brackets"
- innerClass="code" >
- <contains all="yes" />
- <onlyin region="redecl"/>
- </region>
-
- <region name="brackets" start="\(" end="\)" delimClass="brackets"
- innerClass="code" contained="yes">
- <onlyin region="tag"/>
- <onlyin region="brackets"/>
- <contains block="entity" />
- <contains block="identifier" />
- </region>
-
- <region name="strsingle" start="'" end="'" delimClass="quotes"
- innerClass="string" contained="yes">
- <onlyin region="tag"/>
- <contains block="entity" />
- </region>
-
- <region name="strdouble" start="&quot;" end="&quot;" delimClass="quotes"
- innerClass="string" contained="yes">
- <onlyin region="tag"/>
- <contains block="entity" />
- </region>
-
- <block name="tagname" match="(?&lt;=\&lt;)!(ENTITY|ATTLIST|ELEMENT|NOTATION)\b"
- innerClass="var" contained="yes">
- <onlyin region="tag"/>
- </block>
-
- <block name="reserved" match="\s(#(IMPLIED|REQUIRED|FIXED))|CDATA|ENTITY|NOTATION|NMTOKENS?|PUBLIC|SYSTEM\b"
- innerClass="reserved" contained="yes">
- <onlyin region="tag"/>
- </block>
-
- <block name="pcdata" match="#PCDATA\b"
- innerClass="reserved" contained="yes" />
-
- <block name="entity" match="(\&amp;|\%)[\w\-\.]+;" innerClass="special" />
-
- <block name="identifier" match="[a-z][a-z\d\-\,:]+"
- innerClass="identifier" contained="yes" case="no"/>
-
-</highlight>
diff --git a/library/Text_Highlighter/generate b/library/Text_Highlighter/generate
deleted file mode 100644
index 4e22e82fd..000000000
--- a/library/Text_Highlighter/generate
+++ /dev/null
@@ -1,171 +0,0 @@
-#!@php_bin@
-<?php
-/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
-/**
- * Console highlighter class generator
- *
- * PHP versions 4 and 5
- *
- * LICENSE: This source file is subject to version 3.0 of the PHP license
- * that is available through the world-wide-web at the following URI:
- * http://www.php.net/license/3_0.txt. If you did not receive a copy of
- * the PHP License and are unable to obtain it through the web, please
- * send a note to license@php.net so we can mail you a copy immediately.
- *
- * @category Text
- * @package Text_Highlighter
- * @author Andrey Demenev <demenev@gmail.com>
- * @copyright 2004 Andrey Demenev
- * @license http://www.php.net/license/3_0.txt PHP License
- * @version CVS: $Id$
- * @link http://pear.php.net/package/Text_Highlighter
- */
-
-require_once 'Text/Highlighter/Generator.php';
-require_once 'Console/Getopt.php';
-
-$options = Console_Getopt::getopt($argv, 'x:p:d:h', array('xml=', 'php=','dir=', 'help'));
-
-if (PEAR::isError($options)) {
- $message = str_replace('Console_Getopt: ','',$options->message);
- usage($message);
-}
-
-$source = array();
-$dest = array();
-$dir = '';
-
-$expectp = false;
-$expectx = false;
-$unexpectedx = false;
-$unexpectedp = false;
-$si = $di = 0;
-
-foreach ($options[0] as $option) {
- switch ($option[0]) {
- case 'x':
- case '--xml':
- $source[$si] = $option[1];
- if ($si) {
- $di++;
- }
- $si++;
- if ($expectp) {
- $unexpectedx = true;
- }
- $expectp = true;
- $expectx = false;
- break;
-
- case 'p':
- case '--php':
- if ($expectx) {
- $unexpectedp = true;
- }
- $dest[$di] = $option[1];
- $expectp = false;
- $expectx = true;
- break;
-
- case 'd':
- case '--dir':
- $dir = $option[1];
- break;
-
- case 'h':
- case '--help':
- usage();
- break;
- }
-}
-
-
-if ($unexpectedx && !$dir) {
- usage('Unexpected -x or --xml', STDERR);
-}
-
-if ($unexpectedp) {
- usage('Unexpected -p or --php', STDERR);
-}
-
-$nsource = count($source);
-$ndest = count($dest);
-
-if (!$nsource && !$ndest) {
- $source[]='php://stdin';
- if (!$dir) {
- $dest[]='php://stdout';
- } else {
- $dest[] = null;
- }
-} elseif ($expectp && !$dir && $nsource > 1) {
- usage('-x or --xml without following -p or --php', STDERR);
-} elseif ($nsource == 1 && !$ndest && !$dir) {
- $dest[]='php://stdout';
-}
-
-if ($dir && substr($dir,-1)!='/' && substr($dir,-1)!=='\\' ) {
- $dir .= DIRECTORY_SEPARATOR;
-}
-
-
-foreach ($source as $i => $xmlfile)
-{
- $gen = new Text_Highlighter_Generator;
- $gen->setInputFile($xmlfile);
- if ($gen->hasErrors()) {
- break;
- }
- $gen->generate();
- if ($gen->hasErrors()) {
- break;
- }
- if (isset($dest[$i])) {
- $phpfile = $dest[$i];
- } else {
- $phpfile = $dir . $gen->language . '.php';
- }
- $gen->saveCode($phpfile);
- if ($gen->hasErrors()) {
- break;
- }
-}
-if ($gen->hasErrors()) {
- $errors = $gen->getErrors();
- foreach ($errors as $error) {
- fwrite (STDERR, $error . "\n");
- }
- exit(1);
-}
-
-function usage($message='', $file=STDOUT)
-{
- $code = 0;
- if ($message) {
- $message .= "\n\n";
- $code = 1;
- }
- $message .= <<<MSG
-Generates a highlighter class from XML source
-Usage:
-generate options
-
-Options:
- -x filename, --xml=filename
- source XML file. Multiple input files can be specified, in which
- case each -x option must be followed by -p unless -d is specified
- Defaults to stdin
- -p filename, --php=filename
- destination PHP file. Defaults to stdout. If specied multiple times,
- each -p must follow -x
- -d dirname, --dir=dirname
- Default destination directory. File names will be taken from XML input
- ("lang" attribute of <highlight> tag)
- -h, --help
- This help
-MSG;
- fwrite ($file, $message);
- exit($code);
-}
-?>
-
diff --git a/library/Text_Highlighter/generate.bat b/library/Text_Highlighter/generate.bat
deleted file mode 100644
index 3960486c1..000000000
--- a/library/Text_Highlighter/generate.bat
+++ /dev/null
@@ -1,188 +0,0 @@
-@echo off
-rem vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4:
-
-rem Console highlighter class generator
-
-rem PHP versions 4 and 5
-
-rem LICENSE: This source file is subject to version 3.0 of the PHP license
-rem that is available through the world-wide-web at the following URI:
-rem http://www.php.net/license/3_0.txt. If you did not receive a copy of
-rem the PHP License and are unable to obtain it through the web, please
-rem send a note to license@php.net so we can mail you a copy immediately.
-
-rem @category Text
-rem @package Text_Highlighter
-rem @author Andrey Demenev <demenev@gmail.com>
-rem @copyright 2004 Andrey Demenev
-rem @license http://www.php.net/license/3_0.txt PHP License
-rem @version CVS: $Id: generate.bat,v 1.1 2007-06-03 02:35:28 ssttoo Exp $
-rem @link http://pear.php.net/package/Text_Highlighter
-
-set "MHL_PARAMS="
-:doshift
-set "MHL_PARAMS=%MHL_PARAMS% %1"
-shift
-if -%1- == -- GOTO noshift
-GOTO doshift
-:noshift
-@php_bin@ -q -d output_buffering=1 -d include_path="@php_dir@" @bin_dir@/Text/Highlighter/generate.bat %MHL_PARAMS%
-
-GOTO finish
-<?php
-ob_end_clean();
-
-if (!defined('STDOUT')) {
- define('STDOUT', fopen('php://stdout', 'wb'));
- define('STDERR', fopen('php://stderr', 'wb'));
-}
-require_once 'Text/Highlighter/Generator.php';
-require_once 'Console/Getopt.php';
-
-$options = Console_Getopt::getopt($argv, 'x:p:d:h', array('xml=', 'php=','dir=', 'help'));
-
-if (PEAR::isError($options)) {
- $message = str_replace('Console_Getopt: ','',$options->message);
- usage($message);
-}
-
-$source = array();
-$dest = array();
-$dir = '';
-
-$expectp = false;
-$expectx = false;
-$unexpectedx = false;
-$unexpectedp = false;
-$si = $di = 0;
-
-foreach ($options[0] as $option) {
- switch ($option[0]) {
- case 'x':
- case '--xml':
- $source[$si] = $option[1];
- if ($si) {
- $di++;
- }
- $si++;
- if ($expectp) {
- $unexpectedx = true;
- }
- $expectp = true;
- $expectx = false;
- break;
-
- case 'p':
- case '--php':
- if ($expectx) {
- $unexpectedp = true;
- }
- $dest[$di] = $option[1];
- $expectp = false;
- $expectx = true;
- break;
-
- case 'd':
- case '--dir':
- $dir = $option[1];
- break;
-
- case 'h':
- case '--help':
- usage();
- break;
- }
-}
-
-
-if ($unexpectedx && !$dir) {
- usage('Unexpected -x or --xml', STDERR);
-}
-
-if ($unexpectedp) {
- usage('Unexpected -p or --php', STDERR);
-}
-
-$nsource = count($source);
-$ndest = count($dest);
-
-if (!$nsource && !$ndest) {
- $source[]='php://stdin';
- if (!$dir) {
- $dest[]='php://stdout';
- } else {
- $dest[] = null;
- }
-} elseif ($expectp && !$dir && $nsource > 1) {
- usage('-x or --xml without following -p or --php', STDERR);
-} elseif ($nsource == 1 && !$ndest && !$dir) {
- $dest[]='php://stdout';
-}
-
-if ($dir && substr($dir,-1)!='/' && substr($dir,-1)!=='\\' ) {
- $dir .= DIRECTORY_SEPARATOR;
-}
-
-
-foreach ($source as $i => $xmlfile)
-{
- $gen = new Text_Highlighter_Generator;
- $gen->setInputFile($xmlfile);
- if ($gen->hasErrors()) {
- break;
- }
- $gen->generate();
- if ($gen->hasErrors()) {
- break;
- }
- if (isset($dest[$i])) {
- $phpfile = $dest[$i];
- } else {
- $phpfile = $dir . $gen->language . '.php';
- }
- $gen->saveCode($phpfile);
- if ($gen->hasErrors()) {
- break;
- }
-}
-if ($gen->hasErrors()) {
- $errors = $gen->getErrors();
- foreach ($errors as $error) {
- fwrite (STDERR, $error . "\n");
- }
- exit(1);
-}
-
-exit(0);
-
-function usage($message='', $file=STDOUT)
-{
- $code = 0;
- if ($message) {
- $message .= "\n\n";
- $code = 1;
- }
- $message .= <<<MSG
-Generates a highlighter class from XML source
-Usage:
-generate options
-
-Options:
- -x filename, --xml=filename
- source XML file. Multiple input files can be specified, in which
- case each -x option must be followed by -p unless -d is specified
- Defaults to stdin
- -p filename, --php=filename
- destination PHP file. Defaults to stdout. If specied multiple times,
- each -p must follow -x
- -d dirname, --dir=dirname
- Default destination directory. File names will be taken from XML input
- ("lang" attribute of <highlight> tag)
- -h, --help
- This help
-MSG;
- fwrite ($file, $message);
- exit($code);
-}
-?>
-:finish
diff --git a/library/Text_Highlighter/html.xml b/library/Text_Highlighter/html.xml
deleted file mode 100644
index 58d51fc5b..000000000
--- a/library/Text_Highlighter/html.xml
+++ /dev/null
@@ -1,33 +0,0 @@
-<?xml version="1.0"?>
-<!-- $Id: html.xml,v 1.1 2007-06-03 02:35:28 ssttoo Exp $ -->
-
-<highlight lang="html" case="no">
-
- <authors>
- <author name="Andrey Demenev" email="demenev@gmail.com"/>
- </authors>
-
-
- <default innerClass="code" />
-
- <region name="comment" delimClass="comment" innerClass="comment"
- start="\&lt;!--" end="--\&gt;">
- </region>
-
- <region name="tag" delimClass="brackets" innerClass="code" start="\&lt;[\?\/]?" end="[\/\?]?\&gt;">
- <contains block="tagname"/>
- <contains region="param"/>
- <contains block="paramname"/>
- </region>
-
- <block name="tagname" match="(?&lt;=[\&lt;\/?])[\w\-\:]+" innerClass="reserved" contained="yes"/>
-
- <block name="paramname" match="[\w\-\:]+" innerClass="var" contained="yes"/>
-
- <block name="entity" match="(&amp;)[\w\-\.]+;" innerClass="special" />
-
- <region name="param" start="&quot;" end="&quot;" delimClass="quotes" innerClass="string" contained="yes">
- <contains block="entity"/>
- </region>
-
-</highlight>
diff --git a/library/Text_Highlighter/java.xml b/library/Text_Highlighter/java.xml
deleted file mode 100644
index 12052b5db..000000000
--- a/library/Text_Highlighter/java.xml
+++ /dev/null
@@ -1,2824 +0,0 @@
-<?xml version="1.0"?>
-<!-- $Id: java.xml,v 1.1 2007-06-03 02:35:28 ssttoo Exp $ -->
-
-<highlight lang="java">
-
- <authors>
- <author name="Andrey Demenev" email ="demenev@gmail.com"/>
- </authors>
-
- <default innerClass="code" />
-
- <region name="block" delimClass="brackets" innerClass="code" start="\{" end="\}">
- <contains all="yes"/>
- </region>
-
- <region name="brackets" delimClass="brackets" innerClass="code" start="\(" end="\)" >
- <contains all="yes"/>
- </region>
-
- <region name="sqbrackets" delimClass="brackets" innerClass="code" start="\[" end="\]">
- <contains all="yes"/>
- </region>
-
-
- <region name="mlcomment" innerClass="comment" start="\/\*" end="\*\/">
- <contains block="javadoc"/>
- <contains block="cvstag"/>
- </region>
-
- <region name="strdouble" delimClass="quotes" innerClass="string" start="&quot;" end="&quot;" />
-
- <region name="strsingle" delimClass="quotes" innerClass="string" start="'" end="'"/>
-
- <block name="escaped" match="\\." innerClass="special" contained="yes">
- <onlyin region="strsingle"/>
- </block>
-
- <block name="descaped" match="\\[\\&quot;'`tnr\$\{]" innerClass="special" contained="yes">
- <onlyin region="strdouble"/>
- </block>
-
-
- <region name="comment" start="\/\/" end="/$/m" innerClass="comment">
- <contains block="cvstag"/>
- </region>
-
- <block name="identifier" match="[a-z_]\w*" innerClass="identifier" />
-
- <block name="hexinteger" match="0[xX][\da-f]+" innerClass="number" />
- <block name="integer" match="\d\d*|\b0\b" innerClass="number" />
- <block name="octinteger" match="0[0-7]+" innerClass="number" />
- <block name="float" match="(\d*\.\d+)|(\d+\.\d*)" innerClass="number" />
- <block name="exponent"
- match="((\d+|((\d*\.\d+)|(\d+\.\d*)))[eE][+-]?\d+)"
- innerClass="number" />
-
- <block name="javadoc" match="\s@\w+\s" innerClass="inlinedoc" contained="yes">
- <onlyin region="mlcomment"/>
- <onlyin region="comment"/>
- </block>
-
- <block name="url" match="((https?|ftp):\/\/[\w\?\.\-\&amp;=\/%+]+)|(^|[\s,!?])www\.\w+\.\w+[\w\?\.\&amp;=\/%+]*" innerClass="url" contained="yes">
- <onlyin region="mlcomment"/>
- <onlyin region="comment"/>
- </block>
-
- <block name="email" match="\w+[\.\w\-]+@(\w+[\.\w\-])+" innerClass="url" contained="yes">
- <onlyin region="mlcomment"/>
- <onlyin region="comment"/>
- </block>
-
- <block name="note" match="\bnote:" innerClass="inlinedoc" contained="yes">
- <onlyin region="mlcomment"/>
- <onlyin region="comment"/>
- </block>
-
-
- <block name="cvstag" match="\$\w+\s*:.*\$" innerClass="inlinedoc" contained="yes">
- <onlyin region="mlcomment"/>
- <onlyin region="comment"/>
- </block>
-
- <keywords name="types" inherits="identifier" innerClass="types" case = "yes">
- <keyword match="boolean" />
- <keyword match="byte" />
- <keyword match="char" />
- <keyword match="const" />
- <keyword match="double" />
- <keyword match="final" />
- <keyword match="float" />
- <keyword match="int" />
- <keyword match="long" />
- <keyword match="short" />
- <keyword match="static" />
- <keyword match="void" />
- </keywords>
-
- <keywords name="reserved" inherits="identifier" innerClass="reserved" case="yes">
- <keyword match="import"/>
- <keyword match="package"/>
- <keyword match="abstract" />
- <keyword match="break" />
- <keyword match="case" />
- <keyword match="catch" />
- <keyword match="class" />
- <keyword match="continue" />
- <keyword match="default" />
- <keyword match="do" />
- <keyword match="else" />
- <keyword match="extends" />
- <keyword match="false" />
- <keyword match="finally" />
- <keyword match="for" />
- <keyword match="goto" />
- <keyword match="if" />
- <keyword match="implements" />
- <keyword match="instanceof" />
- <keyword match="interface" />
- <keyword match="native" />
- <keyword match="new" />
- <keyword match="null" />
- <keyword match="private" />
- <keyword match="protected" />
- <keyword match="public" />
- <keyword match="return" />
- <keyword match="super" />
- <keyword match="strictfp" />
- <keyword match="switch" />
- <keyword match="synchronized" />
- <keyword match="this" />
- <keyword match="throws" />
- <keyword match="throw" />
- <keyword match="transient" />
- <keyword match="true" />
- <keyword match="try" />
- <keyword match="volatile" />
- <keyword match="while" />
- </keywords>
-
- <keywords name="builtin" inherits="identifier" innerClass="builtin" case = "yes" ifdef="java.builtins">
- <keyword match="AbstractAction" />
- <keyword match="AbstractBorder" />
- <keyword match="AbstractButton" />
- <keyword match="AbstractCellEditor" />
- <keyword match="AbstractCollection" />
- <keyword match="AbstractColorChooserPanel" />
- <keyword match="AbstractDocument" />
- <keyword match="AbstractInterruptibleChannel" />
- <keyword match="AbstractLayoutCache" />
- <keyword match="AbstractList" />
- <keyword match="AbstractListModel" />
- <keyword match="AbstractMap" />
- <keyword match="AbstractMethodError" />
- <keyword match="AbstractPreferences" />
- <keyword match="AbstractSelectableChannel" />
- <keyword match="AbstractSelectionKey" />
- <keyword match="AbstractSelector" />
- <keyword match="AbstractSequentialList" />
- <keyword match="AbstractSet" />
- <keyword match="AbstractSpinnerModel" />
- <keyword match="AbstractTableModel" />
- <keyword match="AbstractUndoableEdit" />
- <keyword match="AbstractWriter" />
- <keyword match="AccessControlContext" />
- <keyword match="AccessControlException" />
- <keyword match="AccessController" />
- <keyword match="AccessException" />
- <keyword match="Accessible" />
- <keyword match="AccessibleAction" />
- <keyword match="AccessibleBundle" />
- <keyword match="AccessibleComponent" />
- <keyword match="AccessibleContext" />
- <keyword match="AccessibleEditableText" />
- <keyword match="AccessibleExtendedComponent" />
- <keyword match="AccessibleExtendedTable" />
- <keyword match="AccessibleHyperlink" />
- <keyword match="AccessibleHypertext" />
- <keyword match="AccessibleIcon" />
- <keyword match="AccessibleKeyBinding" />
- <keyword match="AccessibleObject" />
- <keyword match="AccessibleRelation" />
- <keyword match="AccessibleRelationSet" />
- <keyword match="AccessibleResourceBundle" />
- <keyword match="AccessibleRole" />
- <keyword match="AccessibleSelection" />
- <keyword match="AccessibleState" />
- <keyword match="AccessibleStateSet" />
- <keyword match="AccessibleTable" />
- <keyword match="AccessibleTableModelChange" />
- <keyword match="AccessibleText" />
- <keyword match="AccessibleValue" />
- <keyword match="AccountExpiredException" />
- <keyword match="Acl" />
- <keyword match="AclEntry" />
- <keyword match="AclNotFoundException" />
- <keyword match="Action" />
- <keyword match="ActionEvent" />
- <keyword match="ActionListener" />
- <keyword match="ActionMap" />
- <keyword match="ActionMapUIResource" />
- <keyword match="Activatable" />
- <keyword match="ActivateFailedException" />
- <keyword match="ActivationDesc" />
- <keyword match="ActivationException" />
- <keyword match="ActivationGroup" />
- <keyword match="ActivationGroup_Stub" />
- <keyword match="ActivationGroupDesc" />
- <keyword match="ActivationGroupID" />
- <keyword match="ActivationID" />
- <keyword match="ActivationInstantiator" />
- <keyword match="ActivationMonitor" />
- <keyword match="ActivationSystem" />
- <keyword match="Activator" />
- <keyword match="ActiveEvent" />
- <keyword match="AdapterActivator" />
- <keyword match="AdapterActivatorOperations" />
- <keyword match="AdapterAlreadyExists" />
- <keyword match="AdapterAlreadyExistsHelper" />
- <keyword match="AdapterInactive" />
- <keyword match="AdapterInactiveHelper" />
- <keyword match="AdapterNonExistent" />
- <keyword match="AdapterNonExistentHelper" />
- <keyword match="AddressHelper" />
- <keyword match="Adjustable" />
- <keyword match="AdjustmentEvent" />
- <keyword match="AdjustmentListener" />
- <keyword match="Adler32" />
- <keyword match="AffineTransform" />
- <keyword match="AffineTransformOp" />
- <keyword match="AlgorithmParameterGenerator" />
- <keyword match="AlgorithmParameterGeneratorSpi" />
- <keyword match="AlgorithmParameters" />
- <keyword match="AlgorithmParameterSpec" />
- <keyword match="AlgorithmParametersSpi" />
- <keyword match="AllPermission" />
- <keyword match="AlphaComposite" />
- <keyword match="AlreadyBound" />
- <keyword match="AlreadyBoundException" />
- <keyword match="AlreadyBoundHelper" />
- <keyword match="AlreadyBoundHolder" />
- <keyword match="AlreadyConnectedException" />
- <keyword match="AncestorEvent" />
- <keyword match="AncestorListener" />
- <keyword match="Annotation" />
- <keyword match="Any" />
- <keyword match="AnyHolder" />
- <keyword match="AnySeqHelper" />
- <keyword match="AnySeqHelper" />
- <keyword match="AnySeqHolder" />
- <keyword match="AppConfigurationEntry" />
- <keyword match="Applet" />
- <keyword match="AppletContext" />
- <keyword match="AppletInitializer" />
- <keyword match="AppletStub" />
- <keyword match="ApplicationException" />
- <keyword match="Arc2D" />
- <keyword match="Area" />
- <keyword match="AreaAveragingScaleFilter" />
- <keyword match="ARG_IN" />
- <keyword match="ARG_INOUT" />
- <keyword match="ARG_OUT" />
- <keyword match="ArithmeticException" />
- <keyword match="Array" />
- <keyword match="Array" />
- <keyword match="ArrayIndexOutOfBoundsException" />
- <keyword match="ArrayList" />
- <keyword match="Arrays" />
- <keyword match="ArrayStoreException" />
- <keyword match="AssertionError" />
- <keyword match="AsyncBoxView" />
- <keyword match="AsynchronousCloseException" />
- <keyword match="Attr" />
- <keyword match="Attribute" />
- <keyword match="Attribute" />
- <keyword match="AttributedCharacterIterator" />
- <keyword match="AttributedString" />
- <keyword match="AttributeException" />
- <keyword match="AttributeInUseException" />
- <keyword match="AttributeList" />
- <keyword match="AttributeList" />
- <keyword match="AttributeListImpl" />
- <keyword match="AttributeModificationException" />
- <keyword match="Attributes" />
- <keyword match="Attributes" />
- <keyword match="Attributes" />
- <keyword match="AttributeSet" />
- <keyword match="AttributeSet" />
- <keyword match="AttributeSetUtilities" />
- <keyword match="AttributesImpl" />
- <keyword match="AudioClip" />
- <keyword match="AudioFileFormat" />
- <keyword match="AudioFileReader" />
- <keyword match="AudioFileWriter" />
- <keyword match="AudioFormat" />
- <keyword match="AudioInputStream" />
- <keyword match="AudioPermission" />
- <keyword match="AudioSystem" />
- <keyword match="AuthenticationException" />
- <keyword match="AuthenticationNotSupportedException" />
- <keyword match="Authenticator" />
- <keyword match="AuthPermission" />
- <keyword match="Autoscroll" />
- <keyword match="AWTError" />
- <keyword match="AWTEvent" />
- <keyword match="AWTEventListener" />
- <keyword match="AWTEventListenerProxy" />
- <keyword match="AWTEventMulticaster" />
- <keyword match="AWTException" />
- <keyword match="AWTKeyStroke" />
- <keyword match="AWTPermission" />
- <keyword match="BackingStoreException" />
- <keyword match="BAD_CONTEXT" />
- <keyword match="BAD_INV_ORDER" />
- <keyword match="BAD_OPERATION" />
- <keyword match="BAD_PARAM" />
- <keyword match="BAD_POLICY" />
- <keyword match="BAD_POLICY_TYPE" />
- <keyword match="BAD_POLICY_VALUE" />
- <keyword match="BAD_TYPECODE" />
- <keyword match="BadKind" />
- <keyword match="BadLocationException" />
- <keyword match="BadPaddingException" />
- <keyword match="BandCombineOp" />
- <keyword match="BandedSampleModel" />
- <keyword match="BasicArrowButton" />
- <keyword match="BasicAttribute" />
- <keyword match="BasicAttributes" />
- <keyword match="BasicBorders" />
- <keyword match="BasicButtonListener" />
- <keyword match="BasicButtonUI" />
- <keyword match="BasicCheckBoxMenuItemUI" />
- <keyword match="BasicCheckBoxUI" />
- <keyword match="BasicColorChooserUI" />
- <keyword match="BasicComboBoxEditor" />
- <keyword match="BasicComboBoxRenderer" />
- <keyword match="BasicComboBoxUI" />
- <keyword match="BasicComboPopup" />
- <keyword match="BasicDesktopIconUI" />
- <keyword match="BasicDesktopPaneUI" />
- <keyword match="BasicDirectoryModel" />
- <keyword match="BasicEditorPaneUI" />
- <keyword match="BasicFileChooserUI" />
- <keyword match="BasicFormattedTextFieldUI" />
- <keyword match="BasicGraphicsUtils" />
- <keyword match="BasicHTML" />
- <keyword match="BasicIconFactory" />
- <keyword match="BasicInternalFrameTitlePane" />
- <keyword match="BasicInternalFrameUI" />
- <keyword match="BasicLabelUI" />
- <keyword match="BasicListUI" />
- <keyword match="BasicLookAndFeel" />
- <keyword match="BasicMenuBarUI" />
- <keyword match="BasicMenuItemUI" />
- <keyword match="BasicMenuUI" />
- <keyword match="BasicOptionPaneUI" />
- <keyword match="BasicPanelUI" />
- <keyword match="BasicPasswordFieldUI" />
- <keyword match="BasicPermission" />
- <keyword match="BasicPopupMenuSeparatorUI" />
- <keyword match="BasicPopupMenuUI" />
- <keyword match="BasicProgressBarUI" />
- <keyword match="BasicRadioButtonMenuItemUI" />
- <keyword match="BasicRadioButtonUI" />
- <keyword match="BasicRootPaneUI" />
- <keyword match="BasicScrollBarUI" />
- <keyword match="BasicScrollPaneUI" />
- <keyword match="BasicSeparatorUI" />
- <keyword match="BasicSliderUI" />
- <keyword match="BasicSpinnerUI" />
- <keyword match="BasicSplitPaneDivider" />
- <keyword match="BasicSplitPaneUI" />
- <keyword match="BasicStroke" />
- <keyword match="BasicTabbedPaneUI" />
- <keyword match="BasicTableHeaderUI" />
- <keyword match="BasicTableUI" />
- <keyword match="BasicTextAreaUI" />
- <keyword match="BasicTextFieldUI" />
- <keyword match="BasicTextPaneUI" />
- <keyword match="BasicTextUI" />
- <keyword match="BasicToggleButtonUI" />
- <keyword match="BasicToolBarSeparatorUI" />
- <keyword match="BasicToolBarUI" />
- <keyword match="BasicToolTipUI" />
- <keyword match="BasicTreeUI" />
- <keyword match="BasicViewportUI" />
- <keyword match="BatchUpdateException" />
- <keyword match="BeanContext" />
- <keyword match="BeanContextChild" />
- <keyword match="BeanContextChildComponentProxy" />
- <keyword match="BeanContextChildSupport" />
- <keyword match="BeanContextContainerProxy" />
- <keyword match="BeanContextEvent" />
- <keyword match="BeanContextMembershipEvent" />
- <keyword match="BeanContextMembershipListener" />
- <keyword match="BeanContextProxy" />
- <keyword match="BeanContextServiceAvailableEvent" />
- <keyword match="BeanContextServiceProvider" />
- <keyword match="BeanContextServiceProviderBeanInfo" />
- <keyword match="BeanContextServiceRevokedEvent" />
- <keyword match="BeanContextServiceRevokedListener" />
- <keyword match="BeanContextServices" />
- <keyword match="BeanContextServicesListener" />
- <keyword match="BeanContextServicesSupport" />
- <keyword match="BeanContextSupport" />
- <keyword match="BeanDescriptor" />
- <keyword match="BeanInfo" />
- <keyword match="Beans" />
- <keyword match="BevelBorder" />
- <keyword match="Bidi" />
- <keyword match="BigDecimal" />
- <keyword match="BigInteger" />
- <keyword match="BinaryRefAddr" />
- <keyword match="BindException" />
- <keyword match="Binding" />
- <keyword match="Binding" />
- <keyword match="BindingHelper" />
- <keyword match="BindingHolder" />
- <keyword match="BindingIterator" />
- <keyword match="BindingIteratorHelper" />
- <keyword match="BindingIteratorHolder" />
- <keyword match="BindingIteratorOperations" />
- <keyword match="BindingIteratorPOA" />
- <keyword match="BindingListHelper" />
- <keyword match="BindingListHolder" />
- <keyword match="BindingType" />
- <keyword match="BindingTypeHelper" />
- <keyword match="BindingTypeHolder" />
- <keyword match="BitSet" />
- <keyword match="Blob" />
- <keyword match="BlockView" />
- <keyword match="Book" />
- <keyword match="Boolean" />
- <keyword match="BooleanControl" />
- <keyword match="BooleanHolder" />
- <keyword match="BooleanSeqHelper" />
- <keyword match="BooleanSeqHolder" />
- <keyword match="Border" />
- <keyword match="BorderFactory" />
- <keyword match="BorderLayout" />
- <keyword match="BorderUIResource" />
- <keyword match="BoundedRangeModel" />
- <keyword match="Bounds" />
- <keyword match="Bounds" />
- <keyword match="Box" />
- <keyword match="BoxedValueHelper" />
- <keyword match="BoxLayout" />
- <keyword match="BoxView" />
- <keyword match="BreakIterator" />
- <keyword match="Buffer" />
- <keyword match="BufferCapabilities" />
- <keyword match="BufferedImage" />
- <keyword match="BufferedImageFilter" />
- <keyword match="BufferedImageOp" />
- <keyword match="BufferedInputStream" />
- <keyword match="BufferedOutputStream" />
- <keyword match="BufferedReader" />
- <keyword match="BufferedWriter" />
- <keyword match="BufferOverflowException" />
- <keyword match="BufferStrategy" />
- <keyword match="BufferUnderflowException" />
- <keyword match="Button" />
- <keyword match="ButtonGroup" />
- <keyword match="ButtonModel" />
- <keyword match="ButtonUI" />
- <keyword match="Byte" />
- <keyword match="ByteArrayInputStream" />
- <keyword match="ByteArrayOutputStream" />
- <keyword match="ByteBuffer" />
- <keyword match="ByteChannel" />
- <keyword match="ByteHolder" />
- <keyword match="ByteLookupTable" />
- <keyword match="ByteOrder" />
- <keyword match="Calendar" />
- <keyword match="CallableStatement" />
- <keyword match="Callback" />
- <keyword match="CallbackHandler" />
- <keyword match="CancelablePrintJob" />
- <keyword match="CancelledKeyException" />
- <keyword match="CannotProceed" />
- <keyword match="CannotProceedException" />
- <keyword match="CannotProceedHelper" />
- <keyword match="CannotProceedHolder" />
- <keyword match="CannotRedoException" />
- <keyword match="CannotUndoException" />
- <keyword match="Canvas" />
- <keyword match="CardLayout" />
- <keyword match="Caret" />
- <keyword match="CaretEvent" />
- <keyword match="CaretListener" />
- <keyword match="CDATASection" />
- <keyword match="CellEditor" />
- <keyword match="CellEditorListener" />
- <keyword match="CellRendererPane" />
- <keyword match="Certificate" />
- <keyword match="Certificate" />
- <keyword match="Certificate" />
-
- <keyword match="CertificateEncodingException" />
- <keyword match="CertificateEncodingException" />
- <keyword match="CertificateException" />
- <keyword match="CertificateException" />
- <keyword match="CertificateExpiredException" />
- <keyword match="CertificateExpiredException" />
- <keyword match="CertificateFactory" />
- <keyword match="CertificateFactorySpi" />
- <keyword match="CertificateNotYetValidException" />
- <keyword match="CertificateNotYetValidException" />
- <keyword match="CertificateParsingException" />
- <keyword match="CertificateParsingException" />
- <keyword match="CertPath" />
-
- <keyword match="CertPathBuilder" />
- <keyword match="CertPathBuilderException" />
- <keyword match="CertPathBuilderResult" />
- <keyword match="CertPathBuilderSpi" />
- <keyword match="CertPathParameters" />
- <keyword match="CertPathValidator" />
- <keyword match="CertPathValidatorException" />
- <keyword match="CertPathValidatorResult" />
- <keyword match="CertPathValidatorSpi" />
- <keyword match="CertSelector" />
- <keyword match="CertStore" />
- <keyword match="CertStoreException" />
- <keyword match="CertStoreParameters" />
- <keyword match="CertStoreSpi" />
- <keyword match="ChangedCharSetException" />
- <keyword match="ChangeEvent" />
- <keyword match="ChangeListener" />
- <keyword match="Channel" />
- <keyword match="ChannelBinding" />
- <keyword match="Channels" />
- <keyword match="Character" />
-
-
- <keyword match="CharacterCodingException" />
- <keyword match="CharacterData" />
- <keyword match="CharacterIterator" />
- <keyword match="CharArrayReader" />
- <keyword match="CharArrayWriter" />
- <keyword match="CharBuffer" />
- <keyword match="CharConversionException" />
- <keyword match="CharHolder" />
- <keyword match="CharSeqHelper" />
- <keyword match="CharSeqHolder" />
- <keyword match="CharSequence" />
- <keyword match="Charset" />
- <keyword match="CharsetDecoder" />
- <keyword match="CharsetEncoder" />
- <keyword match="CharsetProvider" />
- <keyword match="Checkbox" />
- <keyword match="CheckboxGroup" />
- <keyword match="CheckboxMenuItem" />
- <keyword match="CheckedInputStream" />
- <keyword match="CheckedOutputStream" />
- <keyword match="Checksum" />
- <keyword match="Choice" />
- <keyword match="ChoiceCallback" />
- <keyword match="ChoiceFormat" />
- <keyword match="Chromaticity" />
- <keyword match="Cipher" />
- <keyword match="CipherInputStream" />
- <keyword match="CipherOutputStream" />
- <keyword match="CipherSpi" />
- <keyword match="Class" />
- <keyword match="ClassCastException" />
- <keyword match="ClassCircularityError" />
- <keyword match="ClassDesc" />
- <keyword match="ClassFormatError" />
- <keyword match="ClassLoader" />
- <keyword match="ClassNotFoundException" />
- <keyword match="ClientRequestInfo" />
- <keyword match="ClientRequestInfoOperations" />
- <keyword match="ClientRequestInterceptor" />
- <keyword match="ClientRequestInterceptorOperations" />
- <keyword match="Clip" />
- <keyword match="Clipboard" />
- <keyword match="ClipboardOwner" />
- <keyword match="Clob" />
- <keyword match="Cloneable" />
- <keyword match="CloneNotSupportedException" />
- <keyword match="ClosedByInterruptException" />
- <keyword match="ClosedChannelException" />
- <keyword match="ClosedSelectorException" />
- <keyword match="CMMException" />
- <keyword match="Codec" />
- <keyword match="CodecFactory" />
- <keyword match="CodecFactoryHelper" />
- <keyword match="CodecFactoryOperations" />
- <keyword match="CodecOperations" />
- <keyword match="CoderMalfunctionError" />
- <keyword match="CoderResult" />
- <keyword match="CodeSets" />
- <keyword match="CodeSource" />
- <keyword match="CodingErrorAction" />
- <keyword match="CollationElementIterator" />
- <keyword match="CollationKey" />
- <keyword match="Collator" />
- <keyword match="Collection" />
- <keyword match="CollectionCertStoreParameters" />
- <keyword match="Collections" />
- <keyword match="Color" />
- <keyword match="ColorChooserComponentFactory" />
- <keyword match="ColorChooserUI" />
- <keyword match="ColorConvertOp" />
- <keyword match="ColorModel" />
- <keyword match="ColorSelectionModel" />
- <keyword match="ColorSpace" />
- <keyword match="ColorSupported" />
- <keyword match="ColorUIResource" />
- <keyword match="ComboBoxEditor" />
- <keyword match="ComboBoxModel" />
- <keyword match="ComboBoxUI" />
- <keyword match="ComboPopup" />
- <keyword match="COMM_FAILURE" />
- <keyword match="Comment" />
- <keyword match="CommunicationException" />
- <keyword match="Comparable" />
- <keyword match="Comparator" />
- <keyword match="Compiler" />
- <keyword match="CompletionStatus" />
- <keyword match="CompletionStatusHelper" />
- <keyword match="Component" />
- <keyword match="ComponentAdapter" />
- <keyword match="ComponentColorModel" />
- <keyword match="ComponentEvent" />
- <keyword match="ComponentIdHelper" />
- <keyword match="ComponentInputMap" />
- <keyword match="ComponentInputMapUIResource" />
- <keyword match="ComponentListener" />
- <keyword match="ComponentOrientation" />
- <keyword match="ComponentSampleModel" />
- <keyword match="ComponentUI" />
- <keyword match="ComponentView" />
- <keyword match="Composite" />
- <keyword match="CompositeContext" />
- <keyword match="CompositeName" />
- <keyword match="CompositeView" />
- <keyword match="CompoundBorder" />
- <keyword match="CompoundControl" />
-
- <keyword match="CompoundEdit" />
- <keyword match="CompoundName" />
- <keyword match="Compression" />
- <keyword match="ConcurrentModificationException" />
- <keyword match="Configuration" />
- <keyword match="ConfigurationException" />
- <keyword match="ConfirmationCallback" />
- <keyword match="ConnectException" />
- <keyword match="ConnectException" />
- <keyword match="ConnectIOException" />
- <keyword match="Connection" />
- <keyword match="ConnectionEvent" />
- <keyword match="ConnectionEventListener" />
- <keyword match="ConnectionPendingException" />
- <keyword match="ConnectionPoolDataSource" />
- <keyword match="ConsoleHandler" />
- <keyword match="Constructor" />
- <keyword match="Container" />
- <keyword match="ContainerAdapter" />
- <keyword match="ContainerEvent" />
- <keyword match="ContainerListener" />
- <keyword match="ContainerOrderFocusTraversalPolicy" />
- <keyword match="ContentHandler" />
- <keyword match="ContentHandler" />
- <keyword match="ContentHandlerFactory" />
- <keyword match="ContentModel" />
- <keyword match="Context" />
- <keyword match="Context" />
- <keyword match="ContextList" />
- <keyword match="ContextNotEmptyException" />
- <keyword match="ContextualRenderedImageFactory" />
- <keyword match="Control" />
- <keyword match="Control" />
-
- <keyword match="ControlFactory" />
- <keyword match="ControllerEventListener" />
- <keyword match="ConvolveOp" />
- <keyword match="CookieHolder" />
- <keyword match="Copies" />
- <keyword match="CopiesSupported" />
- <keyword match="CRC32" />
- <keyword match="CredentialExpiredException" />
- <keyword match="CRL" />
- <keyword match="CRLException" />
- <keyword match="CRLSelector" />
- <keyword match="CropImageFilter" />
- <keyword match="CSS" />
-
- <keyword match="CTX_RESTRICT_SCOPE" />
- <keyword match="CubicCurve2D" />
-
-
- <keyword match="Currency" />
- <keyword match="Current" />
- <keyword match="Current" />
- <keyword match="Current" />
- <keyword match="CurrentHelper" />
- <keyword match="CurrentHelper" />
- <keyword match="CurrentHelper" />
- <keyword match="CurrentHolder" />
- <keyword match="CurrentOperations" />
- <keyword match="CurrentOperations" />
- <keyword match="CurrentOperations" />
- <keyword match="Cursor" />
- <keyword match="Customizer" />
- <keyword match="CustomMarshal" />
- <keyword match="CustomValue" />
- <keyword match="DATA_CONVERSION" />
- <keyword match="DatabaseMetaData" />
- <keyword match="DataBuffer" />
- <keyword match="DataBufferByte" />
- <keyword match="DataBufferDouble" />
- <keyword match="DataBufferFloat" />
- <keyword match="DataBufferInt" />
- <keyword match="DataBufferShort" />
- <keyword match="DataBufferUShort" />
- <keyword match="DataFlavor" />
- <keyword match="DataFormatException" />
- <keyword match="DatagramChannel" />
- <keyword match="DatagramPacket" />
- <keyword match="DatagramSocket" />
- <keyword match="DatagramSocketImpl" />
- <keyword match="DatagramSocketImplFactory" />
- <keyword match="DataInput" />
- <keyword match="DataInputStream" />
- <keyword match="DataInputStream" />
- <keyword match="DataLine" />
-
- <keyword match="DataOutput" />
- <keyword match="DataOutputStream" />
- <keyword match="DataOutputStream" />
- <keyword match="DataSource" />
- <keyword match="DataTruncation" />
- <keyword match="Date" />
- <keyword match="Date" />
- <keyword match="DateFormat" />
-
- <keyword match="DateFormatSymbols" />
- <keyword match="DateFormatter" />
- <keyword match="DateTimeAtCompleted" />
- <keyword match="DateTimeAtCreation" />
- <keyword match="DateTimeAtProcessing" />
- <keyword match="DateTimeSyntax" />
- <keyword match="DebugGraphics" />
- <keyword match="DecimalFormat" />
- <keyword match="DecimalFormatSymbols" />
- <keyword match="DeclHandler" />
- <keyword match="DefaultBoundedRangeModel" />
- <keyword match="DefaultButtonModel" />
- <keyword match="DefaultCaret" />
- <keyword match="DefaultCellEditor" />
- <keyword match="DefaultColorSelectionModel" />
- <keyword match="DefaultComboBoxModel" />
- <keyword match="DefaultDesktopManager" />
- <keyword match="DefaultEditorKit" />
-
-
-
-
-
-
-
-
- <keyword match="DefaultFocusManager" />
- <keyword match="DefaultFocusTraversalPolicy" />
- <keyword match="DefaultFormatter" />
- <keyword match="DefaultFormatterFactory" />
- <keyword match="DefaultHandler" />
- <keyword match="DefaultHighlighter" />
-
- <keyword match="DefaultKeyboardFocusManager" />
- <keyword match="DefaultListCellRenderer" />
-
- <keyword match="DefaultListModel" />
- <keyword match="DefaultListSelectionModel" />
- <keyword match="DefaultMenuLayout" />
- <keyword match="DefaultMetalTheme" />
- <keyword match="DefaultMutableTreeNode" />
- <keyword match="DefaultPersistenceDelegate" />
- <keyword match="DefaultSingleSelectionModel" />
- <keyword match="DefaultStyledDocument" />
-
-
- <keyword match="DefaultTableCellRenderer" />
-
- <keyword match="DefaultTableColumnModel" />
- <keyword match="DefaultTableModel" />
- <keyword match="DefaultTextUI" />
- <keyword match="DefaultTreeCellEditor" />
- <keyword match="DefaultTreeCellRenderer" />
- <keyword match="DefaultTreeModel" />
- <keyword match="DefaultTreeSelectionModel" />
- <keyword match="DefinitionKind" />
- <keyword match="DefinitionKindHelper" />
- <keyword match="Deflater" />
- <keyword match="DeflaterOutputStream" />
- <keyword match="Delegate" />
- <keyword match="Delegate" />
- <keyword match="Delegate" />
- <keyword match="DelegationPermission" />
- <keyword match="DESedeKeySpec" />
- <keyword match="DesignMode" />
- <keyword match="DESKeySpec" />
- <keyword match="DesktopIconUI" />
- <keyword match="DesktopManager" />
- <keyword match="DesktopPaneUI" />
- <keyword match="Destination" />
- <keyword match="Destroyable" />
- <keyword match="DestroyFailedException" />
- <keyword match="DGC" />
- <keyword match="DHGenParameterSpec" />
- <keyword match="DHKey" />
- <keyword match="DHParameterSpec" />
- <keyword match="DHPrivateKey" />
- <keyword match="DHPrivateKeySpec" />
- <keyword match="DHPublicKey" />
- <keyword match="DHPublicKeySpec" />
- <keyword match="Dialog" />
- <keyword match="Dictionary" />
- <keyword match="DigestException" />
- <keyword match="DigestInputStream" />
- <keyword match="DigestOutputStream" />
- <keyword match="Dimension" />
- <keyword match="Dimension2D" />
- <keyword match="DimensionUIResource" />
- <keyword match="DirContext" />
- <keyword match="DirectColorModel" />
- <keyword match="DirectoryManager" />
- <keyword match="DirObjectFactory" />
- <keyword match="DirStateFactory" />
-
- <keyword match="DisplayMode" />
- <keyword match="DnDConstants" />
- <keyword match="Doc" />
- <keyword match="DocAttribute" />
- <keyword match="DocAttributeSet" />
- <keyword match="DocFlavor" />
-
-
-
-
-
-
-
- <keyword match="DocPrintJob" />
- <keyword match="Document" />
- <keyword match="Document" />
- <keyword match="DocumentBuilder" />
- <keyword match="DocumentBuilderFactory" />
- <keyword match="DocumentEvent" />
-
-
- <keyword match="DocumentFilter" />
-
- <keyword match="DocumentFragment" />
- <keyword match="DocumentHandler" />
- <keyword match="DocumentListener" />
- <keyword match="DocumentName" />
- <keyword match="DocumentParser" />
- <keyword match="DocumentType" />
- <keyword match="DomainCombiner" />
- <keyword match="DomainManager" />
- <keyword match="DomainManagerOperations" />
- <keyword match="DOMException" />
- <keyword match="DOMImplementation" />
- <keyword match="DOMLocator" />
- <keyword match="DOMResult" />
- <keyword match="DOMSource" />
- <keyword match="Double" />
- <keyword match="DoubleBuffer" />
- <keyword match="DoubleHolder" />
- <keyword match="DoubleSeqHelper" />
- <keyword match="DoubleSeqHolder" />
- <keyword match="DragGestureEvent" />
- <keyword match="DragGestureListener" />
- <keyword match="DragGestureRecognizer" />
- <keyword match="DragSource" />
- <keyword match="DragSourceAdapter" />
- <keyword match="DragSourceContext" />
- <keyword match="DragSourceDragEvent" />
- <keyword match="DragSourceDropEvent" />
- <keyword match="DragSourceEvent" />
- <keyword match="DragSourceListener" />
- <keyword match="DragSourceMotionListener" />
- <keyword match="Driver" />
- <keyword match="DriverManager" />
- <keyword match="DriverPropertyInfo" />
- <keyword match="DropTarget" />
-
- <keyword match="DropTargetAdapter" />
- <keyword match="DropTargetContext" />
- <keyword match="DropTargetDragEvent" />
- <keyword match="DropTargetDropEvent" />
- <keyword match="DropTargetEvent" />
- <keyword match="DropTargetListener" />
- <keyword match="DSAKey" />
- <keyword match="DSAKeyPairGenerator" />
- <keyword match="DSAParameterSpec" />
- <keyword match="DSAParams" />
- <keyword match="DSAPrivateKey" />
- <keyword match="DSAPrivateKeySpec" />
- <keyword match="DSAPublicKey" />
- <keyword match="DSAPublicKeySpec" />
- <keyword match="DTD" />
- <keyword match="DTDConstants" />
- <keyword match="DTDHandler" />
- <keyword match="DuplicateName" />
- <keyword match="DuplicateNameHelper" />
- <keyword match="DynamicImplementation" />
- <keyword match="DynamicImplementation" />
- <keyword match="DynAny" />
- <keyword match="DynAny" />
- <keyword match="DynAnyFactory" />
- <keyword match="DynAnyFactoryHelper" />
- <keyword match="DynAnyFactoryOperations" />
- <keyword match="DynAnyHelper" />
- <keyword match="DynAnyOperations" />
- <keyword match="DynAnySeqHelper" />
- <keyword match="DynArray" />
- <keyword match="DynArray" />
- <keyword match="DynArrayHelper" />
- <keyword match="DynArrayOperations" />
- <keyword match="DynEnum" />
- <keyword match="DynEnum" />
- <keyword match="DynEnumHelper" />
- <keyword match="DynEnumOperations" />
- <keyword match="DynFixed" />
- <keyword match="DynFixed" />
- <keyword match="DynFixedHelper" />
- <keyword match="DynFixedOperations" />
- <keyword match="DynSequence" />
- <keyword match="DynSequence" />
- <keyword match="DynSequenceHelper" />
- <keyword match="DynSequenceOperations" />
- <keyword match="DynStruct" />
- <keyword match="DynStruct" />
- <keyword match="DynStructHelper" />
- <keyword match="DynStructOperations" />
- <keyword match="DynUnion" />
- <keyword match="DynUnion" />
- <keyword match="DynUnionHelper" />
- <keyword match="DynUnionOperations" />
- <keyword match="DynValue" />
- <keyword match="DynValue" />
- <keyword match="DynValueBox" />
- <keyword match="DynValueBoxOperations" />
- <keyword match="DynValueCommon" />
- <keyword match="DynValueCommonOperations" />
- <keyword match="DynValueHelper" />
- <keyword match="DynValueOperations" />
- <keyword match="EditorKit" />
- <keyword match="Element" />
- <keyword match="Element" />
- <keyword match="Element" />
- <keyword match="ElementIterator" />
- <keyword match="Ellipse2D" />
-
-
- <keyword match="EmptyBorder" />
- <keyword match="EmptyStackException" />
- <keyword match="EncodedKeySpec" />
- <keyword match="Encoder" />
- <keyword match="Encoding" />
- <keyword match="ENCODING_CDR_ENCAPS" />
- <keyword match="EncryptedPrivateKeyInfo" />
- <keyword match="Entity" />
- <keyword match="Entity" />
- <keyword match="EntityReference" />
- <keyword match="EntityResolver" />
- <keyword match="EnumControl" />
-
- <keyword match="Enumeration" />
- <keyword match="EnumSyntax" />
- <keyword match="Environment" />
- <keyword match="EOFException" />
- <keyword match="Error" />
- <keyword match="ErrorHandler" />
- <keyword match="ErrorListener" />
- <keyword match="ErrorManager" />
- <keyword match="EtchedBorder" />
- <keyword match="Event" />
- <keyword match="EventContext" />
- <keyword match="EventDirContext" />
- <keyword match="EventHandler" />
- <keyword match="EventListener" />
- <keyword match="EventListenerList" />
- <keyword match="EventListenerProxy" />
- <keyword match="EventObject" />
- <keyword match="EventQueue" />
- <keyword match="EventSetDescriptor" />
- <keyword match="Exception" />
- <keyword match="ExceptionInInitializerError" />
- <keyword match="ExceptionList" />
- <keyword match="ExceptionListener" />
- <keyword match="ExemptionMechanism" />
- <keyword match="ExemptionMechanismException" />
- <keyword match="ExemptionMechanismSpi" />
- <keyword match="ExpandVetoException" />
- <keyword match="ExportException" />
- <keyword match="Expression" />
- <keyword match="ExtendedRequest" />
- <keyword match="ExtendedResponse" />
- <keyword match="Externalizable" />
- <keyword match="FactoryConfigurationError" />
- <keyword match="FailedLoginException" />
- <keyword match="FeatureDescriptor" />
- <keyword match="Fidelity" />
- <keyword match="Field" />
- <keyword match="FieldNameHelper" />
- <keyword match="FieldNameHelper" />
- <keyword match="FieldPosition" />
- <keyword match="FieldView" />
- <keyword match="File" />
- <keyword match="FileCacheImageInputStream" />
- <keyword match="FileCacheImageOutputStream" />
- <keyword match="FileChannel" />
-
- <keyword match="FileChooserUI" />
- <keyword match="FileDescriptor" />
- <keyword match="FileDialog" />
- <keyword match="FileFilter" />
- <keyword match="FileFilter" />
- <keyword match="FileHandler" />
- <keyword match="FileImageInputStream" />
- <keyword match="FileImageOutputStream" />
- <keyword match="FileInputStream" />
- <keyword match="FileLock" />
- <keyword match="FileLockInterruptionException" />
- <keyword match="FilenameFilter" />
- <keyword match="FileNameMap" />
- <keyword match="FileNotFoundException" />
- <keyword match="FileOutputStream" />
- <keyword match="FilePermission" />
- <keyword match="FileReader" />
- <keyword match="FileSystemView" />
- <keyword match="FileView" />
- <keyword match="FileWriter" />
- <keyword match="Filter" />
- <keyword match="FilteredImageSource" />
- <keyword match="FilterInputStream" />
- <keyword match="FilterOutputStream" />
- <keyword match="FilterReader" />
- <keyword match="FilterWriter" />
- <keyword match="Finishings" />
- <keyword match="FixedHeightLayoutCache" />
- <keyword match="FixedHolder" />
- <keyword match="FlatteningPathIterator" />
- <keyword match="FlavorException" />
- <keyword match="FlavorMap" />
- <keyword match="FlavorTable" />
- <keyword match="Float" />
- <keyword match="FloatBuffer" />
- <keyword match="FloatControl" />
-
- <keyword match="FloatHolder" />
- <keyword match="FloatSeqHelper" />
- <keyword match="FloatSeqHolder" />
- <keyword match="FlowLayout" />
- <keyword match="FlowView" />
-
- <keyword match="FocusAdapter" />
- <keyword match="FocusEvent" />
- <keyword match="FocusListener" />
- <keyword match="FocusManager" />
- <keyword match="FocusTraversalPolicy" />
- <keyword match="Font" />
- <keyword match="FontFormatException" />
- <keyword match="FontMetrics" />
- <keyword match="FontRenderContext" />
- <keyword match="FontUIResource" />
- <keyword match="Format" />
-
- <keyword match="FormatConversionProvider" />
- <keyword match="FormatMismatch" />
- <keyword match="FormatMismatchHelper" />
- <keyword match="Formatter" />
- <keyword match="FormView" />
- <keyword match="ForwardRequest" />
- <keyword match="ForwardRequest" />
- <keyword match="ForwardRequestHelper" />
- <keyword match="ForwardRequestHelper" />
- <keyword match="Frame" />
- <keyword match="FREE_MEM" />
- <keyword match="GapContent" />
- <keyword match="GatheringByteChannel" />
- <keyword match="GeneralPath" />
- <keyword match="GeneralSecurityException" />
- <keyword match="GlyphJustificationInfo" />
- <keyword match="GlyphMetrics" />
- <keyword match="GlyphVector" />
- <keyword match="GlyphView" />
-
- <keyword match="GradientPaint" />
- <keyword match="GraphicAttribute" />
- <keyword match="Graphics" />
- <keyword match="Graphics2D" />
- <keyword match="GraphicsConfigTemplate" />
- <keyword match="GraphicsConfiguration" />
- <keyword match="GraphicsDevice" />
- <keyword match="GraphicsEnvironment" />
- <keyword match="GrayFilter" />
- <keyword match="GregorianCalendar" />
- <keyword match="GridBagConstraints" />
- <keyword match="GridBagLayout" />
- <keyword match="GridLayout" />
- <keyword match="Group" />
- <keyword match="GSSContext" />
- <keyword match="GSSCredential" />
- <keyword match="GSSException" />
- <keyword match="GSSManager" />
- <keyword match="GSSName" />
- <keyword match="Guard" />
- <keyword match="GuardedObject" />
- <keyword match="GZIPInputStream" />
- <keyword match="GZIPOutputStream" />
- <keyword match="Handler" />
- <keyword match="HandlerBase" />
- <keyword match="HandshakeCompletedEvent" />
- <keyword match="HandshakeCompletedListener" />
- <keyword match="HasControls" />
- <keyword match="HashAttributeSet" />
- <keyword match="HashDocAttributeSet" />
- <keyword match="HashMap" />
- <keyword match="HashPrintJobAttributeSet" />
- <keyword match="HashPrintRequestAttributeSet" />
- <keyword match="HashPrintServiceAttributeSet" />
- <keyword match="HashSet" />
- <keyword match="Hashtable" />
- <keyword match="HeadlessException" />
- <keyword match="HierarchyBoundsAdapter" />
- <keyword match="HierarchyBoundsListener" />
- <keyword match="HierarchyEvent" />
- <keyword match="HierarchyListener" />
- <keyword match="Highlighter" />
-
-
- <keyword match="HostnameVerifier" />
- <keyword match="HTML" />
-
-
-
- <keyword match="HTMLDocument" />
-
- <keyword match="HTMLEditorKit" />
-
-
-
-
-
-
- <keyword match="HTMLFrameHyperlinkEvent" />
- <keyword match="HTMLWriter" />
- <keyword match="HttpsURLConnection" />
- <keyword match="HttpURLConnection" />
- <keyword match="HyperlinkEvent" />
-
- <keyword match="HyperlinkListener" />
- <keyword match="ICC_ColorSpace" />
- <keyword match="ICC_Profile" />
- <keyword match="ICC_ProfileGray" />
- <keyword match="ICC_ProfileRGB" />
- <keyword match="Icon" />
- <keyword match="IconUIResource" />
- <keyword match="IconView" />
- <keyword match="ID_ASSIGNMENT_POLICY_ID" />
- <keyword match="ID_UNIQUENESS_POLICY_ID" />
- <keyword match="IdAssignmentPolicy" />
- <keyword match="IdAssignmentPolicyOperations" />
- <keyword match="IdAssignmentPolicyValue" />
- <keyword match="IdentifierHelper" />
- <keyword match="Identity" />
- <keyword match="IdentityHashMap" />
- <keyword match="IdentityScope" />
- <keyword match="IDLEntity" />
- <keyword match="IDLType" />
- <keyword match="IDLTypeHelper" />
- <keyword match="IDLTypeOperations" />
- <keyword match="IdUniquenessPolicy" />
- <keyword match="IdUniquenessPolicyOperations" />
- <keyword match="IdUniquenessPolicyValue" />
- <keyword match="IIOByteBuffer" />
- <keyword match="IIOException" />
- <keyword match="IIOImage" />
- <keyword match="IIOInvalidTreeException" />
- <keyword match="IIOMetadata" />
- <keyword match="IIOMetadataController" />
- <keyword match="IIOMetadataFormat" />
- <keyword match="IIOMetadataFormatImpl" />
- <keyword match="IIOMetadataNode" />
- <keyword match="IIOParam" />
- <keyword match="IIOParamController" />
- <keyword match="IIOReadProgressListener" />
- <keyword match="IIOReadUpdateListener" />
- <keyword match="IIOReadWarningListener" />
- <keyword match="IIORegistry" />
- <keyword match="IIOServiceProvider" />
- <keyword match="IIOWriteProgressListener" />
- <keyword match="IIOWriteWarningListener" />
- <keyword match="IllegalAccessError" />
- <keyword match="IllegalAccessException" />
- <keyword match="IllegalArgumentException" />
- <keyword match="IllegalBlockingModeException" />
- <keyword match="IllegalBlockSizeException" />
- <keyword match="IllegalCharsetNameException" />
- <keyword match="IllegalComponentStateException" />
- <keyword match="IllegalMonitorStateException" />
- <keyword match="IllegalPathStateException" />
- <keyword match="IllegalSelectorException" />
- <keyword match="IllegalStateException" />
- <keyword match="IllegalThreadStateException" />
- <keyword match="Image" />
- <keyword match="ImageCapabilities" />
- <keyword match="ImageConsumer" />
- <keyword match="ImageFilter" />
- <keyword match="ImageGraphicAttribute" />
- <keyword match="ImageIcon" />
- <keyword match="ImageInputStream" />
- <keyword match="ImageInputStreamImpl" />
- <keyword match="ImageInputStreamSpi" />
- <keyword match="ImageIO" />
- <keyword match="ImageObserver" />
- <keyword match="ImageOutputStream" />
- <keyword match="ImageOutputStreamImpl" />
- <keyword match="ImageOutputStreamSpi" />
- <keyword match="ImageProducer" />
- <keyword match="ImageReader" />
- <keyword match="ImageReaderSpi" />
- <keyword match="ImageReaderWriterSpi" />
- <keyword match="ImageReadParam" />
- <keyword match="ImageTranscoder" />
- <keyword match="ImageTranscoderSpi" />
- <keyword match="ImageTypeSpecifier" />
- <keyword match="ImageView" />
- <keyword match="ImageWriteParam" />
- <keyword match="ImageWriter" />
- <keyword match="ImageWriterSpi" />
- <keyword match="ImagingOpException" />
- <keyword match="IMP_LIMIT" />
- <keyword match="IMPLICIT_ACTIVATION_POLICY_ID" />
- <keyword match="ImplicitActivationPolicy" />
- <keyword match="ImplicitActivationPolicyOperations" />
- <keyword match="ImplicitActivationPolicyValue" />
- <keyword match="IncompatibleClassChangeError" />
- <keyword match="InconsistentTypeCode" />
- <keyword match="InconsistentTypeCode" />
- <keyword match="InconsistentTypeCodeHelper" />
- <keyword match="IndexColorModel" />
- <keyword match="IndexedPropertyDescriptor" />
- <keyword match="IndexOutOfBoundsException" />
- <keyword match="IndirectionException" />
- <keyword match="Inet4Address" />
- <keyword match="Inet6Address" />
- <keyword match="InetAddress" />
- <keyword match="InetSocketAddress" />
- <keyword match="Inflater" />
- <keyword match="InflaterInputStream" />
- <keyword match="InheritableThreadLocal" />
- <keyword match="InitialContext" />
- <keyword match="InitialContextFactory" />
- <keyword match="InitialContextFactoryBuilder" />
- <keyword match="InitialDirContext" />
- <keyword match="INITIALIZE" />
- <keyword match="InitialLdapContext" />
- <keyword match="InlineView" />
- <keyword match="InputContext" />
- <keyword match="InputEvent" />
- <keyword match="InputMap" />
- <keyword match="InputMapUIResource" />
- <keyword match="InputMethod" />
- <keyword match="InputMethodContext" />
- <keyword match="InputMethodDescriptor" />
- <keyword match="InputMethodEvent" />
- <keyword match="InputMethodHighlight" />
- <keyword match="InputMethodListener" />
- <keyword match="InputMethodRequests" />
- <keyword match="InputSource" />
- <keyword match="InputStream" />
- <keyword match="InputStream" />
- <keyword match="InputStream" />
- <keyword match="InputStreamReader" />
- <keyword match="InputSubset" />
- <keyword match="InputVerifier" />
- <keyword match="Insets" />
- <keyword match="InsetsUIResource" />
- <keyword match="InstantiationError" />
- <keyword match="InstantiationException" />
- <keyword match="Instrument" />
- <keyword match="InsufficientResourcesException" />
- <keyword match="IntBuffer" />
- <keyword match="Integer" />
- <keyword match="IntegerSyntax" />
- <keyword match="Interceptor" />
- <keyword match="InterceptorOperations" />
- <keyword match="INTERNAL" />
- <keyword match="InternalError" />
- <keyword match="InternalFrameAdapter" />
- <keyword match="InternalFrameEvent" />
- <keyword match="InternalFrameFocusTraversalPolicy" />
- <keyword match="InternalFrameListener" />
- <keyword match="InternalFrameUI" />
- <keyword match="InternationalFormatter" />
- <keyword match="InterruptedException" />
- <keyword match="InterruptedIOException" />
- <keyword match="InterruptedNamingException" />
- <keyword match="InterruptibleChannel" />
- <keyword match="INTF_REPOS" />
- <keyword match="IntHolder" />
- <keyword match="IntrospectionException" />
- <keyword match="Introspector" />
- <keyword match="INV_FLAG" />
- <keyword match="INV_IDENT" />
- <keyword match="INV_OBJREF" />
- <keyword match="INV_POLICY" />
- <keyword match="Invalid" />
- <keyword match="INVALID_TRANSACTION" />
- <keyword match="InvalidAddress" />
- <keyword match="InvalidAddressHelper" />
- <keyword match="InvalidAddressHolder" />
- <keyword match="InvalidAlgorithmParameterException" />
- <keyword match="InvalidAttributeIdentifierException" />
- <keyword match="InvalidAttributesException" />
- <keyword match="InvalidAttributeValueException" />
- <keyword match="InvalidClassException" />
- <keyword match="InvalidDnDOperationException" />
- <keyword match="InvalidKeyException" />
- <keyword match="InvalidKeySpecException" />
- <keyword match="InvalidMarkException" />
- <keyword match="InvalidMidiDataException" />
- <keyword match="InvalidName" />
- <keyword match="InvalidName" />
- <keyword match="InvalidName" />
- <keyword match="InvalidNameException" />
- <keyword match="InvalidNameHelper" />
- <keyword match="InvalidNameHelper" />
- <keyword match="InvalidNameHolder" />
- <keyword match="InvalidObjectException" />
- <keyword match="InvalidParameterException" />
- <keyword match="InvalidParameterSpecException" />
- <keyword match="InvalidPolicy" />
- <keyword match="InvalidPolicyHelper" />
- <keyword match="InvalidPreferencesFormatException" />
- <keyword match="InvalidSearchControlsException" />
- <keyword match="InvalidSearchFilterException" />
- <keyword match="InvalidSeq" />
- <keyword match="InvalidSlot" />
- <keyword match="InvalidSlotHelper" />
- <keyword match="InvalidTransactionException" />
- <keyword match="InvalidTypeForEncoding" />
- <keyword match="InvalidTypeForEncodingHelper" />
- <keyword match="InvalidValue" />
- <keyword match="InvalidValue" />
- <keyword match="InvalidValueHelper" />
- <keyword match="InvocationEvent" />
- <keyword match="InvocationHandler" />
- <keyword match="InvocationTargetException" />
- <keyword match="InvokeHandler" />
- <keyword match="IOException" />
- <keyword match="IOR" />
- <keyword match="IORHelper" />
- <keyword match="IORHolder" />
- <keyword match="IORInfo" />
- <keyword match="IORInfoOperations" />
- <keyword match="IORInterceptor" />
- <keyword match="IORInterceptorOperations" />
- <keyword match="IRObject" />
- <keyword match="IRObjectOperations" />
- <keyword match="IstringHelper" />
- <keyword match="ItemEvent" />
- <keyword match="ItemListener" />
- <keyword match="ItemSelectable" />
- <keyword match="Iterator" />
- <keyword match="IvParameterSpec" />
- <keyword match="JApplet" />
- <keyword match="JarEntry" />
- <keyword match="JarException" />
- <keyword match="JarFile" />
- <keyword match="JarInputStream" />
- <keyword match="JarOutputStream" />
- <keyword match="JarURLConnection" />
- <keyword match="JButton" />
- <keyword match="JCheckBox" />
- <keyword match="JCheckBoxMenuItem" />
- <keyword match="JColorChooser" />
- <keyword match="JComboBox" />
-
- <keyword match="JComponent" />
- <keyword match="JDesktopPane" />
- <keyword match="JDialog" />
- <keyword match="JEditorPane" />
- <keyword match="JFileChooser" />
- <keyword match="JFormattedTextField" />
-
-
- <keyword match="JFrame" />
- <keyword match="JInternalFrame" />
-
- <keyword match="JLabel" />
- <keyword match="JLayeredPane" />
- <keyword match="JList" />
- <keyword match="JMenu" />
- <keyword match="JMenuBar" />
- <keyword match="JMenuItem" />
- <keyword match="JobAttributes" />
-
-
-
-
-
- <keyword match="JobHoldUntil" />
- <keyword match="JobImpressions" />
- <keyword match="JobImpressionsCompleted" />
- <keyword match="JobImpressionsSupported" />
- <keyword match="JobKOctets" />
- <keyword match="JobKOctetsProcessed" />
- <keyword match="JobKOctetsSupported" />
- <keyword match="JobMediaSheets" />
- <keyword match="JobMediaSheetsCompleted" />
- <keyword match="JobMediaSheetsSupported" />
- <keyword match="JobMessageFromOperator" />
- <keyword match="JobName" />
- <keyword match="JobOriginatingUserName" />
- <keyword match="JobPriority" />
- <keyword match="JobPrioritySupported" />
- <keyword match="JobSheets" />
- <keyword match="JobState" />
- <keyword match="JobStateReason" />
- <keyword match="JobStateReasons" />
- <keyword match="JOptionPane" />
- <keyword match="JPanel" />
- <keyword match="JPasswordField" />
- <keyword match="JPEGHuffmanTable" />
- <keyword match="JPEGImageReadParam" />
- <keyword match="JPEGImageWriteParam" />
- <keyword match="JPEGQTable" />
- <keyword match="JPopupMenu" />
-
- <keyword match="JProgressBar" />
- <keyword match="JRadioButton" />
- <keyword match="JRadioButtonMenuItem" />
- <keyword match="JRootPane" />
- <keyword match="JScrollBar" />
- <keyword match="JScrollPane" />
- <keyword match="JSeparator" />
- <keyword match="JSlider" />
- <keyword match="JSpinner" />
-
-
-
-
- <keyword match="JSplitPane" />
- <keyword match="JTabbedPane" />
- <keyword match="JTable" />
- <keyword match="JTableHeader" />
- <keyword match="JTextArea" />
- <keyword match="JTextComponent" />
-
- <keyword match="JTextField" />
- <keyword match="JTextPane" />
- <keyword match="JToggleButton" />
-
- <keyword match="JToolBar" />
-
- <keyword match="JToolTip" />
- <keyword match="JTree" />
-
-
- <keyword match="JViewport" />
- <keyword match="JWindow" />
- <keyword match="KerberosKey" />
- <keyword match="KerberosPrincipal" />
- <keyword match="KerberosTicket" />
- <keyword match="Kernel" />
- <keyword match="Key" />
- <keyword match="KeyAdapter" />
- <keyword match="KeyAgreement" />
- <keyword match="KeyAgreementSpi" />
- <keyword match="KeyboardFocusManager" />
- <keyword match="KeyEvent" />
- <keyword match="KeyEventDispatcher" />
- <keyword match="KeyEventPostProcessor" />
- <keyword match="KeyException" />
- <keyword match="KeyFactory" />
- <keyword match="KeyFactorySpi" />
- <keyword match="KeyGenerator" />
- <keyword match="KeyGeneratorSpi" />
- <keyword match="KeyListener" />
- <keyword match="KeyManagementException" />
- <keyword match="KeyManager" />
- <keyword match="KeyManagerFactory" />
- <keyword match="KeyManagerFactorySpi" />
- <keyword match="Keymap" />
- <keyword match="KeyPair" />
- <keyword match="KeyPairGenerator" />
- <keyword match="KeyPairGeneratorSpi" />
- <keyword match="KeySpec" />
- <keyword match="KeyStore" />
- <keyword match="KeyStoreException" />
- <keyword match="KeyStoreSpi" />
- <keyword match="KeyStroke" />
- <keyword match="Label" />
- <keyword match="LabelUI" />
- <keyword match="LabelView" />
- <keyword match="LanguageCallback" />
- <keyword match="LastOwnerException" />
- <keyword match="LayeredHighlighter" />
-
- <keyword match="LayoutFocusTraversalPolicy" />
- <keyword match="LayoutManager" />
- <keyword match="LayoutManager2" />
- <keyword match="LayoutQueue" />
- <keyword match="LDAPCertStoreParameters" />
- <keyword match="LdapContext" />
- <keyword match="LdapReferralException" />
- <keyword match="Lease" />
- <keyword match="Level" />
- <keyword match="LexicalHandler" />
- <keyword match="LIFESPAN_POLICY_ID" />
- <keyword match="LifespanPolicy" />
- <keyword match="LifespanPolicyOperations" />
- <keyword match="LifespanPolicyValue" />
- <keyword match="LimitExceededException" />
- <keyword match="Line" />
-
- <keyword match="Line2D" />
-
-
- <keyword match="LineBorder" />
- <keyword match="LineBreakMeasurer" />
- <keyword match="LineEvent" />
-
- <keyword match="LineListener" />
- <keyword match="LineMetrics" />
- <keyword match="LineNumberInputStream" />
- <keyword match="LineNumberReader" />
- <keyword match="LineUnavailableException" />
- <keyword match="LinkageError" />
- <keyword match="LinkedHashMap" />
- <keyword match="LinkedHashSet" />
- <keyword match="LinkedList" />
- <keyword match="LinkException" />
- <keyword match="LinkLoopException" />
- <keyword match="LinkRef" />
- <keyword match="List" />
- <keyword match="List" />
- <keyword match="ListCellRenderer" />
- <keyword match="ListDataEvent" />
- <keyword match="ListDataListener" />
- <keyword match="ListIterator" />
- <keyword match="ListModel" />
- <keyword match="ListResourceBundle" />
- <keyword match="ListSelectionEvent" />
- <keyword match="ListSelectionListener" />
- <keyword match="ListSelectionModel" />
- <keyword match="ListUI" />
- <keyword match="ListView" />
- <keyword match="LoaderHandler" />
- <keyword match="Locale" />
- <keyword match="LocalObject" />
- <keyword match="LocateRegistry" />
- <keyword match="LOCATION_FORWARD" />
- <keyword match="Locator" />
- <keyword match="LocatorImpl" />
- <keyword match="Logger" />
- <keyword match="LoggingPermission" />
- <keyword match="LoginContext" />
- <keyword match="LoginException" />
- <keyword match="LoginModule" />
- <keyword match="LogManager" />
- <keyword match="LogRecord" />
- <keyword match="LogStream" />
- <keyword match="Long" />
- <keyword match="LongBuffer" />
- <keyword match="LongHolder" />
- <keyword match="LongLongSeqHelper" />
- <keyword match="LongLongSeqHolder" />
- <keyword match="LongSeqHelper" />
- <keyword match="LongSeqHolder" />
- <keyword match="LookAndFeel" />
- <keyword match="LookupOp" />
- <keyword match="LookupTable" />
- <keyword match="Mac" />
- <keyword match="MacSpi" />
- <keyword match="MalformedInputException" />
- <keyword match="MalformedLinkException" />
- <keyword match="MalformedURLException" />
- <keyword match="ManagerFactoryParameters" />
- <keyword match="Manifest" />
- <keyword match="Map" />
-
- <keyword match="MappedByteBuffer" />
- <keyword match="MARSHAL" />
- <keyword match="MarshalException" />
- <keyword match="MarshalledObject" />
- <keyword match="MaskFormatter" />
- <keyword match="Matcher" />
- <keyword match="Math" />
- <keyword match="MatteBorder" />
- <keyword match="Media" />
- <keyword match="MediaName" />
- <keyword match="MediaPrintableArea" />
- <keyword match="MediaSize" />
-
-
-
-
-
- <keyword match="MediaSizeName" />
- <keyword match="MediaTracker" />
- <keyword match="MediaTray" />
- <keyword match="Member" />
- <keyword match="MemoryCacheImageInputStream" />
- <keyword match="MemoryCacheImageOutputStream" />
- <keyword match="MemoryHandler" />
- <keyword match="MemoryImageSource" />
- <keyword match="Menu" />
- <keyword match="MenuBar" />
- <keyword match="MenuBarUI" />
- <keyword match="MenuComponent" />
- <keyword match="MenuContainer" />
- <keyword match="MenuDragMouseEvent" />
- <keyword match="MenuDragMouseListener" />
- <keyword match="MenuElement" />
- <keyword match="MenuEvent" />
- <keyword match="MenuItem" />
- <keyword match="MenuItemUI" />
- <keyword match="MenuKeyEvent" />
- <keyword match="MenuKeyListener" />
- <keyword match="MenuListener" />
- <keyword match="MenuSelectionManager" />
- <keyword match="MenuShortcut" />
- <keyword match="MessageDigest" />
- <keyword match="MessageDigestSpi" />
- <keyword match="MessageFormat" />
-
- <keyword match="MessageProp" />
- <keyword match="MetaEventListener" />
- <keyword match="MetalBorders" />
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- <keyword match="MetalButtonUI" />
- <keyword match="MetalCheckBoxIcon" />
- <keyword match="MetalCheckBoxUI" />
- <keyword match="MetalComboBoxButton" />
- <keyword match="MetalComboBoxEditor" />
-
- <keyword match="MetalComboBoxIcon" />
- <keyword match="MetalComboBoxUI" />
- <keyword match="MetalDesktopIconUI" />
- <keyword match="MetalFileChooserUI" />
- <keyword match="MetalIconFactory" />
-
-
-
-
-
-
- <keyword match="MetalInternalFrameTitlePane" />
- <keyword match="MetalInternalFrameUI" />
- <keyword match="MetalLabelUI" />
- <keyword match="MetalLookAndFeel" />
- <keyword match="MetalPopupMenuSeparatorUI" />
- <keyword match="MetalProgressBarUI" />
- <keyword match="MetalRadioButtonUI" />
- <keyword match="MetalRootPaneUI" />
- <keyword match="MetalScrollBarUI" />
- <keyword match="MetalScrollButton" />
- <keyword match="MetalScrollPaneUI" />
- <keyword match="MetalSeparatorUI" />
- <keyword match="MetalSliderUI" />
- <keyword match="MetalSplitPaneUI" />
- <keyword match="MetalTabbedPaneUI" />
- <keyword match="MetalTextFieldUI" />
- <keyword match="MetalTheme" />
- <keyword match="MetalToggleButtonUI" />
- <keyword match="MetalToolBarUI" />
- <keyword match="MetalToolTipUI" />
- <keyword match="MetalTreeUI" />
- <keyword match="MetaMessage" />
- <keyword match="Method" />
- <keyword match="MethodDescriptor" />
- <keyword match="MidiChannel" />
- <keyword match="MidiDevice" />
-
- <keyword match="MidiDeviceProvider" />
- <keyword match="MidiEvent" />
- <keyword match="MidiFileFormat" />
- <keyword match="MidiFileReader" />
- <keyword match="MidiFileWriter" />
- <keyword match="MidiMessage" />
- <keyword match="MidiSystem" />
- <keyword match="MidiUnavailableException" />
- <keyword match="MimeTypeParseException" />
- <keyword match="MinimalHTMLWriter" />
- <keyword match="MissingResourceException" />
- <keyword match="Mixer" />
-
- <keyword match="MixerProvider" />
- <keyword match="ModificationItem" />
- <keyword match="Modifier" />
- <keyword match="MouseAdapter" />
- <keyword match="MouseDragGestureRecognizer" />
- <keyword match="MouseEvent" />
- <keyword match="MouseInputAdapter" />
- <keyword match="MouseInputListener" />
- <keyword match="MouseListener" />
- <keyword match="MouseMotionAdapter" />
- <keyword match="MouseMotionListener" />
- <keyword match="MouseWheelEvent" />
- <keyword match="MouseWheelListener" />
- <keyword match="MultiButtonUI" />
- <keyword match="MulticastSocket" />
- <keyword match="MultiColorChooserUI" />
- <keyword match="MultiComboBoxUI" />
- <keyword match="MultiDesktopIconUI" />
- <keyword match="MultiDesktopPaneUI" />
- <keyword match="MultiDoc" />
- <keyword match="MultiDocPrintJob" />
- <keyword match="MultiDocPrintService" />
- <keyword match="MultiFileChooserUI" />
- <keyword match="MultiInternalFrameUI" />
- <keyword match="MultiLabelUI" />
- <keyword match="MultiListUI" />
- <keyword match="MultiLookAndFeel" />
- <keyword match="MultiMenuBarUI" />
- <keyword match="MultiMenuItemUI" />
- <keyword match="MultiOptionPaneUI" />
- <keyword match="MultiPanelUI" />
- <keyword match="MultiPixelPackedSampleModel" />
- <keyword match="MultipleComponentProfileHelper" />
- <keyword match="MultipleComponentProfileHolder" />
- <keyword match="MultipleDocumentHandling" />
- <keyword match="MultipleMaster" />
- <keyword match="MultiPopupMenuUI" />
- <keyword match="MultiProgressBarUI" />
- <keyword match="MultiRootPaneUI" />
- <keyword match="MultiScrollBarUI" />
- <keyword match="MultiScrollPaneUI" />
- <keyword match="MultiSeparatorUI" />
- <keyword match="MultiSliderUI" />
- <keyword match="MultiSpinnerUI" />
- <keyword match="MultiSplitPaneUI" />
- <keyword match="MultiTabbedPaneUI" />
- <keyword match="MultiTableHeaderUI" />
- <keyword match="MultiTableUI" />
- <keyword match="MultiTextUI" />
- <keyword match="MultiToolBarUI" />
- <keyword match="MultiToolTipUI" />
- <keyword match="MultiTreeUI" />
- <keyword match="MultiViewportUI" />
- <keyword match="MutableAttributeSet" />
- <keyword match="MutableComboBoxModel" />
- <keyword match="MutableTreeNode" />
- <keyword match="Name" />
- <keyword match="NameAlreadyBoundException" />
- <keyword match="NameCallback" />
- <keyword match="NameClassPair" />
- <keyword match="NameComponent" />
- <keyword match="NameComponentHelper" />
- <keyword match="NameComponentHolder" />
- <keyword match="NamedNodeMap" />
- <keyword match="NamedValue" />
- <keyword match="NameDynAnyPair" />
- <keyword match="NameDynAnyPairHelper" />
- <keyword match="NameDynAnyPairSeqHelper" />
- <keyword match="NameHelper" />
- <keyword match="NameHolder" />
- <keyword match="NameNotFoundException" />
- <keyword match="NameParser" />
- <keyword match="NamespaceChangeListener" />
- <keyword match="NamespaceSupport" />
- <keyword match="NameValuePair" />
- <keyword match="NameValuePair" />
- <keyword match="NameValuePairHelper" />
- <keyword match="NameValuePairHelper" />
- <keyword match="NameValuePairSeqHelper" />
- <keyword match="Naming" />
- <keyword match="NamingContext" />
- <keyword match="NamingContextExt" />
- <keyword match="NamingContextExtHelper" />
- <keyword match="NamingContextExtHolder" />
- <keyword match="NamingContextExtOperations" />
- <keyword match="NamingContextExtPOA" />
- <keyword match="NamingContextHelper" />
- <keyword match="NamingContextHolder" />
- <keyword match="NamingContextOperations" />
- <keyword match="NamingContextPOA" />
- <keyword match="NamingEnumeration" />
- <keyword match="NamingEvent" />
- <keyword match="NamingException" />
- <keyword match="NamingExceptionEvent" />
- <keyword match="NamingListener" />
- <keyword match="NamingManager" />
- <keyword match="NamingSecurityException" />
- <keyword match="NavigationFilter" />
-
- <keyword match="NegativeArraySizeException" />
- <keyword match="NetPermission" />
- <keyword match="NetworkInterface" />
- <keyword match="NO_IMPLEMENT" />
- <keyword match="NO_MEMORY" />
- <keyword match="NO_PERMISSION" />
- <keyword match="NO_RESOURCES" />
- <keyword match="NO_RESPONSE" />
- <keyword match="NoClassDefFoundError" />
- <keyword match="NoConnectionPendingException" />
- <keyword match="NoContext" />
- <keyword match="NoContextHelper" />
- <keyword match="Node" />
- <keyword match="NodeChangeEvent" />
- <keyword match="NodeChangeListener" />
- <keyword match="NodeList" />
- <keyword match="NoInitialContextException" />
- <keyword match="NoninvertibleTransformException" />
- <keyword match="NonReadableChannelException" />
- <keyword match="NonWritableChannelException" />
- <keyword match="NoPermissionException" />
- <keyword match="NoRouteToHostException" />
- <keyword match="NoServant" />
- <keyword match="NoServantHelper" />
- <keyword match="NoSuchAlgorithmException" />
- <keyword match="NoSuchAttributeException" />
- <keyword match="NoSuchElementException" />
- <keyword match="NoSuchFieldError" />
- <keyword match="NoSuchFieldException" />
- <keyword match="NoSuchMethodError" />
- <keyword match="NoSuchMethodException" />
- <keyword match="NoSuchObjectException" />
- <keyword match="NoSuchPaddingException" />
- <keyword match="NoSuchProviderException" />
- <keyword match="NotActiveException" />
- <keyword match="Notation" />
- <keyword match="NotBoundException" />
- <keyword match="NotContextException" />
- <keyword match="NotEmpty" />
- <keyword match="NotEmptyHelper" />
- <keyword match="NotEmptyHolder" />
- <keyword match="NotFound" />
- <keyword match="NotFoundHelper" />
- <keyword match="NotFoundHolder" />
- <keyword match="NotFoundReason" />
- <keyword match="NotFoundReasonHelper" />
- <keyword match="NotFoundReasonHolder" />
- <keyword match="NotOwnerException" />
- <keyword match="NotSerializableException" />
- <keyword match="NotYetBoundException" />
- <keyword match="NotYetConnectedException" />
- <keyword match="NullCipher" />
- <keyword match="NullPointerException" />
- <keyword match="Number" />
- <keyword match="NumberFormat" />
-
- <keyword match="NumberFormatException" />
- <keyword match="NumberFormatter" />
- <keyword match="NumberOfDocuments" />
- <keyword match="NumberOfInterveningJobs" />
- <keyword match="NumberUp" />
- <keyword match="NumberUpSupported" />
- <keyword match="NumericShaper" />
- <keyword match="NVList" />
- <keyword match="OBJ_ADAPTER" />
- <keyword match="Object" />
- <keyword match="OBJECT_NOT_EXIST" />
- <keyword match="ObjectAlreadyActive" />
- <keyword match="ObjectAlreadyActiveHelper" />
- <keyword match="ObjectChangeListener" />
- <keyword match="ObjectFactory" />
- <keyword match="ObjectFactoryBuilder" />
- <keyword match="ObjectHelper" />
- <keyword match="ObjectHolder" />
- <keyword match="ObjectIdHelper" />
- <keyword match="ObjectImpl" />
- <keyword match="ObjectImpl" />
- <keyword match="ObjectInput" />
- <keyword match="ObjectInputStream" />
-
- <keyword match="ObjectInputValidation" />
- <keyword match="ObjectNotActive" />
- <keyword match="ObjectNotActiveHelper" />
- <keyword match="ObjectOutput" />
- <keyword match="ObjectOutputStream" />
-
- <keyword match="ObjectStreamClass" />
- <keyword match="ObjectStreamConstants" />
- <keyword match="ObjectStreamException" />
- <keyword match="ObjectStreamField" />
- <keyword match="ObjectView" />
- <keyword match="ObjID" />
- <keyword match="Observable" />
- <keyword match="Observer" />
- <keyword match="OctetSeqHelper" />
- <keyword match="OctetSeqHolder" />
- <keyword match="Oid" />
- <keyword match="OMGVMCID" />
- <keyword match="OpenType" />
- <keyword match="Operation" />
- <keyword match="OperationNotSupportedException" />
- <keyword match="Option" />
- <keyword match="OptionalDataException" />
- <keyword match="OptionPaneUI" />
- <keyword match="ORB" />
- <keyword match="ORB" />
- <keyword match="ORBInitializer" />
- <keyword match="ORBInitializerOperations" />
- <keyword match="ORBInitInfo" />
- <keyword match="ORBInitInfoOperations" />
- <keyword match="OrientationRequested" />
- <keyword match="OutOfMemoryError" />
- <keyword match="OutputDeviceAssigned" />
- <keyword match="OutputKeys" />
- <keyword match="OutputStream" />
- <keyword match="OutputStream" />
- <keyword match="OutputStream" />
- <keyword match="OutputStreamWriter" />
- <keyword match="OverlappingFileLockException" />
- <keyword match="OverlayLayout" />
- <keyword match="Owner" />
- <keyword match="Package" />
- <keyword match="PackedColorModel" />
- <keyword match="Pageable" />
- <keyword match="PageAttributes" />
-
-
-
-
-
- <keyword match="PageFormat" />
- <keyword match="PageRanges" />
- <keyword match="PagesPerMinute" />
- <keyword match="PagesPerMinuteColor" />
- <keyword match="Paint" />
- <keyword match="PaintContext" />
- <keyword match="PaintEvent" />
- <keyword match="Panel" />
- <keyword match="PanelUI" />
- <keyword match="Paper" />
- <keyword match="ParagraphView" />
- <keyword match="ParagraphView" />
- <keyword match="Parameter" />
- <keyword match="ParameterBlock" />
- <keyword match="ParameterDescriptor" />
- <keyword match="ParameterMetaData" />
- <keyword match="ParameterMode" />
- <keyword match="ParameterModeHelper" />
- <keyword match="ParameterModeHolder" />
- <keyword match="ParseException" />
- <keyword match="ParsePosition" />
- <keyword match="Parser" />
- <keyword match="Parser" />
- <keyword match="ParserAdapter" />
- <keyword match="ParserConfigurationException" />
- <keyword match="ParserDelegator" />
- <keyword match="ParserFactory" />
- <keyword match="PartialResultException" />
- <keyword match="PasswordAuthentication" />
- <keyword match="PasswordCallback" />
- <keyword match="PasswordView" />
- <keyword match="Patch" />
- <keyword match="PathIterator" />
- <keyword match="Pattern" />
- <keyword match="PatternSyntaxException" />
- <keyword match="PBEKey" />
- <keyword match="PBEKeySpec" />
- <keyword match="PBEParameterSpec" />
- <keyword match="PDLOverrideSupported" />
- <keyword match="Permission" />
- <keyword match="Permission" />
- <keyword match="PermissionCollection" />
- <keyword match="Permissions" />
- <keyword match="PERSIST_STORE" />
- <keyword match="PersistenceDelegate" />
- <keyword match="PhantomReference" />
- <keyword match="Pipe" />
-
-
- <keyword match="PipedInputStream" />
- <keyword match="PipedOutputStream" />
- <keyword match="PipedReader" />
- <keyword match="PipedWriter" />
- <keyword match="PixelGrabber" />
- <keyword match="PixelInterleavedSampleModel" />
- <keyword match="PKCS8EncodedKeySpec" />
- <keyword match="PKIXBuilderParameters" />
- <keyword match="PKIXCertPathBuilderResult" />
- <keyword match="PKIXCertPathChecker" />
- <keyword match="PKIXCertPathValidatorResult" />
- <keyword match="PKIXParameters" />
- <keyword match="PlainDocument" />
- <keyword match="PlainView" />
- <keyword match="POA" />
- <keyword match="POAHelper" />
- <keyword match="POAManager" />
- <keyword match="POAManagerOperations" />
- <keyword match="POAOperations" />
- <keyword match="Point" />
- <keyword match="Point2D" />
-
-
- <keyword match="Policy" />
- <keyword match="Policy" />
- <keyword match="Policy" />
- <keyword match="PolicyError" />
- <keyword match="PolicyErrorCodeHelper" />
- <keyword match="PolicyErrorHelper" />
- <keyword match="PolicyErrorHolder" />
- <keyword match="PolicyFactory" />
- <keyword match="PolicyFactoryOperations" />
- <keyword match="PolicyHelper" />
- <keyword match="PolicyHolder" />
- <keyword match="PolicyListHelper" />
- <keyword match="PolicyListHolder" />
- <keyword match="PolicyNode" />
- <keyword match="PolicyOperations" />
- <keyword match="PolicyQualifierInfo" />
- <keyword match="PolicyTypeHelper" />
- <keyword match="Polygon" />
- <keyword match="PooledConnection" />
- <keyword match="Popup" />
- <keyword match="PopupFactory" />
- <keyword match="PopupMenu" />
- <keyword match="PopupMenuEvent" />
- <keyword match="PopupMenuListener" />
- <keyword match="PopupMenuUI" />
- <keyword match="Port" />
-
- <keyword match="PortableRemoteObject" />
- <keyword match="PortableRemoteObjectDelegate" />
- <keyword match="PortUnreachableException" />
- <keyword match="Position" />
-
- <keyword match="PreferenceChangeEvent" />
- <keyword match="PreferenceChangeListener" />
- <keyword match="Preferences" />
- <keyword match="PreferencesFactory" />
- <keyword match="PreparedStatement" />
- <keyword match="PresentationDirection" />
- <keyword match="Principal" />
- <keyword match="Principal" />
- <keyword match="PrincipalHolder" />
- <keyword match="Printable" />
- <keyword match="PrinterAbortException" />
- <keyword match="PrinterException" />
- <keyword match="PrinterGraphics" />
- <keyword match="PrinterInfo" />
- <keyword match="PrinterIOException" />
- <keyword match="PrinterIsAcceptingJobs" />
- <keyword match="PrinterJob" />
- <keyword match="PrinterLocation" />
- <keyword match="PrinterMakeAndModel" />
- <keyword match="PrinterMessageFromOperator" />
- <keyword match="PrinterMoreInfo" />
- <keyword match="PrinterMoreInfoManufacturer" />
- <keyword match="PrinterName" />
- <keyword match="PrinterResolution" />
- <keyword match="PrinterState" />
- <keyword match="PrinterStateReason" />
- <keyword match="PrinterStateReasons" />
- <keyword match="PrinterURI" />
- <keyword match="PrintEvent" />
- <keyword match="PrintException" />
- <keyword match="PrintGraphics" />
- <keyword match="PrintJob" />
- <keyword match="PrintJobAdapter" />
- <keyword match="PrintJobAttribute" />
- <keyword match="PrintJobAttributeEvent" />
- <keyword match="PrintJobAttributeListener" />
- <keyword match="PrintJobAttributeSet" />
- <keyword match="PrintJobEvent" />
- <keyword match="PrintJobListener" />
- <keyword match="PrintQuality" />
- <keyword match="PrintRequestAttribute" />
- <keyword match="PrintRequestAttributeSet" />
- <keyword match="PrintService" />
- <keyword match="PrintServiceAttribute" />
- <keyword match="PrintServiceAttributeEvent" />
- <keyword match="PrintServiceAttributeListener" />
- <keyword match="PrintServiceAttributeSet" />
- <keyword match="PrintServiceLookup" />
- <keyword match="PrintStream" />
- <keyword match="PrintWriter" />
- <keyword match="PRIVATE_MEMBER" />
- <keyword match="PrivateCredentialPermission" />
- <keyword match="PrivateKey" />
- <keyword match="PrivilegedAction" />
- <keyword match="PrivilegedActionException" />
- <keyword match="PrivilegedExceptionAction" />
- <keyword match="Process" />
- <keyword match="ProcessingInstruction" />
- <keyword match="ProfileDataException" />
- <keyword match="ProfileIdHelper" />
- <keyword match="ProgressBarUI" />
- <keyword match="ProgressMonitor" />
- <keyword match="ProgressMonitorInputStream" />
- <keyword match="Properties" />
- <keyword match="PropertyChangeEvent" />
- <keyword match="PropertyChangeListener" />
- <keyword match="PropertyChangeListenerProxy" />
- <keyword match="PropertyChangeSupport" />
- <keyword match="PropertyDescriptor" />
- <keyword match="PropertyEditor" />
- <keyword match="PropertyEditorManager" />
- <keyword match="PropertyEditorSupport" />
- <keyword match="PropertyPermission" />
- <keyword match="PropertyResourceBundle" />
- <keyword match="PropertyVetoException" />
- <keyword match="ProtectionDomain" />
- <keyword match="ProtocolException" />
- <keyword match="Provider" />
- <keyword match="ProviderException" />
- <keyword match="Proxy" />
- <keyword match="PSSParameterSpec" />
- <keyword match="PUBLIC_MEMBER" />
- <keyword match="PublicKey" />
- <keyword match="PushbackInputStream" />
- <keyword match="PushbackReader" />
- <keyword match="QuadCurve2D" />
-
-
- <keyword match="QueuedJobCount" />
- <keyword match="Random" />
- <keyword match="RandomAccess" />
- <keyword match="RandomAccessFile" />
- <keyword match="Raster" />
- <keyword match="RasterFormatException" />
- <keyword match="RasterOp" />
- <keyword match="RC2ParameterSpec" />
- <keyword match="RC5ParameterSpec" />
- <keyword match="ReadableByteChannel" />
- <keyword match="Reader" />
- <keyword match="ReadOnlyBufferException" />
- <keyword match="Receiver" />
- <keyword match="Rectangle" />
- <keyword match="Rectangle2D" />
-
-
- <keyword match="RectangularShape" />
- <keyword match="Ref" />
- <keyword match="RefAddr" />
- <keyword match="Reference" />
- <keyword match="Reference" />
- <keyword match="Referenceable" />
- <keyword match="ReferenceQueue" />
- <keyword match="ReferenceUriSchemesSupported" />
- <keyword match="ReferralException" />
- <keyword match="ReflectPermission" />
- <keyword match="Refreshable" />
- <keyword match="RefreshFailedException" />
- <keyword match="RegisterableService" />
- <keyword match="Registry" />
- <keyword match="RegistryHandler" />
- <keyword match="RemarshalException" />
- <keyword match="Remote" />
- <keyword match="RemoteCall" />
- <keyword match="RemoteException" />
- <keyword match="RemoteObject" />
- <keyword match="RemoteRef" />
- <keyword match="RemoteServer" />
- <keyword match="RemoteStub" />
- <keyword match="RenderableImage" />
- <keyword match="RenderableImageOp" />
- <keyword match="RenderableImageProducer" />
- <keyword match="RenderContext" />
- <keyword match="RenderedImage" />
- <keyword match="RenderedImageFactory" />
- <keyword match="Renderer" />
- <keyword match="RenderingHints" />
-
- <keyword match="RepaintManager" />
- <keyword match="ReplicateScaleFilter" />
- <keyword match="RepositoryIdHelper" />
- <keyword match="Request" />
- <keyword match="REQUEST_PROCESSING_POLICY_ID" />
- <keyword match="RequestInfo" />
- <keyword match="RequestInfoOperations" />
- <keyword match="RequestingUserName" />
- <keyword match="RequestProcessingPolicy" />
- <keyword match="RequestProcessingPolicyOperations" />
- <keyword match="RequestProcessingPolicyValue" />
- <keyword match="RescaleOp" />
- <keyword match="ResolutionSyntax" />
- <keyword match="Resolver" />
- <keyword match="ResolveResult" />
- <keyword match="ResourceBundle" />
- <keyword match="ResponseHandler" />
- <keyword match="Result" />
- <keyword match="ResultSet" />
- <keyword match="ResultSetMetaData" />
- <keyword match="ReverbType" />
- <keyword match="RGBImageFilter" />
- <keyword match="RMIClassLoader" />
- <keyword match="RMIClassLoaderSpi" />
- <keyword match="RMIClientSocketFactory" />
- <keyword match="RMIFailureHandler" />
- <keyword match="RMISecurityException" />
- <keyword match="RMISecurityManager" />
- <keyword match="RMIServerSocketFactory" />
- <keyword match="RMISocketFactory" />
- <keyword match="Robot" />
- <keyword match="RootPaneContainer" />
- <keyword match="RootPaneUI" />
- <keyword match="RoundRectangle2D" />
-
-
- <keyword match="RowMapper" />
- <keyword match="RowSet" />
- <keyword match="RowSetEvent" />
- <keyword match="RowSetInternal" />
- <keyword match="RowSetListener" />
- <keyword match="RowSetMetaData" />
- <keyword match="RowSetReader" />
- <keyword match="RowSetWriter" />
- <keyword match="RSAKey" />
- <keyword match="RSAKeyGenParameterSpec" />
- <keyword match="RSAMultiPrimePrivateCrtKey" />
- <keyword match="RSAMultiPrimePrivateCrtKeySpec" />
- <keyword match="RSAOtherPrimeInfo" />
- <keyword match="RSAPrivateCrtKey" />
- <keyword match="RSAPrivateCrtKeySpec" />
- <keyword match="RSAPrivateKey" />
- <keyword match="RSAPrivateKeySpec" />
- <keyword match="RSAPublicKey" />
- <keyword match="RSAPublicKeySpec" />
- <keyword match="RTFEditorKit" />
- <keyword match="RuleBasedCollator" />
- <keyword match="Runnable" />
- <keyword match="Runtime" />
- <keyword match="RunTime" />
- <keyword match="RuntimeException" />
- <keyword match="RunTimeOperations" />
- <keyword match="RuntimePermission" />
- <keyword match="SampleModel" />
- <keyword match="Savepoint" />
- <keyword match="SAXException" />
- <keyword match="SAXNotRecognizedException" />
- <keyword match="SAXNotSupportedException" />
- <keyword match="SAXParseException" />
- <keyword match="SAXParser" />
- <keyword match="SAXParserFactory" />
- <keyword match="SAXResult" />
- <keyword match="SAXSource" />
- <keyword match="SAXTransformerFactory" />
- <keyword match="ScatteringByteChannel" />
- <keyword match="SchemaViolationException" />
- <keyword match="Scrollable" />
- <keyword match="Scrollbar" />
- <keyword match="ScrollBarUI" />
- <keyword match="ScrollPane" />
- <keyword match="ScrollPaneAdjustable" />
- <keyword match="ScrollPaneConstants" />
- <keyword match="ScrollPaneLayout" />
-
- <keyword match="ScrollPaneUI" />
- <keyword match="SealedObject" />
- <keyword match="SearchControls" />
- <keyword match="SearchResult" />
- <keyword match="SecretKey" />
- <keyword match="SecretKeyFactory" />
- <keyword match="SecretKeyFactorySpi" />
- <keyword match="SecretKeySpec" />
- <keyword match="SecureClassLoader" />
- <keyword match="SecureRandom" />
- <keyword match="SecureRandomSpi" />
- <keyword match="Security" />
- <keyword match="SecurityException" />
- <keyword match="SecurityManager" />
- <keyword match="SecurityPermission" />
- <keyword match="Segment" />
- <keyword match="SelectableChannel" />
- <keyword match="SelectionKey" />
- <keyword match="Selector" />
- <keyword match="SelectorProvider" />
- <keyword match="SeparatorUI" />
- <keyword match="Sequence" />
- <keyword match="SequenceInputStream" />
- <keyword match="Sequencer" />
-
- <keyword match="Serializable" />
- <keyword match="SerializablePermission" />
- <keyword match="Servant" />
- <keyword match="SERVANT_RETENTION_POLICY_ID" />
- <keyword match="ServantActivator" />
- <keyword match="ServantActivatorHelper" />
- <keyword match="ServantActivatorOperations" />
- <keyword match="ServantActivatorPOA" />
- <keyword match="ServantAlreadyActive" />
- <keyword match="ServantAlreadyActiveHelper" />
- <keyword match="ServantLocator" />
- <keyword match="ServantLocatorHelper" />
- <keyword match="ServantLocatorOperations" />
- <keyword match="ServantLocatorPOA" />
- <keyword match="ServantManager" />
- <keyword match="ServantManagerOperations" />
- <keyword match="ServantNotActive" />
- <keyword match="ServantNotActiveHelper" />
- <keyword match="ServantObject" />
- <keyword match="ServantRetentionPolicy" />
- <keyword match="ServantRetentionPolicyOperations" />
- <keyword match="ServantRetentionPolicyValue" />
- <keyword match="ServerCloneException" />
- <keyword match="ServerError" />
- <keyword match="ServerException" />
- <keyword match="ServerNotActiveException" />
- <keyword match="ServerRef" />
- <keyword match="ServerRequest" />
- <keyword match="ServerRequestInfo" />
- <keyword match="ServerRequestInfoOperations" />
- <keyword match="ServerRequestInterceptor" />
- <keyword match="ServerRequestInterceptorOperations" />
- <keyword match="ServerRuntimeException" />
- <keyword match="ServerSocket" />
- <keyword match="ServerSocketChannel" />
- <keyword match="ServerSocketFactory" />
- <keyword match="ServiceContext" />
- <keyword match="ServiceContextHelper" />
- <keyword match="ServiceContextHolder" />
- <keyword match="ServiceContextListHelper" />
- <keyword match="ServiceContextListHolder" />
- <keyword match="ServiceDetail" />
- <keyword match="ServiceDetailHelper" />
- <keyword match="ServiceIdHelper" />
- <keyword match="ServiceInformation" />
- <keyword match="ServiceInformationHelper" />
- <keyword match="ServiceInformationHolder" />
- <keyword match="ServicePermission" />
- <keyword match="ServiceRegistry" />
-
- <keyword match="ServiceUI" />
- <keyword match="ServiceUIFactory" />
- <keyword match="ServiceUnavailableException" />
- <keyword match="Set" />
- <keyword match="SetOfIntegerSyntax" />
- <keyword match="SetOverrideType" />
- <keyword match="SetOverrideTypeHelper" />
- <keyword match="Severity" />
- <keyword match="Shape" />
- <keyword match="ShapeGraphicAttribute" />
- <keyword match="SheetCollate" />
- <keyword match="Short" />
- <keyword match="ShortBuffer" />
- <keyword match="ShortBufferException" />
- <keyword match="ShortHolder" />
- <keyword match="ShortLookupTable" />
- <keyword match="ShortMessage" />
- <keyword match="ShortSeqHelper" />
- <keyword match="ShortSeqHolder" />
- <keyword match="Sides" />
- <keyword match="Signature" />
- <keyword match="SignatureException" />
- <keyword match="SignatureSpi" />
- <keyword match="SignedObject" />
- <keyword match="Signer" />
- <keyword match="SimpleAttributeSet" />
- <keyword match="SimpleBeanInfo" />
- <keyword match="SimpleDateFormat" />
- <keyword match="SimpleDoc" />
- <keyword match="SimpleFormatter" />
- <keyword match="SimpleTimeZone" />
- <keyword match="SinglePixelPackedSampleModel" />
- <keyword match="SingleSelectionModel" />
- <keyword match="Size2DSyntax" />
- <keyword match="SizeLimitExceededException" />
- <keyword match="SizeRequirements" />
- <keyword match="SizeSequence" />
- <keyword match="Skeleton" />
- <keyword match="SkeletonMismatchException" />
- <keyword match="SkeletonNotFoundException" />
- <keyword match="SliderUI" />
- <keyword match="Socket" />
- <keyword match="SocketAddress" />
- <keyword match="SocketChannel" />
- <keyword match="SocketException" />
- <keyword match="SocketFactory" />
- <keyword match="SocketHandler" />
- <keyword match="SocketImpl" />
- <keyword match="SocketImplFactory" />
- <keyword match="SocketOptions" />
- <keyword match="SocketPermission" />
- <keyword match="SocketSecurityException" />
- <keyword match="SocketTimeoutException" />
- <keyword match="SoftBevelBorder" />
- <keyword match="SoftReference" />
- <keyword match="SortedMap" />
- <keyword match="SortedSet" />
- <keyword match="SortingFocusTraversalPolicy" />
- <keyword match="Soundbank" />
- <keyword match="SoundbankReader" />
- <keyword match="SoundbankResource" />
- <keyword match="Source" />
- <keyword match="SourceDataLine" />
- <keyword match="SourceLocator" />
- <keyword match="SpinnerDateModel" />
- <keyword match="SpinnerListModel" />
- <keyword match="SpinnerModel" />
- <keyword match="SpinnerNumberModel" />
- <keyword match="SpinnerUI" />
- <keyword match="SplitPaneUI" />
- <keyword match="Spring" />
- <keyword match="SpringLayout" />
-
- <keyword match="SQLData" />
- <keyword match="SQLException" />
- <keyword match="SQLInput" />
- <keyword match="SQLOutput" />
- <keyword match="SQLPermission" />
- <keyword match="SQLWarning" />
- <keyword match="SSLContext" />
- <keyword match="SSLContextSpi" />
- <keyword match="SSLException" />
- <keyword match="SSLHandshakeException" />
- <keyword match="SSLKeyException" />
- <keyword match="SSLPeerUnverifiedException" />
- <keyword match="SSLPermission" />
- <keyword match="SSLProtocolException" />
- <keyword match="SSLServerSocket" />
- <keyword match="SSLServerSocketFactory" />
- <keyword match="SSLSession" />
- <keyword match="SSLSessionBindingEvent" />
- <keyword match="SSLSessionBindingListener" />
- <keyword match="SSLSessionContext" />
- <keyword match="SSLSocket" />
- <keyword match="SSLSocketFactory" />
- <keyword match="Stack" />
- <keyword match="StackOverflowError" />
- <keyword match="StackTraceElement" />
- <keyword match="StartTlsRequest" />
- <keyword match="StartTlsResponse" />
- <keyword match="State" />
- <keyword match="StateEdit" />
- <keyword match="StateEditable" />
- <keyword match="StateFactory" />
- <keyword match="Statement" />
- <keyword match="Statement" />
- <keyword match="Streamable" />
- <keyword match="StreamableValue" />
- <keyword match="StreamCorruptedException" />
- <keyword match="StreamHandler" />
- <keyword match="StreamPrintService" />
- <keyword match="StreamPrintServiceFactory" />
- <keyword match="StreamResult" />
- <keyword match="StreamSource" />
- <keyword match="StreamTokenizer" />
- <keyword match="StrictMath" />
- <keyword match="String" />
- <keyword match="StringBuffer" />
- <keyword match="StringBufferInputStream" />
- <keyword match="StringCharacterIterator" />
- <keyword match="StringContent" />
- <keyword match="StringHolder" />
- <keyword match="StringIndexOutOfBoundsException" />
- <keyword match="StringNameHelper" />
- <keyword match="StringReader" />
- <keyword match="StringRefAddr" />
- <keyword match="StringSelection" />
- <keyword match="StringSeqHelper" />
- <keyword match="StringSeqHolder" />
- <keyword match="StringTokenizer" />
- <keyword match="StringValueHelper" />
- <keyword match="StringWriter" />
- <keyword match="Stroke" />
- <keyword match="Struct" />
- <keyword match="StructMember" />
- <keyword match="StructMemberHelper" />
- <keyword match="Stub" />
- <keyword match="StubDelegate" />
- <keyword match="StubNotFoundException" />
- <keyword match="Style" />
- <keyword match="StyleConstants" />
-
-
-
-
- <keyword match="StyleContext" />
- <keyword match="StyledDocument" />
- <keyword match="StyledEditorKit" />
-
-
-
-
-
-
-
-
- <keyword match="StyleSheet" />
-
-
- <keyword match="Subject" />
- <keyword match="SubjectDomainCombiner" />
- <keyword match="SUCCESSFUL" />
- <keyword match="SupportedValuesAttribute" />
- <keyword match="SwingConstants" />
- <keyword match="SwingPropertyChangeSupport" />
- <keyword match="SwingUtilities" />
- <keyword match="SYNC_WITH_TRANSPORT" />
- <keyword match="SyncFailedException" />
- <keyword match="SyncScopeHelper" />
- <keyword match="Synthesizer" />
- <keyword match="SysexMessage" />
- <keyword match="System" />
- <keyword match="SYSTEM_EXCEPTION" />
- <keyword match="SystemColor" />
- <keyword match="SystemException" />
- <keyword match="SystemFlavorMap" />
- <keyword match="TabableView" />
- <keyword match="TabbedPaneUI" />
- <keyword match="TabExpander" />
- <keyword match="TableCellEditor" />
- <keyword match="TableCellRenderer" />
- <keyword match="TableColumn" />
- <keyword match="TableColumnModel" />
- <keyword match="TableColumnModelEvent" />
- <keyword match="TableColumnModelListener" />
- <keyword match="TableHeaderUI" />
- <keyword match="TableModel" />
- <keyword match="TableModelEvent" />
- <keyword match="TableModelListener" />
- <keyword match="TableUI" />
- <keyword match="TableView" />
- <keyword match="TabSet" />
- <keyword match="TabStop" />
- <keyword match="TAG_ALTERNATE_IIOP_ADDRESS" />
- <keyword match="TAG_CODE_SETS" />
- <keyword match="TAG_INTERNET_IOP" />
- <keyword match="TAG_JAVA_CODEBASE" />
- <keyword match="TAG_MULTIPLE_COMPONENTS" />
- <keyword match="TAG_ORB_TYPE" />
- <keyword match="TAG_POLICIES" />
- <keyword match="TagElement" />
- <keyword match="TaggedComponent" />
- <keyword match="TaggedComponentHelper" />
- <keyword match="TaggedComponentHolder" />
- <keyword match="TaggedProfile" />
- <keyword match="TaggedProfileHelper" />
- <keyword match="TaggedProfileHolder" />
- <keyword match="TargetDataLine" />
- <keyword match="TCKind" />
- <keyword match="Templates" />
- <keyword match="TemplatesHandler" />
- <keyword match="Text" />
- <keyword match="TextAction" />
- <keyword match="TextArea" />
- <keyword match="TextAttribute" />
- <keyword match="TextComponent" />
- <keyword match="TextEvent" />
- <keyword match="TextField" />
- <keyword match="TextHitInfo" />
- <keyword match="TextInputCallback" />
- <keyword match="TextLayout" />
-
- <keyword match="TextListener" />
- <keyword match="TextMeasurer" />
- <keyword match="TextOutputCallback" />
- <keyword match="TextSyntax" />
- <keyword match="TextUI" />
- <keyword match="TexturePaint" />
- <keyword match="Thread" />
- <keyword match="THREAD_POLICY_ID" />
- <keyword match="ThreadDeath" />
- <keyword match="ThreadGroup" />
- <keyword match="ThreadLocal" />
- <keyword match="ThreadPolicy" />
- <keyword match="ThreadPolicyOperations" />
- <keyword match="ThreadPolicyValue" />
- <keyword match="Throwable" />
- <keyword match="Tie" />
- <keyword match="TileObserver" />
- <keyword match="Time" />
- <keyword match="TimeLimitExceededException" />
- <keyword match="Timer" />
- <keyword match="Timer" />
- <keyword match="TimerTask" />
- <keyword match="Timestamp" />
- <keyword match="TimeZone" />
- <keyword match="TitledBorder" />
- <keyword match="ToolBarUI" />
- <keyword match="Toolkit" />
- <keyword match="ToolTipManager" />
- <keyword match="ToolTipUI" />
- <keyword match="TooManyListenersException" />
- <keyword match="Track" />
- <keyword match="TRANSACTION_REQUIRED" />
- <keyword match="TRANSACTION_ROLLEDBACK" />
- <keyword match="TransactionRequiredException" />
- <keyword match="TransactionRolledbackException" />
- <keyword match="TransactionService" />
- <keyword match="Transferable" />
- <keyword match="TransferHandler" />
- <keyword match="TransformAttribute" />
- <keyword match="Transformer" />
- <keyword match="TransformerConfigurationException" />
- <keyword match="TransformerException" />
- <keyword match="TransformerFactory" />
- <keyword match="TransformerFactoryConfigurationError" />
- <keyword match="TransformerHandler" />
- <keyword match="TRANSIENT" />
- <keyword match="Transmitter" />
- <keyword match="Transparency" />
- <keyword match="TRANSPORT_RETRY" />
- <keyword match="TreeCellEditor" />
- <keyword match="TreeCellRenderer" />
- <keyword match="TreeExpansionEvent" />
- <keyword match="TreeExpansionListener" />
- <keyword match="TreeMap" />
- <keyword match="TreeModel" />
- <keyword match="TreeModelEvent" />
- <keyword match="TreeModelListener" />
- <keyword match="TreeNode" />
- <keyword match="TreePath" />
- <keyword match="TreeSelectionEvent" />
- <keyword match="TreeSelectionListener" />
- <keyword match="TreeSelectionModel" />
- <keyword match="TreeSet" />
- <keyword match="TreeUI" />
- <keyword match="TreeWillExpandListener" />
- <keyword match="TrustAnchor" />
- <keyword match="TrustManager" />
- <keyword match="TrustManagerFactory" />
- <keyword match="TrustManagerFactorySpi" />
- <keyword match="TypeCode" />
- <keyword match="TypeCodeHolder" />
- <keyword match="TypeMismatch" />
- <keyword match="TypeMismatch" />
- <keyword match="TypeMismatch" />
- <keyword match="TypeMismatchHelper" />
- <keyword match="TypeMismatchHelper" />
- <keyword match="Types" />
- <keyword match="UID" />
- <keyword match="UIDefaults" />
-
-
-
-
- <keyword match="UIManager" />
-
- <keyword match="UIResource" />
- <keyword match="ULongLongSeqHelper" />
- <keyword match="ULongLongSeqHolder" />
- <keyword match="ULongSeqHelper" />
- <keyword match="ULongSeqHolder" />
- <keyword match="UndeclaredThrowableException" />
- <keyword match="UndoableEdit" />
- <keyword match="UndoableEditEvent" />
- <keyword match="UndoableEditListener" />
- <keyword match="UndoableEditSupport" />
- <keyword match="UndoManager" />
- <keyword match="UnexpectedException" />
- <keyword match="UnicastRemoteObject" />
- <keyword match="UnionMember" />
- <keyword match="UnionMemberHelper" />
- <keyword match="UNKNOWN" />
- <keyword match="UnknownEncoding" />
- <keyword match="UnknownEncodingHelper" />
- <keyword match="UnknownError" />
- <keyword match="UnknownException" />
- <keyword match="UnknownGroupException" />
- <keyword match="UnknownHostException" />
- <keyword match="UnknownHostException" />
- <keyword match="UnknownObjectException" />
- <keyword match="UnknownServiceException" />
- <keyword match="UnknownUserException" />
- <keyword match="UnknownUserExceptionHelper" />
- <keyword match="UnknownUserExceptionHolder" />
- <keyword match="UnmappableCharacterException" />
- <keyword match="UnmarshalException" />
- <keyword match="UnmodifiableSetException" />
- <keyword match="UnrecoverableKeyException" />
- <keyword match="Unreferenced" />
- <keyword match="UnresolvedAddressException" />
- <keyword match="UnresolvedPermission" />
- <keyword match="UnsatisfiedLinkError" />
- <keyword match="UnsolicitedNotification" />
- <keyword match="UnsolicitedNotificationEvent" />
- <keyword match="UnsolicitedNotificationListener" />
- <keyword match="UNSUPPORTED_POLICY" />
- <keyword match="UNSUPPORTED_POLICY_VALUE" />
- <keyword match="UnsupportedAddressTypeException" />
- <keyword match="UnsupportedAudioFileException" />
- <keyword match="UnsupportedCallbackException" />
- <keyword match="UnsupportedCharsetException" />
- <keyword match="UnsupportedClassVersionError" />
- <keyword match="UnsupportedEncodingException" />
- <keyword match="UnsupportedFlavorException" />
- <keyword match="UnsupportedLookAndFeelException" />
- <keyword match="UnsupportedOperationException" />
- <keyword match="URI" />
- <keyword match="URIException" />
- <keyword match="URIResolver" />
- <keyword match="URISyntax" />
- <keyword match="URISyntaxException" />
- <keyword match="URL" />
- <keyword match="URLClassLoader" />
- <keyword match="URLConnection" />
- <keyword match="URLDecoder" />
- <keyword match="URLEncoder" />
- <keyword match="URLStreamHandler" />
- <keyword match="URLStreamHandlerFactory" />
- <keyword match="URLStringHelper" />
- <keyword match="USER_EXCEPTION" />
- <keyword match="UserException" />
- <keyword match="UShortSeqHelper" />
- <keyword match="UShortSeqHolder" />
- <keyword match="UTFDataFormatException" />
- <keyword match="Util" />
- <keyword match="UtilDelegate" />
- <keyword match="Utilities" />
- <keyword match="ValueBase" />
- <keyword match="ValueBaseHelper" />
- <keyword match="ValueBaseHolder" />
- <keyword match="ValueFactory" />
- <keyword match="ValueHandler" />
- <keyword match="ValueMember" />
- <keyword match="ValueMemberHelper" />
- <keyword match="VariableHeightLayoutCache" />
- <keyword match="Vector" />
- <keyword match="VerifyError" />
- <keyword match="VersionSpecHelper" />
- <keyword match="VetoableChangeListener" />
- <keyword match="VetoableChangeListenerProxy" />
- <keyword match="VetoableChangeSupport" />
- <keyword match="View" />
- <keyword match="ViewFactory" />
- <keyword match="ViewportLayout" />
- <keyword match="ViewportUI" />
- <keyword match="VirtualMachineError" />
- <keyword match="Visibility" />
- <keyword match="VisibilityHelper" />
- <keyword match="VM_ABSTRACT" />
- <keyword match="VM_CUSTOM" />
- <keyword match="VM_NONE" />
- <keyword match="VM_TRUNCATABLE" />
- <keyword match="VMID" />
- <keyword match="VoiceStatus" />
- <keyword match="Void" />
- <keyword match="VolatileImage" />
- <keyword match="WCharSeqHelper" />
- <keyword match="WCharSeqHolder" />
- <keyword match="WeakHashMap" />
- <keyword match="WeakReference" />
- <keyword match="Window" />
- <keyword match="WindowAdapter" />
- <keyword match="WindowConstants" />
- <keyword match="WindowEvent" />
- <keyword match="WindowFocusListener" />
- <keyword match="WindowListener" />
- <keyword match="WindowStateListener" />
- <keyword match="WrappedPlainView" />
- <keyword match="WritableByteChannel" />
- <keyword match="WritableRaster" />
- <keyword match="WritableRenderedImage" />
- <keyword match="WriteAbortedException" />
- <keyword match="Writer" />
- <keyword match="WrongAdapter" />
- <keyword match="WrongAdapterHelper" />
- <keyword match="WrongPolicy" />
- <keyword match="WrongPolicyHelper" />
- <keyword match="WrongTransaction" />
- <keyword match="WrongTransactionHelper" />
- <keyword match="WrongTransactionHolder" />
- <keyword match="WStringSeqHelper" />
- <keyword match="WStringSeqHolder" />
- <keyword match="WStringValueHelper" />
- <keyword match="X500Principal" />
- <keyword match="X500PrivateCredential" />
- <keyword match="X509Certificate" />
- <keyword match="X509Certificate" />
- <keyword match="X509CertSelector" />
- <keyword match="X509CRL" />
- <keyword match="X509CRLEntry" />
- <keyword match="X509CRLSelector" />
- <keyword match="X509EncodedKeySpec" />
- <keyword match="X509Extension" />
- <keyword match="X509KeyManager" />
- <keyword match="X509TrustManager" />
- <keyword match="XAConnection" />
- <keyword match="XADataSource" />
- <keyword match="XAException" />
- <keyword match="XAResource" />
- <keyword match="Xid" />
- <keyword match="XMLDecoder" />
- <keyword match="XMLEncoder" />
- <keyword match="XMLFilter" />
- <keyword match="XMLFilterImpl" />
- <keyword match="XMLFormatter" />
- <keyword match="XMLReader" />
- <keyword match="XMLReaderAdapter" />
- <keyword match="XMLReaderFactory" />
- <keyword match="ZipEntry" />
- <keyword match="ZipException" />
- <keyword match="ZipFile" />
- <keyword match="ZipInputStream" />
- <keyword match="ZipOutputStream" />
- <keyword match="ZoneView" />
- <keyword match="_BindingIteratorImplBase" />
- <keyword match="_BindingIteratorStub" />
- <keyword match="_DynAnyFactoryStub" />
- <keyword match="_DynAnyStub" />
- <keyword match="_DynArrayStub" />
- <keyword match="_DynEnumStub" />
- <keyword match="_DynFixedStub" />
- <keyword match="_DynSequenceStub" />
- <keyword match="_DynStructStub" />
- <keyword match="_DynUnionStub" />
- <keyword match="_DynValueStub" />
- <keyword match="_IDLTypeStub" />
- <keyword match="_NamingContextExtStub" />
- <keyword match="_NamingContextImplBase" />
- <keyword match="_NamingContextStub" />
- <keyword match="_PolicyStub" />
- <keyword match="_Remote_Stub" />
- <keyword match="_ServantActivatorStub" />
- <keyword match="_ServantLocatorStub" />
- </keywords>
-
-</highlight>
diff --git a/library/Text_Highlighter/javascript.xml b/library/Text_Highlighter/javascript.xml
deleted file mode 100644
index e478515a7..000000000
--- a/library/Text_Highlighter/javascript.xml
+++ /dev/null
@@ -1,174 +0,0 @@
-<?xml version="1.0"?>
-<!-- $Id: javascript.xml,v 1.3 2008-01-01 23:43:36 ssttoo Exp $ -->
-
-<highlight lang="javascript" case = "no">
-
- <authors>
- <author name="Andrey Demenev" email ="demenev@gmail.com"/>
- </authors>
-
- <default innerClass="code" />
-
- <region name="block" delimClass="brackets" innerClass="code" start="\{" end="\}">
- <contains all="yes"/>
- </region>
-
- <region name="brackets" delimClass="brackets" innerClass="code" start="\(" end="\)">
- <contains all="yes"/>
- </region>
-
- <region name="sqbrackets" delimClass="brackets" innerClass="code" start="\[" end="\]">
- <contains all="yes"/>
- </region>
-
-
- <region name="mlcomment" innerClass="comment" start="\/\*" end="\*\/" >
- <contains block="cvstag"/>
- </region>
-
- <region name="strdouble" delimClass="quotes" innerClass="string" start="&quot;" end="&quot;"/>
-
- <region name="strsingle" delimClass="quotes" innerClass="string" start="'" end="'" />
-
- <block name="escaped" match="\\\\|\\&quot;|\\'|\\`" innerClass="special" contained="yes">
- <onlyin region="strsingle"/>
- </block>
-
- <block name="descaped" match="\\\\|\\&quot;|\\'|\\`|\\t|\\n|\\r" innerClass="special" contained="yes">
- <onlyin region="strdouble"/>
- </block>
-
- <region name="comment" start="\/\/" end="/$/m" innerClass="comment">
- <contains block="cvstag"/>
- </region>
-
- <block name="identifier" match="[a-z_]\w*" innerClass="identifier" case="no"/>
-
- <block name="number" match="0x\d*|\d*\.?\d+" innerClass="number"/>
-
-
- <block name="url" match="((https?|ftp):\/\/[\w\?\.\-\&amp;=\/%+]+)|(^|[\s,!?])www\.\w+\.\w+[\w\?\.\&amp;=\/%+]*" innerClass="url" contained="yes">
- <onlyin region="mlcomment"/>
- <onlyin region="comment"/>
- </block>
-
- <block name="email" match="\w+[\.\w\-]+@(\w+[\.\w\-])+" innerClass="url" contained="yes">
- <onlyin region="mlcomment"/>
- <onlyin region="comment"/>
- </block>
-
- <block name="note" match="\b(note|fixme):" innerClass="inlinedoc" contained="yes" case="no">
- <onlyin region="mlcomment"/>
- <onlyin region="comment"/>
- </block>
-
-
- <block name="cvstag" match="\$\w+:.+\$" innerClass="inlinedoc" contained="yes">
- <onlyin region="mlcomment"/>
- <onlyin region="comment"/>
- </block>
-
- <keywords name="builtin" inherits="identifier" innerClass="builtin" case = "yes">
- <keyword match="String"/>
- <keyword match="Array"/>
- <keyword match="RegExp"/>
- <keyword match="Function"/>
- <keyword match="Math"/>
- <keyword match="Number"/>
- <keyword match="Date"/>
- <keyword match="Image"/>
- <keyword match="window"/>
- <keyword match="document"/>
- <keyword match="navigator"/>
- <keyword match="onAbort"/>
- <keyword match="onBlur"/>
- <keyword match="onChange"/>
- <keyword match="onClick"/>
- <keyword match="onDblClick"/>
- <keyword match="onDragDrop"/>
- <keyword match="onError"/>
- <keyword match="onFocus"/>
- <keyword match="onKeyDown"/>
- <keyword match="onKeyPress"/>
- <keyword match="onKeyUp"/>
- <keyword match="onLoad"/>
- <keyword match="onMouseDown"/>
- <keyword match="onMouseOver"/>
- <keyword match="onMouseOut"/>
- <keyword match="onMouseMove"/>
- <keyword match="onMouseUp"/>
- <keyword match="onMove"/>
- <keyword match="onReset"/>
- <keyword match="onResize"/>
- <keyword match="onSelect"/>
- <keyword match="onSubmit"/>
- <keyword match="onUnload"/>
- </keywords>
-
- <keywords name="reserved" inherits="identifier" innerClass="reserved" case = "yes">
- <keyword match="break"/>
- <keyword match="continue"/>
- <keyword match="do"/>
- <keyword match="while"/>
- <keyword match="do"/>
- <keyword match="export"/>
- <keyword match="for"/>
- <keyword match="in"/>
- <keyword match="if"/>
- <keyword match="else"/>
- <keyword match="import"/>
- <keyword match="return"/>
- <keyword match="label"/>
- <keyword match="switch"/>
- <keyword match="case"/>
- <keyword match="var"/>
- <keyword match="with"/>
- <keyword match="delete"/>
- <keyword match="new"/>
- <keyword match="this"/>
- <keyword match="typeof"/>
- <keyword match="void"/>
- <keyword match="abstract"/>
- <keyword match="boolean"/>
- <keyword match="byte"/>
- <keyword match="catch"/>
- <keyword match="char"/>
- <keyword match="class"/>
- <keyword match="const"/>
- <keyword match="continue"/>
- <keyword match="debugger"/>
- <keyword match="default"/>
- <keyword match="double"/>
- <keyword match="enum"/>
- <keyword match="extends"/>
- <keyword match="false"/>
- <keyword match="final"/>
- <keyword match="finally"/>
- <keyword match="float"/>
- <keyword match="function"/>
- <keyword match="implements"/>
- <keyword match="goto"/>
- <keyword match="in"/>
- <keyword match="instanceof"/>
- <keyword match="int"/>
- <keyword match="interface"/>
- <keyword match="long"/>
- <keyword match="native"/>
- <keyword match="null"/>
- <keyword match="package"/>
- <keyword match="private"/>
- <keyword match="protected"/>
- <keyword match="public"/>
- <keyword match="short"/>
- <keyword match="static"/>
- <keyword match="super"/>
- <keyword match="synchronized"/>
- <keyword match="throw"/>
- <keyword match="throws"/>
- <keyword match="transient"/>
- <keyword match="true"/>
- <keyword match="try"/>
- <keyword match="volatile"/>
- </keywords>
-
-</highlight>
diff --git a/library/Text_Highlighter/mysql.xml b/library/Text_Highlighter/mysql.xml
deleted file mode 100644
index 082b62795..000000000
--- a/library/Text_Highlighter/mysql.xml
+++ /dev/null
@@ -1,424 +0,0 @@
-<?xml version="1.0"?>
-<!-- $Id: mysql.xml,v 1.1 2007-06-03 02:35:28 ssttoo Exp $ -->
-
-<highlight lang="mysql" case="no">
-
- <authors>
- <author name="Andrey Demenev" email="demenev@gmail.com"/>
- </authors>
-
-
- <default innerClass="code" />
-
- <region name="qidentifier" delimClass="quotes" innerClass="identifier"
- start="`" end="`" />
-
- <region name="mlcomment" delimClass="comment" innerClass="comment"
- start="\/\*" end="\*\/" />
-
- <block name="comment" match="(#|--\s).*" innerClass="comment" />
-
- <block name="possiblefunction" match="[a-z_]\w*(?=\s*\()" innerClass="identifier" />
-
- <block name="identifier" match="[a-z_]\w*" innerClass="identifier" />
-
- <region name="strdouble" delimClass="quotes" innerClass="string"
- start="&quot;" end="&quot;" >
- </region>
-
- <region name="brackets" delimClass="brackets" innerClass="code"
- start="\(" end="\)" >
- <contains all="yes"/>
- </region>
-
- <region name="strsingle" delimClass="quotes" innerClass="string"
- start="'" end="'" />
-
- <block name="escaped" match="\\." innerClass="special" contained="yes">
- <onlyin region="strsingle"/>
- <onlyin region="strdouble"/>
- </block>
-
- <block name="exponent"
- match="((\d+|((\d*\.\d+)|(\d+\.\d*)))[eE][+-]?\d+)"
- innerClass="number" />
-
- <block name="float" match="(\d*\.\d+)|(\d+\.\d*)" innerClass="number"/>
-
- <block name="integer" match="\d+l?|\b0l?\b" innerClass="number" />
-
- <block name="hexinteger" match="0[xX][\da-f]+l?" innerClass="number" />
-
- <keywords name="reserved" inherits="identifier" innerClass="reserved"
- case="no">
- <keyword match="action" />
- <keyword match="add" />
- <keyword match="aggregate" />
- <keyword match="all" />
- <keyword match="alter" />
- <keyword match="after" />
- <keyword match="and" />
- <keyword match="as" />
- <keyword match="asc" />
- <keyword match="avg" />
- <keyword match="avg_row_length" />
- <keyword match="auto_increment" />
- <keyword match="between" />
- <keyword match="bigint" />
- <keyword match="bit" />
-
- <keyword match="binary" />
- <keyword match="blob" />
- <keyword match="bool" />
- <keyword match="both" />
- <keyword match="by" />
- <keyword match="cascade" />
- <keyword match="case" />
- <keyword match="char" />
- <keyword match="character" />
- <keyword match="change" />
- <keyword match="check" />
- <keyword match="checksum" />
- <keyword match="column" />
- <keyword match="columns" />
- <keyword match="comment" />
- <keyword match="constraint" />
- <keyword match="create" />
-
- <keyword match="cross" />
- <keyword match="current_date" />
- <keyword match="current_time" />
- <keyword match="current_timestamp" />
- <keyword match="data" />
- <keyword match="database" />
- <keyword match="databases" />
- <keyword match="date" />
- <keyword match="datetime" />
- <keyword match="day" />
- <keyword match="day_hour" />
- <keyword match="day_minute" />
- <keyword match="day_second" />
- <keyword match="dayofmonth" />
- <keyword match="dayofweek" />
- <keyword match="dayofyear" />
- <keyword match="dec" />
-
- <keyword match="decimal" />
- <keyword match="default" />
- <keyword match="delayed" />
- <keyword match="delay_key_write" />
- <keyword match="delete" />
- <keyword match="desc" />
- <keyword match="describe" />
- <keyword match="distinct" />
- <keyword match="distinctrow" />
- <keyword match="double" />
- <keyword match="drop" />
- <keyword match="end" />
- <keyword match="else" />
- <keyword match="escape" />
- <keyword match="escaped" />
- <keyword match="enclosed" />
- <keyword match="enum" />
-
- <keyword match="explain" />
- <keyword match="exists" />
- <keyword match="fields" />
- <keyword match="file" />
- <keyword match="first" />
- <keyword match="float" />
- <keyword match="float4" />
- <keyword match="float8" />
- <keyword match="flush" />
- <keyword match="foreign" />
- <keyword match="from" />
- <keyword match="for" />
- <keyword match="full" />
- <keyword match="function" />
- <keyword match="global" />
- <keyword match="grant" />
- <keyword match="grants" />
-
- <keyword match="group" />
- <keyword match="having" />
- <keyword match="heap" />
- <keyword match="high_priority" />
- <keyword match="hour" />
- <keyword match="hour_minute" />
- <keyword match="hour_second" />
- <keyword match="hosts" />
- <keyword match="identified" />
- <keyword match="ignore" />
- <keyword match="in" />
- <keyword match="index" />
- <keyword match="infile" />
- <keyword match="inner" />
- <keyword match="insert" />
- <keyword match="insert_id" />
- <keyword match="int" />
-
- <keyword match="integer" />
- <keyword match="interval" />
- <keyword match="int1" />
- <keyword match="int2" />
- <keyword match="int3" />
- <keyword match="int4" />
- <keyword match="int8" />
- <keyword match="into" />
- <keyword match="if" />
- <keyword match="is" />
- <keyword match="isam" />
- <keyword match="join" />
- <keyword match="key" />
- <keyword match="keys" />
- <keyword match="kill" />
- <keyword match="last_insert_id" />
- <keyword match="leading" />
-
- <keyword match="left" />
- <keyword match="length" />
- <keyword match="like" />
- <keyword match="lines" />
- <keyword match="limit" />
- <keyword match="load" />
- <keyword match="local" />
- <keyword match="lock" />
- <keyword match="logs" />
- <keyword match="long" />
- <keyword match="longblob" />
- <keyword match="longtext" />
- <keyword match="low_priority" />
- <keyword match="max" />
- <keyword match="max_rows" />
- <keyword match="match" />
- <keyword match="mediumblob" />
-
- <keyword match="mediumtext" />
- <keyword match="mediumint" />
- <keyword match="middleint" />
- <keyword match="min_rows" />
- <keyword match="minute" />
- <keyword match="minute_second" />
- <keyword match="modify" />
- <keyword match="month" />
- <keyword match="monthname" />
- <keyword match="myisam" />
- <keyword match="natural" />
- <keyword match="numeric" />
- <keyword match="no" />
- <keyword match="not" />
- <keyword match="null" />
- <keyword match="on" />
- <keyword match="optimize" />
-
- <keyword match="option" />
- <keyword match="optionally" />
- <keyword match="or" />
- <keyword match="order" />
- <keyword match="outer" />
- <keyword match="outfile" />
- <keyword match="pack_keys" />
- <keyword match="partial" />
- <keyword match="password" />
- <keyword match="precision" />
- <keyword match="primary" />
- <keyword match="procedure" />
- <keyword match="process" />
- <keyword match="processlist" />
- <keyword match="privileges" />
- <keyword match="read" />
- <keyword match="real" />
-
- <keyword match="references" />
- <keyword match="reload" />
- <keyword match="regexp" />
- <keyword match="rename" />
- <keyword match="replace" />
- <keyword match="restrict" />
- <keyword match="returns" />
- <keyword match="revoke" />
- <keyword match="rlike" />
- <keyword match="row" />
- <keyword match="rows" />
- <keyword match="second" />
- <keyword match="select" />
- <keyword match="set" />
- <keyword match="show" />
- <keyword match="shutdown" />
- <keyword match="smallint" />
-
- <keyword match="soname" />
- <keyword match="sql_big_tables" />
- <keyword match="sql_big_selects" />
- <keyword match="sql_low_priority_updates" />
- <keyword match="sql_log_off" />
- <keyword match="sql_log_update" />
- <keyword match="sql_select_limit" />
- <keyword match="sql_small_result" />
- <keyword match="sql_big_result" />
- <keyword match="sql_warnings" />
- <keyword match="straight_join" />
- <keyword match="starting" />
- <keyword match="status" />
- <keyword match="string" />
- <keyword match="table" />
- <keyword match="tables" />
- <keyword match="temporary" />
-
- <keyword match="terminated" />
- <keyword match="text" />
- <keyword match="then" />
- <keyword match="time" />
- <keyword match="timestamp" />
- <keyword match="tinyblob" />
- <keyword match="tinytext" />
- <keyword match="tinyint" />
- <keyword match="trailing" />
- <keyword match="to" />
- <keyword match="type" />
- <keyword match="use" />
- <keyword match="using" />
- <keyword match="unique" />
- <keyword match="unlock" />
- <keyword match="unsigned" />
- <keyword match="update" />
-
- <keyword match="usage" />
- <keyword match="values" />
- <keyword match="varchar" />
- <keyword match="variables" />
- <keyword match="varying" />
- <keyword match="varbinary" />
- <keyword match="with" />
- <keyword match="write" />
- <keyword match="when" />
- <keyword match="where" />
- <keyword match="year" />
- <keyword match="year_month" />
- <keyword match="zerofill" />
- </keywords>
-
- <keywords name="function" inherits="possiblefunction" innerClass="reserved"
- case="no" otherwise="identifier">
- <keyword match="ABS" />
- <keyword match="ACOS" />
- <keyword match="ADDDATE" />
- <keyword match="ASCII" />
- <keyword match="ASIN" />
- <keyword match="ATAN" />
- <keyword match="ATAN2" />
- <keyword match="AVG" />
- <keyword match="BENCHMARK" />
- <keyword match="BIN" />
- <keyword match="CEILING" />
- <keyword match="CHAR" />
- <keyword match="COALESCE" />
- <keyword match="CONCAT" />
- <keyword match="CONV" />
- <keyword match="COS" />
- <keyword match="COT" />
- <keyword match="COUNT" />
- <keyword match="CURDATE" />
- <keyword match="CURTIME" />
- <keyword match="DATABASE" />
- <keyword match="DAYNAME" />
- <keyword match="DAYOFMONTH" />
- <keyword match="DAYOFWEEK" />
- <keyword match="DAYOFYEAR" />
- <keyword match="DECODE" />
- <keyword match="DEGREES" />
- <keyword match="ELT" />
-
- <keyword match="ENCODE" />
- <keyword match="ENCRYPT" />
- <keyword match="EXP" />
- <keyword match="EXTRACT" />
-
- <keyword match="EXTRACT" />
- <keyword match="FIELD" />
- <keyword match="FLOOR" />
- <keyword match="FORMAT" />
- <keyword match="GREATEST" />
- <keyword match="HEX" />
- <keyword match="HOUR" />
- <keyword match="IF" />
- <keyword match="IFNULL" />
- <keyword match="INSERT" />
- <keyword match="INSTR" />
- <keyword match="INTERVAL" />
-
- <keyword match="ISNULL" />
- <keyword match="LCASE" />
- <keyword match="LEAST" />
- <keyword match="LEFT" />
- <keyword match="LENGTH" />
- <keyword match="LOCATE" />
-
- <keyword match="LOCATE" />
- <keyword match="LOG" />
- <keyword match="LOG10" />
- <keyword match="LOWER" />
- <keyword match="LPAD" />
- <keyword match="LTRIM" />
- <keyword match="MAX" />
- <keyword match="MD5" />
- <keyword match="MID" />
- <keyword match="MIN" />
-
- <keyword match="MINUTE" />
- <keyword match="MOD" />
- <keyword match="MONTH" />
- <keyword match="MONTHNAME" />
- <keyword match="NOW" />
- <keyword match="NULLIF" />
- <keyword match="OCT" />
- <keyword match="ORD" />
- <keyword match="PASSWORD" />
- <keyword match="PI" />
- <keyword match="POSITION" />
-
- <keyword match="POW" />
- <keyword match="POWER" />
- <keyword match="prepare" />
- <keyword match="QUARTER" />
- <keyword match="RADIANS" />
- <keyword match="RAND" />
- <keyword match="REPEAT" />
- <keyword match="REPLACE" />
- <keyword match="REVERSE" />
- <keyword match="RIGHT" />
- <keyword match="ROUND" />
-
- <keyword match="ROUND" />
- <keyword match="RPAD" />
-
- <keyword match="RTRIM" />
- <keyword match="SECOND" />
- <keyword match="SIGN" />
- <keyword match="SIN" />
- <keyword match="SOUNDEX" />
- <keyword match="SPACE" />
- <keyword match="SQRT" />
- <keyword match="STD" />
- <keyword match="STDDEV" />
- <keyword match="STRCMP" />
- <keyword match="SUBDATE" />
- <keyword match="SUBSTRING" />
-
- <keyword match="SUBSTRING" />
- <keyword match="SUM" />
- <keyword match="SYSDATE" />
- <keyword match="TAN" />
-
- <keyword match="TRIM" />
- <keyword match="TRUNCATE" />
- <keyword match="UCASE" />
- <keyword match="UPPER" />
- <keyword match="USER" />
- <keyword match="VERSION" />
- <keyword match="WEEK" />
- <keyword match="WEEKDAY" />
- <keyword match="YEAR" />
- </keywords>
-
-</highlight>
diff --git a/library/Text_Highlighter/perl.xml b/library/Text_Highlighter/perl.xml
deleted file mode 100644
index 54f8835ea..000000000
--- a/library/Text_Highlighter/perl.xml
+++ /dev/null
@@ -1,439 +0,0 @@
-<?xml version="1.0"?>
-<!-- $Id: perl.xml,v 1.1 2007-06-03 02:35:28 ssttoo Exp $ -->
-
-<highlight lang="perl" case = "yes">
-
- <authors>
- <author name="Mariusz 'kg' Jakubowski" email="kg@alternatywa.info" jid="kg@chrome.pl"/>
- <author name="Andrey Demenev" email="demenev@gmail.com"/>
- </authors>
-
- <comment>This highlighter is EXPERIMENTAL, so that it may work incorrectly.
-Most rules were created by Mariusz Jakubowski, and extended by me.
-My knowledge of Perl is poor, and Perl syntax seems too
-complicated to me.</comment>
-
- <default innerClass="code"/>
-
- <block name="interpreter" match="/^(#!)(.*)/m" innerClass="special">
- <partClass index="1" innerClass="special" />
- <partClass index="2" innerClass="string" />
- </block>
-
- <region name="pod" innerClass="comment" start="/^=\w+/m" end="/^=cut[^\n]*/m" startBOL="yes" endBOL="yes"/>
-
- <!--
- brackets
- -->
- <region name="block" delimClass="brackets" innerClass="code" start="\{" end="\}">
- <contains all="yes"/>
- </region>
-
- <region name="brackets" delimClass="brackets" innerClass="code" start="\(" end="\)">
- <contains all="yes"/>
- </region>
-
- <region name="sqbrackets" delimClass="brackets" innerClass="code" start="\[" end="\]">
- <contains all="yes"/>
- </region>
-
- <!--
- use smth
- -->
- <block name="usestatement" match="(use)\s+([\w:]*)" innerClass="special">
- <partClass index="1" innerClass="reserved" />
- <partClass index="2" innerClass="special" />
- </block>
-
- <block name="packagereference" match="[&amp; ](\w{2,}::)+\w{2,}" innerClass="special"/>
-
- <region name="q-w-q-statement"
- start="/\b(q[wq]\s*((\{)|(\()|(\[)|(\&lt;)|([\W\S])))(?=(.*)((?(3)\})(?(4)\))(?(5)\])(?(6)\&gt;)(?(7)\7)))/Us"
- end="%b2%"
- innerClass="string" delimClass="quotes" remember="yes">
-
- <contains block="containedvar"/>
- <contains block="specialvar"/>
- <contains block="curlyvar"/>
-
- </region>
-
- <region name="qstatement"
- start="/\b(q\s*((\{)|(\()|(\[)|(\&lt;)|([\W\S])))(?=(.*)((?(3)\})(?(4)\))(?(5)\])(?(6)\&gt;)(?(7)\7)))/Us"
- end="%b2%"
- innerClass="string" delimClass="quotes" remember="yes">
-
- </region>
-
- <!--
- comments
- -->
- <block name="comment" match="#.*" innerClass="comment" />
-
-
- <!--
- regexpr
- FIXME: this should be rewrited
- -->
- <block name="dblregexprver1" match="/(s|tr) ([|#~`!@$%^&amp;*-+=\\;:'&quot;,.\/?]) ((\\.|[^\\])*?) (\2)((\\.|[^\\])*?)(\2[ecgimosx]*)/x" innerClass="string">
- <partClass index="1" innerClass="quotes" />
- <partClass index="2" innerClass="quotes" />
- <partClass index="3" innerClass="string" />
- <partClass index="5" innerClass="quotes" />
- <partClass index="6" innerClass="string" />
- <partClass index="8" innerClass="quotes" />
- </block>
-
- <block name="dblregexprver2" match="/(m) ([|#~`!@$%^&amp;*-+=\\;:'&quot;,.\/?]) ((\\.|[^\\])*?) (\2[ecgimosx]*)/x" innerClass="string">
- <partClass index="1" innerClass="quotes" />
- <partClass index="2" innerClass="quotes" />
- <partClass index="3" innerClass="string" />
- <partClass index="5" innerClass="quotes" />
- </block>
-
-
- <region name="regexp" start=" \/" end="\/[cgimosx]*" innerClass="string" delimClass="quotes" case="yes">
- <contains block="reescaped"/>
- </region>
-
- <block name="reescaped" match="\\\/" innerClass="string" contained="yes">
- <onlyin region="regexp"/>
- </block>
-
- <!--
- variables
- FIXME: @{...}
- -->
- <block name="bracketsvars" match="([a-z1-9_]+)(\s*=>)" innerClass="string" contained="yes" case="no">
- <partClass index="1" innerClass="string" />
- <partClass index="2" innerClass="code" />
- <onlyin region="brackets"/>
- </block>
-
- <block name="specialvar" match="\$#?[1-9'`@!]" innerClass="var"/>
-
- <block name="var" match="(\$#?|[@%*])([a-z1-9_]+::)*([a-z1-9_]+|\^(?-i)[A-Z]?(?i))" innerClass="var" case="no"/>
- <block name="containedvar" match="\$([a-z1-9_]+|\^(?-i)[A-Z]?(?i))" innerClass="var" case="no"/>
-
- <!-- not shure what is this, but the Perlers do it :) -->
- <block name="var2" match="(&amp;|\w+)'[\w_']+\b" innerClass="var" case="no"/>
-
- <block name="classvar" match="(\{)([a-z1-9]+)(\})" innerClass="var" case="no">
- <partClass index="1" innerClass="brackets" />
- <partClass index="2" innerClass="var" />
- <partClass index="3" innerClass="brackets" />
- </block>
-
- <block name="curlyvar" match="[\$@%]#?\{[a-z1-9]+\}" innerClass="var" case="no"/>
-
- <!--
- quotes
- -->
- <region name="exec" delimClass="quotes" innerClass="string" start="`" end="`">
- <contains block="containedvar"/>
- <contains block="specialvar"/>
- <contains block="curlyvar"/>
- </region>
-
- <region name="strsingle" delimClass="quotes" innerClass="string" start="'" end="'"/>
-
- <block name="escaped" match="\\\\|\\&quot;|\\'|\\`" innerClass="special" contained="yes">
- <onlyin region="qstatement"/>
- <onlyin region="strsingle"/>
- <onlyin region="exec"/>
- </block>
-
- <region name="strdouble" delimClass="quotes" innerClass="string" start="&quot;" end="&quot;">
- <contains block="containedvar"/>
- <contains block="specialvar"/>
- <contains block="curlyvar"/>
- </region>
-
- <block name="descaped" match="\\[\\&quot;'`tnr\$\{@]" innerClass="special" contained="yes">
- <onlyin region="strdouble"/>
- <onlyin region="q-w-q-statement"/>
- </block>
-
- <!-- logical op.
- <block name="logic" match="\|\||&amp;&amp;" innerClass="reserved" contained="yes"/>-->
-
- <!--
- identifiers
- -->
- <block name="identifier" match="[a-z_]\w*" innerClass="identifier" case="no"/>
-
- <!--
- numbers
- -->
- <block name="number" match="\d*\.?\d+" innerClass="number"/>
-
- <!--
- http://www.perldoc.com/perl5.6/pod/perlfunc.html
- Alphabetical Listing of Perl Functions
- -->
- <keywords name="reserved" inherits="identifier" innerClass="reserved" case = "yes">
- <keyword match="abs"/>
- <keyword match="accept"/>
- <keyword match="alarm"/>
- <keyword match="atan2"/>
-
- <keyword match="bind"/>
- <keyword match="binmode"/>
- <keyword match="bless"/>
-
- <keyword match="caller"/>
- <keyword match="chdir"/>
- <keyword match="chmod"/>
- <keyword match="chomp"/>
- <keyword match="chop"/>
- <keyword match="chown"/>
- <keyword match="chr"/>
- <keyword match="chroot"/>
- <keyword match="close"/>
- <keyword match="closedir"/>
- <keyword match="connect"/>
- <keyword match="continue"/>
- <keyword match="cos"/>
- <keyword match="crypt"/>
-
- <keyword match="dbmclose"/>
- <keyword match="dbmopen"/>
- <keyword match="defined"/>
- <keyword match="delete"/>
- <keyword match="die"/>
- <keyword match="do"/>
- <keyword match="dump"/>
-
- <keyword match="each"/>
- <keyword match="endgrent"/>
- <keyword match="endhostent"/>
- <keyword match="endnetent"/>
- <keyword match="endprotoent"/>
- <keyword match="endpwent"/>
- <keyword match="endservent"/>
- <keyword match="eof"/>
- <keyword match="eval"/>
- <keyword match="exec"/>
- <keyword match="exists"/>
- <keyword match="exit"/>
- <keyword match="exp"/>
-
- <keyword match="fcntl"/>
- <keyword match="fileno"/>
- <keyword match="flock"/>
- <keyword match="fork"/>
- <keyword match="format"/>
- <keyword match="formline"/>
-
- <keyword match="getc"/>
- <keyword match="getgrent"/>
- <keyword match="getgrgid"/>
- <keyword match="getgrnam"/>
- <keyword match="gethostbyaddr"/>
- <keyword match="gethostbyname"/>
- <keyword match="gethostent"/>
- <keyword match="getlogin"/>
- <keyword match="getnetbyaddr"/>
- <keyword match="getnetbyname"/>
- <keyword match="getnetent"/>
- <keyword match="getpeername"/>
- <keyword match="getpgrp"/>
- <keyword match="getppid"/>
- <keyword match="getpriority"/>
- <keyword match="getprotobyname"/>
- <keyword match="getprotobynumber"/>
- <keyword match="getprotoent"/>
- <keyword match="getpwent"/>
- <keyword match="getpwnam"/>
- <keyword match="getpwuid"/>
- <keyword match="getservbyname"/>
- <keyword match="getservbyport"/>
- <keyword match="getservent"/>
- <keyword match="getsockname"/>
- <keyword match="getsockopt"/>
- <keyword match="glob"/>
- <keyword match="gmtime"/>
- <keyword match="goto"/>
- <keyword match="grep"/>
-
- <keyword match="hex"/>
-
- <keyword match="import"/>
- <keyword match="index"/>
- <keyword match="int"/>
- <keyword match="ioctl"/>
-
- <keyword match="join"/>
-
- <keyword match="keys"/>
- <keyword match="kill"/>
-
- <keyword match="last"/>
- <keyword match="lc"/>
- <keyword match="lcfirst"/>
- <keyword match="length"/>
- <keyword match="link"/>
- <keyword match="listen"/>
- <keyword match="local"/>
- <keyword match="localtime"/>
- <keyword match="lock"/>
- <keyword match="log"/>
- <keyword match="lstat"/>
-
- <!--<keyword match="m"/>-->
- <keyword match="map"/>
- <keyword match="mkdir"/>
- <keyword match="msgctl"/>
- <keyword match="msgget"/>
- <keyword match="msgrcv"/>
- <keyword match="msgsnd"/>
- <keyword match="my"/>
-
- <keyword match="next"/>
- <keyword match="no"/>
-
- <keyword match="oct"/>
- <keyword match="open"/>
- <keyword match="opendir"/>
- <keyword match="ord"/>
- <keyword match="our"/>
-
- <keyword match="pack"/>
- <keyword match="package"/>
- <keyword match="pipe"/>
- <keyword match="pop"/>
- <keyword match="pos"/>
- <keyword match="print"/>
- <keyword match="printf"/>
- <keyword match="prototype"/>
- <keyword match="push"/>
-
- <!--<keyword match="q"/>
- <keyword match="qq"/>
- <keyword match="qr"/>-->
- <keyword match="quotemeta"/>
- <!--<keyword match="qw"/>
- <keyword match="qx"/>-->
-
- <keyword match="rand"/>
- <keyword match="read"/>
- <keyword match="readdir"/>
- <keyword match="readline"/>
- <keyword match="readlink"/>
- <keyword match="readpipe"/>
- <keyword match="recv"/>
- <keyword match="redo"/>
- <keyword match="ref"/>
- <keyword match="rename"/>
- <keyword match="require"/>
- <keyword match="reset"/>
- <keyword match="return"/>
- <keyword match="reverse"/>
- <keyword match="rewinddir"/>
- <keyword match="rindex"/>
- <keyword match="rmdir"/>
-
- <!--<keyword match="s"/>-->
- <keyword match="scalar"/>
- <keyword match="seek"/>
- <keyword match="seekdir"/>
- <keyword match="select"/>
- <keyword match="semctl"/>
- <keyword match="semget"/>
- <keyword match="semop"/>
- <keyword match="send"/>
- <keyword match="setgrent"/>
- <keyword match="sethostent"/>
- <keyword match="setnetent"/>
- <keyword match="setpgrp"/>
- <keyword match="setpriority"/>
- <keyword match="setprotoent"/>
- <keyword match="setpwent"/>
- <keyword match="setservent"/>
- <keyword match="setsockopt"/>
- <keyword match="shift"/>
- <keyword match="shmctl"/>
- <keyword match="shmget"/>
- <keyword match="shmread"/>
- <keyword match="shmwrite"/>
- <keyword match="shutdown"/>
- <keyword match="sin"/>
- <keyword match="sleep"/>
- <keyword match="socket"/>
- <keyword match="socketpair"/>
- <keyword match="sort"/>
- <keyword match="splice"/>
- <keyword match="split"/>
- <keyword match="sprintf"/>
- <keyword match="sqrt"/>
- <keyword match="srand"/>
- <keyword match="stat"/>
- <keyword match="study"/>
- <keyword match="sub"/>
- <keyword match="substr"/>
- <keyword match="symlink"/>
- <keyword match="syscall"/>
- <keyword match="sysopen"/>
- <keyword match="sysread"/>
- <keyword match="sysseek"/>
- <keyword match="system"/>
- <keyword match="syswrite"/>
-
- <keyword match="tell"/>
- <keyword match="telldir"/>
- <keyword match="tie"/>
- <keyword match="tied"/>
- <keyword match="time"/>
- <keyword match="times"/>
- <!--<keyword match="tr"/>-->
- <keyword match="truncate"/>
-
- <keyword match="uc"/>
- <keyword match="ucfirst"/>
- <keyword match="umask"/>
- <keyword match="undef"/>
- <keyword match="unlink"/>
- <keyword match="unpack"/>
- <keyword match="unshift"/>
- <keyword match="untie"/>
- <keyword match="use"/>
- <keyword match="utime"/>
-
- <keyword match="values"/>
- <keyword match="vec"/>
-
- <keyword match="wait"/>
- <keyword match="waitpid"/>
- <keyword match="wantarray"/>
- <keyword match="warn"/>
- <keyword match="write"/>
-
- <keyword match="y"/>
- </keywords>
-
- <keywords name="missingreserved" inherits="identifier" innerClass="reserved" case = "yes">
- <keyword match="new"/>
- </keywords>
-
-
- <keywords name="flowcontrol" inherits="identifier" innerClass="reserved" case = "yes">
- <keyword match="if"/>
- <keyword match="else"/>
- <keyword match="elsif"/>
- <keyword match="while"/>
- <keyword match="unless"/>
- <keyword match="for"/>
- <keyword match="foreach"/>
- <keyword match="until"/>
- <keyword match="do"/>
- <keyword match="continue"/>
- <keyword match="not"/>
- <keyword match="or"/>
- <keyword match="and"/>
- <keyword match="eq"/>
- <keyword match="ne"/>
- <keyword match="gt"/>
- <keyword match="lt"/>
- </keywords>
-
-</highlight>
diff --git a/library/Text_Highlighter/php.xml b/library/Text_Highlighter/php.xml
deleted file mode 100644
index 1b08ea203..000000000
--- a/library/Text_Highlighter/php.xml
+++ /dev/null
@@ -1,194 +0,0 @@
-<?xml version="1.0"?>
-<!-- $Id: php.xml,v 1.1 2007-06-03 02:35:28 ssttoo Exp $ -->
-
-<highlight lang="php">
-
- <authors>
- <author name="Andrey Demenev" email ="demenev@gmail.com"/>
- </authors>
-
-
- <default innerClass="code" />
-
- <region name="phpCode" delimClass="inlinetags" innerClass="code"
- start="\&lt;\?(php|=)?" end="\?\>" never-contained="yes">
- <contains all="yes"/>
- </region>
-
- <region name="block" delimClass="brackets" innerClass="code" start="\{" end="\}" contained="yes">
- <contains all="yes"/>
- </region>
-
- <region name="brackets" delimClass="brackets" innerClass="code" start="\(" end="\)" contained="yes" >
- <contains all="yes"/>
- </region>
-
- <region name="sqbrackets" delimClass="brackets" innerClass="code" start="\[" end="\]" contained="yes">
- <contains all="yes"/>
- </region>
-
-
- <region name="mlcomment" innerClass="comment" start="\/\*" end="\*\/" contained="yes">
- <contains block="phpdoc"/>
- <contains block="cvstag"/>
- </region>
-
- <region name="strdouble" delimClass="quotes" innerClass="string" start="&quot;" end="&quot;" contained="yes">
- <contains block="var"/>
- </region>
-
- <region name="exec" delimClass="quotes" innerClass="string" start="`" end="`" contained="yes">
- <contains block="var"/>
- </region>
-
- <region name="heredoc" delimClass="quotes" innerClass="string" start="/\&lt;\&lt;\&lt;[\x20\x09]*(\w+)$/m" end="/^%1%;?$/m" contained="yes" remember="yes">
- <contains block="var"/>
- </region>
-
- <region name="strsingle" delimClass="quotes" innerClass="string" start="'" end="'" contained="yes"/>
-
- <block name="escaped" match="\\\\|\\&quot;|\\'|\\`" innerClass="special" contained="yes">
- <onlyin region="strsingle"/>
- <onlyin region="exec"/>
- </block>
-
- <block name="descaped" match="\\[\\&quot;'`tnr\$\{]" innerClass="special" contained="yes">
- <onlyin region="strdouble"/>
- <onlyin region="heredoc"/>
- </block>
-
-
- <region name="comment" start="(#|\/\/)" end="/$|(?=\?\>)/m" innerClass="comment" contained="yes">
- <contains block="cvstag"/>
- </region>
-
-
- <block name="identifier" match="[a-z_]\w*" innerClass="identifier" contained="yes"/>
-
- <block name="typecast" match="\((array|int|integer|string|bool|boolean|object|float|double)\)" innerClass="reserved" contained="yes"/>
-
- <block name="curlyvar" match="\{\$[a-z_].*\}" innerClass="var" contained="yes">
- <onlyin region="strdouble"/>
- <onlyin region="heredoc"/>
- <onlyin region="exec"/>
- </block>
-
- <region name="codeescape" delimClass="inlinetags" innerClass="default" end="\&lt;\?(php|=)?" start="\?\>" contained="yes">
- <onlyin region="block"/>
- </region>
-
- <block name="hexinteger" match="0[xX][\da-f]+" innerClass="number" contained="yes"/>
- <block name="var" match="\$[a-z_]\w*" innerClass="var" contained="yes"/>
-
- <block name="integer" match="\d\d*|\b0\b" innerClass="number" contained="yes"/>
-
-
- <block name="octinteger" match="0[0-7]+" innerClass="number" contained="yes"/>
-
- <block name="float" match="(\d*\.\d+)|(\d+\.\d*)" innerClass="number" contained="yes"/>
-
- <block name="exponent"
- match="((\d+|((\d*\.\d+)|(\d+\.\d*)))[eE][+-]?\d+)"
- innerClass="number" contained="yes"/>
-
- <block name="phpdoc" match="\s@\w+\s" innerClass="inlinedoc" contained="yes">
- <onlyin region="mlcomment"/>
- <onlyin region="comment"/>
- </block>
-
- <block name="url" match="((https?|ftp):\/\/[\w\?\.\-\&amp;=\/%+]+)|(^|[\s,!?])www\.\w+\.\w+[\w\?\.\&amp;=\/%+]*" innerClass="url" contained="yes">
- <onlyin region="mlcomment"/>
- <onlyin region="comment"/>
- </block>
-
- <block name="email" match="\w+[\.\w\-]+@(\w+[\.\w\-])+" innerClass="url" contained="yes">
- <onlyin region="mlcomment"/>
- <onlyin region="comment"/>
- </block>
-
- <block name="note" match="\bnote:" innerClass="inlinedoc" contained="yes">
- <onlyin region="mlcomment"/>
- <onlyin region="comment"/>
- </block>
-
-
- <block name="cvstag" match="\$\w+\s*:.*\$" innerClass="inlinedoc" contained="yes">
- <onlyin region="mlcomment"/>
- <onlyin region="comment"/>
- </block>
-
- <keywords name="constants" inherits="identifier" innerClass="reserved" case = "yes">
- <keyword match="DIRECTORY_SEPARATOR"/>
- <keyword match="PATH_SEPARATOR"/>
- </keywords>
-
- <keywords name="reserved" inherits="identifier" innerClass="reserved">
- <keyword match="echo"/>
- <keyword match="foreach"/>
- <keyword match="else"/>
- <keyword match="if"/>
- <keyword match="elseif"/>
- <keyword match="for"/>
- <keyword match="as"/>
- <keyword match="while"/>
- <keyword match="foreach"/>
- <keyword match="break"/>
- <keyword match="continue"/>
- <keyword match="class"/>
- <keyword match="const"/>
- <keyword match="declare"/>
- <keyword match="switch"/>
- <keyword match="case"/>
- <keyword match="endfor"/>
- <keyword match="endswitch"/>
- <keyword match="endforeach"/>
- <keyword match="endswitch"/>
- <keyword match="endif"/>
- <keyword match="array"/>
- <keyword match="default"/>
- <keyword match="do"/>
- <keyword match="enddeclare"/>
- <keyword match="eval"/>
- <keyword match="exit"/>
- <keyword match="die"/>
- <keyword match="extends"/>
- <keyword match="function"/>
- <keyword match="global"/>
- <keyword match="include"/>
- <keyword match="include_once"/>
- <keyword match="require"/>
- <keyword match="require_once"/>
- <keyword match="isset"/>
- <keyword match="empty"/>
- <keyword match="list"/>
- <keyword match="new"/>
- <keyword match="static"/>
- <keyword match="unset"/>
- <keyword match="var"/>
- <keyword match="return"/>
- <keyword match="try"/>
- <keyword match="catch"/>
- <keyword match="final"/>
- <keyword match="throw"/>
- <keyword match="public"/>
- <keyword match="private"/>
- <keyword match="protected"/>
- <keyword match="abstract"/>
- <keyword match="interface"/>
- <keyword match="implements"/>
- <keyword match="const"/>
- <keyword match="define"/>
- <keyword match="__FILE__"/>
- <keyword match="__LINE__"/>
- <keyword match="__CLASS__"/>
- <keyword match="__METHOD__"/>
- <keyword match="__FUNCTION__"/>
- <keyword match="NULL"/>
- <keyword match="true"/>
- <keyword match="false"/>
- <keyword match="and"/>
- <keyword match="or"/>
- <keyword match="xor"/>
- </keywords>
-
-</highlight>
diff --git a/library/Text_Highlighter/python.xml b/library/Text_Highlighter/python.xml
deleted file mode 100644
index 29e77203c..000000000
--- a/library/Text_Highlighter/python.xml
+++ /dev/null
@@ -1,229 +0,0 @@
-<?xml version="1.0"?>
-<!-- $Id: python.xml,v 1.1 2007-06-03 02:35:28 ssttoo Exp $ -->
-
-<highlight lang="python" case="no">
-
- <authors>
- <author name="Andrey Demenev" email="demenev@gmail.com"/>
- </authors>
-
- <default innerClass="code" />
-
- <region name="strsingle3" delimClass="quotes" innerClass="string"
- start="'''" end="'''" />
-
- <region name="strdouble3" delimClass="quotes" innerClass="string"
- start="&quot;&quot;&quot;" end="&quot;&quot;&quot;">
- </region>
-
- <region name="strdouble" delimClass="quotes" innerClass="string"
- start="&quot;" end="&quot;" >
- </region>
-
- <region name="strsingle" delimClass="quotes" innerClass="string"
- start="'" end="'" />
-
- <region name="brackets" delimClass="brackets" innerClass="code" start="\(" end="\)" >
- <contains all="yes"/>
- </region>
-
- <region name="sqbrackets" delimClass="brackets" innerClass="code" start="\[" end="\]" >
- <contains all="yes"/>
- </region>
-
- <block name="escaped" match="\\." innerClass="special" contained="yes">
- <onlyin region="strsingle"/>
- <onlyin region="strsingle3"/>
- <onlyin region="strdouble"/>
- <onlyin region="strdouble3"/>
- </block>
-
- <block name="possiblefunction" match="[a-z_]\w*(?=\s*\()" innerClass="identifier" />
-
- <block name="identifier" match="[a-z_]\w*" innerClass="identifier" />
-
- <block name="exponent"
- match="((\d+|((\d*\.\d+)|(\d+\.\d*)))[eE][+-]?\d+)"
- innerClass="number" />
-
- <block name="imaginary" match="((\d*\.\d+)|(\d+\.\d*)|(\d+))j" innerClass="number"/>
-
- <block name="float" match="(\d*\.\d+)|(\d+\.\d*)" innerClass="number"/>
-
- <block name="integer" match="\d+l?|\b0l?\b" innerClass="number" />
-
- <block name="hexinteger" match="0[xX][\da-f]+l?" innerClass="number" />
-
- <block name="octinteger" match="0[0-7]+l?" innerClass="number" />
-
- <block name="comment" innerClass="comment"
- match="#.+" />
-
- <keywords name="reserved" inherits="identifier" innerClass="reserved" case = "yes">
- <keyword match="and"/>
- <keyword match="del"/>
- <keyword match="for"/>
- <keyword match="is"/>
- <keyword match="raise"/>
- <keyword match="assert"/>
- <keyword match="elif"/>
- <keyword match="from"/>
- <keyword match="lambda"/>
- <keyword match="return"/>
- <keyword match="break"/>
- <keyword match="else"/>
- <keyword match="global"/>
- <keyword match="not"/>
- <keyword match="try"/>
- <keyword match="class"/>
- <keyword match="except"/>
- <keyword match="if"/>
- <keyword match="or"/>
- <keyword match="while"/>
- <keyword match="continue"/>
- <keyword match="exec"/>
- <keyword match="import"/>
- <keyword match="pass"/>
- <keyword match="yield"/>
- <keyword match="def"/>
- <keyword match="finally"/>
- <keyword match="in"/>
- <keyword match="print"/>
- <keyword match="False"/>
- <keyword match="True"/>
- <keyword match="None"/>
- <keyword match="NotImplemented"/>
- <keyword match="Ellipsis"/>
-
- <keyword match="Exception" />
- <keyword match="SystemExit" />
- <keyword match="StopIteration" />
- <keyword match="StandardError" />
- <keyword match="KeyboardInterrupt" />
- <keyword match="ImportError" />
- <keyword match="EnvironmentError" />
- <keyword match="IOError" />
- <keyword match="OSError" />
- <keyword match="WindowsError" />
- <keyword match="EOFError" />
- <keyword match="RuntimeError" />
- <keyword match="NotImplementedError" />
- <keyword match="NameError" />
- <keyword match="UnboundLocalError" />
-
- <keyword match="AttributeError" />
- <keyword match="SyntaxError" />
- <keyword match="IndentationError" />
- <keyword match="TabError" />
- <keyword match="TypeError" />
- <keyword match="AssertionError" />
- <keyword match="LookupError" />
- <keyword match="IndexError" />
- <keyword match="KeyError" />
- <keyword match="ArithmeticError" />
- <keyword match="OverflowError" />
- <keyword match="ZeroDivisionError" />
- <keyword match="FloatingPointError" />
- <keyword match="ValueError" />
- <keyword match="UnicodeError" />
- <keyword match="UnicodeEncodeError" />
- <keyword match="UnicodeDecodeError" />
-
- <keyword match="UnicodeTranslateError" />
- <keyword match="ReferenceError" />
- <keyword match="SystemError" />
- <keyword match="MemoryError" />
- <keyword match="Warning" />
- <keyword match="UserWarning" />
- <keyword match="DeprecationWarning" />
- <keyword match="PendingDeprecationWarning" />
- <keyword match="SyntaxWarning" />
- <keyword match="OverflowWarning" />
- <keyword match="RuntimeWarning" />
- <keyword match="FutureWarning" />
-
- </keywords>
-
- <keywords name="builtin" inherits="possiblefunction"
- innerClass="builtin" otherwise="identifier" case = "yes">
- <keyword match="__import__"/>
-
- <keyword match="abs"/>
- <keyword match="apply"/>
- <keyword match="basestring"/>
- <keyword match="bool"/>
- <keyword match="buffer"/>
- <keyword match="callable"/>
- <keyword match="chr"/>
- <keyword match="classmethod"/>
- <keyword match="cmp"/>
-
- <keyword match="coerce"/>
- <keyword match="compile"/>
- <keyword match="complex"/>
- <keyword match="delattr"/>
- <keyword match="dict"/>
- <keyword match="dir"/>
- <keyword match="divmod"/>
- <keyword match="enumerate"/>
- <keyword match="eval"/>
-
- <keyword match="execfile"/>
- <keyword match="file"/>
- <keyword match="filter"/>
- <keyword match="float"/>
- <keyword match="getattr"/>
- <keyword match="globals"/>
- <keyword match="hasattr"/>
- <keyword match="hash"/>
- <keyword match="help"/>
-
- <keyword match="hex"/>
- <keyword match="id"/>
- <keyword match="input"/>
- <keyword match="int"/>
- <keyword match="intern"/>
- <keyword match="isinstance"/>
- <keyword match="issubclass"/>
- <keyword match="iter"/>
- <keyword match="len"/>
-
- <keyword match="list"/>
- <keyword match="locals"/>
- <keyword match="long"/>
- <keyword match="map"/>
- <keyword match="max"/>
- <keyword match="min"/>
- <keyword match="object"/>
- <keyword match="oct"/>
- <keyword match="open"/>
-
- <keyword match="ord"/>
- <keyword match="pow"/>
- <keyword match="property"/>
- <keyword match="range"/>
- <keyword match="raw_input"/>
- <keyword match="reduce"/>
- <keyword match="reload"/>
- <keyword match="repr"/>
- <keyword match="round"/>
-
- <keyword match="setattr"/>
- <keyword match="slice"/>
- <keyword match="staticmethod"/>
- <keyword match="sum"/>
- <keyword match="super"/>
- <keyword match="str"/>
- <keyword match="tuple"/>
- <keyword match="type"/>
- <keyword match="unichr"/>
-
- <keyword match="unicode"/>
- <keyword match="vars"/>
- <keyword match="xrange"/>
- <keyword match="zip"/>
-
- </keywords>
-
-</highlight>
-
diff --git a/library/Text_Highlighter/release b/library/Text_Highlighter/release
deleted file mode 100644
index 66f1fa603..000000000
--- a/library/Text_Highlighter/release
+++ /dev/null
@@ -1,4 +0,0 @@
-#!/bin/sh
-
-/usr/local/bin/php package.php make
-/usr/local/bin/pear package
diff --git a/library/Text_Highlighter/ruby.xml b/library/Text_Highlighter/ruby.xml
deleted file mode 100644
index 599f5af17..000000000
--- a/library/Text_Highlighter/ruby.xml
+++ /dev/null
@@ -1,141 +0,0 @@
-<?xml version="1.0"?>
-<!-- $Id: ruby.xml,v 1.1 2007-06-03 02:35:28 ssttoo Exp $ -->
-
-<highlight lang="ruby" case="no">
-
- <authors>
- <author name="Andrey Demenev" email="demenev@gmail.com"/>
- </authors>
-
- <comment>
-FIXME: While this construction : s.split /z/i
-is valid, regular expression is not recognized as such
-(/ folowing an identifier or number is not recognized as
-start of RE), making highlighting improper
-
-%q(a (nested) string) does not get highlighted correctly
- </comment>
-
- <default innerClass="code" />
-
- <region name="data" start="/^__END__$/m" end="$" delimClass="reserved" innerClass="comment" never-conteined="yes" />
-
- <region name="strdouble" delimClass="quotes" innerClass="string"
- start="&quot;" end="&quot;" >
- </region>
-
- <region name="qstrdouble" delimClass="quotes" innerClass="string"
- start="%[Qx]([!&quot;#\$%&amp;'+\-*.\/:;=?@^`|~{&lt;\[(])" end="%b1%" remember="yes" />
-
- <region name="strsingle" delimClass="quotes" innerClass="string"
- start="'" end="'" />
-
- <region name="qstrsingle" delimClass="quotes" innerClass="string"
- start="%[wq]([!&quot;#\$%&amp;'+\-*.\/:;=?@^`|~{&lt;\[(])" end="%b1%" remember="yes" />
-
- <block name="global" match="\$(\W|\w+)" innerClass="var" />
-
- <block name="classvar" match="/@@?[_a-z][\d_a-z]*/i" innerClass="var" />
-
- <region name="brackets" delimClass="brackets" innerClass="code" start="\(" end="\)" >
- <contains all="yes"/>
- </region>
-
- <region name="sqbrackets" delimClass="brackets" innerClass="code" start="\[" end="\]" >
- <contains all="yes"/>
- </region>
-
- <block name="escaped" match="\\." innerClass="special" contained="yes">
- <onlyin region="qstrsingle"/>
- <onlyin region="strsingle"/>
- <onlyin region="qstrdouble"/>
- <onlyin region="strdouble"/>
- <onlyin region="regexp"/>
- </block>
-
- <block name="identifier" match="[a-z_]\w*" innerClass="identifier" />
-
- <block name="exponent"
- match="((\d+|((\d*\.\d+)|(\d+\.\d*)))[eE][+-]?\d+)"
- innerClass="number" />
-
- <block name="float" match="(\d*\.\d+)|(\d+\.\d*)" innerClass="number"/>
-
- <block name="hexinteger" match="0[xX][\da-f]+l?" innerClass="number" />
-
- <block name="integer" match="\d+l?|\b0l?\b" innerClass="number" />
-
- <block name="octinteger" match="0[0-7]+l?" innerClass="number" />
-
-
- <region name="rubydoc" start="/^=begin$/m" end="/^=end$/m" delimClass="comment" innerClass="comment">
- <contains block="cvstag" />
- </region>
-
- <block name="cvstag" match="\$\w+\s*:.+\$" innerClass="inlinedoc" contained="yes">
- <onlyin region="comment"/>
- <onlyin region="rubydoc"/>
- </block>
-
- <region name="comment" innerClass="comment" start="#" end="/$/m" delimClass="comment" >
- <contains block="cvstag" />
- </region>
-
- <region name="regexp" delimClass="quotes" innerClass="string" start="\s*\/" end="\/[iomx]*"
- neverAfter="(?&lt;!\band|\bor|\bwhile|\buntil|\bunless|\bif|\belsif|\bwhen|[~=!|&amp;(,\[])$">
- </region>
-
- <keywords name="reserved" inherits="identifier" innerClass="reserved" case = "yes">
- <keyword match="__FILE__" />
- <keyword match="require" />
- <keyword match="and" />
- <keyword match="def" />
- <keyword match="end" />
- <keyword match="in" />
- <keyword match="or" />
- <keyword match="self" />
- <keyword match="unless" />
- <keyword match="__LINE__" />
- <keyword match="begin" />
- <keyword match="defined?" />
- <keyword match="ensure" />
- <keyword match="module" />
- <keyword match="redo" />
- <keyword match="super" />
- <keyword match="until" />
- <keyword match="BEGIN" />
- <keyword match="break" />
- <keyword match="do" />
- <keyword match="false" />
- <keyword match="next" />
- <keyword match="rescue" />
- <keyword match="then" />
- <keyword match="when" />
- <keyword match="END" />
- <keyword match="case" />
- <keyword match="else" />
- <keyword match="for" />
- <keyword match="nil" />
- <keyword match="retry" />
- <keyword match="true" />
- <keyword match="while" />
- <keyword match="alias" />
- <keyword match="module_function" />
- <keyword match="private" />
- <keyword match="public" />
- <keyword match="protected" />
- <keyword match="attr_reader" />
- <keyword match="attr_writer" />
- <keyword match="attr_accessor" />
- <keyword match="class" />
- <keyword match="elsif" />
- <keyword match="if" />
- <keyword match="not" />
- <keyword match="return" />
- <keyword match="undef" />
- <keyword match="yield" />
- </keywords>
-
-
-</highlight>
-
diff --git a/library/Text_Highlighter/sample.css b/library/Text_Highlighter/sample.css
deleted file mode 100644
index b4b38c5fc..000000000
--- a/library/Text_Highlighter/sample.css
+++ /dev/null
@@ -1,62 +0,0 @@
-.hl-main ol {
- line-height: 1.0;
-}
-.hl-default {
- color: Black;
-}
-.hl-code {
- color: Black;
-}
-.hl-brackets {
- color: Olive;
-}
-.hl-comment {
- color: Purple;
-}
-.hl-quotes {
- color: Darkred;
-}
-.hl-string {
- color: Red;
-}
-.hl-identifier {
- color: Blue;
-}
-.hl-builtin {
- color: Teal;
-}
-.hl-reserved {
- color: Green;
-}
-.hl-inlinedoc {
- color: Blue;
-}
-.hl-var {
- color: Darkblue;
-}
-.hl-url {
- color: Blue;
-}
-.hl-special {
- color: Navy;
-}
-.hl-number {
- color: Maroon;
-}
-.hl-inlinetags {
- color: Blue;
-}
-.hl-main {
- background: #ccc none repeat scroll 0 0;
- color: #000;
-/* background-color: White; */
-}
-.hl-gutter {
- background-color: #999999;
- color: White
-}
-.hl-table {
- font-family: courier;
- font-size: 12px;
- border: solid 1px Lightgrey;
-}
diff --git a/library/Text_Highlighter/sh.xml b/library/Text_Highlighter/sh.xml
deleted file mode 100644
index 1250de3bc..000000000
--- a/library/Text_Highlighter/sh.xml
+++ /dev/null
@@ -1,242 +0,0 @@
-<?xml version="1.0"?>
-<!-- $Id: sh.xml,v 1.2 2007-06-14 00:15:50 ssttoo Exp $ -->
-
-<highlight lang="sh" case = "yes">
-
- <authors>
- <author name="Noah Spurrier" email="noah@noah.org" />
- </authors>
-
- <comment>This highlighter is EXPERIMENTAL. It may work incorrectly.
- It is a crude hack of the perl syntax, which itself wasn't so good.
- But this seems to work OK.
- </comment>
-
- <default innerClass="code"/>
-
- <block name="interpreter" match="/^(#!)(.*)/m" innerClass="special">
- <partClass index="1" innerClass="special" />
- <partClass index="2" innerClass="string" />
- </block>
-
- <!--
- brackets
- -->
- <region name="block" delimClass="brackets" innerClass="code" start="\{" end="\}">
- <contains all="yes"/>
- </region>
-
- <region name="brackets" delimClass="brackets" innerClass="code" start="\(" end="\)">
- <contains all="yes"/>
- </region>
-
- <region name="sqbrackets" delimClass="brackets" innerClass="code" start="\[" end="\]">
- <contains all="yes"/>
- </region>
-
- <!--
- use smth
- -->
- <block name="usestatement" match="(use)\s+([\w:]*)" innerClass="special">
- <partClass index="1" innerClass="reserved" />
- <partClass index="2" innerClass="special" />
- </block>
-
-
- <region name="q-w-q-statement"
- start="/\b(q[wq]\s*((\{)|(\()|(\[)|(\&lt;)|([\W\S])))(?=(.*)((?(3)\})(?(4)\))(?(5)\])(?(6)\&gt;)(?(7)\7)))/Us"
- end="%b2%"
- innerClass="string" delimClass="quotes" remember="yes">
-
- <contains block="containedvar"/>
- <contains block="specialvar"/>
- <contains block="curlyvar"/>
-
- </region>
-
- <region name="qstatement"
- start="/\b(q\s*((\{)|(\()|(\[)|(\&lt;)|([\W\S])))(?=(.*)((?(3)\})(?(4)\))(?(5)\])(?(6)\&gt;)(?(7)\7)))/Us"
- end="%b2%"
- innerClass="string" delimClass="quotes" remember="yes">
-
- </region>
-
- <!--
- comments
- -->
- <block name="comment" match="#.*" innerClass="comment" />
-
-
- <!--
- regexpr
- FIXME: this should be rewritten
- -->
- <block name="dblregexprver1" match="/(s|tr) ([|#~`!@$%^&amp;*-+=\\;:'&quot;,.\/?]) ((\\.|[^\\])*?) (\2)((\\.|[^\\])*?)(\2[ecgimosx]*)/x" innerClass="string">
- <partClass index="1" innerClass="quotes" />
- <partClass index="2" innerClass="quotes" />
- <partClass index="3" innerClass="string" />
- <partClass index="5" innerClass="quotes" />
- <partClass index="6" innerClass="string" />
- <partClass index="8" innerClass="quotes" />
- </block>
-
- <block name="dblregexprver2" match="/(m) ([|#~`!@$%^&amp;*-+=\\;:'&quot;,.\/?]) ((\\.|[^\\])*?) (\2[ecgimosx]*)/x" innerClass="string">
- <partClass index="1" innerClass="quotes" />
- <partClass index="2" innerClass="quotes" />
- <partClass index="3" innerClass="string" />
- <partClass index="5" innerClass="quotes" />
- </block>
-
-
- <region name="regexp" start=" \/" end="\/[cgimosx]*" innerClass="string" delimClass="quotes" case="yes">
- <contains block="reescaped"/>
- </region>
-
- <block name="reescaped" match="\\\/" innerClass="string" contained="yes">
- <onlyin region="regexp"/>
- </block>
-
- <!--
- variables
- FIXME: @{...}
- -->
- <block name="bracketsvars" match="([a-z1-9_]+)(\s*=>)" innerClass="string" contained="yes" case="no">
- <partClass index="1" innerClass="string" />
- <partClass index="2" innerClass="code" />
- <onlyin region="brackets"/>
- </block>
-
- <block name="specialvar" match="\$#?[1-9'`@!]" innerClass="var"/>
-
- <block name="var" match="(\$#?|[@%*])([a-z1-9_]+::)*([a-z1-9_]+|\^(?-i)[A-Z]?(?i))" innerClass="var" case="no"/>
- <block name="containedvar" match="\$([a-z1-9_]+|\^(?-i)[A-Z]?(?i))" innerClass="var" case="no"/>
-
- <block name="classvar" match="(\{)([a-z1-9]+)(\})" innerClass="var" case="no">
- <partClass index="1" innerClass="brackets" />
- <partClass index="2" innerClass="var" />
- <partClass index="3" innerClass="brackets" />
- </block>
-
- <block name="curlyvar" match="[\$@%]#?\{[a-z1-9]+\}" innerClass="var" case="no"/>
-
- <!--
- quotes
- -->
- <region name="exec" delimClass="quotes" innerClass="string" start="`" end="`">
- <contains block="containedvar"/>
- <contains block="specialvar"/>
- <contains block="curlyvar"/>
- </region>
-
- <region name="strsingle" delimClass="quotes" innerClass="string" start="'" end="'"/>
-
- <block name="escaped" match="\\\\|\\&quot;|\\'|\\`" innerClass="special" contained="yes">
- <onlyin region="qstatement"/>
- <onlyin region="strsingle"/>
- <onlyin region="exec"/>
- </block>
-
- <region name="strdouble" delimClass="quotes" innerClass="string" start="&quot;" end="&quot;">
- <contains block="containedvar"/>
- <contains block="specialvar"/>
- <contains block="curlyvar"/>
- </region>
-
- <block name="descaped" match="\\[\\&quot;'`tnr\$\{@]" innerClass="special" contained="yes">
- <onlyin region="strdouble"/>
- <onlyin region="q-w-q-statement"/>
- </block>
-
- <!-- logical op.
- <block name="logic" match="\|\||&amp;&amp;" innerClass="reserved" contained="yes"/>-->
-
- <!--
- identifiers
- -->
- <block name="identifier" match="[a-z_]\w*" innerClass="identifier" case="no"/>
-
- <!--
- numbers
- -->
- <block name="number" match="\d*\.?\d+" innerClass="number"/>
-
- <!--
- GNU and posix standard shell utilities here.
- -->
- <keywords name="reserved" inherits="identifier" innerClass="reserved" case = "yes">
- <keyword match="cd"/>
- <keyword match="cp"/>
- <keyword match="rm"/>
- <keyword match="echo"/>
- <keyword match="printf"/>
- <keyword match="exit"/>
- <keyword match="cut"/>
- <keyword match="join"/>
- <keyword match="comm"/>
- <keyword match="fmt"/>
- <keyword match="grep"/>
- <keyword match="egrep"/>
- <keyword match="fgrep"/>
- <keyword match="sed"/>
- <keyword match="awk"/>
- <keyword match="yes"/>
- <keyword match="false"/>
- <keyword match="true"/>
- <keyword match="test"/>
- <keyword match="expr"/>
- <keyword match="tee"/>
- <keyword match="basename"/>
- <keyword match="dirname"/>
- <keyword match="pathchk"/>
- <keyword match="pwd"/>
- <keyword match="stty"/>
- <keyword match="tty"/>
- <keyword match="env"/>
- <keyword match="printenv"/>
- <keyword match="id"/>
- <keyword match="logname"/>
- <keyword match="whoami"/>
- <keyword match="groups"/>
- <keyword match="users"/>
- <keyword match="who"/>
- <keyword match="date"/>
- <keyword match="uname"/>
- <keyword match="hostname"/>
- <keyword match="chroot"/>
- <keyword match="nice"/>
- <keyword match="nohup"/>
- <keyword match="sleep"/>
- <keyword match="factor"/>
- <keyword match="seq"/>
- <keyword match="getopt"/>
- <keyword match="getopts"/>
- <keyword match="options"/>
- <keyword match="shift"/>
- </keywords>
-
- <keywords name="flowcontrol" inherits="identifier" innerClass="reserved" case = "yes">
- <keyword match="if"/>
- <keyword match="fi"/>
- <keyword match="then"/>
- <keyword match="else"/>
- <keyword match="elif"/>
- <keyword match="case"/>
- <keyword match="esac"/>
- <keyword match="while"/>
- <keyword match="done"/>
- <keyword match="for"/>
- <keyword match="in"/>
- <keyword match="function"/>
- <keyword match="until"/>
- <keyword match="do"/>
- <keyword match="select"/>
- <keyword match="time"/>
- <!--
- <keyword match="[["/>
- <keyword match="]]"/>
- -->
- <keyword match="read"/>
- <keyword match="set"/>
- </keywords>
-
-</highlight>
diff --git a/library/Text_Highlighter/sql.xml b/library/Text_Highlighter/sql.xml
deleted file mode 100644
index 19cae49a0..000000000
--- a/library/Text_Highlighter/sql.xml
+++ /dev/null
@@ -1,496 +0,0 @@
-<?xml version="1.0"?>
-<!-- $Id: sql.xml,v 1.1 2007-06-03 02:35:28 ssttoo Exp $ -->
-
-<highlight lang="sql" case="no">
-
- <authors>
- <author name="Andrey Demenev" email="demenev@gmail.com"/>
- </authors>
-
-
- <comment>Based on SQL-99</comment>
-
- <default innerClass="code" />
-
- <region name="qidentifier" delimClass="quotes" innerClass="identifier"
- start="`" end="`" />
-
- <region name="mlcomment" delimClass="comment" innerClass="comment"
- start="\/\*" end="\*\/" />
-
- <block name="comment" match="(#|--\s).*" innerClass="comment" />
-
- <block name="identifier" match="[a-z_]\w*" innerClass="identifier" />
-
- <region name="strdouble" delimClass="quotes" innerClass="string"
- start="&quot;" end="&quot;" >
- </region>
-
- <region name="brackets" delimClass="brackets" innerClass="code"
- start="\(" end="\)" >
- <contains all="yes"/>
- </region>
-
- <region name="strsingle" delimClass="quotes" innerClass="string"
- start="'" end="'" />
-
- <block name="escaped" match="\\." innerClass="special" contained="yes">
- <onlyin region="strsingle"/>
- <onlyin region="strdouble"/>
- </block>
-
- <block name="exponent"
- match="((\d+|((\d*\.\d+)|(\d+\.\d*)))[eE][+-]?\d+)"
- innerClass="number" />
-
- <block name="float" match="(\d*\.\d+)|(\d+\.\d*)" innerClass="number"/>
-
- <block name="integer" match="\d+l?|\b0l?\b" innerClass="number" />
-
- <block name="hexinteger" match="0[xX][\da-f]+l?" innerClass="number" />
-
- <keywords name="reserved" inherits="identifier" innerClass="reserved" case = "no">
- <keyword match="ABSOLUTE" />
- <keyword match="ACTION" />
- <keyword match="ADD" />
- <keyword match="ADMIN" />
- <keyword match="AFTER" />
- <keyword match="AGGREGATE" />
- <keyword match="ALIAS" />
- <keyword match="ALL" />
- <keyword match="ALLOCATE" />
- <keyword match="ALTER" />
- <keyword match="AND" />
- <keyword match="ANY" />
- <keyword match="ARE" />
- <keyword match="ARRAY" />
- <keyword match="AS" />
- <keyword match="ASC" />
- <keyword match="ASSERTION" />
- <keyword match="AT" />
- <keyword match="AUTHORIZATION" />
- <keyword match="BEFORE" />
- <keyword match="BEGIN" />
- <keyword match="BINARY" />
- <keyword match="BIT" />
- <keyword match="BLOB" />
- <keyword match="BOOLEAN" />
- <keyword match="BOTH" />
- <keyword match="BREADTH" />
- <keyword match="BY" />
- <keyword match="CALL" />
- <keyword match="CASCADE" />
- <keyword match="CASCADED" />
- <keyword match="CASE" />
- <keyword match="CAST" />
- <keyword match="CATALOG" />
- <keyword match="CHAR" />
- <keyword match="CHARACTER" />
- <keyword match="CHECK" />
- <keyword match="CLASS" />
- <keyword match="CLOB" />
- <keyword match="CLOSE" />
- <keyword match="COLLATE" />
- <keyword match="COLLATION" />
- <keyword match="COLUMN" />
- <keyword match="COMMIT" />
- <keyword match="COMPLETION" />
- <keyword match="CONNECT" />
- <keyword match="CONNECTION" />
- <keyword match="CONSTRAINT" />
- <keyword match="CONSTRAINTS" />
- <keyword match="CONSTRUCTOR" />
- <keyword match="CONTINUE" />
- <keyword match="CORRESPONDING" />
- <keyword match="CREATE" />
- <keyword match="CROSS" />
- <keyword match="CUBE" />
- <keyword match="CURRENT" />
- <keyword match="CURRENT_DATE" />
- <keyword match="CURRENT_PATH" />
- <keyword match="CURRENT_ROLE" />
- <keyword match="CURRENT_TIME" />
- <keyword match="CURRENT_TIMESTAMP" />
- <keyword match="CURRENT_USER" />
- <keyword match="CURSOR" />
- <keyword match="CYCLE" />
- <keyword match="DATA" />
- <keyword match="DATE" />
- <keyword match="DAY" />
- <keyword match="DEALLOCATE" />
- <keyword match="DEC" />
- <keyword match="DECIMAL" />
- <keyword match="DECLARE" />
- <keyword match="DEFAULT" />
- <keyword match="DEFERRABLE" />
- <keyword match="DEFERRED" />
- <keyword match="DELETE" />
- <keyword match="DEPTH" />
- <keyword match="DEREF" />
- <keyword match="DESC" />
- <keyword match="DESCRIBE" />
- <keyword match="DESCRIPTOR" />
- <keyword match="DESTROY" />
- <keyword match="DESTRUCTOR" />
- <keyword match="DETERMINISTIC" />
- <keyword match="DIAGNOSTICS" />
- <keyword match="DICTIONARY" />
- <keyword match="DISCONNECT" />
- <keyword match="DISTINCT" />
- <keyword match="DOMAIN" />
- <keyword match="DOUBLE" />
- <keyword match="DROP" />
- <keyword match="DYNAMIC" />
- <keyword match="EACH" />
- <keyword match="ELSE" />
- <keyword match="END" />
- <keyword match="END-EXEC" />
- <keyword match="EQUALS" />
- <keyword match="ESCAPE" />
- <keyword match="EVERY" />
- <keyword match="EXCEPT" />
- <keyword match="EXCEPTION" />
- <keyword match="EXEC" />
- <keyword match="EXECUTE" />
- <keyword match="EXTERNAL" />
- <keyword match="FALSE" />
- <keyword match="FETCH" />
- <keyword match="FIRST" />
- <keyword match="FLOAT" />
- <keyword match="FOR" />
- <keyword match="FOREIGN" />
- <keyword match="FOUND" />
- <keyword match="FREE" />
- <keyword match="FROM" />
- <keyword match="FULL" />
- <keyword match="FUNCTION" />
- <keyword match="GENERAL" />
- <keyword match="GET" />
- <keyword match="GLOBAL" />
- <keyword match="GO" />
- <keyword match="GOTO" />
- <keyword match="GRANT" />
- <keyword match="GROUP" />
- <keyword match="GROUPING" />
- <keyword match="HAVING" />
- <keyword match="HOST" />
- <keyword match="HOUR" />
- <keyword match="IDENTITY" />
- <keyword match="IGNORE" />
- <keyword match="IMMEDIATE" />
- <keyword match="IN" />
- <keyword match="INDICATOR" />
- <keyword match="INITIALIZE" />
- <keyword match="INITIALLY" />
- <keyword match="INNER" />
- <keyword match="INOUT" />
- <keyword match="INPUT" />
- <keyword match="INSERT" />
- <keyword match="INT" />
- <keyword match="INTEGER" />
- <keyword match="INTERSECT" />
- <keyword match="INTERVAL" />
- <keyword match="INTO" />
- <keyword match="IS" />
- <keyword match="ISOLATION" />
- <keyword match="ITERATE" />
- <keyword match="JOIN" />
- <keyword match="KEY" />
- <keyword match="LANGUAGE" />
- <keyword match="LARGE" />
- <keyword match="LAST" />
- <keyword match="LATERAL" />
- <keyword match="LEADING" />
- <keyword match="LEFT" />
- <keyword match="LESS" />
- <keyword match="LEVEL" />
- <keyword match="LIKE" />
- <keyword match="LIMIT" />
- <keyword match="LOCAL" />
- <keyword match="LOCALTIME" />
- <keyword match="LOCALTIMESTAMP" />
- <keyword match="LOCATOR" />
- <keyword match="MAP" />
- <keyword match="MATCH" />
- <keyword match="MINUTE" />
- <keyword match="MODIFIES" />
- <keyword match="MODIFY" />
- <keyword match="MODULE" />
- <keyword match="MONTH" />
- <keyword match="NAMES" />
- <keyword match="NATIONAL" />
- <keyword match="NATURAL" />
- <keyword match="NCHAR" />
- <keyword match="NCLOB" />
- <keyword match="NEW" />
- <keyword match="NEXT" />
- <keyword match="NO" />
- <keyword match="NONE" />
- <keyword match="NOT" />
- <keyword match="NULL" />
- <keyword match="NUMERIC" />
- <keyword match="OBJECT" />
- <keyword match="OF" />
- <keyword match="OFF" />
- <keyword match="OLD" />
- <keyword match="ON" />
- <keyword match="ONLY" />
- <keyword match="OPEN" />
- <keyword match="OPERATION" />
- <keyword match="OPTION" />
- <keyword match="OR" />
- <keyword match="ORDER" />
- <keyword match="ORDINALITY" />
- <keyword match="OUT" />
- <keyword match="OUTER" />
- <keyword match="OUTPUT" />
- <keyword match="PAD" />
- <keyword match="PARAMETER" />
- <keyword match="PARAMETERS" />
- <keyword match="PARTIAL" />
- <keyword match="PATH" />
- <keyword match="POSTFIX" />
- <keyword match="PRECISION" />
- <keyword match="PREFIX" />
- <keyword match="PREORDER" />
- <keyword match="PREPARE" />
- <keyword match="PRESERVE" />
- <keyword match="PRIMARY" />
- <keyword match="PRIOR" />
- <keyword match="PRIVILEGES" />
- <keyword match="PROCEDURE" />
- <keyword match="PUBLIC" />
- <keyword match="READ" />
- <keyword match="READS" />
- <keyword match="REAL" />
- <keyword match="RECURSIVE" />
- <keyword match="REF" />
- <keyword match="REFERENCES" />
- <keyword match="REFERENCING" />
- <keyword match="RELATIVE" />
- <keyword match="RESTRICT" />
- <keyword match="RESULT" />
- <keyword match="RETURN" />
- <keyword match="RETURNS" />
- <keyword match="REVOKE" />
- <keyword match="RIGHT" />
- <keyword match="ROLE" />
- <keyword match="ROLLBACK" />
- <keyword match="ROLLUP" />
- <keyword match="ROUTINE" />
- <keyword match="ROW" />
- <keyword match="ROWS" />
- <keyword match="SAVEPOINT" />
- <keyword match="SCHEMA" />
- <keyword match="SCOPE" />
- <keyword match="SCROLL" />
- <keyword match="SEARCH" />
- <keyword match="SECOND" />
- <keyword match="SECTION" />
- <keyword match="SELECT" />
- <keyword match="SEQUENCE" />
- <keyword match="SESSION" />
- <keyword match="SESSION_USER" />
- <keyword match="SET" />
- <keyword match="SETS" />
- <keyword match="SIZE" />
- <keyword match="SMALLINT" />
- <keyword match="SOME" />
- <keyword match="SPACE" />
- <keyword match="SPECIFIC" />
- <keyword match="SPECIFICTYPE" />
- <keyword match="SQL" />
- <keyword match="SQLEXCEPTION" />
- <keyword match="SQLSTATE" />
- <keyword match="SQLWARNING" />
- <keyword match="START" />
- <keyword match="STATE" />
- <keyword match="STATEMENT" />
- <keyword match="STATIC" />
- <keyword match="STRUCTURE" />
- <keyword match="SYSTEM_USER" />
- <keyword match="TABLE" />
- <keyword match="TEMPORARY" />
- <keyword match="TERMINATE" />
- <keyword match="THAN" />
- <keyword match="THEN" />
- <keyword match="TIME" />
- <keyword match="TIMESTAMP" />
- <keyword match="TIMEZONE_HOUR" />
- <keyword match="TIMEZONE_MINUTE" />
- <keyword match="TO" />
- <keyword match="TRAILING" />
- <keyword match="TRANSACTION" />
- <keyword match="TRANSLATION" />
- <keyword match="TREAT" />
- <keyword match="TRIGGER" />
- <keyword match="TRUE" />
- <keyword match="UNDER" />
- <keyword match="UNION" />
- <keyword match="UNIQUE" />
- <keyword match="UNKNOWN" />
- <keyword match="UNNEST" />
- <keyword match="UPDATE" />
- <keyword match="USAGE" />
- <keyword match="USER" />
- <keyword match="USING" />
- <keyword match="VALUE" />
- <keyword match="VALUES" />
- <keyword match="VARCHAR" />
- <keyword match="VARIABLE" />
- <keyword match="VARYING" />
- <keyword match="VIEW" />
- <keyword match="WHEN" />
- <keyword match="WHENEVER" />
- <keyword match="WHERE" />
- <keyword match="WITH" />
- <keyword match="WITHOUT" />
- <keyword match="WORK" />
- <keyword match="WRITE" />
- <keyword match="YEAR" />
- <keyword match="ZONE" />
- </keywords>
- <keywords name="keyword" inherits="identifier" innerClass="var" case = "no">
- <keyword match="ABS" />
- <keyword match="ADA" />
- <keyword match="ASENSITIVE" />
- <keyword match="ASSIGNMENT" />
- <keyword match="ASYMMETRIC" />
- <keyword match="ATOMIC" />
- <keyword match="AVG" />
- <keyword match="BETWEEN" />
- <keyword match="BITVAR" />
- <keyword match="BIT_LENGTH" />
- <keyword match="C" />
- <keyword match="CALLED" />
- <keyword match="CARDINALITY" />
- <keyword match="CATALOG_NAME" />
- <keyword match="CHAIN" />
- <keyword match="CHARACTER_LENGTH" />
- <keyword match="CHARACTER_SET_CATALOG" />
- <keyword match="CHARACTER_SET_NAME" />
- <keyword match="CHARACTER_SET_SCHEMA" />
- <keyword match="CHAR_LENGTH" />
- <keyword match="CHECKED" />
- <keyword match="CLASS_ORIGIN" />
- <keyword match="COALESCE" />
- <keyword match="COBOL" />
- <keyword match="COLLATION_CATALOG" />
- <keyword match="COLLATION_NAME" />
- <keyword match="COLLATION_SCHEMA" />
- <keyword match="COLUMN_NAME" />
- <keyword match="COMMAND_FUNCTION" />
- <keyword match="COMMAND_FUNCTION_CODE" />
- <keyword match="COMMITTED" />
- <keyword match="CONDITION_NUMBER" />
- <keyword match="CONNECTION_NAME" />
- <keyword match="CONSTRAINT_CATALOG" />
- <keyword match="CONSTRAINT_NAME" />
- <keyword match="CONSTRAINT_SCHEMA" />
- <keyword match="CONTAINS" />
- <keyword match="CONVERT" />
- <keyword match="COUNT" />
- <keyword match="CURSOR_NAME" />
- <keyword match="DATETIME_INTERVAL_CODE" />
- <keyword match="DATETIME_INTERVAL_PRECISION" />
- <keyword match="DEFINED" />
- <keyword match="DEFINER" />
- <keyword match="DISPATCH" />
- <keyword match="DYNAMIC_FUNCTION" />
- <keyword match="DYNAMIC_FUNCTION_CODE" />
- <keyword match="EXISTING" />
- <keyword match="EXISTS" />
- <keyword match="EXTRACT" />
- <keyword match="FINAL" />
- <keyword match="FORTRAN" />
- <keyword match="G" />
- <keyword match="GENERATED" />
- <keyword match="GRANTED" />
- <keyword match="HIERARCHY" />
- <keyword match="HOLD" />
- <keyword match="IMPLEMENTATION" />
- <keyword match="INFIX" />
- <keyword match="INSENSITIVE" />
- <keyword match="INSTANCE" />
- <keyword match="INSTANTIABLE" />
- <keyword match="INVOKER" />
- <keyword match="K" />
- <keyword match="KEY_MEMBER" />
- <keyword match="KEY_TYPE" />
- <keyword match="LENGTH" />
- <keyword match="LOWER" />
- <keyword match="M" />
- <keyword match="MAX" />
- <keyword match="MESSAGE_LENGTH" />
- <keyword match="MESSAGE_OCTET_LENGTH" />
- <keyword match="MESSAGE_TEXT" />
- <keyword match="METHOD" />
- <keyword match="MIN" />
- <keyword match="MOD" />
- <keyword match="MORE" />
- <keyword match="MUMPS" />
- <keyword match="NAME" />
- <keyword match="NULLABLE" />
- <keyword match="NULLIF" />
- <keyword match="NUMBER" />
- <keyword match="OCTET_LENGTH" />
- <keyword match="OPTIONS" />
- <keyword match="OVERLAPS" />
- <keyword match="OVERLAY" />
- <keyword match="OVERRIDING" />
- <keyword match="PARAMETER_MODE" />
- <keyword match="PARAMETER_NAME" />
- <keyword match="PARAMETER_ORDINAL_POSITION" />
- <keyword match="PARAMETER_SPECIFIC_CATALOG" />
- <keyword match="PARAMETER_SPECIFIC_NAME" />
- <keyword match="PARAMETER_SPECIFIC_SCHEMA" />
- <keyword match="PASCAL" />
- <keyword match="PLI" />
- <keyword match="POSITION" />
- <keyword match="REPEATABLE" />
- <keyword match="RETURNED_LENGTH" />
- <keyword match="RETURNED_OCTET_LENGTH" />
- <keyword match="RETURNED_SQLSTATE" />
- <keyword match="ROUTINE_CATALOG" />
- <keyword match="ROUTINE_NAME" />
- <keyword match="ROUTINE_SCHEMA" />
- <keyword match="ROW_COUNT" />
- <keyword match="SCALE" />
- <keyword match="SCHEMA_NAME" />
- <keyword match="SECURITY" />
- <keyword match="SELF" />
- <keyword match="SENSITIVE" />
- <keyword match="SERIALIZABLE" />
- <keyword match="SERVER_NAME" />
- <keyword match="SIMILAR" />
- <keyword match="SIMPLE" />
- <keyword match="SOURCE" />
- <keyword match="SPECIFIC_NAME" />
- <keyword match="STYLE" />
- <keyword match="SUBCLASS_ORIGIN" />
- <keyword match="SUBLIST" />
- <keyword match="SUBSTRING" />
- <keyword match="SUM" />
- <keyword match="SYMMETRIC" />
- <keyword match="SYSTEM" />
- <keyword match="TABLE_NAME" />
- <keyword match="TRANSACTIONS_COMMITTED" />
- <keyword match="TRANSACTIONS_ROLLED_BACK" />
- <keyword match="TRANSACTION_ACTIVE" />
- <keyword match="TRANSFORM" />
- <keyword match="TRANSFORMS" />
- <keyword match="TRANSLATE" />
- <keyword match="TRIGGER_CATALOG" />
- <keyword match="TRIGGER_NAME" />
- <keyword match="TRIGGER_SCHEMA" />
- <keyword match="TRIM" />
- <keyword match="TYPE" />
- <keyword match="UNCOMMITTED" />
- <keyword match="UNNAMED" />
- <keyword match="UPPER" />
- <keyword match="USER_DEFINED_TYPE_CATALOG" />
- <keyword match="USER_DEFINED_TYPE_NAME" />
- <keyword match="USER_DEFINED_TYPE_SCHEMA" />
- </keywords>
-
-</highlight>
diff --git a/library/Text_Highlighter/vbscript.xml b/library/Text_Highlighter/vbscript.xml
deleted file mode 100644
index 09c37ffde..000000000
--- a/library/Text_Highlighter/vbscript.xml
+++ /dev/null
@@ -1,305 +0,0 @@
-<?xml version="1.0"?>
-<!-- $Id: vbscript.xml,v 1.2 2008-01-02 00:05:52 ssttoo Exp $ -->
-
-<highlight lang="vbscript" case="no">
-
- <authors>
- <author name="Daniel Fruzynski" email="daniel-AT-poradnik-webmastera.com" />
- </authors>
-
- <default innerClass="code" />
-
- <region name="brackets" delimClass="brackets" innerClass="code" start="\(" end="\)">
- <contains all="yes"/>
- </region>
-
-
- <region name="strdouble" delimClass="quotes" innerClass="string" start="&quot;" end="&quot;"/>
-
- <region name="comment" start="'|[Rr][Ee][Mm]\b" end="/$/m" innerClass="comment">
- <contains block="cvstag"/>
- </region>
-
- <block name="number" match="\d*\.?\d+" innerClass="number"/>
- <block name="hexnumber" match="&amp;H[0-9a-fA-F]+" innerClass="number"/>
-
- <block name="identifier" match="[a-z_]\w*" innerClass="identifier" case="no"/>
-
- <block name="url" match="((https?|ftp):\/\/[\w\?\.\-\&amp;=\/%+]+)|(^|[\s,!?])www\.\w+\.\w+[\w\?\.\&amp;=\/%+]*" innerClass="url" contained="yes">
- <onlyin region="comment"/>
- </block>
-
- <block name="email" match="\w+[\.\w\-]+@(\w+[\.\w\-])+" innerClass="url" contained="yes">
- <onlyin region="comment"/>
- </block>
-
- <block name="note" match="\b(note|fixme):" innerClass="inlinedoc" contained="yes" case="no">
- <onlyin region="comment"/>
- </block>
-
-
- <block name="cvstag" match="\$\w+:.+\$" innerClass="inlinedoc" contained="yes">
- <onlyin region="comment"/>
- </block>
-
- <keywords name="constants" inherits="identifier" innerClass="builtin" case="no">
- <!-- Color Constants -->
- <keyword match="vbBlack" />
- <keyword match="vbRed" />
- <keyword match="vbGreen" />
- <keyword match="vbYellow" />
- <keyword match="vbBlue" />
- <keyword match="vbMagenta" />
- <keyword match="vbCyan" />
- <keyword match="vbWhite" />
- <!-- Comparison Constants -->
- <keyword match="vbBinaryCompare" />
- <keyword match="vbTextCompare" />
- <!-- Date and Time Constants -->
- <keyword match="vbSunday" />
- <keyword match="vbMonday" />
- <keyword match="vbTuesday" />
- <keyword match="vbWednesday" />
- <keyword match="vbThursday" />
- <keyword match="vbFriday" />
- <keyword match="vbSaturday" />
- <keyword match="vbUseSystemDayOfWeek" />
- <keyword match="vbFirstJan1" />
- <keyword match="vbFirstFourDays" />
- <keyword match="vbFirstFullWeek" />
- <!-- Date Format Constants -->
- <keyword match="vbGeneralDate" />
- <keyword match="vbLongDate" />
- <keyword match="vbShortDate" />
- <keyword match="vbLongTime" />
- <keyword match="vbShortTime" />
- <!-- Miscellaneous Constants -->
- <keyword match="vbObjectError" />
- <!-- MsgBox Constants -->
- <keyword match="vbOKOnly" />
- <keyword match="vbOKCancel" />
- <keyword match="vbAbortRetryIgnore" />
- <keyword match="vbYesNoCancel" />
- <keyword match="vbYesNo" />
- <keyword match="vbRetryCancel" />
- <keyword match="vbCritical" />
- <keyword match="vbQuestion" />
- <keyword match="vbExclamation" />
- <keyword match="vbInformation" />
- <keyword match="vbDefaultButton1" />
- <keyword match="vbDefaultButton2" />
- <keyword match="vbDefaultButton3" />
- <keyword match="vbDefaultButton4" />
- <keyword match="vbApplicationModal" />
- <keyword match="vbSystemModal" />
- <keyword match="vbOK" />
- <keyword match="vbCancel" />
- <keyword match="vbAbort" />
- <keyword match="vbRetry" />
- <keyword match="vbIgnore" />
- <keyword match="vbYes" />
- <keyword match="vbNo" />
- <!-- String Constants -->
- <keyword match="vbCr" />
- <keyword match="VbCrLf" />
- <keyword match="vbFormFeed" />
- <keyword match="vbLf" />
- <keyword match="vbNewLine" />
- <keyword match="vbNullChar" />
- <keyword match="vbNullString" />
- <keyword match="vbTab" />
- <keyword match="vbVerticalTab" />
- <!-- Tristate Constants -->
- <keyword match="vbUseDefault" />
- <keyword match="vbTrue" />
- <keyword match="vbFalse" />
- <!-- VarType Constants -->
- <keyword match="vbEmpty" />
- <keyword match="vbNull" />
- <keyword match="vbInteger" />
- <keyword match="vbLong" />
- <keyword match="vbSingle" />
- <keyword match="vbDouble" />
- <keyword match="vbCurrency" />
- <keyword match="vbDate" />
- <keyword match="vbString" />
- <keyword match="vbObject" />
- <keyword match="vbError" />
- <keyword match="vbBoolean" />
- <keyword match="vbVariant" />
- <keyword match="vbDataObject" />
- <keyword match="vbDecimal" />
- <keyword match="vbByte" />
- <keyword match="vbArray" />
- </keywords>
-
- <keywords name="functions" inherits="identifier" innerClass="builtin" case="no">
- <keyword match="Abs" />
- <keyword match="Array" />
- <keyword match="Asc" />
- <keyword match="Atn" />
- <keyword match="CBool" />
- <keyword match="CByte" />
- <keyword match="CCur" />
- <keyword match="CDate" />
- <keyword match="CDbl" />
- <keyword match="Chr" />
- <keyword match="CInt" />
- <keyword match="CLng" />
- <keyword match="Cos" />
- <keyword match="CreateObject" />
- <keyword match="CSng" />
- <keyword match="CStr" />
- <keyword match="Date" />
- <keyword match="DateAdd" />
- <keyword match="DateDiff" />
- <keyword match="DatePart" />
- <keyword match="DateSerial" />
- <keyword match="DateValue" />
- <keyword match="Day" />
- <keyword match="Escape" />
- <keyword match="Eval" />
- <keyword match="Exp" />
- <keyword match="Filter" />
- <keyword match="FormatCurrency" />
- <keyword match="FormatDateTime" />
- <keyword match="FormatNumber" />
- <keyword match="FormatPercent" />
- <keyword match="GetLocale" />
- <keyword match="GetObject" />
- <keyword match="GetRef" />
- <keyword match="Hex" />
- <keyword match="Hour" />
- <keyword match="InputBox" />
- <keyword match="InStr" />
- <keyword match="InStrRev" />
- <keyword match="Int" />
- <keyword match="Fix" />
- <keyword match="IsArray" />
- <keyword match="IsDate" />
- <keyword match="IsEmpty" />
- <keyword match="IsNull" />
- <keyword match="IsNumeric" />
- <keyword match="IsObject" />
- <keyword match="Join" />
- <keyword match="LBound" />
- <keyword match="LCase" />
- <keyword match="Left" />
- <keyword match="Len" />
- <keyword match="LoadPicture" />
- <keyword match="Log" />
- <keyword match="LTrim" />
- <keyword match="RTrim" />
- <keyword match="Trim" />
- <keyword match="Mid" />
- <keyword match="Minute" />
- <keyword match="Month" />
- <keyword match="MonthName" />
- <keyword match="MsgBox" />
- <keyword match="Now" />
- <keyword match="Oct" />
- <keyword match="Replace" />
- <keyword match="RGB" />
- <keyword match="Right" />
- <keyword match="Rnd" />
- <keyword match="Round" />
- <keyword match="ScriptEngine" />
- <keyword match="ScriptEngineBuildVersion" />
- <keyword match="ScriptEngineMajorVersion" />
- <keyword match="ScriptEngineMinorVersion" />
- <keyword match="Second" />
- <keyword match="SetLocale" />
- <keyword match="Sgn" />
- <keyword match="Sin" />
- <keyword match="Space" />
- <keyword match="Split" />
- <keyword match="Sqr" />
- <keyword match="StrComp" />
- <keyword match="String" />
- <keyword match="StrReverse" />
- <keyword match="Tan" />
- <keyword match="Time" />
- <keyword match="Timer" />
- <keyword match="TimeSerial" />
- <keyword match="TimeValue" />
- <keyword match="TypeName" />
- <keyword match="UBound" />
- <keyword match="UCase" />
- <keyword match="Unescape" />
- <keyword match="VarType" />
- <keyword match="Weekday" />
- <keyword match="WeekdayName" />
- <keyword match="Year" />
- </keywords>
-
- <keywords name="builtin" inherits="identifier" innerClass="builtin" case="no">
- <!--<keyword match="Class" />-->
- <keyword match="Debug" />
- <keyword match="Err" />
- <keyword match="Match" />
- <keyword match="RegExp" />
- </keywords>
-
- <keywords name="reserved" inherits="identifier" innerClass="reserved" case="no">
- <keyword match="Empty" />
- <keyword match="False" />
- <keyword match="Nothing" />
- <keyword match="Null" />
- <keyword match="True" />
- <keyword match="And" />
- <keyword match="Eqv" />
- <keyword match="Imp" />
- <keyword match="Is" />
- <keyword match="Mod" />
- <keyword match="Not" />
- <keyword match="Or" />
- <keyword match="Xor" />
- <keyword match="Call" />
- <keyword match="Class" />
- <keyword match="End" />
- <keyword match="Const" />
- <keyword match="Public" />
- <keyword match="Private" />
- <keyword match="Dim" />
- <keyword match="Do" />
- <keyword match="While" />
- <keyword match="Until" />
- <keyword match="Exit" />
- <keyword match="Loop" />
- <keyword match="Erase" />
- <keyword match="Execute" />
- <keyword match="ExecuteGlobal" />
- <keyword match="For" />
- <keyword match="Each" />
- <keyword match="In" />
- <keyword match="To" />
- <keyword match="Step" />
- <keyword match="Next" />
- <keyword match="Function" />
- <keyword match="Default" />
- <keyword match="If" />
- <keyword match="Then" />
- <keyword match="Else" />
- <keyword match="ElseIf" />
- <keyword match="On" />
- <keyword match="Error" />
- <keyword match="Resume" />
- <keyword match="Goto" />
- <keyword match="Option" />
- <keyword match="Explicit" />
- <keyword match="Property" />
- <keyword match="Get" />
- <keyword match="Let" />
- <keyword match="Set" />
- <keyword match="Randomize" />
- <keyword match="ReDim" />
- <keyword match="Preserve" />
- <keyword match="Select" />
- <keyword match="Case" />
- <keyword match="Stop" />
- <keyword match="Sub" />
- <keyword match="Wend" />
- <keyword match="With" />
- </keywords>
-
-</highlight>
diff --git a/library/Text_Highlighter/xml.xml b/library/Text_Highlighter/xml.xml
deleted file mode 100644
index 2271ff3ae..000000000
--- a/library/Text_Highlighter/xml.xml
+++ /dev/null
@@ -1,37 +0,0 @@
-<?xml version="1.0"?>
-<!-- $Id: xml.xml,v 1.1 2007-06-03 02:35:28 ssttoo Exp $ -->
-
-<highlight lang="xml" case="no">
-
- <authors>
- <author name="Andrey Demenev" email="demenev@gmail.com"/>
- </authors>
-
-
- <default innerClass="code" />
-
- <region name="cdata" delimClass="comment" innerClass="comment"
- start="\&lt;\!\[CDATA\[" end="\]\]\&gt;">
- </region>
-
- <region name="comment" delimClass="comment" innerClass="comment"
- start="\&lt;!--" end="--\&gt;">
- </region>
-
- <region name="tag" delimClass="brackets" innerClass="code" start="\&lt;[\?\/]?" end="[\/\?]?\&gt;">
- <contains block="tagname"/>
- <contains region="param"/>
- <contains block="paramname"/>
- </region>
-
- <block name="tagname" match="(?&lt;=[\&lt;\/?])[\w\-\:]+" innerClass="reserved" contained="yes"/>
-
- <block name="paramname" match="[\w\-\:]+" innerClass="var" contained="yes"/>
-
- <block name="entity" match="(&amp;|%)[\w\-\.]+;" innerClass="special" />
-
- <region name="param" start="&quot;" end="&quot;" delimClass="quotes" innerClass="string" contained="yes">
- <contains block="entity"/>
- </region>
-
-</highlight>
diff --git a/library/blueimp_upload/.gitignore b/library/blueimp_upload/.gitignore
deleted file mode 100644
index 29a41a8c4..000000000
--- a/library/blueimp_upload/.gitignore
+++ /dev/null
@@ -1,3 +0,0 @@
-.DS_Store
-*.pyc
-node_modules
diff --git a/library/blueimp_upload/.jshintrc b/library/blueimp_upload/.jshintrc
deleted file mode 100644
index 4ad82e664..000000000
--- a/library/blueimp_upload/.jshintrc
+++ /dev/null
@@ -1,81 +0,0 @@
-{
- "bitwise" : true, // true: Prohibit bitwise operators (&, |, ^, etc.)
- "camelcase" : true, // true: Identifiers must be in camelCase
- "curly" : true, // true: Require {} for every new block or scope
- "eqeqeq" : true, // true: Require triple equals (===) for comparison
- "forin" : true, // true: Require filtering for..in loops with obj.hasOwnProperty()
- "immed" : true, // true: Require immediate invocations to be wrapped in parens
- // e.g. `(function () { } ());`
- "indent" : 4, // {int} Number of spaces to use for indentation
- "latedef" : true, // true: Require variables/functions to be defined before being used
- "newcap" : true, // true: Require capitalization of all constructor functions e.g. `new F()`
- "noarg" : true, // true: Prohibit use of `arguments.caller` and `arguments.callee`
- "noempty" : true, // true: Prohibit use of empty blocks
- "nonew" : true, // true: Prohibit use of constructors for side-effects (without assignment)
- "plusplus" : false, // true: Prohibit use of `++` & `--`
- "quotmark" : "single", // Quotation mark consistency:
- // false : do nothing (default)
- // true : ensure whatever is used is consistent
- // "single" : require single quotes
- // "double" : require double quotes
- "undef" : true, // true: Require all non-global variables to be declared (prevents global leaks)
- "unused" : true, // true: Require all defined variables be used
- "strict" : true, // true: Requires all functions run in ES5 Strict Mode
- "trailing" : true, // true: Prohibit trailing whitespaces
- "maxparams" : false, // {int} Max number of formal params allowed per function
- "maxdepth" : false, // {int} Max depth of nested blocks (within functions)
- "maxstatements" : false, // {int} Max number statements per function
- "maxcomplexity" : false, // {int} Max cyclomatic complexity per function
- "maxlen" : false, // {int} Max number of characters per line
-
- // Relaxing
- "asi" : false, // true: Tolerate Automatic Semicolon Insertion (no semicolons)
- "boss" : false, // true: Tolerate assignments where comparisons would be expected
- "debug" : false, // true: Allow debugger statements e.g. browser breakpoints.
- "eqnull" : false, // true: Tolerate use of `== null`
- "es5" : false, // true: Allow ES5 syntax (ex: getters and setters)
- "esnext" : false, // true: Allow ES.next (ES6) syntax (ex: `const`)
- "moz" : false, // true: Allow Mozilla specific syntax (extends and overrides esnext features)
- // (ex: `for each`, multiple try/catch, function expression…)
- "evil" : false, // true: Tolerate use of `eval` and `new Function()`
- "expr" : false, // true: Tolerate `ExpressionStatement` as Programs
- "funcscope" : false, // true: Tolerate defining variables inside control statements"
- "globalstrict" : false, // true: Allow global "use strict" (also enables 'strict')
- "iterator" : false, // true: Tolerate using the `__iterator__` property
- "lastsemic" : false, // true: Tolerate omitting a semicolon for the last statement of a 1-line block
- "laxbreak" : false, // true: Tolerate possibly unsafe line breakings
- "laxcomma" : false, // true: Tolerate comma-first style coding
- "loopfunc" : false, // true: Tolerate functions being defined in loops
- "multistr" : false, // true: Tolerate multi-line strings
- "proto" : false, // true: Tolerate using the `__proto__` property
- "scripturl" : false, // true: Tolerate script-targeted URLs
- "smarttabs" : false, // true: Tolerate mixed tabs/spaces when used for alignment
- "shadow" : false, // true: Allows re-define variables later in code e.g. `var x=1; x=2;`
- "sub" : false, // true: Tolerate using `[]` notation when it can still be expressed in dot notation
- "supernew" : false, // true: Tolerate `new function () { ... };` and `new Object;`
- "validthis" : false, // true: Tolerate using this in a non-constructor function
-
- // Environments
- "browser" : false, // Web Browser (window, document, etc)
- "couch" : false, // CouchDB
- "devel" : false, // Development/debugging (alert, confirm, etc)
- "dojo" : false, // Dojo Toolkit
- "jquery" : false, // jQuery
- "mootools" : false, // MooTools
- "node" : false, // Node.js
- "nonstandard" : false, // Widely adopted globals (escape, unescape, etc)
- "prototypejs" : false, // Prototype and Scriptaculous
- "rhino" : false, // Rhino
- "worker" : false, // Web Workers
- "wsh" : false, // Windows Scripting Host
- "yui" : false, // Yahoo User Interface
-
- // Legacy
- "nomen" : true, // true: Prohibit dangling `_` in variables
- "onevar" : true, // true: Allow only one `var` statement per function
- "passfail" : false, // true: Stop on first error
- "white" : true, // true: Check against strict whitespace and indentation rules
-
- // Custom Globals
- "globals" : {} // additional predefined global variables
-}
diff --git a/library/blueimp_upload/CONTRIBUTING.md b/library/blueimp_upload/CONTRIBUTING.md
index b8708f8b6..e182f9b37 100644
--- a/library/blueimp_upload/CONTRIBUTING.md
+++ b/library/blueimp_upload/CONTRIBUTING.md
@@ -1,42 +1,15 @@
-# Issue Guidelines
+Please follow these pull request guidelines:
-The issues tracker should only be used for **bugs** or **feature requests**.
-
-Please post **support requests** and **general discussions** about this project to the [support forum](https://groups.google.com/d/forum/jquery-fileupload).
-
-## Bugs
-
-Please follow these guidelines before reporting a bug:
-
-1. **Update to the latest version** &mdash; Check if you can reproduce the issue with the latest version from the `master` branch.
-
-2. **Use the GitHub issue search** &mdash; check if the issue has already been reported. If it has been, please comment on the existing issue.
-
-3. **Isolate the demonstrable problem** &mdash; Try to reproduce the problem with the [Demo](https://blueimp.github.io/jQuery-File-Upload/) or with a reduced test case that includes the least amount of code necessary to reproduce the problem.
-
-4. **Provide a means to reproduce the problem** &mdash; Please provide as much details as possible, e.g. server information, browser and operating system versions, steps to reproduce the problem. If possible, provide a link to your reduced test case, e.g. via [JSFiddle](http://jsfiddle.net/).
-
-
-## Feature requests
-
-Please follow the bug guidelines above for feature requests, i.e. update to the latest version and search for exising issues before posting a new request.
-
-Generally, feature requests might be accepted if the implementation would benefit a broader use case or the project could be considered incomplete without that feature.
-
-If you need help integrating this project into another framework, please post your request to the [support forum](https://groups.google.com/d/forum/jquery-fileupload).
-
-## Pull requests
-
-[Pull requests](https://help.github.com/articles/using-pull-requests) are welcome and the preferred way of accepting code contributions.
+1. Update your fork to the latest upstream version.
-However, if you add a server-side upload handler implementation for another framework, please continue to maintain this version in your own fork without sending a pull request. You are welcome to add a link and possibly documentation about your implementation to the [Wiki](https://github.com/blueimp/jQuery-File-Upload/wiki).
+2. Follow the coding conventions of the original source files (indentation, spaces, brackets layout).
-Please follow these guidelines before sending a pull request:
+3. Code changes must pass JSHint validation with the `.jshintrc` settings of this project.
-1. Update your fork to the latest upstream version.
+4. Code changes must pass the QUnit tests defined in the `test` folder.
-2. Follow the coding conventions of the original repository. Changes to one of the JavaScript source files are required to pass the [JSHint](http://www.jshint.com/) validation tool.
+5. New features should be covered by accompanying QUnit tests.
-3. Keep your commits as atomar as possible, i.e. create a new commit for every single bug fix or feature added.
+6. Keep your commits as atomic as possible, i.e. create a new commit for every single bug fix or feature added.
-4. Always add meaningfull commit messages.
+7. Always add meaningful commit messages.
diff --git a/library/blueimp_upload/Gruntfile.js b/library/blueimp_upload/Gruntfile.js
deleted file mode 100644
index dcdb5d57a..000000000
--- a/library/blueimp_upload/Gruntfile.js
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
- * jQuery File Upload Gruntfile
- * https://github.com/blueimp/jQuery-File-Upload
- *
- * Copyright 2013, Sebastian Tschan
- * https://blueimp.net
- *
- * Licensed under the MIT license:
- * http://www.opensource.org/licenses/MIT
- */
-
-/*global module */
-
-module.exports = function (grunt) {
- 'use strict';
-
- grunt.initConfig({
- jshint: {
- options: {
- jshintrc: '.jshintrc'
- },
- all: [
- 'Gruntfile.js',
- 'js/cors/*.js',
- 'js/*.js',
- 'server/node/server.js',
- 'test/test.js'
- ]
- }
- });
-
- grunt.loadNpmTasks('grunt-contrib-jshint');
- grunt.loadNpmTasks('grunt-bump-build-git');
- grunt.registerTask('test', ['jshint']);
- grunt.registerTask('default', ['test']);
-
-};
diff --git a/library/blueimp_upload/LICENSE b/library/blueimp_upload/LICENSE
new file mode 100644
index 000000000..0ecca3e8c
--- /dev/null
+++ b/library/blueimp_upload/LICENSE
@@ -0,0 +1,20 @@
+The MIT License (MIT)
+
+Copyright (c) 2017 jQuery-File-Upload Authors
+
+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/blueimp_upload/README.md b/library/blueimp_upload/README.md
index 3aa33de42..56785b847 100644
--- a/library/blueimp_upload/README.md
+++ b/library/blueimp_upload/README.md
@@ -11,17 +11,6 @@ Supports cross-domain, chunked and resumable file uploads and client-side image
* [How to setup the plugin on your website](https://github.com/blueimp/jQuery-File-Upload/wiki/Setup)
* [How to use only the basic plugin (minimal setup guide).](https://github.com/blueimp/jQuery-File-Upload/wiki/Basic-plugin)
-## Support
-
-* **[Support Forum](https://groups.google.com/d/forum/jquery-fileupload)**
-**Support requests** and **general discussions** about the File Upload plugin can be posted to the official
-[Support Forum](https://groups.google.com/d/forum/jquery-fileupload).
-If your question is not directly related to the File Upload plugin, you might have a better chance to get a reply by posting to [Stack Overflow](http://stackoverflow.com/questions/tagged/blueimp+jquery+file-upload).
-
-* Bugs and Feature requests
-**Bugs** and **Feature requests** can be reported using the [issues tracker](https://github.com/blueimp/jQuery-File-Upload/issues).
-Please read the [issue guidelines](https://github.com/blueimp/jQuery-File-Upload/blob/master/CONTRIBUTING.md) before posting.
-
## Features
* **Multiple file upload:**
Allows to select multiple files at once and upload them simultaneously.
@@ -60,28 +49,18 @@ Please read the [issue guidelines](https://github.com/blueimp/jQuery-File-Upload
### Mandatory requirements
* [jQuery](https://jquery.com/) v. 1.6+
-* [jQuery UI widget factory](https://api.jqueryui.com/jQuery.widget/) v. 1.9+ (included)
-* [jQuery Iframe Transport plugin](https://github.com/blueimp/jQuery-File-Upload/blob/master/js/jquery.iframe-transport.js) (included)
-
-The jQuery UI widget factory is a requirement for the basic File Upload plugin, but very lightweight without any other dependencies from the jQuery UI suite.
-
-The jQuery Iframe Transport is required for [browsers without XHR file upload support](https://github.com/blueimp/jQuery-File-Upload/wiki/Browser-support).
+* [jQuery UI widget factory](https://api.jqueryui.com/jQuery.widget/) v. 1.9+ (included): Required for the basic File Upload plugin, but very lightweight without any other dependencies from the jQuery UI suite.
+* [jQuery Iframe Transport plugin](https://github.com/blueimp/jQuery-File-Upload/blob/master/js/jquery.iframe-transport.js) (included): Required for [browsers without XHR file upload support](https://github.com/blueimp/jQuery-File-Upload/wiki/Browser-support).
### Optional requirements
-* [JavaScript Templates engine](https://github.com/blueimp/JavaScript-Templates) v. 2.5.4+
-* [JavaScript Load Image library](https://github.com/blueimp/JavaScript-Load-Image) v. 1.13.0+
-* [JavaScript Canvas to Blob polyfill](https://github.com/blueimp/JavaScript-Canvas-to-Blob) v. 2.1.1+
-* [blueimp Gallery](https://github.com/blueimp/Gallery) v. 2.15.1+
-* [Bootstrap CSS framework](http://getbootstrap.com/) v. 3.2.0+
+* [JavaScript Templates engine](https://github.com/blueimp/JavaScript-Templates) v. 2.5.4+: Used to render the selected and uploaded files for the Basic Plus UI and jQuery UI versions.
+* [JavaScript Load Image library](https://github.com/blueimp/JavaScript-Load-Image) v. 1.13.0+: Required for the image previews and resizing functionality.
+* [JavaScript Canvas to Blob polyfill](https://github.com/blueimp/JavaScript-Canvas-to-Blob) v. 2.1.1+:Required for the image previews and resizing functionality.
+* [blueimp Gallery](https://github.com/blueimp/Gallery) v. 2.15.1+: Used to display the uploaded images in a lightbox.
+* [Bootstrap](http://getbootstrap.com/) v. 3.2.0+
* [Glyphicons](http://glyphicons.com/)
-The JavaScript Templates engine is used to render the selected and uploaded files for the Basic Plus UI and jQuery UI versions.
-
-The JavaScript Load Image library and JavaScript Canvas to Blob polyfill are required for the image previews and resizing functionality.
-
-The blueimp Gallery is used to display the uploaded images in a lightbox.
-
-The user interface of all versions except the jQuery UI version is built with Twitter's [Bootstrap](http://getbootstrap.com/) framework and icons from [Glyphicons](http://glyphicons.com/).
+The user interface of all versions except the jQuery UI version is built with [Bootstrap](http://getbootstrap.com/) and icons from [Glyphicons](http://glyphicons.com/).
### Cross-domain requirements
[Cross-domain File Uploads](https://github.com/blueimp/jQuery-File-Upload/wiki/Cross-domain-uploads) using the [Iframe Transport plugin](https://github.com/blueimp/jQuery-File-Upload/blob/master/js/jquery.iframe-transport.js) require a redirect back to the origin server to retrieve the upload results. The [example implementation](https://github.com/blueimp/jQuery-File-Upload/blob/master/js/main.js) makes use of [result.html](https://github.com/blueimp/jQuery-File-Upload/blob/master/cors/result.html) as a static redirect page for the origin server.
@@ -89,6 +68,10 @@ The user interface of all versions except the jQuery UI version is built with Tw
The repository also includes the [jQuery XDomainRequest Transport plugin](https://github.com/blueimp/jQuery-File-Upload/blob/master/js/cors/jquery.xdr-transport.js), which enables limited cross-domain AJAX requests in Microsoft Internet Explorer 8 and 9 (IE 10 supports cross-domain XHR requests).
The XDomainRequest object allows GET and POST requests only and doesn't support file uploads. It is used on the [Demo](https://blueimp.github.io/jQuery-File-Upload/) to delete uploaded files from the cross-domain demo file upload service.
+### Custom Backends
+
+You can add support for various backends by adhering to the specification [outlined here](https://github.com/blueimp/jQuery-File-Upload/wiki/JSON-Response).
+
## Browsers
### Desktop browsers
@@ -110,14 +93,15 @@ The File Upload plugin has been tested with and supports the following mobile br
* Opera Mobile 12.0+
### Supported features
-For a detailed overview of the features supported by each browser version please have a look at the [Extended browser support information](https://github.com/blueimp/jQuery-File-Upload/wiki/Browser-support).
+For a detailed overview of the features supported by each browser version, please have a look at the [Extended browser support information](https://github.com/blueimp/jQuery-File-Upload/wiki/Browser-support).
-## License
-Released under the [MIT license](http://www.opensource.org/licenses/MIT).
+## Contributing
+**Bug fixes** and **new features** can be proposed using [pull requests](https://github.com/blueimp/jQuery-File-Upload/pulls).
+Please read the [contribution guidelines](https://github.com/blueimp/jQuery-File-Upload/blob/master/CONTRIBUTING.md) before submitting a pull request.
-## Donations
-jQuery File Upload is free software, but you can donate to support the developer, Sebastian Tschan:
-
-Flattr: [![Flattr](https://api.flattr.com/button/flattr-badge-large.png)](https://flattr.com/thing/286433/jQuery-File-Upload-Plugin)
+## Support
+This project is actively maintained, but there is no official support channel.
+If you have a question that another developer might help you with, please post to [Stack Overflow](http://stackoverflow.com/questions/tagged/blueimp+jquery+file-upload) and tag your question with `blueimp jquery file upload`.
-PayPal: [![PayPal](https://www.paypalobjects.com/WEBSCR-640-20110429-1/en_US/i/btn/btn_donateCC_LG.gif)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=PYWYSYP77KL54)
+## License
+Released under the [MIT license](https://opensource.org/licenses/MIT).
diff --git a/library/blueimp_upload/angularjs.html b/library/blueimp_upload/angularjs.html
index 2a3ca2007..4858c8600 100644
--- a/library/blueimp_upload/angularjs.html
+++ b/library/blueimp_upload/angularjs.html
@@ -1,14 +1,14 @@
<!DOCTYPE HTML>
<!--
/*
- * jQuery File Upload Plugin AngularJS Demo 2.2.0
+ * jQuery File Upload Plugin AngularJS Demo
* https://github.com/blueimp/jQuery-File-Upload
*
* Copyright 2013, Sebastian Tschan
* https://blueimp.net
*
* Licensed under the MIT license:
- * http://www.opensource.org/licenses/MIT
+ * https://opensource.org/licenses/MIT
*/
-->
<html lang="en">
@@ -157,9 +157,9 @@
</div>
<div class="panel-body">
<ul>
- <li>The maximum file size for uploads in this demo is <strong>5 MB</strong> (default file size is unlimited).</li>
+ <li>The maximum file size for uploads in this demo is <strong>999 KB</strong> (default file size is unlimited).</li>
<li>Only image files (<strong>JPG, GIF, PNG</strong>) are allowed in this demo (by default there is no file type restriction).</li>
- <li>Uploaded files will be deleted automatically after <strong>5 minutes</strong> (demo setting).</li>
+ <li>Uploaded files will be deleted automatically after <strong>5 minutes or less</strong> (demo files are stored in memory).</li>
<li>You can <strong>drag &amp; drop</strong> files from your desktop on this webpage (see <a href="https://github.com/blueimp/jQuery-File-Upload/wiki/Browser-support">Browser support</a>).</li>
<li>Please refer to the <a href="https://github.com/blueimp/jQuery-File-Upload">project website</a> and <a href="https://github.com/blueimp/jQuery-File-Upload/wiki">documentation</a> for more information.</li>
<li>Built with the <a href="http://getbootstrap.com/">Bootstrap</a> CSS framework and Icons from <a href="http://glyphicons.com/">Glyphicons</a>.</li>
@@ -177,8 +177,8 @@
<a class="play-pause"></a>
<ol class="indicator"></ol>
</div>
-<script src="//ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
-<script src="//ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script>
+<script src="//ajax.googleapis.com/ajax/libs/jquery/1.11.3/jquery.min.js"></script>
+<script src="//ajax.googleapis.com/ajax/libs/angularjs/1.3.15/angular.min.js"></script>
<!-- The jQuery UI widget factory, can be omitted if jQuery UI is already included -->
<script src="js/vendor/jquery.ui.widget.js"></script>
<!-- The Load Image plugin is included for the preview images and image resizing functionality -->
@@ -207,5 +207,5 @@
<script src="js/jquery.fileupload-angular.js"></script>
<!-- The main application script -->
<script src="js/app.js"></script>
-</body>
+</body>
</html>
diff --git a/library/blueimp_upload/basic-plus.html b/library/blueimp_upload/basic-plus.html
index 59b73b60c..9e5c2321f 100644
--- a/library/blueimp_upload/basic-plus.html
+++ b/library/blueimp_upload/basic-plus.html
@@ -1,14 +1,14 @@
<!DOCTYPE HTML>
<!--
/*
- * jQuery File Upload Plugin Basic Plus Demo 1.4.0
+ * jQuery File Upload Plugin Basic Plus Demo
* https://github.com/blueimp/jQuery-File-Upload
*
* Copyright 2013, Sebastian Tschan
* https://blueimp.net
*
* Licensed under the MIT license:
- * http://www.opensource.org/licenses/MIT
+ * https://opensource.org/licenses/MIT
*/
-->
<html lang="en">
@@ -86,9 +86,9 @@
</div>
<div class="panel-body">
<ul>
- <li>The maximum file size for uploads in this demo is <strong>5 MB</strong> (default file size is unlimited).</li>
+ <li>The maximum file size for uploads in this demo is <strong>999 KB</strong> (default file size is unlimited).</li>
<li>Only image files (<strong>JPG, GIF, PNG</strong>) are allowed in this demo (by default there is no file type restriction).</li>
- <li>Uploaded files will be deleted automatically after <strong>5 minutes</strong> (demo setting).</li>
+ <li>Uploaded files will be deleted automatically after <strong>5 minutes or less</strong> (demo files are stored in memory).</li>
<li>You can <strong>drag &amp; drop</strong> files from your desktop on this webpage (see <a href="https://github.com/blueimp/jQuery-File-Upload/wiki/Browser-support">Browser support</a>).</li>
<li>Please refer to the <a href="https://github.com/blueimp/jQuery-File-Upload">project website</a> and <a href="https://github.com/blueimp/jQuery-File-Upload/wiki">documentation</a> for more information.</li>
<li>Built with the <a href="http://getbootstrap.com/">Bootstrap</a> CSS framework and Icons from <a href="http://glyphicons.com/">Glyphicons</a>.</li>
@@ -96,7 +96,7 @@
</div>
</div>
</div>
-<script src="//ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
+<script src="//ajax.googleapis.com/ajax/libs/jquery/1.11.3/jquery.min.js"></script>
<!-- The jQuery UI widget factory, can be omitted if jQuery UI is already included -->
<script src="js/vendor/jquery.ui.widget.js"></script>
<!-- The Load Image plugin is included for the preview images and image resizing functionality -->
@@ -150,7 +150,7 @@ $(function () {
dataType: 'json',
autoUpload: false,
acceptFileTypes: /(\.|\/)(gif|jpe?g|png)$/i,
- maxFileSize: 5000000, // 5 MB
+ maxFileSize: 999000,
// Enable image resizing, except for Android and Opera,
// which actually support image resizing, but fail to
// send Blob objects via XHR requests:
@@ -222,5 +222,5 @@ $(function () {
.parent().addClass($.support.fileInput ? undefined : 'disabled');
});
</script>
-</body>
+</body>
</html>
diff --git a/library/blueimp_upload/basic.html b/library/blueimp_upload/basic.html
index f248f4d80..c0df639b4 100644
--- a/library/blueimp_upload/basic.html
+++ b/library/blueimp_upload/basic.html
@@ -1,14 +1,14 @@
<!DOCTYPE HTML>
<!--
/*
- * jQuery File Upload Plugin Basic Demo 1.3.0
+ * jQuery File Upload Plugin Basic Demo
* https://github.com/blueimp/jQuery-File-Upload
*
* Copyright 2013, Sebastian Tschan
* https://blueimp.net
*
* Licensed under the MIT license:
- * http://www.opensource.org/licenses/MIT
+ * https://opensource.org/licenses/MIT
*/
-->
<html lang="en">
@@ -86,17 +86,17 @@
</div>
<div class="panel-body">
<ul>
- <li>The maximum file size for uploads in this demo is <strong>5 MB</strong> (default file size is unlimited).</li>
+ <li>The maximum file size for uploads in this demo is <strong>999 KB</strong> (default file size is unlimited).</li>
<li>Only image files (<strong>JPG, GIF, PNG</strong>) are allowed in this demo (by default there is no file type restriction).</li>
- <li>Uploaded files will be deleted automatically after <strong>5 minutes</strong> (demo setting).</li>
+ <li>Uploaded files will be deleted automatically after <strong>5 minutes or less</strong> (demo files are stored in memory).</li>
<li>You can <strong>drag &amp; drop</strong> files from your desktop on this webpage (see <a href="https://github.com/blueimp/jQuery-File-Upload/wiki/Browser-support">Browser support</a>).</li>
<li>Please refer to the <a href="https://github.com/blueimp/jQuery-File-Upload">project website</a> and <a href="https://github.com/blueimp/jQuery-File-Upload/wiki">documentation</a> for more information.</li>
- <li>Built with Twitter's <a href="http://twitter.github.com/bootstrap/">Bootstrap</a> CSS framework and Icons from <a href="http://glyphicons.com/">Glyphicons</a>.</li>
+ <li>Built with the <a href="http://getbootstrap.com/">Bootstrap</a> CSS framework and Icons from <a href="http://glyphicons.com/">Glyphicons</a>.</li>
</ul>
</div>
</div>
</div>
-<script src="//ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
+<script src="//ajax.googleapis.com/ajax/libs/jquery/1.11.3/jquery.min.js"></script>
<!-- The jQuery UI widget factory, can be omitted if jQuery UI is already included -->
<script src="js/vendor/jquery.ui.widget.js"></script>
<!-- The Iframe Transport is required for browsers without support for XHR file uploads -->
@@ -132,5 +132,5 @@ $(function () {
.parent().addClass($.support.fileInput ? undefined : 'disabled');
});
</script>
-</body>
+</body>
</html>
diff --git a/library/blueimp_upload/blueimp-file-upload.jquery.json b/library/blueimp_upload/blueimp-file-upload.jquery.json
deleted file mode 100644
index d6d8c911c..000000000
--- a/library/blueimp_upload/blueimp-file-upload.jquery.json
+++ /dev/null
@@ -1,50 +0,0 @@
-{
- "name": "blueimp-file-upload",
- "version": "9.8.0",
- "title": "jQuery File Upload",
- "author": {
- "name": "Sebastian Tschan",
- "url": "https://blueimp.net"
- },
- "licenses": [
- {
- "type": "MIT",
- "url": "http://www.opensource.org/licenses/MIT"
- }
- ],
- "dependencies": {
- "jquery": ">=1.6"
- },
- "description": "File Upload widget with multiple file selection, drag&amp;drop support, progress bar, validation and preview images, audio and video for jQuery. Supports cross-domain, chunked and resumable file uploads. Works with any server-side platform (Google App Engine, PHP, Python, Ruby on Rails, Java, etc.) that supports standard HTML form file uploads.",
- "keywords": [
- "jquery",
- "file",
- "upload",
- "widget",
- "multiple",
- "selection",
- "drag",
- "drop",
- "progress",
- "preview",
- "cross-domain",
- "cross-site",
- "chunk",
- "resume",
- "gae",
- "go",
- "python",
- "php",
- "bootstrap"
- ],
- "homepage": "https://github.com/blueimp/jQuery-File-Upload",
- "docs": "https://github.com/blueimp/jQuery-File-Upload/wiki",
- "demo": "https://blueimp.github.io/jQuery-File-Upload/",
- "bugs": "https://github.com/blueimp/jQuery-File-Upload/issues",
- "maintainers": [
- {
- "name": "Sebastian Tschan",
- "url": "https://blueimp.net"
- }
- ]
-}
diff --git a/library/blueimp_upload/bower-version-update.js b/library/blueimp_upload/bower-version-update.js
new file mode 100755
index 000000000..09ce3927e
--- /dev/null
+++ b/library/blueimp_upload/bower-version-update.js
@@ -0,0 +1,16 @@
+#!/usr/bin/env node
+
+'use strict';
+
+var path = require('path');
+var packageJSON = require(path.join(__dirname, 'package.json'));
+var bowerFile = path.join(__dirname, 'bower.json');
+var bowerJSON = require('bower-json').parse(
+ require(bowerFile),
+ {normalize: true}
+);
+bowerJSON.version = packageJSON.version;
+require('fs').writeFileSync(
+ bowerFile,
+ JSON.stringify(bowerJSON, null, 2) + '\n'
+);
diff --git a/library/blueimp_upload/bower.json b/library/blueimp_upload/bower.json
index c0d3d3259..90c74c792 100644
--- a/library/blueimp_upload/bower.json
+++ b/library/blueimp_upload/bower.json
@@ -1,8 +1,8 @@
{
"name": "blueimp-file-upload",
- "version": "9.8.0",
+ "version": "9.18.0",
"title": "jQuery File Upload",
- "description": "File Upload widget with multiple file selection, drag&amp;drop support, progress bar, validation and preview images, audio and video for jQuery. Supports cross-domain, chunked and resumable file uploads. Works with any server-side platform (Google App Engine, PHP, Python, Ruby on Rails, Java, etc.) that supports standard HTML form file uploads.",
+ "description": "File Upload widget with multiple file selection, drag&amp;drop support, progress bar, validation and preview images.",
"keywords": [
"jquery",
"file",
@@ -40,12 +40,7 @@
"url": "git://github.com/blueimp/jQuery-File-Upload.git"
},
"bugs": "https://github.com/blueimp/jQuery-File-Upload/issues",
- "licenses": [
- {
- "type": "MIT",
- "url": "http://www.opensource.org/licenses/MIT"
- }
- ],
+ "license": "MIT",
"dependencies": {
"jquery": ">=1.6",
"blueimp-tmpl": ">=2.5.4",
@@ -53,23 +48,7 @@
"blueimp-canvas-to-blob": ">=2.1.1"
},
"main": [
- "css/jquery.fileupload.css",
- "css/jquery.fileupload-ui.css",
- "css/jquery.fileupload-noscript.css",
- "css/jquery.fileupload-ui-noscript.css",
- "js/cors/jquery.postmessage-transport.js",
- "js/cors/jquery.xdr-transport.js",
- "js/vendor/jquery.ui.widget.js",
- "js/jquery.fileupload.js",
- "js/jquery.fileupload-process.js",
- "js/jquery.fileupload-validate.js",
- "js/jquery.fileupload-image.js",
- "js/jquery.fileupload-audio.js",
- "js/jquery.fileupload-video.js",
- "js/jquery.fileupload-ui.js",
- "js/jquery.fileupload-jquery-ui.js",
- "js/jquery.fileupload-angular.js",
- "js/jquery.iframe-transport.js"
+ "js/jquery.fileupload.js"
],
"ignore": [
"/*.*",
diff --git a/library/blueimp_upload/cors/postmessage.html b/library/blueimp_upload/cors/postmessage.html
index 3d1448f08..6db288cf9 100644
--- a/library/blueimp_upload/cors/postmessage.html
+++ b/library/blueimp_upload/cors/postmessage.html
@@ -1,14 +1,14 @@
<!DOCTYPE HTML>
<!--
/*
- * jQuery File Upload Plugin postMessage API 1.2.1
+ * jQuery File Upload Plugin postMessage API
* https://github.com/blueimp/jQuery-File-Upload
*
* Copyright 2011, Sebastian Tschan
* https://blueimp.net
*
* Licensed under the MIT license:
- * http://www.opensource.org/licenses/MIT
+ * https://opensource.org/licenses/MIT
*/
-->
<html lang="en">
@@ -72,4 +72,4 @@ $(window).on('message', function (e) {
});
</script>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/library/blueimp_upload/cors/result.html b/library/blueimp_upload/cors/result.html
index 225131495..e3d629814 100644
--- a/library/blueimp_upload/cors/result.html
+++ b/library/blueimp_upload/cors/result.html
@@ -1,14 +1,14 @@
<!DOCTYPE HTML>
<!--
/*
- * jQuery Iframe Transport Plugin Redirect Page 2.0.1
+ * jQuery Iframe Transport Plugin Redirect Page
* https://github.com/blueimp/jQuery-File-Upload
*
* Copyright 2010, Sebastian Tschan
* https://blueimp.net
*
* Licensed under the MIT license:
- * http://www.opensource.org/licenses/MIT
+ * https://opensource.org/licenses/MIT
*/
-->
<html lang="en">
diff --git a/library/blueimp_upload/css/demo-ie8.css b/library/blueimp_upload/css/demo-ie8.css
index 262493d08..e0e8ea9b0 100644
--- a/library/blueimp_upload/css/demo-ie8.css
+++ b/library/blueimp_upload/css/demo-ie8.css
@@ -1,13 +1,13 @@
@charset "UTF-8";
/*
- * jQuery File Upload Demo CSS Fixes for IE<9 1.0.0
+ * jQuery File Upload Demo CSS Fixes for IE<9
* https://github.com/blueimp/jQuery-File-Upload
*
* Copyright 2013, Sebastian Tschan
* https://blueimp.net
*
* Licensed under the MIT license:
- * http://www.opensource.org/licenses/MIT
+ * https://opensource.org/licenses/MIT
*/
.navigation {
diff --git a/library/blueimp_upload/css/demo.css b/library/blueimp_upload/css/demo.css
index 2b4d43934..d7d524df5 100644
--- a/library/blueimp_upload/css/demo.css
+++ b/library/blueimp_upload/css/demo.css
@@ -1,13 +1,13 @@
@charset "UTF-8";
/*
- * jQuery File Upload Demo CSS 1.1.0
+ * jQuery File Upload Demo CSS
* https://github.com/blueimp/jQuery-File-Upload
*
* Copyright 2013, Sebastian Tschan
* https://blueimp.net
*
* Licensed under the MIT license:
- * http://www.opensource.org/licenses/MIT
+ * https://opensource.org/licenses/MIT
*/
body {
diff --git a/library/blueimp_upload/css/jquery.fileupload-noscript.css b/library/blueimp_upload/css/jquery.fileupload-noscript.css
index 64d728fc3..2409bfb0a 100644
--- a/library/blueimp_upload/css/jquery.fileupload-noscript.css
+++ b/library/blueimp_upload/css/jquery.fileupload-noscript.css
@@ -1,20 +1,20 @@
@charset "UTF-8";
/*
- * jQuery File Upload Plugin NoScript CSS 1.2.0
+ * jQuery File Upload Plugin NoScript CSS
* https://github.com/blueimp/jQuery-File-Upload
*
* Copyright 2013, Sebastian Tschan
* https://blueimp.net
*
* Licensed under the MIT license:
- * http://www.opensource.org/licenses/MIT
+ * https://opensource.org/licenses/MIT
*/
.fileinput-button input {
position: static;
opacity: 1;
filter: none;
- font-size: inherit;
+ font-size: inherit !important;
direction: inherit;
}
.fileinput-button span {
diff --git a/library/blueimp_upload/css/jquery.fileupload-ui-noscript.css b/library/blueimp_upload/css/jquery.fileupload-ui-noscript.css
index 87f110cdb..30651acf0 100644
--- a/library/blueimp_upload/css/jquery.fileupload-ui-noscript.css
+++ b/library/blueimp_upload/css/jquery.fileupload-ui-noscript.css
@@ -1,13 +1,13 @@
@charset "UTF-8";
/*
- * jQuery File Upload UI Plugin NoScript CSS 8.8.5
+ * jQuery File Upload UI Plugin NoScript CSS
* https://github.com/blueimp/jQuery-File-Upload
*
* Copyright 2012, Sebastian Tschan
* https://blueimp.net
*
* Licensed under the MIT license:
- * http://www.opensource.org/licenses/MIT
+ * https://opensource.org/licenses/MIT
*/
.fileinput-button i,
diff --git a/library/blueimp_upload/css/jquery.fileupload-ui.css b/library/blueimp_upload/css/jquery.fileupload-ui.css
index 76fb376de..9e36c42c5 100644
--- a/library/blueimp_upload/css/jquery.fileupload-ui.css
+++ b/library/blueimp_upload/css/jquery.fileupload-ui.css
@@ -1,13 +1,13 @@
@charset "UTF-8";
/*
- * jQuery File Upload UI Plugin CSS 9.0.0
+ * jQuery File Upload UI Plugin CSS
* https://github.com/blueimp/jQuery-File-Upload
*
* Copyright 2010, Sebastian Tschan
* https://blueimp.net
*
* Licensed under the MIT license:
- * http://www.opensource.org/licenses/MIT
+ * https://opensource.org/licenses/MIT
*/
.fileupload-buttonbar .btn,
diff --git a/library/blueimp_upload/css/jquery.fileupload.css b/library/blueimp_upload/css/jquery.fileupload.css
index fb6044d34..8ae3b09d4 100644
--- a/library/blueimp_upload/css/jquery.fileupload.css
+++ b/library/blueimp_upload/css/jquery.fileupload.css
@@ -1,18 +1,19 @@
@charset "UTF-8";
/*
- * jQuery File Upload Plugin CSS 1.3.0
+ * jQuery File Upload Plugin CSS
* https://github.com/blueimp/jQuery-File-Upload
*
* Copyright 2013, Sebastian Tschan
* https://blueimp.net
*
* Licensed under the MIT license:
- * http://www.opensource.org/licenses/MIT
+ * https://opensource.org/licenses/MIT
*/
.fileinput-button {
position: relative;
overflow: hidden;
+ display: inline-block;
}
.fileinput-button input {
position: absolute;
@@ -21,7 +22,7 @@
margin: 0;
opacity: 0;
-ms-filter: 'alpha(opacity=0)';
- font-size: 200px;
+ font-size: 200px !important;
direction: ltr;
cursor: pointer;
}
diff --git a/library/blueimp_upload/css/style.css b/library/blueimp_upload/css/style.css
index b2c60a6f1..3aee25689 100644
--- a/library/blueimp_upload/css/style.css
+++ b/library/blueimp_upload/css/style.css
@@ -1,13 +1,13 @@
@charset "UTF-8";
/*
- * jQuery File Upload Plugin CSS Example 8.8.2
+ * jQuery File Upload Plugin CSS Example
* https://github.com/blueimp/jQuery-File-Upload
*
* Copyright 2013, Sebastian Tschan
* https://blueimp.net
*
* Licensed under the MIT license:
- * http://www.opensource.org/licenses/MIT
+ * https://opensource.org/licenses/MIT
*/
body {
diff --git a/library/blueimp_upload/index.html b/library/blueimp_upload/index.html
index f92f04aab..2a8dc1521 100644
--- a/library/blueimp_upload/index.html
+++ b/library/blueimp_upload/index.html
@@ -1,14 +1,14 @@
<!DOCTYPE HTML>
<!--
/*
- * jQuery File Upload Plugin Demo 9.1.0
+ * jQuery File Upload Plugin Demo
* https://github.com/blueimp/jQuery-File-Upload
*
* Copyright 2010, Sebastian Tschan
* https://blueimp.net
*
* Licensed under the MIT license:
- * http://www.opensource.org/licenses/MIT
+ * https://opensource.org/licenses/MIT
*/
-->
<html lang="en">
@@ -121,9 +121,9 @@
</div>
<div class="panel-body">
<ul>
- <li>The maximum file size for uploads in this demo is <strong>5 MB</strong> (default file size is unlimited).</li>
+ <li>The maximum file size for uploads in this demo is <strong>999 KB</strong> (default file size is unlimited).</li>
<li>Only image files (<strong>JPG, GIF, PNG</strong>) are allowed in this demo (by default there is no file type restriction).</li>
- <li>Uploaded files will be deleted automatically after <strong>5 minutes</strong> (demo setting).</li>
+ <li>Uploaded files will be deleted automatically after <strong>5 minutes or less</strong> (demo files are stored in memory).</li>
<li>You can <strong>drag &amp; drop</strong> files from your desktop on this webpage (see <a href="https://github.com/blueimp/jQuery-File-Upload/wiki/Browser-support">Browser support</a>).</li>
<li>Please refer to the <a href="https://github.com/blueimp/jQuery-File-Upload">project website</a> and <a href="https://github.com/blueimp/jQuery-File-Upload/wiki">documentation</a> for more information.</li>
<li>Built with the <a href="http://getbootstrap.com/">Bootstrap</a> CSS framework and Icons from <a href="http://glyphicons.com/">Glyphicons</a>.</li>
@@ -216,7 +216,7 @@
</tr>
{% } %}
</script>
-<script src="//ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
+<script src="//ajax.googleapis.com/ajax/libs/jquery/1.11.3/jquery.min.js"></script>
<!-- The jQuery UI widget factory, can be omitted if jQuery UI is already included -->
<script src="js/vendor/jquery.ui.widget.js"></script>
<!-- The Templates plugin is included to render the upload/download listings -->
@@ -251,5 +251,5 @@
<!--[if (gte IE 8)&(lt IE 10)]>
<script src="js/cors/jquery.xdr-transport.js"></script>
<![endif]-->
-</body>
+</body>
</html>
diff --git a/library/blueimp_upload/jquery-ui.html b/library/blueimp_upload/jquery-ui.html
index d61ee5233..83fe9acd1 100644
--- a/library/blueimp_upload/jquery-ui.html
+++ b/library/blueimp_upload/jquery-ui.html
@@ -1,14 +1,14 @@
<!DOCTYPE HTML>
<!--
/*
- * jQuery File Upload Plugin jQuery UI Demo 9.1.0
+ * jQuery File Upload Plugin jQuery UI Demo
* https://github.com/blueimp/jQuery-File-Upload
*
* Copyright 2013, Sebastian Tschan
* https://blueimp.net
*
* Licensed under the MIT license:
- * http://www.opensource.org/licenses/MIT
+ * https://opensource.org/licenses/MIT
*/
-->
<html lang="en">
@@ -127,9 +127,9 @@
<br>
<h3>Demo Notes</h3>
<ul>
- <li>The maximum file size for uploads in this demo is <strong>5 MB</strong> (default file size is unlimited).</li>
+ <li>The maximum file size for uploads in this demo is <strong>999 KB</strong> (default file size is unlimited).</li>
<li>Only image files (<strong>JPG, GIF, PNG</strong>) are allowed in this demo (by default there is no file type restriction).</li>
- <li>Uploaded files will be deleted automatically after <strong>5 minutes</strong> (demo setting).</li>
+ <li>Uploaded files will be deleted automatically after <strong>5 minutes or less</strong> (demo files are stored in memory).</li>
<li>You can <strong>drag &amp; drop</strong> files from your desktop on this webpage (see <a href="https://github.com/blueimp/jQuery-File-Upload/wiki/Browser-support">Browser support</a>).</li>
<li>Please refer to the <a href="https://github.com/blueimp/jQuery-File-Upload">project website</a> and <a href="https://github.com/blueimp/jQuery-File-Upload/wiki">documentation</a> for more information.</li>
<li>Built with <a href="https://jqueryui.com">jQuery UI</a>.</li>
@@ -199,8 +199,8 @@
</tr>
{% } %}
</script>
-<script src="//ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
-<script src="//ajax.googleapis.com/ajax/libs/jqueryui/1.11.1/jquery-ui.min.js"></script>
+<script src="//ajax.googleapis.com/ajax/libs/jquery/1.11.3/jquery.min.js"></script>
+<script src="//ajax.googleapis.com/ajax/libs/jqueryui/1.11.4/jquery-ui.min.js"></script>
<!-- The Templates plugin is included to render the upload/download listings -->
<script src="//blueimp.github.io/JavaScript-Templates/js/tmpl.min.js"></script>
<!-- The Load Image plugin is included for the preview images and image resizing functionality -->
@@ -246,5 +246,5 @@ $('#theme-switcher').change(function () {
<!--[if (gte IE 8)&(lt IE 10)]>
<script src="js/cors/jquery.xdr-transport.js"></script>
<![endif]-->
-</body>
+</body>
</html>
diff --git a/library/blueimp_upload/js/app.js b/library/blueimp_upload/js/app.js
index 47b4f923b..e6b7bce3e 100644
--- a/library/blueimp_upload/js/app.js
+++ b/library/blueimp_upload/js/app.js
@@ -1,18 +1,18 @@
/*
- * jQuery File Upload Plugin Angular JS Example 1.2.1
+ * jQuery File Upload Plugin Angular JS Example
* https://github.com/blueimp/jQuery-File-Upload
*
* Copyright 2013, Sebastian Tschan
* https://blueimp.net
*
* Licensed under the MIT license:
- * http://www.opensource.org/licenses/MIT
+ * https://opensource.org/licenses/MIT
*/
/* jshint nomen:false */
/* global window, angular */
-(function () {
+;(function () {
'use strict';
var isOnGitHub = window.location.hostname === 'blueimp.github.io',
@@ -37,7 +37,7 @@
// send Blob objects via XHR requests:
disableImageResize: /Android(?!.*Chrome)|Opera/
.test(window.navigator.userAgent),
- maxFileSize: 5000000,
+ maxFileSize: 999000,
acceptFileTypes: /(\.|\/)(gif|jpe?g|png)$/i
});
}
diff --git a/library/blueimp_upload/js/cors/jquery.postmessage-transport.js b/library/blueimp_upload/js/cors/jquery.postmessage-transport.js
index 2b4851e67..2a0c38cb6 100644
--- a/library/blueimp_upload/js/cors/jquery.postmessage-transport.js
+++ b/library/blueimp_upload/js/cors/jquery.postmessage-transport.js
@@ -1,21 +1,24 @@
/*
- * jQuery postMessage Transport Plugin 1.1.1
+ * jQuery postMessage Transport Plugin
* https://github.com/blueimp/jQuery-File-Upload
*
* Copyright 2011, Sebastian Tschan
* https://blueimp.net
*
* Licensed under the MIT license:
- * http://www.opensource.org/licenses/MIT
+ * https://opensource.org/licenses/MIT
*/
-/* global define, window, document */
+/* global define, require, window, document */
-(function (factory) {
+;(function (factory) {
'use strict';
if (typeof define === 'function' && define.amd) {
// Register as an anonymous AMD module:
define(['jquery'], factory);
+ } else if (typeof exports === 'object') {
+ // Node/CommonJS:
+ factory(require('jquery'));
} else {
// Browser globals:
factory(window.jQuery);
@@ -61,6 +64,12 @@
loc = $('<a>').prop('href', options.postMessage)[0],
target = loc.protocol + '//' + loc.host,
xhrUpload = options.xhr().upload;
+ // IE always includes the port for the host property of a link
+ // element, but not in the location.host or origin property for the
+ // default http port 80 and https port 443, so we strip it:
+ if (/^(http:\/\/.+:80)|(https:\/\/.+:443)$/.test(target)) {
+ target = target.replace(/:(80|443)$/, '');
+ }
return {
send: function (_, completeCallback) {
counter += 1;
diff --git a/library/blueimp_upload/js/cors/jquery.xdr-transport.js b/library/blueimp_upload/js/cors/jquery.xdr-transport.js
index 0044cc2d5..a4e2699c6 100644
--- a/library/blueimp_upload/js/cors/jquery.xdr-transport.js
+++ b/library/blueimp_upload/js/cors/jquery.xdr-transport.js
@@ -1,24 +1,27 @@
/*
- * jQuery XDomainRequest Transport Plugin 1.1.3
+ * jQuery XDomainRequest Transport Plugin
* https://github.com/blueimp/jQuery-File-Upload
*
* Copyright 2011, Sebastian Tschan
* https://blueimp.net
*
* Licensed under the MIT license:
- * http://www.opensource.org/licenses/MIT
+ * https://opensource.org/licenses/MIT
*
* Based on Julian Aubourg's ajaxHooks xdr.js:
* https://github.com/jaubourg/ajaxHooks/
*/
-/* global define, window, XDomainRequest */
+/* global define, require, window, XDomainRequest */
-(function (factory) {
+;(function (factory) {
'use strict';
if (typeof define === 'function' && define.amd) {
// Register as an anonymous AMD module:
define(['jquery'], factory);
+ } else if (typeof exports === 'object') {
+ // Node/CommonJS:
+ factory(require('jquery'));
} else {
// Browser globals:
factory(window.jQuery);
diff --git a/library/blueimp_upload/js/jquery.fileupload-angular.js b/library/blueimp_upload/js/jquery.fileupload-angular.js
index e4ef3926b..1c2055276 100644
--- a/library/blueimp_upload/js/jquery.fileupload-angular.js
+++ b/library/blueimp_upload/js/jquery.fileupload-angular.js
@@ -1,18 +1,18 @@
/*
- * jQuery File Upload AngularJS Plugin 2.2.0
+ * jQuery File Upload AngularJS Plugin
* https://github.com/blueimp/jQuery-File-Upload
*
* Copyright 2013, Sebastian Tschan
* https://blueimp.net
*
* Licensed under the MIT license:
- * http://www.opensource.org/licenses/MIT
+ * https://opensource.org/licenses/MIT
*/
/* jshint nomen:false */
-/* global define, angular */
+/* global define, angular, require */
-(function (factory) {
+;(function (factory) {
'use strict';
if (typeof define === 'function' && define.amd) {
// Register as an anonymous AMD module:
@@ -24,6 +24,16 @@
'./jquery.fileupload-video',
'./jquery.fileupload-validate'
], factory);
+ } else if (typeof exports === 'object') {
+ // Node/CommonJS:
+ factory(
+ require('jquery'),
+ require('angular'),
+ require('./jquery.fileupload-image'),
+ require('./jquery.fileupload-audio'),
+ require('./jquery.fileupload-video'),
+ require('./jquery.fileupload-validate')
+ );
} else {
factory();
}
@@ -91,7 +101,7 @@
angular.forEach(data.files, function (file) {
filesCopy.push(file);
});
- scope.$apply(function () {
+ scope.$parent.$applyAsync(function () {
addFileMethods(scope, data);
var method = scope.option('prependFiles') ?
'unshift' : 'push';
@@ -100,7 +110,7 @@
data.process(function () {
return scope.process(data);
}).always(function () {
- scope.$apply(function () {
+ scope.$parent.$applyAsync(function () {
addFileMethods(scope, data);
scope.replace(filesCopy, data.files);
});
@@ -112,12 +122,6 @@
}
});
},
- progress: function (e, data) {
- if (e.isDefaultPrevented()) {
- return false;
- }
- data.scope.$apply();
- },
done: function (e, data) {
if (e.isDefaultPrevented()) {
return false;
@@ -197,8 +201,8 @@
// The FileUploadController initializes the fileupload widget and
// provides scope methods to control the File Upload functionality:
.controller('FileUploadController', [
- '$scope', '$element', '$attrs', '$window', 'fileUpload',
- function ($scope, $element, $attrs, $window, fileUpload) {
+ '$scope', '$element', '$attrs', '$window', 'fileUpload','$q',
+ function ($scope, $element, $attrs, $window, fileUpload, $q) {
var uploadMethods = {
progress: function () {
return $element.fileupload('progress');
@@ -260,19 +264,21 @@
$scope.applyOnQueue = function (method) {
var list = this.queue.slice(0),
i,
- file;
+ file,
+ promises = [];
for (i = 0; i < list.length; i += 1) {
file = list[i];
if (file[method]) {
- file[method]();
+ promises.push(file[method]());
}
}
+ return $q.all(promises);
};
$scope.submit = function () {
- this.applyOnQueue('$submit');
+ return this.applyOnQueue('$submit');
};
$scope.cancel = function () {
- this.applyOnQueue('$cancel');
+ return this.applyOnQueue('$cancel');
};
// Add upload methods to the scope:
angular.extend($scope, uploadMethods);
@@ -320,9 +326,11 @@
'fileuploadprocessalways',
'fileuploadprocessstop'
].join(' '), function (e, data) {
- if ($scope.$emit(e.type, data).defaultPrevented) {
- e.preventDefault();
- }
+ $scope.$parent.$applyAsync(function () {
+ if ($scope.$emit(e.type, data).defaultPrevented) {
+ e.preventDefault();
+ }
+ });
}).on('remove', function () {
// Remove upload methods from the scope,
// when the widget is removed:
diff --git a/library/blueimp_upload/js/jquery.fileupload-audio.js b/library/blueimp_upload/js/jquery.fileupload-audio.js
index 575800e82..a25377619 100644
--- a/library/blueimp_upload/js/jquery.fileupload-audio.js
+++ b/library/blueimp_upload/js/jquery.fileupload-audio.js
@@ -1,18 +1,18 @@
/*
- * jQuery File Upload Audio Preview Plugin 1.0.3
+ * jQuery File Upload Audio Preview Plugin
* https://github.com/blueimp/jQuery-File-Upload
*
* Copyright 2013, Sebastian Tschan
* https://blueimp.net
*
* Licensed under the MIT license:
- * http://www.opensource.org/licenses/MIT
+ * https://opensource.org/licenses/MIT
*/
/* jshint nomen:false */
-/* global define, window, document */
+/* global define, require, window, document */
-(function (factory) {
+;(function (factory) {
'use strict';
if (typeof define === 'function' && define.amd) {
// Register as an anonymous AMD module:
@@ -21,6 +21,13 @@
'load-image',
'./jquery.fileupload-process'
], factory);
+ } else if (typeof exports === 'object') {
+ // Node/CommonJS:
+ factory(
+ require('jquery'),
+ require('blueimp-load-image/js/load-image'),
+ require('./jquery.fileupload-process')
+ );
} else {
// Browser globals:
factory(
diff --git a/library/blueimp_upload/js/jquery.fileupload-image.js b/library/blueimp_upload/js/jquery.fileupload-image.js
index 5bb7026ae..65fc6d7b8 100644
--- a/library/blueimp_upload/js/jquery.fileupload-image.js
+++ b/library/blueimp_upload/js/jquery.fileupload-image.js
@@ -1,18 +1,18 @@
/*
- * jQuery File Upload Image Preview & Resize Plugin 1.7.2
+ * jQuery File Upload Image Preview & Resize Plugin
* https://github.com/blueimp/jQuery-File-Upload
*
* Copyright 2013, Sebastian Tschan
* https://blueimp.net
*
* Licensed under the MIT license:
- * http://www.opensource.org/licenses/MIT
+ * https://opensource.org/licenses/MIT
*/
/* jshint nomen:false */
-/* global define, window, Blob */
+/* global define, require, window, Blob */
-(function (factory) {
+;(function (factory) {
'use strict';
if (typeof define === 'function' && define.amd) {
// Register as an anonymous AMD module:
@@ -20,11 +20,22 @@
'jquery',
'load-image',
'load-image-meta',
+ 'load-image-scale',
'load-image-exif',
- 'load-image-ios',
'canvas-to-blob',
'./jquery.fileupload-process'
], factory);
+ } else if (typeof exports === 'object') {
+ // Node/CommonJS:
+ factory(
+ require('jquery'),
+ require('blueimp-load-image/js/load-image'),
+ require('blueimp-load-image/js/load-image-meta'),
+ require('blueimp-load-image/js/load-image-scale'),
+ require('blueimp-load-image/js/load-image-exif'),
+ require('blueimp-canvas-to-blob'),
+ require('./jquery.fileupload-process')
+ );
} else {
// Browser globals:
factory(
@@ -236,7 +247,7 @@
blob.name = file.name;
} else if (file.name) {
blob.name = file.name.replace(
- /\..+$/,
+ /\.\w+$/,
'.' + blob.type.substr(6)
);
}
diff --git a/library/blueimp_upload/js/jquery.fileupload-jquery-ui.js b/library/blueimp_upload/js/jquery.fileupload-jquery-ui.js
index af0a00b1e..7b136b379 100755..100644
--- a/library/blueimp_upload/js/jquery.fileupload-jquery-ui.js
+++ b/library/blueimp_upload/js/jquery.fileupload-jquery-ui.js
@@ -1,22 +1,31 @@
/*
- * jQuery File Upload jQuery UI Plugin 8.7.1
+ * jQuery File Upload jQuery UI Plugin
* https://github.com/blueimp/jQuery-File-Upload
*
* Copyright 2013, Sebastian Tschan
* https://blueimp.net
*
* Licensed under the MIT license:
- * http://www.opensource.org/licenses/MIT
+ * https://opensource.org/licenses/MIT
*/
/* jshint nomen:false */
-/* global define, window */
+/* global define, require, window */
-(function (factory) {
+;(function (factory) {
'use strict';
if (typeof define === 'function' && define.amd) {
// Register as an anonymous AMD module:
- define(['jquery', './jquery.fileupload-ui'], factory);
+ define([
+ 'jquery',
+ './jquery.fileupload-ui'
+ ], factory);
+ } else if (typeof exports === 'object') {
+ // Node/CommonJS:
+ factory(
+ require('jquery'),
+ require('./jquery.fileupload-ui')
+ );
} else {
// Browser globals:
factory(window.jQuery);
diff --git a/library/blueimp_upload/js/jquery.fileupload-process.js b/library/blueimp_upload/js/jquery.fileupload-process.js
index 8a6b929a6..638f0d26b 100644
--- a/library/blueimp_upload/js/jquery.fileupload-process.js
+++ b/library/blueimp_upload/js/jquery.fileupload-process.js
@@ -1,18 +1,18 @@
/*
- * jQuery File Upload Processing Plugin 1.3.0
+ * jQuery File Upload Processing Plugin
* https://github.com/blueimp/jQuery-File-Upload
*
* Copyright 2012, Sebastian Tschan
* https://blueimp.net
*
* Licensed under the MIT license:
- * http://www.opensource.org/licenses/MIT
+ * https://opensource.org/licenses/MIT
*/
/* jshint nomen:false */
-/* global define, window */
+/* global define, require, window */
-(function (factory) {
+;(function (factory) {
'use strict';
if (typeof define === 'function' && define.amd) {
// Register as an anonymous AMD module:
@@ -20,6 +20,12 @@
'jquery',
'./jquery.fileupload'
], factory);
+ } else if (typeof exports === 'object') {
+ // Node/CommonJS:
+ factory(
+ require('jquery'),
+ require('./jquery.fileupload')
+ );
} else {
// Browser globals:
factory(
@@ -81,7 +87,7 @@
settings
);
};
- chain = chain.pipe(func, settings.always && func);
+ chain = chain.then(func, settings.always && func);
});
chain
.done(function () {
@@ -148,7 +154,7 @@
};
opts.index = index;
that._processing += 1;
- that._processingQueue = that._processingQueue.pipe(func, func)
+ that._processingQueue = that._processingQueue.then(func, func)
.always(function () {
that._processing -= 1;
if (that._processing === 0) {
diff --git a/library/blueimp_upload/js/jquery.fileupload-ui.js b/library/blueimp_upload/js/jquery.fileupload-ui.js
index 62cf9aa38..83e7449e6 100644
--- a/library/blueimp_upload/js/jquery.fileupload-ui.js
+++ b/library/blueimp_upload/js/jquery.fileupload-ui.js
@@ -1,29 +1,38 @@
/*
- * jQuery File Upload User Interface Plugin 9.6.0
+ * jQuery File Upload User Interface Plugin
* https://github.com/blueimp/jQuery-File-Upload
*
* Copyright 2010, Sebastian Tschan
* https://blueimp.net
*
* Licensed under the MIT license:
- * http://www.opensource.org/licenses/MIT
+ * https://opensource.org/licenses/MIT
*/
/* jshint nomen:false */
-/* global define, window */
+/* global define, require, window */
-(function (factory) {
+;(function (factory) {
'use strict';
if (typeof define === 'function' && define.amd) {
// Register as an anonymous AMD module:
define([
'jquery',
- 'tmpl',
+ 'blueimp-tmpl',
'./jquery.fileupload-image',
'./jquery.fileupload-audio',
'./jquery.fileupload-video',
'./jquery.fileupload-validate'
], factory);
+ } else if (typeof exports === 'object') {
+ // Node/CommonJS:
+ factory(
+ require('jquery'),
+ require('blueimp-tmpl'),
+ require('./jquery.fileupload-image'),
+ require('./jquery.fileupload-video'),
+ require('./jquery.fileupload-validate')
+ );
} else {
// Browser globals:
factory(
@@ -62,10 +71,10 @@
// The expected data type of the upload response, sets the dataType
// option of the $.ajax upload requests:
dataType: 'json',
-
+
// Error and info messages:
messages: {
- unknownError: 'Unknown error'
+ unknownError: 'Unknown error'
},
// Function returning the current number of files,
diff --git a/library/blueimp_upload/js/jquery.fileupload-validate.js b/library/blueimp_upload/js/jquery.fileupload-validate.js
index f93a18fa2..eebeb3733 100644
--- a/library/blueimp_upload/js/jquery.fileupload-validate.js
+++ b/library/blueimp_upload/js/jquery.fileupload-validate.js
@@ -1,17 +1,17 @@
/*
- * jQuery File Upload Validation Plugin 1.1.2
+ * jQuery File Upload Validation Plugin
* https://github.com/blueimp/jQuery-File-Upload
*
* Copyright 2013, Sebastian Tschan
* https://blueimp.net
*
* Licensed under the MIT license:
- * http://www.opensource.org/licenses/MIT
+ * https://opensource.org/licenses/MIT
*/
-/* global define, window */
+/* global define, require, window */
-(function (factory) {
+;(function (factory) {
'use strict';
if (typeof define === 'function' && define.amd) {
// Register as an anonymous AMD module:
@@ -19,6 +19,12 @@
'jquery',
'./jquery.fileupload-process'
], factory);
+ } else if (typeof exports === 'object') {
+ // Node/CommonJS:
+ factory(
+ require('jquery'),
+ require('./jquery.fileupload-process')
+ );
} else {
// Browser globals:
factory(
@@ -33,7 +39,7 @@
{
action: 'validate',
// Always trigger this action,
- // even if the previous action was rejected:
+ // even if the previous action was rejected:
always: true,
// Options taken from the global options map:
acceptFileTypes: '@',
diff --git a/library/blueimp_upload/js/jquery.fileupload-video.js b/library/blueimp_upload/js/jquery.fileupload-video.js
index 3764b27a2..aedcec2ba 100644
--- a/library/blueimp_upload/js/jquery.fileupload-video.js
+++ b/library/blueimp_upload/js/jquery.fileupload-video.js
@@ -1,18 +1,18 @@
/*
- * jQuery File Upload Video Preview Plugin 1.0.3
+ * jQuery File Upload Video Preview Plugin
* https://github.com/blueimp/jQuery-File-Upload
*
* Copyright 2013, Sebastian Tschan
* https://blueimp.net
*
* Licensed under the MIT license:
- * http://www.opensource.org/licenses/MIT
+ * https://opensource.org/licenses/MIT
*/
/* jshint nomen:false */
-/* global define, window, document */
+/* global define, require, window, document */
-(function (factory) {
+;(function (factory) {
'use strict';
if (typeof define === 'function' && define.amd) {
// Register as an anonymous AMD module:
@@ -21,6 +21,13 @@
'load-image',
'./jquery.fileupload-process'
], factory);
+ } else if (typeof exports === 'object') {
+ // Node/CommonJS:
+ factory(
+ require('jquery'),
+ require('blueimp-load-image/js/load-image'),
+ require('./jquery.fileupload-process')
+ );
} else {
// Browser globals:
factory(
diff --git a/library/blueimp_upload/js/jquery.fileupload.js b/library/blueimp_upload/js/jquery.fileupload.js
index a4cfdc0ac..5ff151b53 100644
--- a/library/blueimp_upload/js/jquery.fileupload.js
+++ b/library/blueimp_upload/js/jquery.fileupload.js
@@ -1,25 +1,31 @@
/*
- * jQuery File Upload Plugin 5.42.0
+ * jQuery File Upload Plugin
* https://github.com/blueimp/jQuery-File-Upload
*
* Copyright 2010, Sebastian Tschan
* https://blueimp.net
*
* Licensed under the MIT license:
- * http://www.opensource.org/licenses/MIT
+ * https://opensource.org/licenses/MIT
*/
/* jshint nomen:false */
-/* global define, window, document, location, Blob, FormData */
+/* global define, require, window, document, location, Blob, FormData */
-(function (factory) {
+;(function (factory) {
'use strict';
if (typeof define === 'function' && define.amd) {
// Register as an anonymous AMD module:
define([
'jquery',
- 'jquery.ui.widget'
+ 'jquery-ui/ui/widget'
], factory);
+ } else if (typeof exports === 'object') {
+ // Node/CommonJS:
+ factory(
+ require('jquery'),
+ require('./vendor/jquery.ui.widget')
+ );
} else {
// Browser globals:
factory(window.jQuery);
@@ -271,7 +277,8 @@
// The following are jQuery ajax settings required for the file uploads:
processData: false,
contentType: false,
- cache: false
+ cache: false,
+ timeout: 0
},
// A list of options that require reinitializing event listeners and/or
@@ -645,7 +652,7 @@
data.process = function (resolveFunc, rejectFunc) {
if (resolveFunc || rejectFunc) {
data._processQueue = this._processQueue =
- (this._processQueue || getPromise([this])).pipe(
+ (this._processQueue || getPromise([this])).then(
function () {
if (data.errorThrown) {
return $.Deferred()
@@ -653,7 +660,7 @@
}
return getPromise(arguments);
}
- ).pipe(resolveFunc, rejectFunc);
+ ).then(resolveFunc, rejectFunc);
}
return this._processQueue || getPromise([this]);
};
@@ -938,9 +945,9 @@
if (this.options.limitConcurrentUploads > 1) {
slot = $.Deferred();
this._slots.push(slot);
- pipe = slot.pipe(send);
+ pipe = slot.then(send);
} else {
- this._sequence = this._sequence.pipe(send, send);
+ this._sequence = this._sequence.then(send, send);
pipe = this._sequence;
}
// Return the piped Promise object, enhanced with an abort method,
@@ -977,7 +984,10 @@
fileSet,
i,
j = 0;
- if (limitSize && (!filesLength || files[0].size === undefined)) {
+ if (!filesLength) {
+ return false;
+ }
+ if (limitSize && files[0].size === undefined) {
limitSize = undefined;
}
if (!(options.singleFileUploads || limit || limitSize) ||
@@ -1036,13 +1046,19 @@
_replaceFileInput: function (data) {
var input = data.fileInput,
- inputClone = input.clone(true);
+ inputClone = input.clone(true),
+ restoreFocus = input.is(document.activeElement);
// Add a reference for the new cloned file input to the data argument:
data.fileInputClone = inputClone;
$('<form></form>').append(inputClone)[0].reset();
// Detaching allows to insert the fileInput on another form
// without loosing the file input value:
input.after(inputClone).detach();
+ // If the fileInput had focus before it was detached,
+ // restore focus to the inputClone.
+ if (restoreFocus) {
+ inputClone.focus();
+ }
// Avoid memory leaks with the detached file input:
$.cleanData(input.unbind('remove'));
// Replace the original file input element in the fileInput
@@ -1064,6 +1080,8 @@
_handleFileTreeEntry: function (entry, path) {
var that = this,
dfd = $.Deferred(),
+ entries = [],
+ dirReader,
errorHandler = function (e) {
if (e && !e.entry) {
e.entry = entry;
@@ -1091,8 +1109,7 @@
readEntries();
}
}, errorHandler);
- },
- dirReader, entries = [];
+ };
path = path || '';
if (entry.isFile) {
if (entry._file) {
@@ -1123,7 +1140,7 @@
$.map(entries, function (entry) {
return that._handleFileTreeEntry(entry, path);
})
- ).pipe(function () {
+ ).then(function () {
return Array.prototype.concat.apply(
[],
arguments
@@ -1192,7 +1209,7 @@
return $.when.apply(
$,
$.map(fileInput, this._getSingleFileInputFiles)
- ).pipe(function () {
+ ).then(function () {
return Array.prototype.concat.apply(
[],
arguments
@@ -1295,6 +1312,10 @@
this._off(this.options.fileInput, 'change');
},
+ _destroy: function () {
+ this._destroyEventHandlers();
+ },
+
_setOption: function (key, value) {
var reinit = $.inArray(key, this._specialOptions) !== -1;
if (reinit) {
@@ -1338,15 +1359,19 @@
_initDataAttributes: function () {
var that = this,
options = this.options,
- clone = $(this.element[0].cloneNode(false));
+ data = this.element.data();
// Initialize options set via HTML5 data-attributes:
$.each(
- clone.data(),
- function (key, value) {
- var dataAttributeName = 'data-' +
- // Convert camelCase to hyphen-ated key:
- key.replace(/([a-z])([A-Z])/g, '$1-$2').toLowerCase();
- if (clone.attr(dataAttributeName)) {
+ this.element[0].attributes,
+ function (index, attr) {
+ var key = attr.name.toLowerCase(),
+ value;
+ if (/^data-/.test(key)) {
+ // Convert hyphen-ated key to camelCase:
+ key = key.slice(5).replace(/-[a-z]/g, function (str) {
+ return str.charAt(1).toUpperCase();
+ });
+ value = data[key];
if (that._isRegExpOption(key, value)) {
value = that._getRegExp(value);
}
diff --git a/library/blueimp_upload/js/jquery.iframe-transport.js b/library/blueimp_upload/js/jquery.iframe-transport.js
index 8d64b591b..8d25c4641 100644
--- a/library/blueimp_upload/js/jquery.iframe-transport.js
+++ b/library/blueimp_upload/js/jquery.iframe-transport.js
@@ -1,21 +1,24 @@
/*
- * jQuery Iframe Transport Plugin 1.8.2
+ * jQuery Iframe Transport Plugin
* https://github.com/blueimp/jQuery-File-Upload
*
* Copyright 2011, Sebastian Tschan
* https://blueimp.net
*
* Licensed under the MIT license:
- * http://www.opensource.org/licenses/MIT
+ * https://opensource.org/licenses/MIT
*/
-/* global define, window, document */
+/* global define, require, window, document, JSON */
-(function (factory) {
+;(function (factory) {
'use strict';
if (typeof define === 'function' && define.amd) {
// Register as an anonymous AMD module:
define(['jquery'], factory);
+ } else if (typeof exports === 'object') {
+ // Node/CommonJS:
+ factory(require('jquery'));
} else {
// Browser globals:
factory(window.jQuery);
@@ -24,7 +27,14 @@
'use strict';
// Helper variable to create unique names for the transport iframes:
- var counter = 0;
+ var counter = 0,
+ jsonAPI = $,
+ jsonParse = 'parseJSON';
+
+ if ('JSON' in window && 'parse' in JSON) {
+ jsonAPI = JSON;
+ jsonParse = 'parse';
+ }
// The iframe transport accepts four additional options:
// options.fileInput: a jQuery collection of file input fields
@@ -194,7 +204,7 @@
return iframe && $(iframe[0].body).text();
},
'iframe json': function (iframe) {
- return iframe && $.parseJSON($(iframe[0].body).text());
+ return iframe && jsonAPI[jsonParse]($(iframe[0].body).text());
},
'iframe html': function (iframe) {
return iframe && $(iframe[0].body).html();
diff --git a/library/blueimp_upload/js/main.js b/library/blueimp_upload/js/main.js
index 8f57967a3..0403682e7 100644
--- a/library/blueimp_upload/js/main.js
+++ b/library/blueimp_upload/js/main.js
@@ -1,12 +1,12 @@
/*
- * jQuery File Upload Plugin JS Example 8.9.1
+ * jQuery File Upload Plugin JS Example
* https://github.com/blueimp/jQuery-File-Upload
*
* Copyright 2010, Sebastian Tschan
* https://blueimp.net
*
* Licensed under the MIT license:
- * http://www.opensource.org/licenses/MIT
+ * https://opensource.org/licenses/MIT
*/
/* global $, window */
@@ -40,7 +40,7 @@ $(function () {
// send Blob objects via XHR requests:
disableImageResize: /Android(?!.*Chrome)|Opera/
.test(window.navigator.userAgent),
- maxFileSize: 5000000,
+ maxFileSize: 999000,
acceptFileTypes: /(\.|\/)(gif|jpe?g|png)$/i
});
// Upload server status check for browsers with CORS support:
diff --git a/library/blueimp_upload/js/vendor/jquery.ui.widget.js b/library/blueimp_upload/js/vendor/jquery.ui.widget.js
index 7899e6bb3..e08df3fd0 100644
--- a/library/blueimp_upload/js/vendor/jquery.ui.widget.js
+++ b/library/blueimp_upload/js/vendor/jquery.ui.widget.js
@@ -1,13 +1,19 @@
-/*! jQuery UI - v1.11.1 - 2014-09-17
+/*! jQuery UI - v1.11.4+CommonJS - 2015-08-28
* http://jqueryui.com
* Includes: widget.js
-* Copyright 2014 jQuery Foundation and other contributors; Licensed MIT */
+* Copyright 2015 jQuery Foundation and other contributors; Licensed MIT */
(function( factory ) {
if ( typeof define === "function" && define.amd ) {
// AMD. Register as an anonymous module.
define([ "jquery" ], factory );
+
+ } else if ( typeof exports === "object" ) {
+
+ // Node/CommonJS
+ factory( require( "jquery" ) );
+
} else {
// Browser globals
@@ -15,10 +21,10 @@
}
}(function( $ ) {
/*!
- * jQuery UI Widget 1.11.1
+ * jQuery UI Widget 1.11.4
* http://jqueryui.com
*
- * Copyright 2014 jQuery Foundation and other contributors
+ * Copyright jQuery Foundation and other contributors
* Released under the MIT license.
* http://jquery.org/license
*
@@ -42,7 +48,7 @@ $.cleanData = (function( orig ) {
}
// http://bugs.jquery.com/ticket/8235
- } catch( e ) {}
+ } catch ( e ) {}
}
orig( elems );
};
@@ -196,11 +202,6 @@ $.widget.bridge = function( name, object ) {
args = widget_slice.call( arguments, 1 ),
returnValue = this;
- // allow multiple hashes to be passed on init
- options = !isMethodCall && args.length ?
- $.widget.extend.apply( null, [ options ].concat(args) ) :
- options;
-
if ( isMethodCall ) {
this.each(function() {
var methodValue,
@@ -225,6 +226,12 @@ $.widget.bridge = function( name, object ) {
}
});
} else {
+
+ // Allow multiple hashes to be passed on init
+ if ( args.length ) {
+ options = $.widget.extend.apply( null, [ options ].concat(args) );
+ }
+
this.each(function() {
var instance = $.data( this, fullName );
if ( instance ) {
@@ -260,10 +267,6 @@ $.Widget.prototype = {
this.element = $( element );
this.uuid = widget_uuid++;
this.eventNamespace = "." + this.widgetName + this.uuid;
- this.options = $.widget.extend( {},
- this.options,
- this._getCreateOptions(),
- options );
this.bindings = $();
this.hoverable = $();
@@ -286,6 +289,11 @@ $.Widget.prototype = {
this.window = $( this.document[0].defaultView || this.document[0].parentWindow );
}
+ this.options = $.widget.extend( {},
+ this.options,
+ this._getCreateOptions(),
+ options );
+
this._create();
this._trigger( "create", null, this._getCreateEventData() );
this._init();
@@ -448,8 +456,14 @@ $.Widget.prototype = {
},
_off: function( element, eventName ) {
- eventName = (eventName || "").split( " " ).join( this.eventNamespace + " " ) + this.eventNamespace;
+ eventName = (eventName || "").split( " " ).join( this.eventNamespace + " " ) +
+ this.eventNamespace;
element.unbind( eventName ).undelegate( eventName );
+
+ // Clear the stack to avoid memory leaks (#10056)
+ this.bindings = $( this.bindings.not( element ).get() );
+ this.focusable = $( this.focusable.not( element ).get() );
+ this.hoverable = $( this.hoverable.not( element ).get() );
},
_delay: function( handler, delay ) {
diff --git a/library/blueimp_upload/package.json b/library/blueimp_upload/package.json
index 880574aa7..ed4d33681 100644
--- a/library/blueimp_upload/package.json
+++ b/library/blueimp_upload/package.json
@@ -1,8 +1,8 @@
{
"name": "blueimp-file-upload",
- "version": "9.8.0",
+ "version": "9.18.0",
"title": "jQuery File Upload",
- "description": "File Upload widget with multiple file selection, drag&amp;drop support, progress bar, validation and preview images, audio and video for jQuery. Supports cross-domain, chunked and resumable file uploads. Works with any server-side platform (Google App Engine, PHP, Python, Ruby on Rails, Java, etc.) that supports standard HTML form file uploads.",
+ "description": "File Upload widget with multiple file selection, drag&drop support, progress bar, validation and preview images, audio and video for jQuery. Supports cross-domain, chunked and resumable file uploads. Works with any server-side platform (Google App Engine, PHP, Python, Ruby on Rails, Java, etc.) that supports standard HTML form file uploads.",
"keywords": [
"jquery",
"file",
@@ -29,26 +29,27 @@
"name": "Sebastian Tschan",
"url": "https://blueimp.net"
},
- "maintainers": [
- {
- "name": "Sebastian Tschan",
- "url": "https://blueimp.net"
- }
- ],
"repository": {
"type": "git",
"url": "git://github.com/blueimp/jQuery-File-Upload.git"
},
- "bugs": "https://github.com/blueimp/jQuery-File-Upload/issues",
- "licenses": [
- {
- "type": "MIT",
- "url": "http://www.opensource.org/licenses/MIT"
- }
- ],
+ "license": "MIT",
+ "optionalDependencies": {
+ "blueimp-canvas-to-blob": "3.5.0",
+ "blueimp-load-image": "2.12.2",
+ "blueimp-tmpl": "3.6.0"
+ },
"devDependencies": {
- "grunt": "~0.4.5",
- "grunt-bump-build-git": "~1.1.1",
- "grunt-contrib-jshint": "~0.10.0"
- }
+ "bower-json": "0.8.1",
+ "jshint": "2.9.3"
+ },
+ "scripts": {
+ "bower-version-update": "./bower-version-update.js",
+ "lint": "jshint *.js js/*.js js/cors/*.js",
+ "test": "npm run lint",
+ "preversion": "npm test",
+ "version": "npm run bower-version-update && git add bower.json",
+ "postversion": "git push --tags origin master && npm publish"
+ },
+ "main": "js/jquery.fileupload.js"
}
diff --git a/library/blueimp_upload/server/gae-go/app/main.go b/library/blueimp_upload/server/gae-go/app/main.go
index 03af0b1d2..a92d128c0 100644
--- a/library/blueimp_upload/server/gae-go/app/main.go
+++ b/library/blueimp_upload/server/gae-go/app/main.go
@@ -1,59 +1,90 @@
/*
- * jQuery File Upload Plugin GAE Go Example 3.2.0
+ * jQuery File Upload Plugin GAE Go Example
* https://github.com/blueimp/jQuery-File-Upload
*
* Copyright 2011, Sebastian Tschan
* https://blueimp.net
*
* Licensed under the MIT license:
- * http://www.opensource.org/licenses/MIT
+ * https://opensource.org/licenses/MIT
*/
package app
import (
- "appengine"
- "appengine/blobstore"
- "appengine/image"
- "appengine/taskqueue"
+ "bufio"
"bytes"
"encoding/json"
"fmt"
+ "github.com/disintegration/gift"
+ "golang.org/x/net/context"
+ "google.golang.org/appengine"
+ "google.golang.org/appengine/memcache"
+ "hash/crc32"
+ "image"
+ "image/gif"
+ "image/jpeg"
+ "image/png"
"io"
"log"
"mime/multipart"
"net/http"
"net/url"
+ "path/filepath"
"regexp"
"strings"
- "time"
)
const (
- WEBSITE = "https://blueimp.github.io/jQuery-File-Upload/"
- MIN_FILE_SIZE = 1 // bytes
- MAX_FILE_SIZE = 5000000 // bytes
+ WEBSITE = "https://blueimp.github.io/jQuery-File-Upload/"
+ MIN_FILE_SIZE = 1 // bytes
+ // Max file size is memcache limit (1MB) minus key size minus overhead:
+ MAX_FILE_SIZE = 999000 // bytes
IMAGE_TYPES = "image/(gif|p?jpeg|(x-)?png)"
ACCEPT_FILE_TYPES = IMAGE_TYPES
+ THUMB_MAX_WIDTH = 80
+ THUMB_MAX_HEIGHT = 80
EXPIRATION_TIME = 300 // seconds
- THUMBNAIL_PARAM = "=s80"
+ // If empty, only allow redirects to the referer protocol+host.
+ // Set to a regexp string for custom pattern matching:
+ REDIRECT_ALLOW_TARGET = ""
)
var (
imageTypes = regexp.MustCompile(IMAGE_TYPES)
acceptFileTypes = regexp.MustCompile(ACCEPT_FILE_TYPES)
+ thumbSuffix = "." + fmt.Sprint(THUMB_MAX_WIDTH) + "x" +
+ fmt.Sprint(THUMB_MAX_HEIGHT)
)
+func escape(s string) string {
+ return strings.Replace(url.QueryEscape(s), "+", "%20", -1)
+}
+
+func extractKey(r *http.Request) string {
+ // Use RequestURI instead of r.URL.Path, as we need the encoded form:
+ path := strings.Split(r.RequestURI, "?")[0]
+ // Also adjust double encoded slashes:
+ return strings.Replace(path[1:], "%252F", "%2F", -1)
+}
+
+func check(err error) {
+ if err != nil {
+ panic(err)
+ }
+}
+
type FileInfo struct {
- Key appengine.BlobKey `json:"-"`
- Url string `json:"url,omitempty"`
- ThumbnailUrl string `json:"thumbnailUrl,omitempty"`
- Name string `json:"name"`
- Type string `json:"type"`
- Size int64 `json:"size"`
- Error string `json:"error,omitempty"`
- DeleteUrl string `json:"deleteUrl,omitempty"`
- DeleteType string `json:"deleteType,omitempty"`
+ Key string `json:"-"`
+ ThumbnailKey string `json:"-"`
+ Url string `json:"url,omitempty"`
+ ThumbnailUrl string `json:"thumbnailUrl,omitempty"`
+ Name string `json:"name"`
+ Type string `json:"type"`
+ Size int64 `json:"size"`
+ Error string `json:"error,omitempty"`
+ DeleteUrl string `json:"deleteUrl,omitempty"`
+ DeleteType string `json:"deleteType,omitempty"`
}
func (fi *FileInfo) ValidateType() (valid bool) {
@@ -75,50 +106,58 @@ func (fi *FileInfo) ValidateSize() (valid bool) {
return false
}
-func (fi *FileInfo) CreateUrls(r *http.Request, c appengine.Context) {
+func (fi *FileInfo) CreateUrls(r *http.Request, c context.Context) {
u := &url.URL{
Scheme: r.URL.Scheme,
Host: appengine.DefaultVersionHostname(c),
Path: "/",
}
uString := u.String()
- fi.Url = uString + escape(string(fi.Key)) + "/" +
- escape(string(fi.Name))
- fi.DeleteUrl = fi.Url + "?delete=true"
+ fi.Url = uString + fi.Key
+ fi.DeleteUrl = fi.Url
fi.DeleteType = "DELETE"
- if imageTypes.MatchString(fi.Type) {
- servingUrl, err := image.ServingURL(
- c,
- fi.Key,
- &image.ServingURLOptions{
- Secure: strings.HasSuffix(u.Scheme, "s"),
- Size: 0,
- Crop: false,
- },
- )
- check(err)
- fi.ThumbnailUrl = servingUrl.String() + THUMBNAIL_PARAM
+ if fi.ThumbnailKey != "" {
+ fi.ThumbnailUrl = uString + fi.ThumbnailKey
}
}
-func check(err error) {
- if err != nil {
- panic(err)
- }
-}
-
-func escape(s string) string {
- return strings.Replace(url.QueryEscape(s), "+", "%20", -1)
+func (fi *FileInfo) SetKey(checksum uint32) {
+ fi.Key = escape(string(fi.Type)) + "/" +
+ escape(fmt.Sprint(checksum)) + "/" +
+ escape(string(fi.Name))
}
-func delayedDelete(c appengine.Context, fi *FileInfo) {
- if key := string(fi.Key); key != "" {
- task := &taskqueue.Task{
- Path: "/" + escape(key) + "/-",
- Method: "DELETE",
- Delay: time.Duration(EXPIRATION_TIME) * time.Second,
+func (fi *FileInfo) createThumb(buffer *bytes.Buffer, c context.Context) {
+ if imageTypes.MatchString(fi.Type) {
+ src, _, err := image.Decode(bytes.NewReader(buffer.Bytes()))
+ check(err)
+ filter := gift.New(gift.ResizeToFit(
+ THUMB_MAX_WIDTH,
+ THUMB_MAX_HEIGHT,
+ gift.LanczosResampling,
+ ))
+ dst := image.NewNRGBA(filter.Bounds(src.Bounds()))
+ filter.Draw(dst, src)
+ buffer.Reset()
+ bWriter := bufio.NewWriter(buffer)
+ switch fi.Type {
+ case "image/jpeg", "image/pjpeg":
+ err = jpeg.Encode(bWriter, dst, nil)
+ case "image/gif":
+ err = gif.Encode(bWriter, dst, nil)
+ default:
+ err = png.Encode(bWriter, dst)
+ }
+ check(err)
+ bWriter.Flush()
+ thumbnailKey := fi.Key + thumbSuffix + filepath.Ext(fi.Name)
+ item := &memcache.Item{
+ Key: thumbnailKey,
+ Value: buffer.Bytes(),
}
- taskqueue.Add(c, task, "")
+ err = memcache.Set(c, item)
+ check(err)
+ fi.ThumbnailKey = thumbnailKey
}
}
@@ -136,24 +175,26 @@ func handleUpload(r *http.Request, p *multipart.Part) (fi *FileInfo) {
fi.Error = rec.(error).Error()
}
}()
+ var buffer bytes.Buffer
+ hash := crc32.NewIEEE()
+ mw := io.MultiWriter(&buffer, hash)
lr := &io.LimitedReader{R: p, N: MAX_FILE_SIZE + 1}
+ _, err := io.Copy(mw, lr)
+ check(err)
+ fi.Size = MAX_FILE_SIZE + 1 - lr.N
+ if !fi.ValidateSize() {
+ return
+ }
+ fi.SetKey(hash.Sum32())
+ item := &memcache.Item{
+ Key: fi.Key,
+ Value: buffer.Bytes(),
+ }
context := appengine.NewContext(r)
- w, err := blobstore.Create(context, fi.Type)
- defer func() {
- w.Close()
- fi.Size = MAX_FILE_SIZE + 1 - lr.N
- fi.Key, err = w.Key()
- check(err)
- if !fi.ValidateSize() {
- err := blobstore.Delete(context, fi.Key)
- check(err)
- return
- }
- delayedDelete(context, fi)
- fi.CreateUrls(r, context)
- }()
+ err = memcache.Set(context, item)
check(err)
- _, err = io.Copy(w, lr)
+ fi.createThumb(&buffer, context)
+ fi.CreateUrls(r, context)
return
}
@@ -183,49 +224,70 @@ func handleUploads(r *http.Request) (fileInfos []*FileInfo) {
return
}
+func validateRedirect(r *http.Request, redirect string) bool {
+ if redirect != "" {
+ var redirectAllowTarget *regexp.Regexp
+ if REDIRECT_ALLOW_TARGET != "" {
+ redirectAllowTarget = regexp.MustCompile(REDIRECT_ALLOW_TARGET)
+ } else {
+ referer := r.Referer()
+ if referer == "" {
+ return false
+ }
+ refererUrl, err := url.Parse(referer)
+ if err != nil {
+ return false
+ }
+ redirectAllowTarget = regexp.MustCompile("^" + regexp.QuoteMeta(
+ refererUrl.Scheme+"://"+refererUrl.Host+"/",
+ ))
+ }
+ return redirectAllowTarget.MatchString(redirect)
+ }
+ return false
+}
+
func get(w http.ResponseWriter, r *http.Request) {
if r.URL.Path == "/" {
http.Redirect(w, r, WEBSITE, http.StatusFound)
return
}
- parts := strings.Split(r.URL.Path, "/")
+ // Use RequestURI instead of r.URL.Path, as we need the encoded form:
+ key := extractKey(r)
+ parts := strings.Split(key, "/")
if len(parts) == 3 {
- if key := parts[1]; key != "" {
- blobKey := appengine.BlobKey(key)
- bi, err := blobstore.Stat(appengine.NewContext(r), blobKey)
- if err == nil {
- w.Header().Add("X-Content-Type-Options", "nosniff")
- if !imageTypes.MatchString(bi.ContentType) {
- w.Header().Add("Content-Type", "application/octet-stream")
- w.Header().Add(
- "Content-Disposition",
- fmt.Sprintf("attachment; filename=\"%s\"", parts[2]),
- )
- }
- w.Header().Add(
- "Cache-Control",
- fmt.Sprintf("public,max-age=%d", EXPIRATION_TIME),
- )
- blobstore.Send(w, blobKey)
- return
+ context := appengine.NewContext(r)
+ item, err := memcache.Get(context, key)
+ if err == nil {
+ w.Header().Add("X-Content-Type-Options", "nosniff")
+ contentType, _ := url.QueryUnescape(parts[0])
+ if !imageTypes.MatchString(contentType) {
+ contentType = "application/octet-stream"
}
+ w.Header().Add("Content-Type", contentType)
+ w.Header().Add(
+ "Cache-Control",
+ fmt.Sprintf("public,max-age=%d", EXPIRATION_TIME),
+ )
+ w.Write(item.Value)
+ return
}
}
http.Error(w, "404 Not Found", http.StatusNotFound)
}
func post(w http.ResponseWriter, r *http.Request) {
- result := make(map[string][]*FileInfo, 1)
- result["files"] = handleUploads(r)
+ result := make(map[string][]*FileInfo, 1)
+ result["files"] = handleUploads(r)
b, err := json.Marshal(result)
check(err)
- if redirect := r.FormValue("redirect"); redirect != "" {
- if strings.Contains(redirect, "%s") {
- redirect = fmt.Sprintf(
- redirect,
- escape(string(b)),
- )
- }
+ if redirect := r.FormValue("redirect"); validateRedirect(r, redirect) {
+ if strings.Contains(redirect, "%s") {
+ redirect = fmt.Sprintf(
+ redirect,
+ escape(string(b)),
+ )
+ }
http.Redirect(w, r, redirect, http.StatusFound)
return
}
@@ -238,27 +300,30 @@ func post(w http.ResponseWriter, r *http.Request) {
}
func delete(w http.ResponseWriter, r *http.Request) {
- parts := strings.Split(r.URL.Path, "/")
- if len(parts) != 3 {
- return
- }
- result := make(map[string]bool, 1)
- if key := parts[1]; key != "" {
- c := appengine.NewContext(r)
- blobKey := appengine.BlobKey(key)
- err := blobstore.Delete(c, blobKey)
- check(err)
- err = image.DeleteServingURL(c, blobKey)
+ key := extractKey(r)
+ parts := strings.Split(key, "/")
+ if len(parts) == 3 {
+ result := make(map[string]bool, 1)
+ context := appengine.NewContext(r)
+ err := memcache.Delete(context, key)
+ if err == nil {
+ result[key] = true
+ contentType, _ := url.QueryUnescape(parts[0])
+ if imageTypes.MatchString(contentType) {
+ thumbnailKey := key + thumbSuffix + filepath.Ext(parts[2])
+ err := memcache.Delete(context, thumbnailKey)
+ if err == nil {
+ result[thumbnailKey] = true
+ }
+ }
+ }
+ w.Header().Set("Content-Type", "application/json")
+ b, err := json.Marshal(result)
check(err)
- result[key] = true
- }
- jsonType := "application/json"
- if strings.Index(r.Header.Get("Accept"), jsonType) != -1 {
- w.Header().Set("Content-Type", jsonType)
+ fmt.Fprintln(w, string(b))
+ } else {
+ http.Error(w, "405 Method not allowed", http.StatusMethodNotAllowed)
}
- b, err := json.Marshal(result)
- check(err)
- fmt.Fprintln(w, string(b))
}
func handle(w http.ResponseWriter, r *http.Request) {
@@ -267,15 +332,15 @@ func handle(w http.ResponseWriter, r *http.Request) {
w.Header().Add("Access-Control-Allow-Origin", "*")
w.Header().Add(
"Access-Control-Allow-Methods",
- "OPTIONS, HEAD, GET, POST, PUT, DELETE",
+ "OPTIONS, HEAD, GET, POST, DELETE",
)
w.Header().Add(
"Access-Control-Allow-Headers",
"Content-Type, Content-Range, Content-Disposition",
)
switch r.Method {
- case "OPTIONS":
- case "HEAD":
+ case "OPTIONS", "HEAD":
+ return
case "GET":
get(w, r)
case "POST":
diff --git a/library/blueimp_upload/server/gae-python/app.yaml b/library/blueimp_upload/server/gae-python/app.yaml
index 5fe123f59..764449b74 100644
--- a/library/blueimp_upload/server/gae-python/app.yaml
+++ b/library/blueimp_upload/server/gae-python/app.yaml
@@ -4,8 +4,9 @@ runtime: python27
api_version: 1
threadsafe: true
-builtins:
-- deferred: on
+libraries:
+- name: PIL
+ version: latest
handlers:
- url: /(favicon\.ico|robots\.txt)
diff --git a/library/blueimp_upload/server/gae-python/main.py b/library/blueimp_upload/server/gae-python/main.py
index 6276be6a0..1955ac00a 100644
--- a/library/blueimp_upload/server/gae-python/main.py
+++ b/library/blueimp_upload/server/gae-python/main.py
@@ -1,49 +1,57 @@
# -*- coding: utf-8 -*-
#
-# jQuery File Upload Plugin GAE Python Example 2.2.0
+# jQuery File Upload Plugin GAE Python Example
# https://github.com/blueimp/jQuery-File-Upload
#
# Copyright 2011, Sebastian Tschan
# https://blueimp.net
#
# Licensed under the MIT license:
-# http://www.opensource.org/licenses/MIT
+# https://opensource.org/licenses/MIT
#
-from __future__ import with_statement
-from google.appengine.api import files, images
-from google.appengine.ext import blobstore, deferred
-from google.appengine.ext.webapp import blobstore_handlers
+from google.appengine.api import memcache, images
import json
+import os
import re
import urllib
import webapp2
+DEBUG=os.environ.get('SERVER_SOFTWARE', '').startswith('Dev')
WEBSITE = 'https://blueimp.github.io/jQuery-File-Upload/'
MIN_FILE_SIZE = 1 # bytes
-MAX_FILE_SIZE = 5000000 # bytes
+# Max file size is memcache limit (1MB) minus key size minus overhead:
+MAX_FILE_SIZE = 999000 # bytes
IMAGE_TYPES = re.compile('image/(gif|p?jpeg|(x-)?png)')
ACCEPT_FILE_TYPES = IMAGE_TYPES
-THUMBNAIL_MODIFICATOR = '=s80' # max width / height
+THUMB_MAX_WIDTH = 80
+THUMB_MAX_HEIGHT = 80
+THUMB_SUFFIX = '.'+str(THUMB_MAX_WIDTH)+'x'+str(THUMB_MAX_HEIGHT)+'.png'
EXPIRATION_TIME = 300 # seconds
+# If set to None, only allow redirects to the referer protocol+host.
+# Set to a regexp for custom pattern matching against the redirect value:
+REDIRECT_ALLOW_TARGET = None
+
+class CORSHandler(webapp2.RequestHandler):
+ def cors(self):
+ headers = self.response.headers
+ headers['Access-Control-Allow-Origin'] = '*'
+ headers['Access-Control-Allow-Methods'] =\
+ 'OPTIONS, HEAD, GET, POST, DELETE'
+ headers['Access-Control-Allow-Headers'] =\
+ 'Content-Type, Content-Range, Content-Disposition'
+ def initialize(self, request, response):
+ super(CORSHandler, self).initialize(request, response)
+ self.cors()
-def cleanup(blob_keys):
- blobstore.delete(blob_keys)
-
-
-class UploadHandler(webapp2.RequestHandler):
+ def json_stringify(self, obj):
+ return json.dumps(obj, separators=(',', ':'))
- def initialize(self, request, response):
- super(UploadHandler, self).initialize(request, response)
- self.response.headers['Access-Control-Allow-Origin'] = '*'
- self.response.headers[
- 'Access-Control-Allow-Methods'
- ] = 'OPTIONS, HEAD, GET, POST, PUT, DELETE'
- self.response.headers[
- 'Access-Control-Allow-Headers'
- ] = 'Content-Type, Content-Range, Content-Disposition'
+ def options(self, *args, **kwargs):
+ pass
+class UploadHandler(CORSHandler):
def validate(self, file):
if file['size'] < MIN_FILE_SIZE:
file['error'] = 'File is too small'
@@ -55,6 +63,20 @@ class UploadHandler(webapp2.RequestHandler):
return True
return False
+ def validate_redirect(self, redirect):
+ if redirect:
+ if REDIRECT_ALLOW_TARGET:
+ return REDIRECT_ALLOW_TARGET.match(redirect)
+ referer = self.request.headers['referer']
+ if referer:
+ from urlparse import urlparse
+ parts = urlparse(referer)
+ redirect_allow_target = '^' + re.escape(
+ parts.scheme + '://' + parts.netloc + '/'
+ )
+ return re.match(redirect_allow_target, redirect)
+ return False
+
def get_file_size(self, file):
file.seek(0, 2) # Seek to the end of the file
size = file.tell() # Get the position of EOF
@@ -62,64 +84,58 @@ class UploadHandler(webapp2.RequestHandler):
return size
def write_blob(self, data, info):
- blob = files.blobstore.create(
- mime_type=info['type'],
- _blobinfo_uploaded_filename=info['name']
- )
- with files.open(blob, 'a') as f:
- f.write(data)
- files.finalize(blob)
- return files.blobstore.get_blob_key(blob)
+ key = urllib.quote(info['type'].encode('utf-8'), '') +\
+ '/' + str(hash(data)) +\
+ '/' + urllib.quote(info['name'].encode('utf-8'), '')
+ try:
+ memcache.set(key, data, time=EXPIRATION_TIME)
+ except: #Failed to add to memcache
+ return (None, None)
+ thumbnail_key = None
+ if IMAGE_TYPES.match(info['type']):
+ try:
+ img = images.Image(image_data=data)
+ img.resize(
+ width=THUMB_MAX_WIDTH,
+ height=THUMB_MAX_HEIGHT
+ )
+ thumbnail_data = img.execute_transforms()
+ thumbnail_key = key + THUMB_SUFFIX
+ memcache.set(
+ thumbnail_key,
+ thumbnail_data,
+ time=EXPIRATION_TIME
+ )
+ except: #Failed to resize Image or add to memcache
+ thumbnail_key = None
+ return (key, thumbnail_key)
def handle_upload(self):
results = []
- blob_keys = []
for name, fieldStorage in self.request.POST.items():
if type(fieldStorage) is unicode:
continue
result = {}
- result['name'] = re.sub(
- r'^.*\\',
- '',
- fieldStorage.filename
- )
+ result['name'] = urllib.unquote(fieldStorage.filename)
result['type'] = fieldStorage.type
result['size'] = self.get_file_size(fieldStorage.file)
if self.validate(result):
- blob_key = str(
- self.write_blob(fieldStorage.value, result)
+ key, thumbnail_key = self.write_blob(
+ fieldStorage.value,
+ result
)
- blob_keys.append(blob_key)
- result['deleteType'] = 'DELETE'
- result['deleteUrl'] = self.request.host_url +\
- '/?key=' + urllib.quote(blob_key, '')
- if (IMAGE_TYPES.match(result['type'])):
- try:
- result['url'] = images.get_serving_url(
- blob_key,
- secure_url=self.request.host_url.startswith(
- 'https'
- )
- )
- result['thumbnailUrl'] = result['url'] +\
- THUMBNAIL_MODIFICATOR
- except: # Could not get an image serving url
- pass
- if not 'url' in result:
- result['url'] = self.request.host_url +\
- '/' + blob_key + '/' + urllib.quote(
- result['name'].encode('utf-8'), '')
+ if key is not None:
+ result['url'] = self.request.host_url + '/' + key
+ result['deleteUrl'] = result['url']
+ result['deleteType'] = 'DELETE'
+ if thumbnail_key is not None:
+ result['thumbnailUrl'] = self.request.host_url +\
+ '/' + thumbnail_key
+ else:
+ result['error'] = 'Failed to store uploaded file.'
results.append(result)
- deferred.defer(
- cleanup,
- blob_keys,
- _countdown=EXPIRATION_TIME
- )
return results
- def options(self):
- pass
-
def head(self):
pass
@@ -130,9 +146,9 @@ class UploadHandler(webapp2.RequestHandler):
if (self.request.get('_method') == 'DELETE'):
return self.delete()
result = {'files': self.handle_upload()}
- s = json.dumps(result, separators=(',', ':'))
+ s = self.json_stringify(result)
redirect = self.request.get('redirect')
- if redirect:
+ if self.validate_redirect(redirect):
return self.redirect(str(
redirect.replace('%s', urllib.quote(s, ''), 1)
))
@@ -140,31 +156,49 @@ class UploadHandler(webapp2.RequestHandler):
self.response.headers['Content-Type'] = 'application/json'
self.response.write(s)
- def delete(self):
- key = self.request.get('key') or ''
- blobstore.delete(key)
- s = json.dumps({key: True}, separators=(',', ':'))
+class FileHandler(CORSHandler):
+ def normalize(self, str):
+ return urllib.quote(urllib.unquote(str), '')
+
+ def get(self, content_type, data_hash, file_name):
+ content_type = self.normalize(content_type)
+ file_name = self.normalize(file_name)
+ key = content_type + '/' + data_hash + '/' + file_name
+ data = memcache.get(key)
+ if data is None:
+ return self.error(404)
+ # Prevent browsers from MIME-sniffing the content-type:
+ self.response.headers['X-Content-Type-Options'] = 'nosniff'
+ content_type = urllib.unquote(content_type)
+ if not IMAGE_TYPES.match(content_type):
+ # Force a download dialog for non-image types:
+ content_type = 'application/octet-stream'
+ elif file_name.endswith(THUMB_SUFFIX):
+ content_type = 'image/png'
+ self.response.headers['Content-Type'] = content_type
+ # Cache for the expiration time:
+ self.response.headers['Cache-Control'] = 'public,max-age=%d' \
+ % EXPIRATION_TIME
+ self.response.write(data)
+
+ def delete(self, content_type, data_hash, file_name):
+ content_type = self.normalize(content_type)
+ file_name = self.normalize(file_name)
+ key = content_type + '/' + data_hash + '/' + file_name
+ result = {key: memcache.delete(key)}
+ content_type = urllib.unquote(content_type)
+ if IMAGE_TYPES.match(content_type):
+ thumbnail_key = key + THUMB_SUFFIX
+ result[thumbnail_key] = memcache.delete(thumbnail_key)
if 'application/json' in self.request.headers.get('Accept'):
self.response.headers['Content-Type'] = 'application/json'
+ s = self.json_stringify(result)
self.response.write(s)
-
-class DownloadHandler(blobstore_handlers.BlobstoreDownloadHandler):
- def get(self, key, filename):
- if not blobstore.get(key):
- self.error(404)
- else:
- # Prevent browsers from MIME-sniffing the content-type:
- self.response.headers['X-Content-Type-Options'] = 'nosniff'
- # Cache for the expiration time:
- self.response.headers['Cache-Control'] = 'public,max-age=%d' % EXPIRATION_TIME
- # Send the file forcing a download dialog:
- self.send_blob(key, save_as=filename, content_type='application/octet-stream')
-
app = webapp2.WSGIApplication(
[
('/', UploadHandler),
- ('/([^/]+)/([^/]+)', DownloadHandler)
+ ('/(.+)/([^/]+)/([^/]+)', FileHandler)
],
- debug=True
+ debug=DEBUG
)
diff --git a/library/blueimp_upload/server/node/.gitignore b/library/blueimp_upload/server/node/.gitignore
deleted file mode 100644
index 9daa8247d..000000000
--- a/library/blueimp_upload/server/node/.gitignore
+++ /dev/null
@@ -1,2 +0,0 @@
-.DS_Store
-node_modules
diff --git a/library/blueimp_upload/server/node/package.json b/library/blueimp_upload/server/node/package.json
deleted file mode 100644
index dd38c50ca..000000000
--- a/library/blueimp_upload/server/node/package.json
+++ /dev/null
@@ -1,41 +0,0 @@
-{
- "name": "blueimp-file-upload-node",
- "version": "2.1.0",
- "title": "jQuery File Upload Node.js example",
- "description": "Node.js implementation example of a file upload handler for jQuery File Upload.",
- "keywords": [
- "file",
- "upload",
- "cross-domain",
- "cross-site",
- "node"
- ],
- "homepage": "https://github.com/blueimp/jQuery-File-Upload",
- "author": {
- "name": "Sebastian Tschan",
- "url": "https://blueimp.net"
- },
- "maintainers": [
- {
- "name": "Sebastian Tschan",
- "url": "https://blueimp.net"
- }
- ],
- "repository": {
- "type": "git",
- "url": "git://github.com/blueimp/jQuery-File-Upload.git"
- },
- "bugs": "https://github.com/blueimp/jQuery-File-Upload/issues",
- "licenses": [
- {
- "type": "MIT",
- "url": "http://www.opensource.org/licenses/MIT"
- }
- ],
- "dependencies": {
- "formidable": ">=1.0.11",
- "node-static": ">=0.6.5",
- "imagemagick": ">=0.1.3"
- },
- "main": "server.js"
-}
diff --git a/library/blueimp_upload/server/node/public/files/.gitignore b/library/blueimp_upload/server/node/public/files/.gitignore
deleted file mode 100644
index d6b7ef32c..000000000
--- a/library/blueimp_upload/server/node/public/files/.gitignore
+++ /dev/null
@@ -1,2 +0,0 @@
-*
-!.gitignore
diff --git a/library/blueimp_upload/server/node/server.js b/library/blueimp_upload/server/node/server.js
deleted file mode 100755
index 808d6ffe1..000000000
--- a/library/blueimp_upload/server/node/server.js
+++ /dev/null
@@ -1,292 +0,0 @@
-#!/usr/bin/nodejs
-/*
- * jQuery File Upload Plugin Node.js Example 2.1.2
- * https://github.com/blueimp/jQuery-File-Upload
- *
- * Copyright 2012, Sebastian Tschan
- * https://blueimp.net
- *
- * Licensed under the MIT license:
- * http://www.opensource.org/licenses/MIT
- */
-
-/* jshint nomen:false */
-/* global require, __dirname, unescape, console */
-
-(function (port) {
- 'use strict';
- var path = require('path'),
- fs = require('fs'),
- // Since Node 0.8, .existsSync() moved from path to fs:
- _existsSync = fs.existsSync || path.existsSync,
- formidable = require('formidable'),
- nodeStatic = require('node-static'),
- imageMagick = require('imagemagick'),
- options = {
- tmpDir: __dirname + '/tmp',
- publicDir: __dirname + '/public',
- uploadDir: __dirname + '/public/files',
- uploadUrl: '/files/',
- maxPostSize: 11000000000, // 11 GB
- minFileSize: 1,
- maxFileSize: 10000000000, // 10 GB
- acceptFileTypes: /.+/i,
- // Files not matched by this regular expression force a download dialog,
- // to prevent executing any scripts in the context of the service domain:
- inlineFileTypes: /\.(gif|jpe?g|png)$/i,
- imageTypes: /\.(gif|jpe?g|png)$/i,
- imageVersions: {
- 'thumbnail': {
- width: 80,
- height: 80
- }
- },
- accessControl: {
- allowOrigin: '*',
- allowMethods: 'OPTIONS, HEAD, GET, POST, PUT, DELETE',
- allowHeaders: 'Content-Type, Content-Range, Content-Disposition'
- },
- /* Uncomment and edit this section to provide the service via HTTPS:
- ssl: {
- key: fs.readFileSync('/Applications/XAMPP/etc/ssl.key/server.key'),
- cert: fs.readFileSync('/Applications/XAMPP/etc/ssl.crt/server.crt')
- },
- */
- nodeStatic: {
- cache: 3600 // seconds to cache served files
- }
- },
- utf8encode = function (str) {
- return unescape(encodeURIComponent(str));
- },
- fileServer = new nodeStatic.Server(options.publicDir, options.nodeStatic),
- nameCountRegexp = /(?:(?: \(([\d]+)\))?(\.[^.]+))?$/,
- nameCountFunc = function (s, index, ext) {
- return ' (' + ((parseInt(index, 10) || 0) + 1) + ')' + (ext || '');
- },
- FileInfo = function (file) {
- this.name = file.name;
- this.size = file.size;
- this.type = file.type;
- this.deleteType = 'DELETE';
- },
- UploadHandler = function (req, res, callback) {
- this.req = req;
- this.res = res;
- this.callback = callback;
- },
- serve = function (req, res) {
- res.setHeader(
- 'Access-Control-Allow-Origin',
- options.accessControl.allowOrigin
- );
- res.setHeader(
- 'Access-Control-Allow-Methods',
- options.accessControl.allowMethods
- );
- res.setHeader(
- 'Access-Control-Allow-Headers',
- options.accessControl.allowHeaders
- );
- var handleResult = function (result, redirect) {
- if (redirect) {
- res.writeHead(302, {
- 'Location': redirect.replace(
- /%s/,
- encodeURIComponent(JSON.stringify(result))
- )
- });
- res.end();
- } else {
- res.writeHead(200, {
- 'Content-Type': req.headers.accept
- .indexOf('application/json') !== -1 ?
- 'application/json' : 'text/plain'
- });
- res.end(JSON.stringify(result));
- }
- },
- setNoCacheHeaders = function () {
- res.setHeader('Pragma', 'no-cache');
- res.setHeader('Cache-Control', 'no-store, no-cache, must-revalidate');
- res.setHeader('Content-Disposition', 'inline; filename="files.json"');
- },
- handler = new UploadHandler(req, res, handleResult);
- switch (req.method) {
- case 'OPTIONS':
- res.end();
- break;
- case 'HEAD':
- case 'GET':
- if (req.url === '/') {
- setNoCacheHeaders();
- if (req.method === 'GET') {
- handler.get();
- } else {
- res.end();
- }
- } else {
- fileServer.serve(req, res);
- }
- break;
- case 'POST':
- setNoCacheHeaders();
- handler.post();
- break;
- case 'DELETE':
- handler.destroy();
- break;
- default:
- res.statusCode = 405;
- res.end();
- }
- };
- fileServer.respond = function (pathname, status, _headers, files, stat, req, res, finish) {
- // Prevent browsers from MIME-sniffing the content-type:
- _headers['X-Content-Type-Options'] = 'nosniff';
- if (!options.inlineFileTypes.test(files[0])) {
- // Force a download dialog for unsafe file extensions:
- _headers['Content-Type'] = 'application/octet-stream';
- _headers['Content-Disposition'] = 'attachment; filename="' +
- utf8encode(path.basename(files[0])) + '"';
- }
- nodeStatic.Server.prototype.respond
- .call(this, pathname, status, _headers, files, stat, req, res, finish);
- };
- FileInfo.prototype.validate = function () {
- if (options.minFileSize && options.minFileSize > this.size) {
- this.error = 'File is too small';
- } else if (options.maxFileSize && options.maxFileSize < this.size) {
- this.error = 'File is too big';
- } else if (!options.acceptFileTypes.test(this.name)) {
- this.error = 'Filetype not allowed';
- }
- return !this.error;
- };
- FileInfo.prototype.safeName = function () {
- // Prevent directory traversal and creating hidden system files:
- this.name = path.basename(this.name).replace(/^\.+/, '');
- // Prevent overwriting existing files:
- while (_existsSync(options.uploadDir + '/' + this.name)) {
- this.name = this.name.replace(nameCountRegexp, nameCountFunc);
- }
- };
- FileInfo.prototype.initUrls = function (req) {
- if (!this.error) {
- var that = this,
- baseUrl = (options.ssl ? 'https:' : 'http:') +
- '//' + req.headers.host + options.uploadUrl;
- this.url = this.deleteUrl = baseUrl + encodeURIComponent(this.name);
- Object.keys(options.imageVersions).forEach(function (version) {
- if (_existsSync(
- options.uploadDir + '/' + version + '/' + that.name
- )) {
- that[version + 'Url'] = baseUrl + version + '/' +
- encodeURIComponent(that.name);
- }
- });
- }
- };
- UploadHandler.prototype.get = function () {
- var handler = this,
- files = [];
- fs.readdir(options.uploadDir, function (err, list) {
- list.forEach(function (name) {
- var stats = fs.statSync(options.uploadDir + '/' + name),
- fileInfo;
- if (stats.isFile() && name[0] !== '.') {
- fileInfo = new FileInfo({
- name: name,
- size: stats.size
- });
- fileInfo.initUrls(handler.req);
- files.push(fileInfo);
- }
- });
- handler.callback({files: files});
- });
- };
- UploadHandler.prototype.post = function () {
- var handler = this,
- form = new formidable.IncomingForm(),
- tmpFiles = [],
- files = [],
- map = {},
- counter = 1,
- redirect,
- finish = function () {
- counter -= 1;
- if (!counter) {
- files.forEach(function (fileInfo) {
- fileInfo.initUrls(handler.req);
- });
- handler.callback({files: files}, redirect);
- }
- };
- form.uploadDir = options.tmpDir;
- form.on('fileBegin', function (name, file) {
- tmpFiles.push(file.path);
- var fileInfo = new FileInfo(file);
- fileInfo.safeName();
- map[path.basename(file.path)] = fileInfo;
- files.push(fileInfo);
- }).on('field', function (name, value) {
- if (name === 'redirect') {
- redirect = value;
- }
- }).on('file', function (name, file) {
- var fileInfo = map[path.basename(file.path)];
- fileInfo.size = file.size;
- if (!fileInfo.validate()) {
- fs.unlink(file.path);
- return;
- }
- fs.renameSync(file.path, options.uploadDir + '/' + fileInfo.name);
- if (options.imageTypes.test(fileInfo.name)) {
- Object.keys(options.imageVersions).forEach(function (version) {
- counter += 1;
- var opts = options.imageVersions[version];
- imageMagick.resize({
- width: opts.width,
- height: opts.height,
- srcPath: options.uploadDir + '/' + fileInfo.name,
- dstPath: options.uploadDir + '/' + version + '/' +
- fileInfo.name
- }, finish);
- });
- }
- }).on('aborted', function () {
- tmpFiles.forEach(function (file) {
- fs.unlink(file);
- });
- }).on('error', function (e) {
- console.log(e);
- }).on('progress', function (bytesReceived) {
- if (bytesReceived > options.maxPostSize) {
- handler.req.connection.destroy();
- }
- }).on('end', finish).parse(handler.req);
- };
- UploadHandler.prototype.destroy = function () {
- var handler = this,
- fileName;
- if (handler.req.url.slice(0, options.uploadUrl.length) === options.uploadUrl) {
- fileName = path.basename(decodeURIComponent(handler.req.url));
- if (fileName[0] !== '.') {
- fs.unlink(options.uploadDir + '/' + fileName, function (ex) {
- Object.keys(options.imageVersions).forEach(function (version) {
- fs.unlink(options.uploadDir + '/' + version + '/' + fileName);
- });
- handler.callback({success: !ex});
- });
- return;
- }
- }
- handler.callback({success: false});
- };
- if (options.ssl) {
- require('https').createServer(options.ssl, serve).listen(port);
- } else {
- require('http').createServer(serve).listen(port);
- }
-}(8888));
diff --git a/library/blueimp_upload/server/node/tmp/.gitignore b/library/blueimp_upload/server/node/tmp/.gitignore
deleted file mode 100644
index e69de29bb..000000000
--- a/library/blueimp_upload/server/node/tmp/.gitignore
+++ /dev/null
diff --git a/library/blueimp_upload/server/php/Dockerfile b/library/blueimp_upload/server/php/Dockerfile
new file mode 100644
index 000000000..ca88d3d0d
--- /dev/null
+++ b/library/blueimp_upload/server/php/Dockerfile
@@ -0,0 +1,38 @@
+FROM php:7.0-apache
+
+# Enable the Apache Headers module:
+RUN ln -s /etc/apache2/mods-available/headers.load \
+ /etc/apache2/mods-enabled/headers.load
+
+# Enable the Apache Rewrite module:
+RUN ln -s /etc/apache2/mods-available/rewrite.load \
+ /etc/apache2/mods-enabled/rewrite.load
+
+# Install GD, Imagick and ImageMagick as image conversion options:
+RUN DEBIAN_FRONTEND=noninteractive \
+ apt-get update && apt-get install -y --no-install-recommends \
+ libpng-dev \
+ libjpeg-dev \
+ libmagickwand-dev \
+ imagemagick \
+ && pecl install \
+ imagick \
+ && docker-php-ext-enable \
+ imagick \
+ && docker-php-ext-configure \
+ gd --with-jpeg-dir=/usr/include/ \
+ && docker-php-ext-install \
+ gd \
+ # Uninstall obsolete packages:
+ && apt-get autoremove -y \
+ libpng-dev \
+ libjpeg-dev \
+ libmagickwand-dev \
+ # Remove obsolete files:
+ && apt-get clean \
+ && rm -rf \
+ /tmp/* \
+ /usr/share/doc/* \
+ /var/cache/* \
+ /var/lib/apt/lists/* \
+ /var/tmp/*
diff --git a/library/blueimp_upload/server/php/UploadHandler.php b/library/blueimp_upload/server/php/UploadHandler.php
index fb77be1d0..1380d4739 100755
--- a/library/blueimp_upload/server/php/UploadHandler.php
+++ b/library/blueimp_upload/server/php/UploadHandler.php
@@ -1,13 +1,13 @@
<?php
/*
- * jQuery File Upload Plugin PHP Class 8.1.0
+ * jQuery File Upload Plugin PHP Class
* https://github.com/blueimp/jQuery-File-Upload
*
* Copyright 2010, Sebastian Tschan
* https://blueimp.net
*
* Licensed under the MIT license:
- * http://www.opensource.org/licenses/MIT
+ * https://opensource.org/licenses/MIT
*/
class UploadHandler
@@ -40,11 +40,13 @@ class UploadHandler
protected $image_objects = array();
- function __construct($options = null, $initialize = true, $error_messages = null) {
+ public function __construct($options = null, $initialize = true, $error_messages = null) {
+ $this->response = array();
$this->options = array(
- 'script_url' => $this->get_full_url().'/',
+ 'script_url' => $this->get_full_url().'/'.$this->basename($this->get_server_var('SCRIPT_NAME')),
'upload_dir' => dirname($this->get_server_var('SCRIPT_FILENAME')).'/files/',
'upload_url' => $this->get_full_url().'/files/',
+ 'input_stream' => 'php://input',
'user_dirs' => false,
'mkdir_mode' => 0755,
'param_name' => 'files',
@@ -67,6 +69,14 @@ class UploadHandler
'Content-Range',
'Content-Disposition'
),
+ // By default, allow redirects to the referer protocol+host:
+ 'redirect_allow_target' => '/^'.preg_quote(
+ parse_url($this->get_server_var('HTTP_REFERER'), PHP_URL_SCHEME)
+ .'://'
+ .parse_url($this->get_server_var('HTTP_REFERER'), PHP_URL_HOST)
+ .'/', // Trailing slash to not match subdomains by mistake
+ '/' // preg_quote delimiter param
+ ).'/',
// Enable to provide file downloads via GET requests to the PHP script:
// 1. Set to 1 to download files via readfile method through PHP
// 2. Set to 2 to send a X-Sendfile header for lighttpd/Apache
@@ -147,7 +157,8 @@ class UploadHandler
'max_width' => 80,
'max_height' => 80
)
- )
+ ),
+ 'print_response' => true
);
if ($options) {
$this->options = $options + $this->options;
@@ -167,15 +178,15 @@ class UploadHandler
$this->head();
break;
case 'GET':
- $this->get();
+ $this->get($this->options['print_response']);
break;
case 'PATCH':
case 'PUT':
case 'POST':
- $this->post();
+ $this->post($this->options['print_response']);
break;
case 'DELETE':
- $this->delete();
+ $this->delete($this->options['print_response']);
break;
default:
$this->header('HTTP/1.1 405 Method Not Allowed');
@@ -300,7 +311,7 @@ class UploadHandler
$this->get_upload_path($file_name)
);
$file->url = $this->get_download_url($file->name);
- foreach($this->options['image_versions'] as $version => $options) {
+ foreach ($this->options['image_versions'] as $version => $options) {
if (!empty($version)) {
if (is_file($this->get_upload_path($file_name, $version))) {
$file->{$version.'Url'} = $this->get_download_url(
@@ -332,14 +343,15 @@ class UploadHandler
}
protected function get_error_message($error) {
- return array_key_exists($error, $this->error_messages) ?
+ return isset($this->error_messages[$error]) ?
$this->error_messages[$error] : $error;
}
- function get_config_bytes($val) {
+ public function get_config_bytes($val) {
$val = trim($val);
$last = strtolower($val[strlen($val)-1]);
- switch($last) {
+ $val = (int)$val;
+ switch ($last) {
case 'g':
$val *= 1024;
case 'm':
@@ -355,9 +367,9 @@ class UploadHandler
$file->error = $this->get_error_message($error);
return false;
}
- $content_length = $this->fix_integer_overflow(intval(
- $this->get_server_var('CONTENT_LENGTH')
- ));
+ $content_length = $this->fix_integer_overflow(
+ (int)$this->get_server_var('CONTENT_LENGTH')
+ );
$post_max_size = $this->get_config_bytes(ini_get('post_max_size'));
if ($post_max_size && ($content_length > $post_max_size)) {
$file->error = $this->get_error_message('post_max_size');
@@ -398,6 +410,21 @@ class UploadHandler
if (($max_width || $max_height || $min_width || $min_height)
&& preg_match($this->options['image_file_types'], $file->name)) {
list($img_width, $img_height) = $this->get_image_size($uploaded_file);
+
+ // If we are auto rotating the image by default, do the checks on
+ // the correct orientation
+ if (
+ @$this->options['image_versions']['']['auto_orient'] &&
+ function_exists('exif_read_data') &&
+ ($exif = @exif_read_data($uploaded_file)) &&
+ (((int) @$exif['Orientation']) >= 5)
+ ) {
+ $tmp = $img_width;
+ $img_width = $img_height;
+ $img_height = $tmp;
+ unset($tmp);
+ }
+
}
if (!empty($img_width)) {
if ($max_width && $img_width > $max_width) {
@@ -421,7 +448,7 @@ class UploadHandler
}
protected function upcount_name_callback($matches) {
- $index = isset($matches[1]) ? intval($matches[1]) + 1 : 1;
+ $index = isset($matches[1]) ? ((int)$matches[1]) + 1 : 1;
$ext = isset($matches[2]) ? $matches[2] : '';
return ' ('.$index.')'.$ext;
}
@@ -441,8 +468,8 @@ class UploadHandler
$name = $this->upcount_name($name);
}
// Keep an existing filename if this is part of a chunked upload:
- $uploaded_bytes = $this->fix_integer_overflow(intval($content_range[1]));
- while(is_file($this->get_upload_path($name))) {
+ $uploaded_bytes = $this->fix_integer_overflow((int)$content_range[1]);
+ while (is_file($this->get_upload_path($name))) {
if ($uploaded_bytes === $this->get_file_size(
$this->get_upload_path($name))) {
break;
@@ -461,7 +488,7 @@ class UploadHandler
}
if ($this->options['correct_image_extensions'] &&
function_exists('exif_imagetype')) {
- switch(@exif_imagetype($file_path)){
+ switch (@exif_imagetype($file_path)){
case IMAGETYPE_JPEG:
$extensions = array('jpg', 'jpeg');
break;
@@ -491,7 +518,7 @@ class UploadHandler
// Remove path information and dots around the filename, to prevent uploading
// into different directories or replacing hidden system files.
// Also remove control characters and spaces (\x00..\x20) around the filename:
- $name = trim(basename(stripslashes($name)), ".\x00..\x20");
+ $name = trim($this->basename(stripslashes($name)), ".\x00..\x20");
// Use a timestamp for empty filenames:
if (!$name) {
$name = str_replace('.', '-', microtime(true));
@@ -515,10 +542,6 @@ class UploadHandler
);
}
- protected function handle_form_data($file, $index) {
- // Handle form data, e.g. $_REQUEST['description'][$index]
- }
-
protected function get_scaled_image_file_paths($file_name, $version) {
$file_path = $this->get_upload_path($file_name);
if (!empty($version)) {
@@ -601,7 +624,7 @@ class UploadHandler
if ($exif === false) {
return false;
}
- $orientation = intval(@$exif['Orientation']);
+ $orientation = (int)@$exif['Orientation'];
if ($orientation < 2 || $orientation > 8) {
return false;
}
@@ -825,7 +848,7 @@ class UploadHandler
$this->get_scaled_image_file_paths($file_name, $version);
$image = $this->imagick_get_image_object(
$file_path,
- !empty($options['no_cache'])
+ !empty($options['crop']) || !empty($options['no_cache'])
);
if ($image->getImageFormat() === 'GIF') {
// Handle animated GIFs:
@@ -955,7 +978,7 @@ class UploadHandler
return $dimensions;
}
return false;
- } catch (Exception $e) {
+ } catch (\Exception $e) {
error_log($e->getMessage());
}
}
@@ -965,7 +988,7 @@ class UploadHandler
exec($cmd, $output, $error);
if (!$error && !empty($output)) {
// image.jpg JPEG 1920x1080 1920x1080+0+0 8-bit sRGB 465KB 0.000u 0:00.000
- $infos = preg_split('/\s+/', $output[0]);
+ $infos = preg_split('/\s+/', substr($output[0], strlen($file_path)));
$dimensions = preg_split('/x/', $infos[2]);
return $dimensions;
}
@@ -1008,7 +1031,7 @@ class UploadHandler
protected function handle_image_file($file_path, $file) {
$failed_versions = array();
- foreach($this->options['image_versions'] as $version => $options) {
+ foreach ($this->options['image_versions'] as $version => $options) {
if ($this->create_scaled_image($file->name, $version, $options)) {
if (!empty($version)) {
$file->{$version.'Url'} = $this->get_download_url(
@@ -1024,7 +1047,7 @@ class UploadHandler
}
if (count($failed_versions)) {
$file->error = $this->get_error_message('image_resize')
- .' ('.implode($failed_versions,', ').')';
+ .' ('.implode($failed_versions, ', ').')';
}
// Free memory:
$this->destroy_image_object($file_path);
@@ -1035,7 +1058,7 @@ class UploadHandler
$file = new \stdClass();
$file->name = $this->get_file_name($uploaded_file, $name, $size, $type, $error,
$index, $content_range);
- $file->size = $this->fix_integer_overflow(intval($size));
+ $file->size = $this->fix_integer_overflow((int)$size);
$file->type = $type;
if ($this->validate($uploaded_file, $file, $error, $index)) {
$this->handle_form_data($file, $index);
@@ -1061,7 +1084,7 @@ class UploadHandler
// Non-multipart uploads (PUT method support)
file_put_contents(
$file_path,
- fopen('php://input', 'r'),
+ fopen($this->options['input_stream'], 'r'),
$append_file ? FILE_APPEND : 0
);
}
@@ -1102,41 +1125,33 @@ class UploadHandler
protected function body($str) {
echo $str;
}
-
+
protected function header($str) {
header($str);
}
+ protected function get_upload_data($id) {
+ return @$_FILES[$id];
+ }
+
+ protected function get_post_param($id) {
+ return @$_POST[$id];
+ }
+
+ protected function get_query_param($id) {
+ return @$_GET[$id];
+ }
+
protected function get_server_var($id) {
- return isset($_SERVER[$id]) ? $_SERVER[$id] : '';
+ return @$_SERVER[$id];
}
- protected function generate_response($content, $print_response = true) {
- if ($print_response) {
- $json = json_encode($content);
- $redirect = isset($_REQUEST['redirect']) ?
- stripslashes($_REQUEST['redirect']) : null;
- if ($redirect) {
- $this->header('Location: '.sprintf($redirect, rawurlencode($json)));
- return;
- }
- $this->head();
- if ($this->get_server_var('HTTP_CONTENT_RANGE')) {
- $files = isset($content[$this->options['param_name']]) ?
- $content[$this->options['param_name']] : null;
- if ($files && is_array($files) && is_object($files[0]) && $files[0]->size) {
- $this->header('Range: 0-'.(
- $this->fix_integer_overflow(intval($files[0]->size)) - 1
- ));
- }
- }
- $this->body($json);
- }
- return $content;
+ protected function handle_form_data($file, $index) {
+ // Handle form data, e.g. $_POST['description'][$index]
}
protected function get_version_param() {
- return isset($_GET['version']) ? basename(stripslashes($_GET['version'])) : null;
+ return $this->basename(stripslashes($this->get_query_param('version')));
}
protected function get_singular_param_name() {
@@ -1145,14 +1160,16 @@ class UploadHandler
protected function get_file_name_param() {
$name = $this->get_singular_param_name();
- return isset($_REQUEST[$name]) ? basename(stripslashes($_REQUEST[$name])) : null;
+ return $this->basename(stripslashes($this->get_query_param($name)));
}
protected function get_file_names_params() {
- $params = isset($_REQUEST[$this->options['param_name']]) ?
- $_REQUEST[$this->options['param_name']] : array();
+ $params = $this->get_query_param($this->options['param_name']);
+ if (!$params) {
+ return null;
+ }
foreach ($params as $key => $value) {
- $params[$key] = basename(stripslashes($value));
+ $params[$key] = $this->basename(stripslashes($value));
}
return $params;
}
@@ -1232,6 +1249,34 @@ class UploadHandler
.implode(', ', $this->options['access_control_allow_headers']));
}
+ public function generate_response($content, $print_response = true) {
+ $this->response = $content;
+ if ($print_response) {
+ $json = json_encode($content);
+ $redirect = stripslashes($this->get_post_param('redirect'));
+ if ($redirect && preg_match($this->options['redirect_allow_target'], $redirect)) {
+ $this->header('Location: '.sprintf($redirect, rawurlencode($json)));
+ return;
+ }
+ $this->head();
+ if ($this->get_server_var('HTTP_CONTENT_RANGE')) {
+ $files = isset($content[$this->options['param_name']]) ?
+ $content[$this->options['param_name']] : null;
+ if ($files && is_array($files) && is_object($files[0]) && $files[0]->size) {
+ $this->header('Range: 0-'.(
+ $this->fix_integer_overflow((int)$files[0]->size) - 1
+ ));
+ }
+ }
+ $this->body($json);
+ }
+ return $content;
+ }
+
+ public function get_response () {
+ return $this->response;
+ }
+
public function head() {
$this->header('Pragma: no-cache');
$this->header('Cache-Control: no-store, no-cache, must-revalidate');
@@ -1245,7 +1290,7 @@ class UploadHandler
}
public function get($print_response = true) {
- if ($print_response && isset($_GET['download'])) {
+ if ($print_response && $this->get_query_param('download')) {
return $this->download();
}
$file_name = $this->get_file_name_param();
@@ -1262,58 +1307,59 @@ class UploadHandler
}
public function post($print_response = true) {
- if (isset($_REQUEST['_method']) && $_REQUEST['_method'] === 'DELETE') {
+ if ($this->get_query_param('_method') === 'DELETE') {
return $this->delete($print_response);
}
- $upload = isset($_FILES[$this->options['param_name']]) ?
- $_FILES[$this->options['param_name']] : null;
+ $upload = $this->get_upload_data($this->options['param_name']);
// Parse the Content-Disposition header, if available:
- $file_name = $this->get_server_var('HTTP_CONTENT_DISPOSITION') ?
+ $content_disposition_header = $this->get_server_var('HTTP_CONTENT_DISPOSITION');
+ $file_name = $content_disposition_header ?
rawurldecode(preg_replace(
'/(^[^"]+")|("$)/',
'',
- $this->get_server_var('HTTP_CONTENT_DISPOSITION')
+ $content_disposition_header
)) : null;
// Parse the Content-Range header, which has the following form:
// Content-Range: bytes 0-524287/2000000
- $content_range = $this->get_server_var('HTTP_CONTENT_RANGE') ?
- preg_split('/[^0-9]+/', $this->get_server_var('HTTP_CONTENT_RANGE')) : null;
+ $content_range_header = $this->get_server_var('HTTP_CONTENT_RANGE');
+ $content_range = $content_range_header ?
+ preg_split('/[^0-9]+/', $content_range_header) : null;
$size = $content_range ? $content_range[3] : null;
$files = array();
- if ($upload && is_array($upload['tmp_name'])) {
- // param_name is an array identifier like "files[]",
- // $_FILES is a multi-dimensional array:
- foreach ($upload['tmp_name'] as $index => $value) {
+ if ($upload) {
+ if (is_array($upload['tmp_name'])) {
+ // param_name is an array identifier like "files[]",
+ // $upload is a multi-dimensional array:
+ foreach ($upload['tmp_name'] as $index => $value) {
+ $files[] = $this->handle_file_upload(
+ $upload['tmp_name'][$index],
+ $file_name ? $file_name : $upload['name'][$index],
+ $size ? $size : $upload['size'][$index],
+ $upload['type'][$index],
+ $upload['error'][$index],
+ $index,
+ $content_range
+ );
+ }
+ } else {
+ // param_name is a single object identifier like "file",
+ // $upload is a one-dimensional array:
$files[] = $this->handle_file_upload(
- $upload['tmp_name'][$index],
- $file_name ? $file_name : $upload['name'][$index],
- $size ? $size : $upload['size'][$index],
- $upload['type'][$index],
- $upload['error'][$index],
- $index,
+ isset($upload['tmp_name']) ? $upload['tmp_name'] : null,
+ $file_name ? $file_name : (isset($upload['name']) ?
+ $upload['name'] : null),
+ $size ? $size : (isset($upload['size']) ?
+ $upload['size'] : $this->get_server_var('CONTENT_LENGTH')),
+ isset($upload['type']) ?
+ $upload['type'] : $this->get_server_var('CONTENT_TYPE'),
+ isset($upload['error']) ? $upload['error'] : null,
+ null,
$content_range
);
}
- } else {
- // param_name is a single object identifier like "file",
- // $_FILES is a one-dimensional array:
- $files[] = $this->handle_file_upload(
- isset($upload['tmp_name']) ? $upload['tmp_name'] : null,
- $file_name ? $file_name : (isset($upload['name']) ?
- $upload['name'] : null),
- $size ? $size : (isset($upload['size']) ?
- $upload['size'] : $this->get_server_var('CONTENT_LENGTH')),
- isset($upload['type']) ?
- $upload['type'] : $this->get_server_var('CONTENT_TYPE'),
- isset($upload['error']) ? $upload['error'] : null,
- null,
- $content_range
- );
}
- return $this->generate_response(
- array($this->options['param_name'] => $files),
- $print_response
- );
+ $response = array($this->options['param_name'] => $files);
+ return $this->generate_response($response, $print_response);
}
public function delete($print_response = true) {
@@ -1322,11 +1368,11 @@ class UploadHandler
$file_names = array($this->get_file_name_param());
}
$response = array();
- foreach($file_names as $file_name) {
+ foreach ($file_names as $file_name) {
$file_path = $this->get_upload_path($file_name);
$success = is_file($file_path) && $file_name[0] !== '.' && unlink($file_path);
if ($success) {
- foreach($this->options['image_versions'] as $version => $options) {
+ foreach ($this->options['image_versions'] as $version => $options) {
if (!empty($version)) {
$file = $this->get_upload_path($file_name, $version);
if (is_file($file)) {
@@ -1340,4 +1386,8 @@ class UploadHandler
return $this->generate_response($response, $print_response);
}
+ protected function basename($filepath, $suffix = null) {
+ $splited = preg_split('/\//', rtrim ($filepath, '/ '));
+ return substr(basename('X'.$splited[count($splited)-1], $suffix), 1);
+ }
}
diff --git a/library/blueimp_upload/server/php/docker-compose.yml b/library/blueimp_upload/server/php/docker-compose.yml
new file mode 100644
index 000000000..691ea9caa
--- /dev/null
+++ b/library/blueimp_upload/server/php/docker-compose.yml
@@ -0,0 +1,6 @@
+apache:
+ build: ./
+ ports:
+ - "80:80"
+ volumes:
+ - "../../:/var/www/html"
diff --git a/library/blueimp_upload/server/php/files/.htaccess b/library/blueimp_upload/server/php/files/.htaccess
index 56689f0bb..6f454afb9 100644
--- a/library/blueimp_upload/server/php/files/.htaccess
+++ b/library/blueimp_upload/server/php/files/.htaccess
@@ -1,8 +1,16 @@
-# The following directives force the content-type application/octet-stream
-# and force browsers to display a download dialog for non-image files.
-# This prevents the execution of script files in the context of the website:
+# To enable the Headers module, execute the following command and reload Apache:
+# sudo a2enmod headers
+
+# The following directives prevent the execution of script files
+# in the context of the website.
+# They also force the content-type application/octet-stream and
+# force browsers to display a download dialog for non-image files.
+SetHandler default-handler
ForceType application/octet-stream
Header set Content-Disposition attachment
+
+# The following unsets the forced type and Content-Disposition headers
+# for known image files:
<FilesMatch "(?i)\.(gif|jpe?g|png)$">
ForceType none
Header unset Content-Disposition
diff --git a/library/blueimp_upload/server/php/index.php b/library/blueimp_upload/server/php/index.php
index 3ae1295ef..6caabb710 100644
--- a/library/blueimp_upload/server/php/index.php
+++ b/library/blueimp_upload/server/php/index.php
@@ -1,13 +1,13 @@
<?php
/*
- * jQuery File Upload Plugin PHP Example 5.14
+ * jQuery File Upload Plugin PHP Example
* https://github.com/blueimp/jQuery-File-Upload
*
* Copyright 2010, Sebastian Tschan
* https://blueimp.net
*
* Licensed under the MIT license:
- * http://www.opensource.org/licenses/MIT
+ * https://opensource.org/licenses/MIT
*/
error_reporting(E_ALL | E_STRICT);
diff --git a/library/blueimp_upload/test/index.html b/library/blueimp_upload/test/index.html
index a04e53433..4a9a6f328 100644
--- a/library/blueimp_upload/test/index.html
+++ b/library/blueimp_upload/test/index.html
@@ -1,14 +1,14 @@
<!DOCTYPE HTML>
<!--
/*
- * jQuery File Upload Plugin Test 9.1.0
+ * jQuery File Upload Plugin Test
* https://github.com/blueimp/jQuery-File-Upload
*
* Copyright 2010, Sebastian Tschan
* https://blueimp.net
*
* Licensed under the MIT license:
- * http://www.opensource.org/licenses/MIT
+ * https://opensource.org/licenses/MIT
*/
-->
<html lang="en">
@@ -20,7 +20,7 @@
<meta charset="utf-8">
<title>jQuery File Upload Plugin Test</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
-<link rel="stylesheet" href="http://codeorigin.jquery.com/qunit/qunit-1.14.0.css">
+<link rel="stylesheet" href="//codeorigin.jquery.com/qunit/qunit-1.14.0.css">
</head>
<body>
<h1 id="qunit-header">jQuery File Upload Plugin Test</h1>
@@ -36,20 +36,20 @@
<div class="col-lg-7">
<!-- The fileinput-button span is used to style the file input field as button -->
<span class="btn btn-success fileinput-button">
- <i class="fa-plus fa fa-inverse"></i>
+ <i class="icon-plus icon-white"></i>
<span>Add files...</span>
<input type="file" name="files[]" multiple>
</span>
<button type="submit" class="btn btn-primary start">
- <i class="fa-arrow-circle-o-up fa fa-inverse"></i>
+ <i class="icon-upload icon-white"></i>
<span>Start upload</span>
</button>
<button type="reset" class="btn btn-warning cancel">
- <i class="fa-ban fa fa-inverse"></i>
+ <i class="icon-ban-circle icon-white"></i>
<span>Cancel upload</span>
</button>
<button type="button" class="btn btn-danger delete">
- <i class="fa-trash-o fa fa-inverse"></i>
+ <i class="icon-trash icon-white"></i>
<span>Delete</span>
</button>
<input type="checkbox" class="toggle">
@@ -168,5 +168,5 @@ window.testUIWidget = $.blueimp.fileupload;
</script>
<script src="//code.jquery.com/qunit/qunit-1.15.0.js"></script>
<script src="test.js"></script>
-</body>
+</body>
</html>
diff --git a/library/blueimp_upload/test/test.js b/library/blueimp_upload/test/test.js
index 72d08d99e..452127567 100644
--- a/library/blueimp_upload/test/test.js
+++ b/library/blueimp_upload/test/test.js
@@ -1,12 +1,12 @@
/*
- * jQuery File Upload Plugin Test 9.4.0
+ * jQuery File Upload Plugin Test
* https://github.com/blueimp/jQuery-File-Upload
*
* Copyright 2010, Sebastian Tschan
* https://blueimp.net
*
* Licensed under the MIT license:
- * http://www.opensource.org/licenses/MIT
+ * https://opensource.org/licenses/MIT
*/
/* global $, QUnit, window, document, expect, module, test, asyncTest, start, ok, strictEqual, notStrictEqual */
@@ -83,7 +83,7 @@ $(function () {
});
test('Paste zone initialization', function () {
- ok($('#fileupload').fileupload()
+ ok($('#fileupload').fileupload({pasteZone: document})
.fileupload('option', 'pasteZone').length);
});
@@ -98,6 +98,7 @@ $(function () {
}
},
fu = $('#fileupload').fileupload({
+ pasteZone: document,
dragover: function () {
ok(true, 'Triggers dragover callback');
return false;
@@ -135,6 +136,7 @@ $(function () {
}
},
options = {
+ pasteZone: document,
dragover: function () {
ok(true, 'Triggers dragover callback');
return false;
@@ -178,6 +180,7 @@ $(function () {
}
},
fu = $('#fileupload').fileupload({
+ pasteZone: document,
dragover: function () {
ok(true, 'Triggers dragover callback');
return false;
@@ -221,6 +224,7 @@ $(function () {
}
},
fu = $('#fileupload').fileupload({
+ pasteZone: document,
dragover: function () {
ok(true, 'Triggers dragover callback');
return false;
diff --git a/library/bootstrap/css/bootstrap-grid.css b/library/bootstrap/css/bootstrap-grid.css
index 0bb960ecc..b5f77b27c 100644
--- a/library/bootstrap/css/bootstrap-grid.css
+++ b/library/bootstrap/css/bootstrap-grid.css
@@ -3,16 +3,14 @@
}
html {
- -webkit-box-sizing: border-box;
- box-sizing: border-box;
+ box-sizing: border-box;
-ms-overflow-style: scrollbar;
}
*,
*::before,
*::after {
- -webkit-box-sizing: inherit;
- box-sizing: inherit;
+ box-sizing: inherit;
}
.container {
@@ -20,61 +18,30 @@ html {
margin-left: auto;
padding-right: 15px;
padding-left: 15px;
+ width: 100%;
}
@media (min-width: 576px) {
.container {
- padding-right: 15px;
- padding-left: 15px;
- }
-}
-
-@media (min-width: 768px) {
- .container {
- padding-right: 15px;
- padding-left: 15px;
- }
-}
-
-@media (min-width: 992px) {
- .container {
- padding-right: 15px;
- padding-left: 15px;
- }
-}
-
-@media (min-width: 1200px) {
- .container {
- padding-right: 15px;
- padding-left: 15px;
- }
-}
-
-@media (min-width: 576px) {
- .container {
- width: 540px;
- max-width: 100%;
+ max-width: 540px;
}
}
@media (min-width: 768px) {
.container {
- width: 720px;
- max-width: 100%;
+ max-width: 720px;
}
}
@media (min-width: 992px) {
.container {
- width: 960px;
- max-width: 100%;
+ max-width: 960px;
}
}
@media (min-width: 1200px) {
.container {
- width: 1140px;
- max-width: 100%;
+ max-width: 1140px;
}
}
@@ -84,76 +51,18 @@ html {
margin-left: auto;
padding-right: 15px;
padding-left: 15px;
-}
-
-@media (min-width: 576px) {
- .container-fluid {
- padding-right: 15px;
- padding-left: 15px;
- }
-}
-
-@media (min-width: 768px) {
- .container-fluid {
- padding-right: 15px;
- padding-left: 15px;
- }
-}
-
-@media (min-width: 992px) {
- .container-fluid {
- padding-right: 15px;
- padding-left: 15px;
- }
-}
-
-@media (min-width: 1200px) {
- .container-fluid {
- padding-right: 15px;
- padding-left: 15px;
- }
+ width: 100%;
}
.row {
- display: -webkit-box;
- display: -webkit-flex;
display: -ms-flexbox;
display: flex;
- -webkit-flex-wrap: wrap;
- -ms-flex-wrap: wrap;
- flex-wrap: wrap;
+ -ms-flex-wrap: wrap;
+ flex-wrap: wrap;
margin-right: -15px;
margin-left: -15px;
}
-@media (min-width: 576px) {
- .row {
- margin-right: -15px;
- margin-left: -15px;
- }
-}
-
-@media (min-width: 768px) {
- .row {
- margin-right: -15px;
- margin-left: -15px;
- }
-}
-
-@media (min-width: 992px) {
- .row {
- margin-right: -15px;
- margin-left: -15px;
- }
-}
-
-@media (min-width: 1200px) {
- .row {
- margin-right: -15px;
- margin-left: -15px;
- }
-}
-
.no-gutters {
margin-right: 0;
margin-left: 0;
@@ -178,1905 +87,1267 @@ html {
padding-left: 15px;
}
-@media (min-width: 576px) {
- .col-1, .col-2, .col-3, .col-4, .col-5, .col-6, .col-7, .col-8, .col-9, .col-10, .col-11, .col-12, .col,
- .col-auto, .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, .col-sm,
- .col-sm-auto, .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, .col-md,
- .col-md-auto, .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, .col-lg,
- .col-lg-auto, .col-xl-1, .col-xl-2, .col-xl-3, .col-xl-4, .col-xl-5, .col-xl-6, .col-xl-7, .col-xl-8, .col-xl-9, .col-xl-10, .col-xl-11, .col-xl-12, .col-xl,
- .col-xl-auto {
- padding-right: 15px;
- padding-left: 15px;
- }
-}
-
-@media (min-width: 768px) {
- .col-1, .col-2, .col-3, .col-4, .col-5, .col-6, .col-7, .col-8, .col-9, .col-10, .col-11, .col-12, .col,
- .col-auto, .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, .col-sm,
- .col-sm-auto, .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, .col-md,
- .col-md-auto, .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, .col-lg,
- .col-lg-auto, .col-xl-1, .col-xl-2, .col-xl-3, .col-xl-4, .col-xl-5, .col-xl-6, .col-xl-7, .col-xl-8, .col-xl-9, .col-xl-10, .col-xl-11, .col-xl-12, .col-xl,
- .col-xl-auto {
- padding-right: 15px;
- padding-left: 15px;
- }
-}
-
-@media (min-width: 992px) {
- .col-1, .col-2, .col-3, .col-4, .col-5, .col-6, .col-7, .col-8, .col-9, .col-10, .col-11, .col-12, .col,
- .col-auto, .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, .col-sm,
- .col-sm-auto, .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, .col-md,
- .col-md-auto, .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, .col-lg,
- .col-lg-auto, .col-xl-1, .col-xl-2, .col-xl-3, .col-xl-4, .col-xl-5, .col-xl-6, .col-xl-7, .col-xl-8, .col-xl-9, .col-xl-10, .col-xl-11, .col-xl-12, .col-xl,
- .col-xl-auto {
- padding-right: 15px;
- padding-left: 15px;
- }
-}
-
-@media (min-width: 1200px) {
- .col-1, .col-2, .col-3, .col-4, .col-5, .col-6, .col-7, .col-8, .col-9, .col-10, .col-11, .col-12, .col,
- .col-auto, .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, .col-sm,
- .col-sm-auto, .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, .col-md,
- .col-md-auto, .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, .col-lg,
- .col-lg-auto, .col-xl-1, .col-xl-2, .col-xl-3, .col-xl-4, .col-xl-5, .col-xl-6, .col-xl-7, .col-xl-8, .col-xl-9, .col-xl-10, .col-xl-11, .col-xl-12, .col-xl,
- .col-xl-auto {
- padding-right: 15px;
- padding-left: 15px;
- }
-}
-
.col {
- -webkit-flex-basis: 0;
- -ms-flex-preferred-size: 0;
- flex-basis: 0;
- -webkit-box-flex: 1;
- -webkit-flex-grow: 1;
- -ms-flex-positive: 1;
- flex-grow: 1;
+ -ms-flex-preferred-size: 0;
+ flex-basis: 0;
+ -ms-flex-positive: 1;
+ flex-grow: 1;
max-width: 100%;
}
.col-auto {
- -webkit-box-flex: 0;
- -webkit-flex: 0 0 auto;
- -ms-flex: 0 0 auto;
- flex: 0 0 auto;
+ -ms-flex: 0 0 auto;
+ flex: 0 0 auto;
width: auto;
+ max-width: none;
}
.col-1 {
- width: 8.333333%;
+ -ms-flex: 0 0 8.333333%;
+ flex: 0 0 8.333333%;
+ max-width: 8.333333%;
}
.col-2 {
- width: 16.666667%;
+ -ms-flex: 0 0 16.666667%;
+ flex: 0 0 16.666667%;
+ max-width: 16.666667%;
}
.col-3 {
- width: 25%;
+ -ms-flex: 0 0 25%;
+ flex: 0 0 25%;
+ max-width: 25%;
}
.col-4 {
- width: 33.333333%;
+ -ms-flex: 0 0 33.333333%;
+ flex: 0 0 33.333333%;
+ max-width: 33.333333%;
}
.col-5 {
- width: 41.666667%;
+ -ms-flex: 0 0 41.666667%;
+ flex: 0 0 41.666667%;
+ max-width: 41.666667%;
}
.col-6 {
- width: 50%;
+ -ms-flex: 0 0 50%;
+ flex: 0 0 50%;
+ max-width: 50%;
}
.col-7 {
- width: 58.333333%;
+ -ms-flex: 0 0 58.333333%;
+ flex: 0 0 58.333333%;
+ max-width: 58.333333%;
}
.col-8 {
- width: 66.666667%;
+ -ms-flex: 0 0 66.666667%;
+ flex: 0 0 66.666667%;
+ max-width: 66.666667%;
}
.col-9 {
- width: 75%;
+ -ms-flex: 0 0 75%;
+ flex: 0 0 75%;
+ max-width: 75%;
}
.col-10 {
- width: 83.333333%;
+ -ms-flex: 0 0 83.333333%;
+ flex: 0 0 83.333333%;
+ max-width: 83.333333%;
}
.col-11 {
- width: 91.666667%;
+ -ms-flex: 0 0 91.666667%;
+ flex: 0 0 91.666667%;
+ max-width: 91.666667%;
}
.col-12 {
- width: 100%;
-}
-
-.pull-0 {
- right: auto;
-}
-
-.pull-1 {
- right: 8.333333%;
-}
-
-.pull-2 {
- right: 16.666667%;
-}
-
-.pull-3 {
- right: 25%;
-}
-
-.pull-4 {
- right: 33.333333%;
-}
-
-.pull-5 {
- right: 41.666667%;
-}
-
-.pull-6 {
- right: 50%;
-}
-
-.pull-7 {
- right: 58.333333%;
-}
-
-.pull-8 {
- right: 66.666667%;
-}
-
-.pull-9 {
- right: 75%;
-}
-
-.pull-10 {
- right: 83.333333%;
-}
-
-.pull-11 {
- right: 91.666667%;
-}
-
-.pull-12 {
- right: 100%;
-}
-
-.push-0 {
- left: auto;
-}
-
-.push-1 {
- left: 8.333333%;
-}
-
-.push-2 {
- left: 16.666667%;
-}
-
-.push-3 {
- left: 25%;
-}
-
-.push-4 {
- left: 33.333333%;
-}
-
-.push-5 {
- left: 41.666667%;
-}
-
-.push-6 {
- left: 50%;
-}
-
-.push-7 {
- left: 58.333333%;
-}
-
-.push-8 {
- left: 66.666667%;
-}
-
-.push-9 {
- left: 75%;
-}
-
-.push-10 {
- left: 83.333333%;
-}
-
-.push-11 {
- left: 91.666667%;
+ -ms-flex: 0 0 100%;
+ flex: 0 0 100%;
+ max-width: 100%;
}
-.push-12 {
- left: 100%;
+.order-1 {
+ -ms-flex-order: 1;
+ order: 1;
}
-.offset-1 {
- margin-left: 8.333333%;
+.order-2 {
+ -ms-flex-order: 2;
+ order: 2;
}
-.offset-2 {
- margin-left: 16.666667%;
+.order-3 {
+ -ms-flex-order: 3;
+ order: 3;
}
-.offset-3 {
- margin-left: 25%;
+.order-4 {
+ -ms-flex-order: 4;
+ order: 4;
}
-.offset-4 {
- margin-left: 33.333333%;
+.order-5 {
+ -ms-flex-order: 5;
+ order: 5;
}
-.offset-5 {
- margin-left: 41.666667%;
+.order-6 {
+ -ms-flex-order: 6;
+ order: 6;
}
-.offset-6 {
- margin-left: 50%;
+.order-7 {
+ -ms-flex-order: 7;
+ order: 7;
}
-.offset-7 {
- margin-left: 58.333333%;
+.order-8 {
+ -ms-flex-order: 8;
+ order: 8;
}
-.offset-8 {
- margin-left: 66.666667%;
+.order-9 {
+ -ms-flex-order: 9;
+ order: 9;
}
-.offset-9 {
- margin-left: 75%;
+.order-10 {
+ -ms-flex-order: 10;
+ order: 10;
}
-.offset-10 {
- margin-left: 83.333333%;
+.order-11 {
+ -ms-flex-order: 11;
+ order: 11;
}
-.offset-11 {
- margin-left: 91.666667%;
+.order-12 {
+ -ms-flex-order: 12;
+ order: 12;
}
@media (min-width: 576px) {
.col-sm {
- -webkit-flex-basis: 0;
- -ms-flex-preferred-size: 0;
- flex-basis: 0;
- -webkit-box-flex: 1;
- -webkit-flex-grow: 1;
- -ms-flex-positive: 1;
- flex-grow: 1;
+ -ms-flex-preferred-size: 0;
+ flex-basis: 0;
+ -ms-flex-positive: 1;
+ flex-grow: 1;
max-width: 100%;
}
.col-sm-auto {
- -webkit-box-flex: 0;
- -webkit-flex: 0 0 auto;
- -ms-flex: 0 0 auto;
- flex: 0 0 auto;
+ -ms-flex: 0 0 auto;
+ flex: 0 0 auto;
width: auto;
+ max-width: none;
}
.col-sm-1 {
- width: 8.333333%;
+ -ms-flex: 0 0 8.333333%;
+ flex: 0 0 8.333333%;
+ max-width: 8.333333%;
}
.col-sm-2 {
- width: 16.666667%;
+ -ms-flex: 0 0 16.666667%;
+ flex: 0 0 16.666667%;
+ max-width: 16.666667%;
}
.col-sm-3 {
- width: 25%;
+ -ms-flex: 0 0 25%;
+ flex: 0 0 25%;
+ max-width: 25%;
}
.col-sm-4 {
- width: 33.333333%;
+ -ms-flex: 0 0 33.333333%;
+ flex: 0 0 33.333333%;
+ max-width: 33.333333%;
}
.col-sm-5 {
- width: 41.666667%;
+ -ms-flex: 0 0 41.666667%;
+ flex: 0 0 41.666667%;
+ max-width: 41.666667%;
}
.col-sm-6 {
- width: 50%;
+ -ms-flex: 0 0 50%;
+ flex: 0 0 50%;
+ max-width: 50%;
}
.col-sm-7 {
- width: 58.333333%;
+ -ms-flex: 0 0 58.333333%;
+ flex: 0 0 58.333333%;
+ max-width: 58.333333%;
}
.col-sm-8 {
- width: 66.666667%;
+ -ms-flex: 0 0 66.666667%;
+ flex: 0 0 66.666667%;
+ max-width: 66.666667%;
}
.col-sm-9 {
- width: 75%;
+ -ms-flex: 0 0 75%;
+ flex: 0 0 75%;
+ max-width: 75%;
}
.col-sm-10 {
- width: 83.333333%;
+ -ms-flex: 0 0 83.333333%;
+ flex: 0 0 83.333333%;
+ max-width: 83.333333%;
}
.col-sm-11 {
- width: 91.666667%;
+ -ms-flex: 0 0 91.666667%;
+ flex: 0 0 91.666667%;
+ max-width: 91.666667%;
}
.col-sm-12 {
- width: 100%;
- }
- .pull-sm-0 {
- right: auto;
- }
- .pull-sm-1 {
- right: 8.333333%;
- }
- .pull-sm-2 {
- right: 16.666667%;
- }
- .pull-sm-3 {
- right: 25%;
- }
- .pull-sm-4 {
- right: 33.333333%;
- }
- .pull-sm-5 {
- right: 41.666667%;
- }
- .pull-sm-6 {
- right: 50%;
- }
- .pull-sm-7 {
- right: 58.333333%;
- }
- .pull-sm-8 {
- right: 66.666667%;
- }
- .pull-sm-9 {
- right: 75%;
- }
- .pull-sm-10 {
- right: 83.333333%;
- }
- .pull-sm-11 {
- right: 91.666667%;
- }
- .pull-sm-12 {
- right: 100%;
- }
- .push-sm-0 {
- left: auto;
- }
- .push-sm-1 {
- left: 8.333333%;
- }
- .push-sm-2 {
- left: 16.666667%;
- }
- .push-sm-3 {
- left: 25%;
- }
- .push-sm-4 {
- left: 33.333333%;
- }
- .push-sm-5 {
- left: 41.666667%;
- }
- .push-sm-6 {
- left: 50%;
- }
- .push-sm-7 {
- left: 58.333333%;
- }
- .push-sm-8 {
- left: 66.666667%;
- }
- .push-sm-9 {
- left: 75%;
- }
- .push-sm-10 {
- left: 83.333333%;
- }
- .push-sm-11 {
- left: 91.666667%;
- }
- .push-sm-12 {
- left: 100%;
+ -ms-flex: 0 0 100%;
+ flex: 0 0 100%;
+ max-width: 100%;
}
- .offset-sm-0 {
- margin-left: 0%;
+ .order-sm-1 {
+ -ms-flex-order: 1;
+ order: 1;
}
- .offset-sm-1 {
- margin-left: 8.333333%;
+ .order-sm-2 {
+ -ms-flex-order: 2;
+ order: 2;
}
- .offset-sm-2 {
- margin-left: 16.666667%;
+ .order-sm-3 {
+ -ms-flex-order: 3;
+ order: 3;
}
- .offset-sm-3 {
- margin-left: 25%;
+ .order-sm-4 {
+ -ms-flex-order: 4;
+ order: 4;
}
- .offset-sm-4 {
- margin-left: 33.333333%;
+ .order-sm-5 {
+ -ms-flex-order: 5;
+ order: 5;
}
- .offset-sm-5 {
- margin-left: 41.666667%;
+ .order-sm-6 {
+ -ms-flex-order: 6;
+ order: 6;
}
- .offset-sm-6 {
- margin-left: 50%;
+ .order-sm-7 {
+ -ms-flex-order: 7;
+ order: 7;
}
- .offset-sm-7 {
- margin-left: 58.333333%;
+ .order-sm-8 {
+ -ms-flex-order: 8;
+ order: 8;
}
- .offset-sm-8 {
- margin-left: 66.666667%;
+ .order-sm-9 {
+ -ms-flex-order: 9;
+ order: 9;
}
- .offset-sm-9 {
- margin-left: 75%;
+ .order-sm-10 {
+ -ms-flex-order: 10;
+ order: 10;
}
- .offset-sm-10 {
- margin-left: 83.333333%;
+ .order-sm-11 {
+ -ms-flex-order: 11;
+ order: 11;
}
- .offset-sm-11 {
- margin-left: 91.666667%;
+ .order-sm-12 {
+ -ms-flex-order: 12;
+ order: 12;
}
}
@media (min-width: 768px) {
.col-md {
- -webkit-flex-basis: 0;
- -ms-flex-preferred-size: 0;
- flex-basis: 0;
- -webkit-box-flex: 1;
- -webkit-flex-grow: 1;
- -ms-flex-positive: 1;
- flex-grow: 1;
+ -ms-flex-preferred-size: 0;
+ flex-basis: 0;
+ -ms-flex-positive: 1;
+ flex-grow: 1;
max-width: 100%;
}
.col-md-auto {
- -webkit-box-flex: 0;
- -webkit-flex: 0 0 auto;
- -ms-flex: 0 0 auto;
- flex: 0 0 auto;
+ -ms-flex: 0 0 auto;
+ flex: 0 0 auto;
width: auto;
+ max-width: none;
}
.col-md-1 {
- width: 8.333333%;
+ -ms-flex: 0 0 8.333333%;
+ flex: 0 0 8.333333%;
+ max-width: 8.333333%;
}
.col-md-2 {
- width: 16.666667%;
+ -ms-flex: 0 0 16.666667%;
+ flex: 0 0 16.666667%;
+ max-width: 16.666667%;
}
.col-md-3 {
- width: 25%;
+ -ms-flex: 0 0 25%;
+ flex: 0 0 25%;
+ max-width: 25%;
}
.col-md-4 {
- width: 33.333333%;
+ -ms-flex: 0 0 33.333333%;
+ flex: 0 0 33.333333%;
+ max-width: 33.333333%;
}
.col-md-5 {
- width: 41.666667%;
+ -ms-flex: 0 0 41.666667%;
+ flex: 0 0 41.666667%;
+ max-width: 41.666667%;
}
.col-md-6 {
- width: 50%;
+ -ms-flex: 0 0 50%;
+ flex: 0 0 50%;
+ max-width: 50%;
}
.col-md-7 {
- width: 58.333333%;
+ -ms-flex: 0 0 58.333333%;
+ flex: 0 0 58.333333%;
+ max-width: 58.333333%;
}
.col-md-8 {
- width: 66.666667%;
+ -ms-flex: 0 0 66.666667%;
+ flex: 0 0 66.666667%;
+ max-width: 66.666667%;
}
.col-md-9 {
- width: 75%;
+ -ms-flex: 0 0 75%;
+ flex: 0 0 75%;
+ max-width: 75%;
}
.col-md-10 {
- width: 83.333333%;
+ -ms-flex: 0 0 83.333333%;
+ flex: 0 0 83.333333%;
+ max-width: 83.333333%;
}
.col-md-11 {
- width: 91.666667%;
+ -ms-flex: 0 0 91.666667%;
+ flex: 0 0 91.666667%;
+ max-width: 91.666667%;
}
.col-md-12 {
- width: 100%;
- }
- .pull-md-0 {
- right: auto;
- }
- .pull-md-1 {
- right: 8.333333%;
- }
- .pull-md-2 {
- right: 16.666667%;
- }
- .pull-md-3 {
- right: 25%;
- }
- .pull-md-4 {
- right: 33.333333%;
- }
- .pull-md-5 {
- right: 41.666667%;
- }
- .pull-md-6 {
- right: 50%;
- }
- .pull-md-7 {
- right: 58.333333%;
- }
- .pull-md-8 {
- right: 66.666667%;
- }
- .pull-md-9 {
- right: 75%;
- }
- .pull-md-10 {
- right: 83.333333%;
- }
- .pull-md-11 {
- right: 91.666667%;
- }
- .pull-md-12 {
- right: 100%;
- }
- .push-md-0 {
- left: auto;
- }
- .push-md-1 {
- left: 8.333333%;
- }
- .push-md-2 {
- left: 16.666667%;
- }
- .push-md-3 {
- left: 25%;
- }
- .push-md-4 {
- left: 33.333333%;
- }
- .push-md-5 {
- left: 41.666667%;
- }
- .push-md-6 {
- left: 50%;
- }
- .push-md-7 {
- left: 58.333333%;
- }
- .push-md-8 {
- left: 66.666667%;
- }
- .push-md-9 {
- left: 75%;
- }
- .push-md-10 {
- left: 83.333333%;
- }
- .push-md-11 {
- left: 91.666667%;
- }
- .push-md-12 {
- left: 100%;
+ -ms-flex: 0 0 100%;
+ flex: 0 0 100%;
+ max-width: 100%;
}
- .offset-md-0 {
- margin-left: 0%;
+ .order-md-1 {
+ -ms-flex-order: 1;
+ order: 1;
}
- .offset-md-1 {
- margin-left: 8.333333%;
+ .order-md-2 {
+ -ms-flex-order: 2;
+ order: 2;
}
- .offset-md-2 {
- margin-left: 16.666667%;
+ .order-md-3 {
+ -ms-flex-order: 3;
+ order: 3;
}
- .offset-md-3 {
- margin-left: 25%;
+ .order-md-4 {
+ -ms-flex-order: 4;
+ order: 4;
}
- .offset-md-4 {
- margin-left: 33.333333%;
+ .order-md-5 {
+ -ms-flex-order: 5;
+ order: 5;
}
- .offset-md-5 {
- margin-left: 41.666667%;
+ .order-md-6 {
+ -ms-flex-order: 6;
+ order: 6;
}
- .offset-md-6 {
- margin-left: 50%;
+ .order-md-7 {
+ -ms-flex-order: 7;
+ order: 7;
}
- .offset-md-7 {
- margin-left: 58.333333%;
+ .order-md-8 {
+ -ms-flex-order: 8;
+ order: 8;
}
- .offset-md-8 {
- margin-left: 66.666667%;
+ .order-md-9 {
+ -ms-flex-order: 9;
+ order: 9;
}
- .offset-md-9 {
- margin-left: 75%;
+ .order-md-10 {
+ -ms-flex-order: 10;
+ order: 10;
}
- .offset-md-10 {
- margin-left: 83.333333%;
+ .order-md-11 {
+ -ms-flex-order: 11;
+ order: 11;
}
- .offset-md-11 {
- margin-left: 91.666667%;
+ .order-md-12 {
+ -ms-flex-order: 12;
+ order: 12;
}
}
@media (min-width: 992px) {
.col-lg {
- -webkit-flex-basis: 0;
- -ms-flex-preferred-size: 0;
- flex-basis: 0;
- -webkit-box-flex: 1;
- -webkit-flex-grow: 1;
- -ms-flex-positive: 1;
- flex-grow: 1;
+ -ms-flex-preferred-size: 0;
+ flex-basis: 0;
+ -ms-flex-positive: 1;
+ flex-grow: 1;
max-width: 100%;
}
.col-lg-auto {
- -webkit-box-flex: 0;
- -webkit-flex: 0 0 auto;
- -ms-flex: 0 0 auto;
- flex: 0 0 auto;
+ -ms-flex: 0 0 auto;
+ flex: 0 0 auto;
width: auto;
+ max-width: none;
}
.col-lg-1 {
- width: 8.333333%;
+ -ms-flex: 0 0 8.333333%;
+ flex: 0 0 8.333333%;
+ max-width: 8.333333%;
}
.col-lg-2 {
- width: 16.666667%;
+ -ms-flex: 0 0 16.666667%;
+ flex: 0 0 16.666667%;
+ max-width: 16.666667%;
}
.col-lg-3 {
- width: 25%;
+ -ms-flex: 0 0 25%;
+ flex: 0 0 25%;
+ max-width: 25%;
}
.col-lg-4 {
- width: 33.333333%;
+ -ms-flex: 0 0 33.333333%;
+ flex: 0 0 33.333333%;
+ max-width: 33.333333%;
}
.col-lg-5 {
- width: 41.666667%;
+ -ms-flex: 0 0 41.666667%;
+ flex: 0 0 41.666667%;
+ max-width: 41.666667%;
}
.col-lg-6 {
- width: 50%;
+ -ms-flex: 0 0 50%;
+ flex: 0 0 50%;
+ max-width: 50%;
}
.col-lg-7 {
- width: 58.333333%;
+ -ms-flex: 0 0 58.333333%;
+ flex: 0 0 58.333333%;
+ max-width: 58.333333%;
}
.col-lg-8 {
- width: 66.666667%;
+ -ms-flex: 0 0 66.666667%;
+ flex: 0 0 66.666667%;
+ max-width: 66.666667%;
}
.col-lg-9 {
- width: 75%;
+ -ms-flex: 0 0 75%;
+ flex: 0 0 75%;
+ max-width: 75%;
}
.col-lg-10 {
- width: 83.333333%;
+ -ms-flex: 0 0 83.333333%;
+ flex: 0 0 83.333333%;
+ max-width: 83.333333%;
}
.col-lg-11 {
- width: 91.666667%;
+ -ms-flex: 0 0 91.666667%;
+ flex: 0 0 91.666667%;
+ max-width: 91.666667%;
}
.col-lg-12 {
- width: 100%;
- }
- .pull-lg-0 {
- right: auto;
- }
- .pull-lg-1 {
- right: 8.333333%;
- }
- .pull-lg-2 {
- right: 16.666667%;
- }
- .pull-lg-3 {
- right: 25%;
- }
- .pull-lg-4 {
- right: 33.333333%;
- }
- .pull-lg-5 {
- right: 41.666667%;
- }
- .pull-lg-6 {
- right: 50%;
- }
- .pull-lg-7 {
- right: 58.333333%;
- }
- .pull-lg-8 {
- right: 66.666667%;
- }
- .pull-lg-9 {
- right: 75%;
- }
- .pull-lg-10 {
- right: 83.333333%;
- }
- .pull-lg-11 {
- right: 91.666667%;
- }
- .pull-lg-12 {
- right: 100%;
- }
- .push-lg-0 {
- left: auto;
- }
- .push-lg-1 {
- left: 8.333333%;
- }
- .push-lg-2 {
- left: 16.666667%;
- }
- .push-lg-3 {
- left: 25%;
- }
- .push-lg-4 {
- left: 33.333333%;
- }
- .push-lg-5 {
- left: 41.666667%;
- }
- .push-lg-6 {
- left: 50%;
- }
- .push-lg-7 {
- left: 58.333333%;
- }
- .push-lg-8 {
- left: 66.666667%;
- }
- .push-lg-9 {
- left: 75%;
- }
- .push-lg-10 {
- left: 83.333333%;
- }
- .push-lg-11 {
- left: 91.666667%;
- }
- .push-lg-12 {
- left: 100%;
+ -ms-flex: 0 0 100%;
+ flex: 0 0 100%;
+ max-width: 100%;
}
- .offset-lg-0 {
- margin-left: 0%;
+ .order-lg-1 {
+ -ms-flex-order: 1;
+ order: 1;
}
- .offset-lg-1 {
- margin-left: 8.333333%;
+ .order-lg-2 {
+ -ms-flex-order: 2;
+ order: 2;
}
- .offset-lg-2 {
- margin-left: 16.666667%;
+ .order-lg-3 {
+ -ms-flex-order: 3;
+ order: 3;
}
- .offset-lg-3 {
- margin-left: 25%;
+ .order-lg-4 {
+ -ms-flex-order: 4;
+ order: 4;
}
- .offset-lg-4 {
- margin-left: 33.333333%;
+ .order-lg-5 {
+ -ms-flex-order: 5;
+ order: 5;
}
- .offset-lg-5 {
- margin-left: 41.666667%;
+ .order-lg-6 {
+ -ms-flex-order: 6;
+ order: 6;
}
- .offset-lg-6 {
- margin-left: 50%;
+ .order-lg-7 {
+ -ms-flex-order: 7;
+ order: 7;
}
- .offset-lg-7 {
- margin-left: 58.333333%;
+ .order-lg-8 {
+ -ms-flex-order: 8;
+ order: 8;
}
- .offset-lg-8 {
- margin-left: 66.666667%;
+ .order-lg-9 {
+ -ms-flex-order: 9;
+ order: 9;
}
- .offset-lg-9 {
- margin-left: 75%;
+ .order-lg-10 {
+ -ms-flex-order: 10;
+ order: 10;
}
- .offset-lg-10 {
- margin-left: 83.333333%;
+ .order-lg-11 {
+ -ms-flex-order: 11;
+ order: 11;
}
- .offset-lg-11 {
- margin-left: 91.666667%;
+ .order-lg-12 {
+ -ms-flex-order: 12;
+ order: 12;
}
}
@media (min-width: 1200px) {
.col-xl {
- -webkit-flex-basis: 0;
- -ms-flex-preferred-size: 0;
- flex-basis: 0;
- -webkit-box-flex: 1;
- -webkit-flex-grow: 1;
- -ms-flex-positive: 1;
- flex-grow: 1;
+ -ms-flex-preferred-size: 0;
+ flex-basis: 0;
+ -ms-flex-positive: 1;
+ flex-grow: 1;
max-width: 100%;
}
.col-xl-auto {
- -webkit-box-flex: 0;
- -webkit-flex: 0 0 auto;
- -ms-flex: 0 0 auto;
- flex: 0 0 auto;
+ -ms-flex: 0 0 auto;
+ flex: 0 0 auto;
width: auto;
+ max-width: none;
}
.col-xl-1 {
- width: 8.333333%;
+ -ms-flex: 0 0 8.333333%;
+ flex: 0 0 8.333333%;
+ max-width: 8.333333%;
}
.col-xl-2 {
- width: 16.666667%;
+ -ms-flex: 0 0 16.666667%;
+ flex: 0 0 16.666667%;
+ max-width: 16.666667%;
}
.col-xl-3 {
- width: 25%;
+ -ms-flex: 0 0 25%;
+ flex: 0 0 25%;
+ max-width: 25%;
}
.col-xl-4 {
- width: 33.333333%;
+ -ms-flex: 0 0 33.333333%;
+ flex: 0 0 33.333333%;
+ max-width: 33.333333%;
}
.col-xl-5 {
- width: 41.666667%;
+ -ms-flex: 0 0 41.666667%;
+ flex: 0 0 41.666667%;
+ max-width: 41.666667%;
}
.col-xl-6 {
- width: 50%;
+ -ms-flex: 0 0 50%;
+ flex: 0 0 50%;
+ max-width: 50%;
}
.col-xl-7 {
- width: 58.333333%;
+ -ms-flex: 0 0 58.333333%;
+ flex: 0 0 58.333333%;
+ max-width: 58.333333%;
}
.col-xl-8 {
- width: 66.666667%;
+ -ms-flex: 0 0 66.666667%;
+ flex: 0 0 66.666667%;
+ max-width: 66.666667%;
}
.col-xl-9 {
- width: 75%;
+ -ms-flex: 0 0 75%;
+ flex: 0 0 75%;
+ max-width: 75%;
}
.col-xl-10 {
- width: 83.333333%;
+ -ms-flex: 0 0 83.333333%;
+ flex: 0 0 83.333333%;
+ max-width: 83.333333%;
}
.col-xl-11 {
- width: 91.666667%;
+ -ms-flex: 0 0 91.666667%;
+ flex: 0 0 91.666667%;
+ max-width: 91.666667%;
}
.col-xl-12 {
- width: 100%;
- }
- .pull-xl-0 {
- right: auto;
- }
- .pull-xl-1 {
- right: 8.333333%;
- }
- .pull-xl-2 {
- right: 16.666667%;
- }
- .pull-xl-3 {
- right: 25%;
- }
- .pull-xl-4 {
- right: 33.333333%;
- }
- .pull-xl-5 {
- right: 41.666667%;
- }
- .pull-xl-6 {
- right: 50%;
- }
- .pull-xl-7 {
- right: 58.333333%;
- }
- .pull-xl-8 {
- right: 66.666667%;
- }
- .pull-xl-9 {
- right: 75%;
- }
- .pull-xl-10 {
- right: 83.333333%;
- }
- .pull-xl-11 {
- right: 91.666667%;
- }
- .pull-xl-12 {
- right: 100%;
- }
- .push-xl-0 {
- left: auto;
- }
- .push-xl-1 {
- left: 8.333333%;
- }
- .push-xl-2 {
- left: 16.666667%;
- }
- .push-xl-3 {
- left: 25%;
- }
- .push-xl-4 {
- left: 33.333333%;
- }
- .push-xl-5 {
- left: 41.666667%;
- }
- .push-xl-6 {
- left: 50%;
- }
- .push-xl-7 {
- left: 58.333333%;
- }
- .push-xl-8 {
- left: 66.666667%;
- }
- .push-xl-9 {
- left: 75%;
- }
- .push-xl-10 {
- left: 83.333333%;
- }
- .push-xl-11 {
- left: 91.666667%;
- }
- .push-xl-12 {
- left: 100%;
+ -ms-flex: 0 0 100%;
+ flex: 0 0 100%;
+ max-width: 100%;
}
- .offset-xl-0 {
- margin-left: 0%;
+ .order-xl-1 {
+ -ms-flex-order: 1;
+ order: 1;
}
- .offset-xl-1 {
- margin-left: 8.333333%;
+ .order-xl-2 {
+ -ms-flex-order: 2;
+ order: 2;
}
- .offset-xl-2 {
- margin-left: 16.666667%;
+ .order-xl-3 {
+ -ms-flex-order: 3;
+ order: 3;
}
- .offset-xl-3 {
- margin-left: 25%;
+ .order-xl-4 {
+ -ms-flex-order: 4;
+ order: 4;
}
- .offset-xl-4 {
- margin-left: 33.333333%;
+ .order-xl-5 {
+ -ms-flex-order: 5;
+ order: 5;
}
- .offset-xl-5 {
- margin-left: 41.666667%;
+ .order-xl-6 {
+ -ms-flex-order: 6;
+ order: 6;
}
- .offset-xl-6 {
- margin-left: 50%;
+ .order-xl-7 {
+ -ms-flex-order: 7;
+ order: 7;
}
- .offset-xl-7 {
- margin-left: 58.333333%;
+ .order-xl-8 {
+ -ms-flex-order: 8;
+ order: 8;
}
- .offset-xl-8 {
- margin-left: 66.666667%;
+ .order-xl-9 {
+ -ms-flex-order: 9;
+ order: 9;
}
- .offset-xl-9 {
- margin-left: 75%;
+ .order-xl-10 {
+ -ms-flex-order: 10;
+ order: 10;
}
- .offset-xl-10 {
- margin-left: 83.333333%;
+ .order-xl-11 {
+ -ms-flex-order: 11;
+ order: 11;
}
- .offset-xl-11 {
- margin-left: 91.666667%;
+ .order-xl-12 {
+ -ms-flex-order: 12;
+ order: 12;
}
}
-.order-first {
- -webkit-box-ordinal-group: 0;
- -webkit-order: -1;
- -ms-flex-order: -1;
- order: -1;
-}
-
-.order-last {
- -webkit-box-ordinal-group: 2;
- -webkit-order: 1;
- -ms-flex-order: 1;
- order: 1;
-}
-
-.order-0 {
- -webkit-box-ordinal-group: 1;
- -webkit-order: 0;
- -ms-flex-order: 0;
- order: 0;
-}
-
.flex-row {
- -webkit-box-orient: horizontal !important;
- -webkit-box-direction: normal !important;
- -webkit-flex-direction: row !important;
- -ms-flex-direction: row !important;
- flex-direction: row !important;
+ -ms-flex-direction: row !important;
+ flex-direction: row !important;
}
.flex-column {
- -webkit-box-orient: vertical !important;
- -webkit-box-direction: normal !important;
- -webkit-flex-direction: column !important;
- -ms-flex-direction: column !important;
- flex-direction: column !important;
+ -ms-flex-direction: column !important;
+ flex-direction: column !important;
}
.flex-row-reverse {
- -webkit-box-orient: horizontal !important;
- -webkit-box-direction: reverse !important;
- -webkit-flex-direction: row-reverse !important;
- -ms-flex-direction: row-reverse !important;
- flex-direction: row-reverse !important;
+ -ms-flex-direction: row-reverse !important;
+ flex-direction: row-reverse !important;
}
.flex-column-reverse {
- -webkit-box-orient: vertical !important;
- -webkit-box-direction: reverse !important;
- -webkit-flex-direction: column-reverse !important;
- -ms-flex-direction: column-reverse !important;
- flex-direction: column-reverse !important;
+ -ms-flex-direction: column-reverse !important;
+ flex-direction: column-reverse !important;
}
.flex-wrap {
- -webkit-flex-wrap: wrap !important;
- -ms-flex-wrap: wrap !important;
- flex-wrap: wrap !important;
+ -ms-flex-wrap: wrap !important;
+ flex-wrap: wrap !important;
}
.flex-nowrap {
- -webkit-flex-wrap: nowrap !important;
- -ms-flex-wrap: nowrap !important;
- flex-wrap: nowrap !important;
+ -ms-flex-wrap: nowrap !important;
+ flex-wrap: nowrap !important;
}
.flex-wrap-reverse {
- -webkit-flex-wrap: wrap-reverse !important;
- -ms-flex-wrap: wrap-reverse !important;
- flex-wrap: wrap-reverse !important;
+ -ms-flex-wrap: wrap-reverse !important;
+ flex-wrap: wrap-reverse !important;
}
.justify-content-start {
- -webkit-box-pack: start !important;
- -webkit-justify-content: flex-start !important;
- -ms-flex-pack: start !important;
- justify-content: flex-start !important;
+ -ms-flex-pack: start !important;
+ justify-content: flex-start !important;
}
.justify-content-end {
- -webkit-box-pack: end !important;
- -webkit-justify-content: flex-end !important;
- -ms-flex-pack: end !important;
- justify-content: flex-end !important;
+ -ms-flex-pack: end !important;
+ justify-content: flex-end !important;
}
.justify-content-center {
- -webkit-box-pack: center !important;
- -webkit-justify-content: center !important;
- -ms-flex-pack: center !important;
- justify-content: center !important;
+ -ms-flex-pack: center !important;
+ justify-content: center !important;
}
.justify-content-between {
- -webkit-box-pack: justify !important;
- -webkit-justify-content: space-between !important;
- -ms-flex-pack: justify !important;
- justify-content: space-between !important;
+ -ms-flex-pack: justify !important;
+ justify-content: space-between !important;
}
.justify-content-around {
- -webkit-justify-content: space-around !important;
- -ms-flex-pack: distribute !important;
- justify-content: space-around !important;
+ -ms-flex-pack: distribute !important;
+ justify-content: space-around !important;
}
.align-items-start {
- -webkit-box-align: start !important;
- -webkit-align-items: flex-start !important;
- -ms-flex-align: start !important;
- align-items: flex-start !important;
+ -ms-flex-align: start !important;
+ align-items: flex-start !important;
}
.align-items-end {
- -webkit-box-align: end !important;
- -webkit-align-items: flex-end !important;
- -ms-flex-align: end !important;
- align-items: flex-end !important;
+ -ms-flex-align: end !important;
+ align-items: flex-end !important;
}
.align-items-center {
- -webkit-box-align: center !important;
- -webkit-align-items: center !important;
- -ms-flex-align: center !important;
- align-items: center !important;
+ -ms-flex-align: center !important;
+ align-items: center !important;
}
.align-items-baseline {
- -webkit-box-align: baseline !important;
- -webkit-align-items: baseline !important;
- -ms-flex-align: baseline !important;
- align-items: baseline !important;
+ -ms-flex-align: baseline !important;
+ align-items: baseline !important;
}
.align-items-stretch {
- -webkit-box-align: stretch !important;
- -webkit-align-items: stretch !important;
- -ms-flex-align: stretch !important;
- align-items: stretch !important;
+ -ms-flex-align: stretch !important;
+ align-items: stretch !important;
}
.align-content-start {
- -webkit-align-content: flex-start !important;
- -ms-flex-line-pack: start !important;
- align-content: flex-start !important;
+ -ms-flex-line-pack: start !important;
+ align-content: flex-start !important;
}
.align-content-end {
- -webkit-align-content: flex-end !important;
- -ms-flex-line-pack: end !important;
- align-content: flex-end !important;
+ -ms-flex-line-pack: end !important;
+ align-content: flex-end !important;
}
.align-content-center {
- -webkit-align-content: center !important;
- -ms-flex-line-pack: center !important;
- align-content: center !important;
+ -ms-flex-line-pack: center !important;
+ align-content: center !important;
}
.align-content-between {
- -webkit-align-content: space-between !important;
- -ms-flex-line-pack: justify !important;
- align-content: space-between !important;
+ -ms-flex-line-pack: justify !important;
+ align-content: space-between !important;
}
.align-content-around {
- -webkit-align-content: space-around !important;
- -ms-flex-line-pack: distribute !important;
- align-content: space-around !important;
+ -ms-flex-line-pack: distribute !important;
+ align-content: space-around !important;
}
.align-content-stretch {
- -webkit-align-content: stretch !important;
- -ms-flex-line-pack: stretch !important;
- align-content: stretch !important;
+ -ms-flex-line-pack: stretch !important;
+ align-content: stretch !important;
}
.align-self-auto {
- -webkit-align-self: auto !important;
- -ms-flex-item-align: auto !important;
- -ms-grid-row-align: auto !important;
- align-self: auto !important;
+ -ms-flex-item-align: auto !important;
+ align-self: auto !important;
}
.align-self-start {
- -webkit-align-self: flex-start !important;
- -ms-flex-item-align: start !important;
- align-self: flex-start !important;
+ -ms-flex-item-align: start !important;
+ align-self: flex-start !important;
}
.align-self-end {
- -webkit-align-self: flex-end !important;
- -ms-flex-item-align: end !important;
- align-self: flex-end !important;
+ -ms-flex-item-align: end !important;
+ align-self: flex-end !important;
}
.align-self-center {
- -webkit-align-self: center !important;
- -ms-flex-item-align: center !important;
- -ms-grid-row-align: center !important;
- align-self: center !important;
+ -ms-flex-item-align: center !important;
+ align-self: center !important;
}
.align-self-baseline {
- -webkit-align-self: baseline !important;
- -ms-flex-item-align: baseline !important;
- align-self: baseline !important;
+ -ms-flex-item-align: baseline !important;
+ align-self: baseline !important;
}
.align-self-stretch {
- -webkit-align-self: stretch !important;
- -ms-flex-item-align: stretch !important;
- -ms-grid-row-align: stretch !important;
- align-self: stretch !important;
+ -ms-flex-item-align: stretch !important;
+ align-self: stretch !important;
}
@media (min-width: 576px) {
- .order-sm-first {
- -webkit-box-ordinal-group: 0;
- -webkit-order: -1;
- -ms-flex-order: -1;
- order: -1;
- }
- .order-sm-last {
- -webkit-box-ordinal-group: 2;
- -webkit-order: 1;
- -ms-flex-order: 1;
- order: 1;
- }
- .order-sm-0 {
- -webkit-box-ordinal-group: 1;
- -webkit-order: 0;
- -ms-flex-order: 0;
- order: 0;
- }
.flex-sm-row {
- -webkit-box-orient: horizontal !important;
- -webkit-box-direction: normal !important;
- -webkit-flex-direction: row !important;
- -ms-flex-direction: row !important;
- flex-direction: row !important;
+ -ms-flex-direction: row !important;
+ flex-direction: row !important;
}
.flex-sm-column {
- -webkit-box-orient: vertical !important;
- -webkit-box-direction: normal !important;
- -webkit-flex-direction: column !important;
- -ms-flex-direction: column !important;
- flex-direction: column !important;
+ -ms-flex-direction: column !important;
+ flex-direction: column !important;
}
.flex-sm-row-reverse {
- -webkit-box-orient: horizontal !important;
- -webkit-box-direction: reverse !important;
- -webkit-flex-direction: row-reverse !important;
- -ms-flex-direction: row-reverse !important;
- flex-direction: row-reverse !important;
+ -ms-flex-direction: row-reverse !important;
+ flex-direction: row-reverse !important;
}
.flex-sm-column-reverse {
- -webkit-box-orient: vertical !important;
- -webkit-box-direction: reverse !important;
- -webkit-flex-direction: column-reverse !important;
- -ms-flex-direction: column-reverse !important;
- flex-direction: column-reverse !important;
+ -ms-flex-direction: column-reverse !important;
+ flex-direction: column-reverse !important;
}
.flex-sm-wrap {
- -webkit-flex-wrap: wrap !important;
- -ms-flex-wrap: wrap !important;
- flex-wrap: wrap !important;
+ -ms-flex-wrap: wrap !important;
+ flex-wrap: wrap !important;
}
.flex-sm-nowrap {
- -webkit-flex-wrap: nowrap !important;
- -ms-flex-wrap: nowrap !important;
- flex-wrap: nowrap !important;
+ -ms-flex-wrap: nowrap !important;
+ flex-wrap: nowrap !important;
}
.flex-sm-wrap-reverse {
- -webkit-flex-wrap: wrap-reverse !important;
- -ms-flex-wrap: wrap-reverse !important;
- flex-wrap: wrap-reverse !important;
+ -ms-flex-wrap: wrap-reverse !important;
+ flex-wrap: wrap-reverse !important;
}
.justify-content-sm-start {
- -webkit-box-pack: start !important;
- -webkit-justify-content: flex-start !important;
- -ms-flex-pack: start !important;
- justify-content: flex-start !important;
+ -ms-flex-pack: start !important;
+ justify-content: flex-start !important;
}
.justify-content-sm-end {
- -webkit-box-pack: end !important;
- -webkit-justify-content: flex-end !important;
- -ms-flex-pack: end !important;
- justify-content: flex-end !important;
+ -ms-flex-pack: end !important;
+ justify-content: flex-end !important;
}
.justify-content-sm-center {
- -webkit-box-pack: center !important;
- -webkit-justify-content: center !important;
- -ms-flex-pack: center !important;
- justify-content: center !important;
+ -ms-flex-pack: center !important;
+ justify-content: center !important;
}
.justify-content-sm-between {
- -webkit-box-pack: justify !important;
- -webkit-justify-content: space-between !important;
- -ms-flex-pack: justify !important;
- justify-content: space-between !important;
+ -ms-flex-pack: justify !important;
+ justify-content: space-between !important;
}
.justify-content-sm-around {
- -webkit-justify-content: space-around !important;
- -ms-flex-pack: distribute !important;
- justify-content: space-around !important;
+ -ms-flex-pack: distribute !important;
+ justify-content: space-around !important;
}
.align-items-sm-start {
- -webkit-box-align: start !important;
- -webkit-align-items: flex-start !important;
- -ms-flex-align: start !important;
- align-items: flex-start !important;
+ -ms-flex-align: start !important;
+ align-items: flex-start !important;
}
.align-items-sm-end {
- -webkit-box-align: end !important;
- -webkit-align-items: flex-end !important;
- -ms-flex-align: end !important;
- align-items: flex-end !important;
+ -ms-flex-align: end !important;
+ align-items: flex-end !important;
}
.align-items-sm-center {
- -webkit-box-align: center !important;
- -webkit-align-items: center !important;
- -ms-flex-align: center !important;
- align-items: center !important;
+ -ms-flex-align: center !important;
+ align-items: center !important;
}
.align-items-sm-baseline {
- -webkit-box-align: baseline !important;
- -webkit-align-items: baseline !important;
- -ms-flex-align: baseline !important;
- align-items: baseline !important;
+ -ms-flex-align: baseline !important;
+ align-items: baseline !important;
}
.align-items-sm-stretch {
- -webkit-box-align: stretch !important;
- -webkit-align-items: stretch !important;
- -ms-flex-align: stretch !important;
- align-items: stretch !important;
+ -ms-flex-align: stretch !important;
+ align-items: stretch !important;
}
.align-content-sm-start {
- -webkit-align-content: flex-start !important;
- -ms-flex-line-pack: start !important;
- align-content: flex-start !important;
+ -ms-flex-line-pack: start !important;
+ align-content: flex-start !important;
}
.align-content-sm-end {
- -webkit-align-content: flex-end !important;
- -ms-flex-line-pack: end !important;
- align-content: flex-end !important;
+ -ms-flex-line-pack: end !important;
+ align-content: flex-end !important;
}
.align-content-sm-center {
- -webkit-align-content: center !important;
- -ms-flex-line-pack: center !important;
- align-content: center !important;
+ -ms-flex-line-pack: center !important;
+ align-content: center !important;
}
.align-content-sm-between {
- -webkit-align-content: space-between !important;
- -ms-flex-line-pack: justify !important;
- align-content: space-between !important;
+ -ms-flex-line-pack: justify !important;
+ align-content: space-between !important;
}
.align-content-sm-around {
- -webkit-align-content: space-around !important;
- -ms-flex-line-pack: distribute !important;
- align-content: space-around !important;
+ -ms-flex-line-pack: distribute !important;
+ align-content: space-around !important;
}
.align-content-sm-stretch {
- -webkit-align-content: stretch !important;
- -ms-flex-line-pack: stretch !important;
- align-content: stretch !important;
+ -ms-flex-line-pack: stretch !important;
+ align-content: stretch !important;
}
.align-self-sm-auto {
- -webkit-align-self: auto !important;
- -ms-flex-item-align: auto !important;
- -ms-grid-row-align: auto !important;
- align-self: auto !important;
+ -ms-flex-item-align: auto !important;
+ align-self: auto !important;
}
.align-self-sm-start {
- -webkit-align-self: flex-start !important;
- -ms-flex-item-align: start !important;
- align-self: flex-start !important;
+ -ms-flex-item-align: start !important;
+ align-self: flex-start !important;
}
.align-self-sm-end {
- -webkit-align-self: flex-end !important;
- -ms-flex-item-align: end !important;
- align-self: flex-end !important;
+ -ms-flex-item-align: end !important;
+ align-self: flex-end !important;
}
.align-self-sm-center {
- -webkit-align-self: center !important;
- -ms-flex-item-align: center !important;
- -ms-grid-row-align: center !important;
- align-self: center !important;
+ -ms-flex-item-align: center !important;
+ align-self: center !important;
}
.align-self-sm-baseline {
- -webkit-align-self: baseline !important;
- -ms-flex-item-align: baseline !important;
- align-self: baseline !important;
+ -ms-flex-item-align: baseline !important;
+ align-self: baseline !important;
}
.align-self-sm-stretch {
- -webkit-align-self: stretch !important;
- -ms-flex-item-align: stretch !important;
- -ms-grid-row-align: stretch !important;
- align-self: stretch !important;
+ -ms-flex-item-align: stretch !important;
+ align-self: stretch !important;
}
}
@media (min-width: 768px) {
- .order-md-first {
- -webkit-box-ordinal-group: 0;
- -webkit-order: -1;
- -ms-flex-order: -1;
- order: -1;
- }
- .order-md-last {
- -webkit-box-ordinal-group: 2;
- -webkit-order: 1;
- -ms-flex-order: 1;
- order: 1;
- }
- .order-md-0 {
- -webkit-box-ordinal-group: 1;
- -webkit-order: 0;
- -ms-flex-order: 0;
- order: 0;
- }
.flex-md-row {
- -webkit-box-orient: horizontal !important;
- -webkit-box-direction: normal !important;
- -webkit-flex-direction: row !important;
- -ms-flex-direction: row !important;
- flex-direction: row !important;
+ -ms-flex-direction: row !important;
+ flex-direction: row !important;
}
.flex-md-column {
- -webkit-box-orient: vertical !important;
- -webkit-box-direction: normal !important;
- -webkit-flex-direction: column !important;
- -ms-flex-direction: column !important;
- flex-direction: column !important;
+ -ms-flex-direction: column !important;
+ flex-direction: column !important;
}
.flex-md-row-reverse {
- -webkit-box-orient: horizontal !important;
- -webkit-box-direction: reverse !important;
- -webkit-flex-direction: row-reverse !important;
- -ms-flex-direction: row-reverse !important;
- flex-direction: row-reverse !important;
+ -ms-flex-direction: row-reverse !important;
+ flex-direction: row-reverse !important;
}
.flex-md-column-reverse {
- -webkit-box-orient: vertical !important;
- -webkit-box-direction: reverse !important;
- -webkit-flex-direction: column-reverse !important;
- -ms-flex-direction: column-reverse !important;
- flex-direction: column-reverse !important;
+ -ms-flex-direction: column-reverse !important;
+ flex-direction: column-reverse !important;
}
.flex-md-wrap {
- -webkit-flex-wrap: wrap !important;
- -ms-flex-wrap: wrap !important;
- flex-wrap: wrap !important;
+ -ms-flex-wrap: wrap !important;
+ flex-wrap: wrap !important;
}
.flex-md-nowrap {
- -webkit-flex-wrap: nowrap !important;
- -ms-flex-wrap: nowrap !important;
- flex-wrap: nowrap !important;
+ -ms-flex-wrap: nowrap !important;
+ flex-wrap: nowrap !important;
}
.flex-md-wrap-reverse {
- -webkit-flex-wrap: wrap-reverse !important;
- -ms-flex-wrap: wrap-reverse !important;
- flex-wrap: wrap-reverse !important;
+ -ms-flex-wrap: wrap-reverse !important;
+ flex-wrap: wrap-reverse !important;
}
.justify-content-md-start {
- -webkit-box-pack: start !important;
- -webkit-justify-content: flex-start !important;
- -ms-flex-pack: start !important;
- justify-content: flex-start !important;
+ -ms-flex-pack: start !important;
+ justify-content: flex-start !important;
}
.justify-content-md-end {
- -webkit-box-pack: end !important;
- -webkit-justify-content: flex-end !important;
- -ms-flex-pack: end !important;
- justify-content: flex-end !important;
+ -ms-flex-pack: end !important;
+ justify-content: flex-end !important;
}
.justify-content-md-center {
- -webkit-box-pack: center !important;
- -webkit-justify-content: center !important;
- -ms-flex-pack: center !important;
- justify-content: center !important;
+ -ms-flex-pack: center !important;
+ justify-content: center !important;
}
.justify-content-md-between {
- -webkit-box-pack: justify !important;
- -webkit-justify-content: space-between !important;
- -ms-flex-pack: justify !important;
- justify-content: space-between !important;
+ -ms-flex-pack: justify !important;
+ justify-content: space-between !important;
}
.justify-content-md-around {
- -webkit-justify-content: space-around !important;
- -ms-flex-pack: distribute !important;
- justify-content: space-around !important;
+ -ms-flex-pack: distribute !important;
+ justify-content: space-around !important;
}
.align-items-md-start {
- -webkit-box-align: start !important;
- -webkit-align-items: flex-start !important;
- -ms-flex-align: start !important;
- align-items: flex-start !important;
+ -ms-flex-align: start !important;
+ align-items: flex-start !important;
}
.align-items-md-end {
- -webkit-box-align: end !important;
- -webkit-align-items: flex-end !important;
- -ms-flex-align: end !important;
- align-items: flex-end !important;
+ -ms-flex-align: end !important;
+ align-items: flex-end !important;
}
.align-items-md-center {
- -webkit-box-align: center !important;
- -webkit-align-items: center !important;
- -ms-flex-align: center !important;
- align-items: center !important;
+ -ms-flex-align: center !important;
+ align-items: center !important;
}
.align-items-md-baseline {
- -webkit-box-align: baseline !important;
- -webkit-align-items: baseline !important;
- -ms-flex-align: baseline !important;
- align-items: baseline !important;
+ -ms-flex-align: baseline !important;
+ align-items: baseline !important;
}
.align-items-md-stretch {
- -webkit-box-align: stretch !important;
- -webkit-align-items: stretch !important;
- -ms-flex-align: stretch !important;
- align-items: stretch !important;
+ -ms-flex-align: stretch !important;
+ align-items: stretch !important;
}
.align-content-md-start {
- -webkit-align-content: flex-start !important;
- -ms-flex-line-pack: start !important;
- align-content: flex-start !important;
+ -ms-flex-line-pack: start !important;
+ align-content: flex-start !important;
}
.align-content-md-end {
- -webkit-align-content: flex-end !important;
- -ms-flex-line-pack: end !important;
- align-content: flex-end !important;
+ -ms-flex-line-pack: end !important;
+ align-content: flex-end !important;
}
.align-content-md-center {
- -webkit-align-content: center !important;
- -ms-flex-line-pack: center !important;
- align-content: center !important;
+ -ms-flex-line-pack: center !important;
+ align-content: center !important;
}
.align-content-md-between {
- -webkit-align-content: space-between !important;
- -ms-flex-line-pack: justify !important;
- align-content: space-between !important;
+ -ms-flex-line-pack: justify !important;
+ align-content: space-between !important;
}
.align-content-md-around {
- -webkit-align-content: space-around !important;
- -ms-flex-line-pack: distribute !important;
- align-content: space-around !important;
+ -ms-flex-line-pack: distribute !important;
+ align-content: space-around !important;
}
.align-content-md-stretch {
- -webkit-align-content: stretch !important;
- -ms-flex-line-pack: stretch !important;
- align-content: stretch !important;
+ -ms-flex-line-pack: stretch !important;
+ align-content: stretch !important;
}
.align-self-md-auto {
- -webkit-align-self: auto !important;
- -ms-flex-item-align: auto !important;
- -ms-grid-row-align: auto !important;
- align-self: auto !important;
+ -ms-flex-item-align: auto !important;
+ align-self: auto !important;
}
.align-self-md-start {
- -webkit-align-self: flex-start !important;
- -ms-flex-item-align: start !important;
- align-self: flex-start !important;
+ -ms-flex-item-align: start !important;
+ align-self: flex-start !important;
}
.align-self-md-end {
- -webkit-align-self: flex-end !important;
- -ms-flex-item-align: end !important;
- align-self: flex-end !important;
+ -ms-flex-item-align: end !important;
+ align-self: flex-end !important;
}
.align-self-md-center {
- -webkit-align-self: center !important;
- -ms-flex-item-align: center !important;
- -ms-grid-row-align: center !important;
- align-self: center !important;
+ -ms-flex-item-align: center !important;
+ align-self: center !important;
}
.align-self-md-baseline {
- -webkit-align-self: baseline !important;
- -ms-flex-item-align: baseline !important;
- align-self: baseline !important;
+ -ms-flex-item-align: baseline !important;
+ align-self: baseline !important;
}
.align-self-md-stretch {
- -webkit-align-self: stretch !important;
- -ms-flex-item-align: stretch !important;
- -ms-grid-row-align: stretch !important;
- align-self: stretch !important;
+ -ms-flex-item-align: stretch !important;
+ align-self: stretch !important;
}
}
@media (min-width: 992px) {
- .order-lg-first {
- -webkit-box-ordinal-group: 0;
- -webkit-order: -1;
- -ms-flex-order: -1;
- order: -1;
- }
- .order-lg-last {
- -webkit-box-ordinal-group: 2;
- -webkit-order: 1;
- -ms-flex-order: 1;
- order: 1;
- }
- .order-lg-0 {
- -webkit-box-ordinal-group: 1;
- -webkit-order: 0;
- -ms-flex-order: 0;
- order: 0;
- }
.flex-lg-row {
- -webkit-box-orient: horizontal !important;
- -webkit-box-direction: normal !important;
- -webkit-flex-direction: row !important;
- -ms-flex-direction: row !important;
- flex-direction: row !important;
+ -ms-flex-direction: row !important;
+ flex-direction: row !important;
}
.flex-lg-column {
- -webkit-box-orient: vertical !important;
- -webkit-box-direction: normal !important;
- -webkit-flex-direction: column !important;
- -ms-flex-direction: column !important;
- flex-direction: column !important;
+ -ms-flex-direction: column !important;
+ flex-direction: column !important;
}
.flex-lg-row-reverse {
- -webkit-box-orient: horizontal !important;
- -webkit-box-direction: reverse !important;
- -webkit-flex-direction: row-reverse !important;
- -ms-flex-direction: row-reverse !important;
- flex-direction: row-reverse !important;
+ -ms-flex-direction: row-reverse !important;
+ flex-direction: row-reverse !important;
}
.flex-lg-column-reverse {
- -webkit-box-orient: vertical !important;
- -webkit-box-direction: reverse !important;
- -webkit-flex-direction: column-reverse !important;
- -ms-flex-direction: column-reverse !important;
- flex-direction: column-reverse !important;
+ -ms-flex-direction: column-reverse !important;
+ flex-direction: column-reverse !important;
}
.flex-lg-wrap {
- -webkit-flex-wrap: wrap !important;
- -ms-flex-wrap: wrap !important;
- flex-wrap: wrap !important;
+ -ms-flex-wrap: wrap !important;
+ flex-wrap: wrap !important;
}
.flex-lg-nowrap {
- -webkit-flex-wrap: nowrap !important;
- -ms-flex-wrap: nowrap !important;
- flex-wrap: nowrap !important;
+ -ms-flex-wrap: nowrap !important;
+ flex-wrap: nowrap !important;
}
.flex-lg-wrap-reverse {
- -webkit-flex-wrap: wrap-reverse !important;
- -ms-flex-wrap: wrap-reverse !important;
- flex-wrap: wrap-reverse !important;
+ -ms-flex-wrap: wrap-reverse !important;
+ flex-wrap: wrap-reverse !important;
}
.justify-content-lg-start {
- -webkit-box-pack: start !important;
- -webkit-justify-content: flex-start !important;
- -ms-flex-pack: start !important;
- justify-content: flex-start !important;
+ -ms-flex-pack: start !important;
+ justify-content: flex-start !important;
}
.justify-content-lg-end {
- -webkit-box-pack: end !important;
- -webkit-justify-content: flex-end !important;
- -ms-flex-pack: end !important;
- justify-content: flex-end !important;
+ -ms-flex-pack: end !important;
+ justify-content: flex-end !important;
}
.justify-content-lg-center {
- -webkit-box-pack: center !important;
- -webkit-justify-content: center !important;
- -ms-flex-pack: center !important;
- justify-content: center !important;
+ -ms-flex-pack: center !important;
+ justify-content: center !important;
}
.justify-content-lg-between {
- -webkit-box-pack: justify !important;
- -webkit-justify-content: space-between !important;
- -ms-flex-pack: justify !important;
- justify-content: space-between !important;
+ -ms-flex-pack: justify !important;
+ justify-content: space-between !important;
}
.justify-content-lg-around {
- -webkit-justify-content: space-around !important;
- -ms-flex-pack: distribute !important;
- justify-content: space-around !important;
+ -ms-flex-pack: distribute !important;
+ justify-content: space-around !important;
}
.align-items-lg-start {
- -webkit-box-align: start !important;
- -webkit-align-items: flex-start !important;
- -ms-flex-align: start !important;
- align-items: flex-start !important;
+ -ms-flex-align: start !important;
+ align-items: flex-start !important;
}
.align-items-lg-end {
- -webkit-box-align: end !important;
- -webkit-align-items: flex-end !important;
- -ms-flex-align: end !important;
- align-items: flex-end !important;
+ -ms-flex-align: end !important;
+ align-items: flex-end !important;
}
.align-items-lg-center {
- -webkit-box-align: center !important;
- -webkit-align-items: center !important;
- -ms-flex-align: center !important;
- align-items: center !important;
+ -ms-flex-align: center !important;
+ align-items: center !important;
}
.align-items-lg-baseline {
- -webkit-box-align: baseline !important;
- -webkit-align-items: baseline !important;
- -ms-flex-align: baseline !important;
- align-items: baseline !important;
+ -ms-flex-align: baseline !important;
+ align-items: baseline !important;
}
.align-items-lg-stretch {
- -webkit-box-align: stretch !important;
- -webkit-align-items: stretch !important;
- -ms-flex-align: stretch !important;
- align-items: stretch !important;
+ -ms-flex-align: stretch !important;
+ align-items: stretch !important;
}
.align-content-lg-start {
- -webkit-align-content: flex-start !important;
- -ms-flex-line-pack: start !important;
- align-content: flex-start !important;
+ -ms-flex-line-pack: start !important;
+ align-content: flex-start !important;
}
.align-content-lg-end {
- -webkit-align-content: flex-end !important;
- -ms-flex-line-pack: end !important;
- align-content: flex-end !important;
+ -ms-flex-line-pack: end !important;
+ align-content: flex-end !important;
}
.align-content-lg-center {
- -webkit-align-content: center !important;
- -ms-flex-line-pack: center !important;
- align-content: center !important;
+ -ms-flex-line-pack: center !important;
+ align-content: center !important;
}
.align-content-lg-between {
- -webkit-align-content: space-between !important;
- -ms-flex-line-pack: justify !important;
- align-content: space-between !important;
+ -ms-flex-line-pack: justify !important;
+ align-content: space-between !important;
}
.align-content-lg-around {
- -webkit-align-content: space-around !important;
- -ms-flex-line-pack: distribute !important;
- align-content: space-around !important;
+ -ms-flex-line-pack: distribute !important;
+ align-content: space-around !important;
}
.align-content-lg-stretch {
- -webkit-align-content: stretch !important;
- -ms-flex-line-pack: stretch !important;
- align-content: stretch !important;
+ -ms-flex-line-pack: stretch !important;
+ align-content: stretch !important;
}
.align-self-lg-auto {
- -webkit-align-self: auto !important;
- -ms-flex-item-align: auto !important;
- -ms-grid-row-align: auto !important;
- align-self: auto !important;
+ -ms-flex-item-align: auto !important;
+ align-self: auto !important;
}
.align-self-lg-start {
- -webkit-align-self: flex-start !important;
- -ms-flex-item-align: start !important;
- align-self: flex-start !important;
+ -ms-flex-item-align: start !important;
+ align-self: flex-start !important;
}
.align-self-lg-end {
- -webkit-align-self: flex-end !important;
- -ms-flex-item-align: end !important;
- align-self: flex-end !important;
+ -ms-flex-item-align: end !important;
+ align-self: flex-end !important;
}
.align-self-lg-center {
- -webkit-align-self: center !important;
- -ms-flex-item-align: center !important;
- -ms-grid-row-align: center !important;
- align-self: center !important;
+ -ms-flex-item-align: center !important;
+ align-self: center !important;
}
.align-self-lg-baseline {
- -webkit-align-self: baseline !important;
- -ms-flex-item-align: baseline !important;
- align-self: baseline !important;
+ -ms-flex-item-align: baseline !important;
+ align-self: baseline !important;
}
.align-self-lg-stretch {
- -webkit-align-self: stretch !important;
- -ms-flex-item-align: stretch !important;
- -ms-grid-row-align: stretch !important;
- align-self: stretch !important;
+ -ms-flex-item-align: stretch !important;
+ align-self: stretch !important;
}
}
@media (min-width: 1200px) {
- .order-xl-first {
- -webkit-box-ordinal-group: 0;
- -webkit-order: -1;
- -ms-flex-order: -1;
- order: -1;
- }
- .order-xl-last {
- -webkit-box-ordinal-group: 2;
- -webkit-order: 1;
- -ms-flex-order: 1;
- order: 1;
- }
- .order-xl-0 {
- -webkit-box-ordinal-group: 1;
- -webkit-order: 0;
- -ms-flex-order: 0;
- order: 0;
- }
.flex-xl-row {
- -webkit-box-orient: horizontal !important;
- -webkit-box-direction: normal !important;
- -webkit-flex-direction: row !important;
- -ms-flex-direction: row !important;
- flex-direction: row !important;
+ -ms-flex-direction: row !important;
+ flex-direction: row !important;
}
.flex-xl-column {
- -webkit-box-orient: vertical !important;
- -webkit-box-direction: normal !important;
- -webkit-flex-direction: column !important;
- -ms-flex-direction: column !important;
- flex-direction: column !important;
+ -ms-flex-direction: column !important;
+ flex-direction: column !important;
}
.flex-xl-row-reverse {
- -webkit-box-orient: horizontal !important;
- -webkit-box-direction: reverse !important;
- -webkit-flex-direction: row-reverse !important;
- -ms-flex-direction: row-reverse !important;
- flex-direction: row-reverse !important;
+ -ms-flex-direction: row-reverse !important;
+ flex-direction: row-reverse !important;
}
.flex-xl-column-reverse {
- -webkit-box-orient: vertical !important;
- -webkit-box-direction: reverse !important;
- -webkit-flex-direction: column-reverse !important;
- -ms-flex-direction: column-reverse !important;
- flex-direction: column-reverse !important;
+ -ms-flex-direction: column-reverse !important;
+ flex-direction: column-reverse !important;
}
.flex-xl-wrap {
- -webkit-flex-wrap: wrap !important;
- -ms-flex-wrap: wrap !important;
- flex-wrap: wrap !important;
+ -ms-flex-wrap: wrap !important;
+ flex-wrap: wrap !important;
}
.flex-xl-nowrap {
- -webkit-flex-wrap: nowrap !important;
- -ms-flex-wrap: nowrap !important;
- flex-wrap: nowrap !important;
+ -ms-flex-wrap: nowrap !important;
+ flex-wrap: nowrap !important;
}
.flex-xl-wrap-reverse {
- -webkit-flex-wrap: wrap-reverse !important;
- -ms-flex-wrap: wrap-reverse !important;
- flex-wrap: wrap-reverse !important;
+ -ms-flex-wrap: wrap-reverse !important;
+ flex-wrap: wrap-reverse !important;
}
.justify-content-xl-start {
- -webkit-box-pack: start !important;
- -webkit-justify-content: flex-start !important;
- -ms-flex-pack: start !important;
- justify-content: flex-start !important;
+ -ms-flex-pack: start !important;
+ justify-content: flex-start !important;
}
.justify-content-xl-end {
- -webkit-box-pack: end !important;
- -webkit-justify-content: flex-end !important;
- -ms-flex-pack: end !important;
- justify-content: flex-end !important;
+ -ms-flex-pack: end !important;
+ justify-content: flex-end !important;
}
.justify-content-xl-center {
- -webkit-box-pack: center !important;
- -webkit-justify-content: center !important;
- -ms-flex-pack: center !important;
- justify-content: center !important;
+ -ms-flex-pack: center !important;
+ justify-content: center !important;
}
.justify-content-xl-between {
- -webkit-box-pack: justify !important;
- -webkit-justify-content: space-between !important;
- -ms-flex-pack: justify !important;
- justify-content: space-between !important;
+ -ms-flex-pack: justify !important;
+ justify-content: space-between !important;
}
.justify-content-xl-around {
- -webkit-justify-content: space-around !important;
- -ms-flex-pack: distribute !important;
- justify-content: space-around !important;
+ -ms-flex-pack: distribute !important;
+ justify-content: space-around !important;
}
.align-items-xl-start {
- -webkit-box-align: start !important;
- -webkit-align-items: flex-start !important;
- -ms-flex-align: start !important;
- align-items: flex-start !important;
+ -ms-flex-align: start !important;
+ align-items: flex-start !important;
}
.align-items-xl-end {
- -webkit-box-align: end !important;
- -webkit-align-items: flex-end !important;
- -ms-flex-align: end !important;
- align-items: flex-end !important;
+ -ms-flex-align: end !important;
+ align-items: flex-end !important;
}
.align-items-xl-center {
- -webkit-box-align: center !important;
- -webkit-align-items: center !important;
- -ms-flex-align: center !important;
- align-items: center !important;
+ -ms-flex-align: center !important;
+ align-items: center !important;
}
.align-items-xl-baseline {
- -webkit-box-align: baseline !important;
- -webkit-align-items: baseline !important;
- -ms-flex-align: baseline !important;
- align-items: baseline !important;
+ -ms-flex-align: baseline !important;
+ align-items: baseline !important;
}
.align-items-xl-stretch {
- -webkit-box-align: stretch !important;
- -webkit-align-items: stretch !important;
- -ms-flex-align: stretch !important;
- align-items: stretch !important;
+ -ms-flex-align: stretch !important;
+ align-items: stretch !important;
}
.align-content-xl-start {
- -webkit-align-content: flex-start !important;
- -ms-flex-line-pack: start !important;
- align-content: flex-start !important;
+ -ms-flex-line-pack: start !important;
+ align-content: flex-start !important;
}
.align-content-xl-end {
- -webkit-align-content: flex-end !important;
- -ms-flex-line-pack: end !important;
- align-content: flex-end !important;
+ -ms-flex-line-pack: end !important;
+ align-content: flex-end !important;
}
.align-content-xl-center {
- -webkit-align-content: center !important;
- -ms-flex-line-pack: center !important;
- align-content: center !important;
+ -ms-flex-line-pack: center !important;
+ align-content: center !important;
}
.align-content-xl-between {
- -webkit-align-content: space-between !important;
- -ms-flex-line-pack: justify !important;
- align-content: space-between !important;
+ -ms-flex-line-pack: justify !important;
+ align-content: space-between !important;
}
.align-content-xl-around {
- -webkit-align-content: space-around !important;
- -ms-flex-line-pack: distribute !important;
- align-content: space-around !important;
+ -ms-flex-line-pack: distribute !important;
+ align-content: space-around !important;
}
.align-content-xl-stretch {
- -webkit-align-content: stretch !important;
- -ms-flex-line-pack: stretch !important;
- align-content: stretch !important;
+ -ms-flex-line-pack: stretch !important;
+ align-content: stretch !important;
}
.align-self-xl-auto {
- -webkit-align-self: auto !important;
- -ms-flex-item-align: auto !important;
- -ms-grid-row-align: auto !important;
- align-self: auto !important;
+ -ms-flex-item-align: auto !important;
+ align-self: auto !important;
}
.align-self-xl-start {
- -webkit-align-self: flex-start !important;
- -ms-flex-item-align: start !important;
- align-self: flex-start !important;
+ -ms-flex-item-align: start !important;
+ align-self: flex-start !important;
}
.align-self-xl-end {
- -webkit-align-self: flex-end !important;
- -ms-flex-item-align: end !important;
- align-self: flex-end !important;
+ -ms-flex-item-align: end !important;
+ align-self: flex-end !important;
}
.align-self-xl-center {
- -webkit-align-self: center !important;
- -ms-flex-item-align: center !important;
- -ms-grid-row-align: center !important;
- align-self: center !important;
+ -ms-flex-item-align: center !important;
+ align-self: center !important;
}
.align-self-xl-baseline {
- -webkit-align-self: baseline !important;
- -ms-flex-item-align: baseline !important;
- align-self: baseline !important;
+ -ms-flex-item-align: baseline !important;
+ align-self: baseline !important;
}
.align-self-xl-stretch {
- -webkit-align-self: stretch !important;
- -ms-flex-item-align: stretch !important;
- -ms-grid-row-align: stretch !important;
- align-self: stretch !important;
+ -ms-flex-item-align: stretch !important;
+ align-self: stretch !important;
}
}
/*# sourceMappingURL=bootstrap-grid.css.map */ \ No newline at end of file
diff --git a/library/bootstrap/css/bootstrap-grid.css.map b/library/bootstrap/css/bootstrap-grid.css.map
index 04fef978c..a5145bdb0 100644
--- a/library/bootstrap/css/bootstrap-grid.css.map
+++ b/library/bootstrap/css/bootstrap-grid.css.map
@@ -1 +1 @@
-{"version":3,"sources":["../../scss/bootstrap-grid.scss","bootstrap-grid.css","../../scss/_grid.scss","../../scss/mixins/_grid.scss","../../scss/mixins/_breakpoints.scss","../../scss/_variables.scss","../../scss/mixins/_grid-framework.scss","../../scss/utilities/_flex.scss"],"names":[],"mappings":"AAUE;EAAgB,oBAAmB;CCRpC;;ADWD;EACE,+BAAsB;UAAtB,uBAAsB;EACtB,8BAA6B;CAC9B;;AAED;;;EAGE,4BAAmB;UAAnB,oBAAmB;CACpB;;AEjBC;ECAA,mBAAkB;EAClB,kBAAiB;EAKb,oBAA4B;EAC5B,mBAA4B;CDJ/B;;AEgDC;EFnDF;ICMI,oBAA4B;IAC5B,mBAA4B;GDJ/B;CDmBF;;AG6BG;EFnDF;ICMI,oBAA4B;IAC5B,mBAA4B;GDJ/B;CD0BF;;AGsBG;EFnDF;ICMI,oBAA4B;IAC5B,mBAA4B;GDJ/B;CDiCF;;AGeG;EFnDF;ICMI,oBAA4B;IAC5B,mBAA4B;GDJ/B;CDwCF;;AGQG;EFnDF;ICiBI,aE8KK;IF7KL,gBAAe;GDflB;CD+CF;;AGCG;EFnDF;ICiBI,aE+KK;IF9KL,gBAAe;GDflB;CDsDF;;AGNG;EFnDF;ICiBI,aEgLK;IF/KL,gBAAe;GDflB;CD6DF;;AGbG;EFnDF;ICiBI,cEiLM;IFhLN,gBAAe;GDflB;CDoEF;;AC3DC;EACE,YAAW;ECbb,mBAAkB;EAClB,kBAAiB;EAKb,oBAA4B;EAC5B,mBAA4B;CDQ/B;;AEoCC;EFvCF;ICNI,oBAA4B;IAC5B,mBAA4B;GDQ/B;CDuEF;;AGnCG;EFvCF;ICNI,oBAA4B;IAC5B,mBAA4B;GDQ/B;CD8EF;;AG1CG;EFvCF;ICNI,oBAA4B;IAC5B,mBAA4B;GDQ/B;CDqFF;;AGjDG;EFvCF;ICNI,oBAA4B;IAC5B,mBAA4B;GDQ/B;CD4FF;;ACpFC;ECWA,qBAAa;EAAb,sBAAa;EAAb,qBAAa;EAAb,cAAa;EACb,wBAAe;MAAf,oBAAe;UAAf,gBAAe;EAKX,oBAA4B;EAC5B,mBAA4B;CDhB/B;;AE0BC;EF5BF;ICiBI,oBAA4B;IAC5B,mBAA4B;GDhB/B;CDgGF;;AGtEG;EF5BF;ICiBI,oBAA4B;IAC5B,mBAA4B;GDhB/B;CDuGF;;AG7EG;EF5BF;ICiBI,oBAA4B;IAC5B,mBAA4B;GDhB/B;CD8GF;;AGpFG;EF5BF;ICiBI,oBAA4B;IAC5B,mBAA4B;GDhB/B;CDqHF;;ACjHC;EACE,gBAAe;EACf,eAAc;CAOf;;AAT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","file":"bootstrap-grid.css","sourcesContent":[null,"@-ms-viewport {\n width: device-width;\n}\n\nhtml {\n box-sizing: border-box;\n -ms-overflow-style: scrollbar;\n}\n\n*,\n*::before,\n*::after {\n box-sizing: inherit;\n}\n\n.container {\n margin-right: auto;\n margin-left: auto;\n padding-right: 15px;\n padding-left: 15px;\n}\n\n@media (min-width: 576px) {\n .container {\n padding-right: 15px;\n padding-left: 15px;\n }\n}\n\n@media (min-width: 768px) {\n .container {\n padding-right: 15px;\n padding-left: 15px;\n }\n}\n\n@media (min-width: 992px) {\n .container {\n padding-right: 15px;\n padding-left: 15px;\n }\n}\n\n@media (min-width: 1200px) {\n .container {\n padding-right: 15px;\n padding-left: 15px;\n }\n}\n\n@media (min-width: 576px) {\n .container {\n width: 540px;\n max-width: 100%;\n }\n}\n\n@media (min-width: 768px) {\n .container {\n width: 720px;\n max-width: 100%;\n }\n}\n\n@media (min-width: 992px) {\n .container {\n width: 960px;\n max-width: 100%;\n }\n}\n\n@media (min-width: 1200px) {\n .container {\n width: 1140px;\n max-width: 100%;\n }\n}\n\n.container-fluid {\n width: 100%;\n margin-right: auto;\n margin-left: auto;\n padding-right: 15px;\n padding-left: 15px;\n}\n\n@media (min-width: 576px) {\n .container-fluid {\n padding-right: 15px;\n padding-left: 15px;\n }\n}\n\n@media (min-width: 768px) {\n .container-fluid {\n padding-right: 15px;\n padding-left: 15px;\n }\n}\n\n@media (min-width: 992px) {\n .container-fluid {\n padding-right: 15px;\n padding-left: 15px;\n }\n}\n\n@media (min-width: 1200px) {\n .container-fluid {\n padding-right: 15px;\n padding-left: 15px;\n }\n}\n\n.row {\n display: flex;\n flex-wrap: wrap;\n margin-right: -15px;\n margin-left: -15px;\n}\n\n@media (min-width: 576px) {\n .row {\n margin-right: -15px;\n margin-left: -15px;\n }\n}\n\n@media (min-width: 768px) {\n .row {\n margin-right: -15px;\n margin-left: -15px;\n }\n}\n\n@media (min-width: 992px) {\n .row {\n margin-right: -15px;\n margin-left: -15px;\n }\n}\n\n@media (min-width: 1200px) {\n .row {\n margin-right: -15px;\n margin-left: -15px;\n }\n}\n\n.no-gutters {\n margin-right: 0;\n margin-left: 0;\n}\n\n.no-gutters > .col,\n.no-gutters > [class*=\"col-\"] {\n padding-right: 0;\n padding-left: 0;\n}\n\n.col-1, .col-2, .col-3, .col-4, .col-5, .col-6, .col-7, .col-8, .col-9, .col-10, .col-11, .col-12, .col,\n.col-auto, .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, .col-sm,\n.col-sm-auto, .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, .col-md,\n.col-md-auto, .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, .col-lg,\n.col-lg-auto, .col-xl-1, .col-xl-2, .col-xl-3, .col-xl-4, .col-xl-5, .col-xl-6, .col-xl-7, .col-xl-8, .col-xl-9, .col-xl-10, .col-xl-11, .col-xl-12, .col-xl,\n.col-xl-auto {\n position: relative;\n width: 100%;\n min-height: 1px;\n padding-right: 15px;\n padding-left: 15px;\n}\n\n@media (min-width: 576px) {\n .col-1, .col-2, .col-3, .col-4, .col-5, .col-6, .col-7, .col-8, .col-9, .col-10, .col-11, .col-12, .col,\n .col-auto, .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, .col-sm,\n .col-sm-auto, .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, .col-md,\n .col-md-auto, .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, .col-lg,\n .col-lg-auto, .col-xl-1, .col-xl-2, .col-xl-3, .col-xl-4, .col-xl-5, .col-xl-6, .col-xl-7, .col-xl-8, .col-xl-9, .col-xl-10, .col-xl-11, .col-xl-12, .col-xl,\n .col-xl-auto {\n padding-right: 15px;\n padding-left: 15px;\n }\n}\n\n@media (min-width: 768px) {\n .col-1, .col-2, .col-3, .col-4, .col-5, .col-6, .col-7, .col-8, .col-9, .col-10, .col-11, .col-12, .col,\n .col-auto, .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, .col-sm,\n .col-sm-auto, .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, .col-md,\n .col-md-auto, .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, .col-lg,\n .col-lg-auto, .col-xl-1, .col-xl-2, .col-xl-3, .col-xl-4, .col-xl-5, .col-xl-6, .col-xl-7, .col-xl-8, .col-xl-9, .col-xl-10, .col-xl-11, .col-xl-12, .col-xl,\n .col-xl-auto {\n padding-right: 15px;\n padding-left: 15px;\n }\n}\n\n@media (min-width: 992px) {\n .col-1, .col-2, .col-3, .col-4, .col-5, .col-6, .col-7, .col-8, .col-9, .col-10, .col-11, .col-12, .col,\n .col-auto, .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, .col-sm,\n .col-sm-auto, .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, .col-md,\n .col-md-auto, .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, .col-lg,\n .col-lg-auto, .col-xl-1, .col-xl-2, .col-xl-3, .col-xl-4, .col-xl-5, .col-xl-6, .col-xl-7, .col-xl-8, .col-xl-9, .col-xl-10, .col-xl-11, .col-xl-12, .col-xl,\n .col-xl-auto {\n padding-right: 15px;\n padding-left: 15px;\n }\n}\n\n@media (min-width: 1200px) {\n .col-1, .col-2, .col-3, .col-4, .col-5, .col-6, .col-7, .col-8, .col-9, .col-10, .col-11, .col-12, .col,\n .col-auto, .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, .col-sm,\n .col-sm-auto, .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, .col-md,\n .col-md-auto, .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, .col-lg,\n .col-lg-auto, .col-xl-1, .col-xl-2, .col-xl-3, .col-xl-4, .col-xl-5, .col-xl-6, .col-xl-7, .col-xl-8, .col-xl-9, .col-xl-10, .col-xl-11, .col-xl-12, .col-xl,\n .col-xl-auto {\n padding-right: 15px;\n padding-left: 15px;\n }\n}\n\n.col {\n flex-basis: 0;\n flex-grow: 1;\n max-width: 100%;\n}\n\n.col-auto {\n flex: 0 0 auto;\n width: auto;\n}\n\n.col-1 {\n width: 8.333333%;\n}\n\n.col-2 {\n width: 16.666667%;\n}\n\n.col-3 {\n width: 25%;\n}\n\n.col-4 {\n width: 33.333333%;\n}\n\n.col-5 {\n width: 41.666667%;\n}\n\n.col-6 {\n width: 50%;\n}\n\n.col-7 {\n width: 58.333333%;\n}\n\n.col-8 {\n width: 66.666667%;\n}\n\n.col-9 {\n width: 75%;\n}\n\n.col-10 {\n width: 83.333333%;\n}\n\n.col-11 {\n width: 91.666667%;\n}\n\n.col-12 {\n width: 100%;\n}\n\n.pull-0 {\n right: auto;\n}\n\n.pull-1 {\n right: 8.333333%;\n}\n\n.pull-2 {\n right: 16.666667%;\n}\n\n.pull-3 {\n right: 25%;\n}\n\n.pull-4 {\n right: 33.333333%;\n}\n\n.pull-5 {\n right: 41.666667%;\n}\n\n.pull-6 {\n right: 50%;\n}\n\n.pull-7 {\n right: 58.333333%;\n}\n\n.pull-8 {\n right: 66.666667%;\n}\n\n.pull-9 {\n right: 75%;\n}\n\n.pull-10 {\n right: 83.333333%;\n}\n\n.pull-11 {\n right: 91.666667%;\n}\n\n.pull-12 {\n right: 100%;\n}\n\n.push-0 {\n left: auto;\n}\n\n.push-1 {\n left: 8.333333%;\n}\n\n.push-2 {\n left: 16.666667%;\n}\n\n.push-3 {\n left: 25%;\n}\n\n.push-4 {\n left: 33.333333%;\n}\n\n.push-5 {\n left: 41.666667%;\n}\n\n.push-6 {\n left: 50%;\n}\n\n.push-7 {\n left: 58.333333%;\n}\n\n.push-8 {\n left: 66.666667%;\n}\n\n.push-9 {\n left: 75%;\n}\n\n.push-10 {\n left: 83.333333%;\n}\n\n.push-11 {\n left: 91.666667%;\n}\n\n.push-12 {\n left: 100%;\n}\n\n.offset-1 {\n margin-left: 8.333333%;\n}\n\n.offset-2 {\n margin-left: 16.666667%;\n}\n\n.offset-3 {\n margin-left: 25%;\n}\n\n.offset-4 {\n margin-left: 33.333333%;\n}\n\n.offset-5 {\n margin-left: 41.666667%;\n}\n\n.offset-6 {\n margin-left: 50%;\n}\n\n.offset-7 {\n margin-left: 58.333333%;\n}\n\n.offset-8 {\n margin-left: 66.666667%;\n}\n\n.offset-9 {\n margin-left: 75%;\n}\n\n.offset-10 {\n margin-left: 83.333333%;\n}\n\n.offset-11 {\n margin-left: 91.666667%;\n}\n\n@media (min-width: 576px) {\n .col-sm {\n flex-basis: 0;\n flex-grow: 1;\n max-width: 100%;\n }\n .col-sm-auto {\n flex: 0 0 auto;\n width: auto;\n }\n .col-sm-1 {\n width: 8.333333%;\n }\n .col-sm-2 {\n width: 16.666667%;\n }\n .col-sm-3 {\n width: 25%;\n }\n .col-sm-4 {\n width: 33.333333%;\n }\n .col-sm-5 {\n width: 41.666667%;\n }\n .col-sm-6 {\n width: 50%;\n }\n .col-sm-7 {\n width: 58.333333%;\n }\n .col-sm-8 {\n width: 66.666667%;\n }\n .col-sm-9 {\n width: 75%;\n }\n .col-sm-10 {\n width: 83.333333%;\n }\n .col-sm-11 {\n width: 91.666667%;\n }\n .col-sm-12 {\n width: 100%;\n }\n .pull-sm-0 {\n right: auto;\n }\n .pull-sm-1 {\n right: 8.333333%;\n }\n .pull-sm-2 {\n right: 16.666667%;\n }\n .pull-sm-3 {\n right: 25%;\n }\n .pull-sm-4 {\n right: 33.333333%;\n }\n .pull-sm-5 {\n right: 41.666667%;\n }\n .pull-sm-6 {\n right: 50%;\n }\n .pull-sm-7 {\n right: 58.333333%;\n }\n .pull-sm-8 {\n right: 66.666667%;\n }\n .pull-sm-9 {\n right: 75%;\n }\n .pull-sm-10 {\n right: 83.333333%;\n }\n .pull-sm-11 {\n right: 91.666667%;\n }\n .pull-sm-12 {\n right: 100%;\n }\n .push-sm-0 {\n left: auto;\n }\n .push-sm-1 {\n left: 8.333333%;\n }\n .push-sm-2 {\n left: 16.666667%;\n }\n .push-sm-3 {\n left: 25%;\n }\n .push-sm-4 {\n left: 33.333333%;\n }\n .push-sm-5 {\n left: 41.666667%;\n }\n .push-sm-6 {\n left: 50%;\n }\n .push-sm-7 {\n left: 58.333333%;\n }\n .push-sm-8 {\n left: 66.666667%;\n }\n .push-sm-9 {\n left: 75%;\n }\n .push-sm-10 {\n left: 83.333333%;\n }\n .push-sm-11 {\n left: 91.666667%;\n }\n .push-sm-12 {\n left: 100%;\n }\n .offset-sm-0 {\n margin-left: 0%;\n }\n .offset-sm-1 {\n margin-left: 8.333333%;\n }\n .offset-sm-2 {\n margin-left: 16.666667%;\n }\n .offset-sm-3 {\n margin-left: 25%;\n }\n .offset-sm-4 {\n margin-left: 33.333333%;\n }\n .offset-sm-5 {\n margin-left: 41.666667%;\n }\n .offset-sm-6 {\n margin-left: 50%;\n }\n .offset-sm-7 {\n margin-left: 58.333333%;\n }\n .offset-sm-8 {\n margin-left: 66.666667%;\n }\n .offset-sm-9 {\n margin-left: 75%;\n }\n .offset-sm-10 {\n margin-left: 83.333333%;\n }\n .offset-sm-11 {\n margin-left: 91.666667%;\n }\n}\n\n@media (min-width: 768px) {\n .col-md {\n flex-basis: 0;\n flex-grow: 1;\n max-width: 100%;\n }\n .col-md-auto {\n flex: 0 0 auto;\n width: auto;\n }\n .col-md-1 {\n width: 8.333333%;\n }\n .col-md-2 {\n width: 16.666667%;\n }\n .col-md-3 {\n width: 25%;\n }\n .col-md-4 {\n width: 33.333333%;\n }\n .col-md-5 {\n width: 41.666667%;\n }\n .col-md-6 {\n width: 50%;\n }\n .col-md-7 {\n width: 58.333333%;\n }\n .col-md-8 {\n width: 66.666667%;\n }\n .col-md-9 {\n width: 75%;\n }\n .col-md-10 {\n width: 83.333333%;\n }\n .col-md-11 {\n width: 91.666667%;\n }\n .col-md-12 {\n width: 100%;\n }\n .pull-md-0 {\n right: auto;\n }\n .pull-md-1 {\n right: 8.333333%;\n }\n .pull-md-2 {\n right: 16.666667%;\n }\n .pull-md-3 {\n right: 25%;\n }\n .pull-md-4 {\n right: 33.333333%;\n }\n .pull-md-5 {\n right: 41.666667%;\n }\n .pull-md-6 {\n right: 50%;\n }\n .pull-md-7 {\n right: 58.333333%;\n }\n .pull-md-8 {\n right: 66.666667%;\n }\n .pull-md-9 {\n right: 75%;\n }\n .pull-md-10 {\n right: 83.333333%;\n }\n .pull-md-11 {\n right: 91.666667%;\n }\n .pull-md-12 {\n right: 100%;\n }\n .push-md-0 {\n left: auto;\n }\n .push-md-1 {\n left: 8.333333%;\n }\n .push-md-2 {\n left: 16.666667%;\n }\n .push-md-3 {\n left: 25%;\n }\n .push-md-4 {\n left: 33.333333%;\n }\n .push-md-5 {\n left: 41.666667%;\n }\n .push-md-6 {\n left: 50%;\n }\n .push-md-7 {\n left: 58.333333%;\n }\n .push-md-8 {\n left: 66.666667%;\n }\n .push-md-9 {\n left: 75%;\n }\n .push-md-10 {\n left: 83.333333%;\n }\n .push-md-11 {\n left: 91.666667%;\n }\n .push-md-12 {\n left: 100%;\n }\n .offset-md-0 {\n margin-left: 0%;\n }\n .offset-md-1 {\n margin-left: 8.333333%;\n }\n .offset-md-2 {\n margin-left: 16.666667%;\n }\n .offset-md-3 {\n margin-left: 25%;\n }\n .offset-md-4 {\n margin-left: 33.333333%;\n }\n .offset-md-5 {\n margin-left: 41.666667%;\n }\n .offset-md-6 {\n margin-left: 50%;\n }\n .offset-md-7 {\n margin-left: 58.333333%;\n }\n .offset-md-8 {\n margin-left: 66.666667%;\n }\n .offset-md-9 {\n margin-left: 75%;\n }\n .offset-md-10 {\n margin-left: 83.333333%;\n }\n .offset-md-11 {\n margin-left: 91.666667%;\n }\n}\n\n@media (min-width: 992px) {\n .col-lg {\n flex-basis: 0;\n flex-grow: 1;\n max-width: 100%;\n }\n .col-lg-auto {\n flex: 0 0 auto;\n width: auto;\n }\n .col-lg-1 {\n width: 8.333333%;\n }\n .col-lg-2 {\n width: 16.666667%;\n }\n .col-lg-3 {\n width: 25%;\n }\n .col-lg-4 {\n width: 33.333333%;\n }\n .col-lg-5 {\n width: 41.666667%;\n }\n .col-lg-6 {\n width: 50%;\n }\n .col-lg-7 {\n width: 58.333333%;\n }\n .col-lg-8 {\n width: 66.666667%;\n }\n .col-lg-9 {\n width: 75%;\n }\n .col-lg-10 {\n width: 83.333333%;\n }\n .col-lg-11 {\n width: 91.666667%;\n }\n .col-lg-12 {\n width: 100%;\n }\n .pull-lg-0 {\n right: auto;\n }\n .pull-lg-1 {\n right: 8.333333%;\n }\n .pull-lg-2 {\n right: 16.666667%;\n }\n .pull-lg-3 {\n right: 25%;\n }\n .pull-lg-4 {\n right: 33.333333%;\n }\n .pull-lg-5 {\n right: 41.666667%;\n }\n .pull-lg-6 {\n right: 50%;\n }\n .pull-lg-7 {\n right: 58.333333%;\n }\n .pull-lg-8 {\n right: 66.666667%;\n }\n .pull-lg-9 {\n right: 75%;\n }\n .pull-lg-10 {\n right: 83.333333%;\n }\n .pull-lg-11 {\n right: 91.666667%;\n }\n .pull-lg-12 {\n right: 100%;\n }\n .push-lg-0 {\n left: auto;\n }\n .push-lg-1 {\n left: 8.333333%;\n }\n .push-lg-2 {\n left: 16.666667%;\n }\n .push-lg-3 {\n left: 25%;\n }\n .push-lg-4 {\n left: 33.333333%;\n }\n .push-lg-5 {\n left: 41.666667%;\n }\n .push-lg-6 {\n left: 50%;\n }\n .push-lg-7 {\n left: 58.333333%;\n }\n .push-lg-8 {\n left: 66.666667%;\n }\n .push-lg-9 {\n left: 75%;\n }\n .push-lg-10 {\n left: 83.333333%;\n }\n .push-lg-11 {\n left: 91.666667%;\n }\n .push-lg-12 {\n left: 100%;\n }\n .offset-lg-0 {\n margin-left: 0%;\n }\n .offset-lg-1 {\n margin-left: 8.333333%;\n }\n .offset-lg-2 {\n margin-left: 16.666667%;\n }\n .offset-lg-3 {\n margin-left: 25%;\n }\n .offset-lg-4 {\n margin-left: 33.333333%;\n }\n .offset-lg-5 {\n margin-left: 41.666667%;\n }\n .offset-lg-6 {\n margin-left: 50%;\n }\n .offset-lg-7 {\n margin-left: 58.333333%;\n }\n .offset-lg-8 {\n margin-left: 66.666667%;\n }\n .offset-lg-9 {\n margin-left: 75%;\n }\n .offset-lg-10 {\n margin-left: 83.333333%;\n }\n .offset-lg-11 {\n margin-left: 91.666667%;\n }\n}\n\n@media (min-width: 1200px) {\n .col-xl {\n flex-basis: 0;\n flex-grow: 1;\n max-width: 100%;\n }\n .col-xl-auto {\n flex: 0 0 auto;\n width: auto;\n }\n .col-xl-1 {\n width: 8.333333%;\n }\n .col-xl-2 {\n width: 16.666667%;\n }\n .col-xl-3 {\n width: 25%;\n }\n .col-xl-4 {\n width: 33.333333%;\n }\n .col-xl-5 {\n width: 41.666667%;\n }\n .col-xl-6 {\n width: 50%;\n }\n .col-xl-7 {\n width: 58.333333%;\n }\n .col-xl-8 {\n width: 66.666667%;\n }\n .col-xl-9 {\n width: 75%;\n }\n .col-xl-10 {\n width: 83.333333%;\n }\n .col-xl-11 {\n width: 91.666667%;\n }\n .col-xl-12 {\n width: 100%;\n }\n .pull-xl-0 {\n right: auto;\n }\n .pull-xl-1 {\n right: 8.333333%;\n }\n .pull-xl-2 {\n right: 16.666667%;\n }\n .pull-xl-3 {\n right: 25%;\n }\n .pull-xl-4 {\n right: 33.333333%;\n }\n .pull-xl-5 {\n right: 41.666667%;\n }\n .pull-xl-6 {\n right: 50%;\n }\n .pull-xl-7 {\n right: 58.333333%;\n }\n .pull-xl-8 {\n right: 66.666667%;\n }\n .pull-xl-9 {\n right: 75%;\n }\n .pull-xl-10 {\n right: 83.333333%;\n }\n .pull-xl-11 {\n right: 91.666667%;\n }\n .pull-xl-12 {\n right: 100%;\n }\n .push-xl-0 {\n left: auto;\n }\n .push-xl-1 {\n left: 8.333333%;\n }\n .push-xl-2 {\n left: 16.666667%;\n }\n .push-xl-3 {\n left: 25%;\n }\n .push-xl-4 {\n left: 33.333333%;\n }\n .push-xl-5 {\n left: 41.666667%;\n }\n .push-xl-6 {\n left: 50%;\n }\n .push-xl-7 {\n left: 58.333333%;\n }\n .push-xl-8 {\n left: 66.666667%;\n }\n .push-xl-9 {\n left: 75%;\n }\n .push-xl-10 {\n left: 83.333333%;\n }\n .push-xl-11 {\n left: 91.666667%;\n }\n .push-xl-12 {\n left: 100%;\n }\n .offset-xl-0 {\n margin-left: 0%;\n }\n .offset-xl-1 {\n margin-left: 8.333333%;\n }\n .offset-xl-2 {\n margin-left: 16.666667%;\n }\n .offset-xl-3 {\n margin-left: 25%;\n }\n .offset-xl-4 {\n margin-left: 33.333333%;\n }\n .offset-xl-5 {\n margin-left: 41.666667%;\n }\n .offset-xl-6 {\n margin-left: 50%;\n }\n .offset-xl-7 {\n margin-left: 58.333333%;\n }\n .offset-xl-8 {\n margin-left: 66.666667%;\n }\n .offset-xl-9 {\n margin-left: 75%;\n }\n .offset-xl-10 {\n margin-left: 83.333333%;\n }\n .offset-xl-11 {\n margin-left: 91.666667%;\n }\n}\n\n.order-first {\n order: -1;\n}\n\n.order-last {\n order: 1;\n}\n\n.order-0 {\n order: 0;\n}\n\n.flex-row {\n flex-direction: row !important;\n}\n\n.flex-column {\n flex-direction: column !important;\n}\n\n.flex-row-reverse {\n flex-direction: row-reverse !important;\n}\n\n.flex-column-reverse {\n flex-direction: column-reverse !important;\n}\n\n.flex-wrap {\n flex-wrap: wrap !important;\n}\n\n.flex-nowrap {\n flex-wrap: nowrap !important;\n}\n\n.flex-wrap-reverse {\n flex-wrap: wrap-reverse !important;\n}\n\n.justify-content-start {\n justify-content: flex-start !important;\n}\n\n.justify-content-end {\n justify-content: flex-end !important;\n}\n\n.justify-content-center {\n justify-content: center !important;\n}\n\n.justify-content-between {\n justify-content: space-between !important;\n}\n\n.justify-content-around {\n justify-content: space-around !important;\n}\n\n.align-items-start {\n align-items: flex-start !important;\n}\n\n.align-items-end {\n align-items: flex-end !important;\n}\n\n.align-items-center {\n align-items: center !important;\n}\n\n.align-items-baseline {\n align-items: baseline !important;\n}\n\n.align-items-stretch {\n align-items: stretch !important;\n}\n\n.align-content-start {\n align-content: flex-start !important;\n}\n\n.align-content-end {\n align-content: flex-end !important;\n}\n\n.align-content-center {\n align-content: center !important;\n}\n\n.align-content-between {\n align-content: space-between !important;\n}\n\n.align-content-around {\n align-content: space-around !important;\n}\n\n.align-content-stretch {\n align-content: stretch !important;\n}\n\n.align-self-auto {\n align-self: auto !important;\n}\n\n.align-self-start {\n align-self: flex-start !important;\n}\n\n.align-self-end {\n align-self: flex-end !important;\n}\n\n.align-self-center {\n align-self: center !important;\n}\n\n.align-self-baseline {\n align-self: baseline !important;\n}\n\n.align-self-stretch {\n align-self: stretch !important;\n}\n\n@media (min-width: 576px) {\n .order-sm-first {\n order: -1;\n }\n .order-sm-last {\n order: 1;\n }\n .order-sm-0 {\n order: 0;\n }\n .flex-sm-row {\n flex-direction: row !important;\n }\n .flex-sm-column {\n flex-direction: column !important;\n }\n .flex-sm-row-reverse {\n flex-direction: row-reverse !important;\n }\n .flex-sm-column-reverse {\n flex-direction: column-reverse !important;\n }\n .flex-sm-wrap {\n flex-wrap: wrap !important;\n }\n .flex-sm-nowrap {\n flex-wrap: nowrap !important;\n }\n .flex-sm-wrap-reverse {\n flex-wrap: wrap-reverse !important;\n }\n .justify-content-sm-start {\n justify-content: flex-start !important;\n }\n .justify-content-sm-end {\n justify-content: flex-end !important;\n }\n .justify-content-sm-center {\n justify-content: center !important;\n }\n .justify-content-sm-between {\n justify-content: space-between !important;\n }\n .justify-content-sm-around {\n justify-content: space-around !important;\n }\n .align-items-sm-start {\n align-items: flex-start !important;\n }\n .align-items-sm-end {\n align-items: flex-end !important;\n }\n .align-items-sm-center {\n align-items: center !important;\n }\n .align-items-sm-baseline {\n align-items: baseline !important;\n }\n .align-items-sm-stretch {\n align-items: stretch !important;\n }\n .align-content-sm-start {\n align-content: flex-start !important;\n }\n .align-content-sm-end {\n align-content: flex-end !important;\n }\n .align-content-sm-center {\n align-content: center !important;\n }\n .align-content-sm-between {\n align-content: space-between !important;\n }\n .align-content-sm-around {\n align-content: space-around !important;\n }\n .align-content-sm-stretch {\n align-content: stretch !important;\n }\n .align-self-sm-auto {\n align-self: auto !important;\n }\n .align-self-sm-start {\n align-self: flex-start !important;\n }\n .align-self-sm-end {\n align-self: flex-end !important;\n }\n .align-self-sm-center {\n align-self: center !important;\n }\n .align-self-sm-baseline {\n align-self: baseline !important;\n }\n .align-self-sm-stretch {\n align-self: stretch !important;\n }\n}\n\n@media (min-width: 768px) {\n .order-md-first {\n order: -1;\n }\n .order-md-last {\n order: 1;\n }\n .order-md-0 {\n order: 0;\n }\n .flex-md-row {\n flex-direction: row !important;\n }\n .flex-md-column {\n flex-direction: column !important;\n }\n .flex-md-row-reverse {\n flex-direction: row-reverse !important;\n }\n .flex-md-column-reverse {\n flex-direction: column-reverse !important;\n }\n .flex-md-wrap {\n flex-wrap: wrap !important;\n }\n .flex-md-nowrap {\n flex-wrap: nowrap !important;\n }\n .flex-md-wrap-reverse {\n flex-wrap: wrap-reverse !important;\n }\n .justify-content-md-start {\n justify-content: flex-start !important;\n }\n .justify-content-md-end {\n justify-content: flex-end !important;\n }\n .justify-content-md-center {\n justify-content: center !important;\n }\n .justify-content-md-between {\n justify-content: space-between !important;\n }\n .justify-content-md-around {\n justify-content: space-around !important;\n }\n .align-items-md-start {\n align-items: flex-start !important;\n }\n .align-items-md-end {\n align-items: flex-end !important;\n }\n .align-items-md-center {\n align-items: center !important;\n }\n .align-items-md-baseline {\n align-items: baseline !important;\n }\n .align-items-md-stretch {\n align-items: stretch !important;\n }\n .align-content-md-start {\n align-content: flex-start !important;\n }\n .align-content-md-end {\n align-content: flex-end !important;\n }\n .align-content-md-center {\n align-content: center !important;\n }\n .align-content-md-between {\n align-content: space-between !important;\n }\n .align-content-md-around {\n align-content: space-around !important;\n }\n .align-content-md-stretch {\n align-content: stretch !important;\n }\n .align-self-md-auto {\n align-self: auto !important;\n }\n .align-self-md-start {\n align-self: flex-start !important;\n }\n .align-self-md-end {\n align-self: flex-end !important;\n }\n .align-self-md-center {\n align-self: center !important;\n }\n .align-self-md-baseline {\n align-self: baseline !important;\n }\n .align-self-md-stretch {\n align-self: stretch !important;\n }\n}\n\n@media (min-width: 992px) {\n .order-lg-first {\n order: -1;\n }\n .order-lg-last {\n order: 1;\n }\n .order-lg-0 {\n order: 0;\n }\n .flex-lg-row {\n flex-direction: row !important;\n }\n .flex-lg-column {\n flex-direction: column !important;\n }\n .flex-lg-row-reverse {\n flex-direction: row-reverse !important;\n }\n .flex-lg-column-reverse {\n flex-direction: column-reverse !important;\n }\n .flex-lg-wrap {\n flex-wrap: wrap !important;\n }\n .flex-lg-nowrap {\n flex-wrap: nowrap !important;\n }\n .flex-lg-wrap-reverse {\n flex-wrap: wrap-reverse !important;\n }\n .justify-content-lg-start {\n justify-content: flex-start !important;\n }\n .justify-content-lg-end {\n justify-content: flex-end !important;\n }\n .justify-content-lg-center {\n justify-content: center !important;\n }\n .justify-content-lg-between {\n justify-content: space-between !important;\n }\n .justify-content-lg-around {\n justify-content: space-around !important;\n }\n .align-items-lg-start {\n align-items: flex-start !important;\n }\n .align-items-lg-end {\n align-items: flex-end !important;\n }\n .align-items-lg-center {\n align-items: center !important;\n }\n .align-items-lg-baseline {\n align-items: baseline !important;\n }\n .align-items-lg-stretch {\n align-items: stretch !important;\n }\n .align-content-lg-start {\n align-content: flex-start !important;\n }\n .align-content-lg-end {\n align-content: flex-end !important;\n }\n .align-content-lg-center {\n align-content: center !important;\n }\n .align-content-lg-between {\n align-content: space-between !important;\n }\n .align-content-lg-around {\n align-content: space-around !important;\n }\n .align-content-lg-stretch {\n align-content: stretch !important;\n }\n .align-self-lg-auto {\n align-self: auto !important;\n }\n .align-self-lg-start {\n align-self: flex-start !important;\n }\n .align-self-lg-end {\n align-self: flex-end !important;\n }\n .align-self-lg-center {\n align-self: center !important;\n }\n .align-self-lg-baseline {\n align-self: baseline !important;\n }\n .align-self-lg-stretch {\n align-self: stretch !important;\n }\n}\n\n@media (min-width: 1200px) {\n .order-xl-first {\n order: -1;\n }\n .order-xl-last {\n order: 1;\n }\n .order-xl-0 {\n order: 0;\n }\n .flex-xl-row {\n flex-direction: row !important;\n }\n .flex-xl-column {\n flex-direction: column !important;\n }\n .flex-xl-row-reverse {\n flex-direction: row-reverse !important;\n }\n .flex-xl-column-reverse {\n flex-direction: column-reverse !important;\n }\n .flex-xl-wrap {\n flex-wrap: wrap !important;\n }\n .flex-xl-nowrap {\n flex-wrap: nowrap !important;\n }\n .flex-xl-wrap-reverse {\n flex-wrap: wrap-reverse !important;\n }\n .justify-content-xl-start {\n justify-content: flex-start !important;\n }\n .justify-content-xl-end {\n justify-content: flex-end !important;\n }\n .justify-content-xl-center {\n justify-content: center !important;\n }\n .justify-content-xl-between {\n justify-content: space-between !important;\n }\n .justify-content-xl-around {\n justify-content: space-around !important;\n }\n .align-items-xl-start {\n align-items: flex-start !important;\n }\n .align-items-xl-end {\n align-items: flex-end !important;\n }\n .align-items-xl-center {\n align-items: center !important;\n }\n .align-items-xl-baseline {\n align-items: baseline !important;\n }\n .align-items-xl-stretch {\n align-items: stretch !important;\n }\n .align-content-xl-start {\n align-content: flex-start !important;\n }\n .align-content-xl-end {\n align-content: flex-end !important;\n }\n .align-content-xl-center {\n align-content: center !important;\n }\n .align-content-xl-between {\n align-content: space-between !important;\n }\n .align-content-xl-around {\n align-content: space-around !important;\n }\n .align-content-xl-stretch {\n align-content: stretch !important;\n }\n .align-self-xl-auto {\n align-self: auto !important;\n }\n .align-self-xl-start {\n align-self: flex-start !important;\n }\n .align-self-xl-end {\n align-self: flex-end !important;\n }\n .align-self-xl-center {\n align-self: center !important;\n }\n .align-self-xl-baseline {\n align-self: baseline !important;\n }\n .align-self-xl-stretch {\n align-self: stretch !important;\n }\n}\n\n/*# sourceMappingURL=bootstrap-grid.css.map */",null,null,null,null,null,null]} \ No newline at end of file
+{"version":3,"sources":["../../scss/bootstrap-grid.scss","bootstrap-grid.css","../../scss/_grid.scss","../../scss/mixins/_grid.scss","../../scss/mixins/_breakpoints.scss","../../scss/_variables.scss","../../scss/mixins/_grid-framework.scss","../../scss/utilities/_flex.scss"],"names":[],"mappings":"AAUE;EAAgB,oBAAmB;CCRpC;;ADWD;EACE,uBAAsB;EACtB,8BAA6B;CAC9B;;AAED;;;EAGE,oBAAmB;CACpB;;AEjBC;ECAA,mBAAkB;EAClB,kBAAiB;EACjB,oBAAuC;EACvC,mBAAuC;EACvC,YAAW;CDDV;;AEgDC;EFnDF;ICYI,iBE8KK;GHvLR;CDmBF;;AG6BG;EFnDF;ICYI,iBE+KK;GHxLR;CDyBF;;AGuBG;EFnDF;ICYI,iBEgLK;GHzLR;CD+BF;;AGiBG;EFnDF;ICYI,kBEiLM;GH1LT;CDqCF;;AC5BC;EACE,YAAW;ECbb,mBAAkB;EAClB,kBAAiB;EACjB,oBAAuC;EACvC,mBAAuC;EACvC,YAAW;CDWV;;AAQD;ECLA,qBAAa;EAAb,cAAa;EACb,oBAAe;MAAf,gBAAe;EACf,oBAAuC;EACvC,mBAAuC;CDItC;;AAID;EACE,gBAAe;EACf,eAAc;CAOf;;AATD;;EAMI,iBAAgB;EAChB,gBAAe;CAChB;;AInCH;;;;;;EACE,mBAAkB;EAClB,YAAW;EACX,gBAAe;EACf,oBAA4B;EAC5B,mBAA4B;CAC7B;;AAkBG;EACE,2BAAa;MAAb,cAAa;EACb,qBAAY;MAAZ,aAAY;EACZ,gBAAe;CAChB;;AACD;EACE,mBAAc;MAAd,eAAc;EACd,YAAW;EACX,gBAAe;CAChB;;AAGC;EHFN,wBAAsC;MAAtC,oBAAsC;EAItC,qBAAuC;CGAhC;;AAFD;EHFN,yBAAsC;MAAtC,qBAAsC;EAItC,sBAAuC;CGAhC;;AAFD;EHFN,kBAAsC;MAAtC,cAAsC;EAItC,eAAuC;CGAhC;;AAFD;EHFN,yBAAsC;MAAtC,qBAAsC;EAItC,sBAAuC;CGAhC;;AAFD;EHFN,yBAAsC;MAAtC,qBAAsC;EAItC,sBAAuC;CGAhC;;AAFD;EHFN,kBAAsC;MAAtC,cAAsC;EAItC,eAAuC;CGAhC;;AAFD;EHFN,yBAAsC;MAAtC,qBAAsC;EAItC,sBAAuC;CGAhC;;AAFD;EHFN,yBAAsC;MAAtC,qBAAsC;EAItC,sBAAuC;CGAhC;;AAFD;EHFN,kBAAsC;MAAtC,cAAsC;EAItC,eAAuC;CGAhC;;AAFD;EHFN,yBAAsC;MAAtC,qBAAsC;EAItC,sBAAuC;CGAhC;;AAFD;EHFN,yBAAsC;MAAtC,qBAAsC;EAItC,sBAAuC;CGAhC;;AAFD;EHFN,mBAAsC;MAAtC,eAAsC;EAItC,gBAAuC;CGAhC;;AAID;EACE,kBAFU;MAEV,SAFU;CAGX;;AAFD;EACE,kBAFU;MAEV,SAFU;CAGX;;AAFD;EACE,kBAFU;MAEV,SAFU;CAGX;;AAFD;EACE,kBAFU;MAEV,SAFU;CAGX;;AAFD;EACE,kBAFU;MAEV,SAFU;CAGX;;AAFD;EACE,kBAFU;MAEV,SAFU;CAGX;;AAFD;EACE,kBAFU;MAEV,SAFU;CAGX;;AAFD;EACE,kBAFU;MAEV,SAFU;CAGX;;AAFD;EACE,kBAFU;MAEV,SAFU;CAGX;;AAFD;EACE,mBAFU;MAEV,UAFU;CAGX;;AAFD;EACE,mBAFU;MAEV,UAFU;CAGX;;AAFD;EACE,mBAFU;MAEV,UAFU;CAGX;;AFKL;EEzBE;IACE,2BAAa;QAAb,cAAa;IACb,qBAAY;QAAZ,aAAY;IACZ,gBAAe;GAChB;EACD;IACE,mBAAc;QAAd,eAAc;IACd,YAAW;IACX,gBAAe;GAChB;EAGC;IHFN,wBAAsC;QAAtC,oBAAsC;IAItC,qBAAuC;GGAhC;EAFD;IHFN,yBAAsC;QAAtC,qBAAsC;IAItC,sBAAuC;GGAhC;EAFD;IHFN,kBAAsC;QAAtC,cAAsC;IAItC,eAAuC;GGAhC;EAFD;IHFN,yBAAsC;QAAtC,qBAAsC;IAItC,sBAAuC;GGAhC;EAFD;IHFN,yBAAsC;QAAtC,qBAAsC;IAItC,sBAAuC;GGAhC;EAFD;IHFN,kBAAsC;QAAtC,cAAsC;IAItC,eAAuC;GGAhC;EAFD;IHFN,yBAAsC;QAAtC,qBAAsC;IAItC,sBAAuC;GGAhC;EAFD;IHFN,yBAAsC;QAAtC,qBAAsC;IAItC,sBAAuC;GGAhC;EAFD;IHFN,kBAAsC;QAAtC,cAAsC;IAItC,eAAuC;GGAhC;EAFD;IHFN,yBAAsC;QAAtC,qBAAsC;IAItC,sBAAuC;GGAhC;EAFD;IHFN,yBAAsC;QAAtC,qBAAsC;IAItC,sBAAuC;GGAhC;EAFD;IHFN,mBAAsC;QAAtC,eAAsC;IAItC,gBAAuC;GGAhC;EAID;IACE,kBAFU;QAEV,SAFU;GAGX;EAFD;IACE,kBAFU;QAEV,SAFU;GAGX;EAFD;IACE,kBAFU;QAEV,SAFU;GAGX;EAFD;IACE,kBAFU;QAEV,SAFU;GAGX;EAFD;IACE,kBAFU;QAEV,SAFU;GAGX;EAFD;IACE,kBAFU;QAEV,SAFU;GAGX;EAFD;IACE,kBAFU;QAEV,SAFU;GAGX;EAFD;IACE,kBAFU;QAEV,SAFU;GAGX;EAFD;IACE,kBAFU;QAEV,SAFU;GAGX;EAFD;IACE,mBAFU;QAEV,UAFU;GAGX;EAFD;IACE,mBAFU;QAEV,UAFU;GAGX;EAFD;IACE,mBAFU;QAEV,UAFU;GAGX;CL2PR;;AGtPG;EEzBE;IACE,2BAAa;QAAb,cAAa;IACb,qBAAY;QAAZ,aAAY;IACZ,gBAAe;GAChB;EACD;IACE,mBAAc;QAAd,eAAc;IACd,YAAW;IACX,gBAAe;GAChB;EAGC;IHFN,wBAAsC;QAAtC,oBAAsC;IAItC,qBAAuC;GGAhC;EAFD;IHFN,yBAAsC;QAAtC,qBAAsC;IAItC,sBAAuC;GGAhC;EAFD;IHFN,kBAAsC;QAAtC,cAAsC;IAItC,eAAuC;GGAhC;EAFD;IHFN,yBAAsC;QAAtC,qBAAsC;IAItC,sBAAuC;GGAhC;EAFD;IHFN,yBAAsC;QAAtC,qBAAsC;IAItC,sBAAuC;GGAhC;EAFD;IHFN,kBAAsC;QAAtC,cAAsC;IAItC,eAAuC;GGAhC;EAFD;IHFN,yBAAsC;QAAtC,qBAAsC;IAItC,sBAAuC;GGAhC;EAFD;IHFN,yBAAsC;QAAtC,qBAAsC;IAItC,sBAAuC;GGAhC;EAFD;IHFN,kBAAsC;QAAtC,cAAsC;IAItC,eAAuC;GGAhC;EAFD;IHFN,yBAAsC;QAAtC,qBAAsC;IAItC,sBAAuC;GGAhC;EAFD;IHFN,yBAAsC;QAAtC,qBAAsC;IAItC,sBAAuC;GGAhC;EAFD;IHFN,mBAAsC;QAAtC,eAAsC;IAItC,gBAAuC;GGAhC;EAID;IACE,kBAFU;QAEV,SAFU;GAGX;EAFD;IACE,kBAFU;QAEV,SAFU;GAGX;EAFD;IACE,kBAFU;QAEV,SAFU;GAGX;EAFD;IACE,kBAFU;QAEV,SAFU;GAGX;EAFD;IACE,kBAFU;QAEV,SAFU;GAGX;EAFD;IACE,kBAFU;QAEV,SAFU;GAGX;EAFD;IACE,kBAFU;QAEV,SAFU;GAGX;EAFD;IACE,kBAFU;QAEV,SAFU;GAGX;EAFD;IACE,kBAFU;QAEV,SAFU;GAGX;EAFD;IACE,mBAFU;QAEV,UAFU;GAGX;EAFD;IACE,mBAFU;QAEV,UAFU;GAGX;EAFD;IACE,mBAFU;QAEV,UAFU;GAGX;CL4VR;;AGvVG;EEzBE;IACE,2BAAa;QAAb,cAAa;IACb,qBAAY;QAAZ,aAAY;IACZ,gBAAe;GAChB;EACD;IACE,mBAAc;QAAd,eAAc;IACd,YAAW;IACX,gBAAe;GAChB;EAGC;IHFN,wBAAsC;QAAtC,oBAAsC;IAItC,qBAAuC;GGAhC;EAFD;IHFN,yBAAsC;QAAtC,qBAAsC;IAItC,sBAAuC;GGAhC;EAFD;IHFN,kBAAsC;QAAtC,cAAsC;IAItC,eAAuC;GGAhC;EAFD;IHFN,yBAAsC;QAAtC,qBAAsC;IAItC,sBAAuC;GGAhC;EAFD;IHFN,yBAAsC;QAAtC,qBAAsC;IAItC,sBAAuC;GGAhC;EAFD;IHFN,kBAAsC;QAAtC,cAAsC;IAItC,eAAuC;GGAhC;EAFD;IHFN,yBAAsC;QAAtC,qBAAsC;IAItC,sBAAuC;GGAhC;EAFD;IHFN,yBAAsC;QAAtC,qBAAsC;IAItC,sBAAuC;GGAhC;EAFD;IHFN,kBAAsC;QAAtC,cAAsC;IAItC,eAAuC;GGAhC;EAFD;IHFN,yBAAsC;QAAtC,qBAAsC;IAItC,sBAAuC;GGAhC;EAFD;IHFN,yBAAsC;QAAtC,qBAAsC;IAItC,sBAAuC;GGAhC;EAFD;IHFN,mBAAsC;QAAtC,eAAsC;IAItC,gBAAuC;GGAhC;EAID;IACE,kBAFU;QAEV,SAFU;GAGX;EAFD;IACE,kBAFU;QAEV,SAFU;GAGX;EAFD;IACE,kBAFU;QAEV,SAFU;GAGX;EAFD;IACE,kBAFU;QAEV,SAFU;GAGX;EAFD;IACE,kBAFU;QAEV,SAFU;GAGX;EAFD;IACE,kBAFU;QAEV,SAFU;GAGX;EAFD;IACE,kBAFU;QAEV,SAFU;GAGX;EAFD;IACE,kBAFU;QAEV,SAFU;GAGX;EAFD;IACE,kBAFU;QAEV,SAFU;GAGX;EAFD;IACE,mBAFU;QAEV,UAFU;GAGX;EAFD;IACE,mBAFU;QAEV,UAFU;GAGX;EAFD;IACE,mBAFU;QAEV,UAFU;GAGX;CL6bR;;AGxbG;EEzBE;IACE,2BAAa;QAAb,cAAa;IACb,qBAAY;QAAZ,aAAY;IACZ,gBAAe;GAChB;EACD;IACE,mBAAc;QAAd,eAAc;IACd,YAAW;IACX,gBAAe;GAChB;EAGC;IHFN,wBAAsC;QAAtC,oBAAsC;IAItC,qBAAuC;GGAhC;EAFD;IHFN,yBAAsC;QAAtC,qBAAsC;IAItC,sBAAuC;GGAhC;EAFD;IHFN,kBAAsC;QAAtC,cAAsC;IAItC,eAAuC;GGAhC;EAFD;IHFN,yBAAsC;QAAtC,qBAAsC;IAItC,sBAAuC;GGAhC;EAFD;IHFN,yBAAsC;QAAtC,qBAAsC;IAItC,sBAAuC;GGAhC;EAFD;IHFN,kBAAsC;QAAtC,cAAsC;IAItC,eAAuC;GGAhC;EAFD;IHFN,yBAAsC;QAAtC,qBAAsC;IAItC,sBAAuC;GGAhC;EAFD;IHFN,yBAAsC;QAAtC,qBAAsC;IAItC,sBAAuC;GGAhC;EAFD;IHFN,kBAAsC;QAAtC,cAAsC;IAItC,eAAuC;GGAhC;EAFD;IHFN,yBAAsC;QAAtC,qBAAsC;IAItC,sBAAuC;GGAhC;EAFD;IHFN,yBAAsC;QAAtC,qBAAsC;IAItC,sBAAuC;GGAhC;EAFD;IHFN,mBAAsC;QAAtC,eAAsC;IAItC,gBAAuC;GGAhC;EAID;IACE,kBAFU;QAEV,SAFU;GAGX;EAFD;IACE,kBAFU;QAEV,SAFU;GAGX;EAFD;IACE,kBAFU;QAEV,SAFU;GAGX;EAFD;IACE,kBAFU;QAEV,SAFU;GAGX;EAFD;IACE,kBAFU;QAEV,SAFU;GAGX;EAFD;IACE,kBAFU;QAEV,SAFU;GAGX;EAFD;IACE,kBAFU;QAEV,SAFU;GAGX;EAFD;IACE,kBAFU;QAEV,SAFU;GAGX;EAFD;IACE,kBAFU;QAEV,SAFU;GAGX;EAFD;IACE,mBAFU;QAEV,UAFU;GAGX;EAFD;IACE,mBAFU;QAEV,UAFU;GAGX;EAFD;IACE,mBAFU;QAEV,UAFU;GAGX;CL8hBR;;AMzkBG;EAAgC,mCAA8B;MAA9B,+BAA8B;CAAK;;AACnE;EAAgC,sCAAiC;MAAjC,kCAAiC;CAAK;;AACtE;EAAgC,2CAAsC;MAAtC,uCAAsC;CAAK;;AAC3E;EAAgC,8CAAyC;MAAzC,0CAAyC;CAAK;;AAE9E;EAA8B,+BAA0B;MAA1B,2BAA0B;CAAK;;AAC7D;EAA8B,iCAA4B;MAA5B,6BAA4B;CAAK;;AAC/D;EAA8B,uCAAkC;MAAlC,mCAAkC;CAAK;;AAErE;EAAoC,gCAAsC;MAAtC,uCAAsC;CAAK;;AAC/E;EAAoC,8BAAoC;MAApC,qCAAoC;CAAK;;AAC7E;EAAoC,iCAAkC;MAAlC,mCAAkC;CAAK;;AAC3E;EAAoC,kCAAyC;MAAzC,0CAAyC;CAAK;;AAClF;EAAoC,qCAAwC;MAAxC,yCAAwC;CAAK;;AAEjF;EAAiC,iCAAkC;MAAlC,mCAAkC;CAAK;;AACxE;EAAiC,+BAAgC;MAAhC,iCAAgC;CAAK;;AACtE;EAAiC,kCAA8B;MAA9B,+BAA8B;CAAK;;AACpE;EAAiC,oCAAgC;MAAhC,iCAAgC;CAAK;;AACtE;EAAiC,mCAA+B;MAA/B,gCAA+B;CAAK;;AAErE;EAAkC,qCAAoC;MAApC,qCAAoC;CAAK;;AAC3E;EAAkC,mCAAkC;MAAlC,mCAAkC;CAAK;;AACzE;EAAkC,sCAAgC;MAAhC,iCAAgC;CAAK;;AACvE;EAAkC,uCAAuC;MAAvC,wCAAuC;CAAK;;AAC9E;EAAkC,0CAAsC;MAAtC,uCAAsC;CAAK;;AAC7E;EAAkC,uCAAiC;MAAjC,kCAAiC;CAAK;;AAExE;EAAgC,qCAA2B;MAA3B,4BAA2B;CAAK;;AAChE;EAAgC,sCAAiC;MAAjC,kCAAiC;CAAK;;AACtE;EAAgC,oCAA+B;MAA/B,gCAA+B;CAAK;;AACpE;EAAgC,uCAA6B;MAA7B,8BAA6B;CAAK;;AAClE;EAAgC,yCAA+B;MAA/B,gCAA+B;CAAK;;AACpE;EAAgC,wCAA8B;MAA9B,+BAA8B;CAAK;;AHenE;EGhDA;IAAgC,mCAA8B;QAA9B,+BAA8B;GAAK;EACnE;IAAgC,sCAAiC;QAAjC,kCAAiC;GAAK;EACtE;IAAgC,2CAAsC;QAAtC,uCAAsC;GAAK;EAC3E;IAAgC,8CAAyC;QAAzC,0CAAyC;GAAK;EAE9E;IAA8B,+BAA0B;QAA1B,2BAA0B;GAAK;EAC7D;IAA8B,iCAA4B;QAA5B,6BAA4B;GAAK;EAC/D;IAA8B,uCAAkC;QAAlC,mCAAkC;GAAK;EAErE;IAAoC,gCAAsC;QAAtC,uCAAsC;GAAK;EAC/E;IAAoC,8BAAoC;QAApC,qCAAoC;GAAK;EAC7E;IAAoC,iCAAkC;QAAlC,mCAAkC;GAAK;EAC3E;IAAoC,kCAAyC;QAAzC,0CAAyC;GAAK;EAClF;IAAoC,qCAAwC;QAAxC,yCAAwC;GAAK;EAEjF;IAAiC,iCAAkC;QAAlC,mCAAkC;GAAK;EACxE;IAAiC,+BAAgC;QAAhC,iCAAgC;GAAK;EACtE;IAAiC,kCAA8B;QAA9B,+BAA8B;GAAK;EACpE;IAAiC,oCAAgC;QAAhC,iCAAgC;GAAK;EACtE;IAAiC,mCAA+B;QAA/B,gCAA+B;GAAK;EAErE;IAAkC,qCAAoC;QAApC,qCAAoC;GAAK;EAC3E;IAAkC,mCAAkC;QAAlC,mCAAkC;GAAK;EACzE;IAAkC,sCAAgC;QAAhC,iCAAgC;GAAK;EACvE;IAAkC,uCAAuC;QAAvC,wCAAuC;GAAK;EAC9E;IAAkC,0CAAsC;QAAtC,uCAAsC;GAAK;EAC7E;IAAkC,uCAAiC;QAAjC,kCAAiC;GAAK;EAExE;IAAgC,qCAA2B;QAA3B,4BAA2B;GAAK;EAChE;IAAgC,sCAAiC;QAAjC,kCAAiC;GAAK;EACtE;IAAgC,oCAA+B;QAA/B,gCAA+B;GAAK;EACpE;IAAgC,uCAA6B;QAA7B,8BAA6B;GAAK;EAClE;IAAgC,yCAA+B;QAA/B,gCAA+B;GAAK;EACpE;IAAgC,wCAA8B;QAA9B,+BAA8B;GAAK;CNsvBtE;;AGvuBG;EGhDA;IAAgC,mCAA8B;QAA9B,+BAA8B;GAAK;EACnE;IAAgC,sCAAiC;QAAjC,kCAAiC;GAAK;EACtE;IAAgC,2CAAsC;QAAtC,uCAAsC;GAAK;EAC3E;IAAgC,8CAAyC;QAAzC,0CAAyC;GAAK;EAE9E;IAA8B,+BAA0B;QAA1B,2BAA0B;GAAK;EAC7D;IAA8B,iCAA4B;QAA5B,6BAA4B;GAAK;EAC/D;IAA8B,uCAAkC;QAAlC,mCAAkC;GAAK;EAErE;IAAoC,gCAAsC;QAAtC,uCAAsC;GAAK;EAC/E;IAAoC,8BAAoC;QAApC,qCAAoC;GAAK;EAC7E;IAAoC,iCAAkC;QAAlC,mCAAkC;GAAK;EAC3E;IAAoC,kCAAyC;QAAzC,0CAAyC;GAAK;EAClF;IAAoC,qCAAwC;QAAxC,yCAAwC;GAAK;EAEjF;IAAiC,iCAAkC;QAAlC,mCAAkC;GAAK;EACxE;IAAiC,+BAAgC;QAAhC,iCAAgC;GAAK;EACtE;IAAiC,kCAA8B;QAA9B,+BAA8B;GAAK;EACpE;IAAiC,oCAAgC;QAAhC,iCAAgC;GAAK;EACtE;IAAiC,mCAA+B;QAA/B,gCAA+B;GAAK;EAErE;IAAkC,qCAAoC;QAApC,qCAAoC;GAAK;EAC3E;IAAkC,mCAAkC;QAAlC,mCAAkC;GAAK;EACzE;IAAkC,sCAAgC;QAAhC,iCAAgC;GAAK;EACvE;IAAkC,uCAAuC;QAAvC,wCAAuC;GAAK;EAC9E;IAAkC,0CAAsC;QAAtC,uCAAsC;GAAK;EAC7E;IAAkC,uCAAiC;QAAjC,kCAAiC;GAAK;EAExE;IAAgC,qCAA2B;QAA3B,4BAA2B;GAAK;EAChE;IAAgC,sCAAiC;QAAjC,kCAAiC;GAAK;EACtE;IAAgC,oCAA+B;QAA/B,gCAA+B;GAAK;EACpE;IAAgC,uCAA6B;QAA7B,8BAA6B;GAAK;EAClE;IAAgC,yCAA+B;QAA/B,gCAA+B;GAAK;EACpE;IAAgC,wCAA8B;QAA9B,+BAA8B;GAAK;CNg1BtE;;AGj0BG;EGhDA;IAAgC,mCAA8B;QAA9B,+BAA8B;GAAK;EACnE;IAAgC,sCAAiC;QAAjC,kCAAiC;GAAK;EACtE;IAAgC,2CAAsC;QAAtC,uCAAsC;GAAK;EAC3E;IAAgC,8CAAyC;QAAzC,0CAAyC;GAAK;EAE9E;IAA8B,+BAA0B;QAA1B,2BAA0B;GAAK;EAC7D;IAA8B,iCAA4B;QAA5B,6BAA4B;GAAK;EAC/D;IAA8B,uCAAkC;QAAlC,mCAAkC;GAAK;EAErE;IAAoC,gCAAsC;QAAtC,uCAAsC;GAAK;EAC/E;IAAoC,8BAAoC;QAApC,qCAAoC;GAAK;EAC7E;IAAoC,iCAAkC;QAAlC,mCAAkC;GAAK;EAC3E;IAAoC,kCAAyC;QAAzC,0CAAyC;GAAK;EAClF;IAAoC,qCAAwC;QAAxC,yCAAwC;GAAK;EAEjF;IAAiC,iCAAkC;QAAlC,mCAAkC;GAAK;EACxE;IAAiC,+BAAgC;QAAhC,iCAAgC;GAAK;EACtE;IAAiC,kCAA8B;QAA9B,+BAA8B;GAAK;EACpE;IAAiC,oCAAgC;QAAhC,iCAAgC;GAAK;EACtE;IAAiC,mCAA+B;QAA/B,gCAA+B;GAAK;EAErE;IAAkC,qCAAoC;QAApC,qCAAoC;GAAK;EAC3E;IAAkC,mCAAkC;QAAlC,mCAAkC;GAAK;EACzE;IAAkC,sCAAgC;QAAhC,iCAAgC;GAAK;EACvE;IAAkC,uCAAuC;QAAvC,wCAAuC;GAAK;EAC9E;IAAkC,0CAAsC;QAAtC,uCAAsC;GAAK;EAC7E;IAAkC,uCAAiC;QAAjC,kCAAiC;GAAK;EAExE;IAAgC,qCAA2B;QAA3B,4BAA2B;GAAK;EAChE;IAAgC,sCAAiC;QAAjC,kCAAiC;GAAK;EACtE;IAAgC,oCAA+B;QAA/B,gCAA+B;GAAK;EACpE;IAAgC,uCAA6B;QAA7B,8BAA6B;GAAK;EAClE;IAAgC,yCAA+B;QAA/B,gCAA+B;GAAK;EACpE;IAAgC,wCAA8B;QAA9B,+BAA8B;GAAK;CN06BtE;;AG35BG;EGhDA;IAAgC,mCAA8B;QAA9B,+BAA8B;GAAK;EACnE;IAAgC,sCAAiC;QAAjC,kCAAiC;GAAK;EACtE;IAAgC,2CAAsC;QAAtC,uCAAsC;GAAK;EAC3E;IAAgC,8CAAyC;QAAzC,0CAAyC;GAAK;EAE9E;IAA8B,+BAA0B;QAA1B,2BAA0B;GAAK;EAC7D;IAA8B,iCAA4B;QAA5B,6BAA4B;GAAK;EAC/D;IAA8B,uCAAkC;QAAlC,mCAAkC;GAAK;EAErE;IAAoC,gCAAsC;QAAtC,uCAAsC;GAAK;EAC/E;IAAoC,8BAAoC;QAApC,qCAAoC;GAAK;EAC7E;IAAoC,iCAAkC;QAAlC,mCAAkC;GAAK;EAC3E;IAAoC,kCAAyC;QAAzC,0CAAyC;GAAK;EAClF;IAAoC,qCAAwC;QAAxC,yCAAwC;GAAK;EAEjF;IAAiC,iCAAkC;QAAlC,mCAAkC;GAAK;EACxE;IAAiC,+BAAgC;QAAhC,iCAAgC;GAAK;EACtE;IAAiC,kCAA8B;QAA9B,+BAA8B;GAAK;EACpE;IAAiC,oCAAgC;QAAhC,iCAAgC;GAAK;EACtE;IAAiC,mCAA+B;QAA/B,gCAA+B;GAAK;EAErE;IAAkC,qCAAoC;QAApC,qCAAoC;GAAK;EAC3E;IAAkC,mCAAkC;QAAlC,mCAAkC;GAAK;EACzE;IAAkC,sCAAgC;QAAhC,iCAAgC;GAAK;EACvE;IAAkC,uCAAuC;QAAvC,wCAAuC;GAAK;EAC9E;IAAkC,0CAAsC;QAAtC,uCAAsC;GAAK;EAC7E;IAAkC,uCAAiC;QAAjC,kCAAiC;GAAK;EAExE;IAAgC,qCAA2B;QAA3B,4BAA2B;GAAK;EAChE;IAAgC,sCAAiC;QAAjC,kCAAiC;GAAK;EACtE;IAAgC,oCAA+B;QAA/B,gCAA+B;GAAK;EACpE;IAAgC,uCAA6B;QAA7B,8BAA6B;GAAK;EAClE;IAAgC,yCAA+B;QAA/B,gCAA+B;GAAK;EACpE;IAAgC,wCAA8B;QAA9B,+BAA8B;GAAK;CNogCtE","file":"bootstrap-grid.css","sourcesContent":["// Bootstrap Grid only\n//\n// Includes relevant variables and mixins for the flexbox grid\n// system, as well as the generated predefined classes (e.g., `.col-sm-4`).\n\n//\n// Box sizing, responsive, and more\n//\n\n@at-root {\n @-ms-viewport { width: device-width; }\n}\n\nhtml {\n box-sizing: border-box;\n -ms-overflow-style: scrollbar;\n}\n\n*,\n*::before,\n*::after {\n box-sizing: inherit;\n}\n\n@import \"functions\";\n@import \"variables\";\n\n//\n// Grid mixins\n//\n\n@import \"mixins/breakpoints\";\n@import \"mixins/grid-framework\";\n@import \"mixins/grid\";\n\n@import \"grid\";\n@import \"utilities/flex\";\n","@-ms-viewport {\n width: device-width;\n}\n\nhtml {\n box-sizing: border-box;\n -ms-overflow-style: scrollbar;\n}\n\n*,\n*::before,\n*::after {\n box-sizing: inherit;\n}\n\n.container {\n margin-right: auto;\n margin-left: auto;\n padding-right: 15px;\n padding-left: 15px;\n width: 100%;\n}\n\n@media (min-width: 576px) {\n .container {\n max-width: 540px;\n }\n}\n\n@media (min-width: 768px) {\n .container {\n max-width: 720px;\n }\n}\n\n@media (min-width: 992px) {\n .container {\n max-width: 960px;\n }\n}\n\n@media (min-width: 1200px) {\n .container {\n max-width: 1140px;\n }\n}\n\n.container-fluid {\n width: 100%;\n margin-right: auto;\n margin-left: auto;\n padding-right: 15px;\n padding-left: 15px;\n width: 100%;\n}\n\n.row {\n display: flex;\n flex-wrap: wrap;\n margin-right: -15px;\n margin-left: -15px;\n}\n\n.no-gutters {\n margin-right: 0;\n margin-left: 0;\n}\n\n.no-gutters > .col,\n.no-gutters > [class*=\"col-\"] {\n padding-right: 0;\n padding-left: 0;\n}\n\n.col-1, .col-2, .col-3, .col-4, .col-5, .col-6, .col-7, .col-8, .col-9, .col-10, .col-11, .col-12, .col,\n.col-auto, .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, .col-sm,\n.col-sm-auto, .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, .col-md,\n.col-md-auto, .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, .col-lg,\n.col-lg-auto, .col-xl-1, .col-xl-2, .col-xl-3, .col-xl-4, .col-xl-5, .col-xl-6, .col-xl-7, .col-xl-8, .col-xl-9, .col-xl-10, .col-xl-11, .col-xl-12, .col-xl,\n.col-xl-auto {\n position: relative;\n width: 100%;\n min-height: 1px;\n padding-right: 15px;\n padding-left: 15px;\n}\n\n.col {\n flex-basis: 0;\n flex-grow: 1;\n max-width: 100%;\n}\n\n.col-auto {\n flex: 0 0 auto;\n width: auto;\n max-width: none;\n}\n\n.col-1 {\n flex: 0 0 8.333333%;\n max-width: 8.333333%;\n}\n\n.col-2 {\n flex: 0 0 16.666667%;\n max-width: 16.666667%;\n}\n\n.col-3 {\n flex: 0 0 25%;\n max-width: 25%;\n}\n\n.col-4 {\n flex: 0 0 33.333333%;\n max-width: 33.333333%;\n}\n\n.col-5 {\n flex: 0 0 41.666667%;\n max-width: 41.666667%;\n}\n\n.col-6 {\n flex: 0 0 50%;\n max-width: 50%;\n}\n\n.col-7 {\n flex: 0 0 58.333333%;\n max-width: 58.333333%;\n}\n\n.col-8 {\n flex: 0 0 66.666667%;\n max-width: 66.666667%;\n}\n\n.col-9 {\n flex: 0 0 75%;\n max-width: 75%;\n}\n\n.col-10 {\n flex: 0 0 83.333333%;\n max-width: 83.333333%;\n}\n\n.col-11 {\n flex: 0 0 91.666667%;\n max-width: 91.666667%;\n}\n\n.col-12 {\n flex: 0 0 100%;\n max-width: 100%;\n}\n\n.order-1 {\n order: 1;\n}\n\n.order-2 {\n order: 2;\n}\n\n.order-3 {\n order: 3;\n}\n\n.order-4 {\n order: 4;\n}\n\n.order-5 {\n order: 5;\n}\n\n.order-6 {\n order: 6;\n}\n\n.order-7 {\n order: 7;\n}\n\n.order-8 {\n order: 8;\n}\n\n.order-9 {\n order: 9;\n}\n\n.order-10 {\n order: 10;\n}\n\n.order-11 {\n order: 11;\n}\n\n.order-12 {\n order: 12;\n}\n\n@media (min-width: 576px) {\n .col-sm {\n flex-basis: 0;\n flex-grow: 1;\n max-width: 100%;\n }\n .col-sm-auto {\n flex: 0 0 auto;\n width: auto;\n max-width: none;\n }\n .col-sm-1 {\n flex: 0 0 8.333333%;\n max-width: 8.333333%;\n }\n .col-sm-2 {\n flex: 0 0 16.666667%;\n max-width: 16.666667%;\n }\n .col-sm-3 {\n flex: 0 0 25%;\n max-width: 25%;\n }\n .col-sm-4 {\n flex: 0 0 33.333333%;\n max-width: 33.333333%;\n }\n .col-sm-5 {\n flex: 0 0 41.666667%;\n max-width: 41.666667%;\n }\n .col-sm-6 {\n flex: 0 0 50%;\n max-width: 50%;\n }\n .col-sm-7 {\n flex: 0 0 58.333333%;\n max-width: 58.333333%;\n }\n .col-sm-8 {\n flex: 0 0 66.666667%;\n max-width: 66.666667%;\n }\n .col-sm-9 {\n flex: 0 0 75%;\n max-width: 75%;\n }\n .col-sm-10 {\n flex: 0 0 83.333333%;\n max-width: 83.333333%;\n }\n .col-sm-11 {\n flex: 0 0 91.666667%;\n max-width: 91.666667%;\n }\n .col-sm-12 {\n flex: 0 0 100%;\n max-width: 100%;\n }\n .order-sm-1 {\n order: 1;\n }\n .order-sm-2 {\n order: 2;\n }\n .order-sm-3 {\n order: 3;\n }\n .order-sm-4 {\n order: 4;\n }\n .order-sm-5 {\n order: 5;\n }\n .order-sm-6 {\n order: 6;\n }\n .order-sm-7 {\n order: 7;\n }\n .order-sm-8 {\n order: 8;\n }\n .order-sm-9 {\n order: 9;\n }\n .order-sm-10 {\n order: 10;\n }\n .order-sm-11 {\n order: 11;\n }\n .order-sm-12 {\n order: 12;\n }\n}\n\n@media (min-width: 768px) {\n .col-md {\n flex-basis: 0;\n flex-grow: 1;\n max-width: 100%;\n }\n .col-md-auto {\n flex: 0 0 auto;\n width: auto;\n max-width: none;\n }\n .col-md-1 {\n flex: 0 0 8.333333%;\n max-width: 8.333333%;\n }\n .col-md-2 {\n flex: 0 0 16.666667%;\n max-width: 16.666667%;\n }\n .col-md-3 {\n flex: 0 0 25%;\n max-width: 25%;\n }\n .col-md-4 {\n flex: 0 0 33.333333%;\n max-width: 33.333333%;\n }\n .col-md-5 {\n flex: 0 0 41.666667%;\n max-width: 41.666667%;\n }\n .col-md-6 {\n flex: 0 0 50%;\n max-width: 50%;\n }\n .col-md-7 {\n flex: 0 0 58.333333%;\n max-width: 58.333333%;\n }\n .col-md-8 {\n flex: 0 0 66.666667%;\n max-width: 66.666667%;\n }\n .col-md-9 {\n flex: 0 0 75%;\n max-width: 75%;\n }\n .col-md-10 {\n flex: 0 0 83.333333%;\n max-width: 83.333333%;\n }\n .col-md-11 {\n flex: 0 0 91.666667%;\n max-width: 91.666667%;\n }\n .col-md-12 {\n flex: 0 0 100%;\n max-width: 100%;\n }\n .order-md-1 {\n order: 1;\n }\n .order-md-2 {\n order: 2;\n }\n .order-md-3 {\n order: 3;\n }\n .order-md-4 {\n order: 4;\n }\n .order-md-5 {\n order: 5;\n }\n .order-md-6 {\n order: 6;\n }\n .order-md-7 {\n order: 7;\n }\n .order-md-8 {\n order: 8;\n }\n .order-md-9 {\n order: 9;\n }\n .order-md-10 {\n order: 10;\n }\n .order-md-11 {\n order: 11;\n }\n .order-md-12 {\n order: 12;\n }\n}\n\n@media (min-width: 992px) {\n .col-lg {\n flex-basis: 0;\n flex-grow: 1;\n max-width: 100%;\n }\n .col-lg-auto {\n flex: 0 0 auto;\n width: auto;\n max-width: none;\n }\n .col-lg-1 {\n flex: 0 0 8.333333%;\n max-width: 8.333333%;\n }\n .col-lg-2 {\n flex: 0 0 16.666667%;\n max-width: 16.666667%;\n }\n .col-lg-3 {\n flex: 0 0 25%;\n max-width: 25%;\n }\n .col-lg-4 {\n flex: 0 0 33.333333%;\n max-width: 33.333333%;\n }\n .col-lg-5 {\n flex: 0 0 41.666667%;\n max-width: 41.666667%;\n }\n .col-lg-6 {\n flex: 0 0 50%;\n max-width: 50%;\n }\n .col-lg-7 {\n flex: 0 0 58.333333%;\n max-width: 58.333333%;\n }\n .col-lg-8 {\n flex: 0 0 66.666667%;\n max-width: 66.666667%;\n }\n .col-lg-9 {\n flex: 0 0 75%;\n max-width: 75%;\n }\n .col-lg-10 {\n flex: 0 0 83.333333%;\n max-width: 83.333333%;\n }\n .col-lg-11 {\n flex: 0 0 91.666667%;\n max-width: 91.666667%;\n }\n .col-lg-12 {\n flex: 0 0 100%;\n max-width: 100%;\n }\n .order-lg-1 {\n order: 1;\n }\n .order-lg-2 {\n order: 2;\n }\n .order-lg-3 {\n order: 3;\n }\n .order-lg-4 {\n order: 4;\n }\n .order-lg-5 {\n order: 5;\n }\n .order-lg-6 {\n order: 6;\n }\n .order-lg-7 {\n order: 7;\n }\n .order-lg-8 {\n order: 8;\n }\n .order-lg-9 {\n order: 9;\n }\n .order-lg-10 {\n order: 10;\n }\n .order-lg-11 {\n order: 11;\n }\n .order-lg-12 {\n order: 12;\n }\n}\n\n@media (min-width: 1200px) {\n .col-xl {\n flex-basis: 0;\n flex-grow: 1;\n max-width: 100%;\n }\n .col-xl-auto {\n flex: 0 0 auto;\n width: auto;\n max-width: none;\n }\n .col-xl-1 {\n flex: 0 0 8.333333%;\n max-width: 8.333333%;\n }\n .col-xl-2 {\n flex: 0 0 16.666667%;\n max-width: 16.666667%;\n }\n .col-xl-3 {\n flex: 0 0 25%;\n max-width: 25%;\n }\n .col-xl-4 {\n flex: 0 0 33.333333%;\n max-width: 33.333333%;\n }\n .col-xl-5 {\n flex: 0 0 41.666667%;\n max-width: 41.666667%;\n }\n .col-xl-6 {\n flex: 0 0 50%;\n max-width: 50%;\n }\n .col-xl-7 {\n flex: 0 0 58.333333%;\n max-width: 58.333333%;\n }\n .col-xl-8 {\n flex: 0 0 66.666667%;\n max-width: 66.666667%;\n }\n .col-xl-9 {\n flex: 0 0 75%;\n max-width: 75%;\n }\n .col-xl-10 {\n flex: 0 0 83.333333%;\n max-width: 83.333333%;\n }\n .col-xl-11 {\n flex: 0 0 91.666667%;\n max-width: 91.666667%;\n }\n .col-xl-12 {\n flex: 0 0 100%;\n max-width: 100%;\n }\n .order-xl-1 {\n order: 1;\n }\n .order-xl-2 {\n order: 2;\n }\n .order-xl-3 {\n order: 3;\n }\n .order-xl-4 {\n order: 4;\n }\n .order-xl-5 {\n order: 5;\n }\n .order-xl-6 {\n order: 6;\n }\n .order-xl-7 {\n order: 7;\n }\n .order-xl-8 {\n order: 8;\n }\n .order-xl-9 {\n order: 9;\n }\n .order-xl-10 {\n order: 10;\n }\n .order-xl-11 {\n order: 11;\n }\n .order-xl-12 {\n order: 12;\n }\n}\n\n.flex-row {\n flex-direction: row !important;\n}\n\n.flex-column {\n flex-direction: column !important;\n}\n\n.flex-row-reverse {\n flex-direction: row-reverse !important;\n}\n\n.flex-column-reverse {\n flex-direction: column-reverse !important;\n}\n\n.flex-wrap {\n flex-wrap: wrap !important;\n}\n\n.flex-nowrap {\n flex-wrap: nowrap !important;\n}\n\n.flex-wrap-reverse {\n flex-wrap: wrap-reverse !important;\n}\n\n.justify-content-start {\n justify-content: flex-start !important;\n}\n\n.justify-content-end {\n justify-content: flex-end !important;\n}\n\n.justify-content-center {\n justify-content: center !important;\n}\n\n.justify-content-between {\n justify-content: space-between !important;\n}\n\n.justify-content-around {\n justify-content: space-around !important;\n}\n\n.align-items-start {\n align-items: flex-start !important;\n}\n\n.align-items-end {\n align-items: flex-end !important;\n}\n\n.align-items-center {\n align-items: center !important;\n}\n\n.align-items-baseline {\n align-items: baseline !important;\n}\n\n.align-items-stretch {\n align-items: stretch !important;\n}\n\n.align-content-start {\n align-content: flex-start !important;\n}\n\n.align-content-end {\n align-content: flex-end !important;\n}\n\n.align-content-center {\n align-content: center !important;\n}\n\n.align-content-between {\n align-content: space-between !important;\n}\n\n.align-content-around {\n align-content: space-around !important;\n}\n\n.align-content-stretch {\n align-content: stretch !important;\n}\n\n.align-self-auto {\n align-self: auto !important;\n}\n\n.align-self-start {\n align-self: flex-start !important;\n}\n\n.align-self-end {\n align-self: flex-end !important;\n}\n\n.align-self-center {\n align-self: center !important;\n}\n\n.align-self-baseline {\n align-self: baseline !important;\n}\n\n.align-self-stretch {\n align-self: stretch !important;\n}\n\n@media (min-width: 576px) {\n .flex-sm-row {\n flex-direction: row !important;\n }\n .flex-sm-column {\n flex-direction: column !important;\n }\n .flex-sm-row-reverse {\n flex-direction: row-reverse !important;\n }\n .flex-sm-column-reverse {\n flex-direction: column-reverse !important;\n }\n .flex-sm-wrap {\n flex-wrap: wrap !important;\n }\n .flex-sm-nowrap {\n flex-wrap: nowrap !important;\n }\n .flex-sm-wrap-reverse {\n flex-wrap: wrap-reverse !important;\n }\n .justify-content-sm-start {\n justify-content: flex-start !important;\n }\n .justify-content-sm-end {\n justify-content: flex-end !important;\n }\n .justify-content-sm-center {\n justify-content: center !important;\n }\n .justify-content-sm-between {\n justify-content: space-between !important;\n }\n .justify-content-sm-around {\n justify-content: space-around !important;\n }\n .align-items-sm-start {\n align-items: flex-start !important;\n }\n .align-items-sm-end {\n align-items: flex-end !important;\n }\n .align-items-sm-center {\n align-items: center !important;\n }\n .align-items-sm-baseline {\n align-items: baseline !important;\n }\n .align-items-sm-stretch {\n align-items: stretch !important;\n }\n .align-content-sm-start {\n align-content: flex-start !important;\n }\n .align-content-sm-end {\n align-content: flex-end !important;\n }\n .align-content-sm-center {\n align-content: center !important;\n }\n .align-content-sm-between {\n align-content: space-between !important;\n }\n .align-content-sm-around {\n align-content: space-around !important;\n }\n .align-content-sm-stretch {\n align-content: stretch !important;\n }\n .align-self-sm-auto {\n align-self: auto !important;\n }\n .align-self-sm-start {\n align-self: flex-start !important;\n }\n .align-self-sm-end {\n align-self: flex-end !important;\n }\n .align-self-sm-center {\n align-self: center !important;\n }\n .align-self-sm-baseline {\n align-self: baseline !important;\n }\n .align-self-sm-stretch {\n align-self: stretch !important;\n }\n}\n\n@media (min-width: 768px) {\n .flex-md-row {\n flex-direction: row !important;\n }\n .flex-md-column {\n flex-direction: column !important;\n }\n .flex-md-row-reverse {\n flex-direction: row-reverse !important;\n }\n .flex-md-column-reverse {\n flex-direction: column-reverse !important;\n }\n .flex-md-wrap {\n flex-wrap: wrap !important;\n }\n .flex-md-nowrap {\n flex-wrap: nowrap !important;\n }\n .flex-md-wrap-reverse {\n flex-wrap: wrap-reverse !important;\n }\n .justify-content-md-start {\n justify-content: flex-start !important;\n }\n .justify-content-md-end {\n justify-content: flex-end !important;\n }\n .justify-content-md-center {\n justify-content: center !important;\n }\n .justify-content-md-between {\n justify-content: space-between !important;\n }\n .justify-content-md-around {\n justify-content: space-around !important;\n }\n .align-items-md-start {\n align-items: flex-start !important;\n }\n .align-items-md-end {\n align-items: flex-end !important;\n }\n .align-items-md-center {\n align-items: center !important;\n }\n .align-items-md-baseline {\n align-items: baseline !important;\n }\n .align-items-md-stretch {\n align-items: stretch !important;\n }\n .align-content-md-start {\n align-content: flex-start !important;\n }\n .align-content-md-end {\n align-content: flex-end !important;\n }\n .align-content-md-center {\n align-content: center !important;\n }\n .align-content-md-between {\n align-content: space-between !important;\n }\n .align-content-md-around {\n align-content: space-around !important;\n }\n .align-content-md-stretch {\n align-content: stretch !important;\n }\n .align-self-md-auto {\n align-self: auto !important;\n }\n .align-self-md-start {\n align-self: flex-start !important;\n }\n .align-self-md-end {\n align-self: flex-end !important;\n }\n .align-self-md-center {\n align-self: center !important;\n }\n .align-self-md-baseline {\n align-self: baseline !important;\n }\n .align-self-md-stretch {\n align-self: stretch !important;\n }\n}\n\n@media (min-width: 992px) {\n .flex-lg-row {\n flex-direction: row !important;\n }\n .flex-lg-column {\n flex-direction: column !important;\n }\n .flex-lg-row-reverse {\n flex-direction: row-reverse !important;\n }\n .flex-lg-column-reverse {\n flex-direction: column-reverse !important;\n }\n .flex-lg-wrap {\n flex-wrap: wrap !important;\n }\n .flex-lg-nowrap {\n flex-wrap: nowrap !important;\n }\n .flex-lg-wrap-reverse {\n flex-wrap: wrap-reverse !important;\n }\n .justify-content-lg-start {\n justify-content: flex-start !important;\n }\n .justify-content-lg-end {\n justify-content: flex-end !important;\n }\n .justify-content-lg-center {\n justify-content: center !important;\n }\n .justify-content-lg-between {\n justify-content: space-between !important;\n }\n .justify-content-lg-around {\n justify-content: space-around !important;\n }\n .align-items-lg-start {\n align-items: flex-start !important;\n }\n .align-items-lg-end {\n align-items: flex-end !important;\n }\n .align-items-lg-center {\n align-items: center !important;\n }\n .align-items-lg-baseline {\n align-items: baseline !important;\n }\n .align-items-lg-stretch {\n align-items: stretch !important;\n }\n .align-content-lg-start {\n align-content: flex-start !important;\n }\n .align-content-lg-end {\n align-content: flex-end !important;\n }\n .align-content-lg-center {\n align-content: center !important;\n }\n .align-content-lg-between {\n align-content: space-between !important;\n }\n .align-content-lg-around {\n align-content: space-around !important;\n }\n .align-content-lg-stretch {\n align-content: stretch !important;\n }\n .align-self-lg-auto {\n align-self: auto !important;\n }\n .align-self-lg-start {\n align-self: flex-start !important;\n }\n .align-self-lg-end {\n align-self: flex-end !important;\n }\n .align-self-lg-center {\n align-self: center !important;\n }\n .align-self-lg-baseline {\n align-self: baseline !important;\n }\n .align-self-lg-stretch {\n align-self: stretch !important;\n }\n}\n\n@media (min-width: 1200px) {\n .flex-xl-row {\n flex-direction: row !important;\n }\n .flex-xl-column {\n flex-direction: column !important;\n }\n .flex-xl-row-reverse {\n flex-direction: row-reverse !important;\n }\n .flex-xl-column-reverse {\n flex-direction: column-reverse !important;\n }\n .flex-xl-wrap {\n flex-wrap: wrap !important;\n }\n .flex-xl-nowrap {\n flex-wrap: nowrap !important;\n }\n .flex-xl-wrap-reverse {\n flex-wrap: wrap-reverse !important;\n }\n .justify-content-xl-start {\n justify-content: flex-start !important;\n }\n .justify-content-xl-end {\n justify-content: flex-end !important;\n }\n .justify-content-xl-center {\n justify-content: center !important;\n }\n .justify-content-xl-between {\n justify-content: space-between !important;\n }\n .justify-content-xl-around {\n justify-content: space-around !important;\n }\n .align-items-xl-start {\n align-items: flex-start !important;\n }\n .align-items-xl-end {\n align-items: flex-end !important;\n }\n .align-items-xl-center {\n align-items: center !important;\n }\n .align-items-xl-baseline {\n align-items: baseline !important;\n }\n .align-items-xl-stretch {\n align-items: stretch !important;\n }\n .align-content-xl-start {\n align-content: flex-start !important;\n }\n .align-content-xl-end {\n align-content: flex-end !important;\n }\n .align-content-xl-center {\n align-content: center !important;\n }\n .align-content-xl-between {\n align-content: space-between !important;\n }\n .align-content-xl-around {\n align-content: space-around !important;\n }\n .align-content-xl-stretch {\n align-content: stretch !important;\n }\n .align-self-xl-auto {\n align-self: auto !important;\n }\n .align-self-xl-start {\n align-self: flex-start !important;\n }\n .align-self-xl-end {\n align-self: flex-end !important;\n }\n .align-self-xl-center {\n align-self: center !important;\n }\n .align-self-xl-baseline {\n align-self: baseline !important;\n }\n .align-self-xl-stretch {\n align-self: stretch !important;\n }\n}\n\n/*# sourceMappingURL=bootstrap-grid.css.map */","// Container widths\n//\n// Set the container width, and override it for fixed navbars in media queries.\n\n@if $enable-grid-classes {\n .container {\n @include make-container();\n @include make-container-max-widths();\n }\n}\n\n// Fluid container\n//\n// Utilizes the mixin meant for fixed width containers, but with 100% width for\n// fluid, full width layouts.\n\n@if $enable-grid-classes {\n .container-fluid {\n width: 100%;\n @include make-container();\n }\n}\n\n// Row\n//\n// Rows contain and clear the floats of your columns.\n\n@if $enable-grid-classes {\n .row {\n @include make-row();\n }\n\n // Remove the negative margin from default .row, then the horizontal padding\n // from all immediate children columns (to prevent runaway style inheritance).\n .no-gutters {\n margin-right: 0;\n margin-left: 0;\n\n > .col,\n > [class*=\"col-\"] {\n padding-right: 0;\n padding-left: 0;\n }\n }\n}\n\n// Columns\n//\n// Common styles for small and large grid columns\n\n@if $enable-grid-classes {\n @include make-grid-columns();\n}\n","/// Grid system\n//\n// Generate semantic grid columns with these mixins.\n\n@mixin make-container() {\n margin-right: auto;\n margin-left: auto;\n padding-right: ($grid-gutter-width / 2);\n padding-left: ($grid-gutter-width / 2);\n width: 100%;\n}\n\n\n// For each breakpoint, define the maximum width of the container in a media query\n@mixin make-container-max-widths($max-widths: $container-max-widths, $breakpoints: $grid-breakpoints) {\n @each $breakpoint, $container-max-width in $max-widths {\n @include media-breakpoint-up($breakpoint, $breakpoints) {\n max-width: $container-max-width;\n }\n }\n}\n\n@mixin make-row() {\n display: flex;\n flex-wrap: wrap;\n margin-right: ($grid-gutter-width / -2);\n margin-left: ($grid-gutter-width / -2);\n}\n\n@mixin make-col-ready() {\n position: relative;\n // Prevent columns from becoming too narrow when at smaller grid tiers by\n // always setting `width: 100%;`. This works because we use `flex` values\n // later on to override this initial width.\n width: 100%;\n min-height: 1px; // Prevent collapsing\n padding-right: ($grid-gutter-width / 2);\n padding-left: ($grid-gutter-width / 2);\n}\n\n@mixin make-col($size, $columns: $grid-columns) {\n flex: 0 0 percentage($size / $columns);\n // Add a `max-width` to ensure content within each column does not blow out\n // the width of the column. Applies to IE10+ and Firefox. Chrome and Safari\n // do not appear to require this.\n max-width: percentage($size / $columns);\n}\n","// Breakpoint viewport sizes and media queries.\n//\n// Breakpoints are defined as a map of (name: minimum width), order from small to large:\n//\n// (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px)\n//\n// The map defined in the `$grid-breakpoints` global variable is used as the `$breakpoints` argument by default.\n\n// Name of the next breakpoint, or null for the last breakpoint.\n//\n// >> breakpoint-next(sm)\n// md\n// >> breakpoint-next(sm, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px))\n// md\n// >> breakpoint-next(sm, $breakpoint-names: (xs sm md lg xl))\n// md\n@function breakpoint-next($name, $breakpoints: $grid-breakpoints, $breakpoint-names: map-keys($breakpoints)) {\n $n: index($breakpoint-names, $name);\n @return if($n < length($breakpoint-names), nth($breakpoint-names, $n + 1), null);\n}\n\n// Minimum breakpoint width. Null for the smallest (first) breakpoint.\n//\n// >> breakpoint-min(sm, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px))\n// 576px\n@function breakpoint-min($name, $breakpoints: $grid-breakpoints) {\n $min: map-get($breakpoints, $name);\n @return if($min != 0, $min, null);\n}\n\n// Maximum breakpoint width. Null for the largest (last) breakpoint.\n// The maximum value is calculated as the minimum of the next one less 0.1.\n//\n// >> breakpoint-max(sm, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px))\n// 767px\n@function breakpoint-max($name, $breakpoints: $grid-breakpoints) {\n $next: breakpoint-next($name, $breakpoints);\n @return if($next, breakpoint-min($next, $breakpoints) - 1px, null);\n}\n\n// Returns a blank string if smallest breakpoint, otherwise returns the name with a dash infront.\n// Useful for making responsive utilities.\n//\n// >> breakpoint-infix(xs, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px))\n// \"\" (Returns a blank string)\n// >> breakpoint-infix(sm, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px))\n// \"-sm\"\n@function breakpoint-infix($name, $breakpoints: $grid-breakpoints) {\n @return if(breakpoint-min($name, $breakpoints) == null, \"\", \"-#{$name}\");\n}\n\n// Media of at least the minimum breakpoint width. No query for the smallest breakpoint.\n// Makes the @content apply to the given breakpoint and wider.\n@mixin media-breakpoint-up($name, $breakpoints: $grid-breakpoints) {\n $min: breakpoint-min($name, $breakpoints);\n @if $min {\n @media (min-width: $min) {\n @content;\n }\n } @else {\n @content;\n }\n}\n\n// Media of at most the maximum breakpoint width. No query for the largest breakpoint.\n// Makes the @content apply to the given breakpoint and narrower.\n@mixin media-breakpoint-down($name, $breakpoints: $grid-breakpoints) {\n $max: breakpoint-max($name, $breakpoints);\n @if $max {\n @media (max-width: $max) {\n @content;\n }\n } @else {\n @content;\n }\n}\n\n// Media that spans multiple breakpoint widths.\n// Makes the @content apply between the min and max breakpoints\n@mixin media-breakpoint-between($lower, $upper, $breakpoints: $grid-breakpoints) {\n $min: breakpoint-min($lower, $breakpoints);\n $max: breakpoint-max($upper, $breakpoints);\n\n @media (min-width: $min) and (max-width: $max) {\n @content;\n }\n}\n\n// Media between the breakpoint's minimum and maximum widths.\n// No minimum for the smallest breakpoint, and no maximum for the largest one.\n// Makes the @content apply only to the given breakpoint, not viewports any wider or narrower.\n@mixin media-breakpoint-only($name, $breakpoints: $grid-breakpoints) {\n $min: breakpoint-min($name, $breakpoints);\n $max: breakpoint-max($name, $breakpoints);\n\n @if $min != null and $max != null {\n @media (min-width: $min) and (max-width: $max) {\n @content;\n }\n } @else if $max == null {\n @include media-breakpoint-up($name)\n } @else if $min == null {\n @include media-breakpoint-down($name)\n }\n}\n","// Variables\n//\n// Copy settings from this file into the provided `_custom.scss` to override\n// the Bootstrap defaults without modifying key, versioned files.\n//\n// Variables should follow the `$component-state-property-size` formula for\n// consistent naming. Ex: $nav-link-disabled-color and $modal-content-box-shadow-xs.\n\n// Table of Contents\n//\n// Color system\n// Options\n// Spacing\n// Body\n// Links\n// Grid breakpoints\n// Grid containers\n// Grid columns\n// Fonts\n// Components\n// Tables\n// Buttons\n// Forms\n// Dropdowns\n// Z-index master list\n// Navs\n// Navbar\n// Pagination\n// Jumbotron\n// Form states and alerts\n// Cards\n// Tooltips\n// Popovers\n// Badges\n// Modals\n// Alerts\n// Progress bars\n// List group\n// Image thumbnails\n// Figures\n// Breadcrumbs\n// Carousel\n// Close\n// Code\n\n\n//\n// Color system\n//\n\n$white: #fff !default;\n$gray-100: #f8f9fa !default;\n$gray-200: #e9ecef !default;\n$gray-300: #dee2e6 !default;\n$gray-400: #ced4da !default;\n$gray-500: #adb5bd !default;\n$gray-600: #868e96 !default;\n$gray-700: #495057 !default;\n$gray-800: #343a40 !default;\n$gray-900: #212529 !default;\n$black: #000 !default;\n\n$grays: (\n 100: $gray-100,\n 200: $gray-200,\n 300: $gray-300,\n 400: $gray-400,\n 500: $gray-500,\n 600: $gray-600,\n 700: $gray-700,\n 800: $gray-800,\n 900: $gray-900\n) !default;\n\n$blue: #007bff !default;\n$indigo: #6610f2 !default;\n$purple: #6f42c1 !default;\n$pink: #e83e8c !default;\n$red: #dc3545 !default;\n$orange: #fd7e14 !default;\n$yellow: #ffc107 !default;\n$green: #28a745 !default;\n$teal: #20c997 !default;\n$cyan: #17a2b8 !default;\n\n$colors: (\n blue: $blue,\n indigo: $indigo,\n purple: $purple,\n pink: $pink,\n red: $red,\n orange: $orange,\n yellow: $yellow,\n green: $green,\n teal: $teal,\n cyan: $cyan,\n white: $white,\n gray: $gray-600,\n gray-dark: $gray-800\n) !default;\n\n$theme-colors: (\n primary: $blue,\n secondary: $gray-600,\n success: $green,\n info: $cyan,\n warning: $yellow,\n danger: $red,\n light: $gray-100,\n dark: $gray-800\n) !default;\n\n// Set a specific jump point for requesting color jumps\n$theme-color-interval: 8% !default;\n\n\n// Options\n//\n// Quickly modify global styling by enabling or disabling optional features.\n\n$enable-rounded: true !default;\n$enable-shadows: false !default;\n$enable-gradients: false !default;\n$enable-transitions: true !default;\n$enable-hover-media-query: false !default;\n$enable-grid-classes: true !default;\n$enable-print-styles: true !default;\n\n\n// Spacing\n//\n// Control the default styling of most Bootstrap elements by modifying these\n// variables. Mostly focused on spacing.\n// You can add more entries to the $spacers map, should you need more variation.\n\n$spacer: 1rem !default;\n$spacers: (\n 0: 0,\n 1: ($spacer * .25),\n 2: ($spacer * .5),\n 3: $spacer,\n 4: ($spacer * 1.5),\n 5: ($spacer * 3)\n) !default;\n\n// This variable affects the `.h-*` and `.w-*` classes.\n$sizes: (\n 25: 25%,\n 50: 50%,\n 75: 75%,\n 100: 100%\n) !default;\n\n// Body\n//\n// Settings for the `<body>` element.\n\n$body-bg: $white !default;\n$body-color: $gray-900 !default;\n\n// Links\n//\n// Style anchor elements.\n\n$link-color: theme-color(\"primary\") !default;\n$link-decoration: none !default;\n$link-hover-color: darken($link-color, 15%) !default;\n$link-hover-decoration: underline !default;\n\n\n// Grid breakpoints\n//\n// Define the minimum dimensions at which your layout will change,\n// adapting to different screen sizes, for use in media queries.\n\n$grid-breakpoints: (\n xs: 0,\n sm: 576px,\n md: 768px,\n lg: 992px,\n xl: 1200px\n) !default;\n@include _assert-ascending($grid-breakpoints, \"$grid-breakpoints\");\n@include _assert-starts-at-zero($grid-breakpoints);\n\n\n// Grid containers\n//\n// Define the maximum width of `.container` for different screen sizes.\n\n$container-max-widths: (\n sm: 540px,\n md: 720px,\n lg: 960px,\n xl: 1140px\n) !default;\n@include _assert-ascending($container-max-widths, \"$container-max-widths\");\n\n\n// Grid columns\n//\n// Set the number of columns and specify the width of the gutters.\n\n$grid-columns: 12 !default;\n$grid-gutter-width: 30px !default;\n\n// Components\n//\n// Define common padding and border radius sizes and more.\n\n$line-height-lg: 1.5 !default;\n$line-height-sm: 1.5 !default;\n\n$border-width: 1px !default;\n\n$border-radius: .25rem !default;\n$border-radius-lg: .3rem !default;\n$border-radius-sm: .2rem !default;\n\n$component-active-color: $white !default;\n$component-active-bg: theme-color(\"primary\") !default;\n\n$caret-width: .3em !default;\n\n$transition-base: all .2s ease-in-out !default;\n$transition-fade: opacity .15s linear !default;\n$transition-collapse: height .35s ease !default;\n\n\n// Fonts\n//\n// Font, line-height, and color for body text, headings, and more.\n\n$font-family-sans-serif: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, \"Helvetica Neue\", Arial, sans-serif !default;\n$font-family-monospace: Menlo, Monaco, Consolas, \"Liberation Mono\", \"Courier New\", monospace !default;\n$font-family-base: $font-family-sans-serif !default;\n\n$font-size-base: 1rem !default; // Assumes the browser default, typically `16px`\n$font-size-lg: 1.25rem !default;\n$font-size-sm: .875rem !default;\n\n$font-weight-normal: normal !default;\n$font-weight-bold: bold !default;\n\n$font-weight-base: $font-weight-normal !default;\n$line-height-base: 1.5 !default;\n\n$h1-font-size: 2.5rem !default;\n$h2-font-size: 2rem !default;\n$h3-font-size: 1.75rem !default;\n$h4-font-size: 1.5rem !default;\n$h5-font-size: 1.25rem !default;\n$h6-font-size: 1rem !default;\n\n$headings-margin-bottom: ($spacer / 2) !default;\n$headings-font-family: inherit !default;\n$headings-font-weight: 500 !default;\n$headings-line-height: 1.1 !default;\n$headings-color: inherit !default;\n\n$display1-size: 6rem !default;\n$display2-size: 5.5rem !default;\n$display3-size: 4.5rem !default;\n$display4-size: 3.5rem !default;\n\n$display1-weight: 300 !default;\n$display2-weight: 300 !default;\n$display3-weight: 300 !default;\n$display4-weight: 300 !default;\n$display-line-height: $headings-line-height !default;\n\n$lead-font-size: 1.25rem !default;\n$lead-font-weight: 300 !default;\n\n$small-font-size: 80% !default;\n\n$text-muted: $gray-600 !default;\n\n$blockquote-small-color: $gray-600 !default;\n$blockquote-font-size: ($font-size-base * 1.25) !default;\n\n$hr-border-color: rgba($black,.1) !default;\n$hr-border-width: $border-width !default;\n\n$mark-padding: .2em !default;\n\n$dt-font-weight: $font-weight-bold !default;\n\n$kbd-box-shadow: inset 0 -.1rem 0 rgba($black,.25) !default;\n$nested-kbd-font-weight: $font-weight-bold !default;\n\n$list-inline-padding: 5px !default;\n\n$mark-bg: #fcf8e3 !default;\n\n\n// Tables\n//\n// Customizes the `.table` component with basic values, each used across all table variations.\n\n$table-cell-padding: .75rem !default;\n$table-cell-padding-sm: .3rem !default;\n\n$table-bg: transparent !default;\n$table-accent-bg: rgba($black,.05) !default;\n$table-hover-bg: rgba($black,.075) !default;\n$table-active-bg: $table-hover-bg !default;\n\n$table-border-width: $border-width !default;\n$table-border-color: $gray-200 !default;\n\n$table-head-bg: $gray-200 !default;\n$table-head-color: $gray-700 !default;\n\n$table-inverse-bg: $gray-900 !default;\n$table-inverse-accent-bg: rgba($white, .05) !default;\n$table-inverse-hover-bg: rgba($white, .075) !default;\n$table-inverse-border-color: lighten($gray-900, 7.5%) !default;\n$table-inverse-color: $body-bg !default;\n\n\n// Buttons\n//\n// For each of Bootstrap's buttons, define text, background and border color.\n\n$input-btn-padding-y: .5rem !default;\n$input-btn-padding-x: .75rem !default;\n$input-btn-line-height: 1.25 !default;\n\n$input-btn-padding-y-sm: .25rem !default;\n$input-btn-padding-x-sm: .5rem !default;\n$input-btn-line-height-sm: 1.5 !default;\n\n$input-btn-padding-y-lg: .5rem !default;\n$input-btn-padding-x-lg: 1rem !default;\n$input-btn-line-height-lg: 1.5 !default;\n\n$btn-font-weight: $font-weight-normal !default;\n$btn-box-shadow: inset 0 1px 0 rgba($white,.15), 0 1px 1px rgba($black,.075) !default;\n$btn-focus-box-shadow: 0 0 0 3px rgba(theme-color(\"primary\"), .25) !default;\n$btn-active-box-shadow: inset 0 3px 5px rgba($black,.125) !default;\n\n$btn-link-disabled-color: $gray-600 !default;\n\n$btn-block-spacing-y: .5rem !default;\n\n// Allows for customizing button radius independently from global border radius\n$btn-border-radius: $border-radius !default;\n$btn-border-radius-lg: $border-radius-lg !default;\n$btn-border-radius-sm: $border-radius-sm !default;\n\n$btn-transition: all .15s ease-in-out !default;\n\n\n// Forms\n\n$input-bg: $white !default;\n$input-disabled-bg: $gray-200 !default;\n\n$input-color: $gray-700 !default;\n$input-border-color: rgba($black,.15) !default;\n$input-btn-border-width: $border-width !default; // For form controls and buttons\n$input-box-shadow: inset 0 1px 1px rgba($black,.075) !default;\n\n$input-border-radius: $border-radius !default;\n$input-border-radius-lg: $border-radius-lg !default;\n$input-border-radius-sm: $border-radius-sm !default;\n\n$input-focus-bg: $input-bg !default;\n$input-focus-border-color: lighten(theme-color(\"primary\"), 25%) !default;\n$input-focus-box-shadow: $input-box-shadow, $btn-focus-box-shadow !default;\n$input-focus-color: $input-color !default;\n\n$input-placeholder-color: $gray-600 !default;\n\n$input-height-border: $input-btn-border-width * 2 !default;\n\n$input-height-inner: ($font-size-base * $input-btn-line-height) + ($input-btn-padding-y * 2) !default;\n$input-height: calc(#{$input-height-inner} + #{$input-height-border}) !default;\n\n$input-height-inner-sm: ($font-size-sm * $input-btn-line-height-sm) + ($input-btn-padding-y-sm * 2) !default;\n$input-height-sm: calc(#{$input-height-inner-sm} + #{$input-height-border}) !default;\n\n$input-height-inner-lg: ($font-size-sm * $input-btn-line-height-lg) + ($input-btn-padding-y-lg * 2) !default;\n$input-height-lg: calc(#{$input-height-inner-lg} + #{$input-height-border}) !default;\n\n$input-transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s !default;\n\n$form-text-margin-top: .25rem !default;\n\n$form-check-margin-bottom: .5rem !default;\n$form-check-input-gutter: 1.25rem !default;\n$form-check-input-margin-y: .25rem !default;\n$form-check-input-margin-x: .25rem !default;\n\n$form-check-inline-margin-x: .75rem !default;\n\n$form-group-margin-bottom: 1rem !default;\n\n$input-group-addon-bg: $gray-200 !default;\n$input-group-addon-border-color: $input-border-color !default;\n\n$custom-control-gutter: 1.5rem !default;\n$custom-control-spacer-y: .25rem !default;\n$custom-control-spacer-x: 1rem !default;\n\n$custom-control-indicator-size: 1rem !default;\n$custom-control-indicator-bg: #ddd !default;\n$custom-control-indicator-bg-size: 50% 50% !default;\n$custom-control-indicator-box-shadow: inset 0 .25rem .25rem rgba($black,.1) !default;\n\n$custom-control-indicator-disabled-bg: $gray-200 !default;\n$custom-control-description-disabled-color: $gray-600 !default;\n\n$custom-control-indicator-checked-color: $white !default;\n$custom-control-indicator-checked-bg: theme-color(\"primary\") !default;\n$custom-control-indicator-checked-box-shadow: none !default;\n\n$custom-control-indicator-focus-box-shadow: 0 0 0 1px $body-bg, 0 0 0 3px theme-color(\"primary\") !default;\n\n$custom-control-indicator-active-color: $white !default;\n$custom-control-indicator-active-bg: lighten(theme-color(\"primary\"), 35%) !default;\n$custom-control-indicator-active-box-shadow: none !default;\n\n$custom-checkbox-indicator-border-radius: $border-radius !default;\n$custom-checkbox-indicator-icon-checked: str-replace(url(\"data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3E%3Cpath fill='#{$custom-control-indicator-checked-color}' d='M6.564.75l-3.59 3.612-1.538-1.55L0 4.26 2.974 7.25 8 2.193z'/%3E%3C/svg%3E\"), \"#\", \"%23\") !default;\n\n$custom-checkbox-indicator-indeterminate-bg: theme-color(\"primary\") !default;\n$custom-checkbox-indicator-indeterminate-color: $custom-control-indicator-checked-color !default;\n$custom-checkbox-indicator-icon-indeterminate: str-replace(url(\"data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 4'%3E%3Cpath stroke='#{$custom-checkbox-indicator-indeterminate-color}' d='M0 2h4'/%3E%3C/svg%3E\"), \"#\", \"%23\") !default;\n$custom-checkbox-indicator-indeterminate-box-shadow: none !default;\n\n$custom-radio-indicator-border-radius: 50% !default;\n$custom-radio-indicator-icon-checked: str-replace(url(\"data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3E%3Ccircle r='3' fill='#{$custom-control-indicator-checked-color}'/%3E%3C/svg%3E\"), \"#\", \"%23\") !default;\n\n$custom-select-padding-y: .375rem !default;\n$custom-select-padding-x: .75rem !default;\n$custom-select-height: $input-height !default;\n$custom-select-indicator-padding: 1rem !default; // Extra padding to account for the presence of the background-image based indicator\n$custom-select-line-height: $input-btn-line-height !default;\n$custom-select-color: $input-color !default;\n$custom-select-disabled-color: $gray-600 !default;\n$custom-select-bg: $white !default;\n$custom-select-disabled-bg: $gray-200 !default;\n$custom-select-bg-size: 8px 10px !default; // In pixels because image dimensions\n$custom-select-indicator-color: #333 !default;\n$custom-select-indicator: str-replace(url(\"data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 5'%3E%3Cpath fill='#{$custom-select-indicator-color}' d='M2 0L0 2h4zm0 5L0 3h4z'/%3E%3C/svg%3E\"), \"#\", \"%23\") !default;\n$custom-select-border-width: $input-btn-border-width !default;\n$custom-select-border-color: $input-border-color !default;\n$custom-select-border-radius: $border-radius !default;\n\n$custom-select-focus-border-color: lighten(theme-color(\"primary\"), 25%) !default;\n$custom-select-focus-box-shadow: inset 0 1px 2px rgba($black, .075), 0 0 5px rgba($custom-select-focus-border-color, .5) !default;\n\n$custom-select-font-size-sm: 75% !default;\n$custom-select-height-sm: $input-height-sm !default;\n\n$custom-file-height: 2.5rem !default;\n$custom-file-width: 14rem !default;\n$custom-file-focus-box-shadow: 0 0 0 .075rem $white, 0 0 0 .2rem theme-color(\"primary\") !default;\n\n$custom-file-padding-y: 1rem !default;\n$custom-file-padding-x: .5rem !default;\n$custom-file-line-height: 1.5 !default;\n$custom-file-color: $gray-700 !default;\n$custom-file-bg: $white !default;\n$custom-file-border-width: $border-width !default;\n$custom-file-border-color: $input-border-color !default;\n$custom-file-border-radius: $border-radius !default;\n$custom-file-box-shadow: inset 0 .2rem .4rem rgba($black,.05) !default;\n$custom-file-button-color: $custom-file-color !default;\n$custom-file-button-bg: $gray-200 !default;\n$custom-file-text: (\n placeholder: (\n en: \"Choose file...\"\n ),\n button-label: (\n en: \"Browse\"\n )\n) !default;\n\n\n// Form validation\n$form-feedback-valid-color: theme-color(\"success\") !default;\n$form-feedback-invalid-color: theme-color(\"danger\") !default;\n\n\n// Dropdowns\n//\n// Dropdown menu container and contents.\n\n$dropdown-min-width: 10rem !default;\n$dropdown-padding-y: .5rem !default;\n$dropdown-spacer: .125rem !default;\n$dropdown-bg: $white !default;\n$dropdown-border-color: rgba($black,.15) !default;\n$dropdown-border-width: $border-width !default;\n$dropdown-divider-bg: $gray-200 !default;\n$dropdown-box-shadow: 0 .5rem 1rem rgba($black,.175) !default;\n\n$dropdown-link-color: $gray-900 !default;\n$dropdown-link-hover-color: darken($gray-900, 5%) !default;\n$dropdown-link-hover-bg: $gray-100 !default;\n\n$dropdown-link-active-color: $component-active-color !default;\n$dropdown-link-active-bg: $component-active-bg !default;\n\n$dropdown-link-disabled-color: $gray-600 !default;\n\n$dropdown-item-padding-y: .25rem !default;\n$dropdown-item-padding-x: 1.5rem !default;\n\n$dropdown-header-color: $gray-600 !default;\n\n\n// Z-index master list\n//\n// Warning: Avoid customizing these values. They're used for a bird's eye view\n// of components dependent on the z-axis and are designed to all work together.\n\n$zindex-dropdown: 1000 !default;\n$zindex-sticky: 1020 !default;\n$zindex-fixed: 1030 !default;\n$zindex-modal-backdrop: 1040 !default;\n$zindex-modal: 1050 !default;\n$zindex-popover: 1060 !default;\n$zindex-tooltip: 1070 !default;\n\n// Navs\n\n$nav-link-padding-y: .5rem !default;\n$nav-link-padding-x: 1rem !default;\n$nav-link-disabled-color: $gray-600 !default;\n\n$nav-tabs-border-color: #ddd !default;\n$nav-tabs-border-width: $border-width !default;\n$nav-tabs-border-radius: $border-radius !default;\n$nav-tabs-link-hover-border-color: $gray-200 !default;\n$nav-tabs-link-active-color: $gray-700 !default;\n$nav-tabs-link-active-bg: $body-bg !default;\n$nav-tabs-link-active-border-color: #ddd !default;\n\n$nav-pills-border-radius: $border-radius !default;\n$nav-pills-link-active-color: $component-active-color !default;\n$nav-pills-link-active-bg: $component-active-bg !default;\n\n// Navbar\n\n$navbar-padding-y: ($spacer / 2) !default;\n$navbar-padding-x: $spacer !default;\n\n$navbar-brand-font-size: $font-size-lg !default;\n// Compute the navbar-brand padding-y so the navbar-brand will have the same height as navbar-text and nav-link\n$nav-link-height: $navbar-brand-font-size * $line-height-base !default;\n$navbar-brand-height: ($font-size-base * $line-height-base + $nav-link-padding-y * 2) !default;\n$navbar-brand-padding-y: ($navbar-brand-height - $nav-link-height) / 2 !default;\n\n$navbar-toggler-padding-y: .25rem !default;\n$navbar-toggler-padding-x: .75rem !default;\n$navbar-toggler-font-size: $font-size-lg !default;\n$navbar-toggler-border-radius: $btn-border-radius !default;\n\n$navbar-dark-color: rgba($white,.5) !default;\n$navbar-dark-hover-color: rgba($white,.75) !default;\n$navbar-dark-active-color: rgba($white,1) !default;\n$navbar-dark-disabled-color: rgba($white,.25) !default;\n$navbar-dark-toggler-icon-bg: str-replace(url(\"data:image/svg+xml;charset=utf8,%3Csvg viewBox='0 0 30 30' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath stroke='#{$navbar-dark-color}' stroke-width='2' stroke-linecap='round' stroke-miterlimit='10' d='M4 7h22M4 15h22M4 23h22'/%3E%3C/svg%3E\"), \"#\", \"%23\") !default;\n$navbar-dark-toggler-border-color: rgba($white,.1) !default;\n\n$navbar-light-color: rgba($black,.5) !default;\n$navbar-light-hover-color: rgba($black,.7) !default;\n$navbar-light-active-color: rgba($black,.9) !default;\n$navbar-light-disabled-color: rgba($black,.3) !default;\n$navbar-light-toggler-icon-bg: str-replace(url(\"data:image/svg+xml;charset=utf8,%3Csvg viewBox='0 0 30 30' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath stroke='#{$navbar-light-color}' stroke-width='2' stroke-linecap='round' stroke-miterlimit='10' d='M4 7h22M4 15h22M4 23h22'/%3E%3C/svg%3E\"), \"#\", \"%23\") !default;\n$navbar-light-toggler-border-color: rgba($black,.1) !default;\n\n// Pagination\n\n$pagination-padding-y: .5rem !default;\n$pagination-padding-x: .75rem !default;\n$pagination-padding-y-sm: .25rem !default;\n$pagination-padding-x-sm: .5rem !default;\n$pagination-padding-y-lg: .75rem !default;\n$pagination-padding-x-lg: 1.5rem !default;\n$pagination-line-height: 1.25 !default;\n\n$pagination-color: $link-color !default;\n$pagination-bg: $white !default;\n$pagination-border-width: $border-width !default;\n$pagination-border-color: #ddd !default;\n\n$pagination-hover-color: $link-hover-color !default;\n$pagination-hover-bg: $gray-200 !default;\n$pagination-hover-border-color: #ddd !default;\n\n$pagination-active-color: $white !default;\n$pagination-active-bg: theme-color(\"primary\") !default;\n$pagination-active-border-color: theme-color(\"primary\") !default;\n\n$pagination-disabled-color: $gray-600 !default;\n$pagination-disabled-bg: $white !default;\n$pagination-disabled-border-color: #ddd !default;\n\n\n// Jumbotron\n\n$jumbotron-padding: 2rem !default;\n$jumbotron-bg: $gray-200 !default;\n\n\n// Cards\n\n$card-spacer-y: .75rem !default;\n$card-spacer-x: 1.25rem !default;\n$card-border-width: 1px !default;\n$card-border-radius: $border-radius !default;\n$card-border-color: rgba($black,.125) !default;\n$card-inner-border-radius: calc(#{$card-border-radius} - #{$card-border-width}) !default;\n$card-cap-bg: rgba($black, .03) !default;\n$card-bg: $white !default;\n\n$card-img-overlay-padding: 1.25rem !default;\n\n$card-deck-margin: ($grid-gutter-width / 2) !default;\n\n$card-columns-count: 3 !default;\n$card-columns-gap: 1.25rem !default;\n$card-columns-margin: $card-spacer-y !default;\n\n\n// Tooltips\n\n$tooltip-max-width: 200px !default;\n$tooltip-color: $white !default;\n$tooltip-bg: $black !default;\n$tooltip-opacity: .9 !default;\n$tooltip-padding-y: 3px !default;\n$tooltip-padding-x: 8px !default;\n$tooltip-margin: 0 !default;\n\n\n$tooltip-arrow-width: 5px !default;\n$tooltip-arrow-height: 5px !default;\n$tooltip-arrow-color: $tooltip-bg !default;\n\n\n// Popovers\n\n$popover-inner-padding: 1px !default;\n$popover-bg: $white !default;\n$popover-max-width: 276px !default;\n$popover-border-width: $border-width !default;\n$popover-border-color: rgba($black,.2) !default;\n$popover-box-shadow: 0 5px 10px rgba($black,.2) !default;\n\n$popover-header-bg: darken($popover-bg, 3%) !default;\n$popover-header-color: $headings-color !default;\n$popover-header-padding-y: 8px !default;\n$popover-header-padding-x: 14px !default;\n\n$popover-body-color: $body-color !default;\n$popover-body-padding-y: 9px !default;\n$popover-body-padding-x: 14px !default;\n\n$popover-arrow-width: 10px !default;\n$popover-arrow-height: 5px !default;\n$popover-arrow-color: $popover-bg !default;\n\n$popover-arrow-outer-width: ($popover-arrow-width + 1px) !default;\n$popover-arrow-outer-color: fade-in($popover-border-color, .05) !default;\n\n\n// Badges\n\n$badge-color: $white !default;\n$badge-font-size: 75% !default;\n$badge-font-weight: $font-weight-bold !default;\n$badge-padding-y: .25em !default;\n$badge-padding-x: .4em !default;\n\n$badge-pill-padding-x: .6em !default;\n// Use a higher than normal value to ensure completely rounded edges when\n// customizing padding or font-size on labels.\n$badge-pill-border-radius: 10rem !default;\n\n\n// Modals\n\n// Padding applied to the modal body\n$modal-inner-padding: 15px !default;\n\n$modal-dialog-margin: 10px !default;\n$modal-dialog-margin-y-sm-up: 30px !default;\n\n$modal-title-line-height: $line-height-base !default;\n\n$modal-content-bg: $white !default;\n$modal-content-border-color: rgba($black,.2) !default;\n$modal-content-border-width: $border-width !default;\n$modal-content-box-shadow-xs: 0 3px 9px rgba($black,.5) !default;\n$modal-content-box-shadow-sm-up: 0 5px 15px rgba($black,.5) !default;\n\n$modal-backdrop-bg: $black !default;\n$modal-backdrop-opacity: .5 !default;\n$modal-header-border-color: $gray-200 !default;\n$modal-footer-border-color: $modal-header-border-color !default;\n$modal-header-border-width: $modal-content-border-width !default;\n$modal-footer-border-width: $modal-header-border-width !default;\n$modal-header-padding: 15px !default;\n\n$modal-lg: 800px !default;\n$modal-md: 500px !default;\n$modal-sm: 300px !default;\n\n$modal-transition: transform .3s ease-out !default;\n\n\n// Alerts\n//\n// Define alert colors, border radius, and padding.\n\n$alert-padding-y: .75rem !default;\n$alert-padding-x: 1.25rem !default;\n$alert-margin-bottom: 1rem !default;\n$alert-border-radius: $border-radius !default;\n$alert-link-font-weight: $font-weight-bold !default;\n$alert-border-width: $border-width !default;\n\n\n// Progress bars\n\n$progress-height: 1rem !default;\n$progress-font-size: .75rem !default;\n$progress-bg: $gray-200 !default;\n$progress-border-radius: $border-radius !default;\n$progress-box-shadow: inset 0 .1rem .1rem rgba($black,.1) !default;\n$progress-bar-color: $white !default;\n$progress-bar-bg: theme-color(\"primary\") !default;\n$progress-bar-animation-timing: 1s linear infinite !default;\n$progress-bar-transition: width .6s ease !default;\n\n// List group\n\n$list-group-bg: $white !default;\n$list-group-border-color: rgba($black,.125) !default;\n$list-group-border-width: $border-width !default;\n$list-group-border-radius: $border-radius !default;\n\n$list-group-item-padding-y: .75rem !default;\n$list-group-item-padding-x: 1.25rem !default;\n\n$list-group-hover-bg: $gray-100 !default;\n$list-group-active-color: $component-active-color !default;\n$list-group-active-bg: $component-active-bg !default;\n$list-group-active-border-color: $list-group-active-bg !default;\n\n$list-group-disabled-color: $gray-600 !default;\n$list-group-disabled-bg: $list-group-bg !default;\n\n$list-group-action-color: $gray-700 !default;\n$list-group-action-hover-color: $list-group-action-color !default;\n\n$list-group-action-active-color: $body-color !default;\n$list-group-action-active-bg: $gray-200 !default;\n\n\n// Image thumbnails\n\n$thumbnail-padding: .25rem !default;\n$thumbnail-bg: $body-bg !default;\n$thumbnail-border-width: $border-width !default;\n$thumbnail-border-color: #ddd !default;\n$thumbnail-border-radius: $border-radius !default;\n$thumbnail-box-shadow: 0 1px 2px rgba($black,.075) !default;\n$thumbnail-transition: all .2s ease-in-out !default;\n\n\n// Figures\n\n$figure-caption-font-size: 90% !default;\n$figure-caption-color: $gray-600 !default;\n\n\n// Breadcrumbs\n\n$breadcrumb-padding-y: .75rem !default;\n$breadcrumb-padding-x: 1rem !default;\n$breadcrumb-item-padding: .5rem !default;\n\n$breadcrumb-bg: $gray-200 !default;\n$breadcrumb-divider-color: $gray-600 !default;\n$breadcrumb-active-color: $gray-600 !default;\n$breadcrumb-divider: \"/\" !default;\n\n\n// Carousel\n\n$carousel-control-color: $white !default;\n$carousel-control-width: 15% !default;\n$carousel-control-opacity: .5 !default;\n\n$carousel-indicator-width: 30px !default;\n$carousel-indicator-height: 3px !default;\n$carousel-indicator-spacer: 3px !default;\n$carousel-indicator-active-bg: $white !default;\n\n$carousel-caption-width: 70% !default;\n$carousel-caption-color: $white !default;\n\n$carousel-control-icon-width: 20px !default;\n\n$carousel-control-prev-icon-bg: str-replace(url(\"data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='#{$carousel-control-color}' viewBox='0 0 8 8'%3E%3Cpath d='M4 0l-4 4 4 4 1.5-1.5-2.5-2.5 2.5-2.5-1.5-1.5z'/%3E%3C/svg%3E\"), \"#\", \"%23\") !default;\n$carousel-control-next-icon-bg: str-replace(url(\"data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='#{$carousel-control-color}' viewBox='0 0 8 8'%3E%3Cpath d='M1.5 0l-1.5 1.5 2.5 2.5-2.5 2.5 1.5 1.5 4-4-4-4z'/%3E%3C/svg%3E\"), \"#\", \"%23\") !default;\n\n$carousel-transition: transform .6s ease !default;\n\n\n// Close\n\n$close-font-size: $font-size-base * 1.5 !default;\n$close-font-weight: $font-weight-bold !default;\n$close-color: $black !default;\n$close-text-shadow: 0 1px 0 $white !default;\n\n// Code\n\n$code-font-size: 90% !default;\n$code-padding-y: .2rem !default;\n$code-padding-x: .4rem !default;\n$code-color: #bd4147 !default;\n$code-bg: $gray-100 !default;\n\n$kbd-color: $white !default;\n$kbd-bg: $gray-900 !default;\n\n$pre-color: $gray-900 !default;\n$pre-scrollable-max-height: 340px !default;\n","// Framework grid generation\n//\n// Used only by Bootstrap to generate the correct number of grid classes given\n// any value of `$grid-columns`.\n\n@mixin make-grid-columns($columns: $grid-columns, $gutter: $grid-gutter-width, $breakpoints: $grid-breakpoints) {\n // Common properties for all breakpoints\n %grid-column {\n position: relative;\n width: 100%;\n min-height: 1px; // Prevent columns from collapsing when empty\n padding-right: ($gutter / 2);\n padding-left: ($gutter / 2);\n }\n\n @each $breakpoint in map-keys($breakpoints) {\n $infix: breakpoint-infix($breakpoint, $breakpoints);\n\n // Allow columns to stretch full width below their breakpoints\n @for $i from 1 through $columns {\n .col#{$infix}-#{$i} {\n @extend %grid-column;\n }\n }\n .col#{$infix},\n .col#{$infix}-auto {\n @extend %grid-column;\n }\n\n @include media-breakpoint-up($breakpoint, $breakpoints) {\n // Provide basic `.col-{bp}` classes for equal-width flexbox columns\n .col#{$infix} {\n flex-basis: 0;\n flex-grow: 1;\n max-width: 100%;\n }\n .col#{$infix}-auto {\n flex: 0 0 auto;\n width: auto;\n max-width: none; // Reset earlier grid tiers\n }\n\n @for $i from 1 through $columns {\n .col#{$infix}-#{$i} {\n @include make-col($i, $columns);\n }\n }\n\n @for $i from 1 through $columns {\n .order#{$infix}-#{$i} {\n order: $i;\n }\n }\n }\n }\n}\n","// Flex variation\n//\n// Custom styles for additional flex alignment options.\n\n@each $breakpoint in map-keys($grid-breakpoints) {\n @include media-breakpoint-up($breakpoint) {\n $infix: breakpoint-infix($breakpoint, $grid-breakpoints);\n\n .flex#{$infix}-row { flex-direction: row !important; }\n .flex#{$infix}-column { flex-direction: column !important; }\n .flex#{$infix}-row-reverse { flex-direction: row-reverse !important; }\n .flex#{$infix}-column-reverse { flex-direction: column-reverse !important; }\n\n .flex#{$infix}-wrap { flex-wrap: wrap !important; }\n .flex#{$infix}-nowrap { flex-wrap: nowrap !important; }\n .flex#{$infix}-wrap-reverse { flex-wrap: wrap-reverse !important; }\n\n .justify-content#{$infix}-start { justify-content: flex-start !important; }\n .justify-content#{$infix}-end { justify-content: flex-end !important; }\n .justify-content#{$infix}-center { justify-content: center !important; }\n .justify-content#{$infix}-between { justify-content: space-between !important; }\n .justify-content#{$infix}-around { justify-content: space-around !important; }\n\n .align-items#{$infix}-start { align-items: flex-start !important; }\n .align-items#{$infix}-end { align-items: flex-end !important; }\n .align-items#{$infix}-center { align-items: center !important; }\n .align-items#{$infix}-baseline { align-items: baseline !important; }\n .align-items#{$infix}-stretch { align-items: stretch !important; }\n\n .align-content#{$infix}-start { align-content: flex-start !important; }\n .align-content#{$infix}-end { align-content: flex-end !important; }\n .align-content#{$infix}-center { align-content: center !important; }\n .align-content#{$infix}-between { align-content: space-between !important; }\n .align-content#{$infix}-around { align-content: space-around !important; }\n .align-content#{$infix}-stretch { align-content: stretch !important; }\n\n .align-self#{$infix}-auto { align-self: auto !important; }\n .align-self#{$infix}-start { align-self: flex-start !important; }\n .align-self#{$infix}-end { align-self: flex-end !important; }\n .align-self#{$infix}-center { align-self: center !important; }\n .align-self#{$infix}-baseline { align-self: baseline !important; }\n .align-self#{$infix}-stretch { align-self: stretch !important; }\n }\n}\n"]} \ No newline at end of file
diff --git a/library/bootstrap/css/bootstrap-grid.min.css b/library/bootstrap/css/bootstrap-grid.min.css
index c225dffab..b775555cc 100644
--- a/library/bootstrap/css/bootstrap-grid.min.css
+++ b/library/bootstrap/css/bootstrap-grid.min.css
@@ -1 +1,2 @@
-@-ms-viewport{width:device-width}html{-webkit-box-sizing:border-box;box-sizing:border-box;-ms-overflow-style:scrollbar}*,::after,::before{-webkit-box-sizing:inherit;box-sizing:inherit}.container{margin-right:auto;margin-left:auto;padding-right:15px;padding-left:15px}@media (min-width:576px){.container{padding-right:15px;padding-left:15px}}@media (min-width:768px){.container{padding-right:15px;padding-left:15px}}@media (min-width:992px){.container{padding-right:15px;padding-left:15px}}@media (min-width:1200px){.container{padding-right:15px;padding-left:15px}}@media (min-width:576px){.container{width:540px;max-width:100%}}@media (min-width:768px){.container{width:720px;max-width:100%}}@media (min-width:992px){.container{width:960px;max-width:100%}}@media (min-width:1200px){.container{width:1140px;max-width:100%}}.container-fluid{width:100%;margin-right:auto;margin-left:auto;padding-right:15px;padding-left:15px}@media (min-width:576px){.container-fluid{padding-right:15px;padding-left:15px}}@media (min-width:768px){.container-fluid{padding-right:15px;padding-left:15px}}@media (min-width:992px){.container-fluid{padding-right:15px;padding-left:15px}}@media (min-width:1200px){.container-fluid{padding-right:15px;padding-left:15px}}.row{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;margin-right:-15px;margin-left:-15px}@media (min-width:576px){.row{margin-right:-15px;margin-left:-15px}}@media (min-width:768px){.row{margin-right:-15px;margin-left:-15px}}@media (min-width:992px){.row{margin-right:-15px;margin-left:-15px}}@media (min-width:1200px){.row{margin-right:-15px;margin-left:-15px}}.no-gutters{margin-right:0;margin-left:0}.no-gutters>.col,.no-gutters>[class*=col-]{padding-right:0;padding-left:0}.col,.col-1,.col-10,.col-11,.col-12,.col-2,.col-3,.col-4,.col-5,.col-6,.col-7,.col-8,.col-9,.col-auto,.col-lg,.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.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-auto,.col-md,.col-md-1,.col-md-10,.col-md-11,.col-md-12,.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-auto,.col-sm,.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.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-auto,.col-xl,.col-xl-1,.col-xl-10,.col-xl-11,.col-xl-12,.col-xl-2,.col-xl-3,.col-xl-4,.col-xl-5,.col-xl-6,.col-xl-7,.col-xl-8,.col-xl-9,.col-xl-auto{position:relative;width:100%;min-height:1px;padding-right:15px;padding-left:15px}@media (min-width:576px){.col,.col-1,.col-10,.col-11,.col-12,.col-2,.col-3,.col-4,.col-5,.col-6,.col-7,.col-8,.col-9,.col-auto,.col-lg,.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.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-auto,.col-md,.col-md-1,.col-md-10,.col-md-11,.col-md-12,.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-auto,.col-sm,.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.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-auto,.col-xl,.col-xl-1,.col-xl-10,.col-xl-11,.col-xl-12,.col-xl-2,.col-xl-3,.col-xl-4,.col-xl-5,.col-xl-6,.col-xl-7,.col-xl-8,.col-xl-9,.col-xl-auto{padding-right:15px;padding-left:15px}}@media (min-width:768px){.col,.col-1,.col-10,.col-11,.col-12,.col-2,.col-3,.col-4,.col-5,.col-6,.col-7,.col-8,.col-9,.col-auto,.col-lg,.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.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-auto,.col-md,.col-md-1,.col-md-10,.col-md-11,.col-md-12,.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-auto,.col-sm,.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.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-auto,.col-xl,.col-xl-1,.col-xl-10,.col-xl-11,.col-xl-12,.col-xl-2,.col-xl-3,.col-xl-4,.col-xl-5,.col-xl-6,.col-xl-7,.col-xl-8,.col-xl-9,.col-xl-auto{padding-right:15px;padding-left:15px}}@media (min-width:992px){.col,.col-1,.col-10,.col-11,.col-12,.col-2,.col-3,.col-4,.col-5,.col-6,.col-7,.col-8,.col-9,.col-auto,.col-lg,.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.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-auto,.col-md,.col-md-1,.col-md-10,.col-md-11,.col-md-12,.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-auto,.col-sm,.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.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-auto,.col-xl,.col-xl-1,.col-xl-10,.col-xl-11,.col-xl-12,.col-xl-2,.col-xl-3,.col-xl-4,.col-xl-5,.col-xl-6,.col-xl-7,.col-xl-8,.col-xl-9,.col-xl-auto{padding-right:15px;padding-left:15px}}@media (min-width:1200px){.col,.col-1,.col-10,.col-11,.col-12,.col-2,.col-3,.col-4,.col-5,.col-6,.col-7,.col-8,.col-9,.col-auto,.col-lg,.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.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-auto,.col-md,.col-md-1,.col-md-10,.col-md-11,.col-md-12,.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-auto,.col-sm,.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.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-auto,.col-xl,.col-xl-1,.col-xl-10,.col-xl-11,.col-xl-12,.col-xl-2,.col-xl-3,.col-xl-4,.col-xl-5,.col-xl-6,.col-xl-7,.col-xl-8,.col-xl-9,.col-xl-auto{padding-right:15px;padding-left:15px}}.col{-webkit-flex-basis:0;-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-auto{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;width:auto}.col-1{width:8.333333%}.col-2{width:16.666667%}.col-3{width:25%}.col-4{width:33.333333%}.col-5{width:41.666667%}.col-6{width:50%}.col-7{width:58.333333%}.col-8{width:66.666667%}.col-9{width:75%}.col-10{width:83.333333%}.col-11{width:91.666667%}.col-12{width:100%}.pull-0{right:auto}.pull-1{right:8.333333%}.pull-2{right:16.666667%}.pull-3{right:25%}.pull-4{right:33.333333%}.pull-5{right:41.666667%}.pull-6{right:50%}.pull-7{right:58.333333%}.pull-8{right:66.666667%}.pull-9{right:75%}.pull-10{right:83.333333%}.pull-11{right:91.666667%}.pull-12{right:100%}.push-0{left:auto}.push-1{left:8.333333%}.push-2{left:16.666667%}.push-3{left:25%}.push-4{left:33.333333%}.push-5{left:41.666667%}.push-6{left:50%}.push-7{left:58.333333%}.push-8{left:66.666667%}.push-9{left:75%}.push-10{left:83.333333%}.push-11{left:91.666667%}.push-12{left:100%}.offset-1{margin-left:8.333333%}.offset-2{margin-left:16.666667%}.offset-3{margin-left:25%}.offset-4{margin-left:33.333333%}.offset-5{margin-left:41.666667%}.offset-6{margin-left:50%}.offset-7{margin-left:58.333333%}.offset-8{margin-left:66.666667%}.offset-9{margin-left:75%}.offset-10{margin-left:83.333333%}.offset-11{margin-left:91.666667%}@media (min-width:576px){.col-sm{-webkit-flex-basis:0;-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-sm-auto{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;width:auto}.col-sm-1{width:8.333333%}.col-sm-2{width:16.666667%}.col-sm-3{width:25%}.col-sm-4{width:33.333333%}.col-sm-5{width:41.666667%}.col-sm-6{width:50%}.col-sm-7{width:58.333333%}.col-sm-8{width:66.666667%}.col-sm-9{width:75%}.col-sm-10{width:83.333333%}.col-sm-11{width:91.666667%}.col-sm-12{width:100%}.pull-sm-0{right:auto}.pull-sm-1{right:8.333333%}.pull-sm-2{right:16.666667%}.pull-sm-3{right:25%}.pull-sm-4{right:33.333333%}.pull-sm-5{right:41.666667%}.pull-sm-6{right:50%}.pull-sm-7{right:58.333333%}.pull-sm-8{right:66.666667%}.pull-sm-9{right:75%}.pull-sm-10{right:83.333333%}.pull-sm-11{right:91.666667%}.pull-sm-12{right:100%}.push-sm-0{left:auto}.push-sm-1{left:8.333333%}.push-sm-2{left:16.666667%}.push-sm-3{left:25%}.push-sm-4{left:33.333333%}.push-sm-5{left:41.666667%}.push-sm-6{left:50%}.push-sm-7{left:58.333333%}.push-sm-8{left:66.666667%}.push-sm-9{left:75%}.push-sm-10{left:83.333333%}.push-sm-11{left:91.666667%}.push-sm-12{left:100%}.offset-sm-0{margin-left:0}.offset-sm-1{margin-left:8.333333%}.offset-sm-2{margin-left:16.666667%}.offset-sm-3{margin-left:25%}.offset-sm-4{margin-left:33.333333%}.offset-sm-5{margin-left:41.666667%}.offset-sm-6{margin-left:50%}.offset-sm-7{margin-left:58.333333%}.offset-sm-8{margin-left:66.666667%}.offset-sm-9{margin-left:75%}.offset-sm-10{margin-left:83.333333%}.offset-sm-11{margin-left:91.666667%}}@media (min-width:768px){.col-md{-webkit-flex-basis:0;-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-md-auto{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;width:auto}.col-md-1{width:8.333333%}.col-md-2{width:16.666667%}.col-md-3{width:25%}.col-md-4{width:33.333333%}.col-md-5{width:41.666667%}.col-md-6{width:50%}.col-md-7{width:58.333333%}.col-md-8{width:66.666667%}.col-md-9{width:75%}.col-md-10{width:83.333333%}.col-md-11{width:91.666667%}.col-md-12{width:100%}.pull-md-0{right:auto}.pull-md-1{right:8.333333%}.pull-md-2{right:16.666667%}.pull-md-3{right:25%}.pull-md-4{right:33.333333%}.pull-md-5{right:41.666667%}.pull-md-6{right:50%}.pull-md-7{right:58.333333%}.pull-md-8{right:66.666667%}.pull-md-9{right:75%}.pull-md-10{right:83.333333%}.pull-md-11{right:91.666667%}.pull-md-12{right:100%}.push-md-0{left:auto}.push-md-1{left:8.333333%}.push-md-2{left:16.666667%}.push-md-3{left:25%}.push-md-4{left:33.333333%}.push-md-5{left:41.666667%}.push-md-6{left:50%}.push-md-7{left:58.333333%}.push-md-8{left:66.666667%}.push-md-9{left:75%}.push-md-10{left:83.333333%}.push-md-11{left:91.666667%}.push-md-12{left:100%}.offset-md-0{margin-left:0}.offset-md-1{margin-left:8.333333%}.offset-md-2{margin-left:16.666667%}.offset-md-3{margin-left:25%}.offset-md-4{margin-left:33.333333%}.offset-md-5{margin-left:41.666667%}.offset-md-6{margin-left:50%}.offset-md-7{margin-left:58.333333%}.offset-md-8{margin-left:66.666667%}.offset-md-9{margin-left:75%}.offset-md-10{margin-left:83.333333%}.offset-md-11{margin-left:91.666667%}}@media (min-width:992px){.col-lg{-webkit-flex-basis:0;-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-lg-auto{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;width:auto}.col-lg-1{width:8.333333%}.col-lg-2{width:16.666667%}.col-lg-3{width:25%}.col-lg-4{width:33.333333%}.col-lg-5{width:41.666667%}.col-lg-6{width:50%}.col-lg-7{width:58.333333%}.col-lg-8{width:66.666667%}.col-lg-9{width:75%}.col-lg-10{width:83.333333%}.col-lg-11{width:91.666667%}.col-lg-12{width:100%}.pull-lg-0{right:auto}.pull-lg-1{right:8.333333%}.pull-lg-2{right:16.666667%}.pull-lg-3{right:25%}.pull-lg-4{right:33.333333%}.pull-lg-5{right:41.666667%}.pull-lg-6{right:50%}.pull-lg-7{right:58.333333%}.pull-lg-8{right:66.666667%}.pull-lg-9{right:75%}.pull-lg-10{right:83.333333%}.pull-lg-11{right:91.666667%}.pull-lg-12{right:100%}.push-lg-0{left:auto}.push-lg-1{left:8.333333%}.push-lg-2{left:16.666667%}.push-lg-3{left:25%}.push-lg-4{left:33.333333%}.push-lg-5{left:41.666667%}.push-lg-6{left:50%}.push-lg-7{left:58.333333%}.push-lg-8{left:66.666667%}.push-lg-9{left:75%}.push-lg-10{left:83.333333%}.push-lg-11{left:91.666667%}.push-lg-12{left:100%}.offset-lg-0{margin-left:0}.offset-lg-1{margin-left:8.333333%}.offset-lg-2{margin-left:16.666667%}.offset-lg-3{margin-left:25%}.offset-lg-4{margin-left:33.333333%}.offset-lg-5{margin-left:41.666667%}.offset-lg-6{margin-left:50%}.offset-lg-7{margin-left:58.333333%}.offset-lg-8{margin-left:66.666667%}.offset-lg-9{margin-left:75%}.offset-lg-10{margin-left:83.333333%}.offset-lg-11{margin-left:91.666667%}}@media (min-width:1200px){.col-xl{-webkit-flex-basis:0;-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-xl-auto{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;width:auto}.col-xl-1{width:8.333333%}.col-xl-2{width:16.666667%}.col-xl-3{width:25%}.col-xl-4{width:33.333333%}.col-xl-5{width:41.666667%}.col-xl-6{width:50%}.col-xl-7{width:58.333333%}.col-xl-8{width:66.666667%}.col-xl-9{width:75%}.col-xl-10{width:83.333333%}.col-xl-11{width:91.666667%}.col-xl-12{width:100%}.pull-xl-0{right:auto}.pull-xl-1{right:8.333333%}.pull-xl-2{right:16.666667%}.pull-xl-3{right:25%}.pull-xl-4{right:33.333333%}.pull-xl-5{right:41.666667%}.pull-xl-6{right:50%}.pull-xl-7{right:58.333333%}.pull-xl-8{right:66.666667%}.pull-xl-9{right:75%}.pull-xl-10{right:83.333333%}.pull-xl-11{right:91.666667%}.pull-xl-12{right:100%}.push-xl-0{left:auto}.push-xl-1{left:8.333333%}.push-xl-2{left:16.666667%}.push-xl-3{left:25%}.push-xl-4{left:33.333333%}.push-xl-5{left:41.666667%}.push-xl-6{left:50%}.push-xl-7{left:58.333333%}.push-xl-8{left:66.666667%}.push-xl-9{left:75%}.push-xl-10{left:83.333333%}.push-xl-11{left:91.666667%}.push-xl-12{left:100%}.offset-xl-0{margin-left:0}.offset-xl-1{margin-left:8.333333%}.offset-xl-2{margin-left:16.666667%}.offset-xl-3{margin-left:25%}.offset-xl-4{margin-left:33.333333%}.offset-xl-5{margin-left:41.666667%}.offset-xl-6{margin-left:50%}.offset-xl-7{margin-left:58.333333%}.offset-xl-8{margin-left:66.666667%}.offset-xl-9{margin-left:75%}.offset-xl-10{margin-left:83.333333%}.offset-xl-11{margin-left:91.666667%}}.order-first{-webkit-box-ordinal-group:0;-webkit-order:-1;-ms-flex-order:-1;order:-1}.order-last{-webkit-box-ordinal-group:2;-webkit-order:1;-ms-flex-order:1;order:1}.order-0{-webkit-box-ordinal-group:1;-webkit-order:0;-ms-flex-order:0;order:0}.flex-row{-webkit-box-orient:horizontal!important;-webkit-box-direction:normal!important;-webkit-flex-direction:row!important;-ms-flex-direction:row!important;flex-direction:row!important}.flex-column{-webkit-box-orient:vertical!important;-webkit-box-direction:normal!important;-webkit-flex-direction:column!important;-ms-flex-direction:column!important;flex-direction:column!important}.flex-row-reverse{-webkit-box-orient:horizontal!important;-webkit-box-direction:reverse!important;-webkit-flex-direction:row-reverse!important;-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-column-reverse{-webkit-box-orient:vertical!important;-webkit-box-direction:reverse!important;-webkit-flex-direction:column-reverse!important;-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-wrap{-webkit-flex-wrap:wrap!important;-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-nowrap{-webkit-flex-wrap:nowrap!important;-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-wrap-reverse{-webkit-flex-wrap:wrap-reverse!important;-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.justify-content-start{-webkit-box-pack:start!important;-webkit-justify-content:flex-start!important;-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-end{-webkit-box-pack:end!important;-webkit-justify-content:flex-end!important;-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-center{-webkit-box-pack:center!important;-webkit-justify-content:center!important;-ms-flex-pack:center!important;justify-content:center!important}.justify-content-between{-webkit-box-pack:justify!important;-webkit-justify-content:space-between!important;-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-around{-webkit-justify-content:space-around!important;-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-start{-webkit-box-align:start!important;-webkit-align-items:flex-start!important;-ms-flex-align:start!important;align-items:flex-start!important}.align-items-end{-webkit-box-align:end!important;-webkit-align-items:flex-end!important;-ms-flex-align:end!important;align-items:flex-end!important}.align-items-center{-webkit-box-align:center!important;-webkit-align-items:center!important;-ms-flex-align:center!important;align-items:center!important}.align-items-baseline{-webkit-box-align:baseline!important;-webkit-align-items:baseline!important;-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-stretch{-webkit-box-align:stretch!important;-webkit-align-items:stretch!important;-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-start{-webkit-align-content:flex-start!important;-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-end{-webkit-align-content:flex-end!important;-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-center{-webkit-align-content:center!important;-ms-flex-line-pack:center!important;align-content:center!important}.align-content-between{-webkit-align-content:space-between!important;-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-around{-webkit-align-content:space-around!important;-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-stretch{-webkit-align-content:stretch!important;-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-auto{-webkit-align-self:auto!important;-ms-flex-item-align:auto!important;-ms-grid-row-align:auto!important;align-self:auto!important}.align-self-start{-webkit-align-self:flex-start!important;-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-end{-webkit-align-self:flex-end!important;-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-center{-webkit-align-self:center!important;-ms-flex-item-align:center!important;-ms-grid-row-align:center!important;align-self:center!important}.align-self-baseline{-webkit-align-self:baseline!important;-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-stretch{-webkit-align-self:stretch!important;-ms-flex-item-align:stretch!important;-ms-grid-row-align:stretch!important;align-self:stretch!important}@media (min-width:576px){.order-sm-first{-webkit-box-ordinal-group:0;-webkit-order:-1;-ms-flex-order:-1;order:-1}.order-sm-last{-webkit-box-ordinal-group:2;-webkit-order:1;-ms-flex-order:1;order:1}.order-sm-0{-webkit-box-ordinal-group:1;-webkit-order:0;-ms-flex-order:0;order:0}.flex-sm-row{-webkit-box-orient:horizontal!important;-webkit-box-direction:normal!important;-webkit-flex-direction:row!important;-ms-flex-direction:row!important;flex-direction:row!important}.flex-sm-column{-webkit-box-orient:vertical!important;-webkit-box-direction:normal!important;-webkit-flex-direction:column!important;-ms-flex-direction:column!important;flex-direction:column!important}.flex-sm-row-reverse{-webkit-box-orient:horizontal!important;-webkit-box-direction:reverse!important;-webkit-flex-direction:row-reverse!important;-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-sm-column-reverse{-webkit-box-orient:vertical!important;-webkit-box-direction:reverse!important;-webkit-flex-direction:column-reverse!important;-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-sm-wrap{-webkit-flex-wrap:wrap!important;-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-sm-nowrap{-webkit-flex-wrap:nowrap!important;-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-sm-wrap-reverse{-webkit-flex-wrap:wrap-reverse!important;-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.justify-content-sm-start{-webkit-box-pack:start!important;-webkit-justify-content:flex-start!important;-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-sm-end{-webkit-box-pack:end!important;-webkit-justify-content:flex-end!important;-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-sm-center{-webkit-box-pack:center!important;-webkit-justify-content:center!important;-ms-flex-pack:center!important;justify-content:center!important}.justify-content-sm-between{-webkit-box-pack:justify!important;-webkit-justify-content:space-between!important;-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-sm-around{-webkit-justify-content:space-around!important;-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-sm-start{-webkit-box-align:start!important;-webkit-align-items:flex-start!important;-ms-flex-align:start!important;align-items:flex-start!important}.align-items-sm-end{-webkit-box-align:end!important;-webkit-align-items:flex-end!important;-ms-flex-align:end!important;align-items:flex-end!important}.align-items-sm-center{-webkit-box-align:center!important;-webkit-align-items:center!important;-ms-flex-align:center!important;align-items:center!important}.align-items-sm-baseline{-webkit-box-align:baseline!important;-webkit-align-items:baseline!important;-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-sm-stretch{-webkit-box-align:stretch!important;-webkit-align-items:stretch!important;-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-sm-start{-webkit-align-content:flex-start!important;-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-sm-end{-webkit-align-content:flex-end!important;-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-sm-center{-webkit-align-content:center!important;-ms-flex-line-pack:center!important;align-content:center!important}.align-content-sm-between{-webkit-align-content:space-between!important;-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-sm-around{-webkit-align-content:space-around!important;-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-sm-stretch{-webkit-align-content:stretch!important;-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-sm-auto{-webkit-align-self:auto!important;-ms-flex-item-align:auto!important;-ms-grid-row-align:auto!important;align-self:auto!important}.align-self-sm-start{-webkit-align-self:flex-start!important;-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-sm-end{-webkit-align-self:flex-end!important;-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-sm-center{-webkit-align-self:center!important;-ms-flex-item-align:center!important;-ms-grid-row-align:center!important;align-self:center!important}.align-self-sm-baseline{-webkit-align-self:baseline!important;-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-sm-stretch{-webkit-align-self:stretch!important;-ms-flex-item-align:stretch!important;-ms-grid-row-align:stretch!important;align-self:stretch!important}}@media (min-width:768px){.order-md-first{-webkit-box-ordinal-group:0;-webkit-order:-1;-ms-flex-order:-1;order:-1}.order-md-last{-webkit-box-ordinal-group:2;-webkit-order:1;-ms-flex-order:1;order:1}.order-md-0{-webkit-box-ordinal-group:1;-webkit-order:0;-ms-flex-order:0;order:0}.flex-md-row{-webkit-box-orient:horizontal!important;-webkit-box-direction:normal!important;-webkit-flex-direction:row!important;-ms-flex-direction:row!important;flex-direction:row!important}.flex-md-column{-webkit-box-orient:vertical!important;-webkit-box-direction:normal!important;-webkit-flex-direction:column!important;-ms-flex-direction:column!important;flex-direction:column!important}.flex-md-row-reverse{-webkit-box-orient:horizontal!important;-webkit-box-direction:reverse!important;-webkit-flex-direction:row-reverse!important;-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-md-column-reverse{-webkit-box-orient:vertical!important;-webkit-box-direction:reverse!important;-webkit-flex-direction:column-reverse!important;-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-md-wrap{-webkit-flex-wrap:wrap!important;-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-md-nowrap{-webkit-flex-wrap:nowrap!important;-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-md-wrap-reverse{-webkit-flex-wrap:wrap-reverse!important;-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.justify-content-md-start{-webkit-box-pack:start!important;-webkit-justify-content:flex-start!important;-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-md-end{-webkit-box-pack:end!important;-webkit-justify-content:flex-end!important;-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-md-center{-webkit-box-pack:center!important;-webkit-justify-content:center!important;-ms-flex-pack:center!important;justify-content:center!important}.justify-content-md-between{-webkit-box-pack:justify!important;-webkit-justify-content:space-between!important;-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-md-around{-webkit-justify-content:space-around!important;-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-md-start{-webkit-box-align:start!important;-webkit-align-items:flex-start!important;-ms-flex-align:start!important;align-items:flex-start!important}.align-items-md-end{-webkit-box-align:end!important;-webkit-align-items:flex-end!important;-ms-flex-align:end!important;align-items:flex-end!important}.align-items-md-center{-webkit-box-align:center!important;-webkit-align-items:center!important;-ms-flex-align:center!important;align-items:center!important}.align-items-md-baseline{-webkit-box-align:baseline!important;-webkit-align-items:baseline!important;-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-md-stretch{-webkit-box-align:stretch!important;-webkit-align-items:stretch!important;-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-md-start{-webkit-align-content:flex-start!important;-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-md-end{-webkit-align-content:flex-end!important;-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-md-center{-webkit-align-content:center!important;-ms-flex-line-pack:center!important;align-content:center!important}.align-content-md-between{-webkit-align-content:space-between!important;-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-md-around{-webkit-align-content:space-around!important;-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-md-stretch{-webkit-align-content:stretch!important;-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-md-auto{-webkit-align-self:auto!important;-ms-flex-item-align:auto!important;-ms-grid-row-align:auto!important;align-self:auto!important}.align-self-md-start{-webkit-align-self:flex-start!important;-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-md-end{-webkit-align-self:flex-end!important;-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-md-center{-webkit-align-self:center!important;-ms-flex-item-align:center!important;-ms-grid-row-align:center!important;align-self:center!important}.align-self-md-baseline{-webkit-align-self:baseline!important;-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-md-stretch{-webkit-align-self:stretch!important;-ms-flex-item-align:stretch!important;-ms-grid-row-align:stretch!important;align-self:stretch!important}}@media (min-width:992px){.order-lg-first{-webkit-box-ordinal-group:0;-webkit-order:-1;-ms-flex-order:-1;order:-1}.order-lg-last{-webkit-box-ordinal-group:2;-webkit-order:1;-ms-flex-order:1;order:1}.order-lg-0{-webkit-box-ordinal-group:1;-webkit-order:0;-ms-flex-order:0;order:0}.flex-lg-row{-webkit-box-orient:horizontal!important;-webkit-box-direction:normal!important;-webkit-flex-direction:row!important;-ms-flex-direction:row!important;flex-direction:row!important}.flex-lg-column{-webkit-box-orient:vertical!important;-webkit-box-direction:normal!important;-webkit-flex-direction:column!important;-ms-flex-direction:column!important;flex-direction:column!important}.flex-lg-row-reverse{-webkit-box-orient:horizontal!important;-webkit-box-direction:reverse!important;-webkit-flex-direction:row-reverse!important;-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-lg-column-reverse{-webkit-box-orient:vertical!important;-webkit-box-direction:reverse!important;-webkit-flex-direction:column-reverse!important;-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-lg-wrap{-webkit-flex-wrap:wrap!important;-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-lg-nowrap{-webkit-flex-wrap:nowrap!important;-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-lg-wrap-reverse{-webkit-flex-wrap:wrap-reverse!important;-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.justify-content-lg-start{-webkit-box-pack:start!important;-webkit-justify-content:flex-start!important;-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-lg-end{-webkit-box-pack:end!important;-webkit-justify-content:flex-end!important;-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-lg-center{-webkit-box-pack:center!important;-webkit-justify-content:center!important;-ms-flex-pack:center!important;justify-content:center!important}.justify-content-lg-between{-webkit-box-pack:justify!important;-webkit-justify-content:space-between!important;-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-lg-around{-webkit-justify-content:space-around!important;-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-lg-start{-webkit-box-align:start!important;-webkit-align-items:flex-start!important;-ms-flex-align:start!important;align-items:flex-start!important}.align-items-lg-end{-webkit-box-align:end!important;-webkit-align-items:flex-end!important;-ms-flex-align:end!important;align-items:flex-end!important}.align-items-lg-center{-webkit-box-align:center!important;-webkit-align-items:center!important;-ms-flex-align:center!important;align-items:center!important}.align-items-lg-baseline{-webkit-box-align:baseline!important;-webkit-align-items:baseline!important;-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-lg-stretch{-webkit-box-align:stretch!important;-webkit-align-items:stretch!important;-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-lg-start{-webkit-align-content:flex-start!important;-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-lg-end{-webkit-align-content:flex-end!important;-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-lg-center{-webkit-align-content:center!important;-ms-flex-line-pack:center!important;align-content:center!important}.align-content-lg-between{-webkit-align-content:space-between!important;-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-lg-around{-webkit-align-content:space-around!important;-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-lg-stretch{-webkit-align-content:stretch!important;-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-lg-auto{-webkit-align-self:auto!important;-ms-flex-item-align:auto!important;-ms-grid-row-align:auto!important;align-self:auto!important}.align-self-lg-start{-webkit-align-self:flex-start!important;-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-lg-end{-webkit-align-self:flex-end!important;-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-lg-center{-webkit-align-self:center!important;-ms-flex-item-align:center!important;-ms-grid-row-align:center!important;align-self:center!important}.align-self-lg-baseline{-webkit-align-self:baseline!important;-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-lg-stretch{-webkit-align-self:stretch!important;-ms-flex-item-align:stretch!important;-ms-grid-row-align:stretch!important;align-self:stretch!important}}@media (min-width:1200px){.order-xl-first{-webkit-box-ordinal-group:0;-webkit-order:-1;-ms-flex-order:-1;order:-1}.order-xl-last{-webkit-box-ordinal-group:2;-webkit-order:1;-ms-flex-order:1;order:1}.order-xl-0{-webkit-box-ordinal-group:1;-webkit-order:0;-ms-flex-order:0;order:0}.flex-xl-row{-webkit-box-orient:horizontal!important;-webkit-box-direction:normal!important;-webkit-flex-direction:row!important;-ms-flex-direction:row!important;flex-direction:row!important}.flex-xl-column{-webkit-box-orient:vertical!important;-webkit-box-direction:normal!important;-webkit-flex-direction:column!important;-ms-flex-direction:column!important;flex-direction:column!important}.flex-xl-row-reverse{-webkit-box-orient:horizontal!important;-webkit-box-direction:reverse!important;-webkit-flex-direction:row-reverse!important;-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-xl-column-reverse{-webkit-box-orient:vertical!important;-webkit-box-direction:reverse!important;-webkit-flex-direction:column-reverse!important;-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-xl-wrap{-webkit-flex-wrap:wrap!important;-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-xl-nowrap{-webkit-flex-wrap:nowrap!important;-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-xl-wrap-reverse{-webkit-flex-wrap:wrap-reverse!important;-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.justify-content-xl-start{-webkit-box-pack:start!important;-webkit-justify-content:flex-start!important;-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-xl-end{-webkit-box-pack:end!important;-webkit-justify-content:flex-end!important;-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-xl-center{-webkit-box-pack:center!important;-webkit-justify-content:center!important;-ms-flex-pack:center!important;justify-content:center!important}.justify-content-xl-between{-webkit-box-pack:justify!important;-webkit-justify-content:space-between!important;-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-xl-around{-webkit-justify-content:space-around!important;-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-xl-start{-webkit-box-align:start!important;-webkit-align-items:flex-start!important;-ms-flex-align:start!important;align-items:flex-start!important}.align-items-xl-end{-webkit-box-align:end!important;-webkit-align-items:flex-end!important;-ms-flex-align:end!important;align-items:flex-end!important}.align-items-xl-center{-webkit-box-align:center!important;-webkit-align-items:center!important;-ms-flex-align:center!important;align-items:center!important}.align-items-xl-baseline{-webkit-box-align:baseline!important;-webkit-align-items:baseline!important;-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-xl-stretch{-webkit-box-align:stretch!important;-webkit-align-items:stretch!important;-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-xl-start{-webkit-align-content:flex-start!important;-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-xl-end{-webkit-align-content:flex-end!important;-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-xl-center{-webkit-align-content:center!important;-ms-flex-line-pack:center!important;align-content:center!important}.align-content-xl-between{-webkit-align-content:space-between!important;-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-xl-around{-webkit-align-content:space-around!important;-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-xl-stretch{-webkit-align-content:stretch!important;-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-xl-auto{-webkit-align-self:auto!important;-ms-flex-item-align:auto!important;-ms-grid-row-align:auto!important;align-self:auto!important}.align-self-xl-start{-webkit-align-self:flex-start!important;-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-xl-end{-webkit-align-self:flex-end!important;-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-xl-center{-webkit-align-self:center!important;-ms-flex-item-align:center!important;-ms-grid-row-align:center!important;align-self:center!important}.align-self-xl-baseline{-webkit-align-self:baseline!important;-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-xl-stretch{-webkit-align-self:stretch!important;-ms-flex-item-align:stretch!important;-ms-grid-row-align:stretch!important;align-self:stretch!important}}/*# sourceMappingURL=bootstrap-grid.min.css.map */ \ No newline at end of file
+@-ms-viewport{width:device-width}html{box-sizing:border-box;-ms-overflow-style:scrollbar}*,::after,::before{box-sizing:inherit}.container{margin-right:auto;margin-left:auto;padding-right:15px;padding-left:15px;width:100%}@media (min-width:576px){.container{max-width:540px}}@media (min-width:768px){.container{max-width:720px}}@media (min-width:992px){.container{max-width:960px}}@media (min-width:1200px){.container{max-width:1140px}}.container-fluid{width:100%;margin-right:auto;margin-left:auto;padding-right:15px;padding-left:15px;width:100%}.row{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;margin-right:-15px;margin-left:-15px}.no-gutters{margin-right:0;margin-left:0}.no-gutters>.col,.no-gutters>[class*=col-]{padding-right:0;padding-left:0}.col,.col-1,.col-10,.col-11,.col-12,.col-2,.col-3,.col-4,.col-5,.col-6,.col-7,.col-8,.col-9,.col-auto,.col-lg,.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.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-auto,.col-md,.col-md-1,.col-md-10,.col-md-11,.col-md-12,.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-auto,.col-sm,.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.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-auto,.col-xl,.col-xl-1,.col-xl-10,.col-xl-11,.col-xl-12,.col-xl-2,.col-xl-3,.col-xl-4,.col-xl-5,.col-xl-6,.col-xl-7,.col-xl-8,.col-xl-9,.col-xl-auto{position:relative;width:100%;min-height:1px;padding-right:15px;padding-left:15px}.col{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:none}.col-1{-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-2{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-3{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-4{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-5{-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-6{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-7{-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-8{-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-9{-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-10{-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-11{-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-12{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-1{-ms-flex-order:1;order:1}.order-2{-ms-flex-order:2;order:2}.order-3{-ms-flex-order:3;order:3}.order-4{-ms-flex-order:4;order:4}.order-5{-ms-flex-order:5;order:5}.order-6{-ms-flex-order:6;order:6}.order-7{-ms-flex-order:7;order:7}.order-8{-ms-flex-order:8;order:8}.order-9{-ms-flex-order:9;order:9}.order-10{-ms-flex-order:10;order:10}.order-11{-ms-flex-order:11;order:11}.order-12{-ms-flex-order:12;order:12}@media (min-width:576px){.col-sm{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-sm-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:none}.col-sm-1{-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-sm-2{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-sm-3{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-sm-4{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-sm-5{-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-sm-6{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-sm-7{-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-sm-8{-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-sm-9{-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-sm-10{-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-sm-11{-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-sm-12{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-sm-1{-ms-flex-order:1;order:1}.order-sm-2{-ms-flex-order:2;order:2}.order-sm-3{-ms-flex-order:3;order:3}.order-sm-4{-ms-flex-order:4;order:4}.order-sm-5{-ms-flex-order:5;order:5}.order-sm-6{-ms-flex-order:6;order:6}.order-sm-7{-ms-flex-order:7;order:7}.order-sm-8{-ms-flex-order:8;order:8}.order-sm-9{-ms-flex-order:9;order:9}.order-sm-10{-ms-flex-order:10;order:10}.order-sm-11{-ms-flex-order:11;order:11}.order-sm-12{-ms-flex-order:12;order:12}}@media (min-width:768px){.col-md{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-md-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:none}.col-md-1{-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-md-2{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-md-3{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-md-4{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-md-5{-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-md-6{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-md-7{-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-md-8{-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-md-9{-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-md-10{-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-md-11{-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-md-12{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-md-1{-ms-flex-order:1;order:1}.order-md-2{-ms-flex-order:2;order:2}.order-md-3{-ms-flex-order:3;order:3}.order-md-4{-ms-flex-order:4;order:4}.order-md-5{-ms-flex-order:5;order:5}.order-md-6{-ms-flex-order:6;order:6}.order-md-7{-ms-flex-order:7;order:7}.order-md-8{-ms-flex-order:8;order:8}.order-md-9{-ms-flex-order:9;order:9}.order-md-10{-ms-flex-order:10;order:10}.order-md-11{-ms-flex-order:11;order:11}.order-md-12{-ms-flex-order:12;order:12}}@media (min-width:992px){.col-lg{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-lg-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:none}.col-lg-1{-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-lg-2{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-lg-3{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-lg-4{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-lg-5{-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-lg-6{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-lg-7{-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-lg-8{-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-lg-9{-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-lg-10{-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-lg-11{-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-lg-12{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-lg-1{-ms-flex-order:1;order:1}.order-lg-2{-ms-flex-order:2;order:2}.order-lg-3{-ms-flex-order:3;order:3}.order-lg-4{-ms-flex-order:4;order:4}.order-lg-5{-ms-flex-order:5;order:5}.order-lg-6{-ms-flex-order:6;order:6}.order-lg-7{-ms-flex-order:7;order:7}.order-lg-8{-ms-flex-order:8;order:8}.order-lg-9{-ms-flex-order:9;order:9}.order-lg-10{-ms-flex-order:10;order:10}.order-lg-11{-ms-flex-order:11;order:11}.order-lg-12{-ms-flex-order:12;order:12}}@media (min-width:1200px){.col-xl{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-xl-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:none}.col-xl-1{-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-xl-2{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-xl-3{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-xl-4{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-xl-5{-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-xl-6{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-xl-7{-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-xl-8{-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-xl-9{-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-xl-10{-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-xl-11{-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-xl-12{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-xl-1{-ms-flex-order:1;order:1}.order-xl-2{-ms-flex-order:2;order:2}.order-xl-3{-ms-flex-order:3;order:3}.order-xl-4{-ms-flex-order:4;order:4}.order-xl-5{-ms-flex-order:5;order:5}.order-xl-6{-ms-flex-order:6;order:6}.order-xl-7{-ms-flex-order:7;order:7}.order-xl-8{-ms-flex-order:8;order:8}.order-xl-9{-ms-flex-order:9;order:9}.order-xl-10{-ms-flex-order:10;order:10}.order-xl-11{-ms-flex-order:11;order:11}.order-xl-12{-ms-flex-order:12;order:12}}.flex-row{-ms-flex-direction:row!important;flex-direction:row!important}.flex-column{-ms-flex-direction:column!important;flex-direction:column!important}.flex-row-reverse{-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-column-reverse{-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.justify-content-start{-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-end{-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-center{-ms-flex-pack:center!important;justify-content:center!important}.justify-content-between{-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-start{-ms-flex-align:start!important;align-items:flex-start!important}.align-items-end{-ms-flex-align:end!important;align-items:flex-end!important}.align-items-center{-ms-flex-align:center!important;align-items:center!important}.align-items-baseline{-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-stretch{-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}@media (min-width:576px){.flex-sm-row{-ms-flex-direction:row!important;flex-direction:row!important}.flex-sm-column{-ms-flex-direction:column!important;flex-direction:column!important}.flex-sm-row-reverse{-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-sm-column-reverse{-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-sm-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-sm-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-sm-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.justify-content-sm-start{-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-sm-end{-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-sm-center{-ms-flex-pack:center!important;justify-content:center!important}.justify-content-sm-between{-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-sm-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-sm-start{-ms-flex-align:start!important;align-items:flex-start!important}.align-items-sm-end{-ms-flex-align:end!important;align-items:flex-end!important}.align-items-sm-center{-ms-flex-align:center!important;align-items:center!important}.align-items-sm-baseline{-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-sm-stretch{-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-sm-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-sm-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-sm-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-sm-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-sm-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-sm-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-sm-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-sm-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-sm-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-sm-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-sm-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-sm-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}}@media (min-width:768px){.flex-md-row{-ms-flex-direction:row!important;flex-direction:row!important}.flex-md-column{-ms-flex-direction:column!important;flex-direction:column!important}.flex-md-row-reverse{-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-md-column-reverse{-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-md-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-md-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-md-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.justify-content-md-start{-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-md-end{-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-md-center{-ms-flex-pack:center!important;justify-content:center!important}.justify-content-md-between{-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-md-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-md-start{-ms-flex-align:start!important;align-items:flex-start!important}.align-items-md-end{-ms-flex-align:end!important;align-items:flex-end!important}.align-items-md-center{-ms-flex-align:center!important;align-items:center!important}.align-items-md-baseline{-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-md-stretch{-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-md-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-md-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-md-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-md-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-md-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-md-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-md-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-md-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-md-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-md-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-md-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-md-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}}@media (min-width:992px){.flex-lg-row{-ms-flex-direction:row!important;flex-direction:row!important}.flex-lg-column{-ms-flex-direction:column!important;flex-direction:column!important}.flex-lg-row-reverse{-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-lg-column-reverse{-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-lg-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-lg-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-lg-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.justify-content-lg-start{-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-lg-end{-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-lg-center{-ms-flex-pack:center!important;justify-content:center!important}.justify-content-lg-between{-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-lg-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-lg-start{-ms-flex-align:start!important;align-items:flex-start!important}.align-items-lg-end{-ms-flex-align:end!important;align-items:flex-end!important}.align-items-lg-center{-ms-flex-align:center!important;align-items:center!important}.align-items-lg-baseline{-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-lg-stretch{-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-lg-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-lg-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-lg-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-lg-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-lg-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-lg-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-lg-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-lg-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-lg-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-lg-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-lg-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-lg-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}}@media (min-width:1200px){.flex-xl-row{-ms-flex-direction:row!important;flex-direction:row!important}.flex-xl-column{-ms-flex-direction:column!important;flex-direction:column!important}.flex-xl-row-reverse{-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-xl-column-reverse{-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-xl-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-xl-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-xl-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.justify-content-xl-start{-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-xl-end{-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-xl-center{-ms-flex-pack:center!important;justify-content:center!important}.justify-content-xl-between{-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-xl-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-xl-start{-ms-flex-align:start!important;align-items:flex-start!important}.align-items-xl-end{-ms-flex-align:end!important;align-items:flex-end!important}.align-items-xl-center{-ms-flex-align:center!important;align-items:center!important}.align-items-xl-baseline{-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-xl-stretch{-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-xl-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-xl-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-xl-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-xl-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-xl-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-xl-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-xl-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-xl-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-xl-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-xl-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-xl-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-xl-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}}
+/*# sourceMappingURL=bootstrap-grid.min.css.map */ \ No newline at end of file
diff --git a/library/bootstrap/css/bootstrap-grid.min.css.map b/library/bootstrap/css/bootstrap-grid.min.css.map
index 6750e0e3c..5e16e09e5 100644
--- a/library/bootstrap/css/bootstrap-grid.min.css.map
+++ b/library/bootstrap/css/bootstrap-grid.min.css.map
@@ -1 +1 @@
-{"version":3,"sources":["../../scss/bootstrap-grid.scss","dist/css/bootstrap-grid.css","../../scss/_grid.scss","../../scss/mixins/_grid.scss","../../scss/mixins/_breakpoints.scss","../../scss/mixins/_grid-framework.scss","../../scss/utilities/_flex.scss"],"names":[],"mappings":"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F4BR,KAAA,WE5BQ,QF4BR,KAAA,IE5BQ,QF4BR,KAAA,WE5BQ,QF4BR,KAAA,WE5BQ,QF4BR,KAAA,IE5BQ,SF4BR,KAAA,WE5BQ,SF4BR,KAAA,WE5BQ,SF4BR,KAAA,KEnBQ,UFeR,YAAA,UEfQ,UFeR,YAAA,WEfQ,UFeR,YAAA,IEfQ,UFeR,YAAA,WEfQ,UFeR,YAAA,WEfQ,UFeR,YAAA,IEfQ,UFeR,YAAA,WEfQ,UFeR,YAAA,WEfQ,UFeR,YAAA,IEfQ,WFeR,YAAA,WEfQ,WFeR,YAAA,WCjBE,yBCzBE,QACE,mBAAA,EAAA,wBAAA,EAAA,WAAA,EACA,iBAAA,EAAA,kBAAA,EAAA,kBAAA,EAAA,UAAA,EACA,UAAA,KAEF,aACE,iBAAA,EAAA,aAAA,EAAA,EAAA,KAAA,SAAA,EAAA,EAAA,KAAA,KAAA,EAAA,EAAA,KACA,MAAA,KAIA,UF2BN,MAAA,UE3BM,UF2BN,MAAA,WE3BM,UF2BN,MAAA,IE3BM,UF2BN,MAAA,WE3BM,UF2BN,MAAA,WE3BM,UF2BN,MAAA,IE3BM,UF2BN,MAAA,WE3BM,UF2BN,MAAA,WE3BM,UF2BN,MAAA,IE3BM,WF2BN,MAAA,WE3BM,WF2BN,MAAA,WE3BM,WF2BN,MAAA,KEpBQ,WFgCR,MAAA,KEhCQ,WFgCR,MAAA,UEhCQ,WFgCR,MAAA,WEhCQ,WFgCR,MAAA,IEhCQ,WFgCR,MAAA,WEhCQ,WFgCR,MAAA,WEhCQ,WFgCR,MAAA,IEhCQ,WFgCR,MAAA,WEhCQ,WFgCR,MAAA,WEhCQ,WFgCR,MAAA,IEhCQ,YFgCR,MAAA,WEhCQ,YFgCR,MAAA,WEhCQ,YFgCR,MAAA,KEhCQ,WF4BR,KAAA,KE5BQ,WF4BR,KAAA,UE5BQ,WF4BR,KAAA,WE5BQ,WF4BR,KAAA,IE5BQ,WF4BR,KAAA,WE5BQ,WF4BR,KAAA,WE5BQ,WF4BR,KAAA,IE5BQ,WF4BR,KAAA,WE5BQ,WF4BR,KAAA,WE5BQ,WF4BR,KAAA,IE5BQ,YF4BR,KAAA,WE5BQ,YF4BR,KAAA,WE5BQ,YF4BR,KAAA,KEnBQ,aFeR,YAAA,EEfQ,aFeR,YAAA,UEfQ,aFeR,YAAA,WEfQ,aFeR,YAAA,IEfQ,aFeR,YAAA,WEfQ,aFeR,YAAA,WEfQ,aFeR,YAAA,IEfQ,aFeR,YAAA,WEfQ,aFeR,YAAA,WEfQ,aFeR,YAAA,IEfQ,cFeR,YAAA,WEfQ,cFeR,YAAA,YCjBE,yBCzBE,QACE,mBAAA,EAAA,wBAAA,EAAA,WAAA,EACA,iBAAA,EAAA,kBAAA,EAAA,kBAAA,EAAA,UAAA,EACA,UAAA,KAEF,aACE,iBAAA,EAAA,aAAA,EAAA,EAAA,KAAA,SAAA,EAAA,EAAA,KAAA,KAAA,EAAA,EAAA,KACA,MAAA,KAIA,UF2BN,MAAA,UE3BM,UF2BN,MAAA,WE3BM,UF2BN,MAAA,IE3BM,UF2BN,MAAA,WE3BM,UF2BN,MAAA,WE3BM,UF2BN,MAAA,IE3BM,UF2BN,MAAA,WE3BM,UF2BN,MAAA,WE3BM,UF2BN,MAAA,IE3BM,WF2BN,MAAA,WE3BM,WF2BN,MAAA,WE3BM,WF2BN,MAAA,KEpBQ,WFgCR,MAAA,KEhCQ,WFgCR,MAAA,UEhCQ,WFgCR,MAAA,WEhCQ,WFgCR,MAAA,IEhCQ,WFgCR,MAAA,WEhCQ,WFgCR,MAAA,WEhCQ,WFgCR,MAAA,IEhCQ,WFgCR,MAAA,WEhCQ,WFgCR,MAAA,WEhCQ,WFgCR,MAAA,IEhCQ,YFgCR,MAAA,WEhCQ,YFgCR,MAAA,WEhCQ,YFgCR,MAAA,KEhCQ,WF4BR,KAAA,KE5BQ,WF4BR,KAAA,UE5BQ,WF4BR,KAAA,WE5BQ,WF4BR,KAAA,IE5BQ,WF4BR,KAAA,WE5BQ,WF4BR,KAAA,WE5BQ,WF4BR,KAAA,IE5BQ,WF4BR,KAAA,WE5BQ,WF4BR,KAAA,WE5BQ,WF4BR,KAAA,IE5BQ,YF4BR,KAAA,WE5BQ,YF4BR,KAAA,WE5BQ,YF4BR,KAAA,KEnBQ,aFeR,YAAA,EEfQ,aFeR,YAAA,UEfQ,aFeR,YAAA,WEfQ,aFeR,YAAA,IEfQ,aFeR,YAAA,WEfQ,aFeR,YAAA,WEfQ,aFeR,YAAA,IEfQ,aFeR,YAAA,WEfQ,aFeR,YAAA,WEfQ,aFeR,YAAA,IEfQ,cFeR,YAAA,WEfQ,cFeR,YAAA,YCjBE,yBCzBE,QACE,mBAAA,EAAA,wBAAA,EAAA,WAAA,EACA,iBAAA,EAAA,kBAAA,EAAA,kBAAA,EAAA,UAAA,EACA,UAAA,KAEF,aACE,iBAAA,EAAA,aAAA,EAAA,EAAA,KAAA,SAAA,EAAA,EAAA,KAAA,KAAA,EAAA,EAAA,KACA,MAAA,KAIA,UF2BN,MAAA,UE3BM,UF2BN,MAAA,WE3BM,UF2BN,MAAA,IE3BM,UF2BN,MAAA,WE3BM,UF2BN,MAAA,WE3BM,UF2BN,MAAA,IE3BM,UF2BN,MAAA,WE3BM,UF2BN,MAAA,WE3BM,UF2BN,MAAA,IE3BM,WF2BN,MAAA,WE3BM,WF2BN,MAAA,WE3BM,WF2BN,MAAA,KEpBQ,WFgCR,MAAA,KEhCQ,WFgCR,MAAA,UEhCQ,WFgCR,MAAA,WEhCQ,WFgCR,MAAA,IEhCQ,WFgCR,MAAA,WEhCQ,WFgCR,MAAA,WEhCQ,WFgCR,MAAA,IEhCQ,WFgCR,MAAA,WEhCQ,WFgCR,MAAA,WEhCQ,WFgCR,MAAA,IEhCQ,YFgCR,MAAA,WEhCQ,YFgCR,MAAA,WEhCQ,YFgCR,MAAA,KEhCQ,WF4BR,KAAA,KE5BQ,WF4BR,KAAA,UE5BQ,WF4BR,KAAA,WE5BQ,WF4BR,KAAA,IE5BQ,WF4BR,KAAA,WE5BQ,WF4BR,KAAA,WE5BQ,WF4BR,KAAA,IE5BQ,WF4BR,KAAA,WE5BQ,WF4BR,KAAA,WE5BQ,WF4BR,KAAA,IE5BQ,YF4BR,KAAA,WE5BQ,YF4BR,KAAA,WE5BQ,YF4BR,KAAA,KEnBQ,aFeR,YAAA,EEfQ,aFeR,YAAA,UEfQ,aFeR,YAAA,WEfQ,aFeR,YAAA,IEfQ,aFeR,YAAA,WEfQ,aFeR,YAAA,WEfQ,aFeR,YAAA,IEfQ,aFeR,YAAA,WEfQ,aFeR,YAAA,WEfQ,aFeR,YAAA,IEfQ,cFeR,YAAA,WEfQ,cFeR,YAAA,YCjBE,0BCzBE,QACE,mBAAA,EAAA,wBAAA,EAAA,WAAA,EACA,iBAAA,EAAA,kBAAA,EAAA,kBAAA,EAAA,UAAA,EACA,UAAA,KAEF,aACE,iBAAA,EAAA,aAAA,EAAA,EAAA,KAAA,SAAA,EAAA,EAAA,KAAA,KAAA,EAAA,EAAA,KACA,MAAA,KAIA,UF2BN,MAAA,UE3BM,UF2BN,MAAA,WE3BM,UF2BN,MAAA,IE3BM,UF2BN,MAAA,WE3BM,UF2BN,MAAA,WE3BM,U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"} \ No newline at end of file
+{"version":3,"sources":["../../scss/bootstrap-grid.scss","dist/css/bootstrap-grid.css","../../scss/_grid.scss","../../scss/mixins/_grid.scss","../../scss/mixins/_breakpoints.scss","../../scss/mixins/_grid-framework.scss","../../scss/utilities/_flex.scss"],"names":[],"mappings":"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","sourcesContent":["// Bootstrap Grid only\n//\n// Includes relevant variables and mixins for the flexbox grid\n// system, as well as the generated predefined classes (e.g., `.col-sm-4`).\n\n//\n// Box sizing, responsive, and more\n//\n\n@at-root {\n @-ms-viewport { width: device-width; }\n}\n\nhtml {\n box-sizing: border-box;\n -ms-overflow-style: scrollbar;\n}\n\n*,\n*::before,\n*::after {\n box-sizing: inherit;\n}\n\n@import \"functions\";\n@import \"variables\";\n\n//\n// Grid mixins\n//\n\n@import \"mixins/breakpoints\";\n@import \"mixins/grid-framework\";\n@import \"mixins/grid\";\n\n@import \"grid\";\n@import \"utilities/flex\";\n","@-ms-viewport {\n width: device-width;\n}\n\nhtml {\n box-sizing: border-box;\n -ms-overflow-style: scrollbar;\n}\n\n*,\n*::before,\n*::after {\n box-sizing: inherit;\n}\n\n.container {\n margin-right: auto;\n margin-left: auto;\n padding-right: 15px;\n padding-left: 15px;\n width: 100%;\n}\n\n@media (min-width: 576px) {\n .container {\n max-width: 540px;\n }\n}\n\n@media (min-width: 768px) {\n .container {\n max-width: 720px;\n }\n}\n\n@media (min-width: 992px) {\n .container {\n max-width: 960px;\n }\n}\n\n@media (min-width: 1200px) {\n .container {\n max-width: 1140px;\n }\n}\n\n.container-fluid {\n width: 100%;\n margin-right: auto;\n margin-left: auto;\n padding-right: 15px;\n padding-left: 15px;\n width: 100%;\n}\n\n.row {\n display: -ms-flexbox;\n display: flex;\n -ms-flex-wrap: wrap;\n flex-wrap: wrap;\n margin-right: -15px;\n margin-left: -15px;\n}\n\n.no-gutters {\n margin-right: 0;\n margin-left: 0;\n}\n\n.no-gutters > .col,\n.no-gutters > [class*=\"col-\"] {\n padding-right: 0;\n padding-left: 0;\n}\n\n.col-1, .col-2, .col-3, .col-4, .col-5, .col-6, .col-7, .col-8, .col-9, .col-10, .col-11, .col-12, .col,\n.col-auto, .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, .col-sm,\n.col-sm-auto, .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, .col-md,\n.col-md-auto, .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, .col-lg,\n.col-lg-auto, .col-xl-1, .col-xl-2, .col-xl-3, .col-xl-4, .col-xl-5, .col-xl-6, .col-xl-7, .col-xl-8, .col-xl-9, .col-xl-10, .col-xl-11, .col-xl-12, .col-xl,\n.col-xl-auto {\n position: relative;\n width: 100%;\n min-height: 1px;\n padding-right: 15px;\n padding-left: 15px;\n}\n\n.col {\n -ms-flex-preferred-size: 0;\n flex-basis: 0;\n -ms-flex-positive: 1;\n flex-grow: 1;\n max-width: 100%;\n}\n\n.col-auto {\n -ms-flex: 0 0 auto;\n flex: 0 0 auto;\n width: auto;\n max-width: none;\n}\n\n.col-1 {\n -ms-flex: 0 0 8.333333%;\n flex: 0 0 8.333333%;\n max-width: 8.333333%;\n}\n\n.col-2 {\n -ms-flex: 0 0 16.666667%;\n flex: 0 0 16.666667%;\n max-width: 16.666667%;\n}\n\n.col-3 {\n -ms-flex: 0 0 25%;\n flex: 0 0 25%;\n max-width: 25%;\n}\n\n.col-4 {\n -ms-flex: 0 0 33.333333%;\n flex: 0 0 33.333333%;\n max-width: 33.333333%;\n}\n\n.col-5 {\n -ms-flex: 0 0 41.666667%;\n flex: 0 0 41.666667%;\n max-width: 41.666667%;\n}\n\n.col-6 {\n -ms-flex: 0 0 50%;\n flex: 0 0 50%;\n max-width: 50%;\n}\n\n.col-7 {\n -ms-flex: 0 0 58.333333%;\n flex: 0 0 58.333333%;\n max-width: 58.333333%;\n}\n\n.col-8 {\n -ms-flex: 0 0 66.666667%;\n flex: 0 0 66.666667%;\n max-width: 66.666667%;\n}\n\n.col-9 {\n -ms-flex: 0 0 75%;\n flex: 0 0 75%;\n max-width: 75%;\n}\n\n.col-10 {\n -ms-flex: 0 0 83.333333%;\n flex: 0 0 83.333333%;\n max-width: 83.333333%;\n}\n\n.col-11 {\n -ms-flex: 0 0 91.666667%;\n flex: 0 0 91.666667%;\n max-width: 91.666667%;\n}\n\n.col-12 {\n -ms-flex: 0 0 100%;\n flex: 0 0 100%;\n max-width: 100%;\n}\n\n.order-1 {\n -ms-flex-order: 1;\n order: 1;\n}\n\n.order-2 {\n -ms-flex-order: 2;\n order: 2;\n}\n\n.order-3 {\n -ms-flex-order: 3;\n order: 3;\n}\n\n.order-4 {\n -ms-flex-order: 4;\n order: 4;\n}\n\n.order-5 {\n -ms-flex-order: 5;\n order: 5;\n}\n\n.order-6 {\n -ms-flex-order: 6;\n order: 6;\n}\n\n.order-7 {\n -ms-flex-order: 7;\n order: 7;\n}\n\n.order-8 {\n -ms-flex-order: 8;\n order: 8;\n}\n\n.order-9 {\n -ms-flex-order: 9;\n order: 9;\n}\n\n.order-10 {\n -ms-flex-order: 10;\n order: 10;\n}\n\n.order-11 {\n -ms-flex-order: 11;\n order: 11;\n}\n\n.order-12 {\n -ms-flex-order: 12;\n order: 12;\n}\n\n@media (min-width: 576px) {\n .col-sm {\n -ms-flex-preferred-size: 0;\n flex-basis: 0;\n -ms-flex-positive: 1;\n flex-grow: 1;\n max-width: 100%;\n }\n .col-sm-auto {\n -ms-flex: 0 0 auto;\n flex: 0 0 auto;\n width: auto;\n max-width: none;\n }\n .col-sm-1 {\n -ms-flex: 0 0 8.333333%;\n flex: 0 0 8.333333%;\n max-width: 8.333333%;\n }\n .col-sm-2 {\n -ms-flex: 0 0 16.666667%;\n flex: 0 0 16.666667%;\n max-width: 16.666667%;\n }\n .col-sm-3 {\n -ms-flex: 0 0 25%;\n flex: 0 0 25%;\n max-width: 25%;\n }\n .col-sm-4 {\n -ms-flex: 0 0 33.333333%;\n flex: 0 0 33.333333%;\n max-width: 33.333333%;\n }\n .col-sm-5 {\n -ms-flex: 0 0 41.666667%;\n flex: 0 0 41.666667%;\n max-width: 41.666667%;\n }\n .col-sm-6 {\n -ms-flex: 0 0 50%;\n flex: 0 0 50%;\n max-width: 50%;\n }\n .col-sm-7 {\n -ms-flex: 0 0 58.333333%;\n flex: 0 0 58.333333%;\n max-width: 58.333333%;\n }\n .col-sm-8 {\n -ms-flex: 0 0 66.666667%;\n flex: 0 0 66.666667%;\n max-width: 66.666667%;\n }\n .col-sm-9 {\n -ms-flex: 0 0 75%;\n flex: 0 0 75%;\n max-width: 75%;\n }\n .col-sm-10 {\n -ms-flex: 0 0 83.333333%;\n flex: 0 0 83.333333%;\n max-width: 83.333333%;\n }\n .col-sm-11 {\n -ms-flex: 0 0 91.666667%;\n flex: 0 0 91.666667%;\n max-width: 91.666667%;\n }\n .col-sm-12 {\n -ms-flex: 0 0 100%;\n flex: 0 0 100%;\n max-width: 100%;\n }\n .order-sm-1 {\n -ms-flex-order: 1;\n order: 1;\n }\n .order-sm-2 {\n -ms-flex-order: 2;\n order: 2;\n }\n .order-sm-3 {\n -ms-flex-order: 3;\n order: 3;\n }\n .order-sm-4 {\n -ms-flex-order: 4;\n order: 4;\n }\n .order-sm-5 {\n -ms-flex-order: 5;\n order: 5;\n }\n .order-sm-6 {\n -ms-flex-order: 6;\n order: 6;\n }\n .order-sm-7 {\n -ms-flex-order: 7;\n order: 7;\n }\n .order-sm-8 {\n -ms-flex-order: 8;\n order: 8;\n }\n .order-sm-9 {\n -ms-flex-order: 9;\n order: 9;\n }\n .order-sm-10 {\n -ms-flex-order: 10;\n order: 10;\n }\n .order-sm-11 {\n -ms-flex-order: 11;\n order: 11;\n }\n .order-sm-12 {\n -ms-flex-order: 12;\n order: 12;\n }\n}\n\n@media (min-width: 768px) {\n .col-md {\n -ms-flex-preferred-size: 0;\n flex-basis: 0;\n -ms-flex-positive: 1;\n flex-grow: 1;\n max-width: 100%;\n }\n .col-md-auto {\n -ms-flex: 0 0 auto;\n flex: 0 0 auto;\n width: auto;\n max-width: none;\n }\n .col-md-1 {\n -ms-flex: 0 0 8.333333%;\n flex: 0 0 8.333333%;\n max-width: 8.333333%;\n }\n .col-md-2 {\n -ms-flex: 0 0 16.666667%;\n flex: 0 0 16.666667%;\n max-width: 16.666667%;\n }\n .col-md-3 {\n -ms-flex: 0 0 25%;\n flex: 0 0 25%;\n max-width: 25%;\n }\n .col-md-4 {\n -ms-flex: 0 0 33.333333%;\n flex: 0 0 33.333333%;\n max-width: 33.333333%;\n }\n .col-md-5 {\n -ms-flex: 0 0 41.666667%;\n flex: 0 0 41.666667%;\n max-width: 41.666667%;\n }\n .col-md-6 {\n -ms-flex: 0 0 50%;\n flex: 0 0 50%;\n max-width: 50%;\n }\n .col-md-7 {\n -ms-flex: 0 0 58.333333%;\n flex: 0 0 58.333333%;\n max-width: 58.333333%;\n }\n .col-md-8 {\n -ms-flex: 0 0 66.666667%;\n flex: 0 0 66.666667%;\n max-width: 66.666667%;\n }\n .col-md-9 {\n -ms-flex: 0 0 75%;\n flex: 0 0 75%;\n max-width: 75%;\n }\n .col-md-10 {\n -ms-flex: 0 0 83.333333%;\n flex: 0 0 83.333333%;\n max-width: 83.333333%;\n }\n .col-md-11 {\n -ms-flex: 0 0 91.666667%;\n flex: 0 0 91.666667%;\n max-width: 91.666667%;\n }\n .col-md-12 {\n -ms-flex: 0 0 100%;\n flex: 0 0 100%;\n max-width: 100%;\n }\n .order-md-1 {\n -ms-flex-order: 1;\n order: 1;\n }\n .order-md-2 {\n -ms-flex-order: 2;\n order: 2;\n }\n .order-md-3 {\n -ms-flex-order: 3;\n order: 3;\n }\n .order-md-4 {\n -ms-flex-order: 4;\n order: 4;\n }\n .order-md-5 {\n -ms-flex-order: 5;\n order: 5;\n }\n .order-md-6 {\n -ms-flex-order: 6;\n order: 6;\n }\n .order-md-7 {\n -ms-flex-order: 7;\n order: 7;\n }\n .order-md-8 {\n -ms-flex-order: 8;\n order: 8;\n }\n .order-md-9 {\n -ms-flex-order: 9;\n order: 9;\n }\n .order-md-10 {\n -ms-flex-order: 10;\n order: 10;\n }\n .order-md-11 {\n -ms-flex-order: 11;\n order: 11;\n }\n .order-md-12 {\n -ms-flex-order: 12;\n order: 12;\n }\n}\n\n@media (min-width: 992px) {\n .col-lg {\n -ms-flex-preferred-size: 0;\n flex-basis: 0;\n -ms-flex-positive: 1;\n flex-grow: 1;\n max-width: 100%;\n }\n .col-lg-auto {\n -ms-flex: 0 0 auto;\n flex: 0 0 auto;\n width: auto;\n max-width: none;\n }\n .col-lg-1 {\n -ms-flex: 0 0 8.333333%;\n flex: 0 0 8.333333%;\n max-width: 8.333333%;\n }\n .col-lg-2 {\n -ms-flex: 0 0 16.666667%;\n flex: 0 0 16.666667%;\n max-width: 16.666667%;\n }\n .col-lg-3 {\n -ms-flex: 0 0 25%;\n flex: 0 0 25%;\n max-width: 25%;\n }\n .col-lg-4 {\n -ms-flex: 0 0 33.333333%;\n flex: 0 0 33.333333%;\n max-width: 33.333333%;\n }\n .col-lg-5 {\n -ms-flex: 0 0 41.666667%;\n flex: 0 0 41.666667%;\n max-width: 41.666667%;\n }\n .col-lg-6 {\n -ms-flex: 0 0 50%;\n flex: 0 0 50%;\n max-width: 50%;\n }\n .col-lg-7 {\n -ms-flex: 0 0 58.333333%;\n flex: 0 0 58.333333%;\n max-width: 58.333333%;\n }\n .col-lg-8 {\n -ms-flex: 0 0 66.666667%;\n flex: 0 0 66.666667%;\n max-width: 66.666667%;\n }\n .col-lg-9 {\n -ms-flex: 0 0 75%;\n flex: 0 0 75%;\n max-width: 75%;\n }\n .col-lg-10 {\n -ms-flex: 0 0 83.333333%;\n flex: 0 0 83.333333%;\n max-width: 83.333333%;\n }\n .col-lg-11 {\n -ms-flex: 0 0 91.666667%;\n flex: 0 0 91.666667%;\n max-width: 91.666667%;\n }\n .col-lg-12 {\n -ms-flex: 0 0 100%;\n flex: 0 0 100%;\n max-width: 100%;\n }\n .order-lg-1 {\n -ms-flex-order: 1;\n order: 1;\n }\n .order-lg-2 {\n -ms-flex-order: 2;\n order: 2;\n }\n .order-lg-3 {\n -ms-flex-order: 3;\n order: 3;\n }\n .order-lg-4 {\n -ms-flex-order: 4;\n order: 4;\n }\n .order-lg-5 {\n -ms-flex-order: 5;\n order: 5;\n }\n .order-lg-6 {\n -ms-flex-order: 6;\n order: 6;\n }\n .order-lg-7 {\n -ms-flex-order: 7;\n order: 7;\n }\n .order-lg-8 {\n -ms-flex-order: 8;\n order: 8;\n }\n .order-lg-9 {\n -ms-flex-order: 9;\n order: 9;\n }\n .order-lg-10 {\n -ms-flex-order: 10;\n order: 10;\n }\n .order-lg-11 {\n -ms-flex-order: 11;\n order: 11;\n }\n .order-lg-12 {\n -ms-flex-order: 12;\n order: 12;\n }\n}\n\n@media (min-width: 1200px) {\n .col-xl {\n -ms-flex-preferred-size: 0;\n flex-basis: 0;\n -ms-flex-positive: 1;\n flex-grow: 1;\n max-width: 100%;\n }\n .col-xl-auto {\n -ms-flex: 0 0 auto;\n flex: 0 0 auto;\n width: auto;\n max-width: none;\n }\n .col-xl-1 {\n -ms-flex: 0 0 8.333333%;\n flex: 0 0 8.333333%;\n max-width: 8.333333%;\n }\n .col-xl-2 {\n -ms-flex: 0 0 16.666667%;\n flex: 0 0 16.666667%;\n max-width: 16.666667%;\n }\n .col-xl-3 {\n -ms-flex: 0 0 25%;\n flex: 0 0 25%;\n max-width: 25%;\n }\n .col-xl-4 {\n -ms-flex: 0 0 33.333333%;\n flex: 0 0 33.333333%;\n max-width: 33.333333%;\n }\n .col-xl-5 {\n -ms-flex: 0 0 41.666667%;\n flex: 0 0 41.666667%;\n max-width: 41.666667%;\n }\n .col-xl-6 {\n -ms-flex: 0 0 50%;\n flex: 0 0 50%;\n max-width: 50%;\n }\n .col-xl-7 {\n -ms-flex: 0 0 58.333333%;\n flex: 0 0 58.333333%;\n max-width: 58.333333%;\n }\n .col-xl-8 {\n -ms-flex: 0 0 66.666667%;\n flex: 0 0 66.666667%;\n max-width: 66.666667%;\n }\n .col-xl-9 {\n -ms-flex: 0 0 75%;\n flex: 0 0 75%;\n max-width: 75%;\n }\n .col-xl-10 {\n -ms-flex: 0 0 83.333333%;\n flex: 0 0 83.333333%;\n max-width: 83.333333%;\n }\n .col-xl-11 {\n -ms-flex: 0 0 91.666667%;\n flex: 0 0 91.666667%;\n max-width: 91.666667%;\n }\n .col-xl-12 {\n -ms-flex: 0 0 100%;\n flex: 0 0 100%;\n max-width: 100%;\n }\n .order-xl-1 {\n -ms-flex-order: 1;\n order: 1;\n }\n .order-xl-2 {\n -ms-flex-order: 2;\n order: 2;\n }\n .order-xl-3 {\n -ms-flex-order: 3;\n order: 3;\n }\n .order-xl-4 {\n -ms-flex-order: 4;\n order: 4;\n }\n .order-xl-5 {\n -ms-flex-order: 5;\n order: 5;\n }\n .order-xl-6 {\n -ms-flex-order: 6;\n order: 6;\n }\n .order-xl-7 {\n -ms-flex-order: 7;\n order: 7;\n }\n .order-xl-8 {\n -ms-flex-order: 8;\n order: 8;\n }\n .order-xl-9 {\n -ms-flex-order: 9;\n order: 9;\n }\n .order-xl-10 {\n -ms-flex-order: 10;\n order: 10;\n }\n .order-xl-11 {\n -ms-flex-order: 11;\n order: 11;\n }\n .order-xl-12 {\n -ms-flex-order: 12;\n order: 12;\n }\n}\n\n.flex-row {\n -ms-flex-direction: row !important;\n flex-direction: row !important;\n}\n\n.flex-column {\n -ms-flex-direction: column !important;\n flex-direction: column !important;\n}\n\n.flex-row-reverse {\n -ms-flex-direction: row-reverse !important;\n flex-direction: row-reverse !important;\n}\n\n.flex-column-reverse {\n -ms-flex-direction: column-reverse !important;\n flex-direction: column-reverse !important;\n}\n\n.flex-wrap {\n -ms-flex-wrap: wrap !important;\n flex-wrap: wrap !important;\n}\n\n.flex-nowrap {\n -ms-flex-wrap: nowrap !important;\n flex-wrap: nowrap !important;\n}\n\n.flex-wrap-reverse {\n -ms-flex-wrap: wrap-reverse !important;\n flex-wrap: wrap-reverse !important;\n}\n\n.justify-content-start {\n -ms-flex-pack: start !important;\n justify-content: flex-start !important;\n}\n\n.justify-content-end {\n -ms-flex-pack: end !important;\n justify-content: flex-end !important;\n}\n\n.justify-content-center {\n -ms-flex-pack: center !important;\n justify-content: center !important;\n}\n\n.justify-content-between {\n -ms-flex-pack: justify !important;\n justify-content: space-between !important;\n}\n\n.justify-content-around {\n -ms-flex-pack: distribute !important;\n justify-content: space-around !important;\n}\n\n.align-items-start {\n -ms-flex-align: start !important;\n align-items: flex-start !important;\n}\n\n.align-items-end {\n -ms-flex-align: end !important;\n align-items: flex-end !important;\n}\n\n.align-items-center {\n -ms-flex-align: center !important;\n align-items: center !important;\n}\n\n.align-items-baseline {\n -ms-flex-align: baseline !important;\n align-items: baseline !important;\n}\n\n.align-items-stretch {\n -ms-flex-align: stretch !important;\n align-items: stretch !important;\n}\n\n.align-content-start {\n -ms-flex-line-pack: start !important;\n align-content: flex-start !important;\n}\n\n.align-content-end {\n -ms-flex-line-pack: end !important;\n align-content: flex-end !important;\n}\n\n.align-content-center {\n -ms-flex-line-pack: center !important;\n align-content: center !important;\n}\n\n.align-content-between {\n -ms-flex-line-pack: justify !important;\n align-content: space-between !important;\n}\n\n.align-content-around {\n -ms-flex-line-pack: distribute !important;\n align-content: space-around !important;\n}\n\n.align-content-stretch {\n -ms-flex-line-pack: stretch !important;\n align-content: stretch !important;\n}\n\n.align-self-auto {\n -ms-flex-item-align: auto !important;\n align-self: auto !important;\n}\n\n.align-self-start {\n -ms-flex-item-align: start !important;\n align-self: flex-start !important;\n}\n\n.align-self-end {\n -ms-flex-item-align: end !important;\n align-self: flex-end !important;\n}\n\n.align-self-center {\n -ms-flex-item-align: center !important;\n align-self: center !important;\n}\n\n.align-self-baseline {\n -ms-flex-item-align: baseline !important;\n align-self: baseline !important;\n}\n\n.align-self-stretch {\n -ms-flex-item-align: stretch !important;\n align-self: stretch !important;\n}\n\n@media (min-width: 576px) {\n .flex-sm-row {\n -ms-flex-direction: row !important;\n flex-direction: row !important;\n }\n .flex-sm-column {\n -ms-flex-direction: column !important;\n flex-direction: column !important;\n }\n .flex-sm-row-reverse {\n -ms-flex-direction: row-reverse !important;\n flex-direction: row-reverse !important;\n }\n .flex-sm-column-reverse {\n -ms-flex-direction: column-reverse !important;\n flex-direction: column-reverse !important;\n }\n .flex-sm-wrap {\n -ms-flex-wrap: wrap !important;\n flex-wrap: wrap !important;\n }\n .flex-sm-nowrap {\n -ms-flex-wrap: nowrap !important;\n flex-wrap: nowrap !important;\n }\n .flex-sm-wrap-reverse {\n -ms-flex-wrap: wrap-reverse !important;\n flex-wrap: wrap-reverse !important;\n }\n .justify-content-sm-start {\n -ms-flex-pack: start !important;\n justify-content: flex-start !important;\n }\n .justify-content-sm-end {\n -ms-flex-pack: end !important;\n justify-content: flex-end !important;\n }\n .justify-content-sm-center {\n -ms-flex-pack: center !important;\n justify-content: center !important;\n }\n .justify-content-sm-between {\n -ms-flex-pack: justify !important;\n justify-content: space-between !important;\n }\n .justify-content-sm-around {\n -ms-flex-pack: distribute !important;\n justify-content: space-around !important;\n }\n .align-items-sm-start {\n -ms-flex-align: start !important;\n align-items: flex-start !important;\n }\n .align-items-sm-end {\n -ms-flex-align: end !important;\n align-items: flex-end !important;\n }\n .align-items-sm-center {\n -ms-flex-align: center !important;\n align-items: center !important;\n }\n .align-items-sm-baseline {\n -ms-flex-align: baseline !important;\n align-items: baseline !important;\n }\n .align-items-sm-stretch {\n -ms-flex-align: stretch !important;\n align-items: stretch !important;\n }\n .align-content-sm-start {\n -ms-flex-line-pack: start !important;\n align-content: flex-start !important;\n }\n .align-content-sm-end {\n -ms-flex-line-pack: end !important;\n align-content: flex-end !important;\n }\n .align-content-sm-center {\n -ms-flex-line-pack: center !important;\n align-content: center !important;\n }\n .align-content-sm-between {\n -ms-flex-line-pack: justify !important;\n align-content: space-between !important;\n }\n .align-content-sm-around {\n -ms-flex-line-pack: distribute !important;\n align-content: space-around !important;\n }\n .align-content-sm-stretch {\n -ms-flex-line-pack: stretch !important;\n align-content: stretch !important;\n }\n .align-self-sm-auto {\n -ms-flex-item-align: auto !important;\n align-self: auto !important;\n }\n .align-self-sm-start {\n -ms-flex-item-align: start !important;\n align-self: flex-start !important;\n }\n .align-self-sm-end {\n -ms-flex-item-align: end !important;\n align-self: flex-end !important;\n }\n .align-self-sm-center {\n -ms-flex-item-align: center !important;\n align-self: center !important;\n }\n .align-self-sm-baseline {\n -ms-flex-item-align: baseline !important;\n align-self: baseline !important;\n }\n .align-self-sm-stretch {\n -ms-flex-item-align: stretch !important;\n align-self: stretch !important;\n }\n}\n\n@media (min-width: 768px) {\n .flex-md-row {\n -ms-flex-direction: row !important;\n flex-direction: row !important;\n }\n .flex-md-column {\n -ms-flex-direction: column !important;\n flex-direction: column !important;\n }\n .flex-md-row-reverse {\n -ms-flex-direction: row-reverse !important;\n flex-direction: row-reverse !important;\n }\n .flex-md-column-reverse {\n -ms-flex-direction: column-reverse !important;\n flex-direction: column-reverse !important;\n }\n .flex-md-wrap {\n -ms-flex-wrap: wrap !important;\n flex-wrap: wrap !important;\n }\n .flex-md-nowrap {\n -ms-flex-wrap: nowrap !important;\n flex-wrap: nowrap !important;\n }\n .flex-md-wrap-reverse {\n -ms-flex-wrap: wrap-reverse !important;\n flex-wrap: wrap-reverse !important;\n }\n .justify-content-md-start {\n -ms-flex-pack: start !important;\n justify-content: flex-start !important;\n }\n .justify-content-md-end {\n -ms-flex-pack: end !important;\n justify-content: flex-end !important;\n }\n .justify-content-md-center {\n -ms-flex-pack: center !important;\n justify-content: center !important;\n }\n .justify-content-md-between {\n -ms-flex-pack: justify !important;\n justify-content: space-between !important;\n }\n .justify-content-md-around {\n -ms-flex-pack: distribute !important;\n justify-content: space-around !important;\n }\n .align-items-md-start {\n -ms-flex-align: start !important;\n align-items: flex-start !important;\n }\n .align-items-md-end {\n -ms-flex-align: end !important;\n align-items: flex-end !important;\n }\n .align-items-md-center {\n -ms-flex-align: center !important;\n align-items: center !important;\n }\n .align-items-md-baseline {\n -ms-flex-align: baseline !important;\n align-items: baseline !important;\n }\n .align-items-md-stretch {\n -ms-flex-align: stretch !important;\n align-items: stretch !important;\n }\n .align-content-md-start {\n -ms-flex-line-pack: start !important;\n align-content: flex-start !important;\n }\n .align-content-md-end {\n -ms-flex-line-pack: end !important;\n align-content: flex-end !important;\n }\n .align-content-md-center {\n -ms-flex-line-pack: center !important;\n align-content: center !important;\n }\n .align-content-md-between {\n -ms-flex-line-pack: justify !important;\n align-content: space-between !important;\n }\n .align-content-md-around {\n -ms-flex-line-pack: distribute !important;\n align-content: space-around !important;\n }\n .align-content-md-stretch {\n -ms-flex-line-pack: stretch !important;\n align-content: stretch !important;\n }\n .align-self-md-auto {\n -ms-flex-item-align: auto !important;\n align-self: auto !important;\n }\n .align-self-md-start {\n -ms-flex-item-align: start !important;\n align-self: flex-start !important;\n }\n .align-self-md-end {\n -ms-flex-item-align: end !important;\n align-self: flex-end !important;\n }\n .align-self-md-center {\n -ms-flex-item-align: center !important;\n align-self: center !important;\n }\n .align-self-md-baseline {\n -ms-flex-item-align: baseline !important;\n align-self: baseline !important;\n }\n .align-self-md-stretch {\n -ms-flex-item-align: stretch !important;\n align-self: stretch !important;\n }\n}\n\n@media (min-width: 992px) {\n .flex-lg-row {\n -ms-flex-direction: row !important;\n flex-direction: row !important;\n }\n .flex-lg-column {\n -ms-flex-direction: column !important;\n flex-direction: column !important;\n }\n .flex-lg-row-reverse {\n -ms-flex-direction: row-reverse !important;\n flex-direction: row-reverse !important;\n }\n .flex-lg-column-reverse {\n -ms-flex-direction: column-reverse !important;\n flex-direction: column-reverse !important;\n }\n .flex-lg-wrap {\n -ms-flex-wrap: wrap !important;\n flex-wrap: wrap !important;\n }\n .flex-lg-nowrap {\n -ms-flex-wrap: nowrap !important;\n flex-wrap: nowrap !important;\n }\n .flex-lg-wrap-reverse {\n -ms-flex-wrap: wrap-reverse !important;\n flex-wrap: wrap-reverse !important;\n }\n .justify-content-lg-start {\n -ms-flex-pack: start !important;\n justify-content: flex-start !important;\n }\n .justify-content-lg-end {\n -ms-flex-pack: end !important;\n justify-content: flex-end !important;\n }\n .justify-content-lg-center {\n -ms-flex-pack: center !important;\n justify-content: center !important;\n }\n .justify-content-lg-between {\n -ms-flex-pack: justify !important;\n justify-content: space-between !important;\n }\n .justify-content-lg-around {\n -ms-flex-pack: distribute !important;\n justify-content: space-around !important;\n }\n .align-items-lg-start {\n -ms-flex-align: start !important;\n align-items: flex-start !important;\n }\n .align-items-lg-end {\n -ms-flex-align: end !important;\n align-items: flex-end !important;\n }\n .align-items-lg-center {\n -ms-flex-align: center !important;\n align-items: center !important;\n }\n .align-items-lg-baseline {\n -ms-flex-align: baseline !important;\n align-items: baseline !important;\n }\n .align-items-lg-stretch {\n -ms-flex-align: stretch !important;\n align-items: stretch !important;\n }\n .align-content-lg-start {\n -ms-flex-line-pack: start !important;\n align-content: flex-start !important;\n }\n .align-content-lg-end {\n -ms-flex-line-pack: end !important;\n align-content: flex-end !important;\n }\n .align-content-lg-center {\n -ms-flex-line-pack: center !important;\n align-content: center !important;\n }\n .align-content-lg-between {\n -ms-flex-line-pack: justify !important;\n align-content: space-between !important;\n }\n .align-content-lg-around {\n -ms-flex-line-pack: distribute !important;\n align-content: space-around !important;\n }\n .align-content-lg-stretch {\n -ms-flex-line-pack: stretch !important;\n align-content: stretch !important;\n }\n .align-self-lg-auto {\n -ms-flex-item-align: auto !important;\n align-self: auto !important;\n }\n .align-self-lg-start {\n -ms-flex-item-align: start !important;\n align-self: flex-start !important;\n }\n .align-self-lg-end {\n -ms-flex-item-align: end !important;\n align-self: flex-end !important;\n }\n .align-self-lg-center {\n -ms-flex-item-align: center !important;\n align-self: center !important;\n }\n .align-self-lg-baseline {\n -ms-flex-item-align: baseline !important;\n align-self: baseline !important;\n }\n .align-self-lg-stretch {\n -ms-flex-item-align: stretch !important;\n align-self: stretch !important;\n }\n}\n\n@media (min-width: 1200px) {\n .flex-xl-row {\n -ms-flex-direction: row !important;\n flex-direction: row !important;\n }\n .flex-xl-column {\n -ms-flex-direction: column !important;\n flex-direction: column !important;\n }\n .flex-xl-row-reverse {\n -ms-flex-direction: row-reverse !important;\n flex-direction: row-reverse !important;\n }\n .flex-xl-column-reverse {\n -ms-flex-direction: column-reverse !important;\n flex-direction: column-reverse !important;\n }\n .flex-xl-wrap {\n -ms-flex-wrap: wrap !important;\n flex-wrap: wrap !important;\n }\n .flex-xl-nowrap {\n -ms-flex-wrap: nowrap !important;\n flex-wrap: nowrap !important;\n }\n .flex-xl-wrap-reverse {\n -ms-flex-wrap: wrap-reverse !important;\n flex-wrap: wrap-reverse !important;\n }\n .justify-content-xl-start {\n -ms-flex-pack: start !important;\n justify-content: flex-start !important;\n }\n .justify-content-xl-end {\n -ms-flex-pack: end !important;\n justify-content: flex-end !important;\n }\n .justify-content-xl-center {\n -ms-flex-pack: center !important;\n justify-content: center !important;\n }\n .justify-content-xl-between {\n -ms-flex-pack: justify !important;\n justify-content: space-between !important;\n }\n .justify-content-xl-around {\n -ms-flex-pack: distribute !important;\n justify-content: space-around !important;\n }\n .align-items-xl-start {\n -ms-flex-align: start !important;\n align-items: flex-start !important;\n }\n .align-items-xl-end {\n -ms-flex-align: end !important;\n align-items: flex-end !important;\n }\n .align-items-xl-center {\n -ms-flex-align: center !important;\n align-items: center !important;\n }\n .align-items-xl-baseline {\n -ms-flex-align: baseline !important;\n align-items: baseline !important;\n }\n .align-items-xl-stretch {\n -ms-flex-align: stretch !important;\n align-items: stretch !important;\n }\n .align-content-xl-start {\n -ms-flex-line-pack: start !important;\n align-content: flex-start !important;\n }\n .align-content-xl-end {\n -ms-flex-line-pack: end !important;\n align-content: flex-end !important;\n }\n .align-content-xl-center {\n -ms-flex-line-pack: center !important;\n align-content: center !important;\n }\n .align-content-xl-between {\n -ms-flex-line-pack: justify !important;\n align-content: space-between !important;\n }\n .align-content-xl-around {\n -ms-flex-line-pack: distribute !important;\n align-content: space-around !important;\n }\n .align-content-xl-stretch {\n -ms-flex-line-pack: stretch !important;\n align-content: stretch !important;\n }\n .align-self-xl-auto {\n -ms-flex-item-align: auto !important;\n align-self: auto !important;\n }\n .align-self-xl-start {\n -ms-flex-item-align: start !important;\n align-self: flex-start !important;\n }\n .align-self-xl-end {\n -ms-flex-item-align: end !important;\n align-self: flex-end !important;\n }\n .align-self-xl-center {\n -ms-flex-item-align: center !important;\n align-self: center !important;\n }\n .align-self-xl-baseline {\n -ms-flex-item-align: baseline !important;\n align-self: baseline !important;\n }\n .align-self-xl-stretch {\n -ms-flex-item-align: stretch !important;\n align-self: stretch !important;\n }\n}\n/*# sourceMappingURL=bootstrap-grid.css.map */","// Container widths\n//\n// Set the container width, and override it for fixed navbars in media queries.\n\n@if $enable-grid-classes {\n .container {\n @include make-container();\n @include make-container-max-widths();\n }\n}\n\n// Fluid container\n//\n// Utilizes the mixin meant for fixed width containers, but with 100% width for\n// fluid, full width layouts.\n\n@if $enable-grid-classes {\n .container-fluid {\n width: 100%;\n @include make-container();\n }\n}\n\n// Row\n//\n// Rows contain and clear the floats of your columns.\n\n@if $enable-grid-classes {\n .row {\n @include make-row();\n }\n\n // Remove the negative margin from default .row, then the horizontal padding\n // from all immediate children columns (to prevent runaway style inheritance).\n .no-gutters {\n margin-right: 0;\n margin-left: 0;\n\n > .col,\n > [class*=\"col-\"] {\n padding-right: 0;\n padding-left: 0;\n }\n }\n}\n\n// Columns\n//\n// Common styles for small and large grid columns\n\n@if $enable-grid-classes {\n @include make-grid-columns();\n}\n","/// Grid system\n//\n// Generate semantic grid columns with these mixins.\n\n@mixin make-container() {\n margin-right: auto;\n margin-left: auto;\n padding-right: ($grid-gutter-width / 2);\n padding-left: ($grid-gutter-width / 2);\n width: 100%;\n}\n\n\n// For each breakpoint, define the maximum width of the container in a media query\n@mixin make-container-max-widths($max-widths: $container-max-widths, $breakpoints: $grid-breakpoints) {\n @each $breakpoint, $container-max-width in $max-widths {\n @include media-breakpoint-up($breakpoint, $breakpoints) {\n max-width: $container-max-width;\n }\n }\n}\n\n@mixin make-row() {\n display: flex;\n flex-wrap: wrap;\n margin-right: ($grid-gutter-width / -2);\n margin-left: ($grid-gutter-width / -2);\n}\n\n@mixin make-col-ready() {\n position: relative;\n // Prevent columns from becoming too narrow when at smaller grid tiers by\n // always setting `width: 100%;`. This works because we use `flex` values\n // later on to override this initial width.\n width: 100%;\n min-height: 1px; // Prevent collapsing\n padding-right: ($grid-gutter-width / 2);\n padding-left: ($grid-gutter-width / 2);\n}\n\n@mixin make-col($size, $columns: $grid-columns) {\n flex: 0 0 percentage($size / $columns);\n // Add a `max-width` to ensure content within each column does not blow out\n // the width of the column. Applies to IE10+ and Firefox. Chrome and Safari\n // do not appear to require this.\n max-width: percentage($size / $columns);\n}\n","// Breakpoint viewport sizes and media queries.\n//\n// Breakpoints are defined as a map of (name: minimum width), order from small to large:\n//\n// (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px)\n//\n// The map defined in the `$grid-breakpoints` global variable is used as the `$breakpoints` argument by default.\n\n// Name of the next breakpoint, or null for the last breakpoint.\n//\n// >> breakpoint-next(sm)\n// md\n// >> breakpoint-next(sm, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px))\n// md\n// >> breakpoint-next(sm, $breakpoint-names: (xs sm md lg xl))\n// md\n@function breakpoint-next($name, $breakpoints: $grid-breakpoints, $breakpoint-names: map-keys($breakpoints)) {\n $n: index($breakpoint-names, $name);\n @return if($n < length($breakpoint-names), nth($breakpoint-names, $n + 1), null);\n}\n\n// Minimum breakpoint width. Null for the smallest (first) breakpoint.\n//\n// >> breakpoint-min(sm, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px))\n// 576px\n@function breakpoint-min($name, $breakpoints: $grid-breakpoints) {\n $min: map-get($breakpoints, $name);\n @return if($min != 0, $min, null);\n}\n\n// Maximum breakpoint width. Null for the largest (last) breakpoint.\n// The maximum value is calculated as the minimum of the next one less 0.1.\n//\n// >> breakpoint-max(sm, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px))\n// 767px\n@function breakpoint-max($name, $breakpoints: $grid-breakpoints) {\n $next: breakpoint-next($name, $breakpoints);\n @return if($next, breakpoint-min($next, $breakpoints) - 1px, null);\n}\n\n// Returns a blank string if smallest breakpoint, otherwise returns the name with a dash infront.\n// Useful for making responsive utilities.\n//\n// >> breakpoint-infix(xs, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px))\n// \"\" (Returns a blank string)\n// >> breakpoint-infix(sm, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px))\n// \"-sm\"\n@function breakpoint-infix($name, $breakpoints: $grid-breakpoints) {\n @return if(breakpoint-min($name, $breakpoints) == null, \"\", \"-#{$name}\");\n}\n\n// Media of at least the minimum breakpoint width. No query for the smallest breakpoint.\n// Makes the @content apply to the given breakpoint and wider.\n@mixin media-breakpoint-up($name, $breakpoints: $grid-breakpoints) {\n $min: breakpoint-min($name, $breakpoints);\n @if $min {\n @media (min-width: $min) {\n @content;\n }\n } @else {\n @content;\n }\n}\n\n// Media of at most the maximum breakpoint width. No query for the largest breakpoint.\n// Makes the @content apply to the given breakpoint and narrower.\n@mixin media-breakpoint-down($name, $breakpoints: $grid-breakpoints) {\n $max: breakpoint-max($name, $breakpoints);\n @if $max {\n @media (max-width: $max) {\n @content;\n }\n } @else {\n @content;\n }\n}\n\n// Media that spans multiple breakpoint widths.\n// Makes the @content apply between the min and max breakpoints\n@mixin media-breakpoint-between($lower, $upper, $breakpoints: $grid-breakpoints) {\n $min: breakpoint-min($lower, $breakpoints);\n $max: breakpoint-max($upper, $breakpoints);\n\n @media (min-width: $min) and (max-width: $max) {\n @content;\n }\n}\n\n// Media between the breakpoint's minimum and maximum widths.\n// No minimum for the smallest breakpoint, and no maximum for the largest one.\n// Makes the @content apply only to the given breakpoint, not viewports any wider or narrower.\n@mixin media-breakpoint-only($name, $breakpoints: $grid-breakpoints) {\n $min: breakpoint-min($name, $breakpoints);\n $max: breakpoint-max($name, $breakpoints);\n\n @if $min != null and $max != null {\n @media (min-width: $min) and (max-width: $max) {\n @content;\n }\n } @else if $max == null {\n @include media-breakpoint-up($name)\n } @else if $min == null {\n @include media-breakpoint-down($name)\n }\n}\n","// Framework grid generation\n//\n// Used only by Bootstrap to generate the correct number of grid classes given\n// any value of `$grid-columns`.\n\n@mixin make-grid-columns($columns: $grid-columns, $gutter: $grid-gutter-width, $breakpoints: $grid-breakpoints) {\n // Common properties for all breakpoints\n %grid-column {\n position: relative;\n width: 100%;\n min-height: 1px; // Prevent columns from collapsing when empty\n padding-right: ($gutter / 2);\n padding-left: ($gutter / 2);\n }\n\n @each $breakpoint in map-keys($breakpoints) {\n $infix: breakpoint-infix($breakpoint, $breakpoints);\n\n // Allow columns to stretch full width below their breakpoints\n @for $i from 1 through $columns {\n .col#{$infix}-#{$i} {\n @extend %grid-column;\n }\n }\n .col#{$infix},\n .col#{$infix}-auto {\n @extend %grid-column;\n }\n\n @include media-breakpoint-up($breakpoint, $breakpoints) {\n // Provide basic `.col-{bp}` classes for equal-width flexbox columns\n .col#{$infix} {\n flex-basis: 0;\n flex-grow: 1;\n max-width: 100%;\n }\n .col#{$infix}-auto {\n flex: 0 0 auto;\n width: auto;\n max-width: none; // Reset earlier grid tiers\n }\n\n @for $i from 1 through $columns {\n .col#{$infix}-#{$i} {\n @include make-col($i, $columns);\n }\n }\n\n @for $i from 1 through $columns {\n .order#{$infix}-#{$i} {\n order: $i;\n }\n }\n }\n }\n}\n","// Flex variation\n//\n// Custom styles for additional flex alignment options.\n\n@each $breakpoint in map-keys($grid-breakpoints) {\n @include media-breakpoint-up($breakpoint) {\n $infix: breakpoint-infix($breakpoint, $grid-breakpoints);\n\n .flex#{$infix}-row { flex-direction: row !important; }\n .flex#{$infix}-column { flex-direction: column !important; }\n .flex#{$infix}-row-reverse { flex-direction: row-reverse !important; }\n .flex#{$infix}-column-reverse { flex-direction: column-reverse !important; }\n\n .flex#{$infix}-wrap { flex-wrap: wrap !important; }\n .flex#{$infix}-nowrap { flex-wrap: nowrap !important; }\n .flex#{$infix}-wrap-reverse { flex-wrap: wrap-reverse !important; }\n\n .justify-content#{$infix}-start { justify-content: flex-start !important; }\n .justify-content#{$infix}-end { justify-content: flex-end !important; }\n .justify-content#{$infix}-center { justify-content: center !important; }\n .justify-content#{$infix}-between { justify-content: space-between !important; }\n .justify-content#{$infix}-around { justify-content: space-around !important; }\n\n .align-items#{$infix}-start { align-items: flex-start !important; }\n .align-items#{$infix}-end { align-items: flex-end !important; }\n .align-items#{$infix}-center { align-items: center !important; }\n .align-items#{$infix}-baseline { align-items: baseline !important; }\n .align-items#{$infix}-stretch { align-items: stretch !important; }\n\n .align-content#{$infix}-start { align-content: flex-start !important; }\n .align-content#{$infix}-end { align-content: flex-end !important; }\n .align-content#{$infix}-center { align-content: center !important; }\n .align-content#{$infix}-between { align-content: space-between !important; }\n .align-content#{$infix}-around { align-content: space-around !important; }\n .align-content#{$infix}-stretch { align-content: stretch !important; }\n\n .align-self#{$infix}-auto { align-self: auto !important; }\n .align-self#{$infix}-start { align-self: flex-start !important; }\n .align-self#{$infix}-end { align-self: flex-end !important; }\n .align-self#{$infix}-center { align-self: center !important; }\n .align-self#{$infix}-baseline { align-self: baseline !important; }\n .align-self#{$infix}-stretch { align-self: stretch !important; }\n }\n}\n"]} \ No newline at end of file
diff --git a/library/bootstrap/css/bootstrap-reboot.css b/library/bootstrap/css/bootstrap-reboot.css
index d15111066..867ee1771 100644
--- a/library/bootstrap/css/bootstrap-reboot.css
+++ b/library/bootstrap/css/bootstrap-reboot.css
@@ -1,6 +1,5 @@
html {
- -webkit-box-sizing: border-box;
- box-sizing: border-box;
+ box-sizing: border-box;
font-family: sans-serif;
line-height: 1.15;
-webkit-text-size-adjust: 100%;
@@ -12,21 +11,24 @@ html {
*,
*::before,
*::after {
- -webkit-box-sizing: inherit;
- box-sizing: inherit;
+ box-sizing: inherit;
}
@-ms-viewport {
width: device-width;
}
+article, aside, dialog, figcaption, figure, footer, header, hgroup, main, nav, section {
+ display: block;
+}
+
body {
margin: 0;
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif;
font-size: 1rem;
font-weight: normal;
line-height: 1.5;
- color: #292b2c;
+ color: #212529;
background-color: #fff;
}
@@ -35,8 +37,7 @@ body {
}
hr {
- -webkit-box-sizing: content-box;
- box-sizing: content-box;
+ box-sizing: content-box;
height: 0;
overflow: visible;
}
@@ -54,7 +55,8 @@ p {
abbr[title],
abbr[data-original-title] {
text-decoration: underline;
- text-decoration: underline dotted;
+ -webkit-text-decoration: underline dotted;
+ text-decoration: underline dotted;
cursor: help;
border-bottom: 0;
}
@@ -122,14 +124,14 @@ sup {
}
a {
- color: #0275d8;
+ color: #007bff;
text-decoration: none;
background-color: transparent;
-webkit-text-decoration-skip: objects;
}
a:hover {
- color: #014c8c;
+ color: #0056b3;
text-decoration: underline;
}
@@ -194,7 +196,7 @@ table {
caption {
padding-top: 0.75rem;
padding-bottom: 0.75rem;
- color: #636c72;
+ color: #868e96;
text-align: left;
caption-side: bottom;
}
@@ -251,8 +253,7 @@ button::-moz-focus-inner,
input[type="radio"],
input[type="checkbox"] {
- -webkit-box-sizing: border-box;
- box-sizing: border-box;
+ box-sizing: border-box;
padding: 0;
}
diff --git a/library/bootstrap/css/bootstrap-reboot.css.map b/library/bootstrap/css/bootstrap-reboot.css.map
index e530b93b5..425ac48c7 100644
--- a/library/bootstrap/css/bootstrap-reboot.css.map
+++ b/library/bootstrap/css/bootstrap-reboot.css.map
@@ -1 +1 @@
-{"version":3,"sources":["../../scss/_reboot.scss","bootstrap-reboot.css","../../scss/_variables.scss","../../scss/mixins/_hover.scss"],"names":[],"mappings":"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","file":"bootstrap-reboot.css","sourcesContent":[null,"html {\n box-sizing: border-box;\n font-family: sans-serif;\n line-height: 1.15;\n -webkit-text-size-adjust: 100%;\n -ms-text-size-adjust: 100%;\n -ms-overflow-style: scrollbar;\n -webkit-tap-highlight-color: transparent;\n}\n\n*,\n*::before,\n*::after {\n box-sizing: inherit;\n}\n\n@-ms-viewport {\n width: device-width;\n}\n\nbody {\n margin: 0;\n font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, \"Helvetica Neue\", Arial, sans-serif;\n font-size: 1rem;\n font-weight: normal;\n line-height: 1.5;\n color: #292b2c;\n background-color: #fff;\n}\n\n[tabindex=\"-1\"]:focus {\n outline: none !important;\n}\n\nhr {\n box-sizing: content-box;\n height: 0;\n overflow: visible;\n}\n\nh1, h2, h3, h4, h5, h6 {\n margin-top: 0;\n margin-bottom: .5rem;\n}\n\np {\n margin-top: 0;\n margin-bottom: 1rem;\n}\n\nabbr[title],\nabbr[data-original-title] {\n text-decoration: underline;\n text-decoration: underline dotted;\n cursor: help;\n border-bottom: 0;\n}\n\naddress {\n margin-bottom: 1rem;\n font-style: normal;\n line-height: inherit;\n}\n\nol,\nul,\ndl {\n margin-top: 0;\n margin-bottom: 1rem;\n}\n\nol ol,\nul ul,\nol ul,\nul ol {\n margin-bottom: 0;\n}\n\ndt {\n font-weight: bold;\n}\n\ndd {\n margin-bottom: .5rem;\n margin-left: 0;\n}\n\nblockquote {\n margin: 0 0 1rem;\n}\n\ndfn {\n font-style: italic;\n}\n\nb,\nstrong {\n font-weight: bolder;\n}\n\nsmall {\n font-size: 80%;\n}\n\nsub,\nsup {\n position: relative;\n font-size: 75%;\n line-height: 0;\n vertical-align: baseline;\n}\n\nsub {\n bottom: -.25em;\n}\n\nsup {\n top: -.5em;\n}\n\na {\n color: #0275d8;\n text-decoration: none;\n background-color: transparent;\n -webkit-text-decoration-skip: objects;\n}\n\na:hover {\n color: #014c8c;\n text-decoration: underline;\n}\n\na:not([href]):not([tabindex]) {\n color: inherit;\n text-decoration: none;\n}\n\na:not([href]):not([tabindex]):focus, a:not([href]):not([tabindex]):hover {\n color: inherit;\n text-decoration: none;\n}\n\na:not([href]):not([tabindex]):focus {\n outline: 0;\n}\n\npre,\ncode,\nkbd,\nsamp {\n font-family: monospace, monospace;\n font-size: 1em;\n}\n\npre {\n margin-top: 0;\n margin-bottom: 1rem;\n overflow: auto;\n}\n\nfigure {\n margin: 0 0 1rem;\n}\n\nimg {\n vertical-align: middle;\n border-style: none;\n}\n\nsvg:not(:root) {\n overflow: hidden;\n}\n\na,\narea,\nbutton,\n[role=\"button\"],\ninput,\nlabel,\nselect,\nsummary,\ntextarea {\n touch-action: manipulation;\n}\n\ntable {\n border-collapse: collapse;\n}\n\ncaption {\n padding-top: 0.75rem;\n padding-bottom: 0.75rem;\n color: #636c72;\n text-align: left;\n caption-side: bottom;\n}\n\nth {\n text-align: left;\n}\n\nlabel {\n display: inline-block;\n margin-bottom: .5rem;\n}\n\nbutton:focus {\n outline: 1px dotted;\n outline: 5px auto -webkit-focus-ring-color;\n}\n\ninput,\nbutton,\nselect,\noptgroup,\ntextarea {\n margin: 0;\n font-family: inherit;\n font-size: inherit;\n line-height: inherit;\n}\n\nbutton,\ninput {\n overflow: visible;\n}\n\nbutton,\nselect {\n text-transform: none;\n}\n\nbutton,\nhtml [type=\"button\"],\n[type=\"reset\"],\n[type=\"submit\"] {\n -webkit-appearance: button;\n}\n\nbutton::-moz-focus-inner,\n[type=\"button\"]::-moz-focus-inner,\n[type=\"reset\"]::-moz-focus-inner,\n[type=\"submit\"]::-moz-focus-inner {\n padding: 0;\n border-style: none;\n}\n\ninput[type=\"radio\"],\ninput[type=\"checkbox\"] {\n box-sizing: border-box;\n padding: 0;\n}\n\ninput[type=\"date\"],\ninput[type=\"time\"],\ninput[type=\"datetime-local\"],\ninput[type=\"month\"] {\n -webkit-appearance: listbox;\n}\n\ntextarea {\n overflow: auto;\n resize: vertical;\n}\n\nfieldset {\n min-width: 0;\n padding: 0;\n margin: 0;\n border: 0;\n}\n\nlegend {\n display: block;\n width: 100%;\n max-width: 100%;\n padding: 0;\n margin-bottom: .5rem;\n font-size: 1.5rem;\n line-height: inherit;\n color: inherit;\n white-space: normal;\n}\n\nprogress {\n vertical-align: baseline;\n}\n\n[type=\"number\"]::-webkit-inner-spin-button,\n[type=\"number\"]::-webkit-outer-spin-button {\n height: auto;\n}\n\n[type=\"search\"] {\n outline-offset: -2px;\n -webkit-appearance: none;\n}\n\n[type=\"search\"]::-webkit-search-cancel-button,\n[type=\"search\"]::-webkit-search-decoration {\n -webkit-appearance: none;\n}\n\n::-webkit-file-upload-button {\n font: inherit;\n -webkit-appearance: button;\n}\n\noutput {\n display: inline-block;\n}\n\nsummary {\n display: list-item;\n}\n\ntemplate {\n display: none;\n}\n\n[hidden] {\n display: none !important;\n}\n\n/*# sourceMappingURL=bootstrap-reboot.css.map */",null,null]} \ No newline at end of file
+{"version":3,"sources":["../../scss/_reboot.scss","bootstrap-reboot.css","../../scss/_variables.scss","../../scss/mixins/_hover.scss"],"names":[],"mappings":"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","file":"bootstrap-reboot.css","sourcesContent":["// scss-lint:disable QualifyingElement, DuplicateProperty, VendorPrefix\n\n// Reboot\n//\n// Normalization of HTML elements, manually forked from Normalize.css to remove\n// styles targeting irrelevant browsers while applying new styles.\n//\n// Normalize is licensed MIT. https://github.com/necolas/normalize.css\n\n\n// Document\n//\n// 1. Change from `box-sizing: content-box` so that `width` is not affected by `padding` or `border`.\n// 2. Change the default font family in all browsers.\n// 3. Correct the line height in all browsers.\n// 4. Prevent adjustments of font size after orientation changes in IE on Windows Phone and in iOS.\n// 5. Setting @viewport causes scrollbars to overlap content in IE11 and Edge, so\n// we force a non-overlapping, non-auto-hiding scrollbar to counteract.\n// 6. Change the default tap highlight to be completely transparent in iOS.\n\nhtml {\n box-sizing: border-box; // 1\n font-family: sans-serif; // 2\n line-height: 1.15; // 3\n -webkit-text-size-adjust: 100%; // 4\n -ms-text-size-adjust: 100%; // 4\n -ms-overflow-style: scrollbar; // 5\n -webkit-tap-highlight-color: rgba(0,0,0,0); // 6\n}\n\n*,\n*::before,\n*::after {\n box-sizing: inherit; // 1\n}\n\n// IE10+ doesn't honor `<meta name=\"viewport\">` in some cases.\n@at-root {\n @-ms-viewport { width: device-width; }\n}\n\n// Shim for \"new\" HTML5 structural elements to display correctly (IE10, older browsers)\narticle, aside, dialog, figcaption, figure, footer, header, hgroup, main, nav, section {\n display: block;\n}\n\n// Body\n//\n// 1. Remove the margin in all browsers.\n// 2. As a best practice, apply a default `background-color`.\n\nbody {\n margin: 0; // 1\n font-family: $font-family-base;\n font-size: $font-size-base;\n font-weight: $font-weight-base;\n line-height: $line-height-base;\n color: $body-color;\n background-color: $body-bg; // 2\n}\n\n// Suppress the focus outline on elements that cannot be accessed via keyboard.\n// This prevents an unwanted focus outline from appearing around elements that\n// might still respond to pointer events.\n//\n// Credit: https://github.com/suitcss/base\n[tabindex=\"-1\"]:focus {\n outline: none !important;\n}\n\n\n// Content grouping\n//\n// 1. Add the correct box sizing in Firefox.\n// 2. Show the overflow in Edge and IE.\n\nhr {\n box-sizing: content-box; // 1\n height: 0; // 1\n overflow: visible; // 2\n}\n\n\n//\n// Typography\n//\n\n// Remove top margins from headings\n//\n// By default, `<h1>`-`<h6>` all receive top and bottom margins. We nuke the top\n// margin for easier control within type scales as it avoids margin collapsing.\nh1, h2, h3, h4, h5, h6 {\n margin-top: 0;\n margin-bottom: .5rem;\n}\n\n// Reset margins on paragraphs\n//\n// Similarly, the top margin on `<p>`s get reset. However, we also reset the\n// bottom margin to use `rem` units instead of `em`.\np {\n margin-top: 0;\n margin-bottom: 1rem;\n}\n\n// Abbreviations\n//\n// 1. Remove the bottom border in Firefox 39-.\n// 2. Add the correct text decoration in Chrome, Edge, IE, Opera, and Safari.\n// 3. Add explicit cursor to indicate changed behavior.\n// 4. Duplicate behavior to the data-* attribute for our tooltip plugin\n\nabbr[title],\nabbr[data-original-title] { // 4\n text-decoration: underline; // 2\n text-decoration: underline dotted; // 2\n cursor: help; // 3\n border-bottom: 0; // 1\n}\n\naddress {\n margin-bottom: 1rem;\n font-style: normal;\n line-height: inherit;\n}\n\nol,\nul,\ndl {\n margin-top: 0;\n margin-bottom: 1rem;\n}\n\nol ol,\nul ul,\nol ul,\nul ol {\n margin-bottom: 0;\n}\n\ndt {\n font-weight: $dt-font-weight;\n}\n\ndd {\n margin-bottom: .5rem;\n margin-left: 0; // Undo browser default\n}\n\nblockquote {\n margin: 0 0 1rem;\n}\n\ndfn {\n font-style: italic; // Add the correct font style in Android 4.3-\n}\n\nb,\nstrong {\n font-weight: bolder; // Add the correct font weight in Chrome, Edge, and Safari\n}\n\nsmall {\n font-size: 80%; // Add the correct font size in all browsers\n}\n\n//\n// Prevent `sub` and `sup` elements from affecting the line height in\n// all browsers.\n//\n\nsub,\nsup {\n position: relative;\n font-size: 75%;\n line-height: 0;\n vertical-align: baseline;\n}\n\nsub { bottom: -.25em; }\nsup { top: -.5em; }\n\n\n//\n// Links\n//\n\na {\n color: $link-color;\n text-decoration: $link-decoration;\n background-color: transparent; // Remove the gray background on active links in IE 10.\n -webkit-text-decoration-skip: objects; // Remove gaps in links underline in iOS 8+ and Safari 8+.\n\n @include hover {\n color: $link-hover-color;\n text-decoration: $link-hover-decoration;\n }\n}\n\n// And undo these styles for placeholder links/named anchors (without href)\n// which have not been made explicitly keyboard-focusable (without tabindex).\n// It would be more straightforward to just use a[href] in previous block, but that\n// causes specificity issues in many other styles that are too complex to fix.\n// See https://github.com/twbs/bootstrap/issues/19402\n\na:not([href]):not([tabindex]) {\n color: inherit;\n text-decoration: none;\n\n @include hover-focus {\n color: inherit;\n text-decoration: none;\n }\n\n &:focus {\n outline: 0;\n }\n}\n\n\n//\n// Code\n//\n\npre,\ncode,\nkbd,\nsamp {\n font-family: monospace, monospace; // Correct the inheritance and scaling of font size in all browsers.\n font-size: 1em; // Correct the odd `em` font sizing in all browsers.\n}\n\npre {\n // Remove browser default top margin\n margin-top: 0;\n // Reset browser default of `1em` to use `rem`s\n margin-bottom: 1rem;\n // Don't allow content to break outside\n overflow: auto;\n}\n\n\n//\n// Figures\n//\n\nfigure {\n // Apply a consistent margin strategy (matches our type styles).\n margin: 0 0 1rem;\n}\n\n\n//\n// Images and content\n//\n\nimg {\n vertical-align: middle;\n border-style: none; // Remove the border on images inside links in IE 10-.\n}\n\nsvg:not(:root) {\n overflow: hidden; // Hide the overflow in IE\n}\n\n\n// Avoid 300ms click delay on touch devices that support the `touch-action` CSS property.\n//\n// In particular, unlike most other browsers, IE11+Edge on Windows 10 on touch devices and IE Mobile 10-11\n// DON'T remove the click delay when `<meta name=\"viewport\" content=\"width=device-width\">` is present.\n// However, they DO support removing the click delay via `touch-action: manipulation`.\n// See:\n// * https://v4-alpha.getbootstrap.com/content/reboot/#click-delay-optimization-for-touch\n// * http://caniuse.com/#feat=css-touch-action\n// * https://patrickhlauke.github.io/touch/tests/results/#suppressing-300ms-delay\n\na,\narea,\nbutton,\n[role=\"button\"],\ninput,\nlabel,\nselect,\nsummary,\ntextarea {\n touch-action: manipulation;\n}\n\n\n//\n// Tables\n//\n\ntable {\n border-collapse: collapse; // Prevent double borders\n}\n\ncaption {\n padding-top: $table-cell-padding;\n padding-bottom: $table-cell-padding;\n color: $text-muted;\n text-align: left;\n caption-side: bottom;\n}\n\nth {\n // Matches default `<td>` alignment\n text-align: left;\n}\n\n\n//\n// Forms\n//\n\nlabel {\n // Allow labels to use `margin` for spacing.\n display: inline-block;\n margin-bottom: .5rem;\n}\n\n// Work around a Firefox/IE bug where the transparent `button` background\n// results in a loss of the default `button` focus styles.\n//\n// Credit: https://github.com/suitcss/base/\nbutton:focus {\n outline: 1px dotted;\n outline: 5px auto -webkit-focus-ring-color;\n}\n\ninput,\nbutton,\nselect,\noptgroup,\ntextarea {\n margin: 0; // Remove the margin in Firefox and Safari\n font-family: inherit;\n font-size: inherit;\n line-height: inherit;\n}\n\nbutton,\ninput {\n overflow: visible; // Show the overflow in Edge\n}\n\nbutton,\nselect {\n text-transform: none; // Remove the inheritance of text transform in Firefox\n}\n\n// 1. Prevent a WebKit bug where (2) destroys native `audio` and `video`\n// controls in Android 4.\n// 2. Correct the inability to style clickable types in iOS and Safari.\nbutton,\nhtml [type=\"button\"], // 1\n[type=\"reset\"],\n[type=\"submit\"] {\n -webkit-appearance: button; // 2\n}\n\n// Remove inner border and padding from Firefox, but don't restore the outline like Normalize.\nbutton::-moz-focus-inner,\n[type=\"button\"]::-moz-focus-inner,\n[type=\"reset\"]::-moz-focus-inner,\n[type=\"submit\"]::-moz-focus-inner {\n padding: 0;\n border-style: none;\n}\n\ninput[type=\"radio\"],\ninput[type=\"checkbox\"] {\n box-sizing: border-box; // 1. Add the correct box sizing in IE 10-\n padding: 0; // 2. Remove the padding in IE 10-\n}\n\n\ninput[type=\"date\"],\ninput[type=\"time\"],\ninput[type=\"datetime-local\"],\ninput[type=\"month\"] {\n // Remove the default appearance of temporal inputs to avoid a Mobile Safari\n // bug where setting a custom line-height prevents text from being vertically\n // centered within the input.\n // See https://bugs.webkit.org/show_bug.cgi?id=139848\n // and https://github.com/twbs/bootstrap/issues/11266\n -webkit-appearance: listbox;\n}\n\ntextarea {\n overflow: auto; // Remove the default vertical scrollbar in IE.\n // Textareas should really only resize vertically so they don't break their (horizontal) containers.\n resize: vertical;\n}\n\nfieldset {\n // Browsers set a default `min-width: min-content;` on fieldsets,\n // unlike e.g. `<div>`s, which have `min-width: 0;` by default.\n // So we reset that to ensure fieldsets behave more like a standard block element.\n // See https://github.com/twbs/bootstrap/issues/12359\n // and https://html.spec.whatwg.org/multipage/#the-fieldset-and-legend-elements\n min-width: 0;\n // Reset the default outline behavior of fieldsets so they don't affect page layout.\n padding: 0;\n margin: 0;\n border: 0;\n}\n\n// 1. Correct the text wrapping in Edge and IE.\n// 2. Correct the color inheritance from `fieldset` elements in IE.\nlegend {\n display: block;\n width: 100%;\n max-width: 100%; // 1\n padding: 0;\n margin-bottom: .5rem;\n font-size: 1.5rem;\n line-height: inherit;\n color: inherit; // 2\n white-space: normal; // 1\n}\n\nprogress {\n vertical-align: baseline; // Add the correct vertical alignment in Chrome, Firefox, and Opera.\n}\n\n// Correct the cursor style of increment and decrement buttons in Chrome.\n[type=\"number\"]::-webkit-inner-spin-button,\n[type=\"number\"]::-webkit-outer-spin-button {\n height: auto;\n}\n\n[type=\"search\"] {\n // This overrides the extra rounded corners on search inputs in iOS so that our\n // `.form-control` class can properly style them. Note that this cannot simply\n // be added to `.form-control` as it's not specific enough. For details, see\n // https://github.com/twbs/bootstrap/issues/11586.\n outline-offset: -2px; // 2. Correct the outline style in Safari.\n -webkit-appearance: none;\n}\n\n//\n// Remove the inner padding and cancel buttons in Chrome and Safari on macOS.\n//\n\n[type=\"search\"]::-webkit-search-cancel-button,\n[type=\"search\"]::-webkit-search-decoration {\n -webkit-appearance: none;\n}\n\n//\n// 1. Correct the inability to style clickable types in iOS and Safari.\n// 2. Change font properties to `inherit` in Safari.\n//\n\n::-webkit-file-upload-button {\n font: inherit; // 2\n -webkit-appearance: button; // 1\n}\n\n//\n// Correct element displays\n//\n\noutput {\n display: inline-block;\n}\n\nsummary {\n display: list-item; // Add the correct display in all browsers\n}\n\ntemplate {\n display: none; // Add the correct display in IE\n}\n\n// Always hide an element with the `hidden` HTML attribute (from PureCSS).\n// Needed for proper display in IE 10-.\n[hidden] {\n display: none !important;\n}\n","html {\n box-sizing: border-box;\n font-family: sans-serif;\n line-height: 1.15;\n -webkit-text-size-adjust: 100%;\n -ms-text-size-adjust: 100%;\n -ms-overflow-style: scrollbar;\n -webkit-tap-highlight-color: transparent;\n}\n\n*,\n*::before,\n*::after {\n box-sizing: inherit;\n}\n\n@-ms-viewport {\n width: device-width;\n}\n\narticle, aside, dialog, figcaption, figure, footer, header, hgroup, main, nav, section {\n display: block;\n}\n\nbody {\n margin: 0;\n font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, \"Helvetica Neue\", Arial, sans-serif;\n font-size: 1rem;\n font-weight: normal;\n line-height: 1.5;\n color: #212529;\n background-color: #fff;\n}\n\n[tabindex=\"-1\"]:focus {\n outline: none !important;\n}\n\nhr {\n box-sizing: content-box;\n height: 0;\n overflow: visible;\n}\n\nh1, h2, h3, h4, h5, h6 {\n margin-top: 0;\n margin-bottom: .5rem;\n}\n\np {\n margin-top: 0;\n margin-bottom: 1rem;\n}\n\nabbr[title],\nabbr[data-original-title] {\n text-decoration: underline;\n text-decoration: underline dotted;\n cursor: help;\n border-bottom: 0;\n}\n\naddress {\n margin-bottom: 1rem;\n font-style: normal;\n line-height: inherit;\n}\n\nol,\nul,\ndl {\n margin-top: 0;\n margin-bottom: 1rem;\n}\n\nol ol,\nul ul,\nol ul,\nul ol {\n margin-bottom: 0;\n}\n\ndt {\n font-weight: bold;\n}\n\ndd {\n margin-bottom: .5rem;\n margin-left: 0;\n}\n\nblockquote {\n margin: 0 0 1rem;\n}\n\ndfn {\n font-style: italic;\n}\n\nb,\nstrong {\n font-weight: bolder;\n}\n\nsmall {\n font-size: 80%;\n}\n\nsub,\nsup {\n position: relative;\n font-size: 75%;\n line-height: 0;\n vertical-align: baseline;\n}\n\nsub {\n bottom: -.25em;\n}\n\nsup {\n top: -.5em;\n}\n\na {\n color: #007bff;\n text-decoration: none;\n background-color: transparent;\n -webkit-text-decoration-skip: objects;\n}\n\na:hover {\n color: #0056b3;\n text-decoration: underline;\n}\n\na:not([href]):not([tabindex]) {\n color: inherit;\n text-decoration: none;\n}\n\na:not([href]):not([tabindex]):focus, a:not([href]):not([tabindex]):hover {\n color: inherit;\n text-decoration: none;\n}\n\na:not([href]):not([tabindex]):focus {\n outline: 0;\n}\n\npre,\ncode,\nkbd,\nsamp {\n font-family: monospace, monospace;\n font-size: 1em;\n}\n\npre {\n margin-top: 0;\n margin-bottom: 1rem;\n overflow: auto;\n}\n\nfigure {\n margin: 0 0 1rem;\n}\n\nimg {\n vertical-align: middle;\n border-style: none;\n}\n\nsvg:not(:root) {\n overflow: hidden;\n}\n\na,\narea,\nbutton,\n[role=\"button\"],\ninput,\nlabel,\nselect,\nsummary,\ntextarea {\n touch-action: manipulation;\n}\n\ntable {\n border-collapse: collapse;\n}\n\ncaption {\n padding-top: 0.75rem;\n padding-bottom: 0.75rem;\n color: #868e96;\n text-align: left;\n caption-side: bottom;\n}\n\nth {\n text-align: left;\n}\n\nlabel {\n display: inline-block;\n margin-bottom: .5rem;\n}\n\nbutton:focus {\n outline: 1px dotted;\n outline: 5px auto -webkit-focus-ring-color;\n}\n\ninput,\nbutton,\nselect,\noptgroup,\ntextarea {\n margin: 0;\n font-family: inherit;\n font-size: inherit;\n line-height: inherit;\n}\n\nbutton,\ninput {\n overflow: visible;\n}\n\nbutton,\nselect {\n text-transform: none;\n}\n\nbutton,\nhtml [type=\"button\"],\n[type=\"reset\"],\n[type=\"submit\"] {\n -webkit-appearance: button;\n}\n\nbutton::-moz-focus-inner,\n[type=\"button\"]::-moz-focus-inner,\n[type=\"reset\"]::-moz-focus-inner,\n[type=\"submit\"]::-moz-focus-inner {\n padding: 0;\n border-style: none;\n}\n\ninput[type=\"radio\"],\ninput[type=\"checkbox\"] {\n box-sizing: border-box;\n padding: 0;\n}\n\ninput[type=\"date\"],\ninput[type=\"time\"],\ninput[type=\"datetime-local\"],\ninput[type=\"month\"] {\n -webkit-appearance: listbox;\n}\n\ntextarea {\n overflow: auto;\n resize: vertical;\n}\n\nfieldset {\n min-width: 0;\n padding: 0;\n margin: 0;\n border: 0;\n}\n\nlegend {\n display: block;\n width: 100%;\n max-width: 100%;\n padding: 0;\n margin-bottom: .5rem;\n font-size: 1.5rem;\n line-height: inherit;\n color: inherit;\n white-space: normal;\n}\n\nprogress {\n vertical-align: baseline;\n}\n\n[type=\"number\"]::-webkit-inner-spin-button,\n[type=\"number\"]::-webkit-outer-spin-button {\n height: auto;\n}\n\n[type=\"search\"] {\n outline-offset: -2px;\n -webkit-appearance: none;\n}\n\n[type=\"search\"]::-webkit-search-cancel-button,\n[type=\"search\"]::-webkit-search-decoration {\n -webkit-appearance: none;\n}\n\n::-webkit-file-upload-button {\n font: inherit;\n -webkit-appearance: button;\n}\n\noutput {\n display: inline-block;\n}\n\nsummary {\n display: list-item;\n}\n\ntemplate {\n display: none;\n}\n\n[hidden] {\n display: none !important;\n}\n\n/*# sourceMappingURL=bootstrap-reboot.css.map */","// Variables\n//\n// Copy settings from this file into the provided `_custom.scss` to override\n// the Bootstrap defaults without modifying key, versioned files.\n//\n// Variables should follow the `$component-state-property-size` formula for\n// consistent naming. Ex: $nav-link-disabled-color and $modal-content-box-shadow-xs.\n\n// Table of Contents\n//\n// Color system\n// Options\n// Spacing\n// Body\n// Links\n// Grid breakpoints\n// Grid containers\n// Grid columns\n// Fonts\n// Components\n// Tables\n// Buttons\n// Forms\n// Dropdowns\n// Z-index master list\n// Navs\n// Navbar\n// Pagination\n// Jumbotron\n// Form states and alerts\n// Cards\n// Tooltips\n// Popovers\n// Badges\n// Modals\n// Alerts\n// Progress bars\n// List group\n// Image thumbnails\n// Figures\n// Breadcrumbs\n// Carousel\n// Close\n// Code\n\n\n//\n// Color system\n//\n\n$white: #fff !default;\n$gray-100: #f8f9fa !default;\n$gray-200: #e9ecef !default;\n$gray-300: #dee2e6 !default;\n$gray-400: #ced4da !default;\n$gray-500: #adb5bd !default;\n$gray-600: #868e96 !default;\n$gray-700: #495057 !default;\n$gray-800: #343a40 !default;\n$gray-900: #212529 !default;\n$black: #000 !default;\n\n$grays: (\n 100: $gray-100,\n 200: $gray-200,\n 300: $gray-300,\n 400: $gray-400,\n 500: $gray-500,\n 600: $gray-600,\n 700: $gray-700,\n 800: $gray-800,\n 900: $gray-900\n) !default;\n\n$blue: #007bff !default;\n$indigo: #6610f2 !default;\n$purple: #6f42c1 !default;\n$pink: #e83e8c !default;\n$red: #dc3545 !default;\n$orange: #fd7e14 !default;\n$yellow: #ffc107 !default;\n$green: #28a745 !default;\n$teal: #20c997 !default;\n$cyan: #17a2b8 !default;\n\n$colors: (\n blue: $blue,\n indigo: $indigo,\n purple: $purple,\n pink: $pink,\n red: $red,\n orange: $orange,\n yellow: $yellow,\n green: $green,\n teal: $teal,\n cyan: $cyan,\n white: $white,\n gray: $gray-600,\n gray-dark: $gray-800\n) !default;\n\n$theme-colors: (\n primary: $blue,\n secondary: $gray-600,\n success: $green,\n info: $cyan,\n warning: $yellow,\n danger: $red,\n light: $gray-100,\n dark: $gray-800\n) !default;\n\n// Set a specific jump point for requesting color jumps\n$theme-color-interval: 8% !default;\n\n\n// Options\n//\n// Quickly modify global styling by enabling or disabling optional features.\n\n$enable-rounded: true !default;\n$enable-shadows: false !default;\n$enable-gradients: false !default;\n$enable-transitions: true !default;\n$enable-hover-media-query: false !default;\n$enable-grid-classes: true !default;\n$enable-print-styles: true !default;\n\n\n// Spacing\n//\n// Control the default styling of most Bootstrap elements by modifying these\n// variables. Mostly focused on spacing.\n// You can add more entries to the $spacers map, should you need more variation.\n\n$spacer: 1rem !default;\n$spacers: (\n 0: 0,\n 1: ($spacer * .25),\n 2: ($spacer * .5),\n 3: $spacer,\n 4: ($spacer * 1.5),\n 5: ($spacer * 3)\n) !default;\n\n// This variable affects the `.h-*` and `.w-*` classes.\n$sizes: (\n 25: 25%,\n 50: 50%,\n 75: 75%,\n 100: 100%\n) !default;\n\n// Body\n//\n// Settings for the `<body>` element.\n\n$body-bg: $white !default;\n$body-color: $gray-900 !default;\n\n// Links\n//\n// Style anchor elements.\n\n$link-color: theme-color(\"primary\") !default;\n$link-decoration: none !default;\n$link-hover-color: darken($link-color, 15%) !default;\n$link-hover-decoration: underline !default;\n\n\n// Grid breakpoints\n//\n// Define the minimum dimensions at which your layout will change,\n// adapting to different screen sizes, for use in media queries.\n\n$grid-breakpoints: (\n xs: 0,\n sm: 576px,\n md: 768px,\n lg: 992px,\n xl: 1200px\n) !default;\n@include _assert-ascending($grid-breakpoints, \"$grid-breakpoints\");\n@include _assert-starts-at-zero($grid-breakpoints);\n\n\n// Grid containers\n//\n// Define the maximum width of `.container` for different screen sizes.\n\n$container-max-widths: (\n sm: 540px,\n md: 720px,\n lg: 960px,\n xl: 1140px\n) !default;\n@include _assert-ascending($container-max-widths, \"$container-max-widths\");\n\n\n// Grid columns\n//\n// Set the number of columns and specify the width of the gutters.\n\n$grid-columns: 12 !default;\n$grid-gutter-width: 30px !default;\n\n// Components\n//\n// Define common padding and border radius sizes and more.\n\n$line-height-lg: 1.5 !default;\n$line-height-sm: 1.5 !default;\n\n$border-width: 1px !default;\n\n$border-radius: .25rem !default;\n$border-radius-lg: .3rem !default;\n$border-radius-sm: .2rem !default;\n\n$component-active-color: $white !default;\n$component-active-bg: theme-color(\"primary\") !default;\n\n$caret-width: .3em !default;\n\n$transition-base: all .2s ease-in-out !default;\n$transition-fade: opacity .15s linear !default;\n$transition-collapse: height .35s ease !default;\n\n\n// Fonts\n//\n// Font, line-height, and color for body text, headings, and more.\n\n$font-family-sans-serif: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, \"Helvetica Neue\", Arial, sans-serif !default;\n$font-family-monospace: Menlo, Monaco, Consolas, \"Liberation Mono\", \"Courier New\", monospace !default;\n$font-family-base: $font-family-sans-serif !default;\n\n$font-size-base: 1rem !default; // Assumes the browser default, typically `16px`\n$font-size-lg: 1.25rem !default;\n$font-size-sm: .875rem !default;\n\n$font-weight-normal: normal !default;\n$font-weight-bold: bold !default;\n\n$font-weight-base: $font-weight-normal !default;\n$line-height-base: 1.5 !default;\n\n$h1-font-size: 2.5rem !default;\n$h2-font-size: 2rem !default;\n$h3-font-size: 1.75rem !default;\n$h4-font-size: 1.5rem !default;\n$h5-font-size: 1.25rem !default;\n$h6-font-size: 1rem !default;\n\n$headings-margin-bottom: ($spacer / 2) !default;\n$headings-font-family: inherit !default;\n$headings-font-weight: 500 !default;\n$headings-line-height: 1.1 !default;\n$headings-color: inherit !default;\n\n$display1-size: 6rem !default;\n$display2-size: 5.5rem !default;\n$display3-size: 4.5rem !default;\n$display4-size: 3.5rem !default;\n\n$display1-weight: 300 !default;\n$display2-weight: 300 !default;\n$display3-weight: 300 !default;\n$display4-weight: 300 !default;\n$display-line-height: $headings-line-height !default;\n\n$lead-font-size: 1.25rem !default;\n$lead-font-weight: 300 !default;\n\n$small-font-size: 80% !default;\n\n$text-muted: $gray-600 !default;\n\n$blockquote-small-color: $gray-600 !default;\n$blockquote-font-size: ($font-size-base * 1.25) !default;\n\n$hr-border-color: rgba($black,.1) !default;\n$hr-border-width: $border-width !default;\n\n$mark-padding: .2em !default;\n\n$dt-font-weight: $font-weight-bold !default;\n\n$kbd-box-shadow: inset 0 -.1rem 0 rgba($black,.25) !default;\n$nested-kbd-font-weight: $font-weight-bold !default;\n\n$list-inline-padding: 5px !default;\n\n$mark-bg: #fcf8e3 !default;\n\n\n// Tables\n//\n// Customizes the `.table` component with basic values, each used across all table variations.\n\n$table-cell-padding: .75rem !default;\n$table-cell-padding-sm: .3rem !default;\n\n$table-bg: transparent !default;\n$table-accent-bg: rgba($black,.05) !default;\n$table-hover-bg: rgba($black,.075) !default;\n$table-active-bg: $table-hover-bg !default;\n\n$table-border-width: $border-width !default;\n$table-border-color: $gray-200 !default;\n\n$table-head-bg: $gray-200 !default;\n$table-head-color: $gray-700 !default;\n\n$table-inverse-bg: $gray-900 !default;\n$table-inverse-accent-bg: rgba($white, .05) !default;\n$table-inverse-hover-bg: rgba($white, .075) !default;\n$table-inverse-border-color: lighten($gray-900, 7.5%) !default;\n$table-inverse-color: $body-bg !default;\n\n\n// Buttons\n//\n// For each of Bootstrap's buttons, define text, background and border color.\n\n$input-btn-padding-y: .5rem !default;\n$input-btn-padding-x: .75rem !default;\n$input-btn-line-height: 1.25 !default;\n\n$input-btn-padding-y-sm: .25rem !default;\n$input-btn-padding-x-sm: .5rem !default;\n$input-btn-line-height-sm: 1.5 !default;\n\n$input-btn-padding-y-lg: .5rem !default;\n$input-btn-padding-x-lg: 1rem !default;\n$input-btn-line-height-lg: 1.5 !default;\n\n$btn-font-weight: $font-weight-normal !default;\n$btn-box-shadow: inset 0 1px 0 rgba($white,.15), 0 1px 1px rgba($black,.075) !default;\n$btn-focus-box-shadow: 0 0 0 3px rgba(theme-color(\"primary\"), .25) !default;\n$btn-active-box-shadow: inset 0 3px 5px rgba($black,.125) !default;\n\n$btn-link-disabled-color: $gray-600 !default;\n\n$btn-block-spacing-y: .5rem !default;\n\n// Allows for customizing button radius independently from global border radius\n$btn-border-radius: $border-radius !default;\n$btn-border-radius-lg: $border-radius-lg !default;\n$btn-border-radius-sm: $border-radius-sm !default;\n\n$btn-transition: all .15s ease-in-out !default;\n\n\n// Forms\n\n$input-bg: $white !default;\n$input-disabled-bg: $gray-200 !default;\n\n$input-color: $gray-700 !default;\n$input-border-color: rgba($black,.15) !default;\n$input-btn-border-width: $border-width !default; // For form controls and buttons\n$input-box-shadow: inset 0 1px 1px rgba($black,.075) !default;\n\n$input-border-radius: $border-radius !default;\n$input-border-radius-lg: $border-radius-lg !default;\n$input-border-radius-sm: $border-radius-sm !default;\n\n$input-focus-bg: $input-bg !default;\n$input-focus-border-color: lighten(theme-color(\"primary\"), 25%) !default;\n$input-focus-box-shadow: $input-box-shadow, $btn-focus-box-shadow !default;\n$input-focus-color: $input-color !default;\n\n$input-placeholder-color: $gray-600 !default;\n\n$input-height-border: $input-btn-border-width * 2 !default;\n\n$input-height-inner: ($font-size-base * $input-btn-line-height) + ($input-btn-padding-y * 2) !default;\n$input-height: calc(#{$input-height-inner} + #{$input-height-border}) !default;\n\n$input-height-inner-sm: ($font-size-sm * $input-btn-line-height-sm) + ($input-btn-padding-y-sm * 2) !default;\n$input-height-sm: calc(#{$input-height-inner-sm} + #{$input-height-border}) !default;\n\n$input-height-inner-lg: ($font-size-sm * $input-btn-line-height-lg) + ($input-btn-padding-y-lg * 2) !default;\n$input-height-lg: calc(#{$input-height-inner-lg} + #{$input-height-border}) !default;\n\n$input-transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s !default;\n\n$form-text-margin-top: .25rem !default;\n\n$form-check-margin-bottom: .5rem !default;\n$form-check-input-gutter: 1.25rem !default;\n$form-check-input-margin-y: .25rem !default;\n$form-check-input-margin-x: .25rem !default;\n\n$form-check-inline-margin-x: .75rem !default;\n\n$form-group-margin-bottom: 1rem !default;\n\n$input-group-addon-bg: $gray-200 !default;\n$input-group-addon-border-color: $input-border-color !default;\n\n$custom-control-gutter: 1.5rem !default;\n$custom-control-spacer-y: .25rem !default;\n$custom-control-spacer-x: 1rem !default;\n\n$custom-control-indicator-size: 1rem !default;\n$custom-control-indicator-bg: #ddd !default;\n$custom-control-indicator-bg-size: 50% 50% !default;\n$custom-control-indicator-box-shadow: inset 0 .25rem .25rem rgba($black,.1) !default;\n\n$custom-control-indicator-disabled-bg: $gray-200 !default;\n$custom-control-description-disabled-color: $gray-600 !default;\n\n$custom-control-indicator-checked-color: $white !default;\n$custom-control-indicator-checked-bg: theme-color(\"primary\") !default;\n$custom-control-indicator-checked-box-shadow: none !default;\n\n$custom-control-indicator-focus-box-shadow: 0 0 0 1px $body-bg, 0 0 0 3px theme-color(\"primary\") !default;\n\n$custom-control-indicator-active-color: $white !default;\n$custom-control-indicator-active-bg: lighten(theme-color(\"primary\"), 35%) !default;\n$custom-control-indicator-active-box-shadow: none !default;\n\n$custom-checkbox-indicator-border-radius: $border-radius !default;\n$custom-checkbox-indicator-icon-checked: str-replace(url(\"data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3E%3Cpath fill='#{$custom-control-indicator-checked-color}' d='M6.564.75l-3.59 3.612-1.538-1.55L0 4.26 2.974 7.25 8 2.193z'/%3E%3C/svg%3E\"), \"#\", \"%23\") !default;\n\n$custom-checkbox-indicator-indeterminate-bg: theme-color(\"primary\") !default;\n$custom-checkbox-indicator-indeterminate-color: $custom-control-indicator-checked-color !default;\n$custom-checkbox-indicator-icon-indeterminate: str-replace(url(\"data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 4'%3E%3Cpath stroke='#{$custom-checkbox-indicator-indeterminate-color}' d='M0 2h4'/%3E%3C/svg%3E\"), \"#\", \"%23\") !default;\n$custom-checkbox-indicator-indeterminate-box-shadow: none !default;\n\n$custom-radio-indicator-border-radius: 50% !default;\n$custom-radio-indicator-icon-checked: str-replace(url(\"data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3E%3Ccircle r='3' fill='#{$custom-control-indicator-checked-color}'/%3E%3C/svg%3E\"), \"#\", \"%23\") !default;\n\n$custom-select-padding-y: .375rem !default;\n$custom-select-padding-x: .75rem !default;\n$custom-select-height: $input-height !default;\n$custom-select-indicator-padding: 1rem !default; // Extra padding to account for the presence of the background-image based indicator\n$custom-select-line-height: $input-btn-line-height !default;\n$custom-select-color: $input-color !default;\n$custom-select-disabled-color: $gray-600 !default;\n$custom-select-bg: $white !default;\n$custom-select-disabled-bg: $gray-200 !default;\n$custom-select-bg-size: 8px 10px !default; // In pixels because image dimensions\n$custom-select-indicator-color: #333 !default;\n$custom-select-indicator: str-replace(url(\"data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 5'%3E%3Cpath fill='#{$custom-select-indicator-color}' d='M2 0L0 2h4zm0 5L0 3h4z'/%3E%3C/svg%3E\"), \"#\", \"%23\") !default;\n$custom-select-border-width: $input-btn-border-width !default;\n$custom-select-border-color: $input-border-color !default;\n$custom-select-border-radius: $border-radius !default;\n\n$custom-select-focus-border-color: lighten(theme-color(\"primary\"), 25%) !default;\n$custom-select-focus-box-shadow: inset 0 1px 2px rgba($black, .075), 0 0 5px rgba($custom-select-focus-border-color, .5) !default;\n\n$custom-select-font-size-sm: 75% !default;\n$custom-select-height-sm: $input-height-sm !default;\n\n$custom-file-height: 2.5rem !default;\n$custom-file-width: 14rem !default;\n$custom-file-focus-box-shadow: 0 0 0 .075rem $white, 0 0 0 .2rem theme-color(\"primary\") !default;\n\n$custom-file-padding-y: 1rem !default;\n$custom-file-padding-x: .5rem !default;\n$custom-file-line-height: 1.5 !default;\n$custom-file-color: $gray-700 !default;\n$custom-file-bg: $white !default;\n$custom-file-border-width: $border-width !default;\n$custom-file-border-color: $input-border-color !default;\n$custom-file-border-radius: $border-radius !default;\n$custom-file-box-shadow: inset 0 .2rem .4rem rgba($black,.05) !default;\n$custom-file-button-color: $custom-file-color !default;\n$custom-file-button-bg: $gray-200 !default;\n$custom-file-text: (\n placeholder: (\n en: \"Choose file...\"\n ),\n button-label: (\n en: \"Browse\"\n )\n) !default;\n\n\n// Form validation\n$form-feedback-valid-color: theme-color(\"success\") !default;\n$form-feedback-invalid-color: theme-color(\"danger\") !default;\n\n\n// Dropdowns\n//\n// Dropdown menu container and contents.\n\n$dropdown-min-width: 10rem !default;\n$dropdown-padding-y: .5rem !default;\n$dropdown-spacer: .125rem !default;\n$dropdown-bg: $white !default;\n$dropdown-border-color: rgba($black,.15) !default;\n$dropdown-border-width: $border-width !default;\n$dropdown-divider-bg: $gray-200 !default;\n$dropdown-box-shadow: 0 .5rem 1rem rgba($black,.175) !default;\n\n$dropdown-link-color: $gray-900 !default;\n$dropdown-link-hover-color: darken($gray-900, 5%) !default;\n$dropdown-link-hover-bg: $gray-100 !default;\n\n$dropdown-link-active-color: $component-active-color !default;\n$dropdown-link-active-bg: $component-active-bg !default;\n\n$dropdown-link-disabled-color: $gray-600 !default;\n\n$dropdown-item-padding-y: .25rem !default;\n$dropdown-item-padding-x: 1.5rem !default;\n\n$dropdown-header-color: $gray-600 !default;\n\n\n// Z-index master list\n//\n// Warning: Avoid customizing these values. They're used for a bird's eye view\n// of components dependent on the z-axis and are designed to all work together.\n\n$zindex-dropdown: 1000 !default;\n$zindex-sticky: 1020 !default;\n$zindex-fixed: 1030 !default;\n$zindex-modal-backdrop: 1040 !default;\n$zindex-modal: 1050 !default;\n$zindex-popover: 1060 !default;\n$zindex-tooltip: 1070 !default;\n\n// Navs\n\n$nav-link-padding-y: .5rem !default;\n$nav-link-padding-x: 1rem !default;\n$nav-link-disabled-color: $gray-600 !default;\n\n$nav-tabs-border-color: #ddd !default;\n$nav-tabs-border-width: $border-width !default;\n$nav-tabs-border-radius: $border-radius !default;\n$nav-tabs-link-hover-border-color: $gray-200 !default;\n$nav-tabs-link-active-color: $gray-700 !default;\n$nav-tabs-link-active-bg: $body-bg !default;\n$nav-tabs-link-active-border-color: #ddd !default;\n\n$nav-pills-border-radius: $border-radius !default;\n$nav-pills-link-active-color: $component-active-color !default;\n$nav-pills-link-active-bg: $component-active-bg !default;\n\n// Navbar\n\n$navbar-padding-y: ($spacer / 2) !default;\n$navbar-padding-x: $spacer !default;\n\n$navbar-brand-font-size: $font-size-lg !default;\n// Compute the navbar-brand padding-y so the navbar-brand will have the same height as navbar-text and nav-link\n$nav-link-height: $navbar-brand-font-size * $line-height-base !default;\n$navbar-brand-height: ($font-size-base * $line-height-base + $nav-link-padding-y * 2) !default;\n$navbar-brand-padding-y: ($navbar-brand-height - $nav-link-height) / 2 !default;\n\n$navbar-toggler-padding-y: .25rem !default;\n$navbar-toggler-padding-x: .75rem !default;\n$navbar-toggler-font-size: $font-size-lg !default;\n$navbar-toggler-border-radius: $btn-border-radius !default;\n\n$navbar-dark-color: rgba($white,.5) !default;\n$navbar-dark-hover-color: rgba($white,.75) !default;\n$navbar-dark-active-color: rgba($white,1) !default;\n$navbar-dark-disabled-color: rgba($white,.25) !default;\n$navbar-dark-toggler-icon-bg: str-replace(url(\"data:image/svg+xml;charset=utf8,%3Csvg viewBox='0 0 30 30' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath stroke='#{$navbar-dark-color}' stroke-width='2' stroke-linecap='round' stroke-miterlimit='10' d='M4 7h22M4 15h22M4 23h22'/%3E%3C/svg%3E\"), \"#\", \"%23\") !default;\n$navbar-dark-toggler-border-color: rgba($white,.1) !default;\n\n$navbar-light-color: rgba($black,.5) !default;\n$navbar-light-hover-color: rgba($black,.7) !default;\n$navbar-light-active-color: rgba($black,.9) !default;\n$navbar-light-disabled-color: rgba($black,.3) !default;\n$navbar-light-toggler-icon-bg: str-replace(url(\"data:image/svg+xml;charset=utf8,%3Csvg viewBox='0 0 30 30' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath stroke='#{$navbar-light-color}' stroke-width='2' stroke-linecap='round' stroke-miterlimit='10' d='M4 7h22M4 15h22M4 23h22'/%3E%3C/svg%3E\"), \"#\", \"%23\") !default;\n$navbar-light-toggler-border-color: rgba($black,.1) !default;\n\n// Pagination\n\n$pagination-padding-y: .5rem !default;\n$pagination-padding-x: .75rem !default;\n$pagination-padding-y-sm: .25rem !default;\n$pagination-padding-x-sm: .5rem !default;\n$pagination-padding-y-lg: .75rem !default;\n$pagination-padding-x-lg: 1.5rem !default;\n$pagination-line-height: 1.25 !default;\n\n$pagination-color: $link-color !default;\n$pagination-bg: $white !default;\n$pagination-border-width: $border-width !default;\n$pagination-border-color: #ddd !default;\n\n$pagination-hover-color: $link-hover-color !default;\n$pagination-hover-bg: $gray-200 !default;\n$pagination-hover-border-color: #ddd !default;\n\n$pagination-active-color: $white !default;\n$pagination-active-bg: theme-color(\"primary\") !default;\n$pagination-active-border-color: theme-color(\"primary\") !default;\n\n$pagination-disabled-color: $gray-600 !default;\n$pagination-disabled-bg: $white !default;\n$pagination-disabled-border-color: #ddd !default;\n\n\n// Jumbotron\n\n$jumbotron-padding: 2rem !default;\n$jumbotron-bg: $gray-200 !default;\n\n\n// Cards\n\n$card-spacer-y: .75rem !default;\n$card-spacer-x: 1.25rem !default;\n$card-border-width: 1px !default;\n$card-border-radius: $border-radius !default;\n$card-border-color: rgba($black,.125) !default;\n$card-inner-border-radius: calc(#{$card-border-radius} - #{$card-border-width}) !default;\n$card-cap-bg: rgba($black, .03) !default;\n$card-bg: $white !default;\n\n$card-img-overlay-padding: 1.25rem !default;\n\n$card-deck-margin: ($grid-gutter-width / 2) !default;\n\n$card-columns-count: 3 !default;\n$card-columns-gap: 1.25rem !default;\n$card-columns-margin: $card-spacer-y !default;\n\n\n// Tooltips\n\n$tooltip-max-width: 200px !default;\n$tooltip-color: $white !default;\n$tooltip-bg: $black !default;\n$tooltip-opacity: .9 !default;\n$tooltip-padding-y: 3px !default;\n$tooltip-padding-x: 8px !default;\n$tooltip-margin: 0 !default;\n\n\n$tooltip-arrow-width: 5px !default;\n$tooltip-arrow-height: 5px !default;\n$tooltip-arrow-color: $tooltip-bg !default;\n\n\n// Popovers\n\n$popover-inner-padding: 1px !default;\n$popover-bg: $white !default;\n$popover-max-width: 276px !default;\n$popover-border-width: $border-width !default;\n$popover-border-color: rgba($black,.2) !default;\n$popover-box-shadow: 0 5px 10px rgba($black,.2) !default;\n\n$popover-header-bg: darken($popover-bg, 3%) !default;\n$popover-header-color: $headings-color !default;\n$popover-header-padding-y: 8px !default;\n$popover-header-padding-x: 14px !default;\n\n$popover-body-color: $body-color !default;\n$popover-body-padding-y: 9px !default;\n$popover-body-padding-x: 14px !default;\n\n$popover-arrow-width: 10px !default;\n$popover-arrow-height: 5px !default;\n$popover-arrow-color: $popover-bg !default;\n\n$popover-arrow-outer-width: ($popover-arrow-width + 1px) !default;\n$popover-arrow-outer-color: fade-in($popover-border-color, .05) !default;\n\n\n// Badges\n\n$badge-color: $white !default;\n$badge-font-size: 75% !default;\n$badge-font-weight: $font-weight-bold !default;\n$badge-padding-y: .25em !default;\n$badge-padding-x: .4em !default;\n\n$badge-pill-padding-x: .6em !default;\n// Use a higher than normal value to ensure completely rounded edges when\n// customizing padding or font-size on labels.\n$badge-pill-border-radius: 10rem !default;\n\n\n// Modals\n\n// Padding applied to the modal body\n$modal-inner-padding: 15px !default;\n\n$modal-dialog-margin: 10px !default;\n$modal-dialog-margin-y-sm-up: 30px !default;\n\n$modal-title-line-height: $line-height-base !default;\n\n$modal-content-bg: $white !default;\n$modal-content-border-color: rgba($black,.2) !default;\n$modal-content-border-width: $border-width !default;\n$modal-content-box-shadow-xs: 0 3px 9px rgba($black,.5) !default;\n$modal-content-box-shadow-sm-up: 0 5px 15px rgba($black,.5) !default;\n\n$modal-backdrop-bg: $black !default;\n$modal-backdrop-opacity: .5 !default;\n$modal-header-border-color: $gray-200 !default;\n$modal-footer-border-color: $modal-header-border-color !default;\n$modal-header-border-width: $modal-content-border-width !default;\n$modal-footer-border-width: $modal-header-border-width !default;\n$modal-header-padding: 15px !default;\n\n$modal-lg: 800px !default;\n$modal-md: 500px !default;\n$modal-sm: 300px !default;\n\n$modal-transition: transform .3s ease-out !default;\n\n\n// Alerts\n//\n// Define alert colors, border radius, and padding.\n\n$alert-padding-y: .75rem !default;\n$alert-padding-x: 1.25rem !default;\n$alert-margin-bottom: 1rem !default;\n$alert-border-radius: $border-radius !default;\n$alert-link-font-weight: $font-weight-bold !default;\n$alert-border-width: $border-width !default;\n\n\n// Progress bars\n\n$progress-height: 1rem !default;\n$progress-font-size: .75rem !default;\n$progress-bg: $gray-200 !default;\n$progress-border-radius: $border-radius !default;\n$progress-box-shadow: inset 0 .1rem .1rem rgba($black,.1) !default;\n$progress-bar-color: $white !default;\n$progress-bar-bg: theme-color(\"primary\") !default;\n$progress-bar-animation-timing: 1s linear infinite !default;\n$progress-bar-transition: width .6s ease !default;\n\n// List group\n\n$list-group-bg: $white !default;\n$list-group-border-color: rgba($black,.125) !default;\n$list-group-border-width: $border-width !default;\n$list-group-border-radius: $border-radius !default;\n\n$list-group-item-padding-y: .75rem !default;\n$list-group-item-padding-x: 1.25rem !default;\n\n$list-group-hover-bg: $gray-100 !default;\n$list-group-active-color: $component-active-color !default;\n$list-group-active-bg: $component-active-bg !default;\n$list-group-active-border-color: $list-group-active-bg !default;\n\n$list-group-disabled-color: $gray-600 !default;\n$list-group-disabled-bg: $list-group-bg !default;\n\n$list-group-action-color: $gray-700 !default;\n$list-group-action-hover-color: $list-group-action-color !default;\n\n$list-group-action-active-color: $body-color !default;\n$list-group-action-active-bg: $gray-200 !default;\n\n\n// Image thumbnails\n\n$thumbnail-padding: .25rem !default;\n$thumbnail-bg: $body-bg !default;\n$thumbnail-border-width: $border-width !default;\n$thumbnail-border-color: #ddd !default;\n$thumbnail-border-radius: $border-radius !default;\n$thumbnail-box-shadow: 0 1px 2px rgba($black,.075) !default;\n$thumbnail-transition: all .2s ease-in-out !default;\n\n\n// Figures\n\n$figure-caption-font-size: 90% !default;\n$figure-caption-color: $gray-600 !default;\n\n\n// Breadcrumbs\n\n$breadcrumb-padding-y: .75rem !default;\n$breadcrumb-padding-x: 1rem !default;\n$breadcrumb-item-padding: .5rem !default;\n\n$breadcrumb-bg: $gray-200 !default;\n$breadcrumb-divider-color: $gray-600 !default;\n$breadcrumb-active-color: $gray-600 !default;\n$breadcrumb-divider: \"/\" !default;\n\n\n// Carousel\n\n$carousel-control-color: $white !default;\n$carousel-control-width: 15% !default;\n$carousel-control-opacity: .5 !default;\n\n$carousel-indicator-width: 30px !default;\n$carousel-indicator-height: 3px !default;\n$carousel-indicator-spacer: 3px !default;\n$carousel-indicator-active-bg: $white !default;\n\n$carousel-caption-width: 70% !default;\n$carousel-caption-color: $white !default;\n\n$carousel-control-icon-width: 20px !default;\n\n$carousel-control-prev-icon-bg: str-replace(url(\"data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='#{$carousel-control-color}' viewBox='0 0 8 8'%3E%3Cpath d='M4 0l-4 4 4 4 1.5-1.5-2.5-2.5 2.5-2.5-1.5-1.5z'/%3E%3C/svg%3E\"), \"#\", \"%23\") !default;\n$carousel-control-next-icon-bg: str-replace(url(\"data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='#{$carousel-control-color}' viewBox='0 0 8 8'%3E%3Cpath d='M1.5 0l-1.5 1.5 2.5 2.5-2.5 2.5 1.5 1.5 4-4-4-4z'/%3E%3C/svg%3E\"), \"#\", \"%23\") !default;\n\n$carousel-transition: transform .6s ease !default;\n\n\n// Close\n\n$close-font-size: $font-size-base * 1.5 !default;\n$close-font-weight: $font-weight-bold !default;\n$close-color: $black !default;\n$close-text-shadow: 0 1px 0 $white !default;\n\n// Code\n\n$code-font-size: 90% !default;\n$code-padding-y: .2rem !default;\n$code-padding-x: .4rem !default;\n$code-color: #bd4147 !default;\n$code-bg: $gray-100 !default;\n\n$kbd-color: $white !default;\n$kbd-bg: $gray-900 !default;\n\n$pre-color: $gray-900 !default;\n$pre-scrollable-max-height: 340px !default;\n","@mixin hover {\n // TODO: re-enable along with mq4-hover-shim\n// @if $enable-hover-media-query {\n// // See Media Queries Level 4: https://drafts.csswg.org/mediaqueries/#hover\n// // Currently shimmed by https://github.com/twbs/mq4-hover-shim\n// @media (hover: hover) {\n// &:hover { @content }\n// }\n// }\n// @else {\n// scss-lint:disable Indentation\n &:hover { @content }\n// scss-lint:enable Indentation\n// }\n}\n\n\n@mixin hover-focus {\n @if $enable-hover-media-query {\n &:focus { @content }\n @include hover { @content }\n } @else {\n &:focus,\n &:hover {\n @content\n }\n }\n}\n\n@mixin plain-hover-focus {\n @if $enable-hover-media-query {\n &,\n &:focus {\n @content\n }\n @include hover { @content }\n } @else {\n &,\n &:focus,\n &:hover {\n @content\n }\n }\n}\n\n@mixin hover-focus-active {\n @if $enable-hover-media-query {\n &:focus,\n &:active {\n @content\n }\n @include hover { @content }\n } @else {\n &:focus,\n &:active,\n &:hover {\n @content\n }\n }\n}\n"]} \ No newline at end of file
diff --git a/library/bootstrap/css/bootstrap-reboot.min.css b/library/bootstrap/css/bootstrap-reboot.min.css
index c005c9830..4ee4a4069 100644
--- a/library/bootstrap/css/bootstrap-reboot.min.css
+++ b/library/bootstrap/css/bootstrap-reboot.min.css
@@ -1 +1,2 @@
-html{-webkit-box-sizing:border-box;box-sizing:border-box;font-family:sans-serif;line-height:1.15;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%;-ms-overflow-style:scrollbar;-webkit-tap-highlight-color:transparent}*,::after,::before{-webkit-box-sizing:inherit;box-sizing:inherit}@-ms-viewport{width:device-width}body{margin:0;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif;font-size:1rem;font-weight:400;line-height:1.5;color:#292b2c;background-color:#fff}[tabindex="-1"]:focus{outline:0!important}hr{-webkit-box-sizing:content-box;box-sizing:content-box;height:0;overflow:visible}h1,h2,h3,h4,h5,h6{margin-top:0;margin-bottom:.5rem}p{margin-top:0;margin-bottom:1rem}abbr[data-original-title],abbr[title]{text-decoration:underline;text-decoration:underline dotted;cursor:help;border-bottom:0}address{margin-bottom:1rem;font-style:normal;line-height:inherit}dl,ol,ul{margin-top:0;margin-bottom:1rem}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}dt{font-weight:700}dd{margin-bottom:.5rem;margin-left:0}blockquote{margin:0 0 1rem}dfn{font-style:italic}b,strong{font-weight:bolder}small{font-size:80%}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}a{color:#0275d8;text-decoration:none;background-color:transparent;-webkit-text-decoration-skip:objects}a:hover{color:#014c8c;text-decoration:underline}a:not([href]):not([tabindex]){color:inherit;text-decoration:none}a:not([href]):not([tabindex]):focus,a:not([href]):not([tabindex]):hover{color:inherit;text-decoration:none}a:not([href]):not([tabindex]):focus{outline:0}code,kbd,pre,samp{font-family:monospace,monospace;font-size:1em}pre{margin-top:0;margin-bottom:1rem;overflow:auto}figure{margin:0 0 1rem}img{vertical-align:middle;border-style:none}svg:not(:root){overflow:hidden}[role=button],a,area,button,input,label,select,summary,textarea{-ms-touch-action:manipulation;touch-action:manipulation}table{border-collapse:collapse}caption{padding-top:.75rem;padding-bottom:.75rem;color:#636c72;text-align:left;caption-side:bottom}th{text-align:left}label{display:inline-block;margin-bottom:.5rem}button:focus{outline:1px dotted;outline:5px auto -webkit-focus-ring-color}button,input,optgroup,select,textarea{margin:0;font-family:inherit;font-size:inherit;line-height:inherit}button,input{overflow:visible}button,select{text-transform:none}[type=reset],[type=submit],button,html [type=button]{-webkit-appearance:button}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{padding:0;border-style:none}input[type=checkbox],input[type=radio]{-webkit-box-sizing:border-box;box-sizing:border-box;padding:0}input[type=date],input[type=datetime-local],input[type=month],input[type=time]{-webkit-appearance:listbox}textarea{overflow:auto;resize:vertical}fieldset{min-width:0;padding:0;margin:0;border:0}legend{display:block;width:100%;max-width:100%;padding:0;margin-bottom:.5rem;font-size:1.5rem;line-height:inherit;color:inherit;white-space:normal}progress{vertical-align:baseline}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{outline-offset:-2px;-webkit-appearance:none}[type=search]::-webkit-search-cancel-button,[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{font:inherit;-webkit-appearance:button}output{display:inline-block}summary{display:list-item}template{display:none}[hidden]{display:none!important}/*# sourceMappingURL=bootstrap-reboot.min.css.map */ \ No newline at end of file
+html{box-sizing:border-box;font-family:sans-serif;line-height:1.15;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%;-ms-overflow-style:scrollbar;-webkit-tap-highlight-color:transparent}*,::after,::before{box-sizing:inherit}@-ms-viewport{width:device-width}article,aside,dialog,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}body{margin:0;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif;font-size:1rem;font-weight:400;line-height:1.5;color:#212529;background-color:#fff}[tabindex="-1"]:focus{outline:0!important}hr{box-sizing:content-box;height:0;overflow:visible}h1,h2,h3,h4,h5,h6{margin-top:0;margin-bottom:.5rem}p{margin-top:0;margin-bottom:1rem}abbr[data-original-title],abbr[title]{text-decoration:underline;-webkit-text-decoration:underline dotted;text-decoration:underline dotted;cursor:help;border-bottom:0}address{margin-bottom:1rem;font-style:normal;line-height:inherit}dl,ol,ul{margin-top:0;margin-bottom:1rem}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}dt{font-weight:700}dd{margin-bottom:.5rem;margin-left:0}blockquote{margin:0 0 1rem}dfn{font-style:italic}b,strong{font-weight:bolder}small{font-size:80%}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}a{color:#007bff;text-decoration:none;background-color:transparent;-webkit-text-decoration-skip:objects}a:hover{color:#0056b3;text-decoration:underline}a:not([href]):not([tabindex]){color:inherit;text-decoration:none}a:not([href]):not([tabindex]):focus,a:not([href]):not([tabindex]):hover{color:inherit;text-decoration:none}a:not([href]):not([tabindex]):focus{outline:0}code,kbd,pre,samp{font-family:monospace,monospace;font-size:1em}pre{margin-top:0;margin-bottom:1rem;overflow:auto}figure{margin:0 0 1rem}img{vertical-align:middle;border-style:none}svg:not(:root){overflow:hidden}[role=button],a,area,button,input,label,select,summary,textarea{-ms-touch-action:manipulation;touch-action:manipulation}table{border-collapse:collapse}caption{padding-top:.75rem;padding-bottom:.75rem;color:#868e96;text-align:left;caption-side:bottom}th{text-align:left}label{display:inline-block;margin-bottom:.5rem}button:focus{outline:1px dotted;outline:5px auto -webkit-focus-ring-color}button,input,optgroup,select,textarea{margin:0;font-family:inherit;font-size:inherit;line-height:inherit}button,input{overflow:visible}button,select{text-transform:none}[type=reset],[type=submit],button,html [type=button]{-webkit-appearance:button}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{padding:0;border-style:none}input[type=checkbox],input[type=radio]{box-sizing:border-box;padding:0}input[type=date],input[type=datetime-local],input[type=month],input[type=time]{-webkit-appearance:listbox}textarea{overflow:auto;resize:vertical}fieldset{min-width:0;padding:0;margin:0;border:0}legend{display:block;width:100%;max-width:100%;padding:0;margin-bottom:.5rem;font-size:1.5rem;line-height:inherit;color:inherit;white-space:normal}progress{vertical-align:baseline}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{outline-offset:-2px;-webkit-appearance:none}[type=search]::-webkit-search-cancel-button,[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{font:inherit;-webkit-appearance:button}output{display:inline-block}summary{display:list-item}template{display:none}[hidden]{display:none!important}
+/*# sourceMappingURL=bootstrap-reboot.min.css.map */ \ No newline at end of file
diff --git a/library/bootstrap/css/bootstrap-reboot.min.css.map b/library/bootstrap/css/bootstrap-reboot.min.css.map
index e4cb7b222..d461cb58f 100644
--- a/library/bootstrap/css/bootstrap-reboot.min.css.map
+++ b/library/bootstrap/css/bootstrap-reboot.min.css.map
@@ -1 +1 @@
-{"version":3,"sources":["../../scss/_reboot.scss","dist/css/bootstrap-reboot.css","bootstrap-reboot.css","../../scss/mixins/_hover.scss"],"names":[],"mappings":"AAoBA,KACE,mBAAA,WAAA,WAAA,WACA,YAAA,WACA,YAAA,KACA,yBAAA,KACA,qBAAA,KACA,mBAAA,UACA,4BAAA,YAGF,ECjBA,QADA,SDqBE,mBAAA,QAAA,WAAA,QAKA,cAAgB,MAAA,aASlB,KACE,OAAA,EACA,YAAA,aAAA,CAAA,kBAAA,CAAA,UAAA,CAAA,MAAA,CAAA,gBAAA,CAAA,KAAA,CAAA,WACA,UAAA,KACA,YAAA,IACA,YAAA,IACA,MAAA,QACA,iBAAA,KExBF,sBFiCE,QAAA,YASF,GACE,mBAAA,YAAA,WAAA,YACA,OAAA,EACA,SAAA,QAYF,GAAA,GAAA,GAAA,GAAA,GAAA,GACE,WAAA,EACA,cAAA,MAOF,EACE,WAAA,EACA,cAAA,KC5CF,0BDsDA,YAEE,gBAAA,UACA,gBAAA,UAAA,OACA,OAAA,KACA,cAAA,EAGF,QACE,cAAA,KACA,WAAA,OACA,YAAA,QClDF,GDqDA,GCtDA,GDyDE,WAAA,EACA,cAAA,KAGF,MCrDA,MACA,MAFA,MD0DE,cAAA,EAGF,GACE,YAAA,IAGF,GACE,cAAA,MACA,YAAA,EAGF,WACE,OAAA,EAAA,EAAA,KAGF,IACE,WAAA,OAGF,ECtDA,ODwDE,YAAA,OAGF,MACE,UAAA,IAQF,IC3DA,ID6DE,SAAA,SACA,UAAA,IACA,YAAA,EACA,eAAA,SAGF,IAAM,OAAA,OACN,IAAM,IAAA,MAON,EACE,MAAA,QACA,gBAAA,KACA,iBAAA,YACA,6BAAA,QGhLE,QHmLA,MAAA,QACA,gBAAA,UAUJ,8BACE,MAAA,QACA,gBAAA,KGrLE,oCAAA,oCHwLA,MAAA,QACA,gBAAA,KANJ,oCAUI,QAAA,EC7DJ,KACA,IDqEA,ICpEA,KDwEE,YAAA,SAAA,CAAA,UACA,UAAA,IAGF,IAEE,WAAA,EAEA,cAAA,KAEA,SAAA,KAQF,OAEE,OAAA,EAAA,EAAA,KAQF,IACE,eAAA,OACA,aAAA,KAGF,eACE,SAAA,OC/EF,cD6FA,EC/FA,KACA,OAEA,MACA,MACA,OACA,QACA,SDiGE,iBAAA,aAAA,aAAA,aAQF,MACE,gBAAA,SAGF,QACE,YAAA,OACA,eAAA,OACA,MAAA,QACA,WAAA,KACA,aAAA,OAGF,GAEE,WAAA,KAQF,MAEE,QAAA,aACA,cAAA,MAOF,aACE,QAAA,IAAA,OACA,QAAA,IAAA,KAAA,yBC3GF,OD8GA,MC5GA,SADA,OAEA,SDgHE,OAAA,EACA,YAAA,QACA,UAAA,QACA,YAAA,QAGF,OC9GA,MDgHE,SAAA,QAGF,OC9GA,ODgHE,eAAA,KC1GF,aACA,cD+GA,OCjHA,mBDqHE,mBAAA,OC9GF,gCACA,+BACA,gCDgHA,yBAIE,QAAA,EACA,aAAA,KC/GF,qBDkHA,kBAEE,mBAAA,WAAA,WAAA,WACA,QAAA,EAIF,iBCjHA,2BACA,kBAFA,iBD2HE,mBAAA,QAGF,SACE,SAAA,KAEA,OAAA,SAGF,SAME,UAAA,EAEA,QAAA,EACA,OAAA,EACA,OAAA,EAKF,OACE,QAAA,MACA,MAAA,KACA,UAAA,KACA,QAAA,EACA,cAAA,MACA,UAAA,OACA,YAAA,QACA,MAAA,QACA,YAAA,OAGF,SACE,eAAA,SEnIF,yCDMA,yCDmIE,OAAA,KEpIF,cF4IE,eAAA,KACA,mBAAA,KExIF,4CDMA,yCD2IE,mBAAA,KAQF,6BACE,KAAA,QACA,mBAAA,OAOF,OACE,QAAA,aAGF,QACE,QAAA,UAGF,SACE,QAAA,KErJF,SF2JE,QAAA"} \ No newline at end of file
+{"version":3,"sources":["../../scss/_reboot.scss","dist/css/bootstrap-reboot.css","bootstrap-reboot.css","../../scss/mixins/_hover.scss"],"names":[],"mappings":"AAoBA,KACE,WAAA,WACA,YAAA,WACA,YAAA,KACA,yBAAA,KACA,qBAAA,KACA,mBAAA,UACA,4BAAA,YAGF,EClBA,QADA,SDsBE,WAAA,QAKA,cAAgB,MAAA,aAIlB,QAAA,MAAA,OAAA,WAAA,OAAA,OAAA,OAAA,OAAA,KAAA,IAAA,QACE,QAAA,MAQF,KACE,OAAA,EACA,YAAA,aAAA,CAAA,kBAAA,CAAA,UAAA,CAAA,MAAA,CAAA,gBAAA,CAAA,KAAA,CAAA,WACA,UAAA,KACA,YAAA,IACA,YAAA,IACA,MAAA,QACA,iBAAA,KExBF,sBFiCE,QAAA,YASF,GACE,WAAA,YACA,OAAA,EACA,SAAA,QAYF,GAAA,GAAA,GAAA,GAAA,GAAA,GACE,WAAA,EACA,cAAA,MAOF,EACE,WAAA,EACA,cAAA,KC/CF,0BDyDA,YAEE,gBAAA,UACA,wBAAA,UAAA,OAAA,gBAAA,UAAA,OACA,OAAA,KACA,cAAA,EAGF,QACE,cAAA,KACA,WAAA,OACA,YAAA,QCpDF,GDuDA,GCxDA,GD2DE,WAAA,EACA,cAAA,KAGF,MCvDA,MACA,MAFA,MD4DE,cAAA,EAGF,GACE,YAAA,IAGF,GACE,cAAA,MACA,YAAA,EAGF,WACE,OAAA,EAAA,EAAA,KAGF,IACE,WAAA,OAGF,ECxDA,OD0DE,YAAA,OAGF,MACE,UAAA,IAQF,IC7DA,ID+DE,SAAA,SACA,UAAA,IACA,YAAA,EACA,eAAA,SAGF,IAAM,OAAA,OACN,IAAM,IAAA,MAON,EACE,MAAA,QACA,gBAAA,KACA,iBAAA,YACA,6BAAA,QGpLE,QHuLA,MAAA,QACA,gBAAA,UAUJ,8BACE,MAAA,QACA,gBAAA,KGzLE,oCAAA,oCH4LA,MAAA,QACA,gBAAA,KANJ,oCAUI,QAAA,EC/DJ,KACA,IDuEA,ICtEA,KD0EE,YAAA,SAAA,CAAA,UACA,UAAA,IAGF,IAEE,WAAA,EAEA,cAAA,KAEA,SAAA,KAQF,OAEE,OAAA,EAAA,EAAA,KAQF,IACE,eAAA,OACA,aAAA,KAGF,eACE,SAAA,OCjFF,cD+FA,ECjGA,KACA,OAEA,MACA,MACA,OACA,QACA,SDmGE,iBAAA,aAAA,aAAA,aAQF,MACE,gBAAA,SAGF,QACE,YAAA,OACA,eAAA,OACA,MAAA,QACA,WAAA,KACA,aAAA,OAGF,GAEE,WAAA,KAQF,MAEE,QAAA,aACA,cAAA,MAOF,aACE,QAAA,IAAA,OACA,QAAA,IAAA,KAAA,yBC7GF,ODgHA,MC9GA,SADA,OAEA,SDkHE,OAAA,EACA,YAAA,QACA,UAAA,QACA,YAAA,QAGF,OChHA,MDkHE,SAAA,QAGF,OChHA,ODkHE,eAAA,KC5GF,aACA,cDiHA,OCnHA,mBDuHE,mBAAA,OChHF,gCACA,+BACA,gCDkHA,yBAIE,QAAA,EACA,aAAA,KCjHF,qBDoHA,kBAEE,WAAA,WACA,QAAA,EAIF,iBCpHA,2BACA,kBAFA,iBD8HE,mBAAA,QAGF,SACE,SAAA,KAEA,OAAA,SAGF,SAME,UAAA,EAEA,QAAA,EACA,OAAA,EACA,OAAA,EAKF,OACE,QAAA,MACA,MAAA,KACA,UAAA,KACA,QAAA,EACA,cAAA,MACA,UAAA,OACA,YAAA,QACA,MAAA,QACA,YAAA,OAGF,SACE,eAAA,SEnIF,yCDGA,yCDsIE,OAAA,KEpIF,cF4IE,eAAA,KACA,mBAAA,KExIF,4CDGA,yCD8IE,mBAAA,KAQF,6BACE,KAAA,QACA,mBAAA,OAOF,OACE,QAAA,aAGF,QACE,QAAA,UAGF,SACE,QAAA,KErJF,SF2JE,QAAA","sourcesContent":["// scss-lint:disable QualifyingElement, DuplicateProperty, VendorPrefix\n\n// Reboot\n//\n// Normalization of HTML elements, manually forked from Normalize.css to remove\n// styles targeting irrelevant browsers while applying new styles.\n//\n// Normalize is licensed MIT. https://github.com/necolas/normalize.css\n\n\n// Document\n//\n// 1. Change from `box-sizing: content-box` so that `width` is not affected by `padding` or `border`.\n// 2. Change the default font family in all browsers.\n// 3. Correct the line height in all browsers.\n// 4. Prevent adjustments of font size after orientation changes in IE on Windows Phone and in iOS.\n// 5. Setting @viewport causes scrollbars to overlap content in IE11 and Edge, so\n// we force a non-overlapping, non-auto-hiding scrollbar to counteract.\n// 6. Change the default tap highlight to be completely transparent in iOS.\n\nhtml {\n box-sizing: border-box; // 1\n font-family: sans-serif; // 2\n line-height: 1.15; // 3\n -webkit-text-size-adjust: 100%; // 4\n -ms-text-size-adjust: 100%; // 4\n -ms-overflow-style: scrollbar; // 5\n -webkit-tap-highlight-color: rgba(0,0,0,0); // 6\n}\n\n*,\n*::before,\n*::after {\n box-sizing: inherit; // 1\n}\n\n// IE10+ doesn't honor `<meta name=\"viewport\">` in some cases.\n@at-root {\n @-ms-viewport { width: device-width; }\n}\n\n// Shim for \"new\" HTML5 structural elements to display correctly (IE10, older browsers)\narticle, aside, dialog, figcaption, figure, footer, header, hgroup, main, nav, section {\n display: block;\n}\n\n// Body\n//\n// 1. Remove the margin in all browsers.\n// 2. As a best practice, apply a default `background-color`.\n\nbody {\n margin: 0; // 1\n font-family: $font-family-base;\n font-size: $font-size-base;\n font-weight: $font-weight-base;\n line-height: $line-height-base;\n color: $body-color;\n background-color: $body-bg; // 2\n}\n\n// Suppress the focus outline on elements that cannot be accessed via keyboard.\n// This prevents an unwanted focus outline from appearing around elements that\n// might still respond to pointer events.\n//\n// Credit: https://github.com/suitcss/base\n[tabindex=\"-1\"]:focus {\n outline: none !important;\n}\n\n\n// Content grouping\n//\n// 1. Add the correct box sizing in Firefox.\n// 2. Show the overflow in Edge and IE.\n\nhr {\n box-sizing: content-box; // 1\n height: 0; // 1\n overflow: visible; // 2\n}\n\n\n//\n// Typography\n//\n\n// Remove top margins from headings\n//\n// By default, `<h1>`-`<h6>` all receive top and bottom margins. We nuke the top\n// margin for easier control within type scales as it avoids margin collapsing.\nh1, h2, h3, h4, h5, h6 {\n margin-top: 0;\n margin-bottom: .5rem;\n}\n\n// Reset margins on paragraphs\n//\n// Similarly, the top margin on `<p>`s get reset. However, we also reset the\n// bottom margin to use `rem` units instead of `em`.\np {\n margin-top: 0;\n margin-bottom: 1rem;\n}\n\n// Abbreviations\n//\n// 1. Remove the bottom border in Firefox 39-.\n// 2. Add the correct text decoration in Chrome, Edge, IE, Opera, and Safari.\n// 3. Add explicit cursor to indicate changed behavior.\n// 4. Duplicate behavior to the data-* attribute for our tooltip plugin\n\nabbr[title],\nabbr[data-original-title] { // 4\n text-decoration: underline; // 2\n text-decoration: underline dotted; // 2\n cursor: help; // 3\n border-bottom: 0; // 1\n}\n\naddress {\n margin-bottom: 1rem;\n font-style: normal;\n line-height: inherit;\n}\n\nol,\nul,\ndl {\n margin-top: 0;\n margin-bottom: 1rem;\n}\n\nol ol,\nul ul,\nol ul,\nul ol {\n margin-bottom: 0;\n}\n\ndt {\n font-weight: $dt-font-weight;\n}\n\ndd {\n margin-bottom: .5rem;\n margin-left: 0; // Undo browser default\n}\n\nblockquote {\n margin: 0 0 1rem;\n}\n\ndfn {\n font-style: italic; // Add the correct font style in Android 4.3-\n}\n\nb,\nstrong {\n font-weight: bolder; // Add the correct font weight in Chrome, Edge, and Safari\n}\n\nsmall {\n font-size: 80%; // Add the correct font size in all browsers\n}\n\n//\n// Prevent `sub` and `sup` elements from affecting the line height in\n// all browsers.\n//\n\nsub,\nsup {\n position: relative;\n font-size: 75%;\n line-height: 0;\n vertical-align: baseline;\n}\n\nsub { bottom: -.25em; }\nsup { top: -.5em; }\n\n\n//\n// Links\n//\n\na {\n color: $link-color;\n text-decoration: $link-decoration;\n background-color: transparent; // Remove the gray background on active links in IE 10.\n -webkit-text-decoration-skip: objects; // Remove gaps in links underline in iOS 8+ and Safari 8+.\n\n @include hover {\n color: $link-hover-color;\n text-decoration: $link-hover-decoration;\n }\n}\n\n// And undo these styles for placeholder links/named anchors (without href)\n// which have not been made explicitly keyboard-focusable (without tabindex).\n// It would be more straightforward to just use a[href] in previous block, but that\n// causes specificity issues in many other styles that are too complex to fix.\n// See https://github.com/twbs/bootstrap/issues/19402\n\na:not([href]):not([tabindex]) {\n color: inherit;\n text-decoration: none;\n\n @include hover-focus {\n color: inherit;\n text-decoration: none;\n }\n\n &:focus {\n outline: 0;\n }\n}\n\n\n//\n// Code\n//\n\npre,\ncode,\nkbd,\nsamp {\n font-family: monospace, monospace; // Correct the inheritance and scaling of font size in all browsers.\n font-size: 1em; // Correct the odd `em` font sizing in all browsers.\n}\n\npre {\n // Remove browser default top margin\n margin-top: 0;\n // Reset browser default of `1em` to use `rem`s\n margin-bottom: 1rem;\n // Don't allow content to break outside\n overflow: auto;\n}\n\n\n//\n// Figures\n//\n\nfigure {\n // Apply a consistent margin strategy (matches our type styles).\n margin: 0 0 1rem;\n}\n\n\n//\n// Images and content\n//\n\nimg {\n vertical-align: middle;\n border-style: none; // Remove the border on images inside links in IE 10-.\n}\n\nsvg:not(:root) {\n overflow: hidden; // Hide the overflow in IE\n}\n\n\n// Avoid 300ms click delay on touch devices that support the `touch-action` CSS property.\n//\n// In particular, unlike most other browsers, IE11+Edge on Windows 10 on touch devices and IE Mobile 10-11\n// DON'T remove the click delay when `<meta name=\"viewport\" content=\"width=device-width\">` is present.\n// However, they DO support removing the click delay via `touch-action: manipulation`.\n// See:\n// * https://v4-alpha.getbootstrap.com/content/reboot/#click-delay-optimization-for-touch\n// * http://caniuse.com/#feat=css-touch-action\n// * https://patrickhlauke.github.io/touch/tests/results/#suppressing-300ms-delay\n\na,\narea,\nbutton,\n[role=\"button\"],\ninput,\nlabel,\nselect,\nsummary,\ntextarea {\n touch-action: manipulation;\n}\n\n\n//\n// Tables\n//\n\ntable {\n border-collapse: collapse; // Prevent double borders\n}\n\ncaption {\n padding-top: $table-cell-padding;\n padding-bottom: $table-cell-padding;\n color: $text-muted;\n text-align: left;\n caption-side: bottom;\n}\n\nth {\n // Matches default `<td>` alignment\n text-align: left;\n}\n\n\n//\n// Forms\n//\n\nlabel {\n // Allow labels to use `margin` for spacing.\n display: inline-block;\n margin-bottom: .5rem;\n}\n\n// Work around a Firefox/IE bug where the transparent `button` background\n// results in a loss of the default `button` focus styles.\n//\n// Credit: https://github.com/suitcss/base/\nbutton:focus {\n outline: 1px dotted;\n outline: 5px auto -webkit-focus-ring-color;\n}\n\ninput,\nbutton,\nselect,\noptgroup,\ntextarea {\n margin: 0; // Remove the margin in Firefox and Safari\n font-family: inherit;\n font-size: inherit;\n line-height: inherit;\n}\n\nbutton,\ninput {\n overflow: visible; // Show the overflow in Edge\n}\n\nbutton,\nselect {\n text-transform: none; // Remove the inheritance of text transform in Firefox\n}\n\n// 1. Prevent a WebKit bug where (2) destroys native `audio` and `video`\n// controls in Android 4.\n// 2. Correct the inability to style clickable types in iOS and Safari.\nbutton,\nhtml [type=\"button\"], // 1\n[type=\"reset\"],\n[type=\"submit\"] {\n -webkit-appearance: button; // 2\n}\n\n// Remove inner border and padding from Firefox, but don't restore the outline like Normalize.\nbutton::-moz-focus-inner,\n[type=\"button\"]::-moz-focus-inner,\n[type=\"reset\"]::-moz-focus-inner,\n[type=\"submit\"]::-moz-focus-inner {\n padding: 0;\n border-style: none;\n}\n\ninput[type=\"radio\"],\ninput[type=\"checkbox\"] {\n box-sizing: border-box; // 1. Add the correct box sizing in IE 10-\n padding: 0; // 2. Remove the padding in IE 10-\n}\n\n\ninput[type=\"date\"],\ninput[type=\"time\"],\ninput[type=\"datetime-local\"],\ninput[type=\"month\"] {\n // Remove the default appearance of temporal inputs to avoid a Mobile Safari\n // bug where setting a custom line-height prevents text from being vertically\n // centered within the input.\n // See https://bugs.webkit.org/show_bug.cgi?id=139848\n // and https://github.com/twbs/bootstrap/issues/11266\n -webkit-appearance: listbox;\n}\n\ntextarea {\n overflow: auto; // Remove the default vertical scrollbar in IE.\n // Textareas should really only resize vertically so they don't break their (horizontal) containers.\n resize: vertical;\n}\n\nfieldset {\n // Browsers set a default `min-width: min-content;` on fieldsets,\n // unlike e.g. `<div>`s, which have `min-width: 0;` by default.\n // So we reset that to ensure fieldsets behave more like a standard block element.\n // See https://github.com/twbs/bootstrap/issues/12359\n // and https://html.spec.whatwg.org/multipage/#the-fieldset-and-legend-elements\n min-width: 0;\n // Reset the default outline behavior of fieldsets so they don't affect page layout.\n padding: 0;\n margin: 0;\n border: 0;\n}\n\n// 1. Correct the text wrapping in Edge and IE.\n// 2. Correct the color inheritance from `fieldset` elements in IE.\nlegend {\n display: block;\n width: 100%;\n max-width: 100%; // 1\n padding: 0;\n margin-bottom: .5rem;\n font-size: 1.5rem;\n line-height: inherit;\n color: inherit; // 2\n white-space: normal; // 1\n}\n\nprogress {\n vertical-align: baseline; // Add the correct vertical alignment in Chrome, Firefox, and Opera.\n}\n\n// Correct the cursor style of increment and decrement buttons in Chrome.\n[type=\"number\"]::-webkit-inner-spin-button,\n[type=\"number\"]::-webkit-outer-spin-button {\n height: auto;\n}\n\n[type=\"search\"] {\n // This overrides the extra rounded corners on search inputs in iOS so that our\n // `.form-control` class can properly style them. Note that this cannot simply\n // be added to `.form-control` as it's not specific enough. For details, see\n // https://github.com/twbs/bootstrap/issues/11586.\n outline-offset: -2px; // 2. Correct the outline style in Safari.\n -webkit-appearance: none;\n}\n\n//\n// Remove the inner padding and cancel buttons in Chrome and Safari on macOS.\n//\n\n[type=\"search\"]::-webkit-search-cancel-button,\n[type=\"search\"]::-webkit-search-decoration {\n -webkit-appearance: none;\n}\n\n//\n// 1. Correct the inability to style clickable types in iOS and Safari.\n// 2. Change font properties to `inherit` in Safari.\n//\n\n::-webkit-file-upload-button {\n font: inherit; // 2\n -webkit-appearance: button; // 1\n}\n\n//\n// Correct element displays\n//\n\noutput {\n display: inline-block;\n}\n\nsummary {\n display: list-item; // Add the correct display in all browsers\n}\n\ntemplate {\n display: none; // Add the correct display in IE\n}\n\n// Always hide an element with the `hidden` HTML attribute (from PureCSS).\n// Needed for proper display in IE 10-.\n[hidden] {\n display: none !important;\n}\n","html {\n box-sizing: border-box;\n font-family: sans-serif;\n line-height: 1.15;\n -webkit-text-size-adjust: 100%;\n -ms-text-size-adjust: 100%;\n -ms-overflow-style: scrollbar;\n -webkit-tap-highlight-color: transparent;\n}\n\n*,\n*::before,\n*::after {\n box-sizing: inherit;\n}\n\n@-ms-viewport {\n width: device-width;\n}\n\narticle, aside, dialog, figcaption, figure, footer, header, hgroup, main, nav, section {\n display: block;\n}\n\nbody {\n margin: 0;\n font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, \"Helvetica Neue\", Arial, sans-serif;\n font-size: 1rem;\n font-weight: normal;\n line-height: 1.5;\n color: #212529;\n background-color: #fff;\n}\n\n[tabindex=\"-1\"]:focus {\n outline: none !important;\n}\n\nhr {\n box-sizing: content-box;\n height: 0;\n overflow: visible;\n}\n\nh1, h2, h3, h4, h5, h6 {\n margin-top: 0;\n margin-bottom: .5rem;\n}\n\np {\n margin-top: 0;\n margin-bottom: 1rem;\n}\n\nabbr[title],\nabbr[data-original-title] {\n text-decoration: underline;\n -webkit-text-decoration: underline dotted;\n text-decoration: underline dotted;\n cursor: help;\n border-bottom: 0;\n}\n\naddress {\n margin-bottom: 1rem;\n font-style: normal;\n line-height: inherit;\n}\n\nol,\nul,\ndl {\n margin-top: 0;\n margin-bottom: 1rem;\n}\n\nol ol,\nul ul,\nol ul,\nul ol {\n margin-bottom: 0;\n}\n\ndt {\n font-weight: bold;\n}\n\ndd {\n margin-bottom: .5rem;\n margin-left: 0;\n}\n\nblockquote {\n margin: 0 0 1rem;\n}\n\ndfn {\n font-style: italic;\n}\n\nb,\nstrong {\n font-weight: bolder;\n}\n\nsmall {\n font-size: 80%;\n}\n\nsub,\nsup {\n position: relative;\n font-size: 75%;\n line-height: 0;\n vertical-align: baseline;\n}\n\nsub {\n bottom: -.25em;\n}\n\nsup {\n top: -.5em;\n}\n\na {\n color: #007bff;\n text-decoration: none;\n background-color: transparent;\n -webkit-text-decoration-skip: objects;\n}\n\na:hover {\n color: #0056b3;\n text-decoration: underline;\n}\n\na:not([href]):not([tabindex]) {\n color: inherit;\n text-decoration: none;\n}\n\na:not([href]):not([tabindex]):focus, a:not([href]):not([tabindex]):hover {\n color: inherit;\n text-decoration: none;\n}\n\na:not([href]):not([tabindex]):focus {\n outline: 0;\n}\n\npre,\ncode,\nkbd,\nsamp {\n font-family: monospace, monospace;\n font-size: 1em;\n}\n\npre {\n margin-top: 0;\n margin-bottom: 1rem;\n overflow: auto;\n}\n\nfigure {\n margin: 0 0 1rem;\n}\n\nimg {\n vertical-align: middle;\n border-style: none;\n}\n\nsvg:not(:root) {\n overflow: hidden;\n}\n\na,\narea,\nbutton,\n[role=\"button\"],\ninput,\nlabel,\nselect,\nsummary,\ntextarea {\n -ms-touch-action: manipulation;\n touch-action: manipulation;\n}\n\ntable {\n border-collapse: collapse;\n}\n\ncaption {\n padding-top: 0.75rem;\n padding-bottom: 0.75rem;\n color: #868e96;\n text-align: left;\n caption-side: bottom;\n}\n\nth {\n text-align: left;\n}\n\nlabel {\n display: inline-block;\n margin-bottom: .5rem;\n}\n\nbutton:focus {\n outline: 1px dotted;\n outline: 5px auto -webkit-focus-ring-color;\n}\n\ninput,\nbutton,\nselect,\noptgroup,\ntextarea {\n margin: 0;\n font-family: inherit;\n font-size: inherit;\n line-height: inherit;\n}\n\nbutton,\ninput {\n overflow: visible;\n}\n\nbutton,\nselect {\n text-transform: none;\n}\n\nbutton,\nhtml [type=\"button\"],\n[type=\"reset\"],\n[type=\"submit\"] {\n -webkit-appearance: button;\n}\n\nbutton::-moz-focus-inner,\n[type=\"button\"]::-moz-focus-inner,\n[type=\"reset\"]::-moz-focus-inner,\n[type=\"submit\"]::-moz-focus-inner {\n padding: 0;\n border-style: none;\n}\n\ninput[type=\"radio\"],\ninput[type=\"checkbox\"] {\n box-sizing: border-box;\n padding: 0;\n}\n\ninput[type=\"date\"],\ninput[type=\"time\"],\ninput[type=\"datetime-local\"],\ninput[type=\"month\"] {\n -webkit-appearance: listbox;\n}\n\ntextarea {\n overflow: auto;\n resize: vertical;\n}\n\nfieldset {\n min-width: 0;\n padding: 0;\n margin: 0;\n border: 0;\n}\n\nlegend {\n display: block;\n width: 100%;\n max-width: 100%;\n padding: 0;\n margin-bottom: .5rem;\n font-size: 1.5rem;\n line-height: inherit;\n color: inherit;\n white-space: normal;\n}\n\nprogress {\n vertical-align: baseline;\n}\n\n[type=\"number\"]::-webkit-inner-spin-button,\n[type=\"number\"]::-webkit-outer-spin-button {\n height: auto;\n}\n\n[type=\"search\"] {\n outline-offset: -2px;\n -webkit-appearance: none;\n}\n\n[type=\"search\"]::-webkit-search-cancel-button,\n[type=\"search\"]::-webkit-search-decoration {\n -webkit-appearance: none;\n}\n\n::-webkit-file-upload-button {\n font: inherit;\n -webkit-appearance: button;\n}\n\noutput {\n display: inline-block;\n}\n\nsummary {\n display: list-item;\n}\n\ntemplate {\n display: none;\n}\n\n[hidden] {\n display: none !important;\n}\n/*# sourceMappingURL=bootstrap-reboot.css.map */","html {\n box-sizing: border-box;\n font-family: sans-serif;\n line-height: 1.15;\n -webkit-text-size-adjust: 100%;\n -ms-text-size-adjust: 100%;\n -ms-overflow-style: scrollbar;\n -webkit-tap-highlight-color: transparent;\n}\n\n*,\n*::before,\n*::after {\n box-sizing: inherit;\n}\n\n@-ms-viewport {\n width: device-width;\n}\n\narticle, aside, dialog, figcaption, figure, footer, header, hgroup, main, nav, section {\n display: block;\n}\n\nbody {\n margin: 0;\n font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, \"Helvetica Neue\", Arial, sans-serif;\n font-size: 1rem;\n font-weight: normal;\n line-height: 1.5;\n color: #212529;\n background-color: #fff;\n}\n\n[tabindex=\"-1\"]:focus {\n outline: none !important;\n}\n\nhr {\n box-sizing: content-box;\n height: 0;\n overflow: visible;\n}\n\nh1, h2, h3, h4, h5, h6 {\n margin-top: 0;\n margin-bottom: .5rem;\n}\n\np {\n margin-top: 0;\n margin-bottom: 1rem;\n}\n\nabbr[title],\nabbr[data-original-title] {\n text-decoration: underline;\n text-decoration: underline dotted;\n cursor: help;\n border-bottom: 0;\n}\n\naddress {\n margin-bottom: 1rem;\n font-style: normal;\n line-height: inherit;\n}\n\nol,\nul,\ndl {\n margin-top: 0;\n margin-bottom: 1rem;\n}\n\nol ol,\nul ul,\nol ul,\nul ol {\n margin-bottom: 0;\n}\n\ndt {\n font-weight: bold;\n}\n\ndd {\n margin-bottom: .5rem;\n margin-left: 0;\n}\n\nblockquote {\n margin: 0 0 1rem;\n}\n\ndfn {\n font-style: italic;\n}\n\nb,\nstrong {\n font-weight: bolder;\n}\n\nsmall {\n font-size: 80%;\n}\n\nsub,\nsup {\n position: relative;\n font-size: 75%;\n line-height: 0;\n vertical-align: baseline;\n}\n\nsub {\n bottom: -.25em;\n}\n\nsup {\n top: -.5em;\n}\n\na {\n color: #007bff;\n text-decoration: none;\n background-color: transparent;\n -webkit-text-decoration-skip: objects;\n}\n\na:hover {\n color: #0056b3;\n text-decoration: underline;\n}\n\na:not([href]):not([tabindex]) {\n color: inherit;\n text-decoration: none;\n}\n\na:not([href]):not([tabindex]):focus, a:not([href]):not([tabindex]):hover {\n color: inherit;\n text-decoration: none;\n}\n\na:not([href]):not([tabindex]):focus {\n outline: 0;\n}\n\npre,\ncode,\nkbd,\nsamp {\n font-family: monospace, monospace;\n font-size: 1em;\n}\n\npre {\n margin-top: 0;\n margin-bottom: 1rem;\n overflow: auto;\n}\n\nfigure {\n margin: 0 0 1rem;\n}\n\nimg {\n vertical-align: middle;\n border-style: none;\n}\n\nsvg:not(:root) {\n overflow: hidden;\n}\n\na,\narea,\nbutton,\n[role=\"button\"],\ninput,\nlabel,\nselect,\nsummary,\ntextarea {\n touch-action: manipulation;\n}\n\ntable {\n border-collapse: collapse;\n}\n\ncaption {\n padding-top: 0.75rem;\n padding-bottom: 0.75rem;\n color: #868e96;\n text-align: left;\n caption-side: bottom;\n}\n\nth {\n text-align: left;\n}\n\nlabel {\n display: inline-block;\n margin-bottom: .5rem;\n}\n\nbutton:focus {\n outline: 1px dotted;\n outline: 5px auto -webkit-focus-ring-color;\n}\n\ninput,\nbutton,\nselect,\noptgroup,\ntextarea {\n margin: 0;\n font-family: inherit;\n font-size: inherit;\n line-height: inherit;\n}\n\nbutton,\ninput {\n overflow: visible;\n}\n\nbutton,\nselect {\n text-transform: none;\n}\n\nbutton,\nhtml [type=\"button\"],\n[type=\"reset\"],\n[type=\"submit\"] {\n -webkit-appearance: button;\n}\n\nbutton::-moz-focus-inner,\n[type=\"button\"]::-moz-focus-inner,\n[type=\"reset\"]::-moz-focus-inner,\n[type=\"submit\"]::-moz-focus-inner {\n padding: 0;\n border-style: none;\n}\n\ninput[type=\"radio\"],\ninput[type=\"checkbox\"] {\n box-sizing: border-box;\n padding: 0;\n}\n\ninput[type=\"date\"],\ninput[type=\"time\"],\ninput[type=\"datetime-local\"],\ninput[type=\"month\"] {\n -webkit-appearance: listbox;\n}\n\ntextarea {\n overflow: auto;\n resize: vertical;\n}\n\nfieldset {\n min-width: 0;\n padding: 0;\n margin: 0;\n border: 0;\n}\n\nlegend {\n display: block;\n width: 100%;\n max-width: 100%;\n padding: 0;\n margin-bottom: .5rem;\n font-size: 1.5rem;\n line-height: inherit;\n color: inherit;\n white-space: normal;\n}\n\nprogress {\n vertical-align: baseline;\n}\n\n[type=\"number\"]::-webkit-inner-spin-button,\n[type=\"number\"]::-webkit-outer-spin-button {\n height: auto;\n}\n\n[type=\"search\"] {\n outline-offset: -2px;\n -webkit-appearance: none;\n}\n\n[type=\"search\"]::-webkit-search-cancel-button,\n[type=\"search\"]::-webkit-search-decoration {\n -webkit-appearance: none;\n}\n\n::-webkit-file-upload-button {\n font: inherit;\n -webkit-appearance: button;\n}\n\noutput {\n display: inline-block;\n}\n\nsummary {\n display: list-item;\n}\n\ntemplate {\n display: none;\n}\n\n[hidden] {\n display: none !important;\n}\n\n/*# sourceMappingURL=bootstrap-reboot.css.map */","@mixin hover {\n // TODO: re-enable along with mq4-hover-shim\n// @if $enable-hover-media-query {\n// // See Media Queries Level 4: https://drafts.csswg.org/mediaqueries/#hover\n// // Currently shimmed by https://github.com/twbs/mq4-hover-shim\n// @media (hover: hover) {\n// &:hover { @content }\n// }\n// }\n// @else {\n// scss-lint:disable Indentation\n &:hover { @content }\n// scss-lint:enable Indentation\n// }\n}\n\n\n@mixin hover-focus {\n @if $enable-hover-media-query {\n &:focus { @content }\n @include hover { @content }\n } @else {\n &:focus,\n &:hover {\n @content\n }\n }\n}\n\n@mixin plain-hover-focus {\n @if $enable-hover-media-query {\n &,\n &:focus {\n @content\n }\n @include hover { @content }\n } @else {\n &,\n &:focus,\n &:hover {\n @content\n }\n }\n}\n\n@mixin hover-focus-active {\n @if $enable-hover-media-query {\n &:focus,\n &:active {\n @content\n }\n @include hover { @content }\n } @else {\n &:focus,\n &:active,\n &:hover {\n @content\n }\n }\n}\n"]} \ No newline at end of file
diff --git a/library/bootstrap/css/bootstrap.css b/library/bootstrap/css/bootstrap.css
index 1f46adfb9..b39107f6f 100644
--- a/library/bootstrap/css/bootstrap.css
+++ b/library/bootstrap/css/bootstrap.css
@@ -1,5 +1,5 @@
/*!
- * Bootstrap v4.0.0-alpha.6 (https://getbootstrap.com)
+ * Bootstrap v4.0.0-beta (https://getbootstrap.com)
* Copyright 2011-2017 The Bootstrap Authors
* Copyright 2011-2017 Twitter, Inc.
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
@@ -7,18 +7,9 @@
@media print {
*,
*::before,
- *::after,
- p::first-letter,
- div::first-letter,
- blockquote::first-letter,
- li::first-letter,
- p::first-line,
- div::first-line,
- blockquote::first-line,
- li::first-line {
+ *::after {
text-shadow: none !important;
- -webkit-box-shadow: none !important;
- box-shadow: none !important;
+ box-shadow: none !important;
}
a,
a:visited {
@@ -72,8 +63,7 @@
}
html {
- -webkit-box-sizing: border-box;
- box-sizing: border-box;
+ box-sizing: border-box;
font-family: sans-serif;
line-height: 1.15;
-webkit-text-size-adjust: 100%;
@@ -85,21 +75,24 @@ html {
*,
*::before,
*::after {
- -webkit-box-sizing: inherit;
- box-sizing: inherit;
+ box-sizing: inherit;
}
@-ms-viewport {
width: device-width;
}
+article, aside, dialog, figcaption, figure, footer, header, hgroup, main, nav, section {
+ display: block;
+}
+
body {
margin: 0;
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif;
font-size: 1rem;
font-weight: normal;
line-height: 1.5;
- color: #292b2c;
+ color: #212529;
background-color: #fff;
}
@@ -108,8 +101,7 @@ body {
}
hr {
- -webkit-box-sizing: content-box;
- box-sizing: content-box;
+ box-sizing: content-box;
height: 0;
overflow: visible;
}
@@ -127,7 +119,8 @@ p {
abbr[title],
abbr[data-original-title] {
text-decoration: underline;
- text-decoration: underline dotted;
+ -webkit-text-decoration: underline dotted;
+ text-decoration: underline dotted;
cursor: help;
border-bottom: 0;
}
@@ -195,14 +188,14 @@ sup {
}
a {
- color: #0275d8;
+ color: #007bff;
text-decoration: none;
background-color: transparent;
-webkit-text-decoration-skip: objects;
}
a:hover {
- color: #014c8c;
+ color: #0056b3;
text-decoration: underline;
}
@@ -267,7 +260,7 @@ table {
caption {
padding-top: 0.75rem;
padding-bottom: 0.75rem;
- color: #636c72;
+ color: #868e96;
text-align: left;
caption-side: bottom;
}
@@ -324,8 +317,7 @@ button::-moz-focus-inner,
input[type="radio"],
input[type="checkbox"] {
- -webkit-box-sizing: border-box;
- box-sizing: border-box;
+ box-sizing: border-box;
padding: 0;
}
@@ -505,38 +497,20 @@ mark,
}
.blockquote {
- padding: 0.5rem 1rem;
margin-bottom: 1rem;
font-size: 1.25rem;
- border-left: 0.25rem solid #eceeef;
}
.blockquote-footer {
display: block;
font-size: 80%;
- color: #636c72;
+ color: #868e96;
}
.blockquote-footer::before {
content: "\2014 \00A0";
}
-.blockquote-reverse {
- padding-right: 1rem;
- padding-left: 0;
- text-align: right;
- border-right: 0.25rem solid #eceeef;
- border-left: 0;
-}
-
-.blockquote-reverse .blockquote-footer::before {
- content: "";
-}
-
-.blockquote-reverse .blockquote-footer::after {
- content: "\00A0 \2014";
-}
-
.img-fluid {
max-width: 100%;
height: auto;
@@ -547,8 +521,6 @@ mark,
background-color: #fff;
border: 1px solid #ddd;
border-radius: 0.25rem;
- -webkit-transition: all 0.2s ease-in-out;
- -o-transition: all 0.2s ease-in-out;
transition: all 0.2s ease-in-out;
max-width: 100%;
height: auto;
@@ -565,7 +537,7 @@ mark,
.figure-caption {
font-size: 90%;
- color: #636c72;
+ color: #868e96;
}
code,
@@ -579,7 +551,7 @@ code {
padding: 0.2rem 0.4rem;
font-size: 90%;
color: #bd4147;
- background-color: #f7f7f9;
+ background-color: #f8f9fa;
border-radius: 0.25rem;
}
@@ -593,7 +565,7 @@ kbd {
padding: 0.2rem 0.4rem;
font-size: 90%;
color: #fff;
- background-color: #292b2c;
+ background-color: #212529;
border-radius: 0.2rem;
}
@@ -608,7 +580,7 @@ pre {
margin-top: 0;
margin-bottom: 1rem;
font-size: 90%;
- color: #292b2c;
+ color: #212529;
}
pre code {
@@ -629,61 +601,30 @@ pre code {
margin-left: auto;
padding-right: 15px;
padding-left: 15px;
+ width: 100%;
}
@media (min-width: 576px) {
.container {
- padding-right: 15px;
- padding-left: 15px;
- }
-}
-
-@media (min-width: 768px) {
- .container {
- padding-right: 15px;
- padding-left: 15px;
- }
-}
-
-@media (min-width: 992px) {
- .container {
- padding-right: 15px;
- padding-left: 15px;
- }
-}
-
-@media (min-width: 1200px) {
- .container {
- padding-right: 15px;
- padding-left: 15px;
- }
-}
-
-@media (min-width: 576px) {
- .container {
- width: 540px;
- max-width: 100%;
+ max-width: 540px;
}
}
@media (min-width: 768px) {
.container {
- width: 720px;
- max-width: 100%;
+ max-width: 720px;
}
}
@media (min-width: 992px) {
.container {
- width: 960px;
- max-width: 100%;
+ max-width: 960px;
}
}
@media (min-width: 1200px) {
.container {
- width: 1140px;
- max-width: 100%;
+ max-width: 1140px;
}
}
@@ -693,76 +634,18 @@ pre code {
margin-left: auto;
padding-right: 15px;
padding-left: 15px;
-}
-
-@media (min-width: 576px) {
- .container-fluid {
- padding-right: 15px;
- padding-left: 15px;
- }
-}
-
-@media (min-width: 768px) {
- .container-fluid {
- padding-right: 15px;
- padding-left: 15px;
- }
-}
-
-@media (min-width: 992px) {
- .container-fluid {
- padding-right: 15px;
- padding-left: 15px;
- }
-}
-
-@media (min-width: 1200px) {
- .container-fluid {
- padding-right: 15px;
- padding-left: 15px;
- }
+ width: 100%;
}
.row {
- display: -webkit-box;
- display: -webkit-flex;
display: -ms-flexbox;
display: flex;
- -webkit-flex-wrap: wrap;
- -ms-flex-wrap: wrap;
- flex-wrap: wrap;
+ -ms-flex-wrap: wrap;
+ flex-wrap: wrap;
margin-right: -15px;
margin-left: -15px;
}
-@media (min-width: 576px) {
- .row {
- margin-right: -15px;
- margin-left: -15px;
- }
-}
-
-@media (min-width: 768px) {
- .row {
- margin-right: -15px;
- margin-left: -15px;
- }
-}
-
-@media (min-width: 992px) {
- .row {
- margin-right: -15px;
- margin-left: -15px;
- }
-}
-
-@media (min-width: 1200px) {
- .row {
- margin-right: -15px;
- margin-left: -15px;
- }
-}
-
.no-gutters {
margin-right: 0;
margin-left: 0;
@@ -787,946 +670,646 @@ pre code {
padding-left: 15px;
}
-@media (min-width: 576px) {
- .col-1, .col-2, .col-3, .col-4, .col-5, .col-6, .col-7, .col-8, .col-9, .col-10, .col-11, .col-12, .col,
- .col-auto, .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, .col-sm,
- .col-sm-auto, .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, .col-md,
- .col-md-auto, .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, .col-lg,
- .col-lg-auto, .col-xl-1, .col-xl-2, .col-xl-3, .col-xl-4, .col-xl-5, .col-xl-6, .col-xl-7, .col-xl-8, .col-xl-9, .col-xl-10, .col-xl-11, .col-xl-12, .col-xl,
- .col-xl-auto {
- padding-right: 15px;
- padding-left: 15px;
- }
-}
-
-@media (min-width: 768px) {
- .col-1, .col-2, .col-3, .col-4, .col-5, .col-6, .col-7, .col-8, .col-9, .col-10, .col-11, .col-12, .col,
- .col-auto, .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, .col-sm,
- .col-sm-auto, .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, .col-md,
- .col-md-auto, .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, .col-lg,
- .col-lg-auto, .col-xl-1, .col-xl-2, .col-xl-3, .col-xl-4, .col-xl-5, .col-xl-6, .col-xl-7, .col-xl-8, .col-xl-9, .col-xl-10, .col-xl-11, .col-xl-12, .col-xl,
- .col-xl-auto {
- padding-right: 15px;
- padding-left: 15px;
- }
-}
-
-@media (min-width: 992px) {
- .col-1, .col-2, .col-3, .col-4, .col-5, .col-6, .col-7, .col-8, .col-9, .col-10, .col-11, .col-12, .col,
- .col-auto, .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, .col-sm,
- .col-sm-auto, .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, .col-md,
- .col-md-auto, .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, .col-lg,
- .col-lg-auto, .col-xl-1, .col-xl-2, .col-xl-3, .col-xl-4, .col-xl-5, .col-xl-6, .col-xl-7, .col-xl-8, .col-xl-9, .col-xl-10, .col-xl-11, .col-xl-12, .col-xl,
- .col-xl-auto {
- padding-right: 15px;
- padding-left: 15px;
- }
-}
-
-@media (min-width: 1200px) {
- .col-1, .col-2, .col-3, .col-4, .col-5, .col-6, .col-7, .col-8, .col-9, .col-10, .col-11, .col-12, .col,
- .col-auto, .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, .col-sm,
- .col-sm-auto, .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, .col-md,
- .col-md-auto, .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, .col-lg,
- .col-lg-auto, .col-xl-1, .col-xl-2, .col-xl-3, .col-xl-4, .col-xl-5, .col-xl-6, .col-xl-7, .col-xl-8, .col-xl-9, .col-xl-10, .col-xl-11, .col-xl-12, .col-xl,
- .col-xl-auto {
- padding-right: 15px;
- padding-left: 15px;
- }
-}
-
.col {
- -webkit-flex-basis: 0;
- -ms-flex-preferred-size: 0;
- flex-basis: 0;
- -webkit-box-flex: 1;
- -webkit-flex-grow: 1;
- -ms-flex-positive: 1;
- flex-grow: 1;
+ -ms-flex-preferred-size: 0;
+ flex-basis: 0;
+ -ms-flex-positive: 1;
+ flex-grow: 1;
max-width: 100%;
}
.col-auto {
- -webkit-box-flex: 0;
- -webkit-flex: 0 0 auto;
- -ms-flex: 0 0 auto;
- flex: 0 0 auto;
+ -ms-flex: 0 0 auto;
+ flex: 0 0 auto;
width: auto;
+ max-width: none;
}
.col-1 {
- width: 8.333333%;
+ -ms-flex: 0 0 8.333333%;
+ flex: 0 0 8.333333%;
+ max-width: 8.333333%;
}
.col-2 {
- width: 16.666667%;
+ -ms-flex: 0 0 16.666667%;
+ flex: 0 0 16.666667%;
+ max-width: 16.666667%;
}
.col-3 {
- width: 25%;
+ -ms-flex: 0 0 25%;
+ flex: 0 0 25%;
+ max-width: 25%;
}
.col-4 {
- width: 33.333333%;
+ -ms-flex: 0 0 33.333333%;
+ flex: 0 0 33.333333%;
+ max-width: 33.333333%;
}
.col-5 {
- width: 41.666667%;
+ -ms-flex: 0 0 41.666667%;
+ flex: 0 0 41.666667%;
+ max-width: 41.666667%;
}
.col-6 {
- width: 50%;
+ -ms-flex: 0 0 50%;
+ flex: 0 0 50%;
+ max-width: 50%;
}
.col-7 {
- width: 58.333333%;
+ -ms-flex: 0 0 58.333333%;
+ flex: 0 0 58.333333%;
+ max-width: 58.333333%;
}
.col-8 {
- width: 66.666667%;
+ -ms-flex: 0 0 66.666667%;
+ flex: 0 0 66.666667%;
+ max-width: 66.666667%;
}
.col-9 {
- width: 75%;
+ -ms-flex: 0 0 75%;
+ flex: 0 0 75%;
+ max-width: 75%;
}
.col-10 {
- width: 83.333333%;
+ -ms-flex: 0 0 83.333333%;
+ flex: 0 0 83.333333%;
+ max-width: 83.333333%;
}
.col-11 {
- width: 91.666667%;
+ -ms-flex: 0 0 91.666667%;
+ flex: 0 0 91.666667%;
+ max-width: 91.666667%;
}
.col-12 {
- width: 100%;
-}
-
-.pull-0 {
- right: auto;
-}
-
-.pull-1 {
- right: 8.333333%;
-}
-
-.pull-2 {
- right: 16.666667%;
-}
-
-.pull-3 {
- right: 25%;
-}
-
-.pull-4 {
- right: 33.333333%;
-}
-
-.pull-5 {
- right: 41.666667%;
-}
-
-.pull-6 {
- right: 50%;
-}
-
-.pull-7 {
- right: 58.333333%;
-}
-
-.pull-8 {
- right: 66.666667%;
-}
-
-.pull-9 {
- right: 75%;
-}
-
-.pull-10 {
- right: 83.333333%;
-}
-
-.pull-11 {
- right: 91.666667%;
-}
-
-.pull-12 {
- right: 100%;
-}
-
-.push-0 {
- left: auto;
-}
-
-.push-1 {
- left: 8.333333%;
-}
-
-.push-2 {
- left: 16.666667%;
-}
-
-.push-3 {
- left: 25%;
-}
-
-.push-4 {
- left: 33.333333%;
-}
-
-.push-5 {
- left: 41.666667%;
-}
-
-.push-6 {
- left: 50%;
-}
-
-.push-7 {
- left: 58.333333%;
-}
-
-.push-8 {
- left: 66.666667%;
-}
-
-.push-9 {
- left: 75%;
-}
-
-.push-10 {
- left: 83.333333%;
-}
-
-.push-11 {
- left: 91.666667%;
+ -ms-flex: 0 0 100%;
+ flex: 0 0 100%;
+ max-width: 100%;
}
-.push-12 {
- left: 100%;
+.order-1 {
+ -ms-flex-order: 1;
+ order: 1;
}
-.offset-1 {
- margin-left: 8.333333%;
+.order-2 {
+ -ms-flex-order: 2;
+ order: 2;
}
-.offset-2 {
- margin-left: 16.666667%;
+.order-3 {
+ -ms-flex-order: 3;
+ order: 3;
}
-.offset-3 {
- margin-left: 25%;
+.order-4 {
+ -ms-flex-order: 4;
+ order: 4;
}
-.offset-4 {
- margin-left: 33.333333%;
+.order-5 {
+ -ms-flex-order: 5;
+ order: 5;
}
-.offset-5 {
- margin-left: 41.666667%;
+.order-6 {
+ -ms-flex-order: 6;
+ order: 6;
}
-.offset-6 {
- margin-left: 50%;
+.order-7 {
+ -ms-flex-order: 7;
+ order: 7;
}
-.offset-7 {
- margin-left: 58.333333%;
+.order-8 {
+ -ms-flex-order: 8;
+ order: 8;
}
-.offset-8 {
- margin-left: 66.666667%;
+.order-9 {
+ -ms-flex-order: 9;
+ order: 9;
}
-.offset-9 {
- margin-left: 75%;
+.order-10 {
+ -ms-flex-order: 10;
+ order: 10;
}
-.offset-10 {
- margin-left: 83.333333%;
+.order-11 {
+ -ms-flex-order: 11;
+ order: 11;
}
-.offset-11 {
- margin-left: 91.666667%;
+.order-12 {
+ -ms-flex-order: 12;
+ order: 12;
}
@media (min-width: 576px) {
.col-sm {
- -webkit-flex-basis: 0;
- -ms-flex-preferred-size: 0;
- flex-basis: 0;
- -webkit-box-flex: 1;
- -webkit-flex-grow: 1;
- -ms-flex-positive: 1;
- flex-grow: 1;
+ -ms-flex-preferred-size: 0;
+ flex-basis: 0;
+ -ms-flex-positive: 1;
+ flex-grow: 1;
max-width: 100%;
}
.col-sm-auto {
- -webkit-box-flex: 0;
- -webkit-flex: 0 0 auto;
- -ms-flex: 0 0 auto;
- flex: 0 0 auto;
+ -ms-flex: 0 0 auto;
+ flex: 0 0 auto;
width: auto;
+ max-width: none;
}
.col-sm-1 {
- width: 8.333333%;
+ -ms-flex: 0 0 8.333333%;
+ flex: 0 0 8.333333%;
+ max-width: 8.333333%;
}
.col-sm-2 {
- width: 16.666667%;
+ -ms-flex: 0 0 16.666667%;
+ flex: 0 0 16.666667%;
+ max-width: 16.666667%;
}
.col-sm-3 {
- width: 25%;
+ -ms-flex: 0 0 25%;
+ flex: 0 0 25%;
+ max-width: 25%;
}
.col-sm-4 {
- width: 33.333333%;
+ -ms-flex: 0 0 33.333333%;
+ flex: 0 0 33.333333%;
+ max-width: 33.333333%;
}
.col-sm-5 {
- width: 41.666667%;
+ -ms-flex: 0 0 41.666667%;
+ flex: 0 0 41.666667%;
+ max-width: 41.666667%;
}
.col-sm-6 {
- width: 50%;
+ -ms-flex: 0 0 50%;
+ flex: 0 0 50%;
+ max-width: 50%;
}
.col-sm-7 {
- width: 58.333333%;
+ -ms-flex: 0 0 58.333333%;
+ flex: 0 0 58.333333%;
+ max-width: 58.333333%;
}
.col-sm-8 {
- width: 66.666667%;
+ -ms-flex: 0 0 66.666667%;
+ flex: 0 0 66.666667%;
+ max-width: 66.666667%;
}
.col-sm-9 {
- width: 75%;
+ -ms-flex: 0 0 75%;
+ flex: 0 0 75%;
+ max-width: 75%;
}
.col-sm-10 {
- width: 83.333333%;
+ -ms-flex: 0 0 83.333333%;
+ flex: 0 0 83.333333%;
+ max-width: 83.333333%;
}
.col-sm-11 {
- width: 91.666667%;
+ -ms-flex: 0 0 91.666667%;
+ flex: 0 0 91.666667%;
+ max-width: 91.666667%;
}
.col-sm-12 {
- width: 100%;
- }
- .pull-sm-0 {
- right: auto;
- }
- .pull-sm-1 {
- right: 8.333333%;
- }
- .pull-sm-2 {
- right: 16.666667%;
- }
- .pull-sm-3 {
- right: 25%;
- }
- .pull-sm-4 {
- right: 33.333333%;
- }
- .pull-sm-5 {
- right: 41.666667%;
- }
- .pull-sm-6 {
- right: 50%;
- }
- .pull-sm-7 {
- right: 58.333333%;
- }
- .pull-sm-8 {
- right: 66.666667%;
- }
- .pull-sm-9 {
- right: 75%;
- }
- .pull-sm-10 {
- right: 83.333333%;
- }
- .pull-sm-11 {
- right: 91.666667%;
- }
- .pull-sm-12 {
- right: 100%;
- }
- .push-sm-0 {
- left: auto;
- }
- .push-sm-1 {
- left: 8.333333%;
- }
- .push-sm-2 {
- left: 16.666667%;
- }
- .push-sm-3 {
- left: 25%;
- }
- .push-sm-4 {
- left: 33.333333%;
- }
- .push-sm-5 {
- left: 41.666667%;
- }
- .push-sm-6 {
- left: 50%;
- }
- .push-sm-7 {
- left: 58.333333%;
- }
- .push-sm-8 {
- left: 66.666667%;
- }
- .push-sm-9 {
- left: 75%;
- }
- .push-sm-10 {
- left: 83.333333%;
- }
- .push-sm-11 {
- left: 91.666667%;
- }
- .push-sm-12 {
- left: 100%;
+ -ms-flex: 0 0 100%;
+ flex: 0 0 100%;
+ max-width: 100%;
}
- .offset-sm-0 {
- margin-left: 0%;
+ .order-sm-1 {
+ -ms-flex-order: 1;
+ order: 1;
}
- .offset-sm-1 {
- margin-left: 8.333333%;
+ .order-sm-2 {
+ -ms-flex-order: 2;
+ order: 2;
}
- .offset-sm-2 {
- margin-left: 16.666667%;
+ .order-sm-3 {
+ -ms-flex-order: 3;
+ order: 3;
}
- .offset-sm-3 {
- margin-left: 25%;
+ .order-sm-4 {
+ -ms-flex-order: 4;
+ order: 4;
}
- .offset-sm-4 {
- margin-left: 33.333333%;
+ .order-sm-5 {
+ -ms-flex-order: 5;
+ order: 5;
}
- .offset-sm-5 {
- margin-left: 41.666667%;
+ .order-sm-6 {
+ -ms-flex-order: 6;
+ order: 6;
}
- .offset-sm-6 {
- margin-left: 50%;
+ .order-sm-7 {
+ -ms-flex-order: 7;
+ order: 7;
}
- .offset-sm-7 {
- margin-left: 58.333333%;
+ .order-sm-8 {
+ -ms-flex-order: 8;
+ order: 8;
}
- .offset-sm-8 {
- margin-left: 66.666667%;
+ .order-sm-9 {
+ -ms-flex-order: 9;
+ order: 9;
}
- .offset-sm-9 {
- margin-left: 75%;
+ .order-sm-10 {
+ -ms-flex-order: 10;
+ order: 10;
}
- .offset-sm-10 {
- margin-left: 83.333333%;
+ .order-sm-11 {
+ -ms-flex-order: 11;
+ order: 11;
}
- .offset-sm-11 {
- margin-left: 91.666667%;
+ .order-sm-12 {
+ -ms-flex-order: 12;
+ order: 12;
}
}
@media (min-width: 768px) {
.col-md {
- -webkit-flex-basis: 0;
- -ms-flex-preferred-size: 0;
- flex-basis: 0;
- -webkit-box-flex: 1;
- -webkit-flex-grow: 1;
- -ms-flex-positive: 1;
- flex-grow: 1;
+ -ms-flex-preferred-size: 0;
+ flex-basis: 0;
+ -ms-flex-positive: 1;
+ flex-grow: 1;
max-width: 100%;
}
.col-md-auto {
- -webkit-box-flex: 0;
- -webkit-flex: 0 0 auto;
- -ms-flex: 0 0 auto;
- flex: 0 0 auto;
+ -ms-flex: 0 0 auto;
+ flex: 0 0 auto;
width: auto;
+ max-width: none;
}
.col-md-1 {
- width: 8.333333%;
+ -ms-flex: 0 0 8.333333%;
+ flex: 0 0 8.333333%;
+ max-width: 8.333333%;
}
.col-md-2 {
- width: 16.666667%;
+ -ms-flex: 0 0 16.666667%;
+ flex: 0 0 16.666667%;
+ max-width: 16.666667%;
}
.col-md-3 {
- width: 25%;
+ -ms-flex: 0 0 25%;
+ flex: 0 0 25%;
+ max-width: 25%;
}
.col-md-4 {
- width: 33.333333%;
+ -ms-flex: 0 0 33.333333%;
+ flex: 0 0 33.333333%;
+ max-width: 33.333333%;
}
.col-md-5 {
- width: 41.666667%;
+ -ms-flex: 0 0 41.666667%;
+ flex: 0 0 41.666667%;
+ max-width: 41.666667%;
}
.col-md-6 {
- width: 50%;
+ -ms-flex: 0 0 50%;
+ flex: 0 0 50%;
+ max-width: 50%;
}
.col-md-7 {
- width: 58.333333%;
+ -ms-flex: 0 0 58.333333%;
+ flex: 0 0 58.333333%;
+ max-width: 58.333333%;
}
.col-md-8 {
- width: 66.666667%;
+ -ms-flex: 0 0 66.666667%;
+ flex: 0 0 66.666667%;
+ max-width: 66.666667%;
}
.col-md-9 {
- width: 75%;
+ -ms-flex: 0 0 75%;
+ flex: 0 0 75%;
+ max-width: 75%;
}
.col-md-10 {
- width: 83.333333%;
+ -ms-flex: 0 0 83.333333%;
+ flex: 0 0 83.333333%;
+ max-width: 83.333333%;
}
.col-md-11 {
- width: 91.666667%;
+ -ms-flex: 0 0 91.666667%;
+ flex: 0 0 91.666667%;
+ max-width: 91.666667%;
}
.col-md-12 {
- width: 100%;
- }
- .pull-md-0 {
- right: auto;
- }
- .pull-md-1 {
- right: 8.333333%;
- }
- .pull-md-2 {
- right: 16.666667%;
- }
- .pull-md-3 {
- right: 25%;
- }
- .pull-md-4 {
- right: 33.333333%;
- }
- .pull-md-5 {
- right: 41.666667%;
- }
- .pull-md-6 {
- right: 50%;
- }
- .pull-md-7 {
- right: 58.333333%;
- }
- .pull-md-8 {
- right: 66.666667%;
- }
- .pull-md-9 {
- right: 75%;
- }
- .pull-md-10 {
- right: 83.333333%;
- }
- .pull-md-11 {
- right: 91.666667%;
- }
- .pull-md-12 {
- right: 100%;
- }
- .push-md-0 {
- left: auto;
- }
- .push-md-1 {
- left: 8.333333%;
- }
- .push-md-2 {
- left: 16.666667%;
- }
- .push-md-3 {
- left: 25%;
- }
- .push-md-4 {
- left: 33.333333%;
- }
- .push-md-5 {
- left: 41.666667%;
- }
- .push-md-6 {
- left: 50%;
- }
- .push-md-7 {
- left: 58.333333%;
- }
- .push-md-8 {
- left: 66.666667%;
- }
- .push-md-9 {
- left: 75%;
- }
- .push-md-10 {
- left: 83.333333%;
- }
- .push-md-11 {
- left: 91.666667%;
- }
- .push-md-12 {
- left: 100%;
+ -ms-flex: 0 0 100%;
+ flex: 0 0 100%;
+ max-width: 100%;
}
- .offset-md-0 {
- margin-left: 0%;
+ .order-md-1 {
+ -ms-flex-order: 1;
+ order: 1;
}
- .offset-md-1 {
- margin-left: 8.333333%;
+ .order-md-2 {
+ -ms-flex-order: 2;
+ order: 2;
}
- .offset-md-2 {
- margin-left: 16.666667%;
+ .order-md-3 {
+ -ms-flex-order: 3;
+ order: 3;
}
- .offset-md-3 {
- margin-left: 25%;
+ .order-md-4 {
+ -ms-flex-order: 4;
+ order: 4;
}
- .offset-md-4 {
- margin-left: 33.333333%;
+ .order-md-5 {
+ -ms-flex-order: 5;
+ order: 5;
}
- .offset-md-5 {
- margin-left: 41.666667%;
+ .order-md-6 {
+ -ms-flex-order: 6;
+ order: 6;
}
- .offset-md-6 {
- margin-left: 50%;
+ .order-md-7 {
+ -ms-flex-order: 7;
+ order: 7;
}
- .offset-md-7 {
- margin-left: 58.333333%;
+ .order-md-8 {
+ -ms-flex-order: 8;
+ order: 8;
}
- .offset-md-8 {
- margin-left: 66.666667%;
+ .order-md-9 {
+ -ms-flex-order: 9;
+ order: 9;
}
- .offset-md-9 {
- margin-left: 75%;
+ .order-md-10 {
+ -ms-flex-order: 10;
+ order: 10;
}
- .offset-md-10 {
- margin-left: 83.333333%;
+ .order-md-11 {
+ -ms-flex-order: 11;
+ order: 11;
}
- .offset-md-11 {
- margin-left: 91.666667%;
+ .order-md-12 {
+ -ms-flex-order: 12;
+ order: 12;
}
}
@media (min-width: 992px) {
.col-lg {
- -webkit-flex-basis: 0;
- -ms-flex-preferred-size: 0;
- flex-basis: 0;
- -webkit-box-flex: 1;
- -webkit-flex-grow: 1;
- -ms-flex-positive: 1;
- flex-grow: 1;
+ -ms-flex-preferred-size: 0;
+ flex-basis: 0;
+ -ms-flex-positive: 1;
+ flex-grow: 1;
max-width: 100%;
}
.col-lg-auto {
- -webkit-box-flex: 0;
- -webkit-flex: 0 0 auto;
- -ms-flex: 0 0 auto;
- flex: 0 0 auto;
+ -ms-flex: 0 0 auto;
+ flex: 0 0 auto;
width: auto;
+ max-width: none;
}
.col-lg-1 {
- width: 8.333333%;
+ -ms-flex: 0 0 8.333333%;
+ flex: 0 0 8.333333%;
+ max-width: 8.333333%;
}
.col-lg-2 {
- width: 16.666667%;
+ -ms-flex: 0 0 16.666667%;
+ flex: 0 0 16.666667%;
+ max-width: 16.666667%;
}
.col-lg-3 {
- width: 25%;
+ -ms-flex: 0 0 25%;
+ flex: 0 0 25%;
+ max-width: 25%;
}
.col-lg-4 {
- width: 33.333333%;
+ -ms-flex: 0 0 33.333333%;
+ flex: 0 0 33.333333%;
+ max-width: 33.333333%;
}
.col-lg-5 {
- width: 41.666667%;
+ -ms-flex: 0 0 41.666667%;
+ flex: 0 0 41.666667%;
+ max-width: 41.666667%;
}
.col-lg-6 {
- width: 50%;
+ -ms-flex: 0 0 50%;
+ flex: 0 0 50%;
+ max-width: 50%;
}
.col-lg-7 {
- width: 58.333333%;
+ -ms-flex: 0 0 58.333333%;
+ flex: 0 0 58.333333%;
+ max-width: 58.333333%;
}
.col-lg-8 {
- width: 66.666667%;
+ -ms-flex: 0 0 66.666667%;
+ flex: 0 0 66.666667%;
+ max-width: 66.666667%;
}
.col-lg-9 {
- width: 75%;
+ -ms-flex: 0 0 75%;
+ flex: 0 0 75%;
+ max-width: 75%;
}
.col-lg-10 {
- width: 83.333333%;
+ -ms-flex: 0 0 83.333333%;
+ flex: 0 0 83.333333%;
+ max-width: 83.333333%;
}
.col-lg-11 {
- width: 91.666667%;
+ -ms-flex: 0 0 91.666667%;
+ flex: 0 0 91.666667%;
+ max-width: 91.666667%;
}
.col-lg-12 {
- width: 100%;
- }
- .pull-lg-0 {
- right: auto;
- }
- .pull-lg-1 {
- right: 8.333333%;
- }
- .pull-lg-2 {
- right: 16.666667%;
- }
- .pull-lg-3 {
- right: 25%;
- }
- .pull-lg-4 {
- right: 33.333333%;
- }
- .pull-lg-5 {
- right: 41.666667%;
- }
- .pull-lg-6 {
- right: 50%;
- }
- .pull-lg-7 {
- right: 58.333333%;
- }
- .pull-lg-8 {
- right: 66.666667%;
- }
- .pull-lg-9 {
- right: 75%;
- }
- .pull-lg-10 {
- right: 83.333333%;
- }
- .pull-lg-11 {
- right: 91.666667%;
- }
- .pull-lg-12 {
- right: 100%;
- }
- .push-lg-0 {
- left: auto;
- }
- .push-lg-1 {
- left: 8.333333%;
- }
- .push-lg-2 {
- left: 16.666667%;
- }
- .push-lg-3 {
- left: 25%;
- }
- .push-lg-4 {
- left: 33.333333%;
- }
- .push-lg-5 {
- left: 41.666667%;
- }
- .push-lg-6 {
- left: 50%;
- }
- .push-lg-7 {
- left: 58.333333%;
- }
- .push-lg-8 {
- left: 66.666667%;
- }
- .push-lg-9 {
- left: 75%;
- }
- .push-lg-10 {
- left: 83.333333%;
- }
- .push-lg-11 {
- left: 91.666667%;
- }
- .push-lg-12 {
- left: 100%;
+ -ms-flex: 0 0 100%;
+ flex: 0 0 100%;
+ max-width: 100%;
}
- .offset-lg-0 {
- margin-left: 0%;
+ .order-lg-1 {
+ -ms-flex-order: 1;
+ order: 1;
}
- .offset-lg-1 {
- margin-left: 8.333333%;
+ .order-lg-2 {
+ -ms-flex-order: 2;
+ order: 2;
}
- .offset-lg-2 {
- margin-left: 16.666667%;
+ .order-lg-3 {
+ -ms-flex-order: 3;
+ order: 3;
}
- .offset-lg-3 {
- margin-left: 25%;
+ .order-lg-4 {
+ -ms-flex-order: 4;
+ order: 4;
}
- .offset-lg-4 {
- margin-left: 33.333333%;
+ .order-lg-5 {
+ -ms-flex-order: 5;
+ order: 5;
}
- .offset-lg-5 {
- margin-left: 41.666667%;
+ .order-lg-6 {
+ -ms-flex-order: 6;
+ order: 6;
}
- .offset-lg-6 {
- margin-left: 50%;
+ .order-lg-7 {
+ -ms-flex-order: 7;
+ order: 7;
}
- .offset-lg-7 {
- margin-left: 58.333333%;
+ .order-lg-8 {
+ -ms-flex-order: 8;
+ order: 8;
}
- .offset-lg-8 {
- margin-left: 66.666667%;
+ .order-lg-9 {
+ -ms-flex-order: 9;
+ order: 9;
}
- .offset-lg-9 {
- margin-left: 75%;
+ .order-lg-10 {
+ -ms-flex-order: 10;
+ order: 10;
}
- .offset-lg-10 {
- margin-left: 83.333333%;
+ .order-lg-11 {
+ -ms-flex-order: 11;
+ order: 11;
}
- .offset-lg-11 {
- margin-left: 91.666667%;
+ .order-lg-12 {
+ -ms-flex-order: 12;
+ order: 12;
}
}
@media (min-width: 1200px) {
.col-xl {
- -webkit-flex-basis: 0;
- -ms-flex-preferred-size: 0;
- flex-basis: 0;
- -webkit-box-flex: 1;
- -webkit-flex-grow: 1;
- -ms-flex-positive: 1;
- flex-grow: 1;
+ -ms-flex-preferred-size: 0;
+ flex-basis: 0;
+ -ms-flex-positive: 1;
+ flex-grow: 1;
max-width: 100%;
}
.col-xl-auto {
- -webkit-box-flex: 0;
- -webkit-flex: 0 0 auto;
- -ms-flex: 0 0 auto;
- flex: 0 0 auto;
+ -ms-flex: 0 0 auto;
+ flex: 0 0 auto;
width: auto;
+ max-width: none;
}
.col-xl-1 {
- width: 8.333333%;
+ -ms-flex: 0 0 8.333333%;
+ flex: 0 0 8.333333%;
+ max-width: 8.333333%;
}
.col-xl-2 {
- width: 16.666667%;
+ -ms-flex: 0 0 16.666667%;
+ flex: 0 0 16.666667%;
+ max-width: 16.666667%;
}
.col-xl-3 {
- width: 25%;
+ -ms-flex: 0 0 25%;
+ flex: 0 0 25%;
+ max-width: 25%;
}
.col-xl-4 {
- width: 33.333333%;
+ -ms-flex: 0 0 33.333333%;
+ flex: 0 0 33.333333%;
+ max-width: 33.333333%;
}
.col-xl-5 {
- width: 41.666667%;
+ -ms-flex: 0 0 41.666667%;
+ flex: 0 0 41.666667%;
+ max-width: 41.666667%;
}
.col-xl-6 {
- width: 50%;
+ -ms-flex: 0 0 50%;
+ flex: 0 0 50%;
+ max-width: 50%;
}
.col-xl-7 {
- width: 58.333333%;
+ -ms-flex: 0 0 58.333333%;
+ flex: 0 0 58.333333%;
+ max-width: 58.333333%;
}
.col-xl-8 {
- width: 66.666667%;
+ -ms-flex: 0 0 66.666667%;
+ flex: 0 0 66.666667%;
+ max-width: 66.666667%;
}
.col-xl-9 {
- width: 75%;
+ -ms-flex: 0 0 75%;
+ flex: 0 0 75%;
+ max-width: 75%;
}
.col-xl-10 {
- width: 83.333333%;
+ -ms-flex: 0 0 83.333333%;
+ flex: 0 0 83.333333%;
+ max-width: 83.333333%;
}
.col-xl-11 {
- width: 91.666667%;
+ -ms-flex: 0 0 91.666667%;
+ flex: 0 0 91.666667%;
+ max-width: 91.666667%;
}
.col-xl-12 {
- width: 100%;
- }
- .pull-xl-0 {
- right: auto;
- }
- .pull-xl-1 {
- right: 8.333333%;
- }
- .pull-xl-2 {
- right: 16.666667%;
- }
- .pull-xl-3 {
- right: 25%;
- }
- .pull-xl-4 {
- right: 33.333333%;
- }
- .pull-xl-5 {
- right: 41.666667%;
- }
- .pull-xl-6 {
- right: 50%;
- }
- .pull-xl-7 {
- right: 58.333333%;
- }
- .pull-xl-8 {
- right: 66.666667%;
- }
- .pull-xl-9 {
- right: 75%;
- }
- .pull-xl-10 {
- right: 83.333333%;
- }
- .pull-xl-11 {
- right: 91.666667%;
- }
- .pull-xl-12 {
- right: 100%;
- }
- .push-xl-0 {
- left: auto;
- }
- .push-xl-1 {
- left: 8.333333%;
- }
- .push-xl-2 {
- left: 16.666667%;
- }
- .push-xl-3 {
- left: 25%;
- }
- .push-xl-4 {
- left: 33.333333%;
- }
- .push-xl-5 {
- left: 41.666667%;
- }
- .push-xl-6 {
- left: 50%;
- }
- .push-xl-7 {
- left: 58.333333%;
- }
- .push-xl-8 {
- left: 66.666667%;
- }
- .push-xl-9 {
- left: 75%;
- }
- .push-xl-10 {
- left: 83.333333%;
- }
- .push-xl-11 {
- left: 91.666667%;
- }
- .push-xl-12 {
- left: 100%;
+ -ms-flex: 0 0 100%;
+ flex: 0 0 100%;
+ max-width: 100%;
}
- .offset-xl-0 {
- margin-left: 0%;
+ .order-xl-1 {
+ -ms-flex-order: 1;
+ order: 1;
}
- .offset-xl-1 {
- margin-left: 8.333333%;
+ .order-xl-2 {
+ -ms-flex-order: 2;
+ order: 2;
}
- .offset-xl-2 {
- margin-left: 16.666667%;
+ .order-xl-3 {
+ -ms-flex-order: 3;
+ order: 3;
}
- .offset-xl-3 {
- margin-left: 25%;
+ .order-xl-4 {
+ -ms-flex-order: 4;
+ order: 4;
}
- .offset-xl-4 {
- margin-left: 33.333333%;
+ .order-xl-5 {
+ -ms-flex-order: 5;
+ order: 5;
}
- .offset-xl-5 {
- margin-left: 41.666667%;
+ .order-xl-6 {
+ -ms-flex-order: 6;
+ order: 6;
}
- .offset-xl-6 {
- margin-left: 50%;
+ .order-xl-7 {
+ -ms-flex-order: 7;
+ order: 7;
}
- .offset-xl-7 {
- margin-left: 58.333333%;
+ .order-xl-8 {
+ -ms-flex-order: 8;
+ order: 8;
}
- .offset-xl-8 {
- margin-left: 66.666667%;
+ .order-xl-9 {
+ -ms-flex-order: 9;
+ order: 9;
}
- .offset-xl-9 {
- margin-left: 75%;
+ .order-xl-10 {
+ -ms-flex-order: 10;
+ order: 10;
}
- .offset-xl-10 {
- margin-left: 83.333333%;
+ .order-xl-11 {
+ -ms-flex-order: 11;
+ order: 11;
}
- .offset-xl-11 {
- margin-left: 91.666667%;
+ .order-xl-12 {
+ -ms-flex-order: 12;
+ order: 12;
}
}
@@ -1741,16 +1324,16 @@ pre code {
.table td {
padding: 0.75rem;
vertical-align: top;
- border-top: 1px solid #eceeef;
+ border-top: 1px solid #e9ecef;
}
.table thead th {
vertical-align: bottom;
- border-bottom: 2px solid #eceeef;
+ border-bottom: 2px solid #e9ecef;
}
.table tbody + tbody {
- border-top: 2px solid #eceeef;
+ border-top: 2px solid #e9ecef;
}
.table .table {
@@ -1763,12 +1346,12 @@ pre code {
}
.table-bordered {
- border: 1px solid #eceeef;
+ border: 1px solid #e9ecef;
}
.table-bordered th,
.table-bordered td {
- border: 1px solid #eceeef;
+ border: 1px solid #e9ecef;
}
.table-bordered thead th,
@@ -1784,100 +1367,160 @@ pre code {
background-color: rgba(0, 0, 0, 0.075);
}
-.table-active,
-.table-active > th,
-.table-active > td {
- background-color: rgba(0, 0, 0, 0.075);
+.table-primary,
+.table-primary > th,
+.table-primary > td {
+ background-color: #b8daff;
}
-.table-hover .table-active:hover {
- background-color: rgba(0, 0, 0, 0.075);
+.table-hover .table-primary:hover {
+ background-color: #9fcdff;
}
-.table-hover .table-active:hover > td,
-.table-hover .table-active:hover > th {
- background-color: rgba(0, 0, 0, 0.075);
+.table-hover .table-primary:hover > td,
+.table-hover .table-primary:hover > th {
+ background-color: #9fcdff;
+}
+
+.table-secondary,
+.table-secondary > th,
+.table-secondary > td {
+ background-color: #dddfe2;
+}
+
+.table-hover .table-secondary:hover {
+ background-color: #cfd2d6;
+}
+
+.table-hover .table-secondary:hover > td,
+.table-hover .table-secondary:hover > th {
+ background-color: #cfd2d6;
}
.table-success,
.table-success > th,
.table-success > td {
- background-color: #dff0d8;
+ background-color: #c3e6cb;
}
.table-hover .table-success:hover {
- background-color: #d0e9c6;
+ background-color: #b1dfbb;
}
.table-hover .table-success:hover > td,
.table-hover .table-success:hover > th {
- background-color: #d0e9c6;
+ background-color: #b1dfbb;
}
.table-info,
.table-info > th,
.table-info > td {
- background-color: #d9edf7;
+ background-color: #bee5eb;
}
.table-hover .table-info:hover {
- background-color: #c4e3f3;
+ background-color: #abdde5;
}
.table-hover .table-info:hover > td,
.table-hover .table-info:hover > th {
- background-color: #c4e3f3;
+ background-color: #abdde5;
}
.table-warning,
.table-warning > th,
.table-warning > td {
- background-color: #fcf8e3;
+ background-color: #ffeeba;
}
.table-hover .table-warning:hover {
- background-color: #faf2cc;
+ background-color: #ffe8a1;
}
.table-hover .table-warning:hover > td,
.table-hover .table-warning:hover > th {
- background-color: #faf2cc;
+ background-color: #ffe8a1;
}
.table-danger,
.table-danger > th,
.table-danger > td {
- background-color: #f2dede;
+ background-color: #f5c6cb;
}
.table-hover .table-danger:hover {
- background-color: #ebcccc;
+ background-color: #f1b0b7;
}
.table-hover .table-danger:hover > td,
.table-hover .table-danger:hover > th {
- background-color: #ebcccc;
+ background-color: #f1b0b7;
+}
+
+.table-light,
+.table-light > th,
+.table-light > td {
+ background-color: #fdfdfe;
+}
+
+.table-hover .table-light:hover {
+ background-color: #ececf6;
+}
+
+.table-hover .table-light:hover > td,
+.table-hover .table-light:hover > th {
+ background-color: #ececf6;
+}
+
+.table-dark,
+.table-dark > th,
+.table-dark > td {
+ background-color: #c6c8ca;
+}
+
+.table-hover .table-dark:hover {
+ background-color: #b9bbbe;
+}
+
+.table-hover .table-dark:hover > td,
+.table-hover .table-dark:hover > th {
+ background-color: #b9bbbe;
+}
+
+.table-active,
+.table-active > th,
+.table-active > td {
+ background-color: rgba(0, 0, 0, 0.075);
+}
+
+.table-hover .table-active:hover {
+ background-color: rgba(0, 0, 0, 0.075);
+}
+
+.table-hover .table-active:hover > td,
+.table-hover .table-active:hover > th {
+ background-color: rgba(0, 0, 0, 0.075);
}
.thead-inverse th {
color: #fff;
- background-color: #292b2c;
+ background-color: #212529;
}
.thead-default th {
- color: #464a4c;
- background-color: #eceeef;
+ color: #495057;
+ background-color: #e9ecef;
}
.table-inverse {
color: #fff;
- background-color: #292b2c;
+ background-color: #212529;
}
.table-inverse th,
.table-inverse td,
.table-inverse thead th {
- border-color: #3b3e40;
+ border-color: #32383e;
}
.table-inverse.table-bordered {
@@ -1907,21 +1550,16 @@ pre code {
.form-control {
display: block;
width: 100%;
- padding: 0.5rem 1rem;
+ padding: 0.5rem 0.75rem;
font-size: 1rem;
line-height: 1.25;
- color: #464a4c;
+ color: #495057;
background-color: #fff;
background-image: none;
- -webkit-background-clip: padding-box;
- background-clip: padding-box;
+ background-clip: padding-box;
border: 1px solid rgba(0, 0, 0, 0.15);
border-radius: 0.25rem;
- -webkit-transition: border-color ease-in-out 0.15s, -webkit-box-shadow ease-in-out 0.15s;
- transition: border-color ease-in-out 0.15s, -webkit-box-shadow ease-in-out 0.15s;
- -o-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;
- transition: border-color ease-in-out 0.15s, box-shadow ease-in-out 0.15s, -webkit-box-shadow ease-in-out 0.15s;
}
.form-control::-ms-expand {
@@ -1930,34 +1568,29 @@ pre code {
}
.form-control:focus {
- color: #464a4c;
+ color: #495057;
background-color: #fff;
- border-color: #5cb3fd;
+ border-color: #80bdff;
outline: none;
}
.form-control::-webkit-input-placeholder {
- color: #636c72;
- opacity: 1;
-}
-
-.form-control::-moz-placeholder {
- color: #636c72;
+ color: #868e96;
opacity: 1;
}
.form-control:-ms-input-placeholder {
- color: #636c72;
+ color: #868e96;
opacity: 1;
}
.form-control::placeholder {
- color: #636c72;
+ color: #868e96;
opacity: 1;
}
.form-control:disabled, .form-control[readonly] {
- background-color: #eceeef;
+ background-color: #e9ecef;
opacity: 1;
}
@@ -1966,7 +1599,7 @@ select.form-control:not([size]):not([multiple]) {
}
select.form-control:focus::-ms-value {
- color: #464a4c;
+ color: #495057;
background-color: #fff;
}
@@ -2000,7 +1633,7 @@ select.form-control:focus::-ms-value {
font-size: 1rem;
}
-.form-control-static {
+.form-control-plaintext {
padding-top: 0.5rem;
padding-bottom: 0.5rem;
margin-bottom: 0;
@@ -2009,11 +1642,11 @@ select.form-control:focus::-ms-value {
border-width: 1px 0;
}
-.form-control-static.form-control-sm, .input-group-sm > .form-control-static.form-control,
-.input-group-sm > .form-control-static.input-group-addon,
-.input-group-sm > .input-group-btn > .form-control-static.btn, .form-control-static.form-control-lg, .input-group-lg > .form-control-static.form-control,
-.input-group-lg > .form-control-static.input-group-addon,
-.input-group-lg > .input-group-btn > .form-control-static.btn {
+.form-control-plaintext.form-control-sm, .input-group-sm > .form-control-plaintext.form-control,
+.input-group-sm > .form-control-plaintext.input-group-addon,
+.input-group-sm > .input-group-btn > .form-control-plaintext.btn, .form-control-plaintext.form-control-lg, .input-group-lg > .form-control-plaintext.form-control,
+.input-group-lg > .form-control-plaintext.input-group-addon,
+.input-group-lg > .input-group-btn > .form-control-plaintext.btn {
padding-right: 0;
padding-left: 0;
}
@@ -2045,7 +1678,7 @@ select.form-control-sm:not([size]):not([multiple]), .input-group-sm > select.for
select.form-control-lg:not([size]):not([multiple]), .input-group-lg > select.form-control:not([size]):not([multiple]),
.input-group-lg > select.input-group-addon:not([size]):not([multiple]),
.input-group-lg > .input-group-btn > select.btn:not([size]):not([multiple]) {
- height: calc(2.875rem + 2px);
+ height: calc(2.3125rem + 2px);
}
.form-group {
@@ -2057,6 +1690,21 @@ select.form-control-lg:not([size]):not([multiple]), .input-group-lg > select.for
margin-top: 0.25rem;
}
+.form-row {
+ display: -ms-flexbox;
+ display: flex;
+ -ms-flex-wrap: wrap;
+ flex-wrap: wrap;
+ margin-right: -5px;
+ margin-left: -5px;
+}
+
+.form-row > .col,
+.form-row > [class*="col-"] {
+ padding-right: 5px;
+ padding-left: 5px;
+}
+
.form-check {
position: relative;
display: block;
@@ -2064,7 +1712,7 @@ select.form-control-lg:not([size]):not([multiple]), .input-group-lg > select.for
}
.form-check.disabled .form-check-label {
- color: #636c72;
+ color: #868e96;
}
.form-check-label {
@@ -2094,106 +1742,129 @@ select.form-control-lg:not([size]):not([multiple]), .input-group-lg > select.for
margin-left: 0.75rem;
}
-.form-control-feedback {
- margin-top: 0.25rem;
+.invalid-feedback {
+ display: none;
+ margin-top: .25rem;
+ font-size: .875rem;
+ color: #dc3545;
}
-.form-control-success,
-.form-control-warning,
-.form-control-danger {
- padding-right: 3rem;
- background-repeat: no-repeat;
- background-position: center right 0.5625rem;
- -webkit-background-size: 1.125rem 1.125rem;
- background-size: 1.125rem 1.125rem;
+.invalid-tooltip {
+ position: absolute;
+ top: 100%;
+ z-index: 5;
+ display: none;
+ width: 250px;
+ padding: .5rem;
+ margin-top: .1rem;
+ font-size: .875rem;
+ line-height: 1;
+ color: #fff;
+ background-color: rgba(220, 53, 69, 0.8);
+ border-radius: .2rem;
}
-.has-success .form-control-feedback,
-.has-success .form-control-label,
-.has-success .col-form-label,
-.has-success .form-check-label,
-.has-success .custom-control {
- color: #5cb85c;
+.was-validated .form-control:valid, .form-control.is-valid, .was-validated
+.custom-select:valid,
+.custom-select.is-valid {
+ border-color: #28a745;
}
-.has-success .form-control,
-.has-success .custom-select,
-.has-success .custom-file-control {
- border-color: #5cb85c;
+.was-validated .form-control:valid:focus, .form-control.is-valid:focus, .was-validated
+.custom-select:valid:focus,
+.custom-select.is-valid:focus {
+ box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.25);
}
-.has-success .input-group-addon {
- color: #5cb85c;
- background-color: #eaf6ea;
- border-color: #5cb85c;
+.was-validated .form-control:valid ~ .invalid-feedback,
+.was-validated .form-control:valid ~ .invalid-tooltip, .form-control.is-valid ~ .invalid-feedback,
+.form-control.is-valid ~ .invalid-tooltip, .was-validated
+.custom-select:valid ~ .invalid-feedback,
+.was-validated
+.custom-select:valid ~ .invalid-tooltip,
+.custom-select.is-valid ~ .invalid-feedback,
+.custom-select.is-valid ~ .invalid-tooltip {
+ display: block;
}
-.has-success .form-control-success {
- background-image: url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3E%3Cpath fill='%235cb85c' d='M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3E%3C/svg%3E");
+.was-validated .form-check-input:valid + .form-check-label, .form-check-input.is-valid + .form-check-label {
+ color: #28a745;
}
-.has-warning .form-control-feedback,
-.has-warning .form-control-label,
-.has-warning .col-form-label,
-.has-warning .form-check-label,
-.has-warning .custom-control {
- color: #f0ad4e;
+.was-validated .custom-control-input:valid ~ .custom-control-indicator, .custom-control-input.is-valid ~ .custom-control-indicator {
+ background-color: rgba(40, 167, 69, 0.25);
}
-.has-warning .form-control,
-.has-warning .custom-select,
-.has-warning .custom-file-control {
- border-color: #f0ad4e;
+.was-validated .custom-control-input:valid ~ .custom-control-description, .custom-control-input.is-valid ~ .custom-control-description {
+ color: #28a745;
}
-.has-warning .input-group-addon {
- color: #f0ad4e;
- background-color: white;
- border-color: #f0ad4e;
+.was-validated .custom-file-input:valid ~ .custom-file-control, .custom-file-input.is-valid ~ .custom-file-control {
+ border-color: #28a745;
}
-.has-warning .form-control-warning {
- background-image: url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3E%3Cpath fill='%23f0ad4e' d='M4.4 5.324h-.8v-2.46h.8zm0 1.42h-.8V5.89h.8zM3.76.63L.04 7.075c-.115.2.016.425.26.426h7.397c.242 0 .372-.226.258-.426C6.726 4.924 5.47 2.79 4.253.63c-.113-.174-.39-.174-.494 0z'/%3E%3C/svg%3E");
+.was-validated .custom-file-input:valid ~ .custom-file-control::before, .custom-file-input.is-valid ~ .custom-file-control::before {
+ border-color: inherit;
}
-.has-danger .form-control-feedback,
-.has-danger .form-control-label,
-.has-danger .col-form-label,
-.has-danger .form-check-label,
-.has-danger .custom-control {
- color: #d9534f;
+.was-validated .custom-file-input:valid:focus, .custom-file-input.is-valid:focus {
+ box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.25);
}
-.has-danger .form-control,
-.has-danger .custom-select,
-.has-danger .custom-file-control {
- border-color: #d9534f;
+.was-validated .form-control:invalid, .form-control.is-invalid, .was-validated
+.custom-select:invalid,
+.custom-select.is-invalid {
+ border-color: #dc3545;
}
-.has-danger .input-group-addon {
- color: #d9534f;
- background-color: #fdf7f7;
- border-color: #d9534f;
+.was-validated .form-control:invalid:focus, .form-control.is-invalid:focus, .was-validated
+.custom-select:invalid:focus,
+.custom-select.is-invalid:focus {
+ box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.25);
}
-.has-danger .form-control-danger {
- background-image: url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23d9534f' viewBox='-2 -2 7 7'%3E%3Cpath stroke='%23d9534f' d='M0 0l3 3m0-3L0 3'/%3E%3Ccircle r='.5'/%3E%3Ccircle cx='3' r='.5'/%3E%3Ccircle cy='3' r='.5'/%3E%3Ccircle cx='3' cy='3' r='.5'/%3E%3C/svg%3E");
+.was-validated .form-control:invalid ~ .invalid-feedback,
+.was-validated .form-control:invalid ~ .invalid-tooltip, .form-control.is-invalid ~ .invalid-feedback,
+.form-control.is-invalid ~ .invalid-tooltip, .was-validated
+.custom-select:invalid ~ .invalid-feedback,
+.was-validated
+.custom-select:invalid ~ .invalid-tooltip,
+.custom-select.is-invalid ~ .invalid-feedback,
+.custom-select.is-invalid ~ .invalid-tooltip {
+ display: block;
+}
+
+.was-validated .form-check-input:invalid + .form-check-label, .form-check-input.is-invalid + .form-check-label {
+ color: #dc3545;
+}
+
+.was-validated .custom-control-input:invalid ~ .custom-control-indicator, .custom-control-input.is-invalid ~ .custom-control-indicator {
+ background-color: rgba(220, 53, 69, 0.25);
+}
+
+.was-validated .custom-control-input:invalid ~ .custom-control-description, .custom-control-input.is-invalid ~ .custom-control-description {
+ color: #dc3545;
+}
+
+.was-validated .custom-file-input:invalid ~ .custom-file-control, .custom-file-input.is-invalid ~ .custom-file-control {
+ border-color: #dc3545;
+}
+
+.was-validated .custom-file-input:invalid ~ .custom-file-control::before, .custom-file-input.is-invalid ~ .custom-file-control::before {
+ border-color: inherit;
+}
+
+.was-validated .custom-file-input:invalid:focus, .custom-file-input.is-invalid:focus {
+ box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.25);
}
.form-inline {
- display: -webkit-box;
- display: -webkit-flex;
display: -ms-flexbox;
display: flex;
- -webkit-box-orient: horizontal;
- -webkit-box-direction: normal;
- -webkit-flex-flow: row wrap;
- -ms-flex-flow: row wrap;
- flex-flow: row wrap;
- -webkit-box-align: center;
- -webkit-align-items: center;
- -ms-flex-align: center;
- align-items: center;
+ -ms-flex-flow: row wrap;
+ flex-flow: row wrap;
+ -ms-flex-align: center;
+ align-items: center;
}
.form-inline .form-check {
@@ -2202,38 +1873,23 @@ select.form-control-lg:not([size]):not([multiple]), .input-group-lg > select.for
@media (min-width: 576px) {
.form-inline label {
- display: -webkit-box;
- display: -webkit-flex;
display: -ms-flexbox;
display: flex;
- -webkit-box-align: center;
- -webkit-align-items: center;
- -ms-flex-align: center;
- align-items: center;
- -webkit-box-pack: center;
- -webkit-justify-content: center;
- -ms-flex-pack: center;
- justify-content: center;
+ -ms-flex-align: center;
+ align-items: center;
+ -ms-flex-pack: center;
+ justify-content: center;
margin-bottom: 0;
}
.form-inline .form-group {
- display: -webkit-box;
- display: -webkit-flex;
display: -ms-flexbox;
display: flex;
- -webkit-box-flex: 0;
- -webkit-flex: 0 0 auto;
- -ms-flex: 0 0 auto;
- flex: 0 0 auto;
- -webkit-box-orient: horizontal;
- -webkit-box-direction: normal;
- -webkit-flex-flow: row wrap;
- -ms-flex-flow: row wrap;
- flex-flow: row wrap;
- -webkit-box-align: center;
- -webkit-align-items: center;
- -ms-flex-align: center;
- align-items: center;
+ -ms-flex: 0 0 auto;
+ flex: 0 0 auto;
+ -ms-flex-flow: row wrap;
+ flex-flow: row wrap;
+ -ms-flex-align: center;
+ align-items: center;
margin-bottom: 0;
}
.form-inline .form-control {
@@ -2241,7 +1897,7 @@ select.form-control-lg:not([size]):not([multiple]), .input-group-lg > select.for
width: auto;
vertical-align: middle;
}
- .form-inline .form-control-static {
+ .form-inline .form-control-plaintext {
display: inline-block;
}
.form-inline .input-group {
@@ -2252,18 +1908,12 @@ select.form-control-lg:not([size]):not([multiple]), .input-group-lg > select.for
vertical-align: middle;
}
.form-inline .form-check {
- display: -webkit-box;
- display: -webkit-flex;
display: -ms-flexbox;
display: flex;
- -webkit-box-align: center;
- -webkit-align-items: center;
- -ms-flex-align: center;
- align-items: center;
- -webkit-box-pack: center;
- -webkit-justify-content: center;
- -ms-flex-pack: center;
- justify-content: center;
+ -ms-flex-align: center;
+ align-items: center;
+ -ms-flex-pack: center;
+ justify-content: center;
width: auto;
margin-top: 0;
margin-bottom: 0;
@@ -2278,18 +1928,12 @@ select.form-control-lg:not([size]):not([multiple]), .input-group-lg > select.for
margin-left: 0;
}
.form-inline .custom-control {
- display: -webkit-box;
- display: -webkit-flex;
display: -ms-flexbox;
display: flex;
- -webkit-box-align: center;
- -webkit-align-items: center;
- -ms-flex-align: center;
- align-items: center;
- -webkit-box-pack: center;
- -webkit-justify-content: center;
- -ms-flex-pack: center;
- justify-content: center;
+ -ms-flex-align: center;
+ align-items: center;
+ -ms-flex-pack: center;
+ justify-content: center;
padding-left: 0;
}
.form-inline .custom-control-indicator {
@@ -2314,13 +1958,11 @@ select.form-control-lg:not([size]):not([multiple]), .input-group-lg > select.for
-ms-user-select: none;
user-select: none;
border: 1px solid transparent;
- padding: 0.5rem 1rem;
+ padding: 0.5rem 0.75rem;
font-size: 1rem;
line-height: 1.25;
border-radius: 0.25rem;
- -webkit-transition: all 0.2s ease-in-out;
- -o-transition: all 0.2s ease-in-out;
- transition: all 0.2s ease-in-out;
+ transition: all 0.15s ease-in-out;
}
.btn:focus, .btn:hover {
@@ -2329,8 +1971,7 @@ select.form-control-lg:not([size]):not([multiple]), .input-group-lg > select.for
.btn:focus, .btn.focus {
outline: 0;
- -webkit-box-shadow: 0 0 0 2px rgba(2, 117, 216, 0.25);
- box-shadow: 0 0 0 2px rgba(2, 117, 216, 0.25);
+ box-shadow: 0 0 0 3px rgba(0, 123, 255, 0.25);
}
.btn.disabled, .btn:disabled {
@@ -2348,367 +1989,463 @@ fieldset[disabled] a.btn {
.btn-primary {
color: #fff;
- background-color: #0275d8;
- border-color: #0275d8;
+ background-color: #007bff;
+ border-color: #007bff;
}
.btn-primary:hover {
color: #fff;
- background-color: #025aa5;
- border-color: #01549b;
+ background-color: #0069d9;
+ border-color: #0062cc;
}
.btn-primary:focus, .btn-primary.focus {
- -webkit-box-shadow: 0 0 0 2px rgba(2, 117, 216, 0.5);
- box-shadow: 0 0 0 2px rgba(2, 117, 216, 0.5);
+ box-shadow: 0 0 0 3px rgba(0, 123, 255, 0.5);
}
.btn-primary.disabled, .btn-primary:disabled {
- background-color: #0275d8;
- border-color: #0275d8;
+ background-color: #007bff;
+ border-color: #007bff;
}
.btn-primary:active, .btn-primary.active,
.show > .btn-primary.dropdown-toggle {
- color: #fff;
- background-color: #025aa5;
+ background-color: #0069d9;
background-image: none;
- border-color: #01549b;
+ border-color: #0062cc;
}
.btn-secondary {
- color: #292b2c;
- background-color: #fff;
- border-color: #ccc;
+ color: #fff;
+ background-color: #868e96;
+ border-color: #868e96;
}
.btn-secondary:hover {
- color: #292b2c;
- background-color: #e6e6e6;
- border-color: #adadad;
+ color: #fff;
+ background-color: #727b84;
+ border-color: #6c757d;
}
.btn-secondary:focus, .btn-secondary.focus {
- -webkit-box-shadow: 0 0 0 2px rgba(204, 204, 204, 0.5);
- box-shadow: 0 0 0 2px rgba(204, 204, 204, 0.5);
+ box-shadow: 0 0 0 3px rgba(134, 142, 150, 0.5);
}
.btn-secondary.disabled, .btn-secondary:disabled {
- background-color: #fff;
- border-color: #ccc;
+ background-color: #868e96;
+ border-color: #868e96;
}
.btn-secondary:active, .btn-secondary.active,
.show > .btn-secondary.dropdown-toggle {
- color: #292b2c;
- background-color: #e6e6e6;
+ background-color: #727b84;
background-image: none;
- border-color: #adadad;
+ border-color: #6c757d;
}
-.btn-info {
+.btn-success {
color: #fff;
- background-color: #5bc0de;
- border-color: #5bc0de;
+ background-color: #28a745;
+ border-color: #28a745;
}
-.btn-info:hover {
+.btn-success:hover {
color: #fff;
- background-color: #31b0d5;
- border-color: #2aabd2;
+ background-color: #218838;
+ border-color: #1e7e34;
}
-.btn-info:focus, .btn-info.focus {
- -webkit-box-shadow: 0 0 0 2px rgba(91, 192, 222, 0.5);
- box-shadow: 0 0 0 2px rgba(91, 192, 222, 0.5);
+.btn-success:focus, .btn-success.focus {
+ box-shadow: 0 0 0 3px rgba(40, 167, 69, 0.5);
}
-.btn-info.disabled, .btn-info:disabled {
- background-color: #5bc0de;
- border-color: #5bc0de;
+.btn-success.disabled, .btn-success:disabled {
+ background-color: #28a745;
+ border-color: #28a745;
}
-.btn-info:active, .btn-info.active,
-.show > .btn-info.dropdown-toggle {
- color: #fff;
- background-color: #31b0d5;
+.btn-success:active, .btn-success.active,
+.show > .btn-success.dropdown-toggle {
+ background-color: #218838;
background-image: none;
- border-color: #2aabd2;
+ border-color: #1e7e34;
}
-.btn-success {
+.btn-info {
color: #fff;
- background-color: #5cb85c;
- border-color: #5cb85c;
+ background-color: #17a2b8;
+ border-color: #17a2b8;
}
-.btn-success:hover {
+.btn-info:hover {
color: #fff;
- background-color: #449d44;
- border-color: #419641;
+ background-color: #138496;
+ border-color: #117a8b;
}
-.btn-success:focus, .btn-success.focus {
- -webkit-box-shadow: 0 0 0 2px rgba(92, 184, 92, 0.5);
- box-shadow: 0 0 0 2px rgba(92, 184, 92, 0.5);
+.btn-info:focus, .btn-info.focus {
+ box-shadow: 0 0 0 3px rgba(23, 162, 184, 0.5);
}
-.btn-success.disabled, .btn-success:disabled {
- background-color: #5cb85c;
- border-color: #5cb85c;
+.btn-info.disabled, .btn-info:disabled {
+ background-color: #17a2b8;
+ border-color: #17a2b8;
}
-.btn-success:active, .btn-success.active,
-.show > .btn-success.dropdown-toggle {
- color: #fff;
- background-color: #449d44;
+.btn-info:active, .btn-info.active,
+.show > .btn-info.dropdown-toggle {
+ background-color: #138496;
background-image: none;
- border-color: #419641;
+ border-color: #117a8b;
}
.btn-warning {
- color: #fff;
- background-color: #f0ad4e;
- border-color: #f0ad4e;
+ color: #111;
+ background-color: #ffc107;
+ border-color: #ffc107;
}
.btn-warning:hover {
- color: #fff;
- background-color: #ec971f;
- border-color: #eb9316;
+ color: #111;
+ background-color: #e0a800;
+ border-color: #d39e00;
}
.btn-warning:focus, .btn-warning.focus {
- -webkit-box-shadow: 0 0 0 2px rgba(240, 173, 78, 0.5);
- box-shadow: 0 0 0 2px rgba(240, 173, 78, 0.5);
+ box-shadow: 0 0 0 3px rgba(255, 193, 7, 0.5);
}
.btn-warning.disabled, .btn-warning:disabled {
- background-color: #f0ad4e;
- border-color: #f0ad4e;
+ background-color: #ffc107;
+ border-color: #ffc107;
}
.btn-warning:active, .btn-warning.active,
.show > .btn-warning.dropdown-toggle {
- color: #fff;
- background-color: #ec971f;
+ background-color: #e0a800;
background-image: none;
- border-color: #eb9316;
+ border-color: #d39e00;
}
.btn-danger {
color: #fff;
- background-color: #d9534f;
- border-color: #d9534f;
+ background-color: #dc3545;
+ border-color: #dc3545;
}
.btn-danger:hover {
color: #fff;
- background-color: #c9302c;
- border-color: #c12e2a;
+ background-color: #c82333;
+ border-color: #bd2130;
}
.btn-danger:focus, .btn-danger.focus {
- -webkit-box-shadow: 0 0 0 2px rgba(217, 83, 79, 0.5);
- box-shadow: 0 0 0 2px rgba(217, 83, 79, 0.5);
+ box-shadow: 0 0 0 3px rgba(220, 53, 69, 0.5);
}
.btn-danger.disabled, .btn-danger:disabled {
- background-color: #d9534f;
- border-color: #d9534f;
+ background-color: #dc3545;
+ border-color: #dc3545;
}
.btn-danger:active, .btn-danger.active,
.show > .btn-danger.dropdown-toggle {
+ background-color: #c82333;
+ background-image: none;
+ border-color: #bd2130;
+}
+
+.btn-light {
+ color: #111;
+ background-color: #f8f9fa;
+ border-color: #f8f9fa;
+}
+
+.btn-light:hover {
+ color: #111;
+ background-color: #e2e6ea;
+ border-color: #dae0e5;
+}
+
+.btn-light:focus, .btn-light.focus {
+ box-shadow: 0 0 0 3px rgba(248, 249, 250, 0.5);
+}
+
+.btn-light.disabled, .btn-light:disabled {
+ background-color: #f8f9fa;
+ border-color: #f8f9fa;
+}
+
+.btn-light:active, .btn-light.active,
+.show > .btn-light.dropdown-toggle {
+ background-color: #e2e6ea;
+ background-image: none;
+ border-color: #dae0e5;
+}
+
+.btn-dark {
+ color: #fff;
+ background-color: #343a40;
+ border-color: #343a40;
+}
+
+.btn-dark:hover {
color: #fff;
- background-color: #c9302c;
+ background-color: #23272b;
+ border-color: #1d2124;
+}
+
+.btn-dark:focus, .btn-dark.focus {
+ box-shadow: 0 0 0 3px rgba(52, 58, 64, 0.5);
+}
+
+.btn-dark.disabled, .btn-dark:disabled {
+ background-color: #343a40;
+ border-color: #343a40;
+}
+
+.btn-dark:active, .btn-dark.active,
+.show > .btn-dark.dropdown-toggle {
+ background-color: #23272b;
background-image: none;
- border-color: #c12e2a;
+ border-color: #1d2124;
}
.btn-outline-primary {
- color: #0275d8;
+ color: #007bff;
background-color: transparent;
background-image: none;
- border-color: #0275d8;
+ border-color: #007bff;
}
.btn-outline-primary:hover {
color: #fff;
- background-color: #0275d8;
- border-color: #0275d8;
+ background-color: #007bff;
+ border-color: #007bff;
}
.btn-outline-primary:focus, .btn-outline-primary.focus {
- -webkit-box-shadow: 0 0 0 2px rgba(2, 117, 216, 0.5);
- box-shadow: 0 0 0 2px rgba(2, 117, 216, 0.5);
+ box-shadow: 0 0 0 3px rgba(0, 123, 255, 0.5);
}
.btn-outline-primary.disabled, .btn-outline-primary:disabled {
- color: #0275d8;
+ color: #007bff;
background-color: transparent;
}
.btn-outline-primary:active, .btn-outline-primary.active,
.show > .btn-outline-primary.dropdown-toggle {
color: #fff;
- background-color: #0275d8;
- border-color: #0275d8;
+ background-color: #007bff;
+ border-color: #007bff;
}
.btn-outline-secondary {
- color: #ccc;
+ color: #868e96;
background-color: transparent;
background-image: none;
- border-color: #ccc;
+ border-color: #868e96;
}
.btn-outline-secondary:hover {
- color: #292b2c;
- background-color: #ccc;
- border-color: #ccc;
+ color: #fff;
+ background-color: #868e96;
+ border-color: #868e96;
}
.btn-outline-secondary:focus, .btn-outline-secondary.focus {
- -webkit-box-shadow: 0 0 0 2px rgba(204, 204, 204, 0.5);
- box-shadow: 0 0 0 2px rgba(204, 204, 204, 0.5);
+ box-shadow: 0 0 0 3px rgba(134, 142, 150, 0.5);
}
.btn-outline-secondary.disabled, .btn-outline-secondary:disabled {
- color: #ccc;
+ color: #868e96;
background-color: transparent;
}
.btn-outline-secondary:active, .btn-outline-secondary.active,
.show > .btn-outline-secondary.dropdown-toggle {
- color: #292b2c;
- background-color: #ccc;
- border-color: #ccc;
+ color: #fff;
+ background-color: #868e96;
+ border-color: #868e96;
}
-.btn-outline-info {
- color: #5bc0de;
+.btn-outline-success {
+ color: #28a745;
background-color: transparent;
background-image: none;
- border-color: #5bc0de;
+ border-color: #28a745;
}
-.btn-outline-info:hover {
+.btn-outline-success:hover {
color: #fff;
- background-color: #5bc0de;
- border-color: #5bc0de;
+ background-color: #28a745;
+ border-color: #28a745;
}
-.btn-outline-info:focus, .btn-outline-info.focus {
- -webkit-box-shadow: 0 0 0 2px rgba(91, 192, 222, 0.5);
- box-shadow: 0 0 0 2px rgba(91, 192, 222, 0.5);
+.btn-outline-success:focus, .btn-outline-success.focus {
+ box-shadow: 0 0 0 3px rgba(40, 167, 69, 0.5);
}
-.btn-outline-info.disabled, .btn-outline-info:disabled {
- color: #5bc0de;
+.btn-outline-success.disabled, .btn-outline-success:disabled {
+ color: #28a745;
background-color: transparent;
}
-.btn-outline-info:active, .btn-outline-info.active,
-.show > .btn-outline-info.dropdown-toggle {
+.btn-outline-success:active, .btn-outline-success.active,
+.show > .btn-outline-success.dropdown-toggle {
color: #fff;
- background-color: #5bc0de;
- border-color: #5bc0de;
+ background-color: #28a745;
+ border-color: #28a745;
}
-.btn-outline-success {
- color: #5cb85c;
+.btn-outline-info {
+ color: #17a2b8;
background-color: transparent;
background-image: none;
- border-color: #5cb85c;
+ border-color: #17a2b8;
}
-.btn-outline-success:hover {
+.btn-outline-info:hover {
color: #fff;
- background-color: #5cb85c;
- border-color: #5cb85c;
+ background-color: #17a2b8;
+ border-color: #17a2b8;
}
-.btn-outline-success:focus, .btn-outline-success.focus {
- -webkit-box-shadow: 0 0 0 2px rgba(92, 184, 92, 0.5);
- box-shadow: 0 0 0 2px rgba(92, 184, 92, 0.5);
+.btn-outline-info:focus, .btn-outline-info.focus {
+ box-shadow: 0 0 0 3px rgba(23, 162, 184, 0.5);
}
-.btn-outline-success.disabled, .btn-outline-success:disabled {
- color: #5cb85c;
+.btn-outline-info.disabled, .btn-outline-info:disabled {
+ color: #17a2b8;
background-color: transparent;
}
-.btn-outline-success:active, .btn-outline-success.active,
-.show > .btn-outline-success.dropdown-toggle {
+.btn-outline-info:active, .btn-outline-info.active,
+.show > .btn-outline-info.dropdown-toggle {
color: #fff;
- background-color: #5cb85c;
- border-color: #5cb85c;
+ background-color: #17a2b8;
+ border-color: #17a2b8;
}
.btn-outline-warning {
- color: #f0ad4e;
+ color: #ffc107;
background-color: transparent;
background-image: none;
- border-color: #f0ad4e;
+ border-color: #ffc107;
}
.btn-outline-warning:hover {
color: #fff;
- background-color: #f0ad4e;
- border-color: #f0ad4e;
+ background-color: #ffc107;
+ border-color: #ffc107;
}
.btn-outline-warning:focus, .btn-outline-warning.focus {
- -webkit-box-shadow: 0 0 0 2px rgba(240, 173, 78, 0.5);
- box-shadow: 0 0 0 2px rgba(240, 173, 78, 0.5);
+ box-shadow: 0 0 0 3px rgba(255, 193, 7, 0.5);
}
.btn-outline-warning.disabled, .btn-outline-warning:disabled {
- color: #f0ad4e;
+ color: #ffc107;
background-color: transparent;
}
.btn-outline-warning:active, .btn-outline-warning.active,
.show > .btn-outline-warning.dropdown-toggle {
color: #fff;
- background-color: #f0ad4e;
- border-color: #f0ad4e;
+ background-color: #ffc107;
+ border-color: #ffc107;
}
.btn-outline-danger {
- color: #d9534f;
+ color: #dc3545;
background-color: transparent;
background-image: none;
- border-color: #d9534f;
+ border-color: #dc3545;
}
.btn-outline-danger:hover {
color: #fff;
- background-color: #d9534f;
- border-color: #d9534f;
+ background-color: #dc3545;
+ border-color: #dc3545;
}
.btn-outline-danger:focus, .btn-outline-danger.focus {
- -webkit-box-shadow: 0 0 0 2px rgba(217, 83, 79, 0.5);
- box-shadow: 0 0 0 2px rgba(217, 83, 79, 0.5);
+ box-shadow: 0 0 0 3px rgba(220, 53, 69, 0.5);
}
.btn-outline-danger.disabled, .btn-outline-danger:disabled {
- color: #d9534f;
+ color: #dc3545;
background-color: transparent;
}
.btn-outline-danger:active, .btn-outline-danger.active,
.show > .btn-outline-danger.dropdown-toggle {
color: #fff;
- background-color: #d9534f;
- border-color: #d9534f;
+ background-color: #dc3545;
+ border-color: #dc3545;
+}
+
+.btn-outline-light {
+ color: #f8f9fa;
+ background-color: transparent;
+ background-image: none;
+ border-color: #f8f9fa;
+}
+
+.btn-outline-light:hover {
+ color: #fff;
+ background-color: #f8f9fa;
+ border-color: #f8f9fa;
+}
+
+.btn-outline-light:focus, .btn-outline-light.focus {
+ box-shadow: 0 0 0 3px rgba(248, 249, 250, 0.5);
+}
+
+.btn-outline-light.disabled, .btn-outline-light:disabled {
+ color: #f8f9fa;
+ background-color: transparent;
+}
+
+.btn-outline-light:active, .btn-outline-light.active,
+.show > .btn-outline-light.dropdown-toggle {
+ color: #fff;
+ background-color: #f8f9fa;
+ border-color: #f8f9fa;
+}
+
+.btn-outline-dark {
+ color: #343a40;
+ background-color: transparent;
+ background-image: none;
+ border-color: #343a40;
+}
+
+.btn-outline-dark:hover {
+ color: #fff;
+ background-color: #343a40;
+ border-color: #343a40;
+}
+
+.btn-outline-dark:focus, .btn-outline-dark.focus {
+ box-shadow: 0 0 0 3px rgba(52, 58, 64, 0.5);
+}
+
+.btn-outline-dark.disabled, .btn-outline-dark:disabled {
+ color: #343a40;
+ background-color: transparent;
+}
+
+.btn-outline-dark:active, .btn-outline-dark.active,
+.show > .btn-outline-dark.dropdown-toggle {
+ color: #fff;
+ background-color: #343a40;
+ border-color: #343a40;
}
.btn-link {
font-weight: normal;
- color: #0275d8;
+ color: #007bff;
border-radius: 0;
}
@@ -2718,6 +2455,7 @@ fieldset[disabled] a.btn {
.btn-link, .btn-link:focus, .btn-link:active {
border-color: transparent;
+ box-shadow: none;
}
.btn-link:hover {
@@ -2725,13 +2463,13 @@ fieldset[disabled] a.btn {
}
.btn-link:focus, .btn-link:hover {
- color: #014c8c;
+ color: #0056b3;
text-decoration: underline;
background-color: transparent;
}
.btn-link:disabled {
- color: #636c72;
+ color: #868e96;
}
.btn-link:disabled:focus, .btn-link:disabled:hover {
@@ -2769,8 +2507,6 @@ input[type="button"].btn-block {
.fade {
opacity: 0;
- -webkit-transition: opacity 0.15s linear;
- -o-transition: opacity 0.15s linear;
transition: opacity 0.15s linear;
}
@@ -2798,8 +2534,6 @@ tbody.collapse.show {
position: relative;
height: 0;
overflow: hidden;
- -webkit-transition: height 0.35s ease;
- -o-transition: height 0.35s ease;
transition: height 0.35s ease;
}
@@ -2812,8 +2546,8 @@ tbody.collapse.show {
display: inline-block;
width: 0;
height: 0;
- margin-left: 0.3em;
- vertical-align: middle;
+ margin-left: 0.255em;
+ vertical-align: 0.255em;
content: "";
border-top: 0.3em solid;
border-right: 0.3em solid transparent;
@@ -2824,6 +2558,11 @@ tbody.collapse.show {
margin-left: 0;
}
+.dropup .dropdown-menu {
+ margin-top: 0;
+ margin-bottom: 0.125rem;
+}
+
.dropup .dropdown-toggle::after {
border-top: 0;
border-bottom: 0.3em solid;
@@ -2840,12 +2579,11 @@ tbody.collapse.show {
padding: 0.5rem 0;
margin: 0.125rem 0 0;
font-size: 1rem;
- color: #292b2c;
+ color: #212529;
text-align: left;
list-style: none;
background-color: #fff;
- -webkit-background-clip: padding-box;
- background-clip: padding-box;
+ background-clip: padding-box;
border: 1px solid rgba(0, 0, 0, 0.15);
border-radius: 0.25rem;
}
@@ -2854,7 +2592,7 @@ tbody.collapse.show {
height: 0;
margin: 0.5rem 0;
overflow: hidden;
- border-top: 1px solid #eceeef;
+ border-top: 1px solid #e9ecef;
}
.dropdown-item {
@@ -2863,7 +2601,7 @@ tbody.collapse.show {
padding: 0.25rem 1.5rem;
clear: both;
font-weight: normal;
- color: #292b2c;
+ color: #212529;
text-align: inherit;
white-space: nowrap;
background: none;
@@ -2871,38 +2609,28 @@ tbody.collapse.show {
}
.dropdown-item:focus, .dropdown-item:hover {
- color: #1d1e1f;
+ color: #16181b;
text-decoration: none;
- background-color: #f7f7f9;
+ background-color: #f8f9fa;
}
.dropdown-item.active, .dropdown-item:active {
color: #fff;
text-decoration: none;
- background-color: #0275d8;
+ background-color: #007bff;
}
.dropdown-item.disabled, .dropdown-item:disabled {
- color: #636c72;
+ color: #868e96;
background-color: transparent;
}
-.show > .dropdown-menu {
- display: block;
-}
-
.show > a {
outline: 0;
}
-.dropdown-menu-right {
- right: 0;
- left: auto;
-}
-
-.dropdown-menu-left {
- right: auto;
- left: 0;
+.dropdown-menu.show {
+ display: block;
}
.dropdown-header {
@@ -2910,21 +2638,13 @@ tbody.collapse.show {
padding: 0.5rem 1.5rem;
margin-bottom: 0;
font-size: 0.875rem;
- color: #636c72;
+ color: #868e96;
white-space: nowrap;
}
-.dropup .dropdown-menu {
- top: auto;
- bottom: 100%;
- margin-bottom: 0.125rem;
-}
-
.btn-group,
.btn-group-vertical {
position: relative;
- display: -webkit-inline-box;
- display: -webkit-inline-flex;
display: -ms-inline-flexbox;
display: inline-flex;
vertical-align: middle;
@@ -2933,10 +2653,8 @@ tbody.collapse.show {
.btn-group > .btn,
.btn-group-vertical > .btn {
position: relative;
- -webkit-box-flex: 0;
- -webkit-flex: 0 1 auto;
- -ms-flex: 0 1 auto;
- flex: 0 1 auto;
+ -ms-flex: 0 1 auto;
+ flex: 0 1 auto;
margin-bottom: 0;
}
@@ -2964,17 +2682,12 @@ tbody.collapse.show {
}
.btn-toolbar {
- display: -webkit-box;
- display: -webkit-flex;
display: -ms-flexbox;
display: flex;
- -webkit-flex-wrap: wrap;
- -ms-flex-wrap: wrap;
- flex-wrap: wrap;
- -webkit-box-pack: start;
- -webkit-justify-content: flex-start;
- -ms-flex-pack: start;
- justify-content: flex-start;
+ -ms-flex-wrap: wrap;
+ flex-wrap: wrap;
+ -ms-flex-pack: start;
+ justify-content: flex-start;
}
.btn-toolbar .input-group {
@@ -3020,8 +2733,8 @@ tbody.collapse.show {
}
.btn + .dropdown-toggle-split {
- padding-right: 0.75rem;
- padding-left: 0.75rem;
+ padding-right: 0.5625rem;
+ padding-left: 0.5625rem;
}
.btn + .dropdown-toggle-split::after {
@@ -3039,23 +2752,14 @@ tbody.collapse.show {
}
.btn-group-vertical {
- display: -webkit-inline-box;
- display: -webkit-inline-flex;
display: -ms-inline-flexbox;
display: inline-flex;
- -webkit-box-orient: vertical;
- -webkit-box-direction: normal;
- -webkit-flex-direction: column;
- -ms-flex-direction: column;
- flex-direction: column;
- -webkit-box-align: start;
- -webkit-align-items: flex-start;
- -ms-flex-align: start;
- align-items: flex-start;
- -webkit-box-pack: center;
- -webkit-justify-content: center;
- -ms-flex-pack: center;
- justify-content: center;
+ -ms-flex-direction: column;
+ flex-direction: column;
+ -ms-flex-align: start;
+ align-items: flex-start;
+ -ms-flex-pack: center;
+ justify-content: center;
}
.btn-group-vertical .btn,
@@ -3111,8 +2815,6 @@ tbody.collapse.show {
.input-group {
position: relative;
- display: -webkit-box;
- display: -webkit-flex;
display: -ms-flexbox;
display: flex;
width: 100%;
@@ -3121,10 +2823,8 @@ tbody.collapse.show {
.input-group .form-control {
position: relative;
z-index: 2;
- -webkit-box-flex: 1;
- -webkit-flex: 1 1 auto;
- -ms-flex: 1 1 auto;
- flex: 1 1 auto;
+ -ms-flex: 1 1 auto;
+ flex: 1 1 auto;
width: 1%;
margin-bottom: 0;
}
@@ -3136,14 +2836,10 @@ tbody.collapse.show {
.input-group-addon,
.input-group-btn,
.input-group .form-control {
- display: -webkit-box;
- display: -webkit-flex;
display: -ms-flexbox;
display: flex;
- -webkit-box-align: center;
- -webkit-align-items: center;
- -ms-flex-align: center;
- align-items: center;
+ -ms-flex-align: center;
+ align-items: center;
}
.input-group-addon:not(:first-child):not(:last-child),
@@ -3159,14 +2855,14 @@ tbody.collapse.show {
}
.input-group-addon {
- padding: 0.5rem 1rem;
+ padding: 0.5rem 0.75rem;
margin-bottom: 0;
font-size: 1rem;
font-weight: normal;
line-height: 1.25;
- color: #464a4c;
+ color: #495057;
text-align: center;
- background-color: #eceeef;
+ background-color: #e9ecef;
border: 1px solid rgba(0, 0, 0, 0.15);
border-radius: 0.25rem;
}
@@ -3260,8 +2956,6 @@ tbody.collapse.show {
.custom-control {
position: relative;
- display: -webkit-inline-box;
- display: -webkit-inline-flex;
display: -ms-inline-flexbox;
display: inline-flex;
min-height: 1.5rem;
@@ -3277,25 +2971,24 @@ tbody.collapse.show {
.custom-control-input:checked ~ .custom-control-indicator {
color: #fff;
- background-color: #0275d8;
+ background-color: #007bff;
}
.custom-control-input:focus ~ .custom-control-indicator {
- -webkit-box-shadow: 0 0 0 1px #fff, 0 0 0 3px #0275d8;
- box-shadow: 0 0 0 1px #fff, 0 0 0 3px #0275d8;
+ box-shadow: 0 0 0 1px #fff, 0 0 0 3px #007bff;
}
.custom-control-input:active ~ .custom-control-indicator {
color: #fff;
- background-color: #8fcafe;
+ background-color: #b3d7ff;
}
.custom-control-input:disabled ~ .custom-control-indicator {
- background-color: #eceeef;
+ background-color: #e9ecef;
}
.custom-control-input:disabled ~ .custom-control-description {
- color: #636c72;
+ color: #868e96;
}
.custom-control-indicator {
@@ -3313,8 +3006,7 @@ tbody.collapse.show {
background-color: #ddd;
background-repeat: no-repeat;
background-position: center center;
- -webkit-background-size: 50% 50%;
- background-size: 50% 50%;
+ background-size: 50% 50%;
}
.custom-checkbox .custom-control-indicator {
@@ -3326,7 +3018,7 @@ tbody.collapse.show {
}
.custom-checkbox .custom-control-input:indeterminate ~ .custom-control-indicator {
- background-color: #0275d8;
+ background-color: #007bff;
background-image: url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 4'%3E%3Cpath stroke='%23fff' d='M0 2h4'/%3E%3C/svg%3E");
}
@@ -3339,15 +3031,10 @@ tbody.collapse.show {
}
.custom-controls-stacked {
- display: -webkit-box;
- display: -webkit-flex;
display: -ms-flexbox;
display: flex;
- -webkit-box-orient: vertical;
- -webkit-box-direction: normal;
- -webkit-flex-direction: column;
- -ms-flex-direction: column;
- flex-direction: column;
+ -ms-flex-direction: column;
+ flex-direction: column;
}
.custom-controls-stacked .custom-control {
@@ -3364,11 +3051,10 @@ tbody.collapse.show {
height: calc(2.25rem + 2px);
padding: 0.375rem 1.75rem 0.375rem 0.75rem;
line-height: 1.25;
- color: #464a4c;
+ color: #495057;
vertical-align: middle;
background: #fff url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 5'%3E%3Cpath fill='%23333' d='M2 0L0 2h4zm0 5L0 3h4z'/%3E%3C/svg%3E") no-repeat right 0.75rem center;
- -webkit-background-size: 8px 10px;
- background-size: 8px 10px;
+ background-size: 8px 10px;
border: 1px solid rgba(0, 0, 0, 0.15);
border-radius: 0.25rem;
-webkit-appearance: none;
@@ -3377,18 +3063,18 @@ tbody.collapse.show {
}
.custom-select:focus {
- border-color: #5cb3fd;
+ border-color: #80bdff;
outline: none;
}
.custom-select:focus::-ms-value {
- color: #464a4c;
+ color: #495057;
background-color: #fff;
}
.custom-select:disabled {
- color: #636c72;
- background-color: #eceeef;
+ color: #868e96;
+ background-color: #e9ecef;
}
.custom-select::-ms-expand {
@@ -3396,6 +3082,7 @@ tbody.collapse.show {
}
.custom-select-sm {
+ height: calc(1.8125rem + 2px);
padding-top: 0.375rem;
padding-bottom: 0.375rem;
font-size: 75%;
@@ -3426,7 +3113,7 @@ tbody.collapse.show {
height: 2.5rem;
padding: 0.5rem 1rem;
line-height: 1.5;
- color: #464a4c;
+ color: #495057;
pointer-events: none;
-webkit-user-select: none;
-moz-user-select: none;
@@ -3451,8 +3138,8 @@ tbody.collapse.show {
height: 2.5rem;
padding: 0.5rem 1rem;
line-height: 1.5;
- color: #464a4c;
- background-color: #eceeef;
+ color: #495057;
+ background-color: #e9ecef;
border: 1px solid rgba(0, 0, 0, 0.15);
border-radius: 0 0.25rem 0.25rem 0;
}
@@ -3462,13 +3149,10 @@ tbody.collapse.show {
}
.nav {
- display: -webkit-box;
- display: -webkit-flex;
display: -ms-flexbox;
display: flex;
- -webkit-flex-wrap: wrap;
- -ms-flex-wrap: wrap;
- flex-wrap: wrap;
+ -ms-flex-wrap: wrap;
+ flex-wrap: wrap;
padding-left: 0;
margin-bottom: 0;
list-style: none;
@@ -3484,7 +3168,7 @@ tbody.collapse.show {
}
.nav-link.disabled {
- color: #636c72;
+ color: #868e96;
}
.nav-tabs {
@@ -3502,18 +3186,18 @@ tbody.collapse.show {
}
.nav-tabs .nav-link:focus, .nav-tabs .nav-link:hover {
- border-color: #eceeef #eceeef #ddd;
+ border-color: #e9ecef #e9ecef #ddd;
}
.nav-tabs .nav-link.disabled {
- color: #636c72;
+ color: #868e96;
background-color: transparent;
border-color: transparent;
}
.nav-tabs .nav-link.active,
.nav-tabs .nav-item.show .nav-link {
- color: #464a4c;
+ color: #495057;
background-color: #fff;
border-color: #ddd #ddd #fff;
}
@@ -3529,27 +3213,22 @@ tbody.collapse.show {
}
.nav-pills .nav-link.active,
-.show .nav-pills .nav-link {
+.show > .nav-pills .nav-link {
color: #fff;
- background-color: #0275d8;
+ background-color: #007bff;
}
.nav-fill .nav-item {
- -webkit-box-flex: 1;
- -webkit-flex: 1 1 auto;
- -ms-flex: 1 1 auto;
- flex: 1 1 auto;
+ -ms-flex: 1 1 auto;
+ flex: 1 1 auto;
text-align: center;
}
.nav-justified .nav-item {
- -webkit-flex-basis: 0;
- -ms-flex-preferred-size: 0;
- flex-basis: 0;
- -webkit-box-flex: 1;
- -webkit-flex-grow: 1;
- -ms-flex-positive: 1;
- flex-grow: 1;
+ -ms-flex-preferred-size: 0;
+ flex-basis: 0;
+ -ms-flex-positive: 1;
+ flex-grow: 1;
text-align: center;
}
@@ -3563,50 +3242,27 @@ tbody.collapse.show {
.navbar {
position: relative;
- display: -webkit-box;
- display: -webkit-flex;
display: -ms-flexbox;
display: flex;
- -webkit-flex-wrap: wrap;
- -ms-flex-wrap: wrap;
- flex-wrap: wrap;
- -webkit-box-align: center;
- -webkit-align-items: center;
- -ms-flex-align: center;
- align-items: center;
- -webkit-box-pack: justify;
- -webkit-justify-content: space-between;
- -ms-flex-pack: justify;
- justify-content: space-between;
+ -ms-flex-wrap: wrap;
+ flex-wrap: wrap;
+ -ms-flex-align: center;
+ align-items: center;
+ -ms-flex-pack: justify;
+ justify-content: space-between;
padding: 0.5rem 1rem;
}
.navbar > .container,
.navbar > .container-fluid {
- display: -webkit-box;
- display: -webkit-flex;
display: -ms-flexbox;
display: flex;
- -webkit-flex-wrap: wrap;
- -ms-flex-wrap: wrap;
- flex-wrap: wrap;
- -webkit-box-align: center;
- -webkit-align-items: center;
- -ms-flex-align: center;
- align-items: center;
- -webkit-box-pack: justify;
- -webkit-justify-content: space-between;
- -ms-flex-pack: justify;
- justify-content: space-between;
-}
-
-@media (max-width: 575px) {
- .navbar > .container,
- .navbar > .container-fluid {
- width: 100%;
- margin-right: 0;
- margin-left: 0;
- }
+ -ms-flex-wrap: wrap;
+ flex-wrap: wrap;
+ -ms-flex-align: center;
+ align-items: center;
+ -ms-flex-pack: justify;
+ justify-content: space-between;
}
.navbar-brand {
@@ -3624,15 +3280,10 @@ tbody.collapse.show {
}
.navbar-nav {
- display: -webkit-box;
- display: -webkit-flex;
display: -ms-flexbox;
display: flex;
- -webkit-box-orient: vertical;
- -webkit-box-direction: normal;
- -webkit-flex-direction: column;
- -ms-flex-direction: column;
- flex-direction: column;
+ -ms-flex-direction: column;
+ flex-direction: column;
padding-left: 0;
margin-bottom: 0;
list-style: none;
@@ -3643,6 +3294,11 @@ tbody.collapse.show {
padding-left: 0;
}
+.navbar-nav .dropdown-menu {
+ position: static;
+ float: none;
+}
+
.navbar-text {
display: inline-block;
padding-top: 0.5rem;
@@ -3650,9 +3306,10 @@ tbody.collapse.show {
}
.navbar-collapse {
- -webkit-flex-basis: 100%;
- -ms-flex-preferred-size: 100%;
- flex-basis: 100%;
+ -ms-flex-preferred-size: 100%;
+ flex-basis: 100%;
+ -ms-flex-align: center;
+ align-items: center;
}
.navbar-toggler {
@@ -3675,15 +3332,10 @@ tbody.collapse.show {
vertical-align: middle;
content: "";
background: no-repeat center center;
- -webkit-background-size: 100% 100%;
- background-size: 100% 100%;
+ background-size: 100% 100%;
}
@media (max-width: 575px) {
- .navbar-expand-sm .navbar-nav .dropdown-menu {
- position: static;
- float: none;
- }
.navbar-expand-sm > .container,
.navbar-expand-sm > .container-fluid {
padding-right: 0;
@@ -3693,42 +3345,34 @@ tbody.collapse.show {
@media (min-width: 576px) {
.navbar-expand-sm {
- -webkit-box-orient: horizontal;
- -webkit-box-direction: normal;
- -webkit-flex-direction: row;
- -ms-flex-direction: row;
- flex-direction: row;
- -webkit-flex-wrap: nowrap;
- -ms-flex-wrap: nowrap;
- flex-wrap: nowrap;
- -webkit-box-pack: start;
- -webkit-justify-content: flex-start;
- -ms-flex-pack: start;
- justify-content: flex-start;
+ -ms-flex-direction: row;
+ flex-direction: row;
+ -ms-flex-wrap: nowrap;
+ flex-wrap: nowrap;
+ -ms-flex-pack: start;
+ justify-content: flex-start;
}
.navbar-expand-sm .navbar-nav {
- -webkit-box-orient: horizontal;
- -webkit-box-direction: normal;
- -webkit-flex-direction: row;
- -ms-flex-direction: row;
- flex-direction: row;
+ -ms-flex-direction: row;
+ flex-direction: row;
}
.navbar-expand-sm .navbar-nav .dropdown-menu {
position: absolute;
}
+ .navbar-expand-sm .navbar-nav .dropdown-menu-right {
+ right: 0;
+ left: auto;
+ }
.navbar-expand-sm .navbar-nav .nav-link {
padding-right: .5rem;
padding-left: .5rem;
}
.navbar-expand-sm > .container,
.navbar-expand-sm > .container-fluid {
- -webkit-flex-wrap: nowrap;
- -ms-flex-wrap: nowrap;
- flex-wrap: nowrap;
+ -ms-flex-wrap: nowrap;
+ flex-wrap: nowrap;
}
.navbar-expand-sm .navbar-collapse {
- display: -webkit-box !important;
- display: -webkit-flex !important;
display: -ms-flexbox !important;
display: flex !important;
}
@@ -3738,10 +3382,6 @@ tbody.collapse.show {
}
@media (max-width: 767px) {
- .navbar-expand-md .navbar-nav .dropdown-menu {
- position: static;
- float: none;
- }
.navbar-expand-md > .container,
.navbar-expand-md > .container-fluid {
padding-right: 0;
@@ -3751,42 +3391,34 @@ tbody.collapse.show {
@media (min-width: 768px) {
.navbar-expand-md {
- -webkit-box-orient: horizontal;
- -webkit-box-direction: normal;
- -webkit-flex-direction: row;
- -ms-flex-direction: row;
- flex-direction: row;
- -webkit-flex-wrap: nowrap;
- -ms-flex-wrap: nowrap;
- flex-wrap: nowrap;
- -webkit-box-pack: start;
- -webkit-justify-content: flex-start;
- -ms-flex-pack: start;
- justify-content: flex-start;
+ -ms-flex-direction: row;
+ flex-direction: row;
+ -ms-flex-wrap: nowrap;
+ flex-wrap: nowrap;
+ -ms-flex-pack: start;
+ justify-content: flex-start;
}
.navbar-expand-md .navbar-nav {
- -webkit-box-orient: horizontal;
- -webkit-box-direction: normal;
- -webkit-flex-direction: row;
- -ms-flex-direction: row;
- flex-direction: row;
+ -ms-flex-direction: row;
+ flex-direction: row;
}
.navbar-expand-md .navbar-nav .dropdown-menu {
position: absolute;
}
+ .navbar-expand-md .navbar-nav .dropdown-menu-right {
+ right: 0;
+ left: auto;
+ }
.navbar-expand-md .navbar-nav .nav-link {
padding-right: .5rem;
padding-left: .5rem;
}
.navbar-expand-md > .container,
.navbar-expand-md > .container-fluid {
- -webkit-flex-wrap: nowrap;
- -ms-flex-wrap: nowrap;
- flex-wrap: nowrap;
+ -ms-flex-wrap: nowrap;
+ flex-wrap: nowrap;
}
.navbar-expand-md .navbar-collapse {
- display: -webkit-box !important;
- display: -webkit-flex !important;
display: -ms-flexbox !important;
display: flex !important;
}
@@ -3796,10 +3428,6 @@ tbody.collapse.show {
}
@media (max-width: 991px) {
- .navbar-expand-lg .navbar-nav .dropdown-menu {
- position: static;
- float: none;
- }
.navbar-expand-lg > .container,
.navbar-expand-lg > .container-fluid {
padding-right: 0;
@@ -3809,42 +3437,34 @@ tbody.collapse.show {
@media (min-width: 992px) {
.navbar-expand-lg {
- -webkit-box-orient: horizontal;
- -webkit-box-direction: normal;
- -webkit-flex-direction: row;
- -ms-flex-direction: row;
- flex-direction: row;
- -webkit-flex-wrap: nowrap;
- -ms-flex-wrap: nowrap;
- flex-wrap: nowrap;
- -webkit-box-pack: start;
- -webkit-justify-content: flex-start;
- -ms-flex-pack: start;
- justify-content: flex-start;
+ -ms-flex-direction: row;
+ flex-direction: row;
+ -ms-flex-wrap: nowrap;
+ flex-wrap: nowrap;
+ -ms-flex-pack: start;
+ justify-content: flex-start;
}
.navbar-expand-lg .navbar-nav {
- -webkit-box-orient: horizontal;
- -webkit-box-direction: normal;
- -webkit-flex-direction: row;
- -ms-flex-direction: row;
- flex-direction: row;
+ -ms-flex-direction: row;
+ flex-direction: row;
}
.navbar-expand-lg .navbar-nav .dropdown-menu {
position: absolute;
}
+ .navbar-expand-lg .navbar-nav .dropdown-menu-right {
+ right: 0;
+ left: auto;
+ }
.navbar-expand-lg .navbar-nav .nav-link {
padding-right: .5rem;
padding-left: .5rem;
}
.navbar-expand-lg > .container,
.navbar-expand-lg > .container-fluid {
- -webkit-flex-wrap: nowrap;
- -ms-flex-wrap: nowrap;
- flex-wrap: nowrap;
+ -ms-flex-wrap: nowrap;
+ flex-wrap: nowrap;
}
.navbar-expand-lg .navbar-collapse {
- display: -webkit-box !important;
- display: -webkit-flex !important;
display: -ms-flexbox !important;
display: flex !important;
}
@@ -3854,10 +3474,6 @@ tbody.collapse.show {
}
@media (max-width: 1199px) {
- .navbar-expand-xl .navbar-nav .dropdown-menu {
- position: static;
- float: none;
- }
.navbar-expand-xl > .container,
.navbar-expand-xl > .container-fluid {
padding-right: 0;
@@ -3867,42 +3483,34 @@ tbody.collapse.show {
@media (min-width: 1200px) {
.navbar-expand-xl {
- -webkit-box-orient: horizontal;
- -webkit-box-direction: normal;
- -webkit-flex-direction: row;
- -ms-flex-direction: row;
- flex-direction: row;
- -webkit-flex-wrap: nowrap;
- -ms-flex-wrap: nowrap;
- flex-wrap: nowrap;
- -webkit-box-pack: start;
- -webkit-justify-content: flex-start;
- -ms-flex-pack: start;
- justify-content: flex-start;
+ -ms-flex-direction: row;
+ flex-direction: row;
+ -ms-flex-wrap: nowrap;
+ flex-wrap: nowrap;
+ -ms-flex-pack: start;
+ justify-content: flex-start;
}
.navbar-expand-xl .navbar-nav {
- -webkit-box-orient: horizontal;
- -webkit-box-direction: normal;
- -webkit-flex-direction: row;
- -ms-flex-direction: row;
- flex-direction: row;
+ -ms-flex-direction: row;
+ flex-direction: row;
}
.navbar-expand-xl .navbar-nav .dropdown-menu {
position: absolute;
}
+ .navbar-expand-xl .navbar-nav .dropdown-menu-right {
+ right: 0;
+ left: auto;
+ }
.navbar-expand-xl .navbar-nav .nav-link {
padding-right: .5rem;
padding-left: .5rem;
}
.navbar-expand-xl > .container,
.navbar-expand-xl > .container-fluid {
- -webkit-flex-wrap: nowrap;
- -ms-flex-wrap: nowrap;
- flex-wrap: nowrap;
+ -ms-flex-wrap: nowrap;
+ flex-wrap: nowrap;
}
.navbar-expand-xl .navbar-collapse {
- display: -webkit-box !important;
- display: -webkit-flex !important;
display: -ms-flexbox !important;
display: flex !important;
}
@@ -3912,23 +3520,12 @@ tbody.collapse.show {
}
.navbar-expand {
- -webkit-box-orient: horizontal;
- -webkit-box-direction: normal;
- -webkit-flex-direction: row;
- -ms-flex-direction: row;
- flex-direction: row;
- -webkit-flex-wrap: nowrap;
- -ms-flex-wrap: nowrap;
- flex-wrap: nowrap;
- -webkit-box-pack: start;
- -webkit-justify-content: flex-start;
- -ms-flex-pack: start;
- justify-content: flex-start;
-}
-
-.navbar-expand .navbar-nav .dropdown-menu {
- position: static;
- float: none;
+ -ms-flex-direction: row;
+ flex-direction: row;
+ -ms-flex-wrap: nowrap;
+ flex-wrap: nowrap;
+ -ms-flex-pack: start;
+ justify-content: flex-start;
}
.navbar-expand > .container,
@@ -3938,17 +3535,19 @@ tbody.collapse.show {
}
.navbar-expand .navbar-nav {
- -webkit-box-orient: horizontal;
- -webkit-box-direction: normal;
- -webkit-flex-direction: row;
- -ms-flex-direction: row;
- flex-direction: row;
+ -ms-flex-direction: row;
+ flex-direction: row;
}
.navbar-expand .navbar-nav .dropdown-menu {
position: absolute;
}
+.navbar-expand .navbar-nav .dropdown-menu-right {
+ right: 0;
+ left: auto;
+}
+
.navbar-expand .navbar-nav .nav-link {
padding-right: .5rem;
padding-left: .5rem;
@@ -3956,14 +3555,11 @@ tbody.collapse.show {
.navbar-expand > .container,
.navbar-expand > .container-fluid {
- -webkit-flex-wrap: nowrap;
- -ms-flex-wrap: nowrap;
- flex-wrap: nowrap;
+ -ms-flex-wrap: nowrap;
+ flex-wrap: nowrap;
}
.navbar-expand .navbar-collapse {
- display: -webkit-box !important;
- display: -webkit-flex !important;
display: -ms-flexbox !important;
display: flex !important;
}
@@ -4012,73 +3608,68 @@ tbody.collapse.show {
color: rgba(0, 0, 0, 0.5);
}
-.navbar-inverse .navbar-brand {
+.navbar-dark .navbar-brand {
color: white;
}
-.navbar-inverse .navbar-brand:focus, .navbar-inverse .navbar-brand:hover {
+.navbar-dark .navbar-brand:focus, .navbar-dark .navbar-brand:hover {
color: white;
}
-.navbar-inverse .navbar-nav .nav-link {
+.navbar-dark .navbar-nav .nav-link {
color: rgba(255, 255, 255, 0.5);
}
-.navbar-inverse .navbar-nav .nav-link:focus, .navbar-inverse .navbar-nav .nav-link:hover {
+.navbar-dark .navbar-nav .nav-link:focus, .navbar-dark .navbar-nav .nav-link:hover {
color: rgba(255, 255, 255, 0.75);
}
-.navbar-inverse .navbar-nav .nav-link.disabled {
+.navbar-dark .navbar-nav .nav-link.disabled {
color: rgba(255, 255, 255, 0.25);
}
-.navbar-inverse .navbar-nav .show > .nav-link,
-.navbar-inverse .navbar-nav .active > .nav-link,
-.navbar-inverse .navbar-nav .nav-link.show,
-.navbar-inverse .navbar-nav .nav-link.active {
+.navbar-dark .navbar-nav .show > .nav-link,
+.navbar-dark .navbar-nav .active > .nav-link,
+.navbar-dark .navbar-nav .nav-link.show,
+.navbar-dark .navbar-nav .nav-link.active {
color: white;
}
-.navbar-inverse .navbar-toggler {
+.navbar-dark .navbar-toggler {
color: rgba(255, 255, 255, 0.5);
border-color: rgba(255, 255, 255, 0.1);
}
-.navbar-inverse .navbar-toggler-icon {
+.navbar-dark .navbar-toggler-icon {
background-image: url("data:image/svg+xml;charset=utf8,%3Csvg viewBox='0 0 30 30' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath stroke='rgba(255, 255, 255, 0.5)' stroke-width='2' stroke-linecap='round' stroke-miterlimit='10' d='M4 7h22M4 15h22M4 23h22'/%3E%3C/svg%3E");
}
-.navbar-inverse .navbar-text {
+.navbar-dark .navbar-text {
color: rgba(255, 255, 255, 0.5);
}
.card {
position: relative;
- display: -webkit-box;
- display: -webkit-flex;
display: -ms-flexbox;
display: flex;
- -webkit-box-orient: vertical;
- -webkit-box-direction: normal;
- -webkit-flex-direction: column;
- -ms-flex-direction: column;
- flex-direction: column;
+ -ms-flex-direction: column;
+ flex-direction: column;
+ min-width: 0;
+ word-wrap: break-word;
background-color: #fff;
+ background-clip: border-box;
border: 1px solid rgba(0, 0, 0, 0.125);
border-radius: 0.25rem;
}
-.card-block {
- -webkit-box-flex: 1;
- -webkit-flex: 1 1 auto;
- -ms-flex: 1 1 auto;
- flex: 1 1 auto;
+.card-body {
+ -ms-flex: 1 1 auto;
+ flex: 1 1 auto;
padding: 1.25rem;
}
.card-title {
margin-bottom: 0.75rem;
- word-break: break-all;
}
.card-subtitle {
@@ -4111,7 +3702,7 @@ tbody.collapse.show {
.card-header {
padding: 0.75rem 1.25rem;
margin-bottom: 0;
- background-color: #f7f7f9;
+ background-color: rgba(0, 0, 0, 0.03);
border-bottom: 1px solid rgba(0, 0, 0, 0.125);
}
@@ -4121,7 +3712,7 @@ tbody.collapse.show {
.card-footer {
padding: 0.75rem 1.25rem;
- background-color: #f7f7f9;
+ background-color: rgba(0, 0, 0, 0.03);
border-top: 1px solid rgba(0, 0, 0, 0.125);
}
@@ -4141,156 +3732,6 @@ tbody.collapse.show {
margin-left: -0.625rem;
}
-.card-primary {
- background-color: #0275d8;
- border-color: #0275d8;
-}
-
-.card-primary .card-header,
-.card-primary .card-footer {
- background-color: transparent;
-}
-
-.card-success {
- background-color: #5cb85c;
- border-color: #5cb85c;
-}
-
-.card-success .card-header,
-.card-success .card-footer {
- background-color: transparent;
-}
-
-.card-info {
- background-color: #5bc0de;
- border-color: #5bc0de;
-}
-
-.card-info .card-header,
-.card-info .card-footer {
- background-color: transparent;
-}
-
-.card-warning {
- background-color: #f0ad4e;
- border-color: #f0ad4e;
-}
-
-.card-warning .card-header,
-.card-warning .card-footer {
- background-color: transparent;
-}
-
-.card-danger {
- background-color: #d9534f;
- border-color: #d9534f;
-}
-
-.card-danger .card-header,
-.card-danger .card-footer {
- background-color: transparent;
-}
-
-.card-outline-primary {
- background-color: transparent;
- border-color: #0275d8;
-}
-
-.card-outline-primary .card-header,
-.card-outline-primary .card-footer {
- background-color: transparent;
- border-color: #0275d8;
-}
-
-.card-outline-secondary {
- background-color: transparent;
- border-color: #ccc;
-}
-
-.card-outline-secondary .card-header,
-.card-outline-secondary .card-footer {
- background-color: transparent;
- border-color: #ccc;
-}
-
-.card-outline-info {
- background-color: transparent;
- border-color: #5bc0de;
-}
-
-.card-outline-info .card-header,
-.card-outline-info .card-footer {
- background-color: transparent;
- border-color: #5bc0de;
-}
-
-.card-outline-success {
- background-color: transparent;
- border-color: #5cb85c;
-}
-
-.card-outline-success .card-header,
-.card-outline-success .card-footer {
- background-color: transparent;
- border-color: #5cb85c;
-}
-
-.card-outline-warning {
- background-color: transparent;
- border-color: #f0ad4e;
-}
-
-.card-outline-warning .card-header,
-.card-outline-warning .card-footer {
- background-color: transparent;
- border-color: #f0ad4e;
-}
-
-.card-outline-danger {
- background-color: transparent;
- border-color: #d9534f;
-}
-
-.card-outline-danger .card-header,
-.card-outline-danger .card-footer {
- background-color: transparent;
- border-color: #d9534f;
-}
-
-.card-inverse {
- color: rgba(255, 255, 255, 0.65);
-}
-
-.card-inverse .card-header,
-.card-inverse .card-footer {
- background-color: transparent;
- border-color: rgba(255, 255, 255, 0.2);
-}
-
-.card-inverse .card-header,
-.card-inverse .card-footer,
-.card-inverse .card-title,
-.card-inverse .card-blockquote {
- color: #fff;
-}
-
-.card-inverse .card-link,
-.card-inverse .card-text,
-.card-inverse .card-subtitle,
-.card-inverse .card-blockquote .blockquote-footer {
- color: rgba(255, 255, 255, 0.65);
-}
-
-.card-inverse .card-link:focus, .card-inverse .card-link:hover {
- color: #fff;
-}
-
-.card-blockquote {
- padding: 0;
- margin-bottom: 0;
- border-left: 0;
-}
-
.card-img-overlay {
position: absolute;
top: 0;
@@ -4319,32 +3760,20 @@ tbody.collapse.show {
@media (min-width: 576px) {
.card-deck {
- display: -webkit-box;
- display: -webkit-flex;
display: -ms-flexbox;
display: flex;
- -webkit-box-orient: horizontal;
- -webkit-box-direction: normal;
- -webkit-flex-flow: row wrap;
- -ms-flex-flow: row wrap;
- flex-flow: row wrap;
+ -ms-flex-flow: row wrap;
+ flex-flow: row wrap;
margin-right: -15px;
margin-left: -15px;
}
.card-deck .card {
- display: -webkit-box;
- display: -webkit-flex;
display: -ms-flexbox;
display: flex;
- -webkit-box-flex: 1;
- -webkit-flex: 1 0 0;
- -ms-flex: 1 0 0px;
- flex: 1 0 0%;
- -webkit-box-orient: vertical;
- -webkit-box-direction: normal;
- -webkit-flex-direction: column;
- -ms-flex-direction: column;
- flex-direction: column;
+ -ms-flex: 1 0 0%;
+ flex: 1 0 0%;
+ -ms-flex-direction: column;
+ flex-direction: column;
margin-right: 15px;
margin-left: 15px;
}
@@ -4352,21 +3781,14 @@ tbody.collapse.show {
@media (min-width: 576px) {
.card-group {
- display: -webkit-box;
- display: -webkit-flex;
display: -ms-flexbox;
display: flex;
- -webkit-box-orient: horizontal;
- -webkit-box-direction: normal;
- -webkit-flex-flow: row wrap;
- -ms-flex-flow: row wrap;
- flex-flow: row wrap;
+ -ms-flex-flow: row wrap;
+ flex-flow: row wrap;
}
.card-group .card {
- -webkit-box-flex: 1;
- -webkit-flex: 1 0 0;
- -ms-flex: 1 0 0px;
- flex: 1 0 0%;
+ -ms-flex: 1 0 0%;
+ flex: 1 0 0%;
}
.card-group .card + .card {
margin-left: 0;
@@ -4408,10 +3830,8 @@ tbody.collapse.show {
@media (min-width: 576px) {
.card-columns {
-webkit-column-count: 3;
- -moz-column-count: 3;
column-count: 3;
-webkit-column-gap: 1.25rem;
- -moz-column-gap: 1.25rem;
column-gap: 1.25rem;
}
.card-columns .card {
@@ -4424,7 +3844,7 @@ tbody.collapse.show {
padding: 0.75rem 1rem;
margin-bottom: 1rem;
list-style: none;
- background-color: #eceeef;
+ background-color: #e9ecef;
border-radius: 0.25rem;
}
@@ -4442,7 +3862,7 @@ tbody.collapse.show {
display: inline-block;
padding-right: 0.5rem;
padding-left: 0.5rem;
- color: #636c72;
+ color: #868e96;
content: "/";
}
@@ -4455,12 +3875,10 @@ tbody.collapse.show {
}
.breadcrumb-item.active {
- color: #636c72;
+ color: #868e96;
}
.pagination {
- display: -webkit-box;
- display: -webkit-flex;
display: -ms-flexbox;
display: flex;
padding-left: 0;
@@ -4482,12 +3900,12 @@ tbody.collapse.show {
.page-item.active .page-link {
z-index: 2;
color: #fff;
- background-color: #0275d8;
- border-color: #0275d8;
+ background-color: #007bff;
+ border-color: #007bff;
}
.page-item.disabled .page-link {
- color: #636c72;
+ color: #868e96;
pointer-events: none;
background-color: #fff;
border-color: #ddd;
@@ -4499,21 +3917,22 @@ tbody.collapse.show {
padding: 0.5rem 0.75rem;
margin-left: -1px;
line-height: 1.25;
- color: #0275d8;
+ color: #007bff;
background-color: #fff;
border: 1px solid #ddd;
}
.page-link:focus, .page-link:hover {
- color: #014c8c;
+ color: #0056b3;
text-decoration: none;
- background-color: #eceeef;
+ background-color: #e9ecef;
border-color: #ddd;
}
.pagination-lg .page-link {
padding: 0.75rem 1.5rem;
font-size: 1.25rem;
+ line-height: 1.5;
}
.pagination-lg .page-item:first-child .page-link {
@@ -4529,6 +3948,7 @@ tbody.collapse.show {
.pagination-sm .page-link {
padding: 0.25rem 0.5rem;
font-size: 0.875rem;
+ line-height: 1.5;
}
.pagination-sm .page-item:first-child .page-link {
@@ -4563,69 +3983,104 @@ tbody.collapse.show {
top: -1px;
}
-a.badge:focus, a.badge:hover {
- color: #fff;
- text-decoration: none;
-}
-
.badge-pill {
padding-right: 0.6em;
padding-left: 0.6em;
border-radius: 10rem;
}
-.badge-default {
- background-color: #636c72;
+.badge-primary {
+ color: #fff;
+ background-color: #007bff;
}
-.badge-default[href]:focus, .badge-default[href]:hover {
- background-color: #4b5257;
+.badge-primary[href]:focus, .badge-primary[href]:hover {
+ color: #fff;
+ text-decoration: none;
+ background-color: #0062cc;
}
-.badge-primary {
- background-color: #0275d8;
+.badge-secondary {
+ color: #fff;
+ background-color: #868e96;
}
-.badge-primary[href]:focus, .badge-primary[href]:hover {
- background-color: #025aa5;
+.badge-secondary[href]:focus, .badge-secondary[href]:hover {
+ color: #fff;
+ text-decoration: none;
+ background-color: #6c757d;
}
.badge-success {
- background-color: #5cb85c;
+ color: #fff;
+ background-color: #28a745;
}
.badge-success[href]:focus, .badge-success[href]:hover {
- background-color: #449d44;
+ color: #fff;
+ text-decoration: none;
+ background-color: #1e7e34;
}
.badge-info {
- background-color: #5bc0de;
+ color: #fff;
+ background-color: #17a2b8;
}
.badge-info[href]:focus, .badge-info[href]:hover {
- background-color: #31b0d5;
+ color: #fff;
+ text-decoration: none;
+ background-color: #117a8b;
}
.badge-warning {
- background-color: #f0ad4e;
+ color: #111;
+ background-color: #ffc107;
}
.badge-warning[href]:focus, .badge-warning[href]:hover {
- background-color: #ec971f;
+ color: #111;
+ text-decoration: none;
+ background-color: #d39e00;
}
.badge-danger {
- background-color: #d9534f;
+ color: #fff;
+ background-color: #dc3545;
}
.badge-danger[href]:focus, .badge-danger[href]:hover {
- background-color: #c9302c;
+ color: #fff;
+ text-decoration: none;
+ background-color: #bd2130;
+}
+
+.badge-light {
+ color: #111;
+ background-color: #f8f9fa;
+}
+
+.badge-light[href]:focus, .badge-light[href]:hover {
+ color: #111;
+ text-decoration: none;
+ background-color: #dae0e5;
+}
+
+.badge-dark {
+ color: #fff;
+ background-color: #343a40;
+}
+
+.badge-dark[href]:focus, .badge-dark[href]:hover {
+ color: #fff;
+ text-decoration: none;
+ background-color: #1d2124;
}
.jumbotron {
padding: 2rem 1rem;
margin-bottom: 2rem;
- background-color: #eceeef;
+ background-color: #e9ecef;
border-radius: 0.3rem;
}
@@ -4664,72 +4119,119 @@ a.badge:focus, a.badge:hover {
color: inherit;
}
+.alert-primary {
+ color: #004085;
+ background-color: #cce5ff;
+ border-color: #b8daff;
+}
+
+.alert-primary hr {
+ border-top-color: #9fcdff;
+}
+
+.alert-primary .alert-link {
+ color: #002752;
+}
+
+.alert-secondary {
+ color: #464a4e;
+ background-color: #e7e8ea;
+ border-color: #dddfe2;
+}
+
+.alert-secondary hr {
+ border-top-color: #cfd2d6;
+}
+
+.alert-secondary .alert-link {
+ color: #2e3133;
+}
+
.alert-success {
- color: #3c763d;
- background-color: #dff0d8;
- border-color: #d0e9c6;
+ color: #155724;
+ background-color: #d4edda;
+ border-color: #c3e6cb;
}
.alert-success hr {
- border-top-color: #c1e2b3;
+ border-top-color: #b1dfbb;
}
.alert-success .alert-link {
- color: #2b542c;
+ color: #0b2e13;
}
.alert-info {
- color: #31708f;
- background-color: #d9edf7;
- border-color: #bcdff1;
+ color: #0c5460;
+ background-color: #d1ecf1;
+ border-color: #bee5eb;
}
.alert-info hr {
- border-top-color: #a6d5ec;
+ border-top-color: #abdde5;
}
.alert-info .alert-link {
- color: #245269;
+ color: #062c33;
}
.alert-warning {
- color: #8a6d3b;
- background-color: #fcf8e3;
- border-color: #faf2cc;
+ color: #856404;
+ background-color: #fff3cd;
+ border-color: #ffeeba;
}
.alert-warning hr {
- border-top-color: #f7ecb5;
+ border-top-color: #ffe8a1;
}
.alert-warning .alert-link {
- color: #66512c;
+ color: #533f03;
}
.alert-danger {
- color: #a94442;
- background-color: #f2dede;
- border-color: #ebcccc;
+ color: #721c24;
+ background-color: #f8d7da;
+ border-color: #f5c6cb;
}
.alert-danger hr {
- border-top-color: #e4b9b9;
+ border-top-color: #f1b0b7;
}
.alert-danger .alert-link {
- color: #843534;
+ color: #491217;
}
-@-webkit-keyframes progress-bar-stripes {
- from {
- background-position: 1rem 0;
- }
- to {
- background-position: 0 0;
- }
+.alert-light {
+ color: #818182;
+ background-color: #fefefe;
+ border-color: #fdfdfe;
+}
+
+.alert-light hr {
+ border-top-color: #ececf6;
}
-@-o-keyframes progress-bar-stripes {
+.alert-light .alert-link {
+ color: #686868;
+}
+
+.alert-dark {
+ color: #1b1e21;
+ background-color: #d6d8d9;
+ border-color: #c6c8ca;
+}
+
+.alert-dark hr {
+ border-top-color: #b9bbbe;
+}
+
+.alert-dark .alert-link {
+ color: #040505;
+}
+
+@-webkit-keyframes progress-bar-stripes {
from {
background-position: 1rem 0;
}
@@ -4748,15 +4250,13 @@ a.badge:focus, a.badge:hover {
}
.progress {
- display: -webkit-box;
- display: -webkit-flex;
display: -ms-flexbox;
display: flex;
overflow: hidden;
font-size: 0.75rem;
line-height: 1rem;
text-align: center;
- background-color: #eceeef;
+ background-color: #e9ecef;
border-radius: 0.25rem;
}
@@ -4764,73 +4264,56 @@ a.badge:focus, a.badge:hover {
height: 1rem;
line-height: 1rem;
color: #fff;
- background-color: #0275d8;
- -webkit-transition: width 0.6s ease;
- -o-transition: width 0.6s ease;
+ background-color: #007bff;
transition: width 0.6s ease;
}
.progress-bar-striped {
- 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: -o-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);
- -webkit-background-size: 1rem 1rem;
- background-size: 1rem 1rem;
+ background-size: 1rem 1rem;
}
.progress-bar-animated {
-webkit-animation: progress-bar-stripes 1s linear infinite;
- -o-animation: progress-bar-stripes 1s linear infinite;
animation: progress-bar-stripes 1s linear infinite;
}
.media {
- display: -webkit-box;
- display: -webkit-flex;
display: -ms-flexbox;
display: flex;
- -webkit-box-align: start;
- -webkit-align-items: flex-start;
- -ms-flex-align: start;
- align-items: flex-start;
+ -ms-flex-align: start;
+ align-items: flex-start;
}
.media-body {
- -webkit-box-flex: 1;
- -webkit-flex: 1;
- -ms-flex: 1;
- flex: 1 1 0%;
+ -ms-flex: 1;
+ flex: 1;
}
.list-group {
- display: -webkit-box;
- display: -webkit-flex;
display: -ms-flexbox;
display: flex;
- -webkit-box-orient: vertical;
- -webkit-box-direction: normal;
- -webkit-flex-direction: column;
- -ms-flex-direction: column;
- flex-direction: column;
+ -ms-flex-direction: column;
+ flex-direction: column;
padding-left: 0;
margin-bottom: 0;
}
.list-group-item-action {
width: 100%;
- color: #464a4c;
+ color: #495057;
text-align: inherit;
}
.list-group-item-action:focus, .list-group-item-action:hover {
- color: #464a4c;
+ color: #495057;
text-decoration: none;
- background-color: #f7f7f9;
+ background-color: #f8f9fa;
}
.list-group-item-action:active {
- color: #292b2c;
- background-color: #eceeef;
+ color: #212529;
+ background-color: #e9ecef;
}
.list-group-item {
@@ -4858,15 +4341,15 @@ a.badge:focus, a.badge:hover {
}
.list-group-item.disabled, .list-group-item:disabled {
- color: #636c72;
+ color: #868e96;
background-color: #fff;
}
.list-group-item.active {
z-index: 2;
color: #fff;
- background-color: #0275d8;
- border-color: #0275d8;
+ background-color: #007bff;
+ border-color: #007bff;
}
.list-group-flush .list-group-item {
@@ -4883,143 +4366,196 @@ a.badge:focus, a.badge:hover {
border-bottom: 0;
}
+.list-group-item-primary {
+ color: #004085;
+ background-color: #b8daff;
+}
+
+a.list-group-item-primary,
+button.list-group-item-primary {
+ color: #004085;
+}
+
+a.list-group-item-primary:focus, a.list-group-item-primary:hover,
+button.list-group-item-primary:focus,
+button.list-group-item-primary:hover {
+ color: #004085;
+ background-color: #9fcdff;
+}
+
+a.list-group-item-primary.active,
+button.list-group-item-primary.active {
+ color: #fff;
+ background-color: #004085;
+ border-color: #004085;
+}
+
+.list-group-item-secondary {
+ color: #464a4e;
+ background-color: #dddfe2;
+}
+
+a.list-group-item-secondary,
+button.list-group-item-secondary {
+ color: #464a4e;
+}
+
+a.list-group-item-secondary:focus, a.list-group-item-secondary:hover,
+button.list-group-item-secondary:focus,
+button.list-group-item-secondary:hover {
+ color: #464a4e;
+ background-color: #cfd2d6;
+}
+
+a.list-group-item-secondary.active,
+button.list-group-item-secondary.active {
+ color: #fff;
+ background-color: #464a4e;
+ border-color: #464a4e;
+}
+
.list-group-item-success {
- color: #3c763d;
- background-color: #dff0d8;
+ color: #155724;
+ background-color: #c3e6cb;
}
a.list-group-item-success,
button.list-group-item-success {
- color: #3c763d;
+ color: #155724;
}
a.list-group-item-success:focus, a.list-group-item-success:hover,
button.list-group-item-success:focus,
button.list-group-item-success:hover {
- color: #3c763d;
- background-color: #d0e9c6;
+ color: #155724;
+ background-color: #b1dfbb;
}
a.list-group-item-success.active,
button.list-group-item-success.active {
color: #fff;
- background-color: #3c763d;
- border-color: #3c763d;
+ background-color: #155724;
+ border-color: #155724;
}
.list-group-item-info {
- color: #31708f;
- background-color: #d9edf7;
+ color: #0c5460;
+ background-color: #bee5eb;
}
a.list-group-item-info,
button.list-group-item-info {
- color: #31708f;
+ color: #0c5460;
}
a.list-group-item-info:focus, a.list-group-item-info:hover,
button.list-group-item-info:focus,
button.list-group-item-info:hover {
- color: #31708f;
- background-color: #c4e3f3;
+ color: #0c5460;
+ background-color: #abdde5;
}
a.list-group-item-info.active,
button.list-group-item-info.active {
color: #fff;
- background-color: #31708f;
- border-color: #31708f;
+ background-color: #0c5460;
+ border-color: #0c5460;
}
.list-group-item-warning {
- color: #8a6d3b;
- background-color: #fcf8e3;
+ color: #856404;
+ background-color: #ffeeba;
}
a.list-group-item-warning,
button.list-group-item-warning {
- color: #8a6d3b;
+ color: #856404;
}
a.list-group-item-warning:focus, a.list-group-item-warning:hover,
button.list-group-item-warning:focus,
button.list-group-item-warning:hover {
- color: #8a6d3b;
- background-color: #faf2cc;
+ color: #856404;
+ background-color: #ffe8a1;
}
a.list-group-item-warning.active,
button.list-group-item-warning.active {
color: #fff;
- background-color: #8a6d3b;
- border-color: #8a6d3b;
+ background-color: #856404;
+ border-color: #856404;
}
.list-group-item-danger {
- color: #a94442;
- background-color: #f2dede;
+ color: #721c24;
+ background-color: #f5c6cb;
}
a.list-group-item-danger,
button.list-group-item-danger {
- color: #a94442;
+ color: #721c24;
}
a.list-group-item-danger:focus, a.list-group-item-danger:hover,
button.list-group-item-danger:focus,
button.list-group-item-danger:hover {
- color: #a94442;
- background-color: #ebcccc;
+ color: #721c24;
+ background-color: #f1b0b7;
}
a.list-group-item-danger.active,
button.list-group-item-danger.active {
color: #fff;
- background-color: #a94442;
- border-color: #a94442;
+ background-color: #721c24;
+ border-color: #721c24;
}
-.embed-responsive {
- position: relative;
- display: block;
- width: 100%;
- padding: 0;
- overflow: hidden;
+.list-group-item-light {
+ color: #818182;
+ background-color: #fdfdfe;
}
-.embed-responsive::before {
- display: block;
- content: "";
+a.list-group-item-light,
+button.list-group-item-light {
+ color: #818182;
}
-.embed-responsive .embed-responsive-item,
-.embed-responsive iframe,
-.embed-responsive embed,
-.embed-responsive object,
-.embed-responsive video {
- position: absolute;
- top: 0;
- bottom: 0;
- left: 0;
- width: 100%;
- height: 100%;
- border: 0;
+a.list-group-item-light:focus, a.list-group-item-light:hover,
+button.list-group-item-light:focus,
+button.list-group-item-light:hover {
+ color: #818182;
+ background-color: #ececf6;
}
-.embed-responsive-21by9::before {
- padding-top: 42.857143%;
+a.list-group-item-light.active,
+button.list-group-item-light.active {
+ color: #fff;
+ background-color: #818182;
+ border-color: #818182;
}
-.embed-responsive-16by9::before {
- padding-top: 56.25%;
+.list-group-item-dark {
+ color: #1b1e21;
+ background-color: #c6c8ca;
}
-.embed-responsive-4by3::before {
- padding-top: 75%;
+a.list-group-item-dark,
+button.list-group-item-dark {
+ color: #1b1e21;
}
-.embed-responsive-1by1::before {
- padding-top: 100%;
+a.list-group-item-dark:focus, a.list-group-item-dark:hover,
+button.list-group-item-dark:focus,
+button.list-group-item-dark:hover {
+ color: #1b1e21;
+ background-color: #b9bbbe;
+}
+
+a.list-group-item-dark.active,
+button.list-group-item-dark.active {
+ color: #fff;
+ background-color: #1b1e21;
+ border-color: #1b1e21;
}
.close {
@@ -5062,19 +4598,15 @@ button.close {
}
.modal.fade .modal-dialog {
- -webkit-transition: -webkit-transform 0.3s ease-out;
transition: -webkit-transform 0.3s ease-out;
- -o-transition: -o-transform 0.3s ease-out;
transition: transform 0.3s ease-out;
- transition: transform 0.3s ease-out, -webkit-transform 0.3s ease-out, -o-transform 0.3s ease-out;
+ transition: transform 0.3s ease-out, -webkit-transform 0.3s ease-out;
-webkit-transform: translate(0, -25%);
- -o-transform: translate(0, -25%);
transform: translate(0, -25%);
}
.modal.show .modal-dialog {
-webkit-transform: translate(0, 0);
- -o-transform: translate(0, 0);
transform: translate(0, 0);
}
@@ -5091,18 +4623,12 @@ button.close {
.modal-content {
position: relative;
- display: -webkit-box;
- display: -webkit-flex;
display: -ms-flexbox;
display: flex;
- -webkit-box-orient: vertical;
- -webkit-box-direction: normal;
- -webkit-flex-direction: column;
- -ms-flex-direction: column;
- flex-direction: column;
+ -ms-flex-direction: column;
+ flex-direction: column;
background-color: #fff;
- -webkit-background-clip: padding-box;
- background-clip: padding-box;
+ background-clip: padding-box;
border: 1px solid rgba(0, 0, 0, 0.2);
border-radius: 0.3rem;
outline: 0;
@@ -5127,20 +4653,14 @@ button.close {
}
.modal-header {
- display: -webkit-box;
- display: -webkit-flex;
display: -ms-flexbox;
display: flex;
- -webkit-box-align: center;
- -webkit-align-items: center;
- -ms-flex-align: center;
- align-items: center;
- -webkit-box-pack: justify;
- -webkit-justify-content: space-between;
- -ms-flex-pack: justify;
- justify-content: space-between;
+ -ms-flex-align: center;
+ align-items: center;
+ -ms-flex-pack: justify;
+ justify-content: space-between;
padding: 15px;
- border-bottom: 1px solid #eceeef;
+ border-bottom: 1px solid #e9ecef;
}
.modal-title {
@@ -5150,28 +4670,20 @@ button.close {
.modal-body {
position: relative;
- -webkit-box-flex: 1;
- -webkit-flex: 1 1 auto;
- -ms-flex: 1 1 auto;
- flex: 1 1 auto;
+ -ms-flex: 1 1 auto;
+ flex: 1 1 auto;
padding: 15px;
}
.modal-footer {
- display: -webkit-box;
- display: -webkit-flex;
display: -ms-flexbox;
display: flex;
- -webkit-box-align: center;
- -webkit-align-items: center;
- -ms-flex-align: center;
- align-items: center;
- -webkit-box-pack: end;
- -webkit-justify-content: flex-end;
- -ms-flex-pack: end;
- justify-content: flex-end;
+ -ms-flex-align: center;
+ align-items: center;
+ -ms-flex-pack: end;
+ justify-content: flex-end;
padding: 15px;
- border-top: 1px solid #eceeef;
+ border-top: 1px solid #e9ecef;
}
.modal-footer > :not(:first-child) {
@@ -5210,6 +4722,7 @@ button.close {
position: absolute;
z-index: 1070;
display: block;
+ margin: 0;
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif;
font-style: normal;
font-weight: normal;
@@ -5233,62 +4746,80 @@ button.close {
opacity: 0.9;
}
-.tooltip.tooltip-top, .tooltip.bs-tether-element-attached-bottom {
+.tooltip .arrow {
+ position: absolute;
+ display: block;
+ width: 5px;
+ height: 5px;
+}
+
+.tooltip.bs-tooltip-top, .tooltip.bs-tooltip-auto[x-placement^="top"] {
padding: 5px 0;
- margin-top: -3px;
}
-.tooltip.tooltip-top .tooltip-inner::before, .tooltip.bs-tether-element-attached-bottom .tooltip-inner::before {
+.tooltip.bs-tooltip-top .arrow, .tooltip.bs-tooltip-auto[x-placement^="top"] .arrow {
bottom: 0;
- left: 50%;
- margin-left: -5px;
+}
+
+.tooltip.bs-tooltip-top .arrow::before, .tooltip.bs-tooltip-auto[x-placement^="top"] .arrow::before {
+ margin-left: -3px;
content: "";
border-width: 5px 5px 0;
border-top-color: #000;
}
-.tooltip.tooltip-right, .tooltip.bs-tether-element-attached-left {
+.tooltip.bs-tooltip-right, .tooltip.bs-tooltip-auto[x-placement^="right"] {
padding: 0 5px;
- margin-left: 3px;
}
-.tooltip.tooltip-right .tooltip-inner::before, .tooltip.bs-tether-element-attached-left .tooltip-inner::before {
- top: 50%;
+.tooltip.bs-tooltip-right .arrow, .tooltip.bs-tooltip-auto[x-placement^="right"] .arrow {
left: 0;
- margin-top: -5px;
+}
+
+.tooltip.bs-tooltip-right .arrow::before, .tooltip.bs-tooltip-auto[x-placement^="right"] .arrow::before {
+ margin-top: -3px;
content: "";
border-width: 5px 5px 5px 0;
border-right-color: #000;
}
-.tooltip.tooltip-bottom, .tooltip.bs-tether-element-attached-top {
+.tooltip.bs-tooltip-bottom, .tooltip.bs-tooltip-auto[x-placement^="bottom"] {
padding: 5px 0;
- margin-top: 3px;
}
-.tooltip.tooltip-bottom .tooltip-inner::before, .tooltip.bs-tether-element-attached-top .tooltip-inner::before {
+.tooltip.bs-tooltip-bottom .arrow, .tooltip.bs-tooltip-auto[x-placement^="bottom"] .arrow {
top: 0;
- left: 50%;
- margin-left: -5px;
+}
+
+.tooltip.bs-tooltip-bottom .arrow::before, .tooltip.bs-tooltip-auto[x-placement^="bottom"] .arrow::before {
+ margin-left: -3px;
content: "";
border-width: 0 5px 5px;
border-bottom-color: #000;
}
-.tooltip.tooltip-left, .tooltip.bs-tether-element-attached-right {
+.tooltip.bs-tooltip-left, .tooltip.bs-tooltip-auto[x-placement^="left"] {
padding: 0 5px;
- margin-left: -3px;
}
-.tooltip.tooltip-left .tooltip-inner::before, .tooltip.bs-tether-element-attached-right .tooltip-inner::before {
- top: 50%;
+.tooltip.bs-tooltip-left .arrow, .tooltip.bs-tooltip-auto[x-placement^="left"] .arrow {
right: 0;
- margin-top: -5px;
+}
+
+.tooltip.bs-tooltip-left .arrow::before, .tooltip.bs-tooltip-auto[x-placement^="left"] .arrow::before {
+ right: 0;
+ margin-top: -3px;
content: "";
border-width: 5px 0 5px 5px;
border-left-color: #000;
}
+.tooltip .arrow::before {
+ position: absolute;
+ border-color: transparent;
+ border-style: solid;
+}
+
.tooltip-inner {
max-width: 200px;
padding: 3px 8px;
@@ -5298,14 +4829,6 @@ button.close {
border-radius: 0.25rem;
}
-.tooltip-inner::before {
- position: absolute;
- width: 0;
- height: 0;
- border-color: transparent;
- border-style: solid;
-}
-
.popover {
position: absolute;
top: 0;
@@ -5331,76 +4854,110 @@ button.close {
font-size: 0.875rem;
word-wrap: break-word;
background-color: #fff;
- -webkit-background-clip: padding-box;
- background-clip: padding-box;
+ background-clip: padding-box;
border: 1px solid rgba(0, 0, 0, 0.2);
border-radius: 0.3rem;
}
-.popover.popover-top, .popover.bs-tether-element-attached-bottom {
- margin-top: -10px;
+.popover .arrow {
+ position: absolute;
+ display: block;
+ width: 10px;
+ height: 5px;
}
-.popover.popover-top::before, .popover.popover-top::after, .popover.bs-tether-element-attached-bottom::before, .popover.bs-tether-element-attached-bottom::after {
- left: 50%;
+.popover .arrow::before,
+.popover .arrow::after {
+ position: absolute;
+ display: block;
+ border-color: transparent;
+ border-style: solid;
+}
+
+.popover .arrow::before {
+ content: "";
+ border-width: 11px;
+}
+
+.popover .arrow::after {
+ content: "";
+ border-width: 11px;
+}
+
+.popover.bs-popover-top, .popover.bs-popover-auto[x-placement^="top"] {
+ margin-bottom: 10px;
+}
+
+.popover.bs-popover-top .arrow, .popover.bs-popover-auto[x-placement^="top"] .arrow {
+ bottom: 0;
+}
+
+.popover.bs-popover-top .arrow::before, .popover.bs-popover-auto[x-placement^="top"] .arrow::before,
+.popover.bs-popover-top .arrow::after, .popover.bs-popover-auto[x-placement^="top"] .arrow::after {
border-bottom-width: 0;
}
-.popover.popover-top::before, .popover.bs-tether-element-attached-bottom::before {
+.popover.bs-popover-top .arrow::before, .popover.bs-popover-auto[x-placement^="top"] .arrow::before {
bottom: -11px;
- margin-left: -11px;
+ margin-left: -6px;
border-top-color: rgba(0, 0, 0, 0.25);
}
-.popover.popover-top::after, .popover.bs-tether-element-attached-bottom::after {
+.popover.bs-popover-top .arrow::after, .popover.bs-popover-auto[x-placement^="top"] .arrow::after {
bottom: -10px;
- margin-left: -10px;
+ margin-left: -6px;
border-top-color: #fff;
}
-.popover.popover-right, .popover.bs-tether-element-attached-left {
+.popover.bs-popover-right, .popover.bs-popover-auto[x-placement^="right"] {
margin-left: 10px;
}
-.popover.popover-right::before, .popover.popover-right::after, .popover.bs-tether-element-attached-left::before, .popover.bs-tether-element-attached-left::after {
- top: 50%;
+.popover.bs-popover-right .arrow, .popover.bs-popover-auto[x-placement^="right"] .arrow {
+ left: 0;
+}
+
+.popover.bs-popover-right .arrow::before, .popover.bs-popover-auto[x-placement^="right"] .arrow::before,
+.popover.bs-popover-right .arrow::after, .popover.bs-popover-auto[x-placement^="right"] .arrow::after {
+ margin-top: -8px;
border-left-width: 0;
}
-.popover.popover-right::before, .popover.bs-tether-element-attached-left::before {
+.popover.bs-popover-right .arrow::before, .popover.bs-popover-auto[x-placement^="right"] .arrow::before {
left: -11px;
- margin-top: -11px;
border-right-color: rgba(0, 0, 0, 0.25);
}
-.popover.popover-right::after, .popover.bs-tether-element-attached-left::after {
+.popover.bs-popover-right .arrow::after, .popover.bs-popover-auto[x-placement^="right"] .arrow::after {
left: -10px;
- margin-top: -10px;
border-right-color: #fff;
}
-.popover.popover-bottom, .popover.bs-tether-element-attached-top {
+.popover.bs-popover-bottom, .popover.bs-popover-auto[x-placement^="bottom"] {
margin-top: 10px;
}
-.popover.popover-bottom::before, .popover.popover-bottom::after, .popover.bs-tether-element-attached-top::before, .popover.bs-tether-element-attached-top::after {
- left: 50%;
+.popover.bs-popover-bottom .arrow, .popover.bs-popover-auto[x-placement^="bottom"] .arrow {
+ top: 0;
+}
+
+.popover.bs-popover-bottom .arrow::before, .popover.bs-popover-auto[x-placement^="bottom"] .arrow::before,
+.popover.bs-popover-bottom .arrow::after, .popover.bs-popover-auto[x-placement^="bottom"] .arrow::after {
+ margin-left: -7px;
border-top-width: 0;
}
-.popover.popover-bottom::before, .popover.bs-tether-element-attached-top::before {
+.popover.bs-popover-bottom .arrow::before, .popover.bs-popover-auto[x-placement^="bottom"] .arrow::before {
top: -11px;
- margin-left: -11px;
border-bottom-color: rgba(0, 0, 0, 0.25);
}
-.popover.popover-bottom::after, .popover.bs-tether-element-attached-top::after {
+.popover.bs-popover-bottom .arrow::after, .popover.bs-popover-auto[x-placement^="bottom"] .arrow::after {
top: -10px;
- margin-left: -10px;
border-bottom-color: #fff;
}
-.popover.popover-bottom .popover-title::before, .popover.bs-tether-element-attached-top .popover-title::before {
+.popover.bs-popover-bottom .popover-header::before, .popover.bs-popover-auto[x-placement^="bottom"] .popover-header::before {
position: absolute;
top: 0;
left: 50%;
@@ -5411,28 +4968,31 @@ button.close {
border-bottom: 1px solid #f7f7f7;
}
-.popover.popover-left, .popover.bs-tether-element-attached-right {
- margin-left: -10px;
+.popover.bs-popover-left, .popover.bs-popover-auto[x-placement^="left"] {
+ margin-right: 10px;
}
-.popover.popover-left::before, .popover.popover-left::after, .popover.bs-tether-element-attached-right::before, .popover.bs-tether-element-attached-right::after {
- top: 50%;
+.popover.bs-popover-left .arrow, .popover.bs-popover-auto[x-placement^="left"] .arrow {
+ right: 0;
+}
+
+.popover.bs-popover-left .arrow::before, .popover.bs-popover-auto[x-placement^="left"] .arrow::before,
+.popover.bs-popover-left .arrow::after, .popover.bs-popover-auto[x-placement^="left"] .arrow::after {
+ margin-top: -8px;
border-right-width: 0;
}
-.popover.popover-left::before, .popover.bs-tether-element-attached-right::before {
+.popover.bs-popover-left .arrow::before, .popover.bs-popover-auto[x-placement^="left"] .arrow::before {
right: -11px;
- margin-top: -11px;
border-left-color: rgba(0, 0, 0, 0.25);
}
-.popover.popover-left::after, .popover.bs-tether-element-attached-right::after {
+.popover.bs-popover-left .arrow::after, .popover.bs-popover-auto[x-placement^="left"] .arrow::after {
right: -10px;
- margin-top: -10px;
border-left-color: #fff;
}
-.popover-title {
+.popover-header {
padding: 8px 14px;
margin-bottom: 0;
font-size: 1rem;
@@ -5443,33 +5003,13 @@ button.close {
border-top-right-radius: calc(0.3rem - 1px);
}
-.popover-title:empty {
+.popover-header:empty {
display: none;
}
-.popover-content {
+.popover-body {
padding: 9px 14px;
- color: #292b2c;
-}
-
-.popover::before,
-.popover::after {
- position: absolute;
- display: block;
- width: 0;
- height: 0;
- border-color: transparent;
- border-style: solid;
-}
-
-.popover::before {
- content: "";
- border-width: 11px;
-}
-
-.popover::after {
- content: "";
- border-width: 10px;
+ color: #212529;
}
.carousel {
@@ -5485,16 +5025,12 @@ button.close {
.carousel-item {
position: relative;
display: none;
- -webkit-box-align: center;
- -webkit-align-items: center;
- -ms-flex-align: center;
- align-items: center;
+ -ms-flex-align: center;
+ align-items: center;
width: 100%;
- -webkit-transition: -webkit-transform 0.6s ease;
transition: -webkit-transform 0.6s ease;
- -o-transition: -o-transform 0.6s ease;
transition: transform 0.6s ease;
- transition: transform 0.6s ease, -webkit-transform 0.6s ease, -o-transform 0.6s ease;
+ transition: transform 0.6s ease, -webkit-transform 0.6s ease;
-webkit-backface-visibility: hidden;
backface-visibility: hidden;
-webkit-perspective: 1000px;
@@ -5504,10 +5040,7 @@ button.close {
.carousel-item.active,
.carousel-item-next,
.carousel-item-prev {
- display: -webkit-box;
- display: -webkit-flex;
- display: -ms-flexbox;
- display: flex;
+ display: block;
}
.carousel-item-next,
@@ -5518,20 +5051,44 @@ button.close {
.carousel-item-next.carousel-item-left,
.carousel-item-prev.carousel-item-right {
- -webkit-transform: translate3d(0, 0, 0);
- transform: translate3d(0, 0, 0);
+ -webkit-transform: translateX(0);
+ transform: translateX(0);
+}
+
+@supports ((-webkit-transform-style: preserve-3d) or (transform-style: preserve-3d)) {
+ .carousel-item-next.carousel-item-left,
+ .carousel-item-prev.carousel-item-right {
+ -webkit-transform: translate3d(0, 0, 0);
+ transform: translate3d(0, 0, 0);
+ }
}
.carousel-item-next,
.active.carousel-item-right {
- -webkit-transform: translate3d(100%, 0, 0);
- transform: translate3d(100%, 0, 0);
+ -webkit-transform: translateX(100%);
+ transform: translateX(100%);
+}
+
+@supports ((-webkit-transform-style: preserve-3d) or (transform-style: preserve-3d)) {
+ .carousel-item-next,
+ .active.carousel-item-right {
+ -webkit-transform: translate3d(100%, 0, 0);
+ transform: translate3d(100%, 0, 0);
+ }
}
.carousel-item-prev,
.active.carousel-item-left {
- -webkit-transform: translate3d(-100%, 0, 0);
- transform: translate3d(-100%, 0, 0);
+ -webkit-transform: translateX(-100%);
+ transform: translateX(-100%);
+}
+
+@supports ((-webkit-transform-style: preserve-3d) or (transform-style: preserve-3d)) {
+ .carousel-item-prev,
+ .active.carousel-item-left {
+ -webkit-transform: translate3d(-100%, 0, 0);
+ transform: translate3d(-100%, 0, 0);
+ }
}
.carousel-control-prev,
@@ -5539,18 +5096,12 @@ button.close {
position: absolute;
top: 0;
bottom: 0;
- display: -webkit-box;
- display: -webkit-flex;
display: -ms-flexbox;
display: flex;
- -webkit-box-align: center;
- -webkit-align-items: center;
- -ms-flex-align: center;
- align-items: center;
- -webkit-box-pack: center;
- -webkit-justify-content: center;
- -ms-flex-pack: center;
- justify-content: center;
+ -ms-flex-align: center;
+ align-items: center;
+ -ms-flex-pack: center;
+ justify-content: center;
width: 15%;
color: #fff;
text-align: center;
@@ -5580,8 +5131,7 @@ button.close {
width: 20px;
height: 20px;
background: transparent no-repeat center center;
- -webkit-background-size: 100% 100%;
- background-size: 100% 100%;
+ background-size: 100% 100%;
}
.carousel-control-prev-icon {
@@ -5598,14 +5148,10 @@ button.close {
bottom: 10px;
left: 0;
z-index: 15;
- display: -webkit-box;
- display: -webkit-flex;
display: -ms-flexbox;
display: flex;
- -webkit-box-pack: center;
- -webkit-justify-content: center;
- -ms-flex-pack: center;
- justify-content: center;
+ -ms-flex-pack: center;
+ justify-content: center;
padding-left: 0;
margin-right: 15%;
margin-left: 15%;
@@ -5614,11 +5160,9 @@ button.close {
.carousel-indicators li {
position: relative;
- -webkit-box-flex: 1;
- -webkit-flex: 1 0 auto;
- -ms-flex: 1 0 auto;
- flex: 1 0 auto;
- max-width: 30px;
+ -ms-flex: 0 1 auto;
+ flex: 0 1 auto;
+ width: 30px;
height: 3px;
margin-right: 3px;
margin-left: 3px;
@@ -5686,56 +5230,80 @@ button.close {
vertical-align: text-top !important;
}
-.bg-faded {
- background-color: #f7f7f7;
-}
-
.bg-primary {
- background-color: #0275d8 !important;
+ background-color: #007bff !important;
}
a.bg-primary:focus, a.bg-primary:hover {
- background-color: #025aa5 !important;
+ background-color: #0062cc !important;
+}
+
+.bg-secondary {
+ background-color: #868e96 !important;
+}
+
+a.bg-secondary:focus, a.bg-secondary:hover {
+ background-color: #6c757d !important;
}
.bg-success {
- background-color: #5cb85c !important;
+ background-color: #28a745 !important;
}
a.bg-success:focus, a.bg-success:hover {
- background-color: #449d44 !important;
+ background-color: #1e7e34 !important;
}
.bg-info {
- background-color: #5bc0de !important;
+ background-color: #17a2b8 !important;
}
a.bg-info:focus, a.bg-info:hover {
- background-color: #31b0d5 !important;
+ background-color: #117a8b !important;
}
.bg-warning {
- background-color: #f0ad4e !important;
+ background-color: #ffc107 !important;
}
a.bg-warning:focus, a.bg-warning:hover {
- background-color: #ec971f !important;
+ background-color: #d39e00 !important;
}
.bg-danger {
- background-color: #d9534f !important;
+ background-color: #dc3545 !important;
}
a.bg-danger:focus, a.bg-danger:hover {
- background-color: #c9302c !important;
+ background-color: #bd2130 !important;
+}
+
+.bg-light {
+ background-color: #f8f9fa !important;
+}
+
+a.bg-light:focus, a.bg-light:hover {
+ background-color: #dae0e5 !important;
+}
+
+.bg-dark {
+ background-color: #343a40 !important;
+}
+
+a.bg-dark:focus, a.bg-dark:hover {
+ background-color: #1d2124 !important;
+}
+
+.bg-white {
+ background-color: #fff !important;
}
-.bg-inverse {
- background-color: #292b2c !important;
+.bg-transparent {
+ background-color: transparent !important;
}
-a.bg-inverse:focus, a.bg-inverse:hover {
- background-color: #101112 !important;
+.border {
+ border: 1px solid #e9ecef !important;
}
.border-0 {
@@ -5758,28 +5326,64 @@ a.bg-inverse:focus, a.bg-inverse:hover {
border-left: 0 !important;
}
+.border-primary {
+ border-color: #007bff !important;
+}
+
+.border-secondary {
+ border-color: #868e96 !important;
+}
+
+.border-success {
+ border-color: #28a745 !important;
+}
+
+.border-info {
+ border-color: #17a2b8 !important;
+}
+
+.border-warning {
+ border-color: #ffc107 !important;
+}
+
+.border-danger {
+ border-color: #dc3545 !important;
+}
+
+.border-light {
+ border-color: #f8f9fa !important;
+}
+
+.border-dark {
+ border-color: #343a40 !important;
+}
+
+.border-white {
+ border-color: #fff !important;
+}
+
.rounded {
- border-radius: 0.25rem;
+ border-radius: 0.25rem !important;
}
.rounded-top {
- border-top-left-radius: 0.25rem;
- border-top-right-radius: 0.25rem;
+ border-top-left-radius: 0.25rem !important;
+ border-top-right-radius: 0.25rem !important;
}
.rounded-right {
- border-top-right-radius: 0.25rem;
- border-bottom-right-radius: 0.25rem;
+ border-top-right-radius: 0.25rem !important;
+ border-bottom-right-radius: 0.25rem !important;
}
.rounded-bottom {
- border-bottom-right-radius: 0.25rem;
- border-bottom-left-radius: 0.25rem;
+ border-bottom-right-radius: 0.25rem !important;
+ border-bottom-left-radius: 0.25rem !important;
}
.rounded-left {
- border-top-left-radius: 0.25rem;
- border-bottom-left-radius: 0.25rem;
+ border-top-left-radius: 0.25rem !important;
+ border-bottom-left-radius: 0.25rem !important;
}
.rounded-circle {
@@ -5821,15 +5425,11 @@ a.bg-inverse:focus, a.bg-inverse:hover {
}
.d-flex {
- display: -webkit-box !important;
- display: -webkit-flex !important;
display: -ms-flexbox !important;
display: flex !important;
}
.d-inline-flex {
- display: -webkit-inline-box !important;
- display: -webkit-inline-flex !important;
display: -ms-inline-flexbox !important;
display: inline-flex !important;
}
@@ -5854,14 +5454,10 @@ a.bg-inverse:focus, a.bg-inverse:hover {
display: table-cell !important;
}
.d-sm-flex {
- display: -webkit-box !important;
- display: -webkit-flex !important;
display: -ms-flexbox !important;
display: flex !important;
}
.d-sm-inline-flex {
- display: -webkit-inline-box !important;
- display: -webkit-inline-flex !important;
display: -ms-inline-flexbox !important;
display: inline-flex !important;
}
@@ -5887,14 +5483,10 @@ a.bg-inverse:focus, a.bg-inverse:hover {
display: table-cell !important;
}
.d-md-flex {
- display: -webkit-box !important;
- display: -webkit-flex !important;
display: -ms-flexbox !important;
display: flex !important;
}
.d-md-inline-flex {
- display: -webkit-inline-box !important;
- display: -webkit-inline-flex !important;
display: -ms-inline-flexbox !important;
display: inline-flex !important;
}
@@ -5920,14 +5512,10 @@ a.bg-inverse:focus, a.bg-inverse:hover {
display: table-cell !important;
}
.d-lg-flex {
- display: -webkit-box !important;
- display: -webkit-flex !important;
display: -ms-flexbox !important;
display: flex !important;
}
.d-lg-inline-flex {
- display: -webkit-inline-box !important;
- display: -webkit-inline-flex !important;
display: -ms-inline-flexbox !important;
display: inline-flex !important;
}
@@ -5953,14 +5541,10 @@ a.bg-inverse:focus, a.bg-inverse:hover {
display: table-cell !important;
}
.d-xl-flex {
- display: -webkit-box !important;
- display: -webkit-flex !important;
display: -ms-flexbox !important;
display: flex !important;
}
.d-xl-inline-flex {
- display: -webkit-inline-box !important;
- display: -webkit-inline-flex !important;
display: -ms-inline-flexbox !important;
display: inline-flex !important;
}
@@ -6002,962 +5586,667 @@ a.bg-inverse:focus, a.bg-inverse:hover {
}
}
-.order-first {
- -webkit-box-ordinal-group: 0;
- -webkit-order: -1;
- -ms-flex-order: -1;
- order: -1;
+.embed-responsive {
+ position: relative;
+ display: block;
+ width: 100%;
+ padding: 0;
+ overflow: hidden;
}
-.order-last {
- -webkit-box-ordinal-group: 2;
- -webkit-order: 1;
- -ms-flex-order: 1;
- order: 1;
+.embed-responsive::before {
+ display: block;
+ content: "";
}
-.order-0 {
- -webkit-box-ordinal-group: 1;
- -webkit-order: 0;
- -ms-flex-order: 0;
- order: 0;
+.embed-responsive .embed-responsive-item,
+.embed-responsive iframe,
+.embed-responsive embed,
+.embed-responsive object,
+.embed-responsive video {
+ position: absolute;
+ top: 0;
+ bottom: 0;
+ left: 0;
+ width: 100%;
+ height: 100%;
+ border: 0;
+}
+
+.embed-responsive-21by9::before {
+ padding-top: 42.857143%;
+}
+
+.embed-responsive-16by9::before {
+ padding-top: 56.25%;
+}
+
+.embed-responsive-4by3::before {
+ padding-top: 75%;
+}
+
+.embed-responsive-1by1::before {
+ padding-top: 100%;
}
.flex-row {
- -webkit-box-orient: horizontal !important;
- -webkit-box-direction: normal !important;
- -webkit-flex-direction: row !important;
- -ms-flex-direction: row !important;
- flex-direction: row !important;
+ -ms-flex-direction: row !important;
+ flex-direction: row !important;
}
.flex-column {
- -webkit-box-orient: vertical !important;
- -webkit-box-direction: normal !important;
- -webkit-flex-direction: column !important;
- -ms-flex-direction: column !important;
- flex-direction: column !important;
+ -ms-flex-direction: column !important;
+ flex-direction: column !important;
}
.flex-row-reverse {
- -webkit-box-orient: horizontal !important;
- -webkit-box-direction: reverse !important;
- -webkit-flex-direction: row-reverse !important;
- -ms-flex-direction: row-reverse !important;
- flex-direction: row-reverse !important;
+ -ms-flex-direction: row-reverse !important;
+ flex-direction: row-reverse !important;
}
.flex-column-reverse {
- -webkit-box-orient: vertical !important;
- -webkit-box-direction: reverse !important;
- -webkit-flex-direction: column-reverse !important;
- -ms-flex-direction: column-reverse !important;
- flex-direction: column-reverse !important;
+ -ms-flex-direction: column-reverse !important;
+ flex-direction: column-reverse !important;
}
.flex-wrap {
- -webkit-flex-wrap: wrap !important;
- -ms-flex-wrap: wrap !important;
- flex-wrap: wrap !important;
+ -ms-flex-wrap: wrap !important;
+ flex-wrap: wrap !important;
}
.flex-nowrap {
- -webkit-flex-wrap: nowrap !important;
- -ms-flex-wrap: nowrap !important;
- flex-wrap: nowrap !important;
+ -ms-flex-wrap: nowrap !important;
+ flex-wrap: nowrap !important;
}
.flex-wrap-reverse {
- -webkit-flex-wrap: wrap-reverse !important;
- -ms-flex-wrap: wrap-reverse !important;
- flex-wrap: wrap-reverse !important;
+ -ms-flex-wrap: wrap-reverse !important;
+ flex-wrap: wrap-reverse !important;
}
.justify-content-start {
- -webkit-box-pack: start !important;
- -webkit-justify-content: flex-start !important;
- -ms-flex-pack: start !important;
- justify-content: flex-start !important;
+ -ms-flex-pack: start !important;
+ justify-content: flex-start !important;
}
.justify-content-end {
- -webkit-box-pack: end !important;
- -webkit-justify-content: flex-end !important;
- -ms-flex-pack: end !important;
- justify-content: flex-end !important;
+ -ms-flex-pack: end !important;
+ justify-content: flex-end !important;
}
.justify-content-center {
- -webkit-box-pack: center !important;
- -webkit-justify-content: center !important;
- -ms-flex-pack: center !important;
- justify-content: center !important;
+ -ms-flex-pack: center !important;
+ justify-content: center !important;
}
.justify-content-between {
- -webkit-box-pack: justify !important;
- -webkit-justify-content: space-between !important;
- -ms-flex-pack: justify !important;
- justify-content: space-between !important;
+ -ms-flex-pack: justify !important;
+ justify-content: space-between !important;
}
.justify-content-around {
- -webkit-justify-content: space-around !important;
- -ms-flex-pack: distribute !important;
- justify-content: space-around !important;
+ -ms-flex-pack: distribute !important;
+ justify-content: space-around !important;
}
.align-items-start {
- -webkit-box-align: start !important;
- -webkit-align-items: flex-start !important;
- -ms-flex-align: start !important;
- align-items: flex-start !important;
+ -ms-flex-align: start !important;
+ align-items: flex-start !important;
}
.align-items-end {
- -webkit-box-align: end !important;
- -webkit-align-items: flex-end !important;
- -ms-flex-align: end !important;
- align-items: flex-end !important;
+ -ms-flex-align: end !important;
+ align-items: flex-end !important;
}
.align-items-center {
- -webkit-box-align: center !important;
- -webkit-align-items: center !important;
- -ms-flex-align: center !important;
- align-items: center !important;
+ -ms-flex-align: center !important;
+ align-items: center !important;
}
.align-items-baseline {
- -webkit-box-align: baseline !important;
- -webkit-align-items: baseline !important;
- -ms-flex-align: baseline !important;
- align-items: baseline !important;
+ -ms-flex-align: baseline !important;
+ align-items: baseline !important;
}
.align-items-stretch {
- -webkit-box-align: stretch !important;
- -webkit-align-items: stretch !important;
- -ms-flex-align: stretch !important;
- align-items: stretch !important;
+ -ms-flex-align: stretch !important;
+ align-items: stretch !important;
}
.align-content-start {
- -webkit-align-content: flex-start !important;
- -ms-flex-line-pack: start !important;
- align-content: flex-start !important;
+ -ms-flex-line-pack: start !important;
+ align-content: flex-start !important;
}
.align-content-end {
- -webkit-align-content: flex-end !important;
- -ms-flex-line-pack: end !important;
- align-content: flex-end !important;
+ -ms-flex-line-pack: end !important;
+ align-content: flex-end !important;
}
.align-content-center {
- -webkit-align-content: center !important;
- -ms-flex-line-pack: center !important;
- align-content: center !important;
+ -ms-flex-line-pack: center !important;
+ align-content: center !important;
}
.align-content-between {
- -webkit-align-content: space-between !important;
- -ms-flex-line-pack: justify !important;
- align-content: space-between !important;
+ -ms-flex-line-pack: justify !important;
+ align-content: space-between !important;
}
.align-content-around {
- -webkit-align-content: space-around !important;
- -ms-flex-line-pack: distribute !important;
- align-content: space-around !important;
+ -ms-flex-line-pack: distribute !important;
+ align-content: space-around !important;
}
.align-content-stretch {
- -webkit-align-content: stretch !important;
- -ms-flex-line-pack: stretch !important;
- align-content: stretch !important;
+ -ms-flex-line-pack: stretch !important;
+ align-content: stretch !important;
}
.align-self-auto {
- -webkit-align-self: auto !important;
- -ms-flex-item-align: auto !important;
- -ms-grid-row-align: auto !important;
- align-self: auto !important;
+ -ms-flex-item-align: auto !important;
+ align-self: auto !important;
}
.align-self-start {
- -webkit-align-self: flex-start !important;
- -ms-flex-item-align: start !important;
- align-self: flex-start !important;
+ -ms-flex-item-align: start !important;
+ align-self: flex-start !important;
}
.align-self-end {
- -webkit-align-self: flex-end !important;
- -ms-flex-item-align: end !important;
- align-self: flex-end !important;
+ -ms-flex-item-align: end !important;
+ align-self: flex-end !important;
}
.align-self-center {
- -webkit-align-self: center !important;
- -ms-flex-item-align: center !important;
- -ms-grid-row-align: center !important;
- align-self: center !important;
+ -ms-flex-item-align: center !important;
+ align-self: center !important;
}
.align-self-baseline {
- -webkit-align-self: baseline !important;
- -ms-flex-item-align: baseline !important;
- align-self: baseline !important;
+ -ms-flex-item-align: baseline !important;
+ align-self: baseline !important;
}
.align-self-stretch {
- -webkit-align-self: stretch !important;
- -ms-flex-item-align: stretch !important;
- -ms-grid-row-align: stretch !important;
- align-self: stretch !important;
+ -ms-flex-item-align: stretch !important;
+ align-self: stretch !important;
}
@media (min-width: 576px) {
- .order-sm-first {
- -webkit-box-ordinal-group: 0;
- -webkit-order: -1;
- -ms-flex-order: -1;
- order: -1;
- }
- .order-sm-last {
- -webkit-box-ordinal-group: 2;
- -webkit-order: 1;
- -ms-flex-order: 1;
- order: 1;
- }
- .order-sm-0 {
- -webkit-box-ordinal-group: 1;
- -webkit-order: 0;
- -ms-flex-order: 0;
- order: 0;
- }
.flex-sm-row {
- -webkit-box-orient: horizontal !important;
- -webkit-box-direction: normal !important;
- -webkit-flex-direction: row !important;
- -ms-flex-direction: row !important;
- flex-direction: row !important;
+ -ms-flex-direction: row !important;
+ flex-direction: row !important;
}
.flex-sm-column {
- -webkit-box-orient: vertical !important;
- -webkit-box-direction: normal !important;
- -webkit-flex-direction: column !important;
- -ms-flex-direction: column !important;
- flex-direction: column !important;
+ -ms-flex-direction: column !important;
+ flex-direction: column !important;
}
.flex-sm-row-reverse {
- -webkit-box-orient: horizontal !important;
- -webkit-box-direction: reverse !important;
- -webkit-flex-direction: row-reverse !important;
- -ms-flex-direction: row-reverse !important;
- flex-direction: row-reverse !important;
+ -ms-flex-direction: row-reverse !important;
+ flex-direction: row-reverse !important;
}
.flex-sm-column-reverse {
- -webkit-box-orient: vertical !important;
- -webkit-box-direction: reverse !important;
- -webkit-flex-direction: column-reverse !important;
- -ms-flex-direction: column-reverse !important;
- flex-direction: column-reverse !important;
+ -ms-flex-direction: column-reverse !important;
+ flex-direction: column-reverse !important;
}
.flex-sm-wrap {
- -webkit-flex-wrap: wrap !important;
- -ms-flex-wrap: wrap !important;
- flex-wrap: wrap !important;
+ -ms-flex-wrap: wrap !important;
+ flex-wrap: wrap !important;
}
.flex-sm-nowrap {
- -webkit-flex-wrap: nowrap !important;
- -ms-flex-wrap: nowrap !important;
- flex-wrap: nowrap !important;
+ -ms-flex-wrap: nowrap !important;
+ flex-wrap: nowrap !important;
}
.flex-sm-wrap-reverse {
- -webkit-flex-wrap: wrap-reverse !important;
- -ms-flex-wrap: wrap-reverse !important;
- flex-wrap: wrap-reverse !important;
+ -ms-flex-wrap: wrap-reverse !important;
+ flex-wrap: wrap-reverse !important;
}
.justify-content-sm-start {
- -webkit-box-pack: start !important;
- -webkit-justify-content: flex-start !important;
- -ms-flex-pack: start !important;
- justify-content: flex-start !important;
+ -ms-flex-pack: start !important;
+ justify-content: flex-start !important;
}
.justify-content-sm-end {
- -webkit-box-pack: end !important;
- -webkit-justify-content: flex-end !important;
- -ms-flex-pack: end !important;
- justify-content: flex-end !important;
+ -ms-flex-pack: end !important;
+ justify-content: flex-end !important;
}
.justify-content-sm-center {
- -webkit-box-pack: center !important;
- -webkit-justify-content: center !important;
- -ms-flex-pack: center !important;
- justify-content: center !important;
+ -ms-flex-pack: center !important;
+ justify-content: center !important;
}
.justify-content-sm-between {
- -webkit-box-pack: justify !important;
- -webkit-justify-content: space-between !important;
- -ms-flex-pack: justify !important;
- justify-content: space-between !important;
+ -ms-flex-pack: justify !important;
+ justify-content: space-between !important;
}
.justify-content-sm-around {
- -webkit-justify-content: space-around !important;
- -ms-flex-pack: distribute !important;
- justify-content: space-around !important;
+ -ms-flex-pack: distribute !important;
+ justify-content: space-around !important;
}
.align-items-sm-start {
- -webkit-box-align: start !important;
- -webkit-align-items: flex-start !important;
- -ms-flex-align: start !important;
- align-items: flex-start !important;
+ -ms-flex-align: start !important;
+ align-items: flex-start !important;
}
.align-items-sm-end {
- -webkit-box-align: end !important;
- -webkit-align-items: flex-end !important;
- -ms-flex-align: end !important;
- align-items: flex-end !important;
+ -ms-flex-align: end !important;
+ align-items: flex-end !important;
}
.align-items-sm-center {
- -webkit-box-align: center !important;
- -webkit-align-items: center !important;
- -ms-flex-align: center !important;
- align-items: center !important;
+ -ms-flex-align: center !important;
+ align-items: center !important;
}
.align-items-sm-baseline {
- -webkit-box-align: baseline !important;
- -webkit-align-items: baseline !important;
- -ms-flex-align: baseline !important;
- align-items: baseline !important;
+ -ms-flex-align: baseline !important;
+ align-items: baseline !important;
}
.align-items-sm-stretch {
- -webkit-box-align: stretch !important;
- -webkit-align-items: stretch !important;
- -ms-flex-align: stretch !important;
- align-items: stretch !important;
+ -ms-flex-align: stretch !important;
+ align-items: stretch !important;
}
.align-content-sm-start {
- -webkit-align-content: flex-start !important;
- -ms-flex-line-pack: start !important;
- align-content: flex-start !important;
+ -ms-flex-line-pack: start !important;
+ align-content: flex-start !important;
}
.align-content-sm-end {
- -webkit-align-content: flex-end !important;
- -ms-flex-line-pack: end !important;
- align-content: flex-end !important;
+ -ms-flex-line-pack: end !important;
+ align-content: flex-end !important;
}
.align-content-sm-center {
- -webkit-align-content: center !important;
- -ms-flex-line-pack: center !important;
- align-content: center !important;
+ -ms-flex-line-pack: center !important;
+ align-content: center !important;
}
.align-content-sm-between {
- -webkit-align-content: space-between !important;
- -ms-flex-line-pack: justify !important;
- align-content: space-between !important;
+ -ms-flex-line-pack: justify !important;
+ align-content: space-between !important;
}
.align-content-sm-around {
- -webkit-align-content: space-around !important;
- -ms-flex-line-pack: distribute !important;
- align-content: space-around !important;
+ -ms-flex-line-pack: distribute !important;
+ align-content: space-around !important;
}
.align-content-sm-stretch {
- -webkit-align-content: stretch !important;
- -ms-flex-line-pack: stretch !important;
- align-content: stretch !important;
+ -ms-flex-line-pack: stretch !important;
+ align-content: stretch !important;
}
.align-self-sm-auto {
- -webkit-align-self: auto !important;
- -ms-flex-item-align: auto !important;
- -ms-grid-row-align: auto !important;
- align-self: auto !important;
+ -ms-flex-item-align: auto !important;
+ align-self: auto !important;
}
.align-self-sm-start {
- -webkit-align-self: flex-start !important;
- -ms-flex-item-align: start !important;
- align-self: flex-start !important;
+ -ms-flex-item-align: start !important;
+ align-self: flex-start !important;
}
.align-self-sm-end {
- -webkit-align-self: flex-end !important;
- -ms-flex-item-align: end !important;
- align-self: flex-end !important;
+ -ms-flex-item-align: end !important;
+ align-self: flex-end !important;
}
.align-self-sm-center {
- -webkit-align-self: center !important;
- -ms-flex-item-align: center !important;
- -ms-grid-row-align: center !important;
- align-self: center !important;
+ -ms-flex-item-align: center !important;
+ align-self: center !important;
}
.align-self-sm-baseline {
- -webkit-align-self: baseline !important;
- -ms-flex-item-align: baseline !important;
- align-self: baseline !important;
+ -ms-flex-item-align: baseline !important;
+ align-self: baseline !important;
}
.align-self-sm-stretch {
- -webkit-align-self: stretch !important;
- -ms-flex-item-align: stretch !important;
- -ms-grid-row-align: stretch !important;
- align-self: stretch !important;
+ -ms-flex-item-align: stretch !important;
+ align-self: stretch !important;
}
}
@media (min-width: 768px) {
- .order-md-first {
- -webkit-box-ordinal-group: 0;
- -webkit-order: -1;
- -ms-flex-order: -1;
- order: -1;
- }
- .order-md-last {
- -webkit-box-ordinal-group: 2;
- -webkit-order: 1;
- -ms-flex-order: 1;
- order: 1;
- }
- .order-md-0 {
- -webkit-box-ordinal-group: 1;
- -webkit-order: 0;
- -ms-flex-order: 0;
- order: 0;
- }
.flex-md-row {
- -webkit-box-orient: horizontal !important;
- -webkit-box-direction: normal !important;
- -webkit-flex-direction: row !important;
- -ms-flex-direction: row !important;
- flex-direction: row !important;
+ -ms-flex-direction: row !important;
+ flex-direction: row !important;
}
.flex-md-column {
- -webkit-box-orient: vertical !important;
- -webkit-box-direction: normal !important;
- -webkit-flex-direction: column !important;
- -ms-flex-direction: column !important;
- flex-direction: column !important;
+ -ms-flex-direction: column !important;
+ flex-direction: column !important;
}
.flex-md-row-reverse {
- -webkit-box-orient: horizontal !important;
- -webkit-box-direction: reverse !important;
- -webkit-flex-direction: row-reverse !important;
- -ms-flex-direction: row-reverse !important;
- flex-direction: row-reverse !important;
+ -ms-flex-direction: row-reverse !important;
+ flex-direction: row-reverse !important;
}
.flex-md-column-reverse {
- -webkit-box-orient: vertical !important;
- -webkit-box-direction: reverse !important;
- -webkit-flex-direction: column-reverse !important;
- -ms-flex-direction: column-reverse !important;
- flex-direction: column-reverse !important;
+ -ms-flex-direction: column-reverse !important;
+ flex-direction: column-reverse !important;
}
.flex-md-wrap {
- -webkit-flex-wrap: wrap !important;
- -ms-flex-wrap: wrap !important;
- flex-wrap: wrap !important;
+ -ms-flex-wrap: wrap !important;
+ flex-wrap: wrap !important;
}
.flex-md-nowrap {
- -webkit-flex-wrap: nowrap !important;
- -ms-flex-wrap: nowrap !important;
- flex-wrap: nowrap !important;
+ -ms-flex-wrap: nowrap !important;
+ flex-wrap: nowrap !important;
}
.flex-md-wrap-reverse {
- -webkit-flex-wrap: wrap-reverse !important;
- -ms-flex-wrap: wrap-reverse !important;
- flex-wrap: wrap-reverse !important;
+ -ms-flex-wrap: wrap-reverse !important;
+ flex-wrap: wrap-reverse !important;
}
.justify-content-md-start {
- -webkit-box-pack: start !important;
- -webkit-justify-content: flex-start !important;
- -ms-flex-pack: start !important;
- justify-content: flex-start !important;
+ -ms-flex-pack: start !important;
+ justify-content: flex-start !important;
}
.justify-content-md-end {
- -webkit-box-pack: end !important;
- -webkit-justify-content: flex-end !important;
- -ms-flex-pack: end !important;
- justify-content: flex-end !important;
+ -ms-flex-pack: end !important;
+ justify-content: flex-end !important;
}
.justify-content-md-center {
- -webkit-box-pack: center !important;
- -webkit-justify-content: center !important;
- -ms-flex-pack: center !important;
- justify-content: center !important;
+ -ms-flex-pack: center !important;
+ justify-content: center !important;
}
.justify-content-md-between {
- -webkit-box-pack: justify !important;
- -webkit-justify-content: space-between !important;
- -ms-flex-pack: justify !important;
- justify-content: space-between !important;
+ -ms-flex-pack: justify !important;
+ justify-content: space-between !important;
}
.justify-content-md-around {
- -webkit-justify-content: space-around !important;
- -ms-flex-pack: distribute !important;
- justify-content: space-around !important;
+ -ms-flex-pack: distribute !important;
+ justify-content: space-around !important;
}
.align-items-md-start {
- -webkit-box-align: start !important;
- -webkit-align-items: flex-start !important;
- -ms-flex-align: start !important;
- align-items: flex-start !important;
+ -ms-flex-align: start !important;
+ align-items: flex-start !important;
}
.align-items-md-end {
- -webkit-box-align: end !important;
- -webkit-align-items: flex-end !important;
- -ms-flex-align: end !important;
- align-items: flex-end !important;
+ -ms-flex-align: end !important;
+ align-items: flex-end !important;
}
.align-items-md-center {
- -webkit-box-align: center !important;
- -webkit-align-items: center !important;
- -ms-flex-align: center !important;
- align-items: center !important;
+ -ms-flex-align: center !important;
+ align-items: center !important;
}
.align-items-md-baseline {
- -webkit-box-align: baseline !important;
- -webkit-align-items: baseline !important;
- -ms-flex-align: baseline !important;
- align-items: baseline !important;
+ -ms-flex-align: baseline !important;
+ align-items: baseline !important;
}
.align-items-md-stretch {
- -webkit-box-align: stretch !important;
- -webkit-align-items: stretch !important;
- -ms-flex-align: stretch !important;
- align-items: stretch !important;
+ -ms-flex-align: stretch !important;
+ align-items: stretch !important;
}
.align-content-md-start {
- -webkit-align-content: flex-start !important;
- -ms-flex-line-pack: start !important;
- align-content: flex-start !important;
+ -ms-flex-line-pack: start !important;
+ align-content: flex-start !important;
}
.align-content-md-end {
- -webkit-align-content: flex-end !important;
- -ms-flex-line-pack: end !important;
- align-content: flex-end !important;
+ -ms-flex-line-pack: end !important;
+ align-content: flex-end !important;
}
.align-content-md-center {
- -webkit-align-content: center !important;
- -ms-flex-line-pack: center !important;
- align-content: center !important;
+ -ms-flex-line-pack: center !important;
+ align-content: center !important;
}
.align-content-md-between {
- -webkit-align-content: space-between !important;
- -ms-flex-line-pack: justify !important;
- align-content: space-between !important;
+ -ms-flex-line-pack: justify !important;
+ align-content: space-between !important;
}
.align-content-md-around {
- -webkit-align-content: space-around !important;
- -ms-flex-line-pack: distribute !important;
- align-content: space-around !important;
+ -ms-flex-line-pack: distribute !important;
+ align-content: space-around !important;
}
.align-content-md-stretch {
- -webkit-align-content: stretch !important;
- -ms-flex-line-pack: stretch !important;
- align-content: stretch !important;
+ -ms-flex-line-pack: stretch !important;
+ align-content: stretch !important;
}
.align-self-md-auto {
- -webkit-align-self: auto !important;
- -ms-flex-item-align: auto !important;
- -ms-grid-row-align: auto !important;
- align-self: auto !important;
+ -ms-flex-item-align: auto !important;
+ align-self: auto !important;
}
.align-self-md-start {
- -webkit-align-self: flex-start !important;
- -ms-flex-item-align: start !important;
- align-self: flex-start !important;
+ -ms-flex-item-align: start !important;
+ align-self: flex-start !important;
}
.align-self-md-end {
- -webkit-align-self: flex-end !important;
- -ms-flex-item-align: end !important;
- align-self: flex-end !important;
+ -ms-flex-item-align: end !important;
+ align-self: flex-end !important;
}
.align-self-md-center {
- -webkit-align-self: center !important;
- -ms-flex-item-align: center !important;
- -ms-grid-row-align: center !important;
- align-self: center !important;
+ -ms-flex-item-align: center !important;
+ align-self: center !important;
}
.align-self-md-baseline {
- -webkit-align-self: baseline !important;
- -ms-flex-item-align: baseline !important;
- align-self: baseline !important;
+ -ms-flex-item-align: baseline !important;
+ align-self: baseline !important;
}
.align-self-md-stretch {
- -webkit-align-self: stretch !important;
- -ms-flex-item-align: stretch !important;
- -ms-grid-row-align: stretch !important;
- align-self: stretch !important;
+ -ms-flex-item-align: stretch !important;
+ align-self: stretch !important;
}
}
@media (min-width: 992px) {
- .order-lg-first {
- -webkit-box-ordinal-group: 0;
- -webkit-order: -1;
- -ms-flex-order: -1;
- order: -1;
- }
- .order-lg-last {
- -webkit-box-ordinal-group: 2;
- -webkit-order: 1;
- -ms-flex-order: 1;
- order: 1;
- }
- .order-lg-0 {
- -webkit-box-ordinal-group: 1;
- -webkit-order: 0;
- -ms-flex-order: 0;
- order: 0;
- }
.flex-lg-row {
- -webkit-box-orient: horizontal !important;
- -webkit-box-direction: normal !important;
- -webkit-flex-direction: row !important;
- -ms-flex-direction: row !important;
- flex-direction: row !important;
+ -ms-flex-direction: row !important;
+ flex-direction: row !important;
}
.flex-lg-column {
- -webkit-box-orient: vertical !important;
- -webkit-box-direction: normal !important;
- -webkit-flex-direction: column !important;
- -ms-flex-direction: column !important;
- flex-direction: column !important;
+ -ms-flex-direction: column !important;
+ flex-direction: column !important;
}
.flex-lg-row-reverse {
- -webkit-box-orient: horizontal !important;
- -webkit-box-direction: reverse !important;
- -webkit-flex-direction: row-reverse !important;
- -ms-flex-direction: row-reverse !important;
- flex-direction: row-reverse !important;
+ -ms-flex-direction: row-reverse !important;
+ flex-direction: row-reverse !important;
}
.flex-lg-column-reverse {
- -webkit-box-orient: vertical !important;
- -webkit-box-direction: reverse !important;
- -webkit-flex-direction: column-reverse !important;
- -ms-flex-direction: column-reverse !important;
- flex-direction: column-reverse !important;
+ -ms-flex-direction: column-reverse !important;
+ flex-direction: column-reverse !important;
}
.flex-lg-wrap {
- -webkit-flex-wrap: wrap !important;
- -ms-flex-wrap: wrap !important;
- flex-wrap: wrap !important;
+ -ms-flex-wrap: wrap !important;
+ flex-wrap: wrap !important;
}
.flex-lg-nowrap {
- -webkit-flex-wrap: nowrap !important;
- -ms-flex-wrap: nowrap !important;
- flex-wrap: nowrap !important;
+ -ms-flex-wrap: nowrap !important;
+ flex-wrap: nowrap !important;
}
.flex-lg-wrap-reverse {
- -webkit-flex-wrap: wrap-reverse !important;
- -ms-flex-wrap: wrap-reverse !important;
- flex-wrap: wrap-reverse !important;
+ -ms-flex-wrap: wrap-reverse !important;
+ flex-wrap: wrap-reverse !important;
}
.justify-content-lg-start {
- -webkit-box-pack: start !important;
- -webkit-justify-content: flex-start !important;
- -ms-flex-pack: start !important;
- justify-content: flex-start !important;
+ -ms-flex-pack: start !important;
+ justify-content: flex-start !important;
}
.justify-content-lg-end {
- -webkit-box-pack: end !important;
- -webkit-justify-content: flex-end !important;
- -ms-flex-pack: end !important;
- justify-content: flex-end !important;
+ -ms-flex-pack: end !important;
+ justify-content: flex-end !important;
}
.justify-content-lg-center {
- -webkit-box-pack: center !important;
- -webkit-justify-content: center !important;
- -ms-flex-pack: center !important;
- justify-content: center !important;
+ -ms-flex-pack: center !important;
+ justify-content: center !important;
}
.justify-content-lg-between {
- -webkit-box-pack: justify !important;
- -webkit-justify-content: space-between !important;
- -ms-flex-pack: justify !important;
- justify-content: space-between !important;
+ -ms-flex-pack: justify !important;
+ justify-content: space-between !important;
}
.justify-content-lg-around {
- -webkit-justify-content: space-around !important;
- -ms-flex-pack: distribute !important;
- justify-content: space-around !important;
+ -ms-flex-pack: distribute !important;
+ justify-content: space-around !important;
}
.align-items-lg-start {
- -webkit-box-align: start !important;
- -webkit-align-items: flex-start !important;
- -ms-flex-align: start !important;
- align-items: flex-start !important;
+ -ms-flex-align: start !important;
+ align-items: flex-start !important;
}
.align-items-lg-end {
- -webkit-box-align: end !important;
- -webkit-align-items: flex-end !important;
- -ms-flex-align: end !important;
- align-items: flex-end !important;
+ -ms-flex-align: end !important;
+ align-items: flex-end !important;
}
.align-items-lg-center {
- -webkit-box-align: center !important;
- -webkit-align-items: center !important;
- -ms-flex-align: center !important;
- align-items: center !important;
+ -ms-flex-align: center !important;
+ align-items: center !important;
}
.align-items-lg-baseline {
- -webkit-box-align: baseline !important;
- -webkit-align-items: baseline !important;
- -ms-flex-align: baseline !important;
- align-items: baseline !important;
+ -ms-flex-align: baseline !important;
+ align-items: baseline !important;
}
.align-items-lg-stretch {
- -webkit-box-align: stretch !important;
- -webkit-align-items: stretch !important;
- -ms-flex-align: stretch !important;
- align-items: stretch !important;
+ -ms-flex-align: stretch !important;
+ align-items: stretch !important;
}
.align-content-lg-start {
- -webkit-align-content: flex-start !important;
- -ms-flex-line-pack: start !important;
- align-content: flex-start !important;
+ -ms-flex-line-pack: start !important;
+ align-content: flex-start !important;
}
.align-content-lg-end {
- -webkit-align-content: flex-end !important;
- -ms-flex-line-pack: end !important;
- align-content: flex-end !important;
+ -ms-flex-line-pack: end !important;
+ align-content: flex-end !important;
}
.align-content-lg-center {
- -webkit-align-content: center !important;
- -ms-flex-line-pack: center !important;
- align-content: center !important;
+ -ms-flex-line-pack: center !important;
+ align-content: center !important;
}
.align-content-lg-between {
- -webkit-align-content: space-between !important;
- -ms-flex-line-pack: justify !important;
- align-content: space-between !important;
+ -ms-flex-line-pack: justify !important;
+ align-content: space-between !important;
}
.align-content-lg-around {
- -webkit-align-content: space-around !important;
- -ms-flex-line-pack: distribute !important;
- align-content: space-around !important;
+ -ms-flex-line-pack: distribute !important;
+ align-content: space-around !important;
}
.align-content-lg-stretch {
- -webkit-align-content: stretch !important;
- -ms-flex-line-pack: stretch !important;
- align-content: stretch !important;
+ -ms-flex-line-pack: stretch !important;
+ align-content: stretch !important;
}
.align-self-lg-auto {
- -webkit-align-self: auto !important;
- -ms-flex-item-align: auto !important;
- -ms-grid-row-align: auto !important;
- align-self: auto !important;
+ -ms-flex-item-align: auto !important;
+ align-self: auto !important;
}
.align-self-lg-start {
- -webkit-align-self: flex-start !important;
- -ms-flex-item-align: start !important;
- align-self: flex-start !important;
+ -ms-flex-item-align: start !important;
+ align-self: flex-start !important;
}
.align-self-lg-end {
- -webkit-align-self: flex-end !important;
- -ms-flex-item-align: end !important;
- align-self: flex-end !important;
+ -ms-flex-item-align: end !important;
+ align-self: flex-end !important;
}
.align-self-lg-center {
- -webkit-align-self: center !important;
- -ms-flex-item-align: center !important;
- -ms-grid-row-align: center !important;
- align-self: center !important;
+ -ms-flex-item-align: center !important;
+ align-self: center !important;
}
.align-self-lg-baseline {
- -webkit-align-self: baseline !important;
- -ms-flex-item-align: baseline !important;
- align-self: baseline !important;
+ -ms-flex-item-align: baseline !important;
+ align-self: baseline !important;
}
.align-self-lg-stretch {
- -webkit-align-self: stretch !important;
- -ms-flex-item-align: stretch !important;
- -ms-grid-row-align: stretch !important;
- align-self: stretch !important;
+ -ms-flex-item-align: stretch !important;
+ align-self: stretch !important;
}
}
@media (min-width: 1200px) {
- .order-xl-first {
- -webkit-box-ordinal-group: 0;
- -webkit-order: -1;
- -ms-flex-order: -1;
- order: -1;
- }
- .order-xl-last {
- -webkit-box-ordinal-group: 2;
- -webkit-order: 1;
- -ms-flex-order: 1;
- order: 1;
- }
- .order-xl-0 {
- -webkit-box-ordinal-group: 1;
- -webkit-order: 0;
- -ms-flex-order: 0;
- order: 0;
- }
.flex-xl-row {
- -webkit-box-orient: horizontal !important;
- -webkit-box-direction: normal !important;
- -webkit-flex-direction: row !important;
- -ms-flex-direction: row !important;
- flex-direction: row !important;
+ -ms-flex-direction: row !important;
+ flex-direction: row !important;
}
.flex-xl-column {
- -webkit-box-orient: vertical !important;
- -webkit-box-direction: normal !important;
- -webkit-flex-direction: column !important;
- -ms-flex-direction: column !important;
- flex-direction: column !important;
+ -ms-flex-direction: column !important;
+ flex-direction: column !important;
}
.flex-xl-row-reverse {
- -webkit-box-orient: horizontal !important;
- -webkit-box-direction: reverse !important;
- -webkit-flex-direction: row-reverse !important;
- -ms-flex-direction: row-reverse !important;
- flex-direction: row-reverse !important;
+ -ms-flex-direction: row-reverse !important;
+ flex-direction: row-reverse !important;
}
.flex-xl-column-reverse {
- -webkit-box-orient: vertical !important;
- -webkit-box-direction: reverse !important;
- -webkit-flex-direction: column-reverse !important;
- -ms-flex-direction: column-reverse !important;
- flex-direction: column-reverse !important;
+ -ms-flex-direction: column-reverse !important;
+ flex-direction: column-reverse !important;
}
.flex-xl-wrap {
- -webkit-flex-wrap: wrap !important;
- -ms-flex-wrap: wrap !important;
- flex-wrap: wrap !important;
+ -ms-flex-wrap: wrap !important;
+ flex-wrap: wrap !important;
}
.flex-xl-nowrap {
- -webkit-flex-wrap: nowrap !important;
- -ms-flex-wrap: nowrap !important;
- flex-wrap: nowrap !important;
+ -ms-flex-wrap: nowrap !important;
+ flex-wrap: nowrap !important;
}
.flex-xl-wrap-reverse {
- -webkit-flex-wrap: wrap-reverse !important;
- -ms-flex-wrap: wrap-reverse !important;
- flex-wrap: wrap-reverse !important;
+ -ms-flex-wrap: wrap-reverse !important;
+ flex-wrap: wrap-reverse !important;
}
.justify-content-xl-start {
- -webkit-box-pack: start !important;
- -webkit-justify-content: flex-start !important;
- -ms-flex-pack: start !important;
- justify-content: flex-start !important;
+ -ms-flex-pack: start !important;
+ justify-content: flex-start !important;
}
.justify-content-xl-end {
- -webkit-box-pack: end !important;
- -webkit-justify-content: flex-end !important;
- -ms-flex-pack: end !important;
- justify-content: flex-end !important;
+ -ms-flex-pack: end !important;
+ justify-content: flex-end !important;
}
.justify-content-xl-center {
- -webkit-box-pack: center !important;
- -webkit-justify-content: center !important;
- -ms-flex-pack: center !important;
- justify-content: center !important;
+ -ms-flex-pack: center !important;
+ justify-content: center !important;
}
.justify-content-xl-between {
- -webkit-box-pack: justify !important;
- -webkit-justify-content: space-between !important;
- -ms-flex-pack: justify !important;
- justify-content: space-between !important;
+ -ms-flex-pack: justify !important;
+ justify-content: space-between !important;
}
.justify-content-xl-around {
- -webkit-justify-content: space-around !important;
- -ms-flex-pack: distribute !important;
- justify-content: space-around !important;
+ -ms-flex-pack: distribute !important;
+ justify-content: space-around !important;
}
.align-items-xl-start {
- -webkit-box-align: start !important;
- -webkit-align-items: flex-start !important;
- -ms-flex-align: start !important;
- align-items: flex-start !important;
+ -ms-flex-align: start !important;
+ align-items: flex-start !important;
}
.align-items-xl-end {
- -webkit-box-align: end !important;
- -webkit-align-items: flex-end !important;
- -ms-flex-align: end !important;
- align-items: flex-end !important;
+ -ms-flex-align: end !important;
+ align-items: flex-end !important;
}
.align-items-xl-center {
- -webkit-box-align: center !important;
- -webkit-align-items: center !important;
- -ms-flex-align: center !important;
- align-items: center !important;
+ -ms-flex-align: center !important;
+ align-items: center !important;
}
.align-items-xl-baseline {
- -webkit-box-align: baseline !important;
- -webkit-align-items: baseline !important;
- -ms-flex-align: baseline !important;
- align-items: baseline !important;
+ -ms-flex-align: baseline !important;
+ align-items: baseline !important;
}
.align-items-xl-stretch {
- -webkit-box-align: stretch !important;
- -webkit-align-items: stretch !important;
- -ms-flex-align: stretch !important;
- align-items: stretch !important;
+ -ms-flex-align: stretch !important;
+ align-items: stretch !important;
}
.align-content-xl-start {
- -webkit-align-content: flex-start !important;
- -ms-flex-line-pack: start !important;
- align-content: flex-start !important;
+ -ms-flex-line-pack: start !important;
+ align-content: flex-start !important;
}
.align-content-xl-end {
- -webkit-align-content: flex-end !important;
- -ms-flex-line-pack: end !important;
- align-content: flex-end !important;
+ -ms-flex-line-pack: end !important;
+ align-content: flex-end !important;
}
.align-content-xl-center {
- -webkit-align-content: center !important;
- -ms-flex-line-pack: center !important;
- align-content: center !important;
+ -ms-flex-line-pack: center !important;
+ align-content: center !important;
}
.align-content-xl-between {
- -webkit-align-content: space-between !important;
- -ms-flex-line-pack: justify !important;
- align-content: space-between !important;
+ -ms-flex-line-pack: justify !important;
+ align-content: space-between !important;
}
.align-content-xl-around {
- -webkit-align-content: space-around !important;
- -ms-flex-line-pack: distribute !important;
- align-content: space-around !important;
+ -ms-flex-line-pack: distribute !important;
+ align-content: space-around !important;
}
.align-content-xl-stretch {
- -webkit-align-content: stretch !important;
- -ms-flex-line-pack: stretch !important;
- align-content: stretch !important;
+ -ms-flex-line-pack: stretch !important;
+ align-content: stretch !important;
}
.align-self-xl-auto {
- -webkit-align-self: auto !important;
- -ms-flex-item-align: auto !important;
- -ms-grid-row-align: auto !important;
- align-self: auto !important;
+ -ms-flex-item-align: auto !important;
+ align-self: auto !important;
}
.align-self-xl-start {
- -webkit-align-self: flex-start !important;
- -ms-flex-item-align: start !important;
- align-self: flex-start !important;
+ -ms-flex-item-align: start !important;
+ align-self: flex-start !important;
}
.align-self-xl-end {
- -webkit-align-self: flex-end !important;
- -ms-flex-item-align: end !important;
- align-self: flex-end !important;
+ -ms-flex-item-align: end !important;
+ align-self: flex-end !important;
}
.align-self-xl-center {
- -webkit-align-self: center !important;
- -ms-flex-item-align: center !important;
- -ms-grid-row-align: center !important;
- align-self: center !important;
+ -ms-flex-item-align: center !important;
+ align-self: center !important;
}
.align-self-xl-baseline {
- -webkit-align-self: baseline !important;
- -ms-flex-item-align: baseline !important;
- align-self: baseline !important;
+ -ms-flex-item-align: baseline !important;
+ align-self: baseline !important;
}
.align-self-xl-stretch {
- -webkit-align-self: stretch !important;
- -ms-flex-item-align: stretch !important;
- -ms-grid-row-align: stretch !important;
- align-self: stretch !important;
+ -ms-flex-item-align: stretch !important;
+ align-self: stretch !important;
}
}
@@ -7037,11 +6326,13 @@ a.bg-inverse:focus, a.bg-inverse:hover {
z-index: 1030;
}
-.sticky-top {
- position: -webkit-sticky;
- position: sticky;
- top: 0;
- z-index: 1020;
+@supports ((position: -webkit-sticky) or (position: sticky)) {
+ .sticky-top {
+ position: -webkit-sticky;
+ position: sticky;
+ top: 0;
+ z-index: 1020;
+ }
}
.sr-only {
@@ -8808,60 +8099,72 @@ a.bg-inverse:focus, a.bg-inverse:hover {
color: #fff !important;
}
-.text-muted {
- color: #636c72 !important;
+.text-primary {
+ color: #007bff !important;
}
-a.text-muted:focus, a.text-muted:hover {
- color: #4b5257 !important;
+a.text-primary:focus, a.text-primary:hover {
+ color: #0062cc !important;
}
-.text-primary {
- color: #0275d8 !important;
+.text-secondary {
+ color: #868e96 !important;
}
-a.text-primary:focus, a.text-primary:hover {
- color: #025aa5 !important;
+a.text-secondary:focus, a.text-secondary:hover {
+ color: #6c757d !important;
}
.text-success {
- color: #5cb85c !important;
+ color: #28a745 !important;
}
a.text-success:focus, a.text-success:hover {
- color: #449d44 !important;
+ color: #1e7e34 !important;
}
.text-info {
- color: #5bc0de !important;
+ color: #17a2b8 !important;
}
a.text-info:focus, a.text-info:hover {
- color: #31b0d5 !important;
+ color: #117a8b !important;
}
.text-warning {
- color: #f0ad4e !important;
+ color: #ffc107 !important;
}
a.text-warning:focus, a.text-warning:hover {
- color: #ec971f !important;
+ color: #d39e00 !important;
}
.text-danger {
- color: #d9534f !important;
+ color: #dc3545 !important;
}
a.text-danger:focus, a.text-danger:hover {
- color: #c9302c !important;
+ color: #bd2130 !important;
}
-.text-gray-dark {
- color: #292b2c !important;
+.text-light {
+ color: #f8f9fa !important;
}
-a.text-gray-dark:focus, a.text-gray-dark:hover {
- color: #101112 !important;
+a.text-light:focus, a.text-light:hover {
+ color: #dae0e5 !important;
+}
+
+.text-dark {
+ color: #343a40 !important;
+}
+
+a.text-dark:focus, a.text-dark:hover {
+ color: #1d2124 !important;
+}
+
+.text-muted {
+ color: #868e96 !important;
}
.text-hide {
diff --git a/library/bootstrap/css/bootstrap.css.map b/library/bootstrap/css/bootstrap.css.map
index 8b8511a52..14530357a 100644
--- a/library/bootstrap/css/bootstrap.css.map
+++ b/library/bootstrap/css/bootstrap.css.map
@@ -1 +1 @@
-{"version":3,"sources":["../../scss/bootstrap.scss","../../scss/_print.scss","bootstrap.css","../../scss/_reboot.scss","../../scss/_variables.scss","../../scss/mixins/_hover.scss","../../scss/_type.scss","../../scss/mixins/_lists.scss","../../scss/_images.scss","../../scss/mixins/_image.scss","../../scss/mixins/_border-radius.scss","../../scss/mixins/_transition.scss","../../scss/_code.scss","../../scss/_grid.scss","../../scss/mixins/_grid.scss","../../scss/mixins/_breakpoints.scss","../../scss/mixins/_grid-framework.scss","../../scss/_tables.scss","../../scss/mixins/_table-row.scss","../../scss/_forms.scss","../../scss/mixins/_forms.scss","../../scss/_buttons.scss","../../scss/mixins/_buttons.scss","../../scss/_transitions.scss","../../scss/_dropdown.scss","../../scss/mixins/_nav-divider.scss","../../scss/_button-group.scss","../../scss/_input-group.scss","../../scss/_custom-forms.scss","../../scss/_nav.scss","../../scss/_navbar.scss","../../scss/_card.scss","../../scss/mixins/_cards.scss","../../scss/_breadcrumb.scss","../../scss/mixins/_clearfix.scss","../../scss/_pagination.scss","../../scss/mixins/_pagination.scss","../../scss/_badge.scss","../../scss/mixins/_badge.scss","../../scss/_jumbotron.scss","../../scss/_alert.scss","../../scss/mixins/_alert.scss","../../scss/_progress.scss","../../scss/mixins/_gradients.scss","../../scss/_media.scss","../../scss/_list-group.scss","../../scss/mixins/_list-group.scss","../../scss/_responsive-embed.scss","../../scss/_close.scss","../../scss/_modal.scss","../../scss/_tooltip.scss","../../scss/mixins/_reset-text.scss","../../scss/_popover.scss","../../scss/_carousel.scss","../../scss/utilities/_align.scss","../../scss/utilities/_background.scss","../../scss/mixins/_background-variant.scss","../../scss/utilities/_borders.scss","../../scss/utilities/_display.scss","../../scss/utilities/_flex.scss","../../scss/utilities/_float.scss","../../scss/mixins/_float.scss","../../scss/utilities/_position.scss","../../scss/utilities/_screenreaders.scss","../../scss/mixins/_screen-reader.scss","../../scss/utilities/_sizing.scss","../../scss/utilities/_spacing.scss","../../scss/utilities/_text.scss","../../scss/mixins/_text-truncate.scss","../../scss/mixins/_text-emphasis.scss","../../scss/mixins/_text-hide.scss","../../scss/utilities/_visibility.scss","../../scss/mixins/_visibility.scss"],"names":[],"mappings":"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ACf;;AAED;EAEI,YAAW;CACZ;;AAHH;EAKI,uBAAsB;CACvB;;AEtIH;ECIE,gBAAe;EAGf,aAAY;CDLb;;AAID;EACE,iBJ00BkC;EIz0BlC,uBJ+EW;EI9EX,uBJ20BgC;EMv1B9B,uBNgO2B;EO/NzB,yCPy1B2C;EOz1B3C,oCPy1B2C;EOz1B3C,iCPy1B2C;EKn1B/C,gBAAe;EAGf,aAAY;CDSb;;AAMD;EAEE,sBAAqB;CACtB;;AAED;EACE,sBAA4B;EAC5B,eAAc;CACf;;AAED;EACE,eJ2zB4B;EI1zB5B,eJmEiC;CIlElC;;AIzCD;;;;EAIE,kFRkP2F;CQjP5F;;AAGD;EACE,uBR04BiC;EQz4BjC,eRu4B+B;EQt4B/B,eRy4BmC;EQx4BnC,0BRiGiC;EM1G/B,uBNgO2B;CQ9M9B;;AALC;EACE,WAAU;EACV,eAAc;EACd,0BAAyB;CAC1B;;AAIH;EACE,uBR03BiC;EQz3BjC,eRu3B+B;EQt3B/B,YRkEW;EQjEX,0BR6EiC;EMtG/B,sBNkO0B;CQ/L7B;;AAdD;EASI,WAAU;EACV,gBAAe;EACf,kBR4NmB;CQ1NpB;;AAIH;EACE,eAAc;EACd,cAAa;EACb,oBAAmB;EACnB,eRo2B+B;EQn2B/B,eR2DiC;CQjDlC;;AAfD;EASI,WAAU;EACV,mBAAkB;EAClB,eAAc;EACd,8BAA6B;EAC7B,iBAAgB;CACjB;;AAIH;EACE,kBR+1BiC;EQ91BjC,mBAAkB;CACnB;;AC1DC;ECAA,mBAAkB;EAClB,kBAAiB;EAKb,oBAA4B;EAC5B,mBAA4B;CDJ/B;;AEgDC;EFnDF;ICMI,oBAA4B;IAC5B,mBAA4B;GDJ/B;CX8mBF;;Aa9jBG;EFnDF;ICMI,oBAA4B;IAC5B,mBAA4B;GDJ/B;CXqnBF;;AarkBG;EFnDF;ICMI,oBAA4B;IAC5B,mBAA4B;GDJ/B;CX4nBF;;Aa5kBG;EFnDF;ICMI,oBAA4B;IAC5B,mBAA4B;GDJ/B;CXmoBF;;AanlBG;EFnDF;ICiBI,aV8KK;IU7KL,gBAAe;GDflB;CX0oBF;;Aa1lBG;EFnDF;ICiBI,aV+KK;IU9KL,gBAAe;GDflB;CXipBF;;AajmBG;EFnDF;ICiBI,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EAMI,uDlBiV+B;UkBjV/B,+ClBiV+B;CkB/UlC;;AAGD;EAEE,uBlB6DS;EkB5DT,mBlByUiC;CkBxUlC;;AAED;;EAGE,elBkE+B;EkBjE/B,0BAnC0C;EAoC1C,uBAAsB;EACtB,sBApCkC;CAsCnC;;ADaH;ECjDE,YlBqFW;EkBpFX,0BlB2Fc;EkB1Fd,sBlB0Fc;CiBzCf;;AhBjDG;EiBKA,YlB8ES;EkB7ET,0BAX0C;EAY1C,sBAXkC;CjBIb;;AiBSvB;EAMI,sDlB2EU;UkB3EV,8ClB2EU;CkBzEb;;AAGD;EAEE,0BlBoEY;EkBnEZ,sBlBmEY;CkBlEb;;AAED;;EAGE,YlBsDS;EkBrDT,0BAnC0C;EAoC1C,uBAAsB;EACtB,sBApCkC;CAsCnC;;ADgBH;ECpDE,YlBqFW;EkBpFX,0BlByFc;EkBxFd,sBlBwFc;CiBpCf;;AhBpDG;EiBKA,YlB8ES;EkB7ET,0BAX0C;EAY1C,sBAXkC;CjBIb;;AiBSvB;EAMI,qDlByEU;UkBzEV,6ClByEU;CkBvEb;;AAGD;EAEE,0BlBkEY;EkBjEZ,sBlBiEY;CkBhEb;;AAED;;EAGE,YlBsDS;EkBrDT,0BAnC0C;EAoC1C,uBAAsB;EACtB,sBApCkC;CAsCnC;;ADmBH;ECvDE,YlBqFW;EkBpFX,0BlBuFc;EkBtFd,sBlBsFc;CiB/Bf;;AhBvDG;EiBKA,YlB8ES;EkB7ET,0BAX0C;EAY1C,sBAXkC;CjBIb;;AiBSvB;EAMI,sDlBuEU;UkBvEV,8ClBuEU;CkBrEb;;AAGD;EAEE,0BlBgEY;EkB/DZ,sBlB+DY;CkB9Db;;AAED;;EAGE,YlBsDS;EkBrDT,0BAnC0C;EAoC1C,uBAAsB;EACtB,sBApCkC;CAsCnC;;ADsBH;EC1DE,YlBqFW;EkBpFX,0BlBsFc;EkBrFd,sBlBqFc;CiB3Bf;;AhB1DG;EiBKA,YlB8ES;EkB7ET,0BAX0C;EAY1C,sBAXkC;CjBIb;;AiBSvB;EAMI,qDlBsEU;UkBtEV,6ClBsEU;CkBpEb;;AAGD;EAEE,0BlB+DY;EkB9DZ,sBlB8DY;CkB7Db;;AAED;;EAGE,YlBsDS;EkBrDT,0BAnC0C;EAoC1C,uBAAsB;EACtB,sBApCkC;CAsCnC;;AD2BH;ECvBE,elBmDc;EkBlDd,8BAA6B;EAC7B,uBAAsB;EACtB,sBlBgDc;CiB1Bf;;AhB/DG;EiB4CA,YlBuCS;EkBtCT,0BlB4CY;EkB3CZ,sBlB2CY;CCzFS;;AiBiDvB;EAEE,qDlBsCY;UkBtCZ,6ClBsCY;CkBrCb;;AAED;EAEE,elBiCY;EkBhCZ,8BAA6B;CAC9B;;AAED;;EAGE,YlBoBS;EkBnBT,0BlByBY;EkBxBZ,sBlBwBY;CkBvBb;;ADFH;EC1BE,YlB0TmC;EkBzTnC,8BAA6B;EAC7B,uBAAsB;EACtB,mBlBuTmC;CiB9RpC;;AhBlEG;EiB4CA,elBmD+B;EkBlD/B,uBlBmTiC;EkBlTjC,mBlBkTiC;CChWZ;;AiBiDvB;EAEE,uDlB6SiC;UkB7SjC,+ClB6SiC;CkB5SlC;;AAED;EAEE,YlBwSiC;EkBvSjC,8BAA6B;CAC9B;;AAED;;EAGE,elBgC+B;EkB/B/B,uBlBgSiC;EkB/RjC,mBlB+RiC;CkB9RlC;;ADCH;EC7BE,elBoDc;EkBnDd,8BAA6B;EAC7B,uBAAsB;EACtB,sBlBiDc;CiBrBf;;AhBrEG;EiB4CA,YlBuCS;EkBtCT,0BlB6CY;EkB5CZ,sBlB4CY;CC1FS;;AiBiDvB;EAEE,sDlBuCY;UkBvCZ,8ClBuCY;CkBtCb;;AAED;EAEE,elBkCY;EkBjCZ,8BAA6B;CAC9B;;AAED;;EAGE,YlBoBS;EkBnBT,0BlB0BY;EkBzBZ,sBlByBY;CkBxBb;;ADIH;EChCE,elBkDc;EkBjDd,8BAA6B;EAC7B,uBAAsB;EACtB,sBlB+Cc;CiBhBf;;AhBxEG;EiB4CA,YlBuCS;EkBtCT,0BlB2CY;EkB1CZ,sBlB0CY;CCxFS;;AiBiDvB;EAEE,qDlBqCY;UkBrCZ,6ClBqCY;CkBpCb;;AAED;EAEE,elBgCY;EkB/BZ,8BAA6B;CAC9B;;AAED;;EAGE,YlBoBS;EkBnBT,0BlBwBY;EkBvBZ,sBlBuBY;CkBtBb;;ADOH;ECnCE,elBgDc;EkB/Cd,8BAA6B;EAC7B,uBAAsB;EACtB,sBlB6Cc;CiBXf;;AhB3EG;EiB4CA,YlBuCS;EkBtCT,0BlByCY;EkBxCZ,sBlBwCY;CCtFS;;AiBiDvB;EAEE,sDlBmCY;UkBnCZ,8ClBmCY;CkBlCb;;AAED;EAEE,elB8BY;EkB7BZ,8BAA6B;CAC9B;;AAED;;EAGE,YlBoBS;EkBnBT,0BlBsBY;EkBrBZ,sBlBqBY;CkBpBb;;ADUH;ECtCE,elB+Cc;EkB9Cd,8BAA6B;EAC7B,uBAAsB;EACtB,sBlB4Cc;CiBPf;;AhB9EG;EiB4CA,YlBuCS;EkBtCT,0BlBwCY;EkBvCZ,sBlBuCY;CCrFS;;AiBiDvB;EAEE,qDlBkCY;UkBlCZ,6ClBkCY;CkBjCb;;AAED;EAEE,elB6BY;EkB5BZ,8BAA6B;CAC9B;;AAED;;EAGE,YlBoBS;EkBnBT,0BlBqBY;EkBpBZ,sBlBoBY;CkBnBb;;ADoBH;EACE,oBjB6JyB;EiB5JzB,ejBCc;EiBAd,iBAAgB;CA6BjB;;AAhCD;EASI,8BAA6B;CAE9B;;AAXH;EAeI,0BAAyB;CAC1B;;AhBtGC;EgBwGA,0BAAyB;ChBxGJ;;AAWrB;EgBgGA,ejBqD4C;EiBpD5C,2BjBqD6B;EiBpD7B,8BAA6B;ChB/F5B;;AgBwEL;EA0BI,ejBf+B;CiBoBhC;;AhB1GC;EgBwGE,sBAAqB;ChBrGtB;;AgB+GL;ECtDE,qBlB2Q8B;EkB1Q9B,mBlBwKsB;EkBvKtB,iBlB2I0B;EM3NxB,sBNiO0B;CiB3F7B;;AAED;EC1DE,wBlBuQ+B;EkBtQ/B,oBlByKsB;EkBxKtB,iBlB4I0B;EM5NxB,sBNkO0B;CiBxF7B;;AAOD;EACE,eAAc;EACd,YAAW;CACZ;;AAGD;EACE,mBjBmOoC;CiBlOrC;;AAGD;;;EAII,YAAW;CACZ;;AErKH;EACE,WAAU;EZIN,yCPyOsC;EOzOtC,oCPyOsC;EOzOtC,iCPyOsC;CmBvO3C;;AAPD;EAKI,WAAU;CACX;;AAGH;EACE,cAAa;CAId;;AALD;EAGI,eAAc;CACf;;AAGH;EAEI,mBAAkB;CACnB;;AAGH;EAEI,yBAAwB;CACzB;;AAGH;EACE,mBAAkB;EAClB,UAAS;EACT,iBAAgB;EZ1BZ,sCP0OmC;EO1OnC,iCP0OmC;EO1OnC,8BP0OmC;CmB9MxC;;AChCD;;EAEE,mBAAkB;CACnB;;AAED;EAGI,sBAAqB;EACrB,SAAQ;EACR,UAAS;EACT,mBpB+NyB;EoB9NzB,uBAAsB;EACtB,YAAW;EACX,wBAA8B;EAC9B,sCAA4C;EAC5C,qCAA2C;CAC5C;;AAZH;EAeI,eAAc;CACf;;AAGH;EAGM,cAAa;EACb,2BAAiC;CAClC;;AAKL;EACE,mBAAkB;EAClB,UAAS;EACT,QAAO;EACP,cpBsgB8B;EoBrgB9B,cAAa;EACb,YAAW;EACX,iBpBseoC;EoBrepC,kBAA8B;EAC9B,qBAAgC;EAChC,gBpB6MmB;EoB5MnB,epB4DiC;EoB3DjC,iBAAgB;EAChB,iBAAgB;EAChB,uBpB6CW;EoB5CX,qCAA4B;UAA5B,6BAA4B;EAC5B,sCpB4CW;EM3FT,uBNgO2B;CoB9K9B;;AAGD;ECpDE,UAAS;EACT,iBAAuB;EACvB,iBAAgB;EAChB,8BrBqGiC;CoBlDlC;;AAKD;EACE,eAAc;EACd,YAAW;EACX,wBpBgeqC;EoB/drC,YAAW;EACX,oBpB0LyB;EoBzLzB,epBoCiC;EoBnCjC,oBAAmB;EACnB,oBAAmB;EACnB,iBAAgB;EAChB,UAAS;CAwBV;;AnB5EG;EmBuDA,epB6cmD;EoB5cnD,sBAAqB;EACrB,0BpB+B+B;CCrF9B;;AmBuCL;EAoBI,YpBUS;EoBTT,sBAAqB;EACrB,0BpBcY;CoBbb;;AAvBH;EA2BI,epBiB+B;EoBhB/B,8BAA6B;CAK9B;;AAIH;EAGI,eAAc;CACf;;AAJH;EAQI,WAAU;CACX;;AAOH;EACE,SAAQ;EACR,WAAU;CACX;;AAED;EACE,YAAW;EACX,QAAO;CACR;;AAGD;EACE,eAAc;EACd,uBpBiaqC;EoBharC,iBAAgB;EAChB,oBpBwHsB;EoBvHtB,epBzBiC;EoB0BjC,oBAAmB;CACpB;;AAMD;EAGI,UAAS;EACT,aAAY;EACZ,wBpBgYoC;CoB/XrC;;AEhJH;;EAEE,mBAAkB;EAClB,4BAAoB;EAApB,6BAAoB;EAApB,4BAAoB;EAApB,qBAAoB;EACpB,uBAAsB;CA0BvB;;AA9BD;;EAOI,mBAAkB;EAClB,oBAAc;EAAd,uBAAc;MAAd,mBAAc;UAAd,eAAc;EACd,iBAAgB;CAYjB;;AArBH;;EAcM,WAAU;CrBNS;;AqBRzB;;;;EAmBM,WAAU;CACX;;AApBL;;;;;;;;EA4BI,kBtBmMc;CsBlMf;;AAIH;EACE,qBAAa;EAAb,sBAAa;EAAb,qBAAa;EAAb,cAAa;EACb,wBAAe;MAAf,oBAAe;UAAf,gBAAe;EACf,wBAA2B;EAA3B,oCAA2B;MAA3B,qBAA2B;UAA3B,4BAA2B;CAK5B;;AARD;EAMI,YAAW;CACZ;;AAGH;EACE,iBAAgB;CACjB;;AAGD;EACE,eAAc;CAKf;;AAND;EhBlCI,2BgBsC8B;EhBrC9B,8BgBqC8B;CAC/B;;AAGH;;EhB5BI,0BgB8B2B;EhB7B3B,6BgB6B2B;CAC9B;;AAGD;EACE,YAAW;CACZ;;AACD;EACE,iBAAgB;CACjB;;AACD;;EhBtDI,2BgByD8B;EhBxD9B,8BgBwD8B;CAC/B;;AAEH;EhB9CI,0BgB+C2B;EhB9C3B,6BgB8C2B;CAC9B;;AAeD;EACE,uBAAyC;EACzC,sBAAwC;CAKzC;;AAPD;EAKI,eAAc;CACf;;AAGH;EACE,wBAA4C;EAC5C,uBAA2C;CAC5C;;AAED;EACE,uBAA4C;EAC5C,sBAA2C;CAC5C;;AAmBD;EACE,4BAAoB;EAApB,6BAAoB;EAApB,4BAAoB;EAApB,qBAAoB;EACpB,6BAAsB;EAAtB,8BAAsB;EAAtB,+BAAsB;MAAtB,2BAAsB;UAAtB,uBAAsB;EACtB,yBAAuB;EAAvB,gCAAuB;MAAvB,sBAAuB;UAAvB,wBAAuB;EACvB,yBAAuB;EAAvB,gCAAuB;MAAvB,sBAAuB;UAAvB,wBAAuB;CAcxB;;AAlBD;;EAQI,YAAW;CACZ;;AATH;;;;EAeI,iBtBiFc;EsBhFd,eAAc;CACf;;AAGH;EAEI,iBAAgB;CACjB;;AAHH;EhB9HI,8BgBmI+B;EhBlI/B,6BgBkI+B;CAChC;;AANH;EhB5II,0BgBoJ4B;EhBnJ5B,2BgBmJ4B;CAC7B;;AAEH;EACE,iBAAgB;CACjB;;AACD;;EhB5II,8BgB+I+B;EhB9I/B,6BgB8I+B;CAChC;;AAEH;EhBhKI,0BgBiK0B;EhBhK1B,2BgBgK0B;CAC7B;;AxBosFD;;;;EwBhrFM,mBAAkB;EAClB,uBAAmB;EACnB,qBAAoB;CACrB;;AC/LL;EACE,mBAAkB;EAClB,qBAAa;EAAb,sBAAa;EAAb,qBAAa;EAAb,cAAa;EACb,YAAW;CAkBZ;;AArBD;EAQI,mBAAkB;EAClB,WAAU;EACV,oBAAc;EAAd,uBAAc;MAAd,mBAAc;UAAd,eAAc;EAGd,UAAS;EACT,iBAAgB;CAMjB;;AApBH;EAkBM,WAAU;CtBmCX;;AsB9BL;;;EAIE,qBAAa;EAAb,sBAAa;EAAb,qBAAa;EAAb,cAAa;EACb,0BAAmB;EAAnB,4BAAmB;MAAnB,uBAAmB;UAAnB,oBAAmB;CAKpB;;AAVD;;;EjBvBI,iBiB+BwB;CACzB;;AAGH;;EAEE,oBAAmB;EACnB,uBAAsB;CACvB;;AAwBD;EACE,qBvBiR8B;EuBhR9B,iBAAgB;EAChB,gBvBoLmB;EuBnLnB,oBvBwLyB;EuBvLzB,kBvB8Q8B;EuB7Q9B,evBkCiC;EuBjCjC,mBAAkB;EAClB,0BvBkCiC;EuBjCjC,sCvBmBW;EM3FT,uBNgO2B;CuBjI9B;;AAhCD;;;EAcI,wBvBwQ6B;EuBvQ7B,oBvB0KoB;EMxPpB,sBNkO0B;CuBlJ3B;;AAjBH;;;EAoBI,qBvBsQ4B;EuBrQ5B,mBvBmKoB;EMvPpB,sBNiO0B;CuB3I3B;;AAvBH;;EA6BI,cAAa;CACd;;AASH;;;;;;;EjBzFI,2BiBgG4B;EjB/F5B,8BiB+F4B;CAC/B;;AACD;EACE,gBAAe;CAChB;;AACD;;;;;;;EjBvFI,0BiB8F2B;EjB7F3B,6BiB6F2B;CAC9B;;AACD;EACE,eAAc;CACf;;AAMD;EACE,mBAAkB;EAGlB,aAAY;EACZ,oBAAmB;CAmCpB;;AAxCD;EAUI,mBAAkB;CAUnB;;AApBH;EAaM,kBvB8EY;CuB7Eb;;AAdL;EAkBM,WAAU;CtBhGX;;AsB8EL;;EA0BM,mBvBiEY;CuBhEb;;AA3BL;;EAgCM,WAAU;EACV,kBvB0DY;CuBrDb;;AAtCL;;;;EAoCQ,WAAU;CtBlHb;;AuB9CL;EACE,mBAAkB;EAClB,4BAAoB;EAApB,6BAAoB;EAApB,4BAAoB;EAApB,qBAAoB;EACpB,mBAAsC;EACtC,qBxBoa8B;EwBna9B,mBxBqa4B;CwBpa7B;;AAED;EACE,mBAAkB;EAClB,YAAW;EACX,WAAU;CA4BX;;AA/BD;EAMI,YxBqES;EwBpET,0BxB0EY;CwBxEb;;AATH;EAaI,sDxBoEY;UwBpEZ,8CxBoEY;CwBnEb;;AAdH;EAiBI,YxB0DS;EwBzDT,0BxBiaqE;CwB/ZtE;;AApBH;EAwBM,0BxBkE6B;CwBjE9B;;AAzBL;EA4BM,exB6D6B;CwB5D9B;;AAQL;EACE,mBAAkB;EAClB,aAA+D;EAC/D,QAAO;EACP,eAAc;EACd,YxB0XwC;EwBzXxC,axByXwC;EwBxXxC,qBAAoB;EACpB,0BAAiB;KAAjB,uBAAiB;MAAjB,sBAAiB;UAAjB,kBAAiB;EACjB,uBxBuXwC;EwBtXxC,6BAA4B;EAC5B,mCAAkC;EAClC,iCxBqX2C;UwBrX3C,yBxBqX2C;CwBnX5C;;AAMD;ElBxEI,uBNgO2B;CwBrJ5B;;AAHH;EAMI,2NxBbuI;CwBcxI;;AAPH;EAUI,0BxBcY;EwBbZ,wKxBlBuI;CwBoBxI;;AAOH;EAEI,mBxB+WqB;CwB9WtB;;AAHH;EAMI,qKxBjCuI;CwBkCxI;;AASH;EACE,qBAAa;EAAb,sBAAa;EAAb,qBAAa;EAAb,cAAa;EACb,6BAAsB;EAAtB,8BAAsB;EAAtB,+BAAsB;MAAtB,2BAAsB;UAAtB,uBAAsB;CASvB;;AAXD;EAKI,uBxB+T4B;CwB1T7B;;AAVH;EAQM,eAAc;CACf;;AAWL;EACE,sBAAqB;EACrB,gBAAe;EAEf,4BAAwD;EACxD,2CxB4UuC;EwB3UvC,kBxB4M8B;EwB3M9B,exBhCiC;EwBiCjC,uBAAsB;EACtB,oNAAsG;EACtG,kCxB8UoC;UwB9UpC,0BxB8UoC;EwB7UpC,sCxBhDW;EM3FT,uBNgO2B;EwBnF7B,yBAAgB;KAAhB,sBAAgB;UAAhB,iBAAgB;CA2BjB;;AAxCD;EAgBI,sBxB+U2D;EwB9U3D,cAAa;CAYd;;AA7BH;EA0BM,exBnD6B;EwBoD7B,uBxBjEO;CwBkER;;AA5BL;EAgCI,exBxD+B;EwByD/B,0BxBxD+B;CwByDhC;;AAlCH;EAsCI,WAAU;CACX;;AAGH;EACE,sBxBqSwC;EwBpSxC,yBxBoSwC;EwBnSxC,exBqT+B;CwB/ShC;;AAOD;EACE,mBAAkB;EAClB,sBAAqB;EACrB,gBAAe;EACf,exBsSmC;EwBrSnC,iBAAgB;CACjB;;AAED;EACE,iBxBkSkC;EwBjSlC,gBAAe;EACf,exB+RmC;EwB9RnC,UAAS;EACT,WAAU;CAKX;;AAED;EACE,mBAAkB;EAClB,OAAM;EACN,SAAQ;EACR,QAAO;EACP,WAAU;EACV,exBgRmC;EwB/QnC,qBxBmR8B;EwBlR9B,iBxBoR6B;EwBnR7B,exBhHiC;EwBiHjC,qBAAoB;EACpB,0BAAiB;KAAjB,uBAAiB;MAAjB,sBAAiB;UAAjB,kBAAiB;EACjB,uBxBhIW;EwBiIX,sCxBhIW;EM3FT,uBNgO2B;CwB0B9B;;AA5CD;EAmBM,0BxBoRkB;CwBnRnB;;AApBL;EAwBI,mBAAkB;EAClB,UxBTc;EwBUd,YxBVc;EwBWd,axBXc;EwBYd,WAAU;EACV,eAAc;EACd,exBwPiC;EwBvPjC,qBxB2P4B;EwB1P5B,iBxB4P2B;EwB3P3B,exBxI+B;EwByI/B,0BxBvI+B;EwBwI/B,sCxBtJS;EM3FT,mCkBkPgF;CACjF;;AArCH;EAyCM,kBxBiQU;CwBhQX;;ACvPL;EACE,qBAAa;EAAb,sBAAa;EAAb,qBAAa;EAAb,cAAa;EACb,wBAAe;MAAf,oBAAe;UAAf,gBAAe;EACf,gBAAe;EACf,iBAAgB;EAChB,iBAAgB;CACjB;;AAED;EACE,eAAc;EACd,qBzB2iBkC;CyBjiBnC;;AxBHG;EwBJA,sBAAqB;CxBOpB;;AwBZL;EAUI,ezBqF+B;CyBpFhC;;AAOH;EACE,8BzB8hBgD;CyB5fjD;;AAnCD;EAII,oBzB+Lc;CyB9Lf;;AALH;EAQI,8BAAgD;EnB7BhD,gCN0N2B;EMzN3B,iCNyN2B;CyBjL5B;;AApBH;EAYM,mCzBmhB4C;CCriB7C;;AwBML;EAgBM,ezB6D6B;EyB5D7B,8BAA6B;EAC7B,0BAAyB;CAC1B;;AAnBL;;EAwBI,ezBoD+B;EyBnD/B,uBzBsCS;EyBrCT,6BzBqCS;CyBpCV;;AA3BH;EA+BI,iBzBoKc;EMxNd,0BmBsD4B;EnBrD5B,2BmBqD4B;CAC7B;;AAQH;EnBrEI,uBNgO2B;CyBlJ5B;;AATH;;EAMM,YzBeO;EyBdP,0BzBoBU;CyBnBX;;AASL;EAEI,oBAAc;EAAd,uBAAc;MAAd,mBAAc;UAAd,eAAc;EACd,mBAAkB;CACnB;;AAGH;EAEI,sBAAa;MAAb,2BAAa;UAAb,cAAa;EACb,oBAAY;EAAZ,qBAAY;MAAZ,qBAAY;UAAZ,aAAY;EACZ,mBAAkB;CACnB;;AAQH;EAEI,cAAa;CACd;;AAHH;EAKI,eAAc;CACf;;ACnGH;EACE,mBAAkB;EAClB,qBAAa;EAAb,sBAAa;EAAb,qBAAa;EAAb,cAAa;EACb,wBAAe;MAAf,oBAAe;UAAf,gBAAe;EACf,0BAAmB;EAAnB,4BAAmB;MAAnB,uBAAmB;UAAnB,oBAAmB;EACnB,0BAA8B;EAA9B,uCAA8B;MAA9B,uBAA8B;UAA9B,+BAA8B;EAC9B,qB1BqHW;C0BpGZ;;AAvBD;;EAYI,qBAAa;EAAb,sBAAa;EAAb,qBAAa;EAAb,cAAa;EACb,wBAAe;MAAf,oBAAe;UAAf,gBAAe;EACf,0BAAmB;EAAnB,4BAAmB;MAAnB,uBAAmB;UAAnB,oBAAmB;EACnB,0BAA8B;EAA9B,uCAA8B;MAA9B,uBAA8B;UAA9B,+BAA8B;CAO/B;;Af8BC;EepDJ;;IAkBM,YAAW;IACX,gBAAe;IACf,eAAc;GAEjB;C5BgwGF;;A4BxvGD;EACE,sBAAqB;EACrB,uB1BoiB+E;E0BniB/E,0B1BmiB+E;E0BliB/E,mB1ByFW;E0BxFX,mB1BuMsB;E0BtMtB,qBAAoB;EACpB,oBAAmB;CAKpB;;AzBrCG;EyBmCA,sBAAqB;CzBhCpB;;AyByCL;EACE,qBAAa;EAAb,sBAAa;EAAb,qBAAa;EAAb,cAAa;EACb,6BAAsB;EAAtB,8BAAsB;EAAtB,+BAAsB;MAAtB,2BAAsB;UAAtB,uBAAsB;EACtB,gBAAe;EACf,iBAAgB;EAChB,iBAAgB;CAMjB;;AAXD;EAQI,iBAAgB;EAChB,gBAAe;CAChB;;AAQH;EACE,sBAAqB;EACrB,oB1BmemC;E0BlenC,uB1BkemC;C0BjepC;;AAWD;EACE,yBAAgB;MAAhB,8BAAgB;UAAhB,iBAAgB;CACjB;;AAGD;EACE,yB1B+eyC;E0B9ezC,mB1BiJsB;E0BhJtB,eAAc;EACd,wBAAuB;EACvB,8BAAuC;EpBzGrC,uBNgO2B;C0BjH9B;;AzB7FG;EyB2FA,sBAAqB;CzBxFpB;;AyB8FL;EACE,sBAAqB;EACrB,aAAY;EACZ,cAAa;EACb,uBAAsB;EACtB,YAAW;EACX,oCAAmC;EACnC,mCAA0B;UAA1B,2BAA0B;CAC3B;;Af1DG;EemEA;IAIQ,iBAAgB;IAChB,YAAW;GACZ;EANP;;IAWM,iBAAgB;IAChB,gBAAe;GAChB;C5B0tGR;;AavzGG;EegFA;IAiBI,+BAAmB;IAAnB,8BAAmB;IAAnB,4BAAmB;QAAnB,wBAAmB;YAAnB,oBAAmB;IACnB,0BAAiB;QAAjB,sBAAiB;YAAjB,kBAAiB;IACjB,wBAA2B;IAA3B,oCAA2B;QAA3B,qBAA2B;YAA3B,4BAA2B;GA+B9B;EAlDD;IAsBM,+BAAmB;IAAnB,8BAAmB;IAAnB,4BAAmB;QAAnB,wBAAmB;YAAnB,oBAAmB;GAUpB;EAhCL;IAyBQ,mBAAkB;GACnB;EA1BP;IA6BQ,qBAAoB;IACpB,oBAAmB;GACpB;EA/BP;;IAqCM,0BAAiB;QAAjB,sBAAiB;YAAjB,kBAAiB;GAClB;EAtCL;IA0CM,gCAAwB;IAAxB,iCAAwB;IAAxB,gCAAwB;IAAxB,yBAAwB;GACzB;EA3CL;IA+CM,cAAa;GACd;C5BmtGR;;Aat0GG;EemEA;IAIQ,iBAAgB;IAChB,YAAW;GACZ;EANP;;IAWM,iBAAgB;IAChB,gBAAe;GAChB;C5BkwGR;;Aa/1GG;EegFA;IAiBI,+BAAmB;IAAnB,8BAAmB;IAAnB,4BAAmB;QAAnB,wBAAmB;YAAnB,oBAAmB;IACnB,0BAAiB;QAAjB,sBAAiB;YAAjB,kBAAiB;IACjB,wBAA2B;IAA3B,oCAA2B;QAA3B,qBAA2B;YAA3B,4BAA2B;GA+B9B;EAlDD;IAsBM,+BAAmB;IAAnB,8BAAmB;IAAnB,4BAAmB;QAAnB,wBAAmB;YAAnB,oBAAmB;GAUpB;EAhCL;IAyBQ,mBAAkB;GACnB;EA1BP;IA6BQ,qBAAoB;IACpB,oBAAmB;GACpB;EA/BP;;IAqCM,0BAAiB;QAAjB,sBAAiB;YAAjB,kBAAiB;GAClB;EAtCL;IA0CM,gCAAwB;IAAxB,iCAAwB;IAAxB,gCAAwB;IAAxB,yBAAwB;GACzB;EA3CL;IA+CM,cAAa;GACd;C5B2vGR;;Aa92GG;EemEA;IAIQ,iBAAgB;IAChB,YAAW;GACZ;EANP;;IAWM,iBAAgB;IAChB,gBAAe;GAChB;C5B0yGR;;Aav4GG;EegFA;IAiBI,+BAAmB;IAAnB,8BAAmB;IAAnB,4BAAmB;QAAnB,wBAAmB;YAAnB,oBAAmB;IACnB,0BAAiB;QAAjB,sBAAiB;YAAjB,kBAAiB;IACjB,wBAA2B;IAA3B,oCAA2B;QAA3B,qBAA2B;YAA3B,4BAA2B;GA+B9B;EAlDD;IAsBM,+BAAmB;IAAnB,8BAAmB;IAAnB,4BAAmB;QAAnB,wBAAmB;YAAnB,oBAAmB;GAUpB;EAhCL;IAyBQ,mBAAkB;GACnB;EA1BP;IA6BQ,qBAAoB;IACpB,oBAAmB;GACpB;EA/BP;;IAqCM,0BAAiB;QAAjB,sBAAiB;YAAjB,kBAAiB;GAClB;EAtCL;IA0CM,gCAAwB;IAAxB,iCAAwB;IAAxB,gCAAwB;IAAxB,yBAAwB;GACzB;EA3CL;IA+CM,cAAa;GACd;C5BmyGR;;Aat5GG;EemEA;IAIQ,iBAAgB;IAChB,YAAW;GACZ;EANP;;IAWM,iBAAgB;IAChB,gBAAe;GAChB;C5Bk1GR;;Aa/6GG;EegFA;IAiBI,+BAAmB;IAAnB,8BAAmB;IAAnB,4BAAmB;QAAnB,wBAAmB;YAAnB,oBAAmB;IACnB,0BAAiB;QAAjB,sBAAiB;YAAjB,kBAAiB;IACjB,wBAA2B;IAA3B,oCAA2B;QAA3B,qBAA2B;YAA3B,4BAA2B;GA+B9B;EAlDD;IAsBM,+BAAmB;IAAnB,8BAAmB;IAAnB,4BAAmB;QAAnB,wBAAmB;YAAnB,oBAAmB;GAUpB;EAhCL;IAyBQ,mBAAkB;GACnB;EA1BP;IA6BQ,qBAAoB;IACpB,oBAAmB;GACpB;EA/BP;;IAqCM,0BAAiB;QAAjB,sBAAiB;YAAjB,kBAAiB;GAClB;EAtCL;IA0CM,gCAAwB;IAAxB,iCAAwB;IAAxB,gCAAwB;IAAxB,yBAAwB;GACzB;EA3CL;IA+CM,cAAa;GACd;C5B20GR;;A4Bh4GD;EAsBQ,+BAAmB;EAAnB,8BAAmB;EAAnB,4BAAmB;MAAnB,wBAAmB;UAAnB,oBAAmB;EACnB,0BAAiB;MAAjB,sBAAiB;UAAjB,kBAAiB;EACjB,wBAA2B;EAA3B,oCAA2B;MAA3B,qBAA2B;UAA3B,4BAA2B;CA+B9B;;AAvDL;EASY,iBAAgB;EAChB,YAAW;CACZ;;AAXX;;EAgBU,iBAAgB;EAChB,gBAAe;CAChB;;AAlBT;EA2BU,+BAAmB;EAAnB,8BAAmB;EAAnB,4BAAmB;MAAnB,wBAAmB;UAAnB,oBAAmB;CAUpB;;AArCT;EA8BY,mBAAkB;CACnB;;AA/BX;EAkCY,qBAAoB;EACpB,oBAAmB;CACpB;;AApCX;;EA0CU,0BAAiB;MAAjB,sBAAiB;UAAjB,kBAAiB;CAClB;;AA3CT;EA+CU,gCAAwB;EAAxB,iCAAwB;EAAxB,gCAAwB;EAAxB,yBAAwB;CACzB;;AAhDT;EAoDU,cAAa;CACd;;AAYT;EAEI,0B1BvGS;C0B4GV;;AAPH;EAKM,0B1B1GO;CCtER;;AyB2KL;EAWM,0B1BhHO;C0ByHR;;AApBL;EAcQ,0B1BnHK;CCtER;;AyB2KL;EAkBQ,0B1BvHK;C0BwHN;;AAnBP;;;;EA0BM,0B1B/HO;C0BgIR;;AA3BL;EA+BI,0B1BpIS;E0BqIT,iC1BrIS;C0BsIV;;AAjCH;EAoCI,sQ1B+XyR;C0B9X1R;;AArCH;EAwCI,0B1B7IS;C0B8IV;;AAIH;EAEI,a1BrJS;C0B0JV;;AAPH;EAKM,a1BxJO;CCrER;;AyBwNL;EAWM,gC1B9JO;C0BuKR;;AApBL;EAcQ,iC1BjKK;CCrER;;AyBwNL;EAkBQ,iC1BrKK;C0BsKN;;AAnBP;;;;EA0BM,a1B7KO;C0B8KR;;AA3BL;EA+BI,gC1BlLS;E0BmLT,uC1BnLS;C0BoLV;;AAjCH;EAoCI,4Q1B2U6R;C0B1U9R;;AArCH;EAwCI,gC1B3LS;C0B4LV;;ACtRH;EACE,mBAAkB;EAClB,qBAAa;EAAb,sBAAa;EAAb,qBAAa;EAAb,cAAa;EACb,6BAAsB;EAAtB,8BAAsB;EAAtB,+BAAsB;MAAtB,2BAAsB;UAAtB,uBAAsB;EACtB,uB3BsFW;E2BrFX,uC3BsFW;EM3FT,uBNgO2B;C2BzN9B;;AAED;EAGE,oBAAc;EAAd,uBAAc;MAAd,mBAAc;UAAd,eAAc;EACd,iB3BopBgC;C2BnpBjC;;AAED;EACE,uB3B+oB+B;E2B9oB/B,sBAAqB;CACtB;;AAED;EACE,sBAAgC;EAChC,iBAAgB;CACjB;;AAED;EACE,iBAAgB;CACjB;;A1BrBG;E0ByBA,sBAAqB;C1BzBA;;A0BuBzB;EAMI,qB3B6nB8B;C2B5nB/B;;AAGH;ErBlCI,gCN0N2B;EMzN3B,iCNyN2B;C2BpL1B;;AAJL;ErBpBI,oCN4M2B;EM3M3B,mCN2M2B;C2B9K1B;;AASL;EACE,yB3BqmBgC;E2BpmBhC,iBAAgB;EAChB,0B3B4CiC;E2B3CjC,8C3B4BW;C2BvBZ;;AATD;ErB3DI,2DqBkE8E;CAC/E;;AAGH;EACE,yB3B0lBgC;E2BzlBhC,0B3BkCiC;E2BjCjC,2C3BkBW;C2BbZ;;AARD;ErBtEI,2DNqqB2E;C2BxlB5E;;AAQH;EACE,wBAAkC;EAClC,wB3BykB+B;E2BxkB/B,uBAAiC;EACjC,iBAAgB;CACjB;;AAED;EACE,wBAAkC;EAClC,uBAAiC;CAClC;;AAOD;ECvGE,0B5BiGc;E4BhGd,sB5BgGc;C2BQf;;ACtGC;;EAEE,8BAA6B;CAC9B;;ADoGH;EC1GE,0B5BgGc;E4B/Fd,sB5B+Fc;C2BYf;;ACzGC;;EAEE,8BAA6B;CAC9B;;ADuGH;EC7GE,0B5BkGc;E4BjGd,sB5BiGc;C2Baf;;AC5GC;;EAEE,8BAA6B;CAC9B;;AD0GH;EChHE,0B5B8Fc;E4B7Fd,sB5B6Fc;C2BoBf;;AC/GC;;EAEE,8BAA6B;CAC9B;;AD6GH;ECnHE,0B5B6Fc;E4B5Fd,sB5B4Fc;C2BwBf;;AClHC;;EAEE,8BAA6B;CAC9B;;ADkHH;EC9GE,8BAA6B;EAC7B,sB5BsFc;C2ByBf;;AC7GC;;EAEE,8BAA6B;EAC7B,sB5BiFY;C4BhFb;;AD0GH;ECjHE,8BAA6B;EAC7B,mB5B6Vm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EY;C+B1Eb;;AAlBH;EAqBI,e/B+E+B;E+B9E/B,qBAAoB;EACpB,uB/B+DS;E+B9DT,mB/BmmBuC;C+BlmBxC;;AAGH;EACE,mBAAkB;EAClB,eAAc;EACd,wB/BskB0C;E+BrkB1C,kBAAiB;EACjB,kB/BykBwC;E+BxkBxC,e/B0Dc;E+BzDd,uB/BmDW;E+BlDX,uB/B2kByC;C+BnkB1C;;A9B9BG;E8ByBA,e/B4H4C;E+B3H5C,sBAAqB;EACrB,0B/B4D+B;E+B3D/B,mB/BykBuC;CClmBtC;;A+BtBH;EACE,wBhC6mBwC;EgC5mBxC,mBhCsPoB;CgCrPrB;;AAIG;E1BqBF,+BNsM0B;EMrM1B,kCNqM0B;CgCzNvB;;AAGD;E1BEF,gCNoN0B;EMnN1B,mCNmN0B;CgCpNvB;;AAdL;EACE,wBhC2mBuC;EgC1mBvC,oBhCuPoB;CgCtPrB;;AAIG;E1BqBF,+BNuM0B;EMtM1B,kCNsM0B;CgC1NvB;;AAGD;E1BEF,gCNqN0B;EMpN1B,mCNoN0B;CgCrNvB;;ACZP;EACE,sBAAqB;EACrB,sBjCsuBgC;EiCruBhC,ejCkuB+B;EiCjuB/B,kBjCuPqB;EiCtPrB,eAAc;EACd,YjCmFW;EiClFX,mBAAkB;EAClB,oBAAmB;EACnB,yBAAwB;E3BVtB,uBNgO2B;CiC/M9B;;AAhBD;EAcI,cAAa;CACd;;AAIH;EACE,mBAAkB;EAClB,UAAS;CACV;;AhCLG;EgCWA,YjC6DS;EiC5DT,sBAAqB;ChCTpB;;AgCkBL;EACE,qBjCmsBgC;EiClsBhC,oBjCksBgC;EM3uB9B,qBN8uB+B;CiCnsBlC;;AAMD;EClDE,0BlCyGiC;CiCrDlC;;AhCjCG;EiCfE,0BAAqC;CjCkBtC;;AgCgCL;ECtDE,0BlCiGc;CiCzCf;;AhCrCG;EiCfE,0BAAqC;CjCkBtC;;AgCoCL;EC1DE,0BlCgGc;CiCpCf;;AhCzCG;EiCfE,0BAAqC;CjCkBtC;;AgCwCL;EC9DE,0BlCkGc;CiClCf;;AhC7CG;EiCfE,0BAAqC;CjCkBtC;;AgC4CL;EClEE,0BlC8Fc;CiC1Bf;;AhCjDG;EiCfE,0BAAqC;CjCkBtC;;AgCgDL;ECtEE,0BlC6Fc;CiCrBf;;AhCrDG;EiCfE,0BAAqC;CjCkBtC;;AkCzBL;EACE,mBAAoD;EACpD,oBnCsoBmC;EmCroBnC,0BnC0GiC;EMzG/B,sBNiO0B;CmC5N7B;;AxB+CG;EwBxDJ;IAOI,mBnCioBiC;GmC/nBpC;CrCgpIA;;AqC9oID;EACE,iBAAgB;EAChB,gBAAe;E7BTb,iB6BUsB;CACzB;;ACXD;EACE,yBpCoxBmC;EoCnxBnC,oBpCoxBgC;EoCnxBhC,8BAA6C;E9BH3C,uBNgO2B;CoC3N9B;;AAGD;EAEE,eAAc;CACf;;AAGD;EACE,kBpC6OqB;CoC5OtB;;AAOD;EAGI,mBAAkB;EAClB,cpCyvBgC;EoCxvBhC,gBpCyvBiC;EoCxvBjC,yBpCwvBiC;EoCvvBjC,eAAc;CACf;;AAQH;ECxCE,erC6oBsC;EqC5oBtC,0BrC6oBsC;EqC5oBtC,sBrC6oB4D;CoCrmB7D;;ACtCC;EACE,0BAAqC;CACtC;;AACD;EACE,eAA+B;CAChC;;ADkCH;EC3CE,erCipBsC;EqChpBtC,0BrCipBsC;EqChpBtC,sBrCipByD;CoCtmB1D;;ACzCC;EACE,0BAAqC;CACtC;;AACD;EACE,eAA+B;CAChC;;ADqCH;EC9CE,erCqpBsC;EqCppBtC,0BrCqpBsC;EqCppBtC,sBrCspB4D;CoCxmB7D;;AC5CC;EACE,0BAAqC;CACtC;;AACD;EACE,eAA+B;CAChC;;ADwCH;ECjDE,erC0pBsC;EqCzpBtC,0BrC0pBsC;EqCzpBtC,sBrC0pB2D;CoCzmB5D;;AC/CC;EACE,0BAAqC;CACtC;;AACD;EACE,eAA+B;CAChC;;ACZH;EACE;IAAO,4BAAuC;GxCkvI7C;EwCjvID;IAAK,yBAAwB;GxCovI5B;CACF;;AwCvvID;EACE;IAAO,4BAAuC;GxCkvI7C;EwCjvID;IAAK,yBAAwB;GxCovI5B;CACF;;AwCvvID;EACE;IAAO,4BAAuC;GxCkvI7C;EwCjvID;IAAK,yBAAwB;GxCovI5B;CACF;;AwClvID;EACE,qBAAa;EAAb,sBAAa;EAAb,qBAAa;EAAb,cAAa;EACb,iBAAgB;EAChB,mBtC2yBoC;EsC1yBpC,kBtCyy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","file":"bootstrap.css","sourcesContent":[null,null,"/*!\n * Bootstrap v4.0.0-alpha.6 (https://getbootstrap.com)\n * Copyright 2011-2017 The Bootstrap Authors\n * Copyright 2011-2017 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n */\n@media print {\n *,\n *::before,\n *::after,\n p::first-letter,\n div::first-letter,\n blockquote::first-letter,\n li::first-letter,\n p::first-line,\n div::first-line,\n blockquote::first-line,\n li::first-line {\n text-shadow: none !important;\n box-shadow: none !important;\n }\n a,\n a:visited {\n text-decoration: underline;\n }\n abbr[title]::after {\n content: \" (\" attr(title) \")\";\n }\n pre {\n white-space: pre-wrap !important;\n }\n pre,\n blockquote {\n border: 1px solid #999;\n page-break-inside: avoid;\n }\n thead {\n display: table-header-group;\n }\n tr,\n img {\n page-break-inside: avoid;\n }\n p,\n h2,\n h3 {\n orphans: 3;\n widows: 3;\n }\n h2,\n h3 {\n page-break-after: avoid;\n }\n .navbar {\n display: none;\n }\n .badge {\n border: 1px solid #000;\n }\n .table {\n border-collapse: collapse !important;\n }\n .table td,\n .table th {\n background-color: #fff !important;\n }\n .table-bordered th,\n .table-bordered td {\n border: 1px solid #ddd !important;\n }\n}\n\nhtml {\n box-sizing: border-box;\n font-family: sans-serif;\n line-height: 1.15;\n -webkit-text-size-adjust: 100%;\n -ms-text-size-adjust: 100%;\n -ms-overflow-style: scrollbar;\n -webkit-tap-highlight-color: transparent;\n}\n\n*,\n*::before,\n*::after {\n box-sizing: inherit;\n}\n\n@-ms-viewport {\n width: device-width;\n}\n\nbody {\n margin: 0;\n font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, \"Helvetica Neue\", Arial, sans-serif;\n font-size: 1rem;\n font-weight: normal;\n line-height: 1.5;\n color: #292b2c;\n background-color: #fff;\n}\n\n[tabindex=\"-1\"]:focus {\n outline: none !important;\n}\n\nhr {\n box-sizing: content-box;\n height: 0;\n overflow: visible;\n}\n\nh1, h2, h3, h4, h5, h6 {\n margin-top: 0;\n margin-bottom: .5rem;\n}\n\np {\n margin-top: 0;\n margin-bottom: 1rem;\n}\n\nabbr[title],\nabbr[data-original-title] {\n text-decoration: underline;\n text-decoration: underline dotted;\n cursor: help;\n border-bottom: 0;\n}\n\naddress {\n margin-bottom: 1rem;\n font-style: normal;\n line-height: inherit;\n}\n\nol,\nul,\ndl {\n margin-top: 0;\n margin-bottom: 1rem;\n}\n\nol ol,\nul ul,\nol ul,\nul ol {\n margin-bottom: 0;\n}\n\ndt {\n font-weight: bold;\n}\n\ndd {\n margin-bottom: .5rem;\n margin-left: 0;\n}\n\nblockquote {\n margin: 0 0 1rem;\n}\n\ndfn {\n font-style: italic;\n}\n\nb,\nstrong {\n font-weight: bolder;\n}\n\nsmall {\n font-size: 80%;\n}\n\nsub,\nsup {\n position: relative;\n font-size: 75%;\n line-height: 0;\n vertical-align: baseline;\n}\n\nsub {\n bottom: -.25em;\n}\n\nsup {\n top: -.5em;\n}\n\na {\n color: #0275d8;\n text-decoration: none;\n background-color: transparent;\n -webkit-text-decoration-skip: objects;\n}\n\na:hover {\n color: #014c8c;\n text-decoration: underline;\n}\n\na:not([href]):not([tabindex]) {\n color: inherit;\n text-decoration: none;\n}\n\na:not([href]):not([tabindex]):focus, a:not([href]):not([tabindex]):hover {\n color: inherit;\n text-decoration: none;\n}\n\na:not([href]):not([tabindex]):focus {\n outline: 0;\n}\n\npre,\ncode,\nkbd,\nsamp {\n font-family: monospace, monospace;\n font-size: 1em;\n}\n\npre {\n margin-top: 0;\n margin-bottom: 1rem;\n overflow: auto;\n}\n\nfigure {\n margin: 0 0 1rem;\n}\n\nimg {\n vertical-align: middle;\n border-style: none;\n}\n\nsvg:not(:root) {\n overflow: hidden;\n}\n\na,\narea,\nbutton,\n[role=\"button\"],\ninput,\nlabel,\nselect,\nsummary,\ntextarea {\n touch-action: manipulation;\n}\n\ntable {\n border-collapse: collapse;\n}\n\ncaption {\n padding-top: 0.75rem;\n padding-bottom: 0.75rem;\n color: #636c72;\n text-align: left;\n caption-side: bottom;\n}\n\nth {\n text-align: left;\n}\n\nlabel {\n display: inline-block;\n margin-bottom: .5rem;\n}\n\nbutton:focus {\n outline: 1px dotted;\n outline: 5px auto -webkit-focus-ring-color;\n}\n\ninput,\nbutton,\nselect,\noptgroup,\ntextarea {\n margin: 0;\n font-family: inherit;\n font-size: inherit;\n line-height: inherit;\n}\n\nbutton,\ninput {\n overflow: visible;\n}\n\nbutton,\nselect {\n text-transform: none;\n}\n\nbutton,\nhtml [type=\"button\"],\n[type=\"reset\"],\n[type=\"submit\"] {\n -webkit-appearance: button;\n}\n\nbutton::-moz-focus-inner,\n[type=\"button\"]::-moz-focus-inner,\n[type=\"reset\"]::-moz-focus-inner,\n[type=\"submit\"]::-moz-focus-inner {\n padding: 0;\n border-style: none;\n}\n\ninput[type=\"radio\"],\ninput[type=\"checkbox\"] {\n box-sizing: border-box;\n padding: 0;\n}\n\ninput[type=\"date\"],\ninput[type=\"time\"],\ninput[type=\"datetime-local\"],\ninput[type=\"month\"] {\n -webkit-appearance: listbox;\n}\n\ntextarea {\n overflow: auto;\n resize: vertical;\n}\n\nfieldset {\n min-width: 0;\n padding: 0;\n margin: 0;\n border: 0;\n}\n\nlegend {\n display: block;\n width: 100%;\n max-width: 100%;\n padding: 0;\n margin-bottom: .5rem;\n font-size: 1.5rem;\n line-height: inherit;\n color: inherit;\n white-space: normal;\n}\n\nprogress {\n vertical-align: baseline;\n}\n\n[type=\"number\"]::-webkit-inner-spin-button,\n[type=\"number\"]::-webkit-outer-spin-button {\n height: auto;\n}\n\n[type=\"search\"] {\n outline-offset: -2px;\n -webkit-appearance: none;\n}\n\n[type=\"search\"]::-webkit-search-cancel-button,\n[type=\"search\"]::-webkit-search-decoration {\n -webkit-appearance: none;\n}\n\n::-webkit-file-upload-button {\n font: inherit;\n -webkit-appearance: button;\n}\n\noutput {\n display: inline-block;\n}\n\nsummary {\n display: list-item;\n}\n\ntemplate {\n display: none;\n}\n\n[hidden] {\n display: none !important;\n}\n\nh1, h2, h3, h4, h5, h6,\n.h1, .h2, .h3, .h4, .h5, .h6 {\n margin-bottom: 0.5rem;\n font-family: inherit;\n font-weight: 500;\n line-height: 1.1;\n color: inherit;\n}\n\nh1, .h1 {\n font-size: 2.5rem;\n}\n\nh2, .h2 {\n font-size: 2rem;\n}\n\nh3, .h3 {\n font-size: 1.75rem;\n}\n\nh4, .h4 {\n font-size: 1.5rem;\n}\n\nh5, .h5 {\n font-size: 1.25rem;\n}\n\nh6, .h6 {\n font-size: 1rem;\n}\n\n.lead {\n font-size: 1.25rem;\n font-weight: 300;\n}\n\n.display-1 {\n font-size: 6rem;\n font-weight: 300;\n line-height: 1.1;\n}\n\n.display-2 {\n font-size: 5.5rem;\n font-weight: 300;\n line-height: 1.1;\n}\n\n.display-3 {\n font-size: 4.5rem;\n font-weight: 300;\n line-height: 1.1;\n}\n\n.display-4 {\n font-size: 3.5rem;\n font-weight: 300;\n line-height: 1.1;\n}\n\nhr {\n margin-top: 1rem;\n margin-bottom: 1rem;\n border: 0;\n border-top: 1px solid rgba(0, 0, 0, 0.1);\n}\n\nsmall,\n.small {\n font-size: 80%;\n font-weight: normal;\n}\n\nmark,\n.mark {\n padding: 0.2em;\n background-color: #fcf8e3;\n}\n\n.list-unstyled {\n padding-left: 0;\n list-style: none;\n}\n\n.list-inline {\n padding-left: 0;\n list-style: none;\n}\n\n.list-inline-item {\n display: inline-block;\n}\n\n.list-inline-item:not(:last-child) {\n margin-right: 5px;\n}\n\n.initialism {\n font-size: 90%;\n text-transform: uppercase;\n}\n\n.blockquote {\n padding: 0.5rem 1rem;\n margin-bottom: 1rem;\n font-size: 1.25rem;\n border-left: 0.25rem solid #eceeef;\n}\n\n.blockquote-footer {\n display: block;\n font-size: 80%;\n color: #636c72;\n}\n\n.blockquote-footer::before {\n content: \"\\2014 \\00A0\";\n}\n\n.blockquote-reverse {\n padding-right: 1rem;\n padding-left: 0;\n text-align: right;\n border-right: 0.25rem solid #eceeef;\n border-left: 0;\n}\n\n.blockquote-reverse .blockquote-footer::before {\n content: \"\";\n}\n\n.blockquote-reverse .blockquote-footer::after {\n content: \"\\00A0 \\2014\";\n}\n\n.img-fluid {\n max-width: 100%;\n height: auto;\n}\n\n.img-thumbnail {\n padding: 0.25rem;\n background-color: #fff;\n border: 1px solid #ddd;\n border-radius: 0.25rem;\n transition: all 0.2s ease-in-out;\n max-width: 100%;\n height: auto;\n}\n\n.figure {\n display: inline-block;\n}\n\n.figure-img {\n margin-bottom: 0.5rem;\n line-height: 1;\n}\n\n.figure-caption {\n font-size: 90%;\n color: #636c72;\n}\n\ncode,\nkbd,\npre,\nsamp {\n font-family: Menlo, Monaco, Consolas, \"Liberation Mono\", \"Courier New\", monospace;\n}\n\ncode {\n padding: 0.2rem 0.4rem;\n font-size: 90%;\n color: #bd4147;\n background-color: #f7f7f9;\n border-radius: 0.25rem;\n}\n\na > code {\n padding: 0;\n color: inherit;\n background-color: inherit;\n}\n\nkbd {\n padding: 0.2rem 0.4rem;\n font-size: 90%;\n color: #fff;\n background-color: #292b2c;\n border-radius: 0.2rem;\n}\n\nkbd kbd {\n padding: 0;\n font-size: 100%;\n font-weight: bold;\n}\n\npre {\n display: block;\n margin-top: 0;\n margin-bottom: 1rem;\n font-size: 90%;\n color: #292b2c;\n}\n\npre code {\n padding: 0;\n font-size: inherit;\n color: inherit;\n background-color: transparent;\n border-radius: 0;\n}\n\n.pre-scrollable {\n max-height: 340px;\n overflow-y: scroll;\n}\n\n.container {\n margin-right: auto;\n margin-left: auto;\n padding-right: 15px;\n padding-left: 15px;\n}\n\n@media (min-width: 576px) {\n .container {\n padding-right: 15px;\n padding-left: 15px;\n }\n}\n\n@media (min-width: 768px) {\n .container {\n padding-right: 15px;\n padding-left: 15px;\n }\n}\n\n@media (min-width: 992px) {\n .container {\n padding-right: 15px;\n padding-left: 15px;\n }\n}\n\n@media (min-width: 1200px) {\n .container {\n padding-right: 15px;\n padding-left: 15px;\n }\n}\n\n@media (min-width: 576px) {\n .container {\n width: 540px;\n max-width: 100%;\n }\n}\n\n@media (min-width: 768px) {\n .container {\n width: 720px;\n max-width: 100%;\n }\n}\n\n@media (min-width: 992px) {\n .container {\n width: 960px;\n max-width: 100%;\n }\n}\n\n@media (min-width: 1200px) {\n .container {\n width: 1140px;\n max-width: 100%;\n }\n}\n\n.container-fluid {\n width: 100%;\n margin-right: auto;\n margin-left: auto;\n padding-right: 15px;\n padding-left: 15px;\n}\n\n@media (min-width: 576px) {\n .container-fluid {\n padding-right: 15px;\n padding-left: 15px;\n }\n}\n\n@media (min-width: 768px) {\n .container-fluid {\n padding-right: 15px;\n padding-left: 15px;\n }\n}\n\n@media (min-width: 992px) {\n .container-fluid {\n padding-right: 15px;\n padding-left: 15px;\n }\n}\n\n@media (min-width: 1200px) {\n .container-fluid {\n padding-right: 15px;\n padding-left: 15px;\n }\n}\n\n.row {\n display: flex;\n flex-wrap: wrap;\n margin-right: -15px;\n margin-left: -15px;\n}\n\n@media (min-width: 576px) {\n .row {\n margin-right: -15px;\n margin-left: -15px;\n }\n}\n\n@media (min-width: 768px) {\n .row {\n margin-right: -15px;\n margin-left: -15px;\n }\n}\n\n@media (min-width: 992px) {\n .row {\n margin-right: -15px;\n margin-left: -15px;\n }\n}\n\n@media (min-width: 1200px) {\n .row {\n margin-right: -15px;\n margin-left: -15px;\n }\n}\n\n.no-gutters {\n margin-right: 0;\n margin-left: 0;\n}\n\n.no-gutters > .col,\n.no-gutters > [class*=\"col-\"] {\n padding-right: 0;\n padding-left: 0;\n}\n\n.col-1, .col-2, .col-3, .col-4, .col-5, .col-6, .col-7, .col-8, .col-9, .col-10, .col-11, .col-12, .col,\n.col-auto, .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, .col-sm,\n.col-sm-auto, .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, .col-md,\n.col-md-auto, .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, .col-lg,\n.col-lg-auto, .col-xl-1, .col-xl-2, .col-xl-3, .col-xl-4, .col-xl-5, .col-xl-6, .col-xl-7, .col-xl-8, .col-xl-9, .col-xl-10, .col-xl-11, .col-xl-12, .col-xl,\n.col-xl-auto {\n position: relative;\n width: 100%;\n min-height: 1px;\n padding-right: 15px;\n padding-left: 15px;\n}\n\n@media (min-width: 576px) {\n .col-1, .col-2, .col-3, .col-4, .col-5, .col-6, .col-7, .col-8, .col-9, .col-10, .col-11, .col-12, .col,\n .col-auto, .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, .col-sm,\n .col-sm-auto, .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, .col-md,\n .col-md-auto, .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, .col-lg,\n .col-lg-auto, .col-xl-1, .col-xl-2, .col-xl-3, .col-xl-4, .col-xl-5, .col-xl-6, .col-xl-7, .col-xl-8, .col-xl-9, .col-xl-10, .col-xl-11, .col-xl-12, .col-xl,\n .col-xl-auto {\n padding-right: 15px;\n padding-left: 15px;\n }\n}\n\n@media (min-width: 768px) {\n .col-1, .col-2, .col-3, .col-4, .col-5, .col-6, .col-7, .col-8, .col-9, .col-10, .col-11, .col-12, .col,\n .col-auto, .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, .col-sm,\n .col-sm-auto, .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, .col-md,\n .col-md-auto, .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, .col-lg,\n .col-lg-auto, .col-xl-1, .col-xl-2, .col-xl-3, .col-xl-4, .col-xl-5, .col-xl-6, .col-xl-7, .col-xl-8, .col-xl-9, .col-xl-10, .col-xl-11, .col-xl-12, .col-xl,\n .col-xl-auto {\n padding-right: 15px;\n padding-left: 15px;\n }\n}\n\n@media (min-width: 992px) {\n .col-1, .col-2, .col-3, .col-4, .col-5, .col-6, .col-7, .col-8, .col-9, .col-10, .col-11, .col-12, .col,\n .col-auto, .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, .col-sm,\n .col-sm-auto, .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, .col-md,\n .col-md-auto, .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, .col-lg,\n .col-lg-auto, .col-xl-1, .col-xl-2, .col-xl-3, .col-xl-4, .col-xl-5, .col-xl-6, .col-xl-7, .col-xl-8, .col-xl-9, .col-xl-10, .col-xl-11, .col-xl-12, .col-xl,\n .col-xl-auto {\n padding-right: 15px;\n padding-left: 15px;\n }\n}\n\n@media (min-width: 1200px) {\n .col-1, .col-2, .col-3, .col-4, .col-5, .col-6, .col-7, .col-8, .col-9, .col-10, .col-11, .col-12, .col,\n .col-auto, .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, .col-sm,\n .col-sm-auto, .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, .col-md,\n .col-md-auto, .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, .col-lg,\n .col-lg-auto, .col-xl-1, .col-xl-2, .col-xl-3, .col-xl-4, .col-xl-5, .col-xl-6, .col-xl-7, .col-xl-8, .col-xl-9, .col-xl-10, .col-xl-11, .col-xl-12, .col-xl,\n .col-xl-auto {\n padding-right: 15px;\n padding-left: 15px;\n }\n}\n\n.col {\n flex-basis: 0;\n flex-grow: 1;\n max-width: 100%;\n}\n\n.col-auto {\n flex: 0 0 auto;\n width: auto;\n}\n\n.col-1 {\n width: 8.333333%;\n}\n\n.col-2 {\n width: 16.666667%;\n}\n\n.col-3 {\n width: 25%;\n}\n\n.col-4 {\n width: 33.333333%;\n}\n\n.col-5 {\n width: 41.666667%;\n}\n\n.col-6 {\n width: 50%;\n}\n\n.col-7 {\n width: 58.333333%;\n}\n\n.col-8 {\n width: 66.666667%;\n}\n\n.col-9 {\n width: 75%;\n}\n\n.col-10 {\n width: 83.333333%;\n}\n\n.col-11 {\n width: 91.666667%;\n}\n\n.col-12 {\n width: 100%;\n}\n\n.pull-0 {\n right: auto;\n}\n\n.pull-1 {\n right: 8.333333%;\n}\n\n.pull-2 {\n right: 16.666667%;\n}\n\n.pull-3 {\n right: 25%;\n}\n\n.pull-4 {\n right: 33.333333%;\n}\n\n.pull-5 {\n right: 41.666667%;\n}\n\n.pull-6 {\n right: 50%;\n}\n\n.pull-7 {\n right: 58.333333%;\n}\n\n.pull-8 {\n right: 66.666667%;\n}\n\n.pull-9 {\n right: 75%;\n}\n\n.pull-10 {\n right: 83.333333%;\n}\n\n.pull-11 {\n right: 91.666667%;\n}\n\n.pull-12 {\n right: 100%;\n}\n\n.push-0 {\n left: auto;\n}\n\n.push-1 {\n left: 8.333333%;\n}\n\n.push-2 {\n left: 16.666667%;\n}\n\n.push-3 {\n left: 25%;\n}\n\n.push-4 {\n left: 33.333333%;\n}\n\n.push-5 {\n left: 41.666667%;\n}\n\n.push-6 {\n left: 50%;\n}\n\n.push-7 {\n left: 58.333333%;\n}\n\n.push-8 {\n left: 66.666667%;\n}\n\n.push-9 {\n left: 75%;\n}\n\n.push-10 {\n left: 83.333333%;\n}\n\n.push-11 {\n left: 91.666667%;\n}\n\n.push-12 {\n left: 100%;\n}\n\n.offset-1 {\n margin-left: 8.333333%;\n}\n\n.offset-2 {\n margin-left: 16.666667%;\n}\n\n.offset-3 {\n margin-left: 25%;\n}\n\n.offset-4 {\n margin-left: 33.333333%;\n}\n\n.offset-5 {\n margin-left: 41.666667%;\n}\n\n.offset-6 {\n margin-left: 50%;\n}\n\n.offset-7 {\n margin-left: 58.333333%;\n}\n\n.offset-8 {\n margin-left: 66.666667%;\n}\n\n.offset-9 {\n margin-left: 75%;\n}\n\n.offset-10 {\n margin-left: 83.333333%;\n}\n\n.offset-11 {\n margin-left: 91.666667%;\n}\n\n@media (min-width: 576px) {\n .col-sm {\n flex-basis: 0;\n flex-grow: 1;\n max-width: 100%;\n }\n .col-sm-auto {\n flex: 0 0 auto;\n width: auto;\n }\n .col-sm-1 {\n width: 8.333333%;\n }\n .col-sm-2 {\n width: 16.666667%;\n }\n .col-sm-3 {\n width: 25%;\n }\n .col-sm-4 {\n width: 33.333333%;\n }\n .col-sm-5 {\n width: 41.666667%;\n }\n .col-sm-6 {\n width: 50%;\n }\n .col-sm-7 {\n width: 58.333333%;\n }\n .col-sm-8 {\n width: 66.666667%;\n }\n .col-sm-9 {\n width: 75%;\n }\n .col-sm-10 {\n width: 83.333333%;\n }\n .col-sm-11 {\n width: 91.666667%;\n }\n .col-sm-12 {\n width: 100%;\n }\n .pull-sm-0 {\n right: auto;\n }\n .pull-sm-1 {\n right: 8.333333%;\n }\n .pull-sm-2 {\n right: 16.666667%;\n }\n .pull-sm-3 {\n right: 25%;\n }\n .pull-sm-4 {\n right: 33.333333%;\n }\n .pull-sm-5 {\n right: 41.666667%;\n }\n .pull-sm-6 {\n right: 50%;\n }\n .pull-sm-7 {\n right: 58.333333%;\n }\n .pull-sm-8 {\n right: 66.666667%;\n }\n .pull-sm-9 {\n right: 75%;\n }\n .pull-sm-10 {\n right: 83.333333%;\n }\n .pull-sm-11 {\n right: 91.666667%;\n }\n .pull-sm-12 {\n right: 100%;\n }\n .push-sm-0 {\n left: auto;\n }\n .push-sm-1 {\n left: 8.333333%;\n }\n .push-sm-2 {\n left: 16.666667%;\n }\n .push-sm-3 {\n left: 25%;\n }\n .push-sm-4 {\n left: 33.333333%;\n }\n .push-sm-5 {\n left: 41.666667%;\n }\n .push-sm-6 {\n left: 50%;\n }\n .push-sm-7 {\n left: 58.333333%;\n }\n .push-sm-8 {\n left: 66.666667%;\n }\n .push-sm-9 {\n left: 75%;\n }\n .push-sm-10 {\n left: 83.333333%;\n }\n .push-sm-11 {\n left: 91.666667%;\n }\n .push-sm-12 {\n left: 100%;\n }\n .offset-sm-0 {\n margin-left: 0%;\n }\n .offset-sm-1 {\n margin-left: 8.333333%;\n }\n .offset-sm-2 {\n margin-left: 16.666667%;\n }\n .offset-sm-3 {\n margin-left: 25%;\n }\n .offset-sm-4 {\n margin-left: 33.333333%;\n }\n .offset-sm-5 {\n margin-left: 41.666667%;\n }\n .offset-sm-6 {\n margin-left: 50%;\n }\n .offset-sm-7 {\n margin-left: 58.333333%;\n }\n .offset-sm-8 {\n margin-left: 66.666667%;\n }\n .offset-sm-9 {\n margin-left: 75%;\n }\n .offset-sm-10 {\n margin-left: 83.333333%;\n }\n .offset-sm-11 {\n margin-left: 91.666667%;\n }\n}\n\n@media (min-width: 768px) {\n .col-md {\n flex-basis: 0;\n flex-grow: 1;\n max-width: 100%;\n }\n .col-md-auto {\n flex: 0 0 auto;\n width: auto;\n }\n .col-md-1 {\n width: 8.333333%;\n }\n .col-md-2 {\n width: 16.666667%;\n }\n .col-md-3 {\n width: 25%;\n }\n .col-md-4 {\n width: 33.333333%;\n }\n .col-md-5 {\n width: 41.666667%;\n }\n .col-md-6 {\n width: 50%;\n }\n .col-md-7 {\n width: 58.333333%;\n }\n .col-md-8 {\n width: 66.666667%;\n }\n .col-md-9 {\n width: 75%;\n }\n .col-md-10 {\n width: 83.333333%;\n }\n .col-md-11 {\n width: 91.666667%;\n }\n .col-md-12 {\n width: 100%;\n }\n .pull-md-0 {\n right: auto;\n }\n .pull-md-1 {\n right: 8.333333%;\n }\n .pull-md-2 {\n right: 16.666667%;\n }\n .pull-md-3 {\n right: 25%;\n }\n .pull-md-4 {\n right: 33.333333%;\n }\n .pull-md-5 {\n right: 41.666667%;\n }\n .pull-md-6 {\n right: 50%;\n }\n .pull-md-7 {\n right: 58.333333%;\n }\n .pull-md-8 {\n right: 66.666667%;\n }\n .pull-md-9 {\n right: 75%;\n }\n .pull-md-10 {\n right: 83.333333%;\n }\n .pull-md-11 {\n right: 91.666667%;\n }\n .pull-md-12 {\n right: 100%;\n }\n .push-md-0 {\n left: auto;\n }\n .push-md-1 {\n left: 8.333333%;\n }\n .push-md-2 {\n left: 16.666667%;\n }\n .push-md-3 {\n left: 25%;\n }\n .push-md-4 {\n left: 33.333333%;\n }\n .push-md-5 {\n left: 41.666667%;\n }\n .push-md-6 {\n left: 50%;\n }\n .push-md-7 {\n left: 58.333333%;\n }\n .push-md-8 {\n left: 66.666667%;\n }\n .push-md-9 {\n left: 75%;\n }\n .push-md-10 {\n left: 83.333333%;\n }\n .push-md-11 {\n left: 91.666667%;\n }\n .push-md-12 {\n left: 100%;\n }\n .offset-md-0 {\n margin-left: 0%;\n }\n .offset-md-1 {\n margin-left: 8.333333%;\n }\n .offset-md-2 {\n margin-left: 16.666667%;\n }\n .offset-md-3 {\n margin-left: 25%;\n }\n .offset-md-4 {\n margin-left: 33.333333%;\n }\n .offset-md-5 {\n margin-left: 41.666667%;\n }\n .offset-md-6 {\n margin-left: 50%;\n }\n .offset-md-7 {\n margin-left: 58.333333%;\n }\n .offset-md-8 {\n margin-left: 66.666667%;\n }\n .offset-md-9 {\n margin-left: 75%;\n }\n .offset-md-10 {\n margin-left: 83.333333%;\n }\n .offset-md-11 {\n margin-left: 91.666667%;\n }\n}\n\n@media (min-width: 992px) {\n .col-lg {\n flex-basis: 0;\n flex-grow: 1;\n max-width: 100%;\n }\n .col-lg-auto {\n flex: 0 0 auto;\n width: auto;\n }\n .col-lg-1 {\n width: 8.333333%;\n }\n .col-lg-2 {\n width: 16.666667%;\n }\n .col-lg-3 {\n width: 25%;\n }\n .col-lg-4 {\n width: 33.333333%;\n }\n .col-lg-5 {\n width: 41.666667%;\n }\n .col-lg-6 {\n width: 50%;\n }\n .col-lg-7 {\n width: 58.333333%;\n }\n .col-lg-8 {\n width: 66.666667%;\n }\n .col-lg-9 {\n width: 75%;\n }\n .col-lg-10 {\n width: 83.333333%;\n }\n .col-lg-11 {\n width: 91.666667%;\n }\n .col-lg-12 {\n width: 100%;\n }\n .pull-lg-0 {\n right: auto;\n }\n .pull-lg-1 {\n right: 8.333333%;\n }\n .pull-lg-2 {\n right: 16.666667%;\n }\n .pull-lg-3 {\n right: 25%;\n }\n .pull-lg-4 {\n right: 33.333333%;\n }\n .pull-lg-5 {\n right: 41.666667%;\n }\n .pull-lg-6 {\n right: 50%;\n }\n .pull-lg-7 {\n right: 58.333333%;\n }\n .pull-lg-8 {\n right: 66.666667%;\n }\n .pull-lg-9 {\n right: 75%;\n }\n .pull-lg-10 {\n right: 83.333333%;\n }\n .pull-lg-11 {\n right: 91.666667%;\n }\n .pull-lg-12 {\n right: 100%;\n }\n .push-lg-0 {\n left: auto;\n }\n .push-lg-1 {\n left: 8.333333%;\n }\n .push-lg-2 {\n left: 16.666667%;\n }\n .push-lg-3 {\n left: 25%;\n }\n .push-lg-4 {\n left: 33.333333%;\n }\n .push-lg-5 {\n left: 41.666667%;\n }\n .push-lg-6 {\n left: 50%;\n }\n .push-lg-7 {\n left: 58.333333%;\n }\n .push-lg-8 {\n left: 66.666667%;\n }\n .push-lg-9 {\n left: 75%;\n }\n .push-lg-10 {\n left: 83.333333%;\n }\n .push-lg-11 {\n left: 91.666667%;\n }\n .push-lg-12 {\n left: 100%;\n }\n .offset-lg-0 {\n margin-left: 0%;\n }\n .offset-lg-1 {\n margin-left: 8.333333%;\n }\n .offset-lg-2 {\n margin-left: 16.666667%;\n }\n .offset-lg-3 {\n margin-left: 25%;\n }\n .offset-lg-4 {\n margin-left: 33.333333%;\n }\n .offset-lg-5 {\n margin-left: 41.666667%;\n }\n .offset-lg-6 {\n margin-left: 50%;\n }\n .offset-lg-7 {\n margin-left: 58.333333%;\n }\n .offset-lg-8 {\n margin-left: 66.666667%;\n }\n .offset-lg-9 {\n margin-left: 75%;\n }\n .offset-lg-10 {\n margin-left: 83.333333%;\n }\n .offset-lg-11 {\n margin-left: 91.666667%;\n }\n}\n\n@media (min-width: 1200px) {\n .col-xl {\n flex-basis: 0;\n flex-grow: 1;\n max-width: 100%;\n }\n .col-xl-auto {\n flex: 0 0 auto;\n width: auto;\n }\n .col-xl-1 {\n width: 8.333333%;\n }\n .col-xl-2 {\n width: 16.666667%;\n }\n .col-xl-3 {\n width: 25%;\n }\n .col-xl-4 {\n width: 33.333333%;\n }\n .col-xl-5 {\n width: 41.666667%;\n }\n .col-xl-6 {\n width: 50%;\n }\n .col-xl-7 {\n width: 58.333333%;\n }\n .col-xl-8 {\n width: 66.666667%;\n }\n .col-xl-9 {\n width: 75%;\n }\n .col-xl-10 {\n width: 83.333333%;\n }\n .col-xl-11 {\n width: 91.666667%;\n }\n .col-xl-12 {\n width: 100%;\n }\n .pull-xl-0 {\n right: auto;\n }\n .pull-xl-1 {\n right: 8.333333%;\n }\n .pull-xl-2 {\n right: 16.666667%;\n }\n .pull-xl-3 {\n right: 25%;\n }\n .pull-xl-4 {\n right: 33.333333%;\n }\n .pull-xl-5 {\n right: 41.666667%;\n }\n .pull-xl-6 {\n right: 50%;\n }\n .pull-xl-7 {\n right: 58.333333%;\n }\n .pull-xl-8 {\n right: 66.666667%;\n }\n .pull-xl-9 {\n right: 75%;\n }\n .pull-xl-10 {\n right: 83.333333%;\n }\n .pull-xl-11 {\n right: 91.666667%;\n }\n .pull-xl-12 {\n right: 100%;\n }\n .push-xl-0 {\n left: auto;\n }\n .push-xl-1 {\n left: 8.333333%;\n }\n .push-xl-2 {\n left: 16.666667%;\n }\n .push-xl-3 {\n left: 25%;\n }\n .push-xl-4 {\n left: 33.333333%;\n }\n .push-xl-5 {\n left: 41.666667%;\n }\n .push-xl-6 {\n left: 50%;\n }\n .push-xl-7 {\n left: 58.333333%;\n }\n .push-xl-8 {\n left: 66.666667%;\n }\n .push-xl-9 {\n left: 75%;\n }\n .push-xl-10 {\n left: 83.333333%;\n }\n .push-xl-11 {\n left: 91.666667%;\n }\n .push-xl-12 {\n left: 100%;\n }\n .offset-xl-0 {\n margin-left: 0%;\n }\n .offset-xl-1 {\n margin-left: 8.333333%;\n }\n .offset-xl-2 {\n margin-left: 16.666667%;\n }\n .offset-xl-3 {\n margin-left: 25%;\n }\n .offset-xl-4 {\n margin-left: 33.333333%;\n }\n .offset-xl-5 {\n margin-left: 41.666667%;\n }\n .offset-xl-6 {\n margin-left: 50%;\n }\n .offset-xl-7 {\n margin-left: 58.333333%;\n }\n .offset-xl-8 {\n margin-left: 66.666667%;\n }\n .offset-xl-9 {\n margin-left: 75%;\n }\n .offset-xl-10 {\n margin-left: 83.333333%;\n }\n .offset-xl-11 {\n margin-left: 91.666667%;\n }\n}\n\n.table {\n width: 100%;\n max-width: 100%;\n margin-bottom: 1rem;\n background-color: transparent;\n}\n\n.table th,\n.table td {\n padding: 0.75rem;\n vertical-align: top;\n border-top: 1px solid #eceeef;\n}\n\n.table thead th {\n vertical-align: bottom;\n border-bottom: 2px solid #eceeef;\n}\n\n.table tbody + tbody {\n border-top: 2px solid #eceeef;\n}\n\n.table .table {\n background-color: #fff;\n}\n\n.table-sm th,\n.table-sm td {\n padding: 0.3rem;\n}\n\n.table-bordered {\n border: 1px solid #eceeef;\n}\n\n.table-bordered th,\n.table-bordered td {\n border: 1px solid #eceeef;\n}\n\n.table-bordered thead th,\n.table-bordered thead td {\n border-bottom-width: 2px;\n}\n\n.table-striped tbody tr:nth-of-type(odd) {\n background-color: rgba(0, 0, 0, 0.05);\n}\n\n.table-hover tbody tr:hover {\n background-color: rgba(0, 0, 0, 0.075);\n}\n\n.table-active,\n.table-active > th,\n.table-active > td {\n background-color: rgba(0, 0, 0, 0.075);\n}\n\n.table-hover .table-active:hover {\n background-color: rgba(0, 0, 0, 0.075);\n}\n\n.table-hover .table-active:hover > td,\n.table-hover .table-active:hover > th {\n background-color: rgba(0, 0, 0, 0.075);\n}\n\n.table-success,\n.table-success > th,\n.table-success > td {\n background-color: #dff0d8;\n}\n\n.table-hover .table-success:hover {\n background-color: #d0e9c6;\n}\n\n.table-hover .table-success:hover > td,\n.table-hover .table-success:hover > th {\n background-color: #d0e9c6;\n}\n\n.table-info,\n.table-info > th,\n.table-info > td {\n background-color: #d9edf7;\n}\n\n.table-hover .table-info:hover {\n background-color: #c4e3f3;\n}\n\n.table-hover .table-info:hover > td,\n.table-hover .table-info:hover > th {\n background-color: #c4e3f3;\n}\n\n.table-warning,\n.table-warning > th,\n.table-warning > td {\n background-color: #fcf8e3;\n}\n\n.table-hover .table-warning:hover {\n background-color: #faf2cc;\n}\n\n.table-hover .table-warning:hover > td,\n.table-hover .table-warning:hover > th {\n background-color: #faf2cc;\n}\n\n.table-danger,\n.table-danger > th,\n.table-danger > td {\n background-color: #f2dede;\n}\n\n.table-hover .table-danger:hover {\n background-color: #ebcccc;\n}\n\n.table-hover .table-danger:hover > td,\n.table-hover .table-danger:hover > th {\n background-color: #ebcccc;\n}\n\n.thead-inverse th {\n color: #fff;\n background-color: #292b2c;\n}\n\n.thead-default th {\n color: #464a4c;\n background-color: #eceeef;\n}\n\n.table-inverse {\n color: #fff;\n background-color: #292b2c;\n}\n\n.table-inverse th,\n.table-inverse td,\n.table-inverse thead th {\n border-color: #3b3e40;\n}\n\n.table-inverse.table-bordered {\n border: 0;\n}\n\n.table-inverse.table-striped tbody tr:nth-of-type(odd) {\n background-color: rgba(255, 255, 255, 0.05);\n}\n\n.table-inverse.table-hover tbody tr:hover {\n background-color: rgba(255, 255, 255, 0.075);\n}\n\n@media (max-width: 991px) {\n .table-responsive {\n display: block;\n width: 100%;\n overflow-x: auto;\n -ms-overflow-style: -ms-autohiding-scrollbar;\n }\n .table-responsive.table-bordered {\n border: 0;\n }\n}\n\n.form-control {\n display: block;\n width: 100%;\n padding: 0.5rem 1rem;\n font-size: 1rem;\n line-height: 1.25;\n color: #464a4c;\n background-color: #fff;\n background-image: none;\n background-clip: padding-box;\n border: 1px solid rgba(0, 0, 0, 0.15);\n border-radius: 0.25rem;\n transition: border-color ease-in-out 0.15s, box-shadow ease-in-out 0.15s;\n}\n\n.form-control::-ms-expand {\n background-color: transparent;\n border: 0;\n}\n\n.form-control:focus {\n color: #464a4c;\n background-color: #fff;\n border-color: #5cb3fd;\n outline: none;\n}\n\n.form-control::placeholder {\n color: #636c72;\n opacity: 1;\n}\n\n.form-control:disabled, .form-control[readonly] {\n background-color: #eceeef;\n opacity: 1;\n}\n\nselect.form-control:not([size]):not([multiple]) {\n height: calc(2.25rem + 2px);\n}\n\nselect.form-control:focus::-ms-value {\n color: #464a4c;\n background-color: #fff;\n}\n\n.form-control-file,\n.form-control-range {\n display: block;\n}\n\n.col-form-label {\n padding-top: calc(0.5rem - 1px * 2);\n padding-bottom: calc(0.5rem - 1px * 2);\n margin-bottom: 0;\n}\n\n.col-form-label-lg {\n padding-top: calc(0.5rem - 1px * 2);\n padding-bottom: calc(0.5rem - 1px * 2);\n font-size: 1.25rem;\n}\n\n.col-form-label-sm {\n padding-top: calc(0.25rem - 1px * 2);\n padding-bottom: calc(0.25rem - 1px * 2);\n font-size: 0.875rem;\n}\n\n.col-form-legend {\n padding-top: 0.5rem;\n padding-bottom: 0.5rem;\n margin-bottom: 0;\n font-size: 1rem;\n}\n\n.form-control-static {\n padding-top: 0.5rem;\n padding-bottom: 0.5rem;\n margin-bottom: 0;\n line-height: 1.25;\n border: solid transparent;\n border-width: 1px 0;\n}\n\n.form-control-static.form-control-sm, .input-group-sm > .form-control-static.form-control,\n.input-group-sm > .form-control-static.input-group-addon,\n.input-group-sm > .input-group-btn > .form-control-static.btn, .form-control-static.form-control-lg, .input-group-lg > .form-control-static.form-control,\n.input-group-lg > .form-control-static.input-group-addon,\n.input-group-lg > .input-group-btn > .form-control-static.btn {\n padding-right: 0;\n padding-left: 0;\n}\n\n.form-control-sm, .input-group-sm > .form-control,\n.input-group-sm > .input-group-addon,\n.input-group-sm > .input-group-btn > .btn {\n padding: 0.25rem 0.5rem;\n font-size: 0.875rem;\n line-height: 1.5;\n border-radius: 0.2rem;\n}\n\nselect.form-control-sm:not([size]):not([multiple]), .input-group-sm > select.form-control:not([size]):not([multiple]),\n.input-group-sm > select.input-group-addon:not([size]):not([multiple]),\n.input-group-sm > .input-group-btn > select.btn:not([size]):not([multiple]) {\n height: calc(1.8125rem + 2px);\n}\n\n.form-control-lg, .input-group-lg > .form-control,\n.input-group-lg > .input-group-addon,\n.input-group-lg > .input-group-btn > .btn {\n padding: 0.5rem 1rem;\n font-size: 1.25rem;\n line-height: 1.5;\n border-radius: 0.3rem;\n}\n\nselect.form-control-lg:not([size]):not([multiple]), .input-group-lg > select.form-control:not([size]):not([multiple]),\n.input-group-lg > select.input-group-addon:not([size]):not([multiple]),\n.input-group-lg > .input-group-btn > select.btn:not([size]):not([multiple]) {\n height: calc(2.875rem + 2px);\n}\n\n.form-group {\n margin-bottom: 1rem;\n}\n\n.form-text {\n display: block;\n margin-top: 0.25rem;\n}\n\n.form-check {\n position: relative;\n display: block;\n margin-bottom: 0.5rem;\n}\n\n.form-check.disabled .form-check-label {\n color: #636c72;\n}\n\n.form-check-label {\n padding-left: 1.25rem;\n margin-bottom: 0;\n}\n\n.form-check-input {\n position: absolute;\n margin-top: 0.25rem;\n margin-left: -1.25rem;\n}\n\n.form-check-input:only-child {\n position: static;\n}\n\n.form-check-inline {\n display: inline-block;\n}\n\n.form-check-inline .form-check-label {\n vertical-align: middle;\n}\n\n.form-check-inline + .form-check-inline {\n margin-left: 0.75rem;\n}\n\n.form-control-feedback {\n margin-top: 0.25rem;\n}\n\n.form-control-success,\n.form-control-warning,\n.form-control-danger {\n padding-right: 3rem;\n background-repeat: no-repeat;\n background-position: center right 0.5625rem;\n background-size: 1.125rem 1.125rem;\n}\n\n.has-success .form-control-feedback,\n.has-success .form-control-label,\n.has-success .col-form-label,\n.has-success .form-check-label,\n.has-success .custom-control {\n color: #5cb85c;\n}\n\n.has-success .form-control,\n.has-success .custom-select,\n.has-success .custom-file-control {\n border-color: #5cb85c;\n}\n\n.has-success .input-group-addon {\n color: #5cb85c;\n background-color: #eaf6ea;\n border-color: #5cb85c;\n}\n\n.has-success .form-control-success {\n background-image: url(\"data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3E%3Cpath fill='%235cb85c' d='M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3E%3C/svg%3E\");\n}\n\n.has-warning .form-control-feedback,\n.has-warning .form-control-label,\n.has-warning .col-form-label,\n.has-warning .form-check-label,\n.has-warning .custom-control {\n color: #f0ad4e;\n}\n\n.has-warning .form-control,\n.has-warning .custom-select,\n.has-warning .custom-file-control {\n border-color: #f0ad4e;\n}\n\n.has-warning .input-group-addon {\n color: #f0ad4e;\n background-color: white;\n border-color: #f0ad4e;\n}\n\n.has-warning .form-control-warning {\n background-image: url(\"data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3E%3Cpath fill='%23f0ad4e' d='M4.4 5.324h-.8v-2.46h.8zm0 1.42h-.8V5.89h.8zM3.76.63L.04 7.075c-.115.2.016.425.26.426h7.397c.242 0 .372-.226.258-.426C6.726 4.924 5.47 2.79 4.253.63c-.113-.174-.39-.174-.494 0z'/%3E%3C/svg%3E\");\n}\n\n.has-danger .form-control-feedback,\n.has-danger .form-control-label,\n.has-danger .col-form-label,\n.has-danger .form-check-label,\n.has-danger .custom-control {\n color: #d9534f;\n}\n\n.has-danger .form-control,\n.has-danger .custom-select,\n.has-danger .custom-file-control {\n border-color: #d9534f;\n}\n\n.has-danger .input-group-addon {\n color: #d9534f;\n background-color: #fdf7f7;\n border-color: #d9534f;\n}\n\n.has-danger .form-control-danger {\n background-image: url(\"data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23d9534f' viewBox='-2 -2 7 7'%3E%3Cpath stroke='%23d9534f' d='M0 0l3 3m0-3L0 3'/%3E%3Ccircle r='.5'/%3E%3Ccircle cx='3' r='.5'/%3E%3Ccircle cy='3' r='.5'/%3E%3Ccircle cx='3' cy='3' r='.5'/%3E%3C/svg%3E\");\n}\n\n.form-inline {\n display: flex;\n flex-flow: row wrap;\n align-items: center;\n}\n\n.form-inline .form-check {\n width: 100%;\n}\n\n@media (min-width: 576px) {\n .form-inline label {\n display: flex;\n align-items: center;\n justify-content: center;\n margin-bottom: 0;\n }\n .form-inline .form-group {\n display: flex;\n flex: 0 0 auto;\n flex-flow: row wrap;\n align-items: center;\n margin-bottom: 0;\n }\n .form-inline .form-control {\n display: inline-block;\n width: auto;\n vertical-align: middle;\n }\n .form-inline .form-control-static {\n display: inline-block;\n }\n .form-inline .input-group {\n width: auto;\n }\n .form-inline .form-control-label {\n margin-bottom: 0;\n vertical-align: middle;\n }\n .form-inline .form-check {\n display: flex;\n align-items: center;\n justify-content: center;\n width: auto;\n margin-top: 0;\n margin-bottom: 0;\n }\n .form-inline .form-check-label {\n padding-left: 0;\n }\n .form-inline .form-check-input {\n position: relative;\n margin-top: 0;\n margin-right: 0.25rem;\n margin-left: 0;\n }\n .form-inline .custom-control {\n display: flex;\n align-items: center;\n justify-content: center;\n padding-left: 0;\n }\n .form-inline .custom-control-indicator {\n position: static;\n display: inline-block;\n margin-right: 0.25rem;\n vertical-align: text-bottom;\n }\n .form-inline .has-feedback .form-control-feedback {\n top: 0;\n }\n}\n\n.btn {\n display: inline-block;\n font-weight: normal;\n text-align: center;\n white-space: nowrap;\n vertical-align: middle;\n user-select: none;\n border: 1px solid transparent;\n padding: 0.5rem 1rem;\n font-size: 1rem;\n line-height: 1.25;\n border-radius: 0.25rem;\n transition: all 0.2s ease-in-out;\n}\n\n.btn:focus, .btn:hover {\n text-decoration: none;\n}\n\n.btn:focus, .btn.focus {\n outline: 0;\n box-shadow: 0 0 0 2px rgba(2, 117, 216, 0.25);\n}\n\n.btn.disabled, .btn:disabled {\n opacity: .65;\n}\n\n.btn:active, .btn.active {\n background-image: none;\n}\n\na.btn.disabled,\nfieldset[disabled] a.btn {\n pointer-events: none;\n}\n\n.btn-primary {\n color: #fff;\n background-color: #0275d8;\n border-color: #0275d8;\n}\n\n.btn-primary:hover {\n color: #fff;\n background-color: #025aa5;\n border-color: #01549b;\n}\n\n.btn-primary:focus, .btn-primary.focus {\n box-shadow: 0 0 0 2px rgba(2, 117, 216, 0.5);\n}\n\n.btn-primary.disabled, .btn-primary:disabled {\n background-color: #0275d8;\n border-color: #0275d8;\n}\n\n.btn-primary:active, .btn-primary.active,\n.show > .btn-primary.dropdown-toggle {\n color: #fff;\n background-color: #025aa5;\n background-image: none;\n border-color: #01549b;\n}\n\n.btn-secondary {\n color: #292b2c;\n background-color: #fff;\n border-color: #ccc;\n}\n\n.btn-secondary:hover {\n color: #292b2c;\n background-color: #e6e6e6;\n border-color: #adadad;\n}\n\n.btn-secondary:focus, .btn-secondary.focus {\n box-shadow: 0 0 0 2px rgba(204, 204, 204, 0.5);\n}\n\n.btn-secondary.disabled, .btn-secondary:disabled {\n background-color: #fff;\n border-color: #ccc;\n}\n\n.btn-secondary:active, .btn-secondary.active,\n.show > .btn-secondary.dropdown-toggle {\n color: #292b2c;\n background-color: #e6e6e6;\n background-image: none;\n border-color: #adadad;\n}\n\n.btn-info {\n color: #fff;\n background-color: #5bc0de;\n border-color: #5bc0de;\n}\n\n.btn-info:hover {\n color: #fff;\n background-color: #31b0d5;\n border-color: #2aabd2;\n}\n\n.btn-info:focus, .btn-info.focus {\n box-shadow: 0 0 0 2px rgba(91, 192, 222, 0.5);\n}\n\n.btn-info.disabled, .btn-info:disabled {\n background-color: #5bc0de;\n border-color: #5bc0de;\n}\n\n.btn-info:active, .btn-info.active,\n.show > .btn-info.dropdown-toggle {\n color: #fff;\n background-color: #31b0d5;\n background-image: none;\n border-color: #2aabd2;\n}\n\n.btn-success {\n color: #fff;\n background-color: #5cb85c;\n border-color: #5cb85c;\n}\n\n.btn-success:hover {\n color: #fff;\n background-color: #449d44;\n border-color: #419641;\n}\n\n.btn-success:focus, .btn-success.focus {\n box-shadow: 0 0 0 2px rgba(92, 184, 92, 0.5);\n}\n\n.btn-success.disabled, .btn-success:disabled {\n background-color: #5cb85c;\n border-color: #5cb85c;\n}\n\n.btn-success:active, .btn-success.active,\n.show > .btn-success.dropdown-toggle {\n color: #fff;\n background-color: #449d44;\n background-image: none;\n border-color: #419641;\n}\n\n.btn-warning {\n color: #fff;\n background-color: #f0ad4e;\n border-color: #f0ad4e;\n}\n\n.btn-warning:hover {\n color: #fff;\n background-color: #ec971f;\n border-color: #eb9316;\n}\n\n.btn-warning:focus, .btn-warning.focus {\n box-shadow: 0 0 0 2px rgba(240, 173, 78, 0.5);\n}\n\n.btn-warning.disabled, .btn-warning:disabled {\n background-color: #f0ad4e;\n border-color: #f0ad4e;\n}\n\n.btn-warning:active, .btn-warning.active,\n.show > .btn-warning.dropdown-toggle {\n color: #fff;\n background-color: #ec971f;\n background-image: none;\n border-color: #eb9316;\n}\n\n.btn-danger {\n color: #fff;\n background-color: #d9534f;\n border-color: #d9534f;\n}\n\n.btn-danger:hover {\n color: #fff;\n background-color: #c9302c;\n border-color: #c12e2a;\n}\n\n.btn-danger:focus, .btn-danger.focus {\n box-shadow: 0 0 0 2px rgba(217, 83, 79, 0.5);\n}\n\n.btn-danger.disabled, .btn-danger:disabled {\n background-color: #d9534f;\n border-color: #d9534f;\n}\n\n.btn-danger:active, .btn-danger.active,\n.show > .btn-danger.dropdown-toggle {\n color: #fff;\n background-color: #c9302c;\n background-image: none;\n border-color: #c12e2a;\n}\n\n.btn-outline-primary {\n color: #0275d8;\n background-color: transparent;\n background-image: none;\n border-color: #0275d8;\n}\n\n.btn-outline-primary:hover {\n color: #fff;\n background-color: #0275d8;\n border-color: #0275d8;\n}\n\n.btn-outline-primary:focus, .btn-outline-primary.focus {\n box-shadow: 0 0 0 2px rgba(2, 117, 216, 0.5);\n}\n\n.btn-outline-primary.disabled, .btn-outline-primary:disabled {\n color: #0275d8;\n background-color: transparent;\n}\n\n.btn-outline-primary:active, .btn-outline-primary.active,\n.show > .btn-outline-primary.dropdown-toggle {\n color: #fff;\n background-color: #0275d8;\n border-color: #0275d8;\n}\n\n.btn-outline-secondary {\n color: #ccc;\n background-color: transparent;\n background-image: none;\n border-color: #ccc;\n}\n\n.btn-outline-secondary:hover {\n color: #292b2c;\n background-color: #ccc;\n border-color: #ccc;\n}\n\n.btn-outline-secondary:focus, .btn-outline-secondary.focus {\n box-shadow: 0 0 0 2px rgba(204, 204, 204, 0.5);\n}\n\n.btn-outline-secondary.disabled, .btn-outline-secondary:disabled {\n color: #ccc;\n background-color: transparent;\n}\n\n.btn-outline-secondary:active, .btn-outline-secondary.active,\n.show > .btn-outline-secondary.dropdown-toggle {\n color: #292b2c;\n background-color: #ccc;\n border-color: #ccc;\n}\n\n.btn-outline-info {\n color: #5bc0de;\n background-color: transparent;\n background-image: none;\n border-color: #5bc0de;\n}\n\n.btn-outline-info:hover {\n color: #fff;\n background-color: #5bc0de;\n border-color: #5bc0de;\n}\n\n.btn-outline-info:focus, .btn-outline-info.focus {\n box-shadow: 0 0 0 2px rgba(91, 192, 222, 0.5);\n}\n\n.btn-outline-info.disabled, .btn-outline-info:disabled {\n color: #5bc0de;\n background-color: transparent;\n}\n\n.btn-outline-info:active, .btn-outline-info.active,\n.show > .btn-outline-info.dropdown-toggle {\n color: #fff;\n background-color: #5bc0de;\n border-color: #5bc0de;\n}\n\n.btn-outline-success {\n color: #5cb85c;\n background-color: transparent;\n background-image: none;\n border-color: #5cb85c;\n}\n\n.btn-outline-success:hover {\n color: #fff;\n background-color: #5cb85c;\n border-color: #5cb85c;\n}\n\n.btn-outline-success:focus, .btn-outline-success.focus {\n box-shadow: 0 0 0 2px rgba(92, 184, 92, 0.5);\n}\n\n.btn-outline-success.disabled, .btn-outline-success:disabled {\n color: #5cb85c;\n background-color: transparent;\n}\n\n.btn-outline-success:active, .btn-outline-success.active,\n.show > .btn-outline-success.dropdown-toggle {\n color: #fff;\n background-color: #5cb85c;\n border-color: #5cb85c;\n}\n\n.btn-outline-warning {\n color: #f0ad4e;\n background-color: transparent;\n background-image: none;\n border-color: #f0ad4e;\n}\n\n.btn-outline-warning:hover {\n color: #fff;\n background-color: #f0ad4e;\n border-color: #f0ad4e;\n}\n\n.btn-outline-warning:focus, .btn-outline-warning.focus {\n box-shadow: 0 0 0 2px rgba(240, 173, 78, 0.5);\n}\n\n.btn-outline-warning.disabled, .btn-outline-warning:disabled {\n color: #f0ad4e;\n background-color: transparent;\n}\n\n.btn-outline-warning:active, .btn-outline-warning.active,\n.show > .btn-outline-warning.dropdown-toggle {\n color: #fff;\n background-color: #f0ad4e;\n border-color: #f0ad4e;\n}\n\n.btn-outline-danger {\n color: #d9534f;\n background-color: transparent;\n background-image: none;\n border-color: #d9534f;\n}\n\n.btn-outline-danger:hover {\n color: #fff;\n background-color: #d9534f;\n border-color: #d9534f;\n}\n\n.btn-outline-danger:focus, .btn-outline-danger.focus {\n box-shadow: 0 0 0 2px rgba(217, 83, 79, 0.5);\n}\n\n.btn-outline-danger.disabled, .btn-outline-danger:disabled {\n color: #d9534f;\n background-color: transparent;\n}\n\n.btn-outline-danger:active, .btn-outline-danger.active,\n.show > .btn-outline-danger.dropdown-toggle {\n color: #fff;\n background-color: #d9534f;\n border-color: #d9534f;\n}\n\n.btn-link {\n font-weight: normal;\n color: #0275d8;\n border-radius: 0;\n}\n\n.btn-link, .btn-link:active, .btn-link.active, .btn-link:disabled {\n background-color: transparent;\n}\n\n.btn-link, .btn-link:focus, .btn-link:active {\n border-color: transparent;\n}\n\n.btn-link:hover {\n border-color: transparent;\n}\n\n.btn-link:focus, .btn-link:hover {\n color: #014c8c;\n text-decoration: underline;\n background-color: transparent;\n}\n\n.btn-link:disabled {\n color: #636c72;\n}\n\n.btn-link:disabled:focus, .btn-link:disabled:hover {\n text-decoration: none;\n}\n\n.btn-lg, .btn-group-lg > .btn {\n padding: 0.5rem 1rem;\n font-size: 1.25rem;\n line-height: 1.5;\n border-radius: 0.3rem;\n}\n\n.btn-sm, .btn-group-sm > .btn {\n padding: 0.25rem 0.5rem;\n font-size: 0.875rem;\n line-height: 1.5;\n border-radius: 0.2rem;\n}\n\n.btn-block {\n display: block;\n width: 100%;\n}\n\n.btn-block + .btn-block {\n margin-top: 0.5rem;\n}\n\ninput[type=\"submit\"].btn-block,\ninput[type=\"reset\"].btn-block,\ninput[type=\"button\"].btn-block {\n width: 100%;\n}\n\n.fade {\n opacity: 0;\n transition: opacity 0.15s linear;\n}\n\n.fade.show {\n opacity: 1;\n}\n\n.collapse {\n display: none;\n}\n\n.collapse.show {\n display: block;\n}\n\ntr.collapse.show {\n display: table-row;\n}\n\ntbody.collapse.show {\n display: table-row-group;\n}\n\n.collapsing {\n position: relative;\n height: 0;\n overflow: hidden;\n transition: height 0.35s ease;\n}\n\n.dropup,\n.dropdown {\n position: relative;\n}\n\n.dropdown-toggle::after {\n display: inline-block;\n width: 0;\n height: 0;\n margin-left: 0.3em;\n vertical-align: middle;\n content: \"\";\n border-top: 0.3em solid;\n border-right: 0.3em solid transparent;\n border-left: 0.3em solid transparent;\n}\n\n.dropdown-toggle:empty::after {\n margin-left: 0;\n}\n\n.dropup .dropdown-toggle::after {\n border-top: 0;\n border-bottom: 0.3em solid;\n}\n\n.dropdown-menu {\n position: absolute;\n top: 100%;\n left: 0;\n z-index: 1000;\n display: none;\n float: left;\n min-width: 10rem;\n padding: 0.5rem 0;\n margin: 0.125rem 0 0;\n font-size: 1rem;\n color: #292b2c;\n text-align: left;\n list-style: none;\n background-color: #fff;\n background-clip: padding-box;\n border: 1px solid rgba(0, 0, 0, 0.15);\n border-radius: 0.25rem;\n}\n\n.dropdown-divider {\n height: 0;\n margin: 0.5rem 0;\n overflow: hidden;\n border-top: 1px solid #eceeef;\n}\n\n.dropdown-item {\n display: block;\n width: 100%;\n padding: 0.25rem 1.5rem;\n clear: both;\n font-weight: normal;\n color: #292b2c;\n text-align: inherit;\n white-space: nowrap;\n background: none;\n border: 0;\n}\n\n.dropdown-item:focus, .dropdown-item:hover {\n color: #1d1e1f;\n text-decoration: none;\n background-color: #f7f7f9;\n}\n\n.dropdown-item.active, .dropdown-item:active {\n color: #fff;\n text-decoration: none;\n background-color: #0275d8;\n}\n\n.dropdown-item.disabled, .dropdown-item:disabled {\n color: #636c72;\n background-color: transparent;\n}\n\n.show > .dropdown-menu {\n display: block;\n}\n\n.show > a {\n outline: 0;\n}\n\n.dropdown-menu-right {\n right: 0;\n left: auto;\n}\n\n.dropdown-menu-left {\n right: auto;\n left: 0;\n}\n\n.dropdown-header {\n display: block;\n padding: 0.5rem 1.5rem;\n margin-bottom: 0;\n font-size: 0.875rem;\n color: #636c72;\n white-space: nowrap;\n}\n\n.dropup .dropdown-menu {\n top: auto;\n bottom: 100%;\n margin-bottom: 0.125rem;\n}\n\n.btn-group,\n.btn-group-vertical {\n position: relative;\n display: inline-flex;\n vertical-align: middle;\n}\n\n.btn-group > .btn,\n.btn-group-vertical > .btn {\n position: relative;\n flex: 0 1 auto;\n margin-bottom: 0;\n}\n\n.btn-group > .btn:hover,\n.btn-group-vertical > .btn:hover {\n z-index: 2;\n}\n\n.btn-group > .btn:focus, .btn-group > .btn:active, .btn-group > .btn.active,\n.btn-group-vertical > .btn:focus,\n.btn-group-vertical > .btn:active,\n.btn-group-vertical > .btn.active {\n z-index: 2;\n}\n\n.btn-group .btn + .btn,\n.btn-group .btn + .btn-group,\n.btn-group .btn-group + .btn,\n.btn-group .btn-group + .btn-group,\n.btn-group-vertical .btn + .btn,\n.btn-group-vertical .btn + .btn-group,\n.btn-group-vertical .btn-group + .btn,\n.btn-group-vertical .btn-group + .btn-group {\n margin-left: -1px;\n}\n\n.btn-toolbar {\n display: flex;\n flex-wrap: wrap;\n justify-content: flex-start;\n}\n\n.btn-toolbar .input-group {\n width: auto;\n}\n\n.btn-group > .btn:not(:first-child):not(:last-child):not(.dropdown-toggle) {\n border-radius: 0;\n}\n\n.btn-group > .btn:first-child {\n margin-left: 0;\n}\n\n.btn-group > .btn:first-child:not(:last-child):not(.dropdown-toggle) {\n border-top-right-radius: 0;\n border-bottom-right-radius: 0;\n}\n\n.btn-group > .btn:last-child:not(:first-child),\n.btn-group > .dropdown-toggle:not(:first-child) {\n border-top-left-radius: 0;\n border-bottom-left-radius: 0;\n}\n\n.btn-group > .btn-group {\n float: left;\n}\n\n.btn-group > .btn-group:not(:first-child):not(:last-child) > .btn {\n border-radius: 0;\n}\n\n.btn-group > .btn-group:first-child:not(:last-child) > .btn:last-child,\n.btn-group > .btn-group:first-child:not(:last-child) > .dropdown-toggle {\n border-top-right-radius: 0;\n border-bottom-right-radius: 0;\n}\n\n.btn-group > .btn-group:last-child:not(:first-child) > .btn:first-child {\n border-top-left-radius: 0;\n border-bottom-left-radius: 0;\n}\n\n.btn + .dropdown-toggle-split {\n padding-right: 0.75rem;\n padding-left: 0.75rem;\n}\n\n.btn + .dropdown-toggle-split::after {\n margin-left: 0;\n}\n\n.btn-sm + .dropdown-toggle-split, .btn-group-sm > .btn + .dropdown-toggle-split {\n padding-right: 0.375rem;\n padding-left: 0.375rem;\n}\n\n.btn-lg + .dropdown-toggle-split, .btn-group-lg > .btn + .dropdown-toggle-split {\n padding-right: 0.75rem;\n padding-left: 0.75rem;\n}\n\n.btn-group-vertical {\n display: inline-flex;\n flex-direction: column;\n align-items: flex-start;\n justify-content: center;\n}\n\n.btn-group-vertical .btn,\n.btn-group-vertical .btn-group {\n width: 100%;\n}\n\n.btn-group-vertical > .btn + .btn,\n.btn-group-vertical > .btn + .btn-group,\n.btn-group-vertical > .btn-group + .btn,\n.btn-group-vertical > .btn-group + .btn-group {\n margin-top: -1px;\n margin-left: 0;\n}\n\n.btn-group-vertical > .btn:not(:first-child):not(:last-child) {\n border-radius: 0;\n}\n\n.btn-group-vertical > .btn:first-child:not(:last-child) {\n border-bottom-right-radius: 0;\n border-bottom-left-radius: 0;\n}\n\n.btn-group-vertical > .btn:last-child:not(:first-child) {\n border-top-left-radius: 0;\n border-top-right-radius: 0;\n}\n\n.btn-group-vertical > .btn-group:not(:first-child):not(:last-child) > .btn {\n border-radius: 0;\n}\n\n.btn-group-vertical > .btn-group:first-child:not(:last-child) > .btn:last-child,\n.btn-group-vertical > .btn-group:first-child:not(:last-child) > .dropdown-toggle {\n border-bottom-right-radius: 0;\n border-bottom-left-radius: 0;\n}\n\n.btn-group-vertical > .btn-group:last-child:not(:first-child) > .btn:first-child {\n border-top-left-radius: 0;\n border-top-right-radius: 0;\n}\n\n[data-toggle=\"buttons\"] > .btn input[type=\"radio\"],\n[data-toggle=\"buttons\"] > .btn input[type=\"checkbox\"],\n[data-toggle=\"buttons\"] > .btn-group > .btn input[type=\"radio\"],\n[data-toggle=\"buttons\"] > .btn-group > .btn input[type=\"checkbox\"] {\n position: absolute;\n clip: rect(0, 0, 0, 0);\n pointer-events: none;\n}\n\n.input-group {\n position: relative;\n display: flex;\n width: 100%;\n}\n\n.input-group .form-control {\n position: relative;\n z-index: 2;\n flex: 1 1 auto;\n width: 1%;\n margin-bottom: 0;\n}\n\n.input-group .form-control:focus, .input-group .form-control:active, .input-group .form-control:hover {\n z-index: 3;\n}\n\n.input-group-addon,\n.input-group-btn,\n.input-group .form-control {\n display: flex;\n align-items: center;\n}\n\n.input-group-addon:not(:first-child):not(:last-child),\n.input-group-btn:not(:first-child):not(:last-child),\n.input-group .form-control:not(:first-child):not(:last-child) {\n border-radius: 0;\n}\n\n.input-group-addon,\n.input-group-btn {\n white-space: nowrap;\n vertical-align: middle;\n}\n\n.input-group-addon {\n padding: 0.5rem 1rem;\n margin-bottom: 0;\n font-size: 1rem;\n font-weight: normal;\n line-height: 1.25;\n color: #464a4c;\n text-align: center;\n background-color: #eceeef;\n border: 1px solid rgba(0, 0, 0, 0.15);\n border-radius: 0.25rem;\n}\n\n.input-group-addon.form-control-sm,\n.input-group-sm > .input-group-addon,\n.input-group-sm > .input-group-btn > .input-group-addon.btn {\n padding: 0.25rem 0.5rem;\n font-size: 0.875rem;\n border-radius: 0.2rem;\n}\n\n.input-group-addon.form-control-lg,\n.input-group-lg > .input-group-addon,\n.input-group-lg > .input-group-btn > .input-group-addon.btn {\n padding: 0.5rem 1rem;\n font-size: 1.25rem;\n border-radius: 0.3rem;\n}\n\n.input-group-addon input[type=\"radio\"],\n.input-group-addon input[type=\"checkbox\"] {\n margin-top: 0;\n}\n\n.input-group .form-control:not(:last-child),\n.input-group-addon:not(:last-child),\n.input-group-btn:not(:last-child) > .btn,\n.input-group-btn:not(:last-child) > .btn-group > .btn,\n.input-group-btn:not(:last-child) > .dropdown-toggle,\n.input-group-btn:not(:first-child) > .btn:not(:last-child):not(.dropdown-toggle),\n.input-group-btn:not(:first-child) > .btn-group:not(:last-child) > .btn {\n border-top-right-radius: 0;\n border-bottom-right-radius: 0;\n}\n\n.input-group-addon:not(:last-child) {\n border-right: 0;\n}\n\n.input-group .form-control:not(:first-child),\n.input-group-addon:not(:first-child),\n.input-group-btn:not(:first-child) > .btn,\n.input-group-btn:not(:first-child) > .btn-group > .btn,\n.input-group-btn:not(:first-child) > .dropdown-toggle,\n.input-group-btn:not(:last-child) > .btn:not(:first-child),\n.input-group-btn:not(:last-child) > .btn-group:not(:first-child) > .btn {\n border-top-left-radius: 0;\n border-bottom-left-radius: 0;\n}\n\n.form-control + .input-group-addon:not(:first-child) {\n border-left: 0;\n}\n\n.input-group-btn {\n position: relative;\n font-size: 0;\n white-space: nowrap;\n}\n\n.input-group-btn > .btn {\n position: relative;\n}\n\n.input-group-btn > .btn + .btn {\n margin-left: -1px;\n}\n\n.input-group-btn > .btn:focus, .input-group-btn > .btn:active, .input-group-btn > .btn:hover {\n z-index: 3;\n}\n\n.input-group-btn:not(:last-child) > .btn,\n.input-group-btn:not(:last-child) > .btn-group {\n margin-right: -1px;\n}\n\n.input-group-btn:not(:first-child) > .btn,\n.input-group-btn:not(:first-child) > .btn-group {\n z-index: 2;\n margin-left: -1px;\n}\n\n.input-group-btn:not(:first-child) > .btn:focus, .input-group-btn:not(:first-child) > .btn:active, .input-group-btn:not(:first-child) > .btn:hover,\n.input-group-btn:not(:first-child) > .btn-group:focus,\n.input-group-btn:not(:first-child) > .btn-group:active,\n.input-group-btn:not(:first-child) > .btn-group:hover {\n z-index: 3;\n}\n\n.custom-control {\n position: relative;\n display: inline-flex;\n min-height: 1.5rem;\n padding-left: 1.5rem;\n margin-right: 1rem;\n}\n\n.custom-control-input {\n position: absolute;\n z-index: -1;\n opacity: 0;\n}\n\n.custom-control-input:checked ~ .custom-control-indicator {\n color: #fff;\n background-color: #0275d8;\n}\n\n.custom-control-input:focus ~ .custom-control-indicator {\n box-shadow: 0 0 0 1px #fff, 0 0 0 3px #0275d8;\n}\n\n.custom-control-input:active ~ .custom-control-indicator {\n color: #fff;\n background-color: #8fcafe;\n}\n\n.custom-control-input:disabled ~ .custom-control-indicator {\n background-color: #eceeef;\n}\n\n.custom-control-input:disabled ~ .custom-control-description {\n color: #636c72;\n}\n\n.custom-control-indicator {\n position: absolute;\n top: 0.25rem;\n left: 0;\n display: block;\n width: 1rem;\n height: 1rem;\n pointer-events: none;\n user-select: none;\n background-color: #ddd;\n background-repeat: no-repeat;\n background-position: center center;\n background-size: 50% 50%;\n}\n\n.custom-checkbox .custom-control-indicator {\n border-radius: 0.25rem;\n}\n\n.custom-checkbox .custom-control-input:checked ~ .custom-control-indicator {\n background-image: url(\"data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3E%3Cpath fill='%23fff' d='M6.564.75l-3.59 3.612-1.538-1.55L0 4.26 2.974 7.25 8 2.193z'/%3E%3C/svg%3E\");\n}\n\n.custom-checkbox .custom-control-input:indeterminate ~ .custom-control-indicator {\n background-color: #0275d8;\n background-image: url(\"data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 4'%3E%3Cpath stroke='%23fff' d='M0 2h4'/%3E%3C/svg%3E\");\n}\n\n.custom-radio .custom-control-indicator {\n border-radius: 50%;\n}\n\n.custom-radio .custom-control-input:checked ~ .custom-control-indicator {\n background-image: url(\"data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3E%3Ccircle r='3' fill='%23fff'/%3E%3C/svg%3E\");\n}\n\n.custom-controls-stacked {\n display: flex;\n flex-direction: column;\n}\n\n.custom-controls-stacked .custom-control {\n margin-bottom: 0.25rem;\n}\n\n.custom-controls-stacked .custom-control + .custom-control {\n margin-left: 0;\n}\n\n.custom-select {\n display: inline-block;\n max-width: 100%;\n height: calc(2.25rem + 2px);\n padding: 0.375rem 1.75rem 0.375rem 0.75rem;\n line-height: 1.25;\n color: #464a4c;\n vertical-align: middle;\n background: #fff url(\"data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 5'%3E%3Cpath fill='%23333' d='M2 0L0 2h4zm0 5L0 3h4z'/%3E%3C/svg%3E\") no-repeat right 0.75rem center;\n background-size: 8px 10px;\n border: 1px solid rgba(0, 0, 0, 0.15);\n border-radius: 0.25rem;\n appearance: none;\n}\n\n.custom-select:focus {\n border-color: #5cb3fd;\n outline: none;\n}\n\n.custom-select:focus::-ms-value {\n color: #464a4c;\n background-color: #fff;\n}\n\n.custom-select:disabled {\n color: #636c72;\n background-color: #eceeef;\n}\n\n.custom-select::-ms-expand {\n opacity: 0;\n}\n\n.custom-select-sm {\n padding-top: 0.375rem;\n padding-bottom: 0.375rem;\n font-size: 75%;\n}\n\n.custom-file {\n position: relative;\n display: inline-block;\n max-width: 100%;\n height: 2.5rem;\n margin-bottom: 0;\n}\n\n.custom-file-input {\n min-width: 14rem;\n max-width: 100%;\n height: 2.5rem;\n margin: 0;\n opacity: 0;\n}\n\n.custom-file-control {\n position: absolute;\n top: 0;\n right: 0;\n left: 0;\n z-index: 5;\n height: 2.5rem;\n padding: 0.5rem 1rem;\n line-height: 1.5;\n color: #464a4c;\n pointer-events: none;\n user-select: none;\n background-color: #fff;\n border: 1px solid rgba(0, 0, 0, 0.15);\n border-radius: 0.25rem;\n}\n\n.custom-file-control:lang(en):empty::after {\n content: \"Choose file...\";\n}\n\n.custom-file-control::before {\n position: absolute;\n top: -1px;\n right: -1px;\n bottom: -1px;\n z-index: 6;\n display: block;\n height: 2.5rem;\n padding: 0.5rem 1rem;\n line-height: 1.5;\n color: #464a4c;\n background-color: #eceeef;\n border: 1px solid rgba(0, 0, 0, 0.15);\n border-radius: 0 0.25rem 0.25rem 0;\n}\n\n.custom-file-control:lang(en)::before {\n content: \"Browse\";\n}\n\n.nav {\n display: flex;\n flex-wrap: wrap;\n padding-left: 0;\n margin-bottom: 0;\n list-style: none;\n}\n\n.nav-link {\n display: block;\n padding: 0.5rem 1rem;\n}\n\n.nav-link:focus, .nav-link:hover {\n text-decoration: none;\n}\n\n.nav-link.disabled {\n color: #636c72;\n}\n\n.nav-tabs {\n border-bottom: 1px solid #ddd;\n}\n\n.nav-tabs .nav-item {\n margin-bottom: -1px;\n}\n\n.nav-tabs .nav-link {\n border: 1px solid transparent;\n border-top-left-radius: 0.25rem;\n border-top-right-radius: 0.25rem;\n}\n\n.nav-tabs .nav-link:focus, .nav-tabs .nav-link:hover {\n border-color: #eceeef #eceeef #ddd;\n}\n\n.nav-tabs .nav-link.disabled {\n color: #636c72;\n background-color: transparent;\n border-color: transparent;\n}\n\n.nav-tabs .nav-link.active,\n.nav-tabs .nav-item.show .nav-link {\n color: #464a4c;\n background-color: #fff;\n border-color: #ddd #ddd #fff;\n}\n\n.nav-tabs .dropdown-menu {\n margin-top: -1px;\n border-top-left-radius: 0;\n border-top-right-radius: 0;\n}\n\n.nav-pills .nav-link {\n border-radius: 0.25rem;\n}\n\n.nav-pills .nav-link.active,\n.show .nav-pills .nav-link {\n color: #fff;\n background-color: #0275d8;\n}\n\n.nav-fill .nav-item {\n flex: 1 1 auto;\n text-align: center;\n}\n\n.nav-justified .nav-item {\n flex-basis: 0;\n flex-grow: 1;\n text-align: center;\n}\n\n.tab-content > .tab-pane {\n display: none;\n}\n\n.tab-content > .active {\n display: block;\n}\n\n.navbar {\n position: relative;\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n justify-content: space-between;\n padding: 0.5rem 1rem;\n}\n\n.navbar > .container,\n.navbar > .container-fluid {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n justify-content: space-between;\n}\n\n@media (max-width: 575px) {\n .navbar > .container,\n .navbar > .container-fluid {\n width: 100%;\n margin-right: 0;\n margin-left: 0;\n }\n}\n\n.navbar-brand {\n display: inline-block;\n padding-top: 0.3125rem;\n padding-bottom: 0.3125rem;\n margin-right: 1rem;\n font-size: 1.25rem;\n line-height: inherit;\n white-space: nowrap;\n}\n\n.navbar-brand:focus, .navbar-brand:hover {\n text-decoration: none;\n}\n\n.navbar-nav {\n display: flex;\n flex-direction: column;\n padding-left: 0;\n margin-bottom: 0;\n list-style: none;\n}\n\n.navbar-nav .nav-link {\n padding-right: 0;\n padding-left: 0;\n}\n\n.navbar-text {\n display: inline-block;\n padding-top: 0.5rem;\n padding-bottom: 0.5rem;\n}\n\n.navbar-collapse {\n flex-basis: 100%;\n}\n\n.navbar-toggler {\n padding: 0.25rem 0.75rem;\n font-size: 1.25rem;\n line-height: 1;\n background: transparent;\n border: 1px solid transparent;\n border-radius: 0.25rem;\n}\n\n.navbar-toggler:focus, .navbar-toggler:hover {\n text-decoration: none;\n}\n\n.navbar-toggler-icon {\n display: inline-block;\n width: 1.5em;\n height: 1.5em;\n vertical-align: middle;\n content: \"\";\n background: no-repeat center center;\n background-size: 100% 100%;\n}\n\n@media (max-width: 575px) {\n .navbar-expand-sm .navbar-nav .dropdown-menu {\n position: static;\n float: none;\n }\n .navbar-expand-sm > .container,\n .navbar-expand-sm > .container-fluid {\n padding-right: 0;\n padding-left: 0;\n }\n}\n\n@media (min-width: 576px) {\n .navbar-expand-sm {\n flex-direction: row;\n flex-wrap: nowrap;\n justify-content: flex-start;\n }\n .navbar-expand-sm .navbar-nav {\n flex-direction: row;\n }\n .navbar-expand-sm .navbar-nav .dropdown-menu {\n position: absolute;\n }\n .navbar-expand-sm .navbar-nav .nav-link {\n padding-right: .5rem;\n padding-left: .5rem;\n }\n .navbar-expand-sm > .container,\n .navbar-expand-sm > .container-fluid {\n flex-wrap: nowrap;\n }\n .navbar-expand-sm .navbar-collapse {\n display: flex !important;\n }\n .navbar-expand-sm .navbar-toggler {\n display: none;\n }\n}\n\n@media (max-width: 767px) {\n .navbar-expand-md .navbar-nav .dropdown-menu {\n position: static;\n float: none;\n }\n .navbar-expand-md > .container,\n .navbar-expand-md > .container-fluid {\n padding-right: 0;\n padding-left: 0;\n }\n}\n\n@media (min-width: 768px) {\n .navbar-expand-md {\n flex-direction: row;\n flex-wrap: nowrap;\n justify-content: flex-start;\n }\n .navbar-expand-md .navbar-nav {\n flex-direction: row;\n }\n .navbar-expand-md .navbar-nav .dropdown-menu {\n position: absolute;\n }\n .navbar-expand-md .navbar-nav .nav-link {\n padding-right: .5rem;\n padding-left: .5rem;\n }\n .navbar-expand-md > .container,\n .navbar-expand-md > .container-fluid {\n flex-wrap: nowrap;\n }\n .navbar-expand-md .navbar-collapse {\n display: flex !important;\n }\n .navbar-expand-md .navbar-toggler {\n display: none;\n }\n}\n\n@media (max-width: 991px) {\n .navbar-expand-lg .navbar-nav .dropdown-menu {\n position: static;\n float: none;\n }\n .navbar-expand-lg > .container,\n .navbar-expand-lg > .container-fluid {\n padding-right: 0;\n padding-left: 0;\n }\n}\n\n@media (min-width: 992px) {\n .navbar-expand-lg {\n flex-direction: row;\n flex-wrap: nowrap;\n justify-content: flex-start;\n }\n .navbar-expand-lg .navbar-nav {\n flex-direction: row;\n }\n .navbar-expand-lg .navbar-nav .dropdown-menu {\n position: absolute;\n }\n .navbar-expand-lg .navbar-nav .nav-link {\n padding-right: .5rem;\n padding-left: .5rem;\n }\n .navbar-expand-lg > .container,\n .navbar-expand-lg > .container-fluid {\n flex-wrap: nowrap;\n }\n .navbar-expand-lg .navbar-collapse {\n display: flex !important;\n }\n .navbar-expand-lg .navbar-toggler {\n display: none;\n }\n}\n\n@media (max-width: 1199px) {\n .navbar-expand-xl .navbar-nav .dropdown-menu {\n position: static;\n float: none;\n }\n .navbar-expand-xl > .container,\n .navbar-expand-xl > .container-fluid {\n padding-right: 0;\n padding-left: 0;\n }\n}\n\n@media (min-width: 1200px) {\n .navbar-expand-xl {\n flex-direction: row;\n flex-wrap: nowrap;\n justify-content: flex-start;\n }\n .navbar-expand-xl .navbar-nav {\n flex-direction: row;\n }\n .navbar-expand-xl .navbar-nav .dropdown-menu {\n position: absolute;\n }\n .navbar-expand-xl .navbar-nav .nav-link {\n padding-right: .5rem;\n padding-left: .5rem;\n }\n .navbar-expand-xl > .container,\n .navbar-expand-xl > .container-fluid {\n flex-wrap: nowrap;\n }\n .navbar-expand-xl .navbar-collapse {\n display: flex !important;\n }\n .navbar-expand-xl .navbar-toggler {\n display: none;\n }\n}\n\n.navbar-expand {\n flex-direction: row;\n flex-wrap: nowrap;\n justify-content: flex-start;\n}\n\n.navbar-expand .navbar-nav .dropdown-menu {\n position: static;\n float: none;\n}\n\n.navbar-expand > .container,\n.navbar-expand > .container-fluid {\n padding-right: 0;\n padding-left: 0;\n}\n\n.navbar-expand .navbar-nav {\n flex-direction: row;\n}\n\n.navbar-expand .navbar-nav .dropdown-menu {\n position: absolute;\n}\n\n.navbar-expand .navbar-nav .nav-link {\n padding-right: .5rem;\n padding-left: .5rem;\n}\n\n.navbar-expand > .container,\n.navbar-expand > .container-fluid {\n flex-wrap: nowrap;\n}\n\n.navbar-expand .navbar-collapse {\n display: flex !important;\n}\n\n.navbar-expand .navbar-toggler {\n display: none;\n}\n\n.navbar-light .navbar-brand {\n color: rgba(0, 0, 0, 0.9);\n}\n\n.navbar-light .navbar-brand:focus, .navbar-light .navbar-brand:hover {\n color: rgba(0, 0, 0, 0.9);\n}\n\n.navbar-light .navbar-nav .nav-link {\n color: rgba(0, 0, 0, 0.5);\n}\n\n.navbar-light .navbar-nav .nav-link:focus, .navbar-light .navbar-nav .nav-link:hover {\n color: rgba(0, 0, 0, 0.7);\n}\n\n.navbar-light .navbar-nav .nav-link.disabled {\n color: rgba(0, 0, 0, 0.3);\n}\n\n.navbar-light .navbar-nav .show > .nav-link,\n.navbar-light .navbar-nav .active > .nav-link,\n.navbar-light .navbar-nav .nav-link.show,\n.navbar-light .navbar-nav .nav-link.active {\n color: rgba(0, 0, 0, 0.9);\n}\n\n.navbar-light .navbar-toggler {\n color: rgba(0, 0, 0, 0.5);\n border-color: rgba(0, 0, 0, 0.1);\n}\n\n.navbar-light .navbar-toggler-icon {\n background-image: url(\"data:image/svg+xml;charset=utf8,%3Csvg viewBox='0 0 30 30' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath stroke='rgba(0, 0, 0, 0.5)' stroke-width='2' stroke-linecap='round' stroke-miterlimit='10' d='M4 7h22M4 15h22M4 23h22'/%3E%3C/svg%3E\");\n}\n\n.navbar-light .navbar-text {\n color: rgba(0, 0, 0, 0.5);\n}\n\n.navbar-inverse .navbar-brand {\n color: white;\n}\n\n.navbar-inverse .navbar-brand:focus, .navbar-inverse .navbar-brand:hover {\n color: white;\n}\n\n.navbar-inverse .navbar-nav .nav-link {\n color: rgba(255, 255, 255, 0.5);\n}\n\n.navbar-inverse .navbar-nav .nav-link:focus, .navbar-inverse .navbar-nav .nav-link:hover {\n color: rgba(255, 255, 255, 0.75);\n}\n\n.navbar-inverse .navbar-nav .nav-link.disabled {\n color: rgba(255, 255, 255, 0.25);\n}\n\n.navbar-inverse .navbar-nav .show > .nav-link,\n.navbar-inverse .navbar-nav .active > .nav-link,\n.navbar-inverse .navbar-nav .nav-link.show,\n.navbar-inverse .navbar-nav .nav-link.active {\n color: white;\n}\n\n.navbar-inverse .navbar-toggler {\n color: rgba(255, 255, 255, 0.5);\n border-color: rgba(255, 255, 255, 0.1);\n}\n\n.navbar-inverse .navbar-toggler-icon {\n background-image: url(\"data:image/svg+xml;charset=utf8,%3Csvg viewBox='0 0 30 30' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath stroke='rgba(255, 255, 255, 0.5)' stroke-width='2' stroke-linecap='round' stroke-miterlimit='10' d='M4 7h22M4 15h22M4 23h22'/%3E%3C/svg%3E\");\n}\n\n.navbar-inverse .navbar-text {\n color: rgba(255, 255, 255, 0.5);\n}\n\n.card {\n position: relative;\n display: flex;\n flex-direction: column;\n background-color: #fff;\n border: 1px solid rgba(0, 0, 0, 0.125);\n border-radius: 0.25rem;\n}\n\n.card-block {\n flex: 1 1 auto;\n padding: 1.25rem;\n}\n\n.card-title {\n margin-bottom: 0.75rem;\n word-break: break-all;\n}\n\n.card-subtitle {\n margin-top: -0.375rem;\n margin-bottom: 0;\n}\n\n.card-text:last-child {\n margin-bottom: 0;\n}\n\n.card-link:hover {\n text-decoration: none;\n}\n\n.card-link + .card-link {\n margin-left: 1.25rem;\n}\n\n.card > .list-group:first-child .list-group-item:first-child {\n border-top-left-radius: 0.25rem;\n border-top-right-radius: 0.25rem;\n}\n\n.card > .list-group:last-child .list-group-item:last-child {\n border-bottom-right-radius: 0.25rem;\n border-bottom-left-radius: 0.25rem;\n}\n\n.card-header {\n padding: 0.75rem 1.25rem;\n margin-bottom: 0;\n background-color: #f7f7f9;\n border-bottom: 1px solid rgba(0, 0, 0, 0.125);\n}\n\n.card-header:first-child {\n border-radius: calc(0.25rem - 1px) calc(0.25rem - 1px) 0 0;\n}\n\n.card-footer {\n padding: 0.75rem 1.25rem;\n background-color: #f7f7f9;\n border-top: 1px solid rgba(0, 0, 0, 0.125);\n}\n\n.card-footer:last-child {\n border-radius: 0 0 calc(0.25rem - 1px) calc(0.25rem - 1px);\n}\n\n.card-header-tabs {\n margin-right: -0.625rem;\n margin-bottom: -0.75rem;\n margin-left: -0.625rem;\n border-bottom: 0;\n}\n\n.card-header-pills {\n margin-right: -0.625rem;\n margin-left: -0.625rem;\n}\n\n.card-primary {\n background-color: #0275d8;\n border-color: #0275d8;\n}\n\n.card-primary .card-header,\n.card-primary .card-footer {\n background-color: transparent;\n}\n\n.card-success {\n background-color: #5cb85c;\n border-color: #5cb85c;\n}\n\n.card-success .card-header,\n.card-success .card-footer {\n background-color: transparent;\n}\n\n.card-info {\n background-color: #5bc0de;\n border-color: #5bc0de;\n}\n\n.card-info .card-header,\n.card-info .card-footer {\n background-color: transparent;\n}\n\n.card-warning {\n background-color: #f0ad4e;\n border-color: #f0ad4e;\n}\n\n.card-warning .card-header,\n.card-warning .card-footer {\n background-color: transparent;\n}\n\n.card-danger {\n background-color: #d9534f;\n border-color: #d9534f;\n}\n\n.card-danger .card-header,\n.card-danger .card-footer {\n background-color: transparent;\n}\n\n.card-outline-primary {\n background-color: transparent;\n border-color: #0275d8;\n}\n\n.card-outline-primary .card-header,\n.card-outline-primary .card-footer {\n background-color: transparent;\n border-color: #0275d8;\n}\n\n.card-outline-secondary {\n background-color: transparent;\n border-color: #ccc;\n}\n\n.card-outline-secondary .card-header,\n.card-outline-secondary .card-footer {\n background-color: transparent;\n border-color: #ccc;\n}\n\n.card-outline-info {\n background-color: transparent;\n border-color: #5bc0de;\n}\n\n.card-outline-info .card-header,\n.card-outline-info .card-footer {\n background-color: transparent;\n border-color: #5bc0de;\n}\n\n.card-outline-success {\n background-color: transparent;\n border-color: #5cb85c;\n}\n\n.card-outline-success .card-header,\n.card-outline-success .card-footer {\n background-color: transparent;\n border-color: #5cb85c;\n}\n\n.card-outline-warning {\n background-color: transparent;\n border-color: #f0ad4e;\n}\n\n.card-outline-warning .card-header,\n.card-outline-warning .card-footer {\n background-color: transparent;\n border-color: #f0ad4e;\n}\n\n.card-outline-danger {\n background-color: transparent;\n border-color: #d9534f;\n}\n\n.card-outline-danger .card-header,\n.card-outline-danger .card-footer {\n background-color: transparent;\n border-color: #d9534f;\n}\n\n.card-inverse {\n color: rgba(255, 255, 255, 0.65);\n}\n\n.card-inverse .card-header,\n.card-inverse .card-footer {\n background-color: transparent;\n border-color: rgba(255, 255, 255, 0.2);\n}\n\n.card-inverse .card-header,\n.card-inverse .card-footer,\n.card-inverse .card-title,\n.card-inverse .card-blockquote {\n color: #fff;\n}\n\n.card-inverse .card-link,\n.card-inverse .card-text,\n.card-inverse .card-subtitle,\n.card-inverse .card-blockquote .blockquote-footer {\n color: rgba(255, 255, 255, 0.65);\n}\n\n.card-inverse .card-link:focus, .card-inverse .card-link:hover {\n color: #fff;\n}\n\n.card-blockquote {\n padding: 0;\n margin-bottom: 0;\n border-left: 0;\n}\n\n.card-img-overlay {\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n padding: 1.25rem;\n}\n\n.card-img {\n width: 100%;\n border-radius: calc(0.25rem - 1px);\n}\n\n.card-img-top {\n width: 100%;\n border-top-left-radius: calc(0.25rem - 1px);\n border-top-right-radius: calc(0.25rem - 1px);\n}\n\n.card-img-bottom {\n width: 100%;\n border-bottom-right-radius: calc(0.25rem - 1px);\n border-bottom-left-radius: calc(0.25rem - 1px);\n}\n\n@media (min-width: 576px) {\n .card-deck {\n display: flex;\n flex-flow: row wrap;\n margin-right: -15px;\n margin-left: -15px;\n }\n .card-deck .card {\n display: flex;\n flex: 1 0 0;\n flex-direction: column;\n margin-right: 15px;\n margin-left: 15px;\n }\n}\n\n@media (min-width: 576px) {\n .card-group {\n display: flex;\n flex-flow: row wrap;\n }\n .card-group .card {\n flex: 1 0 0;\n }\n .card-group .card + .card {\n margin-left: 0;\n border-left: 0;\n }\n .card-group .card:first-child {\n border-top-right-radius: 0;\n border-bottom-right-radius: 0;\n }\n .card-group .card:first-child .card-img-top {\n border-top-right-radius: 0;\n }\n .card-group .card:first-child .card-img-bottom {\n border-bottom-right-radius: 0;\n }\n .card-group .card:last-child {\n border-top-left-radius: 0;\n border-bottom-left-radius: 0;\n }\n .card-group .card:last-child .card-img-top {\n border-top-left-radius: 0;\n }\n .card-group .card:last-child .card-img-bottom {\n border-bottom-left-radius: 0;\n }\n .card-group .card:not(:first-child):not(:last-child) {\n border-radius: 0;\n }\n .card-group .card:not(:first-child):not(:last-child) .card-img-top,\n .card-group .card:not(:first-child):not(:last-child) .card-img-bottom {\n border-radius: 0;\n }\n}\n\n.card-columns .card {\n margin-bottom: 0.75rem;\n}\n\n@media (min-width: 576px) {\n .card-columns {\n column-count: 3;\n column-gap: 1.25rem;\n }\n .card-columns .card {\n display: inline-block;\n width: 100%;\n }\n}\n\n.breadcrumb {\n padding: 0.75rem 1rem;\n margin-bottom: 1rem;\n list-style: none;\n background-color: #eceeef;\n border-radius: 0.25rem;\n}\n\n.breadcrumb::after {\n display: block;\n clear: both;\n content: \"\";\n}\n\n.breadcrumb-item {\n float: left;\n}\n\n.breadcrumb-item + .breadcrumb-item::before {\n display: inline-block;\n padding-right: 0.5rem;\n padding-left: 0.5rem;\n color: #636c72;\n content: \"/\";\n}\n\n.breadcrumb-item + .breadcrumb-item:hover::before {\n text-decoration: underline;\n}\n\n.breadcrumb-item + .breadcrumb-item:hover::before {\n text-decoration: none;\n}\n\n.breadcrumb-item.active {\n color: #636c72;\n}\n\n.pagination {\n display: flex;\n padding-left: 0;\n list-style: none;\n border-radius: 0.25rem;\n}\n\n.page-item:first-child .page-link {\n margin-left: 0;\n border-top-left-radius: 0.25rem;\n border-bottom-left-radius: 0.25rem;\n}\n\n.page-item:last-child .page-link {\n border-top-right-radius: 0.25rem;\n border-bottom-right-radius: 0.25rem;\n}\n\n.page-item.active .page-link {\n z-index: 2;\n color: #fff;\n background-color: #0275d8;\n border-color: #0275d8;\n}\n\n.page-item.disabled .page-link {\n color: #636c72;\n pointer-events: none;\n background-color: #fff;\n border-color: #ddd;\n}\n\n.page-link {\n position: relative;\n display: block;\n padding: 0.5rem 0.75rem;\n margin-left: -1px;\n line-height: 1.25;\n color: #0275d8;\n background-color: #fff;\n border: 1px solid #ddd;\n}\n\n.page-link:focus, .page-link:hover {\n color: #014c8c;\n text-decoration: none;\n background-color: #eceeef;\n border-color: #ddd;\n}\n\n.pagination-lg .page-link {\n padding: 0.75rem 1.5rem;\n font-size: 1.25rem;\n}\n\n.pagination-lg .page-item:first-child .page-link {\n border-top-left-radius: 0.3rem;\n border-bottom-left-radius: 0.3rem;\n}\n\n.pagination-lg .page-item:last-child .page-link {\n border-top-right-radius: 0.3rem;\n border-bottom-right-radius: 0.3rem;\n}\n\n.pagination-sm .page-link {\n padding: 0.25rem 0.5rem;\n font-size: 0.875rem;\n}\n\n.pagination-sm .page-item:first-child .page-link {\n border-top-left-radius: 0.2rem;\n border-bottom-left-radius: 0.2rem;\n}\n\n.pagination-sm .page-item:last-child .page-link {\n border-top-right-radius: 0.2rem;\n border-bottom-right-radius: 0.2rem;\n}\n\n.badge {\n display: inline-block;\n padding: 0.25em 0.4em;\n font-size: 75%;\n font-weight: bold;\n line-height: 1;\n color: #fff;\n text-align: center;\n white-space: nowrap;\n vertical-align: baseline;\n border-radius: 0.25rem;\n}\n\n.badge:empty {\n display: none;\n}\n\n.btn .badge {\n position: relative;\n top: -1px;\n}\n\na.badge:focus, a.badge:hover {\n color: #fff;\n text-decoration: none;\n}\n\n.badge-pill {\n padding-right: 0.6em;\n padding-left: 0.6em;\n border-radius: 10rem;\n}\n\n.badge-default {\n background-color: #636c72;\n}\n\n.badge-default[href]:focus, .badge-default[href]:hover {\n background-color: #4b5257;\n}\n\n.badge-primary {\n background-color: #0275d8;\n}\n\n.badge-primary[href]:focus, .badge-primary[href]:hover {\n background-color: #025aa5;\n}\n\n.badge-success {\n background-color: #5cb85c;\n}\n\n.badge-success[href]:focus, .badge-success[href]:hover {\n background-color: #449d44;\n}\n\n.badge-info {\n background-color: #5bc0de;\n}\n\n.badge-info[href]:focus, .badge-info[href]:hover {\n background-color: #31b0d5;\n}\n\n.badge-warning {\n background-color: #f0ad4e;\n}\n\n.badge-warning[href]:focus, .badge-warning[href]:hover {\n background-color: #ec971f;\n}\n\n.badge-danger {\n background-color: #d9534f;\n}\n\n.badge-danger[href]:focus, .badge-danger[href]:hover {\n background-color: #c9302c;\n}\n\n.jumbotron {\n padding: 2rem 1rem;\n margin-bottom: 2rem;\n background-color: #eceeef;\n border-radius: 0.3rem;\n}\n\n@media (min-width: 576px) {\n .jumbotron {\n padding: 4rem 2rem;\n }\n}\n\n.jumbotron-fluid {\n padding-right: 0;\n padding-left: 0;\n border-radius: 0;\n}\n\n.alert {\n padding: 0.75rem 1.25rem;\n margin-bottom: 1rem;\n border: 1px solid transparent;\n border-radius: 0.25rem;\n}\n\n.alert-heading {\n color: inherit;\n}\n\n.alert-link {\n font-weight: bold;\n}\n\n.alert-dismissible .close {\n position: relative;\n top: -0.75rem;\n right: -1.25rem;\n padding: 0.75rem 1.25rem;\n color: inherit;\n}\n\n.alert-success {\n color: #3c763d;\n background-color: #dff0d8;\n border-color: #d0e9c6;\n}\n\n.alert-success hr {\n border-top-color: #c1e2b3;\n}\n\n.alert-success .alert-link {\n color: #2b542c;\n}\n\n.alert-info {\n color: #31708f;\n background-color: #d9edf7;\n border-color: #bcdff1;\n}\n\n.alert-info hr {\n border-top-color: #a6d5ec;\n}\n\n.alert-info .alert-link {\n color: #245269;\n}\n\n.alert-warning {\n color: #8a6d3b;\n background-color: #fcf8e3;\n border-color: #faf2cc;\n}\n\n.alert-warning hr {\n border-top-color: #f7ecb5;\n}\n\n.alert-warning .alert-link {\n color: #66512c;\n}\n\n.alert-danger {\n color: #a94442;\n background-color: #f2dede;\n border-color: #ebcccc;\n}\n\n.alert-danger hr {\n border-top-color: #e4b9b9;\n}\n\n.alert-danger .alert-link {\n color: #843534;\n}\n\n@keyframes progress-bar-stripes {\n from {\n background-position: 1rem 0;\n }\n to {\n background-position: 0 0;\n }\n}\n\n.progress {\n display: flex;\n overflow: hidden;\n font-size: 0.75rem;\n line-height: 1rem;\n text-align: center;\n background-color: #eceeef;\n border-radius: 0.25rem;\n}\n\n.progress-bar {\n height: 1rem;\n line-height: 1rem;\n color: #fff;\n background-color: #0275d8;\n transition: width 0.6s ease;\n}\n\n.progress-bar-striped {\n 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);\n background-size: 1rem 1rem;\n}\n\n.progress-bar-animated {\n animation: progress-bar-stripes 1s linear infinite;\n}\n\n.media {\n display: flex;\n align-items: flex-start;\n}\n\n.media-body {\n flex: 1;\n}\n\n.list-group {\n display: flex;\n flex-direction: column;\n padding-left: 0;\n margin-bottom: 0;\n}\n\n.list-group-item-action {\n width: 100%;\n color: #464a4c;\n text-align: inherit;\n}\n\n.list-group-item-action:focus, .list-group-item-action:hover {\n color: #464a4c;\n text-decoration: none;\n background-color: #f7f7f9;\n}\n\n.list-group-item-action:active {\n color: #292b2c;\n background-color: #eceeef;\n}\n\n.list-group-item {\n position: relative;\n display: block;\n padding: 0.75rem 1.25rem;\n margin-bottom: -1px;\n background-color: #fff;\n border: 1px solid rgba(0, 0, 0, 0.125);\n}\n\n.list-group-item:first-child {\n border-top-left-radius: 0.25rem;\n border-top-right-radius: 0.25rem;\n}\n\n.list-group-item:last-child {\n margin-bottom: 0;\n border-bottom-right-radius: 0.25rem;\n border-bottom-left-radius: 0.25rem;\n}\n\n.list-group-item:focus, .list-group-item:hover {\n text-decoration: none;\n}\n\n.list-group-item.disabled, .list-group-item:disabled {\n color: #636c72;\n background-color: #fff;\n}\n\n.list-group-item.active {\n z-index: 2;\n color: #fff;\n background-color: #0275d8;\n border-color: #0275d8;\n}\n\n.list-group-flush .list-group-item {\n border-right: 0;\n border-left: 0;\n border-radius: 0;\n}\n\n.list-group-flush:first-child .list-group-item:first-child {\n border-top: 0;\n}\n\n.list-group-flush:last-child .list-group-item:last-child {\n border-bottom: 0;\n}\n\n.list-group-item-success {\n color: #3c763d;\n background-color: #dff0d8;\n}\n\na.list-group-item-success,\nbutton.list-group-item-success {\n color: #3c763d;\n}\n\na.list-group-item-success:focus, a.list-group-item-success:hover,\nbutton.list-group-item-success:focus,\nbutton.list-group-item-success:hover {\n color: #3c763d;\n background-color: #d0e9c6;\n}\n\na.list-group-item-success.active,\nbutton.list-group-item-success.active {\n color: #fff;\n background-color: #3c763d;\n border-color: #3c763d;\n}\n\n.list-group-item-info {\n color: #31708f;\n background-color: #d9edf7;\n}\n\na.list-group-item-info,\nbutton.list-group-item-info {\n color: #31708f;\n}\n\na.list-group-item-info:focus, a.list-group-item-info:hover,\nbutton.list-group-item-info:focus,\nbutton.list-group-item-info:hover {\n color: #31708f;\n background-color: #c4e3f3;\n}\n\na.list-group-item-info.active,\nbutton.list-group-item-info.active {\n color: #fff;\n background-color: #31708f;\n border-color: #31708f;\n}\n\n.list-group-item-warning {\n color: #8a6d3b;\n background-color: #fcf8e3;\n}\n\na.list-group-item-warning,\nbutton.list-group-item-warning {\n color: #8a6d3b;\n}\n\na.list-group-item-warning:focus, a.list-group-item-warning:hover,\nbutton.list-group-item-warning:focus,\nbutton.list-group-item-warning:hover {\n color: #8a6d3b;\n background-color: #faf2cc;\n}\n\na.list-group-item-warning.active,\nbutton.list-group-item-warning.active {\n color: #fff;\n background-color: #8a6d3b;\n border-color: #8a6d3b;\n}\n\n.list-group-item-danger {\n color: #a94442;\n background-color: #f2dede;\n}\n\na.list-group-item-danger,\nbutton.list-group-item-danger {\n color: #a94442;\n}\n\na.list-group-item-danger:focus, a.list-group-item-danger:hover,\nbutton.list-group-item-danger:focus,\nbutton.list-group-item-danger:hover {\n color: #a94442;\n background-color: #ebcccc;\n}\n\na.list-group-item-danger.active,\nbutton.list-group-item-danger.active {\n color: #fff;\n background-color: #a94442;\n border-color: #a94442;\n}\n\n.embed-responsive {\n position: relative;\n display: block;\n width: 100%;\n padding: 0;\n overflow: hidden;\n}\n\n.embed-responsive::before {\n display: block;\n content: \"\";\n}\n\n.embed-responsive .embed-responsive-item,\n.embed-responsive iframe,\n.embed-responsive embed,\n.embed-responsive object,\n.embed-responsive video {\n position: absolute;\n top: 0;\n bottom: 0;\n left: 0;\n width: 100%;\n height: 100%;\n border: 0;\n}\n\n.embed-responsive-21by9::before {\n padding-top: 42.857143%;\n}\n\n.embed-responsive-16by9::before {\n padding-top: 56.25%;\n}\n\n.embed-responsive-4by3::before {\n padding-top: 75%;\n}\n\n.embed-responsive-1by1::before {\n padding-top: 100%;\n}\n\n.close {\n float: right;\n font-size: 1.5rem;\n font-weight: bold;\n line-height: 1;\n color: #000;\n text-shadow: 0 1px 0 #fff;\n opacity: .5;\n}\n\n.close:focus, .close:hover {\n color: #000;\n text-decoration: none;\n opacity: .75;\n}\n\nbutton.close {\n padding: 0;\n background: transparent;\n border: 0;\n -webkit-appearance: none;\n}\n\n.modal-open {\n overflow: hidden;\n}\n\n.modal {\n position: fixed;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: 1050;\n display: none;\n overflow: hidden;\n outline: 0;\n}\n\n.modal.fade .modal-dialog {\n transition: transform 0.3s ease-out;\n transform: translate(0, -25%);\n}\n\n.modal.show .modal-dialog {\n transform: translate(0, 0);\n}\n\n.modal-open .modal {\n overflow-x: hidden;\n overflow-y: auto;\n}\n\n.modal-dialog {\n position: relative;\n width: auto;\n margin: 10px;\n}\n\n.modal-content {\n position: relative;\n display: flex;\n flex-direction: column;\n background-color: #fff;\n background-clip: padding-box;\n border: 1px solid rgba(0, 0, 0, 0.2);\n border-radius: 0.3rem;\n outline: 0;\n}\n\n.modal-backdrop {\n position: fixed;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: 1040;\n background-color: #000;\n}\n\n.modal-backdrop.fade {\n opacity: 0;\n}\n\n.modal-backdrop.show {\n opacity: 0.5;\n}\n\n.modal-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 15px;\n border-bottom: 1px solid #eceeef;\n}\n\n.modal-title {\n margin-bottom: 0;\n line-height: 1.5;\n}\n\n.modal-body {\n position: relative;\n flex: 1 1 auto;\n padding: 15px;\n}\n\n.modal-footer {\n display: flex;\n align-items: center;\n justify-content: flex-end;\n padding: 15px;\n border-top: 1px solid #eceeef;\n}\n\n.modal-footer > :not(:first-child) {\n margin-left: .25rem;\n}\n\n.modal-footer > :not(:last-child) {\n margin-right: .25rem;\n}\n\n.modal-scrollbar-measure {\n position: absolute;\n top: -9999px;\n width: 50px;\n height: 50px;\n overflow: scroll;\n}\n\n@media (min-width: 576px) {\n .modal-dialog {\n max-width: 500px;\n margin: 30px auto;\n }\n .modal-sm {\n max-width: 300px;\n }\n}\n\n@media (min-width: 992px) {\n .modal-lg {\n max-width: 800px;\n }\n}\n\n.tooltip {\n position: absolute;\n z-index: 1070;\n display: block;\n font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, \"Helvetica Neue\", Arial, sans-serif;\n font-style: normal;\n font-weight: normal;\n line-height: 1.5;\n text-align: left;\n text-align: start;\n text-decoration: none;\n text-shadow: none;\n text-transform: none;\n letter-spacing: normal;\n word-break: normal;\n word-spacing: normal;\n white-space: normal;\n line-break: auto;\n font-size: 0.875rem;\n word-wrap: break-word;\n opacity: 0;\n}\n\n.tooltip.show {\n opacity: 0.9;\n}\n\n.tooltip.tooltip-top, .tooltip.bs-tether-element-attached-bottom {\n padding: 5px 0;\n margin-top: -3px;\n}\n\n.tooltip.tooltip-top .tooltip-inner::before, .tooltip.bs-tether-element-attached-bottom .tooltip-inner::before {\n bottom: 0;\n left: 50%;\n margin-left: -5px;\n content: \"\";\n border-width: 5px 5px 0;\n border-top-color: #000;\n}\n\n.tooltip.tooltip-right, .tooltip.bs-tether-element-attached-left {\n padding: 0 5px;\n margin-left: 3px;\n}\n\n.tooltip.tooltip-right .tooltip-inner::before, .tooltip.bs-tether-element-attached-left .tooltip-inner::before {\n top: 50%;\n left: 0;\n margin-top: -5px;\n content: \"\";\n border-width: 5px 5px 5px 0;\n border-right-color: #000;\n}\n\n.tooltip.tooltip-bottom, .tooltip.bs-tether-element-attached-top {\n padding: 5px 0;\n margin-top: 3px;\n}\n\n.tooltip.tooltip-bottom .tooltip-inner::before, .tooltip.bs-tether-element-attached-top .tooltip-inner::before {\n top: 0;\n left: 50%;\n margin-left: -5px;\n content: \"\";\n border-width: 0 5px 5px;\n border-bottom-color: #000;\n}\n\n.tooltip.tooltip-left, .tooltip.bs-tether-element-attached-right {\n padding: 0 5px;\n margin-left: -3px;\n}\n\n.tooltip.tooltip-left .tooltip-inner::before, .tooltip.bs-tether-element-attached-right .tooltip-inner::before {\n top: 50%;\n right: 0;\n margin-top: -5px;\n content: \"\";\n border-width: 5px 0 5px 5px;\n border-left-color: #000;\n}\n\n.tooltip-inner {\n max-width: 200px;\n padding: 3px 8px;\n color: #fff;\n text-align: center;\n background-color: #000;\n border-radius: 0.25rem;\n}\n\n.tooltip-inner::before {\n position: absolute;\n width: 0;\n height: 0;\n border-color: transparent;\n border-style: solid;\n}\n\n.popover {\n position: absolute;\n top: 0;\n left: 0;\n z-index: 1060;\n display: block;\n max-width: 276px;\n padding: 1px;\n font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, \"Helvetica Neue\", Arial, sans-serif;\n font-style: normal;\n font-weight: normal;\n line-height: 1.5;\n text-align: left;\n text-align: start;\n text-decoration: none;\n text-shadow: none;\n text-transform: none;\n letter-spacing: normal;\n word-break: normal;\n word-spacing: normal;\n white-space: normal;\n line-break: auto;\n font-size: 0.875rem;\n word-wrap: break-word;\n background-color: #fff;\n background-clip: padding-box;\n border: 1px solid rgba(0, 0, 0, 0.2);\n border-radius: 0.3rem;\n}\n\n.popover.popover-top, .popover.bs-tether-element-attached-bottom {\n margin-top: -10px;\n}\n\n.popover.popover-top::before, .popover.popover-top::after, .popover.bs-tether-element-attached-bottom::before, .popover.bs-tether-element-attached-bottom::after {\n left: 50%;\n border-bottom-width: 0;\n}\n\n.popover.popover-top::before, .popover.bs-tether-element-attached-bottom::before {\n bottom: -11px;\n margin-left: -11px;\n border-top-color: rgba(0, 0, 0, 0.25);\n}\n\n.popover.popover-top::after, .popover.bs-tether-element-attached-bottom::after {\n bottom: -10px;\n margin-left: -10px;\n border-top-color: #fff;\n}\n\n.popover.popover-right, .popover.bs-tether-element-attached-left {\n margin-left: 10px;\n}\n\n.popover.popover-right::before, .popover.popover-right::after, .popover.bs-tether-element-attached-left::before, .popover.bs-tether-element-attached-left::after {\n top: 50%;\n border-left-width: 0;\n}\n\n.popover.popover-right::before, .popover.bs-tether-element-attached-left::before {\n left: -11px;\n margin-top: -11px;\n border-right-color: rgba(0, 0, 0, 0.25);\n}\n\n.popover.popover-right::after, .popover.bs-tether-element-attached-left::after {\n left: -10px;\n margin-top: -10px;\n border-right-color: #fff;\n}\n\n.popover.popover-bottom, .popover.bs-tether-element-attached-top {\n margin-top: 10px;\n}\n\n.popover.popover-bottom::before, .popover.popover-bottom::after, .popover.bs-tether-element-attached-top::before, .popover.bs-tether-element-attached-top::after {\n left: 50%;\n border-top-width: 0;\n}\n\n.popover.popover-bottom::before, .popover.bs-tether-element-attached-top::before {\n top: -11px;\n margin-left: -11px;\n border-bottom-color: rgba(0, 0, 0, 0.25);\n}\n\n.popover.popover-bottom::after, .popover.bs-tether-element-attached-top::after {\n top: -10px;\n margin-left: -10px;\n border-bottom-color: #fff;\n}\n\n.popover.popover-bottom .popover-title::before, .popover.bs-tether-element-attached-top .popover-title::before {\n position: absolute;\n top: 0;\n left: 50%;\n display: block;\n width: 20px;\n margin-left: -10px;\n content: \"\";\n border-bottom: 1px solid #f7f7f7;\n}\n\n.popover.popover-left, .popover.bs-tether-element-attached-right {\n margin-left: -10px;\n}\n\n.popover.popover-left::before, .popover.popover-left::after, .popover.bs-tether-element-attached-right::before, .popover.bs-tether-element-attached-right::after {\n top: 50%;\n border-right-width: 0;\n}\n\n.popover.popover-left::before, .popover.bs-tether-element-attached-right::before {\n right: -11px;\n margin-top: -11px;\n border-left-color: rgba(0, 0, 0, 0.25);\n}\n\n.popover.popover-left::after, .popover.bs-tether-element-attached-right::after {\n right: -10px;\n margin-top: -10px;\n border-left-color: #fff;\n}\n\n.popover-title {\n padding: 8px 14px;\n margin-bottom: 0;\n font-size: 1rem;\n color: inherit;\n background-color: #f7f7f7;\n border-bottom: 1px solid #ebebeb;\n border-top-left-radius: calc(0.3rem - 1px);\n border-top-right-radius: calc(0.3rem - 1px);\n}\n\n.popover-title:empty {\n display: none;\n}\n\n.popover-content {\n padding: 9px 14px;\n color: #292b2c;\n}\n\n.popover::before,\n.popover::after {\n position: absolute;\n display: block;\n width: 0;\n height: 0;\n border-color: transparent;\n border-style: solid;\n}\n\n.popover::before {\n content: \"\";\n border-width: 11px;\n}\n\n.popover::after {\n content: \"\";\n border-width: 10px;\n}\n\n.carousel {\n position: relative;\n}\n\n.carousel-inner {\n position: relative;\n width: 100%;\n overflow: hidden;\n}\n\n.carousel-item {\n position: relative;\n display: none;\n align-items: center;\n width: 100%;\n transition: transform 0.6s ease;\n backface-visibility: hidden;\n perspective: 1000px;\n}\n\n.carousel-item.active,\n.carousel-item-next,\n.carousel-item-prev {\n display: flex;\n}\n\n.carousel-item-next,\n.carousel-item-prev {\n position: absolute;\n top: 0;\n}\n\n.carousel-item-next.carousel-item-left,\n.carousel-item-prev.carousel-item-right {\n transform: translate3d(0, 0, 0);\n}\n\n.carousel-item-next,\n.active.carousel-item-right {\n transform: translate3d(100%, 0, 0);\n}\n\n.carousel-item-prev,\n.active.carousel-item-left {\n transform: translate3d(-100%, 0, 0);\n}\n\n.carousel-control-prev,\n.carousel-control-next {\n position: absolute;\n top: 0;\n bottom: 0;\n display: flex;\n align-items: center;\n justify-content: center;\n width: 15%;\n color: #fff;\n text-align: center;\n opacity: 0.5;\n}\n\n.carousel-control-prev:focus, .carousel-control-prev:hover,\n.carousel-control-next:focus,\n.carousel-control-next:hover {\n color: #fff;\n text-decoration: none;\n outline: 0;\n opacity: .9;\n}\n\n.carousel-control-prev {\n left: 0;\n}\n\n.carousel-control-next {\n right: 0;\n}\n\n.carousel-control-prev-icon,\n.carousel-control-next-icon {\n display: inline-block;\n width: 20px;\n height: 20px;\n background: transparent no-repeat center center;\n background-size: 100% 100%;\n}\n\n.carousel-control-prev-icon {\n background-image: url(\"data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' viewBox='0 0 8 8'%3E%3Cpath d='M4 0l-4 4 4 4 1.5-1.5-2.5-2.5 2.5-2.5-1.5-1.5z'/%3E%3C/svg%3E\");\n}\n\n.carousel-control-next-icon {\n background-image: url(\"data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' viewBox='0 0 8 8'%3E%3Cpath d='M1.5 0l-1.5 1.5 2.5 2.5-2.5 2.5 1.5 1.5 4-4-4-4z'/%3E%3C/svg%3E\");\n}\n\n.carousel-indicators {\n position: absolute;\n right: 0;\n bottom: 10px;\n left: 0;\n z-index: 15;\n display: flex;\n justify-content: center;\n padding-left: 0;\n margin-right: 15%;\n margin-left: 15%;\n list-style: none;\n}\n\n.carousel-indicators li {\n position: relative;\n flex: 1 0 auto;\n max-width: 30px;\n height: 3px;\n margin-right: 3px;\n margin-left: 3px;\n text-indent: -999px;\n background-color: rgba(255, 255, 255, 0.5);\n}\n\n.carousel-indicators li::before {\n position: absolute;\n top: -10px;\n left: 0;\n display: inline-block;\n width: 100%;\n height: 10px;\n content: \"\";\n}\n\n.carousel-indicators li::after {\n position: absolute;\n bottom: -10px;\n left: 0;\n display: inline-block;\n width: 100%;\n height: 10px;\n content: \"\";\n}\n\n.carousel-indicators .active {\n background-color: #fff;\n}\n\n.carousel-caption {\n position: absolute;\n right: 15%;\n bottom: 20px;\n left: 15%;\n z-index: 10;\n padding-top: 20px;\n padding-bottom: 20px;\n color: #fff;\n text-align: center;\n}\n\n.align-baseline {\n vertical-align: baseline !important;\n}\n\n.align-top {\n vertical-align: top !important;\n}\n\n.align-middle {\n vertical-align: middle !important;\n}\n\n.align-bottom {\n vertical-align: bottom !important;\n}\n\n.align-text-bottom {\n vertical-align: text-bottom !important;\n}\n\n.align-text-top {\n vertical-align: text-top !important;\n}\n\n.bg-faded {\n background-color: #f7f7f7;\n}\n\n.bg-primary {\n background-color: #0275d8 !important;\n}\n\na.bg-primary:focus, a.bg-primary:hover {\n background-color: #025aa5 !important;\n}\n\n.bg-success {\n background-color: #5cb85c !important;\n}\n\na.bg-success:focus, a.bg-success:hover {\n background-color: #449d44 !important;\n}\n\n.bg-info {\n background-color: #5bc0de !important;\n}\n\na.bg-info:focus, a.bg-info:hover {\n background-color: #31b0d5 !important;\n}\n\n.bg-warning {\n background-color: #f0ad4e !important;\n}\n\na.bg-warning:focus, a.bg-warning:hover {\n background-color: #ec971f !important;\n}\n\n.bg-danger {\n background-color: #d9534f !important;\n}\n\na.bg-danger:focus, a.bg-danger:hover {\n background-color: #c9302c !important;\n}\n\n.bg-inverse {\n background-color: #292b2c !important;\n}\n\na.bg-inverse:focus, a.bg-inverse:hover {\n background-color: #101112 !important;\n}\n\n.border-0 {\n border: 0 !important;\n}\n\n.border-top-0 {\n border-top: 0 !important;\n}\n\n.border-right-0 {\n border-right: 0 !important;\n}\n\n.border-bottom-0 {\n border-bottom: 0 !important;\n}\n\n.border-left-0 {\n border-left: 0 !important;\n}\n\n.rounded {\n border-radius: 0.25rem;\n}\n\n.rounded-top {\n border-top-left-radius: 0.25rem;\n border-top-right-radius: 0.25rem;\n}\n\n.rounded-right {\n border-top-right-radius: 0.25rem;\n border-bottom-right-radius: 0.25rem;\n}\n\n.rounded-bottom {\n border-bottom-right-radius: 0.25rem;\n border-bottom-left-radius: 0.25rem;\n}\n\n.rounded-left {\n border-top-left-radius: 0.25rem;\n border-bottom-left-radius: 0.25rem;\n}\n\n.rounded-circle {\n border-radius: 50%;\n}\n\n.rounded-0 {\n border-radius: 0;\n}\n\n.clearfix::after {\n display: block;\n clear: both;\n content: \"\";\n}\n\n.d-none {\n display: none !important;\n}\n\n.d-inline {\n display: inline !important;\n}\n\n.d-inline-block {\n display: inline-block !important;\n}\n\n.d-block {\n display: block !important;\n}\n\n.d-table {\n display: table !important;\n}\n\n.d-table-cell {\n display: table-cell !important;\n}\n\n.d-flex {\n display: flex !important;\n}\n\n.d-inline-flex {\n display: inline-flex !important;\n}\n\n@media (min-width: 576px) {\n .d-sm-none {\n display: none !important;\n }\n .d-sm-inline {\n display: inline !important;\n }\n .d-sm-inline-block {\n display: inline-block !important;\n }\n .d-sm-block {\n display: block !important;\n }\n .d-sm-table {\n display: table !important;\n }\n .d-sm-table-cell {\n display: table-cell !important;\n }\n .d-sm-flex {\n display: flex !important;\n }\n .d-sm-inline-flex {\n display: inline-flex !important;\n }\n}\n\n@media (min-width: 768px) {\n .d-md-none {\n display: none !important;\n }\n .d-md-inline {\n display: inline !important;\n }\n .d-md-inline-block {\n display: inline-block !important;\n }\n .d-md-block {\n display: block !important;\n }\n .d-md-table {\n display: table !important;\n }\n .d-md-table-cell {\n display: table-cell !important;\n }\n .d-md-flex {\n display: flex !important;\n }\n .d-md-inline-flex {\n display: inline-flex !important;\n }\n}\n\n@media (min-width: 992px) {\n .d-lg-none {\n display: none !important;\n }\n .d-lg-inline {\n display: inline !important;\n }\n .d-lg-inline-block {\n display: inline-block !important;\n }\n .d-lg-block {\n display: block !important;\n }\n .d-lg-table {\n display: table !important;\n }\n .d-lg-table-cell {\n display: table-cell !important;\n }\n .d-lg-flex {\n display: flex !important;\n }\n .d-lg-inline-flex {\n display: inline-flex !important;\n }\n}\n\n@media (min-width: 1200px) {\n .d-xl-none {\n display: none !important;\n }\n .d-xl-inline {\n display: inline !important;\n }\n .d-xl-inline-block {\n display: inline-block !important;\n }\n .d-xl-block {\n display: block !important;\n }\n .d-xl-table {\n display: table !important;\n }\n .d-xl-table-cell {\n display: table-cell !important;\n }\n .d-xl-flex {\n display: flex !important;\n }\n .d-xl-inline-flex {\n display: inline-flex !important;\n }\n}\n\n.d-print-block {\n display: none !important;\n}\n\n@media print {\n .d-print-block {\n display: block !important;\n }\n}\n\n.d-print-inline {\n display: none !important;\n}\n\n@media print {\n .d-print-inline {\n display: inline !important;\n }\n}\n\n.d-print-inline-block {\n display: none !important;\n}\n\n@media print {\n .d-print-inline-block {\n display: inline-block !important;\n }\n}\n\n@media print {\n .d-print-none {\n display: none !important;\n }\n}\n\n.order-first {\n order: -1;\n}\n\n.order-last {\n order: 1;\n}\n\n.order-0 {\n order: 0;\n}\n\n.flex-row {\n flex-direction: row !important;\n}\n\n.flex-column {\n flex-direction: column !important;\n}\n\n.flex-row-reverse {\n flex-direction: row-reverse !important;\n}\n\n.flex-column-reverse {\n flex-direction: column-reverse !important;\n}\n\n.flex-wrap {\n flex-wrap: wrap !important;\n}\n\n.flex-nowrap {\n flex-wrap: nowrap !important;\n}\n\n.flex-wrap-reverse {\n flex-wrap: wrap-reverse !important;\n}\n\n.justify-content-start {\n justify-content: flex-start !important;\n}\n\n.justify-content-end {\n justify-content: flex-end !important;\n}\n\n.justify-content-center {\n justify-content: center !important;\n}\n\n.justify-content-between {\n justify-content: space-between !important;\n}\n\n.justify-content-around {\n justify-content: space-around !important;\n}\n\n.align-items-start {\n align-items: flex-start !important;\n}\n\n.align-items-end {\n align-items: flex-end !important;\n}\n\n.align-items-center {\n align-items: center !important;\n}\n\n.align-items-baseline {\n align-items: baseline !important;\n}\n\n.align-items-stretch {\n align-items: stretch !important;\n}\n\n.align-content-start {\n align-content: flex-start !important;\n}\n\n.align-content-end {\n align-content: flex-end !important;\n}\n\n.align-content-center {\n align-content: center !important;\n}\n\n.align-content-between {\n align-content: space-between !important;\n}\n\n.align-content-around {\n align-content: space-around !important;\n}\n\n.align-content-stretch {\n align-content: stretch !important;\n}\n\n.align-self-auto {\n align-self: auto !important;\n}\n\n.align-self-start {\n align-self: flex-start !important;\n}\n\n.align-self-end {\n align-self: flex-end !important;\n}\n\n.align-self-center {\n align-self: center !important;\n}\n\n.align-self-baseline {\n align-self: baseline !important;\n}\n\n.align-self-stretch {\n align-self: stretch !important;\n}\n\n@media (min-width: 576px) {\n .order-sm-first {\n order: -1;\n }\n .order-sm-last {\n order: 1;\n }\n .order-sm-0 {\n order: 0;\n }\n .flex-sm-row {\n flex-direction: row !important;\n }\n .flex-sm-column {\n flex-direction: column !important;\n }\n .flex-sm-row-reverse {\n flex-direction: row-reverse !important;\n }\n .flex-sm-column-reverse {\n flex-direction: column-reverse !important;\n }\n .flex-sm-wrap {\n flex-wrap: wrap !important;\n }\n .flex-sm-nowrap {\n flex-wrap: nowrap !important;\n }\n .flex-sm-wrap-reverse {\n flex-wrap: wrap-reverse !important;\n }\n .justify-content-sm-start {\n justify-content: flex-start !important;\n }\n .justify-content-sm-end {\n justify-content: flex-end !important;\n }\n .justify-content-sm-center {\n justify-content: center !important;\n }\n .justify-content-sm-between {\n justify-content: space-between !important;\n }\n .justify-content-sm-around {\n justify-content: space-around !important;\n }\n .align-items-sm-start {\n align-items: flex-start !important;\n }\n .align-items-sm-end {\n align-items: flex-end !important;\n }\n .align-items-sm-center {\n align-items: center !important;\n }\n .align-items-sm-baseline {\n align-items: baseline !important;\n }\n .align-items-sm-stretch {\n align-items: stretch !important;\n }\n .align-content-sm-start {\n align-content: flex-start !important;\n }\n .align-content-sm-end {\n align-content: flex-end !important;\n }\n .align-content-sm-center {\n align-content: center !important;\n }\n .align-content-sm-between {\n align-content: space-between !important;\n }\n .align-content-sm-around {\n align-content: space-around !important;\n }\n .align-content-sm-stretch {\n align-content: stretch !important;\n }\n .align-self-sm-auto {\n align-self: auto !important;\n }\n .align-self-sm-start {\n align-self: flex-start !important;\n }\n .align-self-sm-end {\n align-self: flex-end !important;\n }\n .align-self-sm-center {\n align-self: center !important;\n }\n .align-self-sm-baseline {\n align-self: baseline !important;\n }\n .align-self-sm-stretch {\n align-self: stretch !important;\n }\n}\n\n@media (min-width: 768px) {\n .order-md-first {\n order: -1;\n }\n .order-md-last {\n order: 1;\n }\n .order-md-0 {\n order: 0;\n }\n .flex-md-row {\n flex-direction: row !important;\n }\n .flex-md-column {\n flex-direction: column !important;\n }\n .flex-md-row-reverse {\n flex-direction: row-reverse !important;\n }\n .flex-md-column-reverse {\n flex-direction: column-reverse !important;\n }\n .flex-md-wrap {\n flex-wrap: wrap !important;\n }\n .flex-md-nowrap {\n flex-wrap: nowrap !important;\n }\n .flex-md-wrap-reverse {\n flex-wrap: wrap-reverse !important;\n }\n .justify-content-md-start {\n justify-content: flex-start !important;\n }\n .justify-content-md-end {\n justify-content: flex-end !important;\n }\n .justify-content-md-center {\n justify-content: center !important;\n }\n .justify-content-md-between {\n justify-content: space-between !important;\n }\n .justify-content-md-around {\n justify-content: space-around !important;\n }\n .align-items-md-start {\n align-items: flex-start !important;\n }\n .align-items-md-end {\n align-items: flex-end !important;\n }\n .align-items-md-center {\n align-items: center !important;\n }\n .align-items-md-baseline {\n align-items: baseline !important;\n }\n .align-items-md-stretch {\n align-items: stretch !important;\n }\n .align-content-md-start {\n align-content: flex-start !important;\n }\n .align-content-md-end {\n align-content: flex-end !important;\n }\n .align-content-md-center {\n align-content: center !important;\n }\n .align-content-md-between {\n align-content: space-between !important;\n }\n .align-content-md-around {\n align-content: space-around !important;\n }\n .align-content-md-stretch {\n align-content: stretch !important;\n }\n .align-self-md-auto {\n align-self: auto !important;\n }\n .align-self-md-start {\n align-self: flex-start !important;\n }\n .align-self-md-end {\n align-self: flex-end !important;\n }\n .align-self-md-center {\n align-self: center !important;\n }\n .align-self-md-baseline {\n align-self: baseline !important;\n }\n .align-self-md-stretch {\n align-self: stretch !important;\n }\n}\n\n@media (min-width: 992px) {\n .order-lg-first {\n order: -1;\n }\n .order-lg-last {\n order: 1;\n }\n .order-lg-0 {\n order: 0;\n }\n .flex-lg-row {\n flex-direction: row !important;\n }\n .flex-lg-column {\n flex-direction: column !important;\n }\n .flex-lg-row-reverse {\n flex-direction: row-reverse !important;\n }\n .flex-lg-column-reverse {\n flex-direction: column-reverse !important;\n }\n .flex-lg-wrap {\n flex-wrap: wrap !important;\n }\n .flex-lg-nowrap {\n flex-wrap: nowrap !important;\n }\n .flex-lg-wrap-reverse {\n flex-wrap: wrap-reverse !important;\n }\n .justify-content-lg-start {\n justify-content: flex-start !important;\n }\n .justify-content-lg-end {\n justify-content: flex-end !important;\n }\n .justify-content-lg-center {\n justify-content: center !important;\n }\n .justify-content-lg-between {\n justify-content: space-between !important;\n }\n .justify-content-lg-around {\n justify-content: space-around !important;\n }\n .align-items-lg-start {\n align-items: flex-start !important;\n }\n .align-items-lg-end {\n align-items: flex-end !important;\n }\n .align-items-lg-center {\n align-items: center !important;\n }\n .align-items-lg-baseline {\n align-items: baseline !important;\n }\n .align-items-lg-stretch {\n align-items: stretch !important;\n }\n .align-content-lg-start {\n align-content: flex-start !important;\n }\n .align-content-lg-end {\n align-content: flex-end !important;\n }\n .align-content-lg-center {\n align-content: center !important;\n }\n .align-content-lg-between {\n align-content: space-between !important;\n }\n .align-content-lg-around {\n align-content: space-around !important;\n }\n .align-content-lg-stretch {\n align-content: stretch !important;\n }\n .align-self-lg-auto {\n align-self: auto !important;\n }\n .align-self-lg-start {\n align-self: flex-start !important;\n }\n .align-self-lg-end {\n align-self: flex-end !important;\n }\n .align-self-lg-center {\n align-self: center !important;\n }\n .align-self-lg-baseline {\n align-self: baseline !important;\n }\n .align-self-lg-stretch {\n align-self: stretch !important;\n }\n}\n\n@media (min-width: 1200px) {\n .order-xl-first {\n order: -1;\n }\n .order-xl-last {\n order: 1;\n }\n .order-xl-0 {\n order: 0;\n }\n .flex-xl-row {\n flex-direction: row !important;\n }\n .flex-xl-column {\n flex-direction: column !important;\n }\n .flex-xl-row-reverse {\n flex-direction: row-reverse !important;\n }\n .flex-xl-column-reverse {\n flex-direction: column-reverse !important;\n }\n .flex-xl-wrap {\n flex-wrap: wrap !important;\n }\n .flex-xl-nowrap {\n flex-wrap: nowrap !important;\n }\n .flex-xl-wrap-reverse {\n flex-wrap: wrap-reverse !important;\n }\n .justify-content-xl-start {\n justify-content: flex-start !important;\n }\n .justify-content-xl-end {\n justify-content: flex-end !important;\n }\n .justify-content-xl-center {\n justify-content: center !important;\n }\n .justify-content-xl-between {\n justify-content: space-between !important;\n }\n .justify-content-xl-around {\n justify-content: space-around !important;\n }\n .align-items-xl-start {\n align-items: flex-start !important;\n }\n .align-items-xl-end {\n align-items: flex-end !important;\n }\n .align-items-xl-center {\n align-items: center !important;\n }\n .align-items-xl-baseline {\n align-items: baseline !important;\n }\n .align-items-xl-stretch {\n align-items: stretch !important;\n }\n .align-content-xl-start {\n align-content: flex-start !important;\n }\n .align-content-xl-end {\n align-content: flex-end !important;\n }\n .align-content-xl-center {\n align-content: center !important;\n }\n .align-content-xl-between {\n align-content: space-between !important;\n }\n .align-content-xl-around {\n align-content: space-around !important;\n }\n .align-content-xl-stretch {\n align-content: stretch !important;\n }\n .align-self-xl-auto {\n align-self: auto !important;\n }\n .align-self-xl-start {\n align-self: flex-start !important;\n }\n .align-self-xl-end {\n align-self: flex-end !important;\n }\n .align-self-xl-center {\n align-self: center !important;\n }\n .align-self-xl-baseline {\n align-self: baseline !important;\n }\n .align-self-xl-stretch {\n align-self: stretch !important;\n }\n}\n\n.float-left {\n float: left !important;\n}\n\n.float-right {\n float: right !important;\n}\n\n.float-none {\n float: none !important;\n}\n\n@media (min-width: 576px) {\n .float-sm-left {\n float: left !important;\n }\n .float-sm-right {\n float: right !important;\n }\n .float-sm-none {\n float: none !important;\n }\n}\n\n@media (min-width: 768px) {\n .float-md-left {\n float: left !important;\n }\n .float-md-right {\n float: right !important;\n }\n .float-md-none {\n float: none !important;\n }\n}\n\n@media (min-width: 992px) {\n .float-lg-left {\n float: left !important;\n }\n .float-lg-right {\n float: right !important;\n }\n .float-lg-none {\n float: none !important;\n }\n}\n\n@media (min-width: 1200px) {\n .float-xl-left {\n float: left !important;\n }\n .float-xl-right {\n float: right !important;\n }\n .float-xl-none {\n float: none !important;\n }\n}\n\n.fixed-top {\n position: fixed;\n top: 0;\n right: 0;\n left: 0;\n z-index: 1030;\n}\n\n.fixed-bottom {\n position: fixed;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: 1030;\n}\n\n.sticky-top {\n position: sticky;\n top: 0;\n z-index: 1020;\n}\n\n.sr-only {\n position: absolute;\n width: 1px;\n height: 1px;\n padding: 0;\n overflow: hidden;\n clip: rect(0, 0, 0, 0);\n white-space: nowrap;\n clip-path: inset(50%);\n border: 0;\n}\n\n.sr-only-focusable:active, .sr-only-focusable:focus {\n position: static;\n width: auto;\n height: auto;\n overflow: visible;\n clip: auto;\n white-space: normal;\n clip-path: none;\n}\n\n.w-25 {\n width: 25% !important;\n}\n\n.w-50 {\n width: 50% !important;\n}\n\n.w-75 {\n width: 75% !important;\n}\n\n.w-100 {\n width: 100% !important;\n}\n\n.h-25 {\n height: 25% !important;\n}\n\n.h-50 {\n height: 50% !important;\n}\n\n.h-75 {\n height: 75% !important;\n}\n\n.h-100 {\n height: 100% !important;\n}\n\n.mw-100 {\n max-width: 100% !important;\n}\n\n.mh-100 {\n max-height: 100% !important;\n}\n\n.m-0 {\n margin: 0 !important;\n}\n\n.mt-0 {\n margin-top: 0 !important;\n}\n\n.mr-0 {\n margin-right: 0 !important;\n}\n\n.mb-0 {\n margin-bottom: 0 !important;\n}\n\n.ml-0 {\n margin-left: 0 !important;\n}\n\n.mx-0 {\n margin-right: 0 !important;\n margin-left: 0 !important;\n}\n\n.my-0 {\n margin-top: 0 !important;\n margin-bottom: 0 !important;\n}\n\n.m-1 {\n margin: 0.25rem !important;\n}\n\n.mt-1 {\n margin-top: 0.25rem !important;\n}\n\n.mr-1 {\n margin-right: 0.25rem !important;\n}\n\n.mb-1 {\n margin-bottom: 0.25rem !important;\n}\n\n.ml-1 {\n margin-left: 0.25rem !important;\n}\n\n.mx-1 {\n margin-right: 0.25rem !important;\n margin-left: 0.25rem !important;\n}\n\n.my-1 {\n margin-top: 0.25rem !important;\n margin-bottom: 0.25rem !important;\n}\n\n.m-2 {\n margin: 0.5rem !important;\n}\n\n.mt-2 {\n margin-top: 0.5rem !important;\n}\n\n.mr-2 {\n margin-right: 0.5rem !important;\n}\n\n.mb-2 {\n margin-bottom: 0.5rem !important;\n}\n\n.ml-2 {\n margin-left: 0.5rem !important;\n}\n\n.mx-2 {\n margin-right: 0.5rem !important;\n margin-left: 0.5rem !important;\n}\n\n.my-2 {\n margin-top: 0.5rem !important;\n margin-bottom: 0.5rem !important;\n}\n\n.m-3 {\n margin: 1rem !important;\n}\n\n.mt-3 {\n margin-top: 1rem !important;\n}\n\n.mr-3 {\n margin-right: 1rem !important;\n}\n\n.mb-3 {\n margin-bottom: 1rem !important;\n}\n\n.ml-3 {\n margin-left: 1rem !important;\n}\n\n.mx-3 {\n margin-right: 1rem !important;\n margin-left: 1rem !important;\n}\n\n.my-3 {\n margin-top: 1rem !important;\n margin-bottom: 1rem !important;\n}\n\n.m-4 {\n margin: 1.5rem !important;\n}\n\n.mt-4 {\n margin-top: 1.5rem !important;\n}\n\n.mr-4 {\n margin-right: 1.5rem !important;\n}\n\n.mb-4 {\n margin-bottom: 1.5rem !important;\n}\n\n.ml-4 {\n margin-left: 1.5rem !important;\n}\n\n.mx-4 {\n margin-right: 1.5rem !important;\n margin-left: 1.5rem !important;\n}\n\n.my-4 {\n margin-top: 1.5rem !important;\n margin-bottom: 1.5rem !important;\n}\n\n.m-5 {\n margin: 3rem !important;\n}\n\n.mt-5 {\n margin-top: 3rem !important;\n}\n\n.mr-5 {\n margin-right: 3rem !important;\n}\n\n.mb-5 {\n margin-bottom: 3rem !important;\n}\n\n.ml-5 {\n margin-left: 3rem !important;\n}\n\n.mx-5 {\n margin-right: 3rem !important;\n margin-left: 3rem !important;\n}\n\n.my-5 {\n margin-top: 3rem !important;\n margin-bottom: 3rem !important;\n}\n\n.p-0 {\n padding: 0 !important;\n}\n\n.pt-0 {\n padding-top: 0 !important;\n}\n\n.pr-0 {\n padding-right: 0 !important;\n}\n\n.pb-0 {\n padding-bottom: 0 !important;\n}\n\n.pl-0 {\n padding-left: 0 !important;\n}\n\n.px-0 {\n padding-right: 0 !important;\n padding-left: 0 !important;\n}\n\n.py-0 {\n padding-top: 0 !important;\n padding-bottom: 0 !important;\n}\n\n.p-1 {\n padding: 0.25rem !important;\n}\n\n.pt-1 {\n padding-top: 0.25rem !important;\n}\n\n.pr-1 {\n padding-right: 0.25rem !important;\n}\n\n.pb-1 {\n padding-bottom: 0.25rem !important;\n}\n\n.pl-1 {\n padding-left: 0.25rem !important;\n}\n\n.px-1 {\n padding-right: 0.25rem !important;\n padding-left: 0.25rem !important;\n}\n\n.py-1 {\n padding-top: 0.25rem !important;\n padding-bottom: 0.25rem !important;\n}\n\n.p-2 {\n padding: 0.5rem !important;\n}\n\n.pt-2 {\n padding-top: 0.5rem !important;\n}\n\n.pr-2 {\n padding-right: 0.5rem !important;\n}\n\n.pb-2 {\n padding-bottom: 0.5rem !important;\n}\n\n.pl-2 {\n padding-left: 0.5rem !important;\n}\n\n.px-2 {\n padding-right: 0.5rem !important;\n padding-left: 0.5rem !important;\n}\n\n.py-2 {\n padding-top: 0.5rem !important;\n padding-bottom: 0.5rem !important;\n}\n\n.p-3 {\n padding: 1rem !important;\n}\n\n.pt-3 {\n padding-top: 1rem !important;\n}\n\n.pr-3 {\n padding-right: 1rem !important;\n}\n\n.pb-3 {\n padding-bottom: 1rem !important;\n}\n\n.pl-3 {\n padding-left: 1rem !important;\n}\n\n.px-3 {\n padding-right: 1rem !important;\n padding-left: 1rem !important;\n}\n\n.py-3 {\n padding-top: 1rem !important;\n padding-bottom: 1rem !important;\n}\n\n.p-4 {\n padding: 1.5rem !important;\n}\n\n.pt-4 {\n padding-top: 1.5rem !important;\n}\n\n.pr-4 {\n padding-right: 1.5rem !important;\n}\n\n.pb-4 {\n padding-bottom: 1.5rem !important;\n}\n\n.pl-4 {\n padding-left: 1.5rem !important;\n}\n\n.px-4 {\n padding-right: 1.5rem !important;\n padding-left: 1.5rem !important;\n}\n\n.py-4 {\n padding-top: 1.5rem !important;\n padding-bottom: 1.5rem !important;\n}\n\n.p-5 {\n padding: 3rem !important;\n}\n\n.pt-5 {\n padding-top: 3rem !important;\n}\n\n.pr-5 {\n padding-right: 3rem !important;\n}\n\n.pb-5 {\n padding-bottom: 3rem !important;\n}\n\n.pl-5 {\n padding-left: 3rem !important;\n}\n\n.px-5 {\n padding-right: 3rem !important;\n padding-left: 3rem !important;\n}\n\n.py-5 {\n padding-top: 3rem !important;\n padding-bottom: 3rem !important;\n}\n\n.m-auto {\n margin: auto !important;\n}\n\n.mt-auto {\n margin-top: auto !important;\n}\n\n.mr-auto {\n margin-right: auto !important;\n}\n\n.mb-auto {\n margin-bottom: auto !important;\n}\n\n.ml-auto {\n margin-left: auto !important;\n}\n\n.mx-auto {\n margin-right: auto !important;\n margin-left: auto !important;\n}\n\n.my-auto {\n margin-top: auto !important;\n margin-bottom: auto !important;\n}\n\n@media (min-width: 576px) {\n .m-sm-0 {\n margin: 0 !important;\n }\n .mt-sm-0 {\n margin-top: 0 !important;\n }\n .mr-sm-0 {\n margin-right: 0 !important;\n }\n .mb-sm-0 {\n margin-bottom: 0 !important;\n }\n .ml-sm-0 {\n margin-left: 0 !important;\n }\n .mx-sm-0 {\n margin-right: 0 !important;\n margin-left: 0 !important;\n }\n .my-sm-0 {\n margin-top: 0 !important;\n margin-bottom: 0 !important;\n }\n .m-sm-1 {\n margin: 0.25rem !important;\n }\n .mt-sm-1 {\n margin-top: 0.25rem !important;\n }\n .mr-sm-1 {\n margin-right: 0.25rem !important;\n }\n .mb-sm-1 {\n margin-bottom: 0.25rem !important;\n }\n .ml-sm-1 {\n margin-left: 0.25rem !important;\n }\n .mx-sm-1 {\n margin-right: 0.25rem !important;\n margin-left: 0.25rem !important;\n }\n .my-sm-1 {\n margin-top: 0.25rem !important;\n margin-bottom: 0.25rem !important;\n }\n .m-sm-2 {\n margin: 0.5rem !important;\n }\n .mt-sm-2 {\n margin-top: 0.5rem !important;\n }\n .mr-sm-2 {\n margin-right: 0.5rem !important;\n }\n .mb-sm-2 {\n margin-bottom: 0.5rem !important;\n }\n .ml-sm-2 {\n margin-left: 0.5rem !important;\n }\n .mx-sm-2 {\n margin-right: 0.5rem !important;\n margin-left: 0.5rem !important;\n }\n .my-sm-2 {\n margin-top: 0.5rem !important;\n margin-bottom: 0.5rem !important;\n }\n .m-sm-3 {\n margin: 1rem !important;\n }\n .mt-sm-3 {\n margin-top: 1rem !important;\n }\n .mr-sm-3 {\n margin-right: 1rem !important;\n }\n .mb-sm-3 {\n margin-bottom: 1rem !important;\n }\n .ml-sm-3 {\n margin-left: 1rem !important;\n }\n .mx-sm-3 {\n margin-right: 1rem !important;\n margin-left: 1rem !important;\n }\n .my-sm-3 {\n margin-top: 1rem !important;\n margin-bottom: 1rem !important;\n }\n .m-sm-4 {\n margin: 1.5rem !important;\n }\n .mt-sm-4 {\n margin-top: 1.5rem !important;\n }\n .mr-sm-4 {\n margin-right: 1.5rem !important;\n }\n .mb-sm-4 {\n margin-bottom: 1.5rem !important;\n }\n .ml-sm-4 {\n margin-left: 1.5rem !important;\n }\n .mx-sm-4 {\n margin-right: 1.5rem !important;\n margin-left: 1.5rem !important;\n }\n .my-sm-4 {\n margin-top: 1.5rem !important;\n margin-bottom: 1.5rem !important;\n }\n .m-sm-5 {\n margin: 3rem !important;\n }\n .mt-sm-5 {\n margin-top: 3rem !important;\n }\n .mr-sm-5 {\n margin-right: 3rem !important;\n }\n .mb-sm-5 {\n margin-bottom: 3rem !important;\n }\n .ml-sm-5 {\n margin-left: 3rem !important;\n }\n .mx-sm-5 {\n margin-right: 3rem !important;\n margin-left: 3rem !important;\n }\n .my-sm-5 {\n margin-top: 3rem !important;\n margin-bottom: 3rem !important;\n }\n .p-sm-0 {\n padding: 0 !important;\n }\n .pt-sm-0 {\n padding-top: 0 !important;\n }\n .pr-sm-0 {\n padding-right: 0 !important;\n }\n .pb-sm-0 {\n padding-bottom: 0 !important;\n }\n .pl-sm-0 {\n padding-left: 0 !important;\n }\n .px-sm-0 {\n padding-right: 0 !important;\n padding-left: 0 !important;\n }\n .py-sm-0 {\n padding-top: 0 !important;\n padding-bottom: 0 !important;\n }\n .p-sm-1 {\n padding: 0.25rem !important;\n }\n .pt-sm-1 {\n padding-top: 0.25rem !important;\n }\n .pr-sm-1 {\n padding-right: 0.25rem !important;\n }\n .pb-sm-1 {\n padding-bottom: 0.25rem !important;\n }\n .pl-sm-1 {\n padding-left: 0.25rem !important;\n }\n .px-sm-1 {\n padding-right: 0.25rem !important;\n padding-left: 0.25rem !important;\n }\n .py-sm-1 {\n padding-top: 0.25rem !important;\n padding-bottom: 0.25rem !important;\n }\n .p-sm-2 {\n padding: 0.5rem !important;\n }\n .pt-sm-2 {\n padding-top: 0.5rem !important;\n }\n .pr-sm-2 {\n padding-right: 0.5rem !important;\n }\n .pb-sm-2 {\n padding-bottom: 0.5rem !important;\n }\n .pl-sm-2 {\n padding-left: 0.5rem !important;\n }\n .px-sm-2 {\n padding-right: 0.5rem !important;\n padding-left: 0.5rem !important;\n }\n .py-sm-2 {\n padding-top: 0.5rem !important;\n padding-bottom: 0.5rem !important;\n }\n .p-sm-3 {\n padding: 1rem !important;\n }\n .pt-sm-3 {\n padding-top: 1rem !important;\n }\n .pr-sm-3 {\n padding-right: 1rem !important;\n }\n .pb-sm-3 {\n padding-bottom: 1rem !important;\n }\n .pl-sm-3 {\n padding-left: 1rem !important;\n }\n .px-sm-3 {\n padding-right: 1rem !important;\n padding-left: 1rem !important;\n }\n .py-sm-3 {\n padding-top: 1rem !important;\n padding-bottom: 1rem !important;\n }\n .p-sm-4 {\n padding: 1.5rem !important;\n }\n .pt-sm-4 {\n padding-top: 1.5rem !important;\n }\n .pr-sm-4 {\n padding-right: 1.5rem !important;\n }\n .pb-sm-4 {\n padding-bottom: 1.5rem !important;\n }\n .pl-sm-4 {\n padding-left: 1.5rem !important;\n }\n .px-sm-4 {\n padding-right: 1.5rem !important;\n padding-left: 1.5rem !important;\n }\n .py-sm-4 {\n padding-top: 1.5rem !important;\n padding-bottom: 1.5rem !important;\n }\n .p-sm-5 {\n padding: 3rem !important;\n }\n .pt-sm-5 {\n padding-top: 3rem !important;\n }\n .pr-sm-5 {\n padding-right: 3rem !important;\n }\n .pb-sm-5 {\n padding-bottom: 3rem !important;\n }\n .pl-sm-5 {\n padding-left: 3rem !important;\n }\n .px-sm-5 {\n padding-right: 3rem !important;\n padding-left: 3rem !important;\n }\n .py-sm-5 {\n padding-top: 3rem !important;\n padding-bottom: 3rem !important;\n }\n .m-sm-auto {\n margin: auto !important;\n }\n .mt-sm-auto {\n margin-top: auto !important;\n }\n .mr-sm-auto {\n margin-right: auto !important;\n }\n .mb-sm-auto {\n margin-bottom: auto !important;\n }\n .ml-sm-auto {\n margin-left: auto !important;\n }\n .mx-sm-auto {\n margin-right: auto !important;\n margin-left: auto !important;\n }\n .my-sm-auto {\n margin-top: auto !important;\n margin-bottom: auto !important;\n }\n}\n\n@media (min-width: 768px) {\n .m-md-0 {\n margin: 0 !important;\n }\n .mt-md-0 {\n margin-top: 0 !important;\n }\n .mr-md-0 {\n margin-right: 0 !important;\n }\n .mb-md-0 {\n margin-bottom: 0 !important;\n }\n .ml-md-0 {\n margin-left: 0 !important;\n }\n .mx-md-0 {\n margin-right: 0 !important;\n margin-left: 0 !important;\n }\n .my-md-0 {\n margin-top: 0 !important;\n margin-bottom: 0 !important;\n }\n .m-md-1 {\n margin: 0.25rem !important;\n }\n .mt-md-1 {\n margin-top: 0.25rem !important;\n }\n .mr-md-1 {\n margin-right: 0.25rem !important;\n }\n .mb-md-1 {\n margin-bottom: 0.25rem !important;\n }\n .ml-md-1 {\n margin-left: 0.25rem !important;\n }\n .mx-md-1 {\n margin-right: 0.25rem !important;\n margin-left: 0.25rem !important;\n }\n .my-md-1 {\n margin-top: 0.25rem !important;\n margin-bottom: 0.25rem !important;\n }\n .m-md-2 {\n margin: 0.5rem !important;\n }\n .mt-md-2 {\n margin-top: 0.5rem !important;\n }\n .mr-md-2 {\n margin-right: 0.5rem !important;\n }\n .mb-md-2 {\n margin-bottom: 0.5rem !important;\n }\n .ml-md-2 {\n margin-left: 0.5rem !important;\n }\n .mx-md-2 {\n margin-right: 0.5rem !important;\n margin-left: 0.5rem !important;\n }\n .my-md-2 {\n margin-top: 0.5rem !important;\n margin-bottom: 0.5rem !important;\n }\n .m-md-3 {\n margin: 1rem !important;\n }\n .mt-md-3 {\n margin-top: 1rem !important;\n }\n .mr-md-3 {\n margin-right: 1rem !important;\n }\n .mb-md-3 {\n margin-bottom: 1rem !important;\n }\n .ml-md-3 {\n margin-left: 1rem !important;\n }\n .mx-md-3 {\n margin-right: 1rem !important;\n margin-left: 1rem !important;\n }\n .my-md-3 {\n margin-top: 1rem !important;\n margin-bottom: 1rem !important;\n }\n .m-md-4 {\n margin: 1.5rem !important;\n }\n .mt-md-4 {\n margin-top: 1.5rem !important;\n }\n .mr-md-4 {\n margin-right: 1.5rem !important;\n }\n .mb-md-4 {\n margin-bottom: 1.5rem !important;\n }\n .ml-md-4 {\n margin-left: 1.5rem !important;\n }\n .mx-md-4 {\n margin-right: 1.5rem !important;\n margin-left: 1.5rem !important;\n }\n .my-md-4 {\n margin-top: 1.5rem !important;\n margin-bottom: 1.5rem !important;\n }\n .m-md-5 {\n margin: 3rem !important;\n }\n .mt-md-5 {\n margin-top: 3rem !important;\n }\n .mr-md-5 {\n margin-right: 3rem !important;\n }\n .mb-md-5 {\n margin-bottom: 3rem !important;\n }\n .ml-md-5 {\n margin-left: 3rem !important;\n }\n .mx-md-5 {\n margin-right: 3rem !important;\n margin-left: 3rem !important;\n }\n .my-md-5 {\n margin-top: 3rem !important;\n margin-bottom: 3rem !important;\n }\n .p-md-0 {\n padding: 0 !important;\n }\n .pt-md-0 {\n padding-top: 0 !important;\n }\n .pr-md-0 {\n padding-right: 0 !important;\n }\n .pb-md-0 {\n padding-bottom: 0 !important;\n }\n .pl-md-0 {\n padding-left: 0 !important;\n }\n .px-md-0 {\n padding-right: 0 !important;\n padding-left: 0 !important;\n }\n .py-md-0 {\n padding-top: 0 !important;\n padding-bottom: 0 !important;\n }\n .p-md-1 {\n padding: 0.25rem !important;\n }\n .pt-md-1 {\n padding-top: 0.25rem !important;\n }\n .pr-md-1 {\n padding-right: 0.25rem !important;\n }\n .pb-md-1 {\n padding-bottom: 0.25rem !important;\n }\n .pl-md-1 {\n padding-left: 0.25rem !important;\n }\n .px-md-1 {\n padding-right: 0.25rem !important;\n padding-left: 0.25rem !important;\n }\n .py-md-1 {\n padding-top: 0.25rem !important;\n padding-bottom: 0.25rem !important;\n }\n .p-md-2 {\n padding: 0.5rem !important;\n }\n .pt-md-2 {\n padding-top: 0.5rem !important;\n }\n .pr-md-2 {\n padding-right: 0.5rem !important;\n }\n .pb-md-2 {\n padding-bottom: 0.5rem !important;\n }\n .pl-md-2 {\n padding-left: 0.5rem !important;\n }\n .px-md-2 {\n padding-right: 0.5rem !important;\n padding-left: 0.5rem !important;\n }\n .py-md-2 {\n padding-top: 0.5rem !important;\n padding-bottom: 0.5rem !important;\n }\n .p-md-3 {\n padding: 1rem !important;\n }\n .pt-md-3 {\n padding-top: 1rem !important;\n }\n .pr-md-3 {\n padding-right: 1rem !important;\n }\n .pb-md-3 {\n padding-bottom: 1rem !important;\n }\n .pl-md-3 {\n padding-left: 1rem !important;\n }\n .px-md-3 {\n padding-right: 1rem !important;\n padding-left: 1rem !important;\n }\n .py-md-3 {\n padding-top: 1rem !important;\n padding-bottom: 1rem !important;\n }\n .p-md-4 {\n padding: 1.5rem !important;\n }\n .pt-md-4 {\n padding-top: 1.5rem !important;\n }\n .pr-md-4 {\n padding-right: 1.5rem !important;\n }\n .pb-md-4 {\n padding-bottom: 1.5rem !important;\n }\n .pl-md-4 {\n padding-left: 1.5rem !important;\n }\n .px-md-4 {\n padding-right: 1.5rem !important;\n padding-left: 1.5rem !important;\n }\n .py-md-4 {\n padding-top: 1.5rem !important;\n padding-bottom: 1.5rem !important;\n }\n .p-md-5 {\n padding: 3rem !important;\n }\n .pt-md-5 {\n padding-top: 3rem !important;\n }\n .pr-md-5 {\n padding-right: 3rem !important;\n }\n .pb-md-5 {\n padding-bottom: 3rem !important;\n }\n .pl-md-5 {\n padding-left: 3rem !important;\n }\n .px-md-5 {\n padding-right: 3rem !important;\n padding-left: 3rem !important;\n }\n .py-md-5 {\n padding-top: 3rem !important;\n padding-bottom: 3rem !important;\n }\n .m-md-auto {\n margin: auto !important;\n }\n .mt-md-auto {\n margin-top: auto !important;\n }\n .mr-md-auto {\n margin-right: auto !important;\n }\n .mb-md-auto {\n margin-bottom: auto !important;\n }\n .ml-md-auto {\n margin-left: auto !important;\n }\n .mx-md-auto {\n margin-right: auto !important;\n margin-left: auto !important;\n }\n .my-md-auto {\n margin-top: auto !important;\n margin-bottom: auto !important;\n }\n}\n\n@media (min-width: 992px) {\n .m-lg-0 {\n margin: 0 !important;\n }\n .mt-lg-0 {\n margin-top: 0 !important;\n }\n .mr-lg-0 {\n margin-right: 0 !important;\n }\n .mb-lg-0 {\n margin-bottom: 0 !important;\n }\n .ml-lg-0 {\n margin-left: 0 !important;\n }\n .mx-lg-0 {\n margin-right: 0 !important;\n margin-left: 0 !important;\n }\n .my-lg-0 {\n margin-top: 0 !important;\n margin-bottom: 0 !important;\n }\n .m-lg-1 {\n margin: 0.25rem !important;\n }\n .mt-lg-1 {\n margin-top: 0.25rem !important;\n }\n .mr-lg-1 {\n margin-right: 0.25rem !important;\n }\n .mb-lg-1 {\n margin-bottom: 0.25rem !important;\n }\n .ml-lg-1 {\n margin-left: 0.25rem !important;\n }\n .mx-lg-1 {\n margin-right: 0.25rem !important;\n margin-left: 0.25rem !important;\n }\n .my-lg-1 {\n margin-top: 0.25rem !important;\n margin-bottom: 0.25rem !important;\n }\n .m-lg-2 {\n margin: 0.5rem !important;\n }\n .mt-lg-2 {\n margin-top: 0.5rem !important;\n }\n .mr-lg-2 {\n margin-right: 0.5rem !important;\n }\n .mb-lg-2 {\n margin-bottom: 0.5rem !important;\n }\n .ml-lg-2 {\n margin-left: 0.5rem !important;\n }\n .mx-lg-2 {\n margin-right: 0.5rem !important;\n margin-left: 0.5rem !important;\n }\n .my-lg-2 {\n margin-top: 0.5rem !important;\n margin-bottom: 0.5rem !important;\n }\n .m-lg-3 {\n margin: 1rem !important;\n }\n .mt-lg-3 {\n margin-top: 1rem !important;\n }\n .mr-lg-3 {\n margin-right: 1rem !important;\n }\n .mb-lg-3 {\n margin-bottom: 1rem !important;\n }\n .ml-lg-3 {\n margin-left: 1rem !important;\n }\n .mx-lg-3 {\n margin-right: 1rem !important;\n margin-left: 1rem !important;\n }\n .my-lg-3 {\n margin-top: 1rem !important;\n margin-bottom: 1rem !important;\n }\n .m-lg-4 {\n margin: 1.5rem !important;\n }\n .mt-lg-4 {\n margin-top: 1.5rem !important;\n }\n .mr-lg-4 {\n margin-right: 1.5rem !important;\n }\n .mb-lg-4 {\n margin-bottom: 1.5rem !important;\n }\n .ml-lg-4 {\n margin-left: 1.5rem !important;\n }\n .mx-lg-4 {\n margin-right: 1.5rem !important;\n margin-left: 1.5rem !important;\n }\n .my-lg-4 {\n margin-top: 1.5rem !important;\n margin-bottom: 1.5rem !important;\n }\n .m-lg-5 {\n margin: 3rem !important;\n }\n .mt-lg-5 {\n margin-top: 3rem !important;\n }\n .mr-lg-5 {\n margin-right: 3rem !important;\n }\n .mb-lg-5 {\n margin-bottom: 3rem !important;\n }\n .ml-lg-5 {\n margin-left: 3rem !important;\n }\n .mx-lg-5 {\n margin-right: 3rem !important;\n margin-left: 3rem !important;\n }\n .my-lg-5 {\n margin-top: 3rem !important;\n margin-bottom: 3rem !important;\n }\n .p-lg-0 {\n padding: 0 !important;\n }\n .pt-lg-0 {\n padding-top: 0 !important;\n }\n .pr-lg-0 {\n padding-right: 0 !important;\n }\n .pb-lg-0 {\n padding-bottom: 0 !important;\n }\n .pl-lg-0 {\n padding-left: 0 !important;\n }\n .px-lg-0 {\n padding-right: 0 !important;\n padding-left: 0 !important;\n }\n .py-lg-0 {\n padding-top: 0 !important;\n padding-bottom: 0 !important;\n }\n .p-lg-1 {\n padding: 0.25rem !important;\n }\n .pt-lg-1 {\n padding-top: 0.25rem !important;\n }\n .pr-lg-1 {\n padding-right: 0.25rem !important;\n }\n .pb-lg-1 {\n padding-bottom: 0.25rem !important;\n }\n .pl-lg-1 {\n padding-left: 0.25rem !important;\n }\n .px-lg-1 {\n padding-right: 0.25rem !important;\n padding-left: 0.25rem !important;\n }\n .py-lg-1 {\n padding-top: 0.25rem !important;\n padding-bottom: 0.25rem !important;\n }\n .p-lg-2 {\n padding: 0.5rem !important;\n }\n .pt-lg-2 {\n padding-top: 0.5rem !important;\n }\n .pr-lg-2 {\n padding-right: 0.5rem !important;\n }\n .pb-lg-2 {\n padding-bottom: 0.5rem !important;\n }\n .pl-lg-2 {\n padding-left: 0.5rem !important;\n }\n .px-lg-2 {\n padding-right: 0.5rem !important;\n padding-left: 0.5rem !important;\n }\n .py-lg-2 {\n padding-top: 0.5rem !important;\n padding-bottom: 0.5rem !important;\n }\n .p-lg-3 {\n padding: 1rem !important;\n }\n .pt-lg-3 {\n padding-top: 1rem !important;\n }\n .pr-lg-3 {\n padding-right: 1rem !important;\n }\n .pb-lg-3 {\n padding-bottom: 1rem !important;\n }\n .pl-lg-3 {\n padding-left: 1rem !important;\n }\n .px-lg-3 {\n padding-right: 1rem !important;\n padding-left: 1rem !important;\n }\n .py-lg-3 {\n padding-top: 1rem !important;\n padding-bottom: 1rem !important;\n }\n .p-lg-4 {\n padding: 1.5rem !important;\n }\n .pt-lg-4 {\n padding-top: 1.5rem !important;\n }\n .pr-lg-4 {\n padding-right: 1.5rem !important;\n }\n .pb-lg-4 {\n padding-bottom: 1.5rem !important;\n }\n .pl-lg-4 {\n padding-left: 1.5rem !important;\n }\n .px-lg-4 {\n padding-right: 1.5rem !important;\n padding-left: 1.5rem !important;\n }\n .py-lg-4 {\n padding-top: 1.5rem !important;\n padding-bottom: 1.5rem !important;\n }\n .p-lg-5 {\n padding: 3rem !important;\n }\n .pt-lg-5 {\n padding-top: 3rem !important;\n }\n .pr-lg-5 {\n padding-right: 3rem !important;\n }\n .pb-lg-5 {\n padding-bottom: 3rem !important;\n }\n .pl-lg-5 {\n padding-left: 3rem !important;\n }\n .px-lg-5 {\n padding-right: 3rem !important;\n padding-left: 3rem !important;\n }\n .py-lg-5 {\n padding-top: 3rem !important;\n padding-bottom: 3rem !important;\n }\n .m-lg-auto {\n margin: auto !important;\n }\n .mt-lg-auto {\n margin-top: auto !important;\n }\n .mr-lg-auto {\n margin-right: auto !important;\n }\n .mb-lg-auto {\n margin-bottom: auto !important;\n }\n .ml-lg-auto {\n margin-left: auto !important;\n }\n .mx-lg-auto {\n margin-right: auto !important;\n margin-left: auto !important;\n }\n .my-lg-auto {\n margin-top: auto !important;\n margin-bottom: auto !important;\n }\n}\n\n@media (min-width: 1200px) {\n .m-xl-0 {\n margin: 0 !important;\n }\n .mt-xl-0 {\n margin-top: 0 !important;\n }\n .mr-xl-0 {\n margin-right: 0 !important;\n }\n .mb-xl-0 {\n margin-bottom: 0 !important;\n }\n .ml-xl-0 {\n margin-left: 0 !important;\n }\n .mx-xl-0 {\n margin-right: 0 !important;\n margin-left: 0 !important;\n }\n .my-xl-0 {\n margin-top: 0 !important;\n margin-bottom: 0 !important;\n }\n .m-xl-1 {\n margin: 0.25rem !important;\n }\n .mt-xl-1 {\n margin-top: 0.25rem !important;\n }\n .mr-xl-1 {\n margin-right: 0.25rem !important;\n }\n .mb-xl-1 {\n margin-bottom: 0.25rem !important;\n }\n .ml-xl-1 {\n margin-left: 0.25rem !important;\n }\n .mx-xl-1 {\n margin-right: 0.25rem !important;\n margin-left: 0.25rem !important;\n }\n .my-xl-1 {\n margin-top: 0.25rem !important;\n margin-bottom: 0.25rem !important;\n }\n .m-xl-2 {\n margin: 0.5rem !important;\n }\n .mt-xl-2 {\n margin-top: 0.5rem !important;\n }\n .mr-xl-2 {\n margin-right: 0.5rem !important;\n }\n .mb-xl-2 {\n margin-bottom: 0.5rem !important;\n }\n .ml-xl-2 {\n margin-left: 0.5rem !important;\n }\n .mx-xl-2 {\n margin-right: 0.5rem !important;\n margin-left: 0.5rem !important;\n }\n .my-xl-2 {\n margin-top: 0.5rem !important;\n margin-bottom: 0.5rem !important;\n }\n .m-xl-3 {\n margin: 1rem !important;\n }\n .mt-xl-3 {\n margin-top: 1rem !important;\n }\n .mr-xl-3 {\n margin-right: 1rem !important;\n }\n .mb-xl-3 {\n margin-bottom: 1rem !important;\n }\n .ml-xl-3 {\n margin-left: 1rem !important;\n }\n .mx-xl-3 {\n margin-right: 1rem !important;\n margin-left: 1rem !important;\n }\n .my-xl-3 {\n margin-top: 1rem !important;\n margin-bottom: 1rem !important;\n }\n .m-xl-4 {\n margin: 1.5rem !important;\n }\n .mt-xl-4 {\n margin-top: 1.5rem !important;\n }\n .mr-xl-4 {\n margin-right: 1.5rem !important;\n }\n .mb-xl-4 {\n margin-bottom: 1.5rem !important;\n }\n .ml-xl-4 {\n margin-left: 1.5rem !important;\n }\n .mx-xl-4 {\n margin-right: 1.5rem !important;\n margin-left: 1.5rem !important;\n }\n .my-xl-4 {\n margin-top: 1.5rem !important;\n margin-bottom: 1.5rem !important;\n }\n .m-xl-5 {\n margin: 3rem !important;\n }\n .mt-xl-5 {\n margin-top: 3rem !important;\n }\n .mr-xl-5 {\n margin-right: 3rem !important;\n }\n .mb-xl-5 {\n margin-bottom: 3rem !important;\n }\n .ml-xl-5 {\n margin-left: 3rem !important;\n }\n .mx-xl-5 {\n margin-right: 3rem !important;\n margin-left: 3rem !important;\n }\n .my-xl-5 {\n margin-top: 3rem !important;\n margin-bottom: 3rem !important;\n }\n .p-xl-0 {\n padding: 0 !important;\n }\n .pt-xl-0 {\n padding-top: 0 !important;\n }\n .pr-xl-0 {\n padding-right: 0 !important;\n }\n .pb-xl-0 {\n padding-bottom: 0 !important;\n }\n .pl-xl-0 {\n padding-left: 0 !important;\n }\n .px-xl-0 {\n padding-right: 0 !important;\n padding-left: 0 !important;\n }\n .py-xl-0 {\n padding-top: 0 !important;\n padding-bottom: 0 !important;\n }\n .p-xl-1 {\n padding: 0.25rem !important;\n }\n .pt-xl-1 {\n padding-top: 0.25rem !important;\n }\n .pr-xl-1 {\n padding-right: 0.25rem !important;\n }\n .pb-xl-1 {\n padding-bottom: 0.25rem !important;\n }\n .pl-xl-1 {\n padding-left: 0.25rem !important;\n }\n .px-xl-1 {\n padding-right: 0.25rem !important;\n padding-left: 0.25rem !important;\n }\n .py-xl-1 {\n padding-top: 0.25rem !important;\n padding-bottom: 0.25rem !important;\n }\n .p-xl-2 {\n padding: 0.5rem !important;\n }\n .pt-xl-2 {\n padding-top: 0.5rem !important;\n }\n .pr-xl-2 {\n padding-right: 0.5rem !important;\n }\n .pb-xl-2 {\n padding-bottom: 0.5rem !important;\n }\n .pl-xl-2 {\n padding-left: 0.5rem !important;\n }\n .px-xl-2 {\n padding-right: 0.5rem !important;\n padding-left: 0.5rem !important;\n }\n .py-xl-2 {\n padding-top: 0.5rem !important;\n padding-bottom: 0.5rem !important;\n }\n .p-xl-3 {\n padding: 1rem !important;\n }\n .pt-xl-3 {\n padding-top: 1rem !important;\n }\n .pr-xl-3 {\n padding-right: 1rem !important;\n }\n .pb-xl-3 {\n padding-bottom: 1rem !important;\n }\n .pl-xl-3 {\n padding-left: 1rem !important;\n }\n .px-xl-3 {\n padding-right: 1rem !important;\n padding-left: 1rem !important;\n }\n .py-xl-3 {\n padding-top: 1rem !important;\n padding-bottom: 1rem !important;\n }\n .p-xl-4 {\n padding: 1.5rem !important;\n }\n .pt-xl-4 {\n padding-top: 1.5rem !important;\n }\n .pr-xl-4 {\n padding-right: 1.5rem !important;\n }\n .pb-xl-4 {\n padding-bottom: 1.5rem !important;\n }\n .pl-xl-4 {\n padding-left: 1.5rem !important;\n }\n .px-xl-4 {\n padding-right: 1.5rem !important;\n padding-left: 1.5rem !important;\n }\n .py-xl-4 {\n padding-top: 1.5rem !important;\n padding-bottom: 1.5rem !important;\n }\n .p-xl-5 {\n padding: 3rem !important;\n }\n .pt-xl-5 {\n padding-top: 3rem !important;\n }\n .pr-xl-5 {\n padding-right: 3rem !important;\n }\n .pb-xl-5 {\n padding-bottom: 3rem !important;\n }\n .pl-xl-5 {\n padding-left: 3rem !important;\n }\n .px-xl-5 {\n padding-right: 3rem !important;\n padding-left: 3rem !important;\n }\n .py-xl-5 {\n padding-top: 3rem !important;\n padding-bottom: 3rem !important;\n }\n .m-xl-auto {\n margin: auto !important;\n }\n .mt-xl-auto {\n margin-top: auto !important;\n }\n .mr-xl-auto {\n margin-right: auto !important;\n }\n .mb-xl-auto {\n margin-bottom: auto !important;\n }\n .ml-xl-auto {\n margin-left: auto !important;\n }\n .mx-xl-auto {\n margin-right: auto !important;\n margin-left: auto !important;\n }\n .my-xl-auto {\n margin-top: auto !important;\n margin-bottom: auto !important;\n }\n}\n\n.text-justify {\n text-align: justify !important;\n}\n\n.text-nowrap {\n white-space: nowrap !important;\n}\n\n.text-truncate {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.text-left {\n text-align: left !important;\n}\n\n.text-right {\n text-align: right !important;\n}\n\n.text-center {\n text-align: center !important;\n}\n\n@media (min-width: 576px) {\n .text-sm-left {\n text-align: left !important;\n }\n .text-sm-right {\n text-align: right !important;\n }\n .text-sm-center {\n text-align: center !important;\n }\n}\n\n@media (min-width: 768px) {\n .text-md-left {\n text-align: left !important;\n }\n .text-md-right {\n text-align: right !important;\n }\n .text-md-center {\n text-align: center !important;\n }\n}\n\n@media (min-width: 992px) {\n .text-lg-left {\n text-align: left !important;\n }\n .text-lg-right {\n text-align: right !important;\n }\n .text-lg-center {\n text-align: center !important;\n }\n}\n\n@media (min-width: 1200px) {\n .text-xl-left {\n text-align: left !important;\n }\n .text-xl-right {\n text-align: right !important;\n }\n .text-xl-center {\n text-align: center !important;\n }\n}\n\n.text-lowercase {\n text-transform: lowercase !important;\n}\n\n.text-uppercase {\n text-transform: uppercase !important;\n}\n\n.text-capitalize {\n text-transform: capitalize !important;\n}\n\n.font-weight-normal {\n font-weight: normal;\n}\n\n.font-weight-bold {\n font-weight: bold;\n}\n\n.font-italic {\n font-style: italic;\n}\n\n.text-white {\n color: #fff !important;\n}\n\n.text-muted {\n color: #636c72 !important;\n}\n\na.text-muted:focus, a.text-muted:hover {\n color: #4b5257 !important;\n}\n\n.text-primary {\n color: #0275d8 !important;\n}\n\na.text-primary:focus, a.text-primary:hover {\n color: #025aa5 !important;\n}\n\n.text-success {\n color: #5cb85c !important;\n}\n\na.text-success:focus, a.text-success:hover {\n color: #449d44 !important;\n}\n\n.text-info {\n color: #5bc0de !important;\n}\n\na.text-info:focus, a.text-info:hover {\n color: #31b0d5 !important;\n}\n\n.text-warning {\n color: #f0ad4e !important;\n}\n\na.text-warning:focus, a.text-warning:hover {\n color: #ec971f !important;\n}\n\n.text-danger {\n color: #d9534f !important;\n}\n\na.text-danger:focus, a.text-danger:hover {\n color: #c9302c !important;\n}\n\n.text-gray-dark {\n color: #292b2c !important;\n}\n\na.text-gray-dark:focus, a.text-gray-dark:hover {\n color: #101112 !important;\n}\n\n.text-hide {\n font: 0/0 a;\n color: transparent;\n text-shadow: none;\n background-color: transparent;\n border: 0;\n}\n\n.visible {\n visibility: visible !important;\n}\n\n.invisible {\n visibility: hidden !important;\n}\n\n/*# sourceMappingURL=bootstrap.css.map */",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null]} \ No newline at end of file
+{"version":3,"sources":["../../scss/bootstrap.scss","../../scss/_print.scss","bootstrap.css","../../scss/_reboot.scss","../../scss/_variables.scss","../../scss/mixins/_hover.scss","../../scss/_type.scss","../../scss/mixins/_lists.scss","../../scss/_images.scss","../../scss/mixins/_image.scss","../../scss/mixins/_border-radius.scss","../../scss/mixins/_transition.scss","../../scss/_code.scss","../../scss/_grid.scss","../../scss/mixins/_grid.scss","../../scss/mixins/_breakpoints.scss","../../scss/mixins/_grid-framework.scss","../../scss/_tables.scss","../../scss/mixins/_table-row.scss","../../scss/_functions.scss","../../scss/_forms.scss","../../scss/mixins/_forms.scss","../../scss/_buttons.scss","../../scss/mixins/_buttons.scss","../../scss/_transitions.scss","../../scss/_dropdown.scss","../../scss/mixins/_nav-divider.scss","../../scss/_button-group.scss","../../scss/_input-group.scss","../../scss/_custom-forms.scss","../../scss/_nav.scss","../../scss/_navbar.scss","../../scss/_card.scss","../../scss/_breadcrumb.scss","../../scss/mixins/_clearfix.scss","../../scss/_pagination.scss","../../scss/mixins/_pagination.scss","../../scss/_badge.scss","../../scss/mixins/_badge.scss","../../scss/_jumbotron.scss","../../scss/_alert.scss","../../scss/mixins/_alert.scss","../../scss/_progress.scss","../../scss/mixins/_gradients.scss","../../scss/_media.scss","../../scss/_list-group.scss","../../scss/mixins/_list-group.scss","../../scss/_close.scss","../../scss/_modal.scss","../../scss/_tooltip.scss","../../scss/mixins/_reset-text.scss","../../scss/_popover.scss","../../scss/_carousel.scss","../../scss/utilities/_align.scss","../../scss/mixins/_background-variant.scss","../../scss/utilities/_background.scss","../../scss/utilities/_borders.scss","../../scss/utilities/_display.scss","../../scss/utilities/_embed.scss","../../scss/utilities/_flex.scss","../../scss/utilities/_float.scss","../../scss/mixins/_float.scss","../../scss/utilities/_position.scss","../../scss/utilities/_screenreaders.scss","../../scss/mixins/_screen-reader.scss","../../scss/utilities/_sizing.scss","../../scss/utilities/_spacing.scss","../../scss/utilities/_text.scss","../../scss/mixins/_text-truncate.scss","../../scss/mixins/_text-emphasis.scss","../../scss/mixins/_text-hide.scss","../../scss/utilities/_visibility.scss","../../scss/mixins/_visibility.scss"],"names":[],"mappings":"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;ADkBD;ECdA,enB6Be;EmB5Bf,8BAA6B;EAC7B,uBAAsB;EACtB,sBnB0Be;CkBbd;;AjBlDC;EkBwCA,YDS4C;ECR5C,0BnBsBa;EmBrBb,sBnBqBa;CC/DQ;;AkB6CvB;EAEE,6CnBgBa;CmBfd;;AAED;EAEE,enBWa;EmBVb,8BAA6B;CAC9B;;AAED;;EAGE,YDV4C;ECW5C,0BnBGa;EmBFb,sBnBEa;CmBDd;;ADdD;ECdA,enBWgB;EmBVhB,8BAA6B;EAC7B,uBAAsB;EACtB,sBnBQgB;CkBKf;;AjBlDC;EkBwCA,YDS4C;ECR5C,0BnBIc;EmBHd,sBnBGc;CC7CO;;AkB6CvB;EAEE,+CnBFc;CmBGf;;AAED;EAEE,enBPc;EmBQd,8BAA6B;CAC9B;;AAED;;EAGE,YDV4C;ECW5C,0BnBfc;EmBgBd,sBnBhBc;CmBiBf;;ADdD;ECdA,enBoCe;EmBnCf,8BAA6B;EAC7B,uBAAsB;EACtB,sBnBiCe;CkBpBd;;AjBlDC;EkBwCA,YDS4C;ECR5C,0BnB6Ba;EmB5Bb,sBnB4Ba;CCtEQ;;AkB6CvB;EAEE,6CnBuBa;CmBtBd;;AAED;EAEE,enBkBa;EmBjBb,8BAA6B;CAC9B;;AAED;;EAGE,YDV4C;ECW5C,0BnBUa;EmBTb,sBnBSa;CmBRd;;ADdD;ECdA,enBsCe;EmBrCf,8BAA6B;EAC7B,uBAAsB;EACtB,sBnBmCe;CkBtBd;;AjBlDC;EkBwCA,YDS4C;ECR5C,0BnB+Ba;EmB9Bb,sBnB8Ba;CCxEQ;;AkB6CvB;EAEE,8CnByBa;CmBxBd;;AAED;EAEE,enBoBa;EmBnBb,8BAA6B;CAC9B;;AAED;;EAGE,YDV4C;ECW5C,0BnBYa;EmBXb,sBnBWa;CmBVd;;ADdD;ECdA,enBmCe;EmBlCf,8BAA6B;EAC7B,uBAAsB;EACtB,sBnBgCe;CkBnBd;;AjBlDC;EkBwCA,YDS4C;ECR5C,0BnB4Ba;EmB3Bb,sBnB2Ba;CCrEQ;;AkB6CvB;EAEE,6CnBsBa;CmBrBd;;AAED;EAEE,enBiBa;EmBhBb,8BAA6B;CAC9B;;AAED;;EAGE,YDV4C;ECW5C,0BnBSa;EmBRb,sBnBQa;CmBPd;;ADdD;ECdA,enBiCe;EmBhCf,8BAA6B;EAC7B,uBAAsB;EACtB,sBnB8Be;CkBjBd;;AjBlDC;EkBwCA,YDS4C;ECR5C,0BnB0Ba;EmBzBb,sBnByBa;CCnEQ;;AkB6CvB;EAEE,6CnBoBa;CmBnBd;;AAED;EAEE,enBea;EmBdb,8BAA6B;CAC9B;;AAED;;EAGE,YDV4C;ECW5C,0BnBOa;EmBNb,sBnBMa;CmBLd;;ADdD;ECdA,enBMgB;EmBLhB,8BAA6B;EAC7B,uBAAsB;EACtB,sBnBGgB;CkBUf;;AjBlDC;EkBwCA,YDS4C;ECR5C,0BnBDc;EmBEd,sBnBFc;CCxCO;;AkB6CvB;EAEE,+CnBPc;CmBQf;;AAED;EAEE,enBZc;EmBad,8BAA6B;CAC9B;;AAED;;EAGE,YDV4C;ECW5C,0BnBpBc;EmBqBd,sBnBrBc;CmBsBf;;ADdD;ECdA,enBagB;EmBZhB,8BAA6B;EAC7B,uBAAsB;EACtB,sBnBUgB;CkBGf;;AjBlDC;EkBwCA,YDS4C;ECR5C,0BnBMc;EmBLd,sBnBKc;CC/CO;;AkB6CvB;EAEE,4CnBAc;CmBCf;;AAED;EAEE,enBLc;EmBMd,8BAA6B;CAC9B;;AAED;;EAGE,YDV4C;ECW5C,0BnBbc;EmBcd,sBnBdc;CmBef;;ADHH;EACE,oBlB0KyB;EkBzKzB,elBEe;EkBDf,iBAAgB;CA8BjB;;AAjCD;EASI,8BAA6B;CAE9B;;AAXH;EAeI,0BAAyB;EACzB,iBAAgB;CACjB;;AjB5EC;EiB8EA,0BAAyB;CjB9EJ;;AAWrB;EiBsEA,elB0E4C;EkBzE5C,2BlB0E6B;EkBzE7B,8BAA6B;CjBrE5B;;AiB6CL;EA2BI,elBzCc;CkB8Cf;;AjBhFC;EiB8EE,sBAAqB;CjB3EtB;;AiBqFL;EChCE,qBnBgQ8B;EmB/P9B,mBnB+JsB;EmB9JtB,iBnBkI0B;EM9MxB,sBNoN0B;CkBxG7B;;AAED;ECpCE,wBnB4P+B;EmB3P/B,oBnBgKsB;EmB/JtB,iBnBmI0B;EM/MxB,sBNqN0B;CkBrG7B;;AAOD;EACE,eAAc;EACd,YAAW;CACZ;;AAGD;EACE,mBlBsNoC;CkBrNrC;;AAGD;;;EAII,YAAW;CACZ;;AE3I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Q,iBAAgB;GAMjB;EA1CP;;IAwCU,iBAAgB;GACjB;C9B+yGV;;A8BnyGD;EAEI,uB5BkZ6B;C4BjZ9B;;AjB3JC;EiBwJJ;IAMI,wB5B2ZyB;Y4B3ZzB,gB5B2ZyB;I4B1ZzB,4B5B2Z+B;Y4B3Z/B,oB5B2Z+B;G4BpZlC;EAdD;IAUM,sBAAqB;IACrB,YAAW;GACZ;C9BsyGJ;;A+BlgHD;EACE,sB7BixBkC;E6BhxBlC,oBAAmB;EACnB,iBAAgB;EAChB,0B7BgDgB;EMhDd,uBNmN2B;C6BhN9B;;ACNC;EACE,eAAc;EACd,YAAW;EACX,YAAW;CACZ;;ADIH;EACE,YAAW;CA2BZ;;AA5BD;EAKI,sBAAqB;EACrB,sB7BowBiC;E6BnwBjC,qB7BmwBiC;E6BlwBjC,e7BuCc;E6BtCd,aAAiC;CAClC;;AAVH;EAmBI,2BAA0B;CAC3B;;AApBH;EAsBI,sBAAqB;CACtB;;AAvBH;EA0BI,e7BqBc;C6BpBf;;AEpCH;EACE,qBAAa;EAAb,cAAa;EAEb,gBAAe;EACf,iBAAgB;EzBAd,uBNmN2B;C+BjN9B;;AAED;EAGM,eAAc;EzBoBhB,gCNwL2B;EMvL3B,mCNuL2B;C+B1M1B;;AALL;EzBSI,iCNsM2B;EMrM3B,oCNqM2B;C+BrM1B;;AAVL;EAcI,WAAU;EACV,Y/B2BS;E+B1BT,0B/BkDa;E+BjDb,sB/BiDa;C+BhDd;;AAlBH;EAqBI,e/B2Bc;E+B1Bd,qBAAoB;EACpB,uB/BmBS;E+BlBT,mB/ByjBuC;C+BxjBxC;;AAGH;EACE,mBAAkB;EAClB,eAAc;EACd,wB/B4hB0C;E+B3hB1C,kBAAiB;EACjB,kB/B+hBwC;E+B9hBxC,e/BgCe;E+B/Bf,uB/BOW;E+BNX,uB/BiiByC;C+BzhB1C;;A9B9BG;E8ByBA,e/BuH4C;E+BtH5C,sBAAqB;EACrB,0B/BGc;E+BFd,mB/B+hBuC;CCxjBtC;;A+BtBH;EACE,wBhCmkBwC;EgClkBxC,mBhCyOoB;EgCxOpB,iBhC4MwB;CgC3MzB;;AAIG;E1BoBF,+BNyL0B;EMxL1B,kCNwL0B;CgC3MvB;;AAGD;E1BCF,gCNuM0B;EMtM1B,mCNsM0B;CgCtMvB;;AAfL;EACE,wBhCikBuC;EgChkBvC,oBhC0OoB;EgCzOpB,iBhC6MwB;CgC5MzB;;AAIG;E1BoBF,+BN0L0B;EMzL1B,kCNyL0B;CgC5MvB;;AAGD;E1BCF,gCNwM0B;EMvM1B,mCNuM0B;CgCvMvB;;ACbP;EACE,sBAAqB;EACrB,sBjC+pBgC;EiC9pBhC,ejC2pB+B;EiC1pB/B,kBjCyOqB;EiCxOrB,eAAc;EACd,YjCuCW;EiCtCX,mBAAkB;EAClB,oBAAmB;EACnB,yBAAwB;E3BVtB,uBNmN2B;CiClM9B;;AAhBD;EAcI,cAAa;CACd;;AAIH;EACE,mBAAkB;EAClB,UAAS;CACV;;AAMD;EACE,qBjCsoBgC;EiCroBhC,oBjCqoBgC;EMpqB9B,qBNuqB+B;CiCtoBlC;;AAOC;ElBiBE,YAAW;EmB3Db,0BlCwEe;CiC5Bd;;AhCxBC;EcuCA,YAAW;EmBtDT,sBAAqB;EACrB,0BAAkC;CjCiBnC;;AgCmBH;ElBiBE,YAAW;EmB3Db,0BlCsDgB;CiCVf;;AhCxBC;EcuCA,YAAW;EmBtDT,sBAAqB;EACrB,0BAAkC;CjCiBnC;;AgCmBH;ElBiBE,YAAW;EmB3Db,0BlC+Ee;CiCnCd;;AhCxBC;EcuCA,YAAW;EmBtDT,sBAAqB;EACrB,0BAAkC;CjCiBnC;;AgCmBH;ElBiBE,YAAW;EmB3Db,0BlCiFe;CiCrCd;;AhCxBC;EcuCA,YAAW;EmBtDT,sBAAqB;EACrB,0BAAkC;CjCiBnC;;AgCmBH;ElBeE,YAAW;EmBzDb,0BlC8Ee;CiClCd;;AhCxBC;EcqCA,YAAW;EmBpDT,sBAAqB;EACrB,0BAAkC;CjCiBnC;;AgCmBH;ElBiBE,YAAW;EmB3Db,0BlC4Ee;CiChCd;;AhCxBC;EcuCA,YAAW;EmBtDT,sBAAqB;EACrB,0BAAkC;CjCiBnC;;AgCmBH;ElBeE,YAAW;EmBzDb,0BlCiDgB;CiCLf;;AhCxBC;EcqCA,YAAW;EmBpDT,sBAAqB;EACrB,0BAAkC;CjCiBnC;;AgCmBH;ElBiBE,YAAW;EmB3Db,0BlCwDgB;CiCZf;;AhCxBC;EcuCA,YAAW;EmBtDT,sBAAqB;EACrB,0BAAkC;CjCiBnC;;AkCzBL;EACE,mBAAoD;EACpD,oBnC4lBmC;EmC3lBnC,0BnCiDgB;EMhDd,sBNoN0B;CmC/M7B;;AxB+CG;EwBxDJ;IAOI,mBnCulBiC;GmCrlBpC;CrCkvHA;;AqChvHD;EACE,iBAAgB;EAChB,gBAAe;E7BTb,iB6BUsB;CACzB;;ACXD;EACE,yBpC6sBmC;EoC5sBnC,oBpC6sBgC;EoC5sBhC,8BAA6C;E9BH3C,uBNmN2B;CoC9M9B;;AAGD;EAEE,eAAc;CACf;;AAGD;EACE,kBpC+NqB;CoC9NtB;;AAOD;EAGI,mBAAkB;EAClB,cpCkrBgC;EoCjrBhC,gBpCkrBiC;EoCjrBjC,yBpCirBiC;EoChrBjC,eAAc;CACf;;AASD;EC3CA,etBsFkE;EsBrFlE,0BtBmFuE;EsBlFvE,sBtBkFuE;CqBvCtE;;ACzCD;EACE,0BAAqC;CACtC;;AAED;EACE,eAA0B;CAC3B;;ADiCD;EC3CA,etBsFkE;EsBrFlE,0BtBmFuE;EsBlFvE,sBtBkFuE;CqBvCtE;;ACzCD;EACE,0BAAqC;CACtC;;AAED;EACE,eAA0B;CAC3B;;ADiCD;EC3CA,etBsFkE;EsBrFlE,0BtBmFuE;EsBlFvE,sBtBkFuE;CqBvCtE;;ACzCD;EACE,0BAAqC;CACtC;;AAED;EACE,eAA0B;CAC3B;;ADiCD;EC3CA,etBsFkE;EsBrFlE,0BtBmFuE;EsBlFvE,sBtBkFuE;CqBvCtE;;ACzCD;EACE,0BAAqC;CACtC;;AAED;EACE,eAA0B;CAC3B;;ADiCD;EC3CA,etBsFkE;EsBrFlE,0BtBmFuE;EsBlFvE,sBtBkFuE;CqBvCtE;;ACzCD;EACE,0BAAqC;CACtC;;AAED;EACE,eAA0B;CAC3B;;ADiCD;EC3CA,etBsFkE;EsBrFlE,0BtBmFuE;EsBlFvE,sBtBkFuE;CqBvCtE;;ACzCD;EACE,0BAAqC;CACtC;;AAED;EACE,eAA0B;CAC3B;;ADiCD;EC3CA,etBsFkE;EsBrFlE,0BtBmFuE;EsBlFvE,sBtBkFuE;CqBvCtE;;ACzCD;EACE,0BAAqC;CACtC;;AAED;EACE,eAA0B;CAC3B;;ADiCD;EC3CA,etBsFkE;EsBrFlE,0BtBmFuE;EsBlFvE,sBtBkFuE;CqBvCtE;;ACzCD;EACE,0BAAqC;CACtC;;AAED;EACE,eAA0B;CAC3B;;ACXH;EACE;IAAO,4BAAuC;GxC44H7C;EwC34HD;IAAK,yBAAwB;GxC84H5B;CACF;;AwCj5HD;EACE;IAAO,4BAAuC;GxC44H7C;EwC34HD;IAAK,yBAAwB;GxC84H5B;CACF;;AwC54HD;EACE,qBAAa;EAAb,cAAa;EACb,iBAAgB;EAChB,mBtCotBoC;EsCntBpC,kBtCktBkC;EsCjtBlC,mBAAkB;EAClB,0BtCyCgB;EMhDd,uBNmN2B;CsCzM9B;;AAED;EACE,atC0sBkC;EsCzsBlC,kBtCysBkC;EsCxsBlC,YtC+BW;EsC9BX,0BtCsDe;EOrEX,4BP8tBwC;CsC7sB7C;;AAED;ECWE,sMAA6I;EDT7I,2BtCisBkC;CsChsBnC;;AAED;EACE,2DtCosBgD;UsCpsBhD,mDtCosBgD;CsCnsBjD;;AE/BD;EACE,qBAAa;EAAb,cAAa;EACb,sBAAuB;MAAvB,wBAAuB;CACxB;;AAED;EACE,YAAO;MAAP,QAAO;CACR;;ACHD;EACE,qBAAa;EAAb,cAAa;EACb,2BAAsB;MAAtB,uBAAsB;EAGtB,gBAAe;EACf,iBAAgB;CACjB;;AAQD;EACE,YAAW;EACX,ezCoCgB;EyCnChB,oBAAmB;CAapB;;AxCbG;EwCIA,ezC+Bc;EyC9Bd,sBAAqB;EACrB,0BzCuBc;CC1Bb;;AwCNL;EAaI,ezC2Bc;EyC1Bd,0BzCmBc;CyClBf;;AAQH;EACE,mBAAkB;EAClB,eAAc;EACd,yBzCgsBsC;EyC9rBtC,oBzCsKgB;EyCrKhB,uBzCEW;EyCDX,uCzCWW;CyCiBZ;;AAnCD;EnChCI,gCN6M2B;EM5M3B,iCN4M2B;CyClK5B;;AAXH;EAcI,iBAAgB;EnChChB,oCN+L2B;EM9L3B,mCN8L2B;CyC7J5B;;AxCpCC;EwCuCA,sBAAqB;CxCpCpB;;AwCiBL;EAwBI,ezCVc;EyCWd,uBzCjBS;CyCkBV;;AA1BH;EA8BI,WAAU;EACV,YzCvBS;EyCwBT,0BzCAa;EyCCb,sBzCDa;CyCEd;;AASH;EAEI,gBAAe;EACf,eAAc;EACd,iBAAgB;CACjB;;AALH;EASM,cAAa;CACd;;AAVL;EAeM,iBAAgB;CACjB;;AClGH;EACE,e3BmFgE;E2BlFhE,0B3BgFqE;C2B/EtE;;AAGD;;EAEE,e3B4EgE;C2BhEjE;;AzCDC;;;EyCRE,e3ByE8D;E2BxE9D,0BAAyC;CzCU1C;;AyChBH;;EAUI,YAAW;EACX,0B3BmE8D;E2BlE9D,sB3BkE8D;C2BjE/D;;AAnBH;EACE,e3BmFgE;E2BlFhE,0B3BgFqE;C2B/EtE;;AAGD;;EAEE,e3B4EgE;C2BhEjE;;AzCDC;;;EyCRE,e3ByE8D;E2BxE9D,0BAAyC;CzCU1C;;AyChBH;;EAUI,YAAW;EACX,0B3BmE8D;E2BlE9D,sB3BkE8D;C2BjE/D;;AAnBH;EACE,e3BmFgE;E2BlFhE,0B3BgFqE;C2B/EtE;;AAGD;;EAEE,e3B4EgE;C2BhEjE;;AzCDC;;;EyCRE,e3ByE8D;E2BxE9D,0BAAyC;CzCU1C;;AyChBH;;EAUI,YAAW;EACX,0B3BmE8D;E2BlE9D,sB3BkE8D;C2BjE/D;;AAnBH;EACE,e3BmFgE;E2BlFhE,0B3BgFqE;C2B/EtE;;AAGD;;EAEE,e3B4EgE;C2BhEjE;;AzCDC;;;EyCRE,e3ByE8D;E2BxE9D,0BAAyC;CzCU1C;;AyChBH;;EAUI,YAAW;EACX,0B3BmE8D;E2BlE9D,sB3BkE8D;C2BjE/D;;AAnBH;EACE,e3BmFgE;E2BlFhE,0B3BgFqE;C2B/EtE;;AAGD;;EAEE,e3B4EgE;C2BhEjE;;AzCDC;;;EyCRE,e3ByE8D;E2BxE9D,0BAAyC;CzCU1C;;AyChBH;;EAUI,YAAW;EACX,0B3BmE8D;E2BlE9D,sB3BkE8D;C2BjE/D;;AAnBH;EACE,e3BmFgE;E2BlFhE,0B3BgFqE;C2B/EtE;;AAGD;;EAEE,e3B4EgE;C2BhEjE;;AzCDC;;;EyCRE,e3ByE8D;E2BxE9D,0BAAyC;CzCU1C;;AyChBH;;EAUI,YAAW;EACX,0B3BmE8D;E2BlE9D,sB3BkE8D;C2BjE/D;;AAnBH;EACE,e3BmFgE;E2BlFhE,0B3BgFqE;C2B/EtE;;AAGD;;EAEE,e3B4EgE;C2BhEjE;;AzCDC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","file":"bootstrap.css","sourcesContent":["/*!\n * Bootstrap v4.0.0-beta (https://getbootstrap.com)\n * Copyright 2011-2017 The Bootstrap Authors\n * Copyright 2011-2017 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n */\n\n@import \"functions\";\n@import \"variables\";\n@import \"mixins\";\n@import \"print\";\n@import \"reboot\";\n@import \"type\";\n@import \"images\";\n@import \"code\";\n@import \"grid\";\n@import \"tables\";\n@import \"forms\";\n@import \"buttons\";\n@import \"transitions\";\n@import \"dropdown\";\n@import \"button-group\";\n@import \"input-group\";\n@import \"custom-forms\";\n@import \"nav\";\n@import \"navbar\";\n@import \"card\";\n@import \"breadcrumb\";\n@import \"pagination\";\n@import \"badge\";\n@import \"jumbotron\";\n@import \"alert\";\n@import \"progress\";\n@import \"media\";\n@import \"list-group\";\n@import \"close\";\n@import \"modal\";\n@import \"tooltip\";\n@import \"popover\";\n@import \"carousel\";\n@import \"utilities\";\n","// scss-lint:disable QualifyingElement\n\n// Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css\n\n// ==========================================================================\n// Print styles.\n// Inlined to avoid the additional HTTP request:\n// http://www.phpied.com/delay-loading-your-print-css/\n// ==========================================================================\n\n@if $enable-print-styles {\n @media print {\n *,\n *::before,\n *::after {\n // Bootstrap specific; comment out `color` and `background`\n //color: #000 !important; // Black prints faster:\n // http://www.sanbeiji.com/archives/953\n text-shadow: none !important;\n //background: transparent !important;\n box-shadow: none !important;\n }\n\n a,\n a:visited {\n text-decoration: underline;\n }\n\n // Bootstrap specific; comment the following selector out\n //a[href]::after {\n // content: \" (\" attr(href) \")\";\n //}\n\n abbr[title]::after {\n content: \" (\" attr(title) \")\";\n }\n\n // Bootstrap specific; comment the following selector out\n //\n // Don't show links that are fragment identifiers,\n // or use the `javascript:` pseudo protocol\n //\n\n //a[href^=\"#\"]::after,\n //a[href^=\"javascript:\"]::after {\n // content: \"\";\n //}\n\n pre {\n white-space: pre-wrap !important;\n }\n pre,\n blockquote {\n border: $border-width solid #999; // Bootstrap custom code; using `$border-width` instead of 1px\n page-break-inside: avoid;\n }\n\n //\n // Printing Tables:\n // http://css-discuss.incutio.com/wiki/Printing_Tables\n //\n\n thead {\n display: table-header-group;\n }\n\n tr,\n img {\n page-break-inside: avoid;\n }\n\n p,\n h2,\n h3 {\n orphans: 3;\n widows: 3;\n }\n\n h2,\n h3 {\n page-break-after: avoid;\n }\n\n // Bootstrap specific changes start\n\n // Bootstrap components\n .navbar {\n display: none;\n }\n .badge {\n border: $border-width solid #000;\n }\n\n .table {\n border-collapse: collapse !important;\n\n td,\n th {\n background-color: #fff !important;\n }\n }\n .table-bordered {\n th,\n td {\n border: 1px solid #ddd !important;\n }\n }\n\n // Bootstrap specific changes end\n }\n}\n","/*!\n * Bootstrap v4.0.0-beta (https://getbootstrap.com)\n * Copyright 2011-2017 The Bootstrap Authors\n * Copyright 2011-2017 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n */\n@media print {\n *,\n *::before,\n *::after {\n text-shadow: none !important;\n box-shadow: none !important;\n }\n a,\n a:visited {\n text-decoration: underline;\n }\n abbr[title]::after {\n content: \" (\" attr(title) \")\";\n }\n pre {\n white-space: pre-wrap !important;\n }\n pre,\n blockquote {\n border: 1px solid #999;\n page-break-inside: avoid;\n }\n thead {\n display: table-header-group;\n }\n tr,\n img {\n page-break-inside: avoid;\n }\n p,\n h2,\n h3 {\n orphans: 3;\n widows: 3;\n }\n h2,\n h3 {\n page-break-after: avoid;\n }\n .navbar {\n display: none;\n }\n .badge {\n border: 1px solid #000;\n }\n .table {\n border-collapse: collapse !important;\n }\n .table td,\n .table th {\n background-color: #fff !important;\n }\n .table-bordered th,\n .table-bordered td {\n border: 1px solid #ddd !important;\n }\n}\n\nhtml {\n box-sizing: border-box;\n font-family: sans-serif;\n line-height: 1.15;\n -webkit-text-size-adjust: 100%;\n -ms-text-size-adjust: 100%;\n -ms-overflow-style: scrollbar;\n -webkit-tap-highlight-color: transparent;\n}\n\n*,\n*::before,\n*::after {\n box-sizing: inherit;\n}\n\n@-ms-viewport {\n width: device-width;\n}\n\narticle, aside, dialog, figcaption, figure, footer, header, hgroup, main, nav, section {\n display: block;\n}\n\nbody {\n margin: 0;\n font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, \"Helvetica Neue\", Arial, sans-serif;\n font-size: 1rem;\n font-weight: normal;\n line-height: 1.5;\n color: #212529;\n background-color: #fff;\n}\n\n[tabindex=\"-1\"]:focus {\n outline: none !important;\n}\n\nhr {\n box-sizing: content-box;\n height: 0;\n overflow: visible;\n}\n\nh1, h2, h3, h4, h5, h6 {\n margin-top: 0;\n margin-bottom: .5rem;\n}\n\np {\n margin-top: 0;\n margin-bottom: 1rem;\n}\n\nabbr[title],\nabbr[data-original-title] {\n text-decoration: underline;\n text-decoration: underline dotted;\n cursor: help;\n border-bottom: 0;\n}\n\naddress {\n margin-bottom: 1rem;\n font-style: normal;\n line-height: inherit;\n}\n\nol,\nul,\ndl {\n margin-top: 0;\n margin-bottom: 1rem;\n}\n\nol ol,\nul ul,\nol ul,\nul ol {\n margin-bottom: 0;\n}\n\ndt {\n font-weight: bold;\n}\n\ndd {\n margin-bottom: .5rem;\n margin-left: 0;\n}\n\nblockquote {\n margin: 0 0 1rem;\n}\n\ndfn {\n font-style: italic;\n}\n\nb,\nstrong {\n font-weight: bolder;\n}\n\nsmall {\n font-size: 80%;\n}\n\nsub,\nsup {\n position: relative;\n font-size: 75%;\n line-height: 0;\n vertical-align: baseline;\n}\n\nsub {\n bottom: -.25em;\n}\n\nsup {\n top: -.5em;\n}\n\na {\n color: #007bff;\n text-decoration: none;\n background-color: transparent;\n -webkit-text-decoration-skip: objects;\n}\n\na:hover {\n color: #0056b3;\n text-decoration: underline;\n}\n\na:not([href]):not([tabindex]) {\n color: inherit;\n text-decoration: none;\n}\n\na:not([href]):not([tabindex]):focus, a:not([href]):not([tabindex]):hover {\n color: inherit;\n text-decoration: none;\n}\n\na:not([href]):not([tabindex]):focus {\n outline: 0;\n}\n\npre,\ncode,\nkbd,\nsamp {\n font-family: monospace, monospace;\n font-size: 1em;\n}\n\npre {\n margin-top: 0;\n margin-bottom: 1rem;\n overflow: auto;\n}\n\nfigure {\n margin: 0 0 1rem;\n}\n\nimg {\n vertical-align: middle;\n border-style: none;\n}\n\nsvg:not(:root) {\n overflow: hidden;\n}\n\na,\narea,\nbutton,\n[role=\"button\"],\ninput,\nlabel,\nselect,\nsummary,\ntextarea {\n touch-action: manipulation;\n}\n\ntable {\n border-collapse: collapse;\n}\n\ncaption {\n padding-top: 0.75rem;\n padding-bottom: 0.75rem;\n color: #868e96;\n text-align: left;\n caption-side: bottom;\n}\n\nth {\n text-align: left;\n}\n\nlabel {\n display: inline-block;\n margin-bottom: .5rem;\n}\n\nbutton:focus {\n outline: 1px dotted;\n outline: 5px auto -webkit-focus-ring-color;\n}\n\ninput,\nbutton,\nselect,\noptgroup,\ntextarea {\n margin: 0;\n font-family: inherit;\n font-size: inherit;\n line-height: inherit;\n}\n\nbutton,\ninput {\n overflow: visible;\n}\n\nbutton,\nselect {\n text-transform: none;\n}\n\nbutton,\nhtml [type=\"button\"],\n[type=\"reset\"],\n[type=\"submit\"] {\n -webkit-appearance: button;\n}\n\nbutton::-moz-focus-inner,\n[type=\"button\"]::-moz-focus-inner,\n[type=\"reset\"]::-moz-focus-inner,\n[type=\"submit\"]::-moz-focus-inner {\n padding: 0;\n border-style: none;\n}\n\ninput[type=\"radio\"],\ninput[type=\"checkbox\"] {\n box-sizing: border-box;\n padding: 0;\n}\n\ninput[type=\"date\"],\ninput[type=\"time\"],\ninput[type=\"datetime-local\"],\ninput[type=\"month\"] {\n -webkit-appearance: listbox;\n}\n\ntextarea {\n overflow: auto;\n resize: vertical;\n}\n\nfieldset {\n min-width: 0;\n padding: 0;\n margin: 0;\n border: 0;\n}\n\nlegend {\n display: block;\n width: 100%;\n max-width: 100%;\n padding: 0;\n margin-bottom: .5rem;\n font-size: 1.5rem;\n line-height: inherit;\n color: inherit;\n white-space: normal;\n}\n\nprogress {\n vertical-align: baseline;\n}\n\n[type=\"number\"]::-webkit-inner-spin-button,\n[type=\"number\"]::-webkit-outer-spin-button {\n height: auto;\n}\n\n[type=\"search\"] {\n outline-offset: -2px;\n -webkit-appearance: none;\n}\n\n[type=\"search\"]::-webkit-search-cancel-button,\n[type=\"search\"]::-webkit-search-decoration {\n -webkit-appearance: none;\n}\n\n::-webkit-file-upload-button {\n font: inherit;\n -webkit-appearance: button;\n}\n\noutput {\n display: inline-block;\n}\n\nsummary {\n display: list-item;\n}\n\ntemplate {\n display: none;\n}\n\n[hidden] {\n display: none !important;\n}\n\nh1, h2, h3, h4, h5, h6,\n.h1, .h2, .h3, .h4, .h5, .h6 {\n margin-bottom: 0.5rem;\n font-family: inherit;\n font-weight: 500;\n line-height: 1.1;\n color: inherit;\n}\n\nh1, .h1 {\n font-size: 2.5rem;\n}\n\nh2, .h2 {\n font-size: 2rem;\n}\n\nh3, .h3 {\n font-size: 1.75rem;\n}\n\nh4, .h4 {\n font-size: 1.5rem;\n}\n\nh5, .h5 {\n font-size: 1.25rem;\n}\n\nh6, .h6 {\n font-size: 1rem;\n}\n\n.lead {\n font-size: 1.25rem;\n font-weight: 300;\n}\n\n.display-1 {\n font-size: 6rem;\n font-weight: 300;\n line-height: 1.1;\n}\n\n.display-2 {\n font-size: 5.5rem;\n font-weight: 300;\n line-height: 1.1;\n}\n\n.display-3 {\n font-size: 4.5rem;\n font-weight: 300;\n line-height: 1.1;\n}\n\n.display-4 {\n font-size: 3.5rem;\n font-weight: 300;\n line-height: 1.1;\n}\n\nhr {\n margin-top: 1rem;\n margin-bottom: 1rem;\n border: 0;\n border-top: 1px solid rgba(0, 0, 0, 0.1);\n}\n\nsmall,\n.small {\n font-size: 80%;\n font-weight: normal;\n}\n\nmark,\n.mark {\n padding: 0.2em;\n background-color: #fcf8e3;\n}\n\n.list-unstyled {\n padding-left: 0;\n list-style: none;\n}\n\n.list-inline {\n padding-left: 0;\n list-style: none;\n}\n\n.list-inline-item {\n display: inline-block;\n}\n\n.list-inline-item:not(:last-child) {\n margin-right: 5px;\n}\n\n.initialism {\n font-size: 90%;\n text-transform: uppercase;\n}\n\n.blockquote {\n margin-bottom: 1rem;\n font-size: 1.25rem;\n}\n\n.blockquote-footer {\n display: block;\n font-size: 80%;\n color: #868e96;\n}\n\n.blockquote-footer::before {\n content: \"\\2014 \\00A0\";\n}\n\n.img-fluid {\n max-width: 100%;\n height: auto;\n}\n\n.img-thumbnail {\n padding: 0.25rem;\n background-color: #fff;\n border: 1px solid #ddd;\n border-radius: 0.25rem;\n transition: all 0.2s ease-in-out;\n max-width: 100%;\n height: auto;\n}\n\n.figure {\n display: inline-block;\n}\n\n.figure-img {\n margin-bottom: 0.5rem;\n line-height: 1;\n}\n\n.figure-caption {\n font-size: 90%;\n color: #868e96;\n}\n\ncode,\nkbd,\npre,\nsamp {\n font-family: Menlo, Monaco, Consolas, \"Liberation Mono\", \"Courier New\", monospace;\n}\n\ncode {\n padding: 0.2rem 0.4rem;\n font-size: 90%;\n color: #bd4147;\n background-color: #f8f9fa;\n border-radius: 0.25rem;\n}\n\na > code {\n padding: 0;\n color: inherit;\n background-color: inherit;\n}\n\nkbd {\n padding: 0.2rem 0.4rem;\n font-size: 90%;\n color: #fff;\n background-color: #212529;\n border-radius: 0.2rem;\n}\n\nkbd kbd {\n padding: 0;\n font-size: 100%;\n font-weight: bold;\n}\n\npre {\n display: block;\n margin-top: 0;\n margin-bottom: 1rem;\n font-size: 90%;\n color: #212529;\n}\n\npre code {\n padding: 0;\n font-size: inherit;\n color: inherit;\n background-color: transparent;\n border-radius: 0;\n}\n\n.pre-scrollable {\n max-height: 340px;\n overflow-y: scroll;\n}\n\n.container {\n margin-right: auto;\n margin-left: auto;\n padding-right: 15px;\n padding-left: 15px;\n width: 100%;\n}\n\n@media (min-width: 576px) {\n .container {\n max-width: 540px;\n }\n}\n\n@media (min-width: 768px) {\n .container {\n max-width: 720px;\n }\n}\n\n@media (min-width: 992px) {\n .container {\n max-width: 960px;\n }\n}\n\n@media (min-width: 1200px) {\n .container {\n max-width: 1140px;\n }\n}\n\n.container-fluid {\n width: 100%;\n margin-right: auto;\n margin-left: auto;\n padding-right: 15px;\n padding-left: 15px;\n width: 100%;\n}\n\n.row {\n display: flex;\n flex-wrap: wrap;\n margin-right: -15px;\n margin-left: -15px;\n}\n\n.no-gutters {\n margin-right: 0;\n margin-left: 0;\n}\n\n.no-gutters > .col,\n.no-gutters > [class*=\"col-\"] {\n padding-right: 0;\n padding-left: 0;\n}\n\n.col-1, .col-2, .col-3, .col-4, .col-5, .col-6, .col-7, .col-8, .col-9, .col-10, .col-11, .col-12, .col,\n.col-auto, .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, .col-sm,\n.col-sm-auto, .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, .col-md,\n.col-md-auto, .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, .col-lg,\n.col-lg-auto, .col-xl-1, .col-xl-2, .col-xl-3, .col-xl-4, .col-xl-5, .col-xl-6, .col-xl-7, .col-xl-8, .col-xl-9, .col-xl-10, .col-xl-11, .col-xl-12, .col-xl,\n.col-xl-auto {\n position: relative;\n width: 100%;\n min-height: 1px;\n padding-right: 15px;\n padding-left: 15px;\n}\n\n.col {\n flex-basis: 0;\n flex-grow: 1;\n max-width: 100%;\n}\n\n.col-auto {\n flex: 0 0 auto;\n width: auto;\n max-width: none;\n}\n\n.col-1 {\n flex: 0 0 8.333333%;\n max-width: 8.333333%;\n}\n\n.col-2 {\n flex: 0 0 16.666667%;\n max-width: 16.666667%;\n}\n\n.col-3 {\n flex: 0 0 25%;\n max-width: 25%;\n}\n\n.col-4 {\n flex: 0 0 33.333333%;\n max-width: 33.333333%;\n}\n\n.col-5 {\n flex: 0 0 41.666667%;\n max-width: 41.666667%;\n}\n\n.col-6 {\n flex: 0 0 50%;\n max-width: 50%;\n}\n\n.col-7 {\n flex: 0 0 58.333333%;\n max-width: 58.333333%;\n}\n\n.col-8 {\n flex: 0 0 66.666667%;\n max-width: 66.666667%;\n}\n\n.col-9 {\n flex: 0 0 75%;\n max-width: 75%;\n}\n\n.col-10 {\n flex: 0 0 83.333333%;\n max-width: 83.333333%;\n}\n\n.col-11 {\n flex: 0 0 91.666667%;\n max-width: 91.666667%;\n}\n\n.col-12 {\n flex: 0 0 100%;\n max-width: 100%;\n}\n\n.order-1 {\n order: 1;\n}\n\n.order-2 {\n order: 2;\n}\n\n.order-3 {\n order: 3;\n}\n\n.order-4 {\n order: 4;\n}\n\n.order-5 {\n order: 5;\n}\n\n.order-6 {\n order: 6;\n}\n\n.order-7 {\n order: 7;\n}\n\n.order-8 {\n order: 8;\n}\n\n.order-9 {\n order: 9;\n}\n\n.order-10 {\n order: 10;\n}\n\n.order-11 {\n order: 11;\n}\n\n.order-12 {\n order: 12;\n}\n\n@media (min-width: 576px) {\n .col-sm {\n flex-basis: 0;\n flex-grow: 1;\n max-width: 100%;\n }\n .col-sm-auto {\n flex: 0 0 auto;\n width: auto;\n max-width: none;\n }\n .col-sm-1 {\n flex: 0 0 8.333333%;\n max-width: 8.333333%;\n }\n .col-sm-2 {\n flex: 0 0 16.666667%;\n max-width: 16.666667%;\n }\n .col-sm-3 {\n flex: 0 0 25%;\n max-width: 25%;\n }\n .col-sm-4 {\n flex: 0 0 33.333333%;\n max-width: 33.333333%;\n }\n .col-sm-5 {\n flex: 0 0 41.666667%;\n max-width: 41.666667%;\n }\n .col-sm-6 {\n flex: 0 0 50%;\n max-width: 50%;\n }\n .col-sm-7 {\n flex: 0 0 58.333333%;\n max-width: 58.333333%;\n }\n .col-sm-8 {\n flex: 0 0 66.666667%;\n max-width: 66.666667%;\n }\n .col-sm-9 {\n flex: 0 0 75%;\n max-width: 75%;\n }\n .col-sm-10 {\n flex: 0 0 83.333333%;\n max-width: 83.333333%;\n }\n .col-sm-11 {\n flex: 0 0 91.666667%;\n max-width: 91.666667%;\n }\n .col-sm-12 {\n flex: 0 0 100%;\n max-width: 100%;\n }\n .order-sm-1 {\n order: 1;\n }\n .order-sm-2 {\n order: 2;\n }\n .order-sm-3 {\n order: 3;\n }\n .order-sm-4 {\n order: 4;\n }\n .order-sm-5 {\n order: 5;\n }\n .order-sm-6 {\n order: 6;\n }\n .order-sm-7 {\n order: 7;\n }\n .order-sm-8 {\n order: 8;\n }\n .order-sm-9 {\n order: 9;\n }\n .order-sm-10 {\n order: 10;\n }\n .order-sm-11 {\n order: 11;\n }\n .order-sm-12 {\n order: 12;\n }\n}\n\n@media (min-width: 768px) {\n .col-md {\n flex-basis: 0;\n flex-grow: 1;\n max-width: 100%;\n }\n .col-md-auto {\n flex: 0 0 auto;\n width: auto;\n max-width: none;\n }\n .col-md-1 {\n flex: 0 0 8.333333%;\n max-width: 8.333333%;\n }\n .col-md-2 {\n flex: 0 0 16.666667%;\n max-width: 16.666667%;\n }\n .col-md-3 {\n flex: 0 0 25%;\n max-width: 25%;\n }\n .col-md-4 {\n flex: 0 0 33.333333%;\n max-width: 33.333333%;\n }\n .col-md-5 {\n flex: 0 0 41.666667%;\n max-width: 41.666667%;\n }\n .col-md-6 {\n flex: 0 0 50%;\n max-width: 50%;\n }\n .col-md-7 {\n flex: 0 0 58.333333%;\n max-width: 58.333333%;\n }\n .col-md-8 {\n flex: 0 0 66.666667%;\n max-width: 66.666667%;\n }\n .col-md-9 {\n flex: 0 0 75%;\n max-width: 75%;\n }\n .col-md-10 {\n flex: 0 0 83.333333%;\n max-width: 83.333333%;\n }\n .col-md-11 {\n flex: 0 0 91.666667%;\n max-width: 91.666667%;\n }\n .col-md-12 {\n flex: 0 0 100%;\n max-width: 100%;\n }\n .order-md-1 {\n order: 1;\n }\n .order-md-2 {\n order: 2;\n }\n .order-md-3 {\n order: 3;\n }\n .order-md-4 {\n order: 4;\n }\n .order-md-5 {\n order: 5;\n }\n .order-md-6 {\n order: 6;\n }\n .order-md-7 {\n order: 7;\n }\n .order-md-8 {\n order: 8;\n }\n .order-md-9 {\n order: 9;\n }\n .order-md-10 {\n order: 10;\n }\n .order-md-11 {\n order: 11;\n }\n .order-md-12 {\n order: 12;\n }\n}\n\n@media (min-width: 992px) {\n .col-lg {\n flex-basis: 0;\n flex-grow: 1;\n max-width: 100%;\n }\n .col-lg-auto {\n flex: 0 0 auto;\n width: auto;\n max-width: none;\n }\n .col-lg-1 {\n flex: 0 0 8.333333%;\n max-width: 8.333333%;\n }\n .col-lg-2 {\n flex: 0 0 16.666667%;\n max-width: 16.666667%;\n }\n .col-lg-3 {\n flex: 0 0 25%;\n max-width: 25%;\n }\n .col-lg-4 {\n flex: 0 0 33.333333%;\n max-width: 33.333333%;\n }\n .col-lg-5 {\n flex: 0 0 41.666667%;\n max-width: 41.666667%;\n }\n .col-lg-6 {\n flex: 0 0 50%;\n max-width: 50%;\n }\n .col-lg-7 {\n flex: 0 0 58.333333%;\n max-width: 58.333333%;\n }\n .col-lg-8 {\n flex: 0 0 66.666667%;\n max-width: 66.666667%;\n }\n .col-lg-9 {\n flex: 0 0 75%;\n max-width: 75%;\n }\n .col-lg-10 {\n flex: 0 0 83.333333%;\n max-width: 83.333333%;\n }\n .col-lg-11 {\n flex: 0 0 91.666667%;\n max-width: 91.666667%;\n }\n .col-lg-12 {\n flex: 0 0 100%;\n max-width: 100%;\n }\n .order-lg-1 {\n order: 1;\n }\n .order-lg-2 {\n order: 2;\n }\n .order-lg-3 {\n order: 3;\n }\n .order-lg-4 {\n order: 4;\n }\n .order-lg-5 {\n order: 5;\n }\n .order-lg-6 {\n order: 6;\n }\n .order-lg-7 {\n order: 7;\n }\n .order-lg-8 {\n order: 8;\n }\n .order-lg-9 {\n order: 9;\n }\n .order-lg-10 {\n order: 10;\n }\n .order-lg-11 {\n order: 11;\n }\n .order-lg-12 {\n order: 12;\n }\n}\n\n@media (min-width: 1200px) {\n .col-xl {\n flex-basis: 0;\n flex-grow: 1;\n max-width: 100%;\n }\n .col-xl-auto {\n flex: 0 0 auto;\n width: auto;\n max-width: none;\n }\n .col-xl-1 {\n flex: 0 0 8.333333%;\n max-width: 8.333333%;\n }\n .col-xl-2 {\n flex: 0 0 16.666667%;\n max-width: 16.666667%;\n }\n .col-xl-3 {\n flex: 0 0 25%;\n max-width: 25%;\n }\n .col-xl-4 {\n flex: 0 0 33.333333%;\n max-width: 33.333333%;\n }\n .col-xl-5 {\n flex: 0 0 41.666667%;\n max-width: 41.666667%;\n }\n .col-xl-6 {\n flex: 0 0 50%;\n max-width: 50%;\n }\n .col-xl-7 {\n flex: 0 0 58.333333%;\n max-width: 58.333333%;\n }\n .col-xl-8 {\n flex: 0 0 66.666667%;\n max-width: 66.666667%;\n }\n .col-xl-9 {\n flex: 0 0 75%;\n max-width: 75%;\n }\n .col-xl-10 {\n flex: 0 0 83.333333%;\n max-width: 83.333333%;\n }\n .col-xl-11 {\n flex: 0 0 91.666667%;\n max-width: 91.666667%;\n }\n .col-xl-12 {\n flex: 0 0 100%;\n max-width: 100%;\n }\n .order-xl-1 {\n order: 1;\n }\n .order-xl-2 {\n order: 2;\n }\n .order-xl-3 {\n order: 3;\n }\n .order-xl-4 {\n order: 4;\n }\n .order-xl-5 {\n order: 5;\n }\n .order-xl-6 {\n order: 6;\n }\n .order-xl-7 {\n order: 7;\n }\n .order-xl-8 {\n order: 8;\n }\n .order-xl-9 {\n order: 9;\n }\n .order-xl-10 {\n order: 10;\n }\n .order-xl-11 {\n order: 11;\n }\n .order-xl-12 {\n order: 12;\n }\n}\n\n.table {\n width: 100%;\n max-width: 100%;\n margin-bottom: 1rem;\n background-color: transparent;\n}\n\n.table th,\n.table td {\n padding: 0.75rem;\n vertical-align: top;\n border-top: 1px solid #e9ecef;\n}\n\n.table thead th {\n vertical-align: bottom;\n border-bottom: 2px solid #e9ecef;\n}\n\n.table tbody + tbody {\n border-top: 2px solid #e9ecef;\n}\n\n.table .table {\n background-color: #fff;\n}\n\n.table-sm th,\n.table-sm td {\n padding: 0.3rem;\n}\n\n.table-bordered {\n border: 1px solid #e9ecef;\n}\n\n.table-bordered th,\n.table-bordered td {\n border: 1px solid #e9ecef;\n}\n\n.table-bordered thead th,\n.table-bordered thead td {\n border-bottom-width: 2px;\n}\n\n.table-striped tbody tr:nth-of-type(odd) {\n background-color: rgba(0, 0, 0, 0.05);\n}\n\n.table-hover tbody tr:hover {\n background-color: rgba(0, 0, 0, 0.075);\n}\n\n.table-primary,\n.table-primary > th,\n.table-primary > td {\n background-color: #b8daff;\n}\n\n.table-hover .table-primary:hover {\n background-color: #9fcdff;\n}\n\n.table-hover .table-primary:hover > td,\n.table-hover .table-primary:hover > th {\n background-color: #9fcdff;\n}\n\n.table-secondary,\n.table-secondary > th,\n.table-secondary > td {\n background-color: #dddfe2;\n}\n\n.table-hover .table-secondary:hover {\n background-color: #cfd2d6;\n}\n\n.table-hover .table-secondary:hover > td,\n.table-hover .table-secondary:hover > th {\n background-color: #cfd2d6;\n}\n\n.table-success,\n.table-success > th,\n.table-success > td {\n background-color: #c3e6cb;\n}\n\n.table-hover .table-success:hover {\n background-color: #b1dfbb;\n}\n\n.table-hover .table-success:hover > td,\n.table-hover .table-success:hover > th {\n background-color: #b1dfbb;\n}\n\n.table-info,\n.table-info > th,\n.table-info > td {\n background-color: #bee5eb;\n}\n\n.table-hover .table-info:hover {\n background-color: #abdde5;\n}\n\n.table-hover .table-info:hover > td,\n.table-hover .table-info:hover > th {\n background-color: #abdde5;\n}\n\n.table-warning,\n.table-warning > th,\n.table-warning > td {\n background-color: #ffeeba;\n}\n\n.table-hover .table-warning:hover {\n background-color: #ffe8a1;\n}\n\n.table-hover .table-warning:hover > td,\n.table-hover .table-warning:hover > th {\n background-color: #ffe8a1;\n}\n\n.table-danger,\n.table-danger > th,\n.table-danger > td {\n background-color: #f5c6cb;\n}\n\n.table-hover .table-danger:hover {\n background-color: #f1b0b7;\n}\n\n.table-hover .table-danger:hover > td,\n.table-hover .table-danger:hover > th {\n background-color: #f1b0b7;\n}\n\n.table-light,\n.table-light > th,\n.table-light > td {\n background-color: #fdfdfe;\n}\n\n.table-hover .table-light:hover {\n background-color: #ececf6;\n}\n\n.table-hover .table-light:hover > td,\n.table-hover .table-light:hover > th {\n background-color: #ececf6;\n}\n\n.table-dark,\n.table-dark > th,\n.table-dark > td {\n background-color: #c6c8ca;\n}\n\n.table-hover .table-dark:hover {\n background-color: #b9bbbe;\n}\n\n.table-hover .table-dark:hover > td,\n.table-hover .table-dark:hover > th {\n background-color: #b9bbbe;\n}\n\n.table-active,\n.table-active > th,\n.table-active > td {\n background-color: rgba(0, 0, 0, 0.075);\n}\n\n.table-hover .table-active:hover {\n background-color: rgba(0, 0, 0, 0.075);\n}\n\n.table-hover .table-active:hover > td,\n.table-hover .table-active:hover > th {\n background-color: rgba(0, 0, 0, 0.075);\n}\n\n.thead-inverse th {\n color: #fff;\n background-color: #212529;\n}\n\n.thead-default th {\n color: #495057;\n background-color: #e9ecef;\n}\n\n.table-inverse {\n color: #fff;\n background-color: #212529;\n}\n\n.table-inverse th,\n.table-inverse td,\n.table-inverse thead th {\n border-color: #32383e;\n}\n\n.table-inverse.table-bordered {\n border: 0;\n}\n\n.table-inverse.table-striped tbody tr:nth-of-type(odd) {\n background-color: rgba(255, 255, 255, 0.05);\n}\n\n.table-inverse.table-hover tbody tr:hover {\n background-color: rgba(255, 255, 255, 0.075);\n}\n\n@media (max-width: 991px) {\n .table-responsive {\n display: block;\n width: 100%;\n overflow-x: auto;\n -ms-overflow-style: -ms-autohiding-scrollbar;\n }\n .table-responsive.table-bordered {\n border: 0;\n }\n}\n\n.form-control {\n display: block;\n width: 100%;\n padding: 0.5rem 0.75rem;\n font-size: 1rem;\n line-height: 1.25;\n color: #495057;\n background-color: #fff;\n background-image: none;\n background-clip: padding-box;\n border: 1px solid rgba(0, 0, 0, 0.15);\n border-radius: 0.25rem;\n transition: border-color ease-in-out 0.15s, box-shadow ease-in-out 0.15s;\n}\n\n.form-control::-ms-expand {\n background-color: transparent;\n border: 0;\n}\n\n.form-control:focus {\n color: #495057;\n background-color: #fff;\n border-color: #80bdff;\n outline: none;\n}\n\n.form-control::placeholder {\n color: #868e96;\n opacity: 1;\n}\n\n.form-control:disabled, .form-control[readonly] {\n background-color: #e9ecef;\n opacity: 1;\n}\n\nselect.form-control:not([size]):not([multiple]) {\n height: calc(2.25rem + 2px);\n}\n\nselect.form-control:focus::-ms-value {\n color: #495057;\n background-color: #fff;\n}\n\n.form-control-file,\n.form-control-range {\n display: block;\n}\n\n.col-form-label {\n padding-top: calc(0.5rem - 1px * 2);\n padding-bottom: calc(0.5rem - 1px * 2);\n margin-bottom: 0;\n}\n\n.col-form-label-lg {\n padding-top: calc(0.5rem - 1px * 2);\n padding-bottom: calc(0.5rem - 1px * 2);\n font-size: 1.25rem;\n}\n\n.col-form-label-sm {\n padding-top: calc(0.25rem - 1px * 2);\n padding-bottom: calc(0.25rem - 1px * 2);\n font-size: 0.875rem;\n}\n\n.col-form-legend {\n padding-top: 0.5rem;\n padding-bottom: 0.5rem;\n margin-bottom: 0;\n font-size: 1rem;\n}\n\n.form-control-plaintext {\n padding-top: 0.5rem;\n padding-bottom: 0.5rem;\n margin-bottom: 0;\n line-height: 1.25;\n border: solid transparent;\n border-width: 1px 0;\n}\n\n.form-control-plaintext.form-control-sm, .input-group-sm > .form-control-plaintext.form-control,\n.input-group-sm > .form-control-plaintext.input-group-addon,\n.input-group-sm > .input-group-btn > .form-control-plaintext.btn, .form-control-plaintext.form-control-lg, .input-group-lg > .form-control-plaintext.form-control,\n.input-group-lg > .form-control-plaintext.input-group-addon,\n.input-group-lg > .input-group-btn > .form-control-plaintext.btn {\n padding-right: 0;\n padding-left: 0;\n}\n\n.form-control-sm, .input-group-sm > .form-control,\n.input-group-sm > .input-group-addon,\n.input-group-sm > .input-group-btn > .btn {\n padding: 0.25rem 0.5rem;\n font-size: 0.875rem;\n line-height: 1.5;\n border-radius: 0.2rem;\n}\n\nselect.form-control-sm:not([size]):not([multiple]), .input-group-sm > select.form-control:not([size]):not([multiple]),\n.input-group-sm > select.input-group-addon:not([size]):not([multiple]),\n.input-group-sm > .input-group-btn > select.btn:not([size]):not([multiple]) {\n height: calc(1.8125rem + 2px);\n}\n\n.form-control-lg, .input-group-lg > .form-control,\n.input-group-lg > .input-group-addon,\n.input-group-lg > .input-group-btn > .btn {\n padding: 0.5rem 1rem;\n font-size: 1.25rem;\n line-height: 1.5;\n border-radius: 0.3rem;\n}\n\nselect.form-control-lg:not([size]):not([multiple]), .input-group-lg > select.form-control:not([size]):not([multiple]),\n.input-group-lg > select.input-group-addon:not([size]):not([multiple]),\n.input-group-lg > .input-group-btn > select.btn:not([size]):not([multiple]) {\n height: calc(2.3125rem + 2px);\n}\n\n.form-group {\n margin-bottom: 1rem;\n}\n\n.form-text {\n display: block;\n margin-top: 0.25rem;\n}\n\n.form-row {\n display: flex;\n flex-wrap: wrap;\n margin-right: -5px;\n margin-left: -5px;\n}\n\n.form-row > .col,\n.form-row > [class*=\"col-\"] {\n padding-right: 5px;\n padding-left: 5px;\n}\n\n.form-check {\n position: relative;\n display: block;\n margin-bottom: 0.5rem;\n}\n\n.form-check.disabled .form-check-label {\n color: #868e96;\n}\n\n.form-check-label {\n padding-left: 1.25rem;\n margin-bottom: 0;\n}\n\n.form-check-input {\n position: absolute;\n margin-top: 0.25rem;\n margin-left: -1.25rem;\n}\n\n.form-check-input:only-child {\n position: static;\n}\n\n.form-check-inline {\n display: inline-block;\n}\n\n.form-check-inline .form-check-label {\n vertical-align: middle;\n}\n\n.form-check-inline + .form-check-inline {\n margin-left: 0.75rem;\n}\n\n.invalid-feedback {\n display: none;\n margin-top: .25rem;\n font-size: .875rem;\n color: #dc3545;\n}\n\n.invalid-tooltip {\n position: absolute;\n top: 100%;\n z-index: 5;\n display: none;\n width: 250px;\n padding: .5rem;\n margin-top: .1rem;\n font-size: .875rem;\n line-height: 1;\n color: #fff;\n background-color: rgba(220, 53, 69, 0.8);\n border-radius: .2rem;\n}\n\n.was-validated .form-control:valid, .form-control.is-valid, .was-validated\n.custom-select:valid,\n.custom-select.is-valid {\n border-color: #28a745;\n}\n\n.was-validated .form-control:valid:focus, .form-control.is-valid:focus, .was-validated\n.custom-select:valid:focus,\n.custom-select.is-valid:focus {\n box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.25);\n}\n\n.was-validated .form-control:valid ~ .invalid-feedback,\n.was-validated .form-control:valid ~ .invalid-tooltip, .form-control.is-valid ~ .invalid-feedback,\n.form-control.is-valid ~ .invalid-tooltip, .was-validated\n.custom-select:valid ~ .invalid-feedback,\n.was-validated\n.custom-select:valid ~ .invalid-tooltip,\n.custom-select.is-valid ~ .invalid-feedback,\n.custom-select.is-valid ~ .invalid-tooltip {\n display: block;\n}\n\n.was-validated .form-check-input:valid + .form-check-label, .form-check-input.is-valid + .form-check-label {\n color: #28a745;\n}\n\n.was-validated .custom-control-input:valid ~ .custom-control-indicator, .custom-control-input.is-valid ~ .custom-control-indicator {\n background-color: rgba(40, 167, 69, 0.25);\n}\n\n.was-validated .custom-control-input:valid ~ .custom-control-description, .custom-control-input.is-valid ~ .custom-control-description {\n color: #28a745;\n}\n\n.was-validated .custom-file-input:valid ~ .custom-file-control, .custom-file-input.is-valid ~ .custom-file-control {\n border-color: #28a745;\n}\n\n.was-validated .custom-file-input:valid ~ .custom-file-control::before, .custom-file-input.is-valid ~ .custom-file-control::before {\n border-color: inherit;\n}\n\n.was-validated .custom-file-input:valid:focus, .custom-file-input.is-valid:focus {\n box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.25);\n}\n\n.was-validated .form-control:invalid, .form-control.is-invalid, .was-validated\n.custom-select:invalid,\n.custom-select.is-invalid {\n border-color: #dc3545;\n}\n\n.was-validated .form-control:invalid:focus, .form-control.is-invalid:focus, .was-validated\n.custom-select:invalid:focus,\n.custom-select.is-invalid:focus {\n box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.25);\n}\n\n.was-validated .form-control:invalid ~ .invalid-feedback,\n.was-validated .form-control:invalid ~ .invalid-tooltip, .form-control.is-invalid ~ .invalid-feedback,\n.form-control.is-invalid ~ .invalid-tooltip, .was-validated\n.custom-select:invalid ~ .invalid-feedback,\n.was-validated\n.custom-select:invalid ~ .invalid-tooltip,\n.custom-select.is-invalid ~ .invalid-feedback,\n.custom-select.is-invalid ~ .invalid-tooltip {\n display: block;\n}\n\n.was-validated .form-check-input:invalid + .form-check-label, .form-check-input.is-invalid + .form-check-label {\n color: #dc3545;\n}\n\n.was-validated .custom-control-input:invalid ~ .custom-control-indicator, .custom-control-input.is-invalid ~ .custom-control-indicator {\n background-color: rgba(220, 53, 69, 0.25);\n}\n\n.was-validated .custom-control-input:invalid ~ .custom-control-description, .custom-control-input.is-invalid ~ .custom-control-description {\n color: #dc3545;\n}\n\n.was-validated .custom-file-input:invalid ~ .custom-file-control, .custom-file-input.is-invalid ~ .custom-file-control {\n border-color: #dc3545;\n}\n\n.was-validated .custom-file-input:invalid ~ .custom-file-control::before, .custom-file-input.is-invalid ~ .custom-file-control::before {\n border-color: inherit;\n}\n\n.was-validated .custom-file-input:invalid:focus, .custom-file-input.is-invalid:focus {\n box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.25);\n}\n\n.form-inline {\n display: flex;\n flex-flow: row wrap;\n align-items: center;\n}\n\n.form-inline .form-check {\n width: 100%;\n}\n\n@media (min-width: 576px) {\n .form-inline label {\n display: flex;\n align-items: center;\n justify-content: center;\n margin-bottom: 0;\n }\n .form-inline .form-group {\n display: flex;\n flex: 0 0 auto;\n flex-flow: row wrap;\n align-items: center;\n margin-bottom: 0;\n }\n .form-inline .form-control {\n display: inline-block;\n width: auto;\n vertical-align: middle;\n }\n .form-inline .form-control-plaintext {\n display: inline-block;\n }\n .form-inline .input-group {\n width: auto;\n }\n .form-inline .form-control-label {\n margin-bottom: 0;\n vertical-align: middle;\n }\n .form-inline .form-check {\n display: flex;\n align-items: center;\n justify-content: center;\n width: auto;\n margin-top: 0;\n margin-bottom: 0;\n }\n .form-inline .form-check-label {\n padding-left: 0;\n }\n .form-inline .form-check-input {\n position: relative;\n margin-top: 0;\n margin-right: 0.25rem;\n margin-left: 0;\n }\n .form-inline .custom-control {\n display: flex;\n align-items: center;\n justify-content: center;\n padding-left: 0;\n }\n .form-inline .custom-control-indicator {\n position: static;\n display: inline-block;\n margin-right: 0.25rem;\n vertical-align: text-bottom;\n }\n .form-inline .has-feedback .form-control-feedback {\n top: 0;\n }\n}\n\n.btn {\n display: inline-block;\n font-weight: normal;\n text-align: center;\n white-space: nowrap;\n vertical-align: middle;\n user-select: none;\n border: 1px solid transparent;\n padding: 0.5rem 0.75rem;\n font-size: 1rem;\n line-height: 1.25;\n border-radius: 0.25rem;\n transition: all 0.15s ease-in-out;\n}\n\n.btn:focus, .btn:hover {\n text-decoration: none;\n}\n\n.btn:focus, .btn.focus {\n outline: 0;\n box-shadow: 0 0 0 3px rgba(0, 123, 255, 0.25);\n}\n\n.btn.disabled, .btn:disabled {\n opacity: .65;\n}\n\n.btn:active, .btn.active {\n background-image: none;\n}\n\na.btn.disabled,\nfieldset[disabled] a.btn {\n pointer-events: none;\n}\n\n.btn-primary {\n color: #fff;\n background-color: #007bff;\n border-color: #007bff;\n}\n\n.btn-primary:hover {\n color: #fff;\n background-color: #0069d9;\n border-color: #0062cc;\n}\n\n.btn-primary:focus, .btn-primary.focus {\n box-shadow: 0 0 0 3px rgba(0, 123, 255, 0.5);\n}\n\n.btn-primary.disabled, .btn-primary:disabled {\n background-color: #007bff;\n border-color: #007bff;\n}\n\n.btn-primary:active, .btn-primary.active,\n.show > .btn-primary.dropdown-toggle {\n background-color: #0069d9;\n background-image: none;\n border-color: #0062cc;\n}\n\n.btn-secondary {\n color: #fff;\n background-color: #868e96;\n border-color: #868e96;\n}\n\n.btn-secondary:hover {\n color: #fff;\n background-color: #727b84;\n border-color: #6c757d;\n}\n\n.btn-secondary:focus, .btn-secondary.focus {\n box-shadow: 0 0 0 3px rgba(134, 142, 150, 0.5);\n}\n\n.btn-secondary.disabled, .btn-secondary:disabled {\n background-color: #868e96;\n border-color: #868e96;\n}\n\n.btn-secondary:active, .btn-secondary.active,\n.show > .btn-secondary.dropdown-toggle {\n background-color: #727b84;\n background-image: none;\n border-color: #6c757d;\n}\n\n.btn-success {\n color: #fff;\n background-color: #28a745;\n border-color: #28a745;\n}\n\n.btn-success:hover {\n color: #fff;\n background-color: #218838;\n border-color: #1e7e34;\n}\n\n.btn-success:focus, .btn-success.focus {\n box-shadow: 0 0 0 3px rgba(40, 167, 69, 0.5);\n}\n\n.btn-success.disabled, .btn-success:disabled {\n background-color: #28a745;\n border-color: #28a745;\n}\n\n.btn-success:active, .btn-success.active,\n.show > .btn-success.dropdown-toggle {\n background-color: #218838;\n background-image: none;\n border-color: #1e7e34;\n}\n\n.btn-info {\n color: #fff;\n background-color: #17a2b8;\n border-color: #17a2b8;\n}\n\n.btn-info:hover {\n color: #fff;\n background-color: #138496;\n border-color: #117a8b;\n}\n\n.btn-info:focus, .btn-info.focus {\n box-shadow: 0 0 0 3px rgba(23, 162, 184, 0.5);\n}\n\n.btn-info.disabled, .btn-info:disabled {\n background-color: #17a2b8;\n border-color: #17a2b8;\n}\n\n.btn-info:active, .btn-info.active,\n.show > .btn-info.dropdown-toggle {\n background-color: #138496;\n background-image: none;\n border-color: #117a8b;\n}\n\n.btn-warning {\n color: #111;\n background-color: #ffc107;\n border-color: #ffc107;\n}\n\n.btn-warning:hover {\n color: #111;\n background-color: #e0a800;\n border-color: #d39e00;\n}\n\n.btn-warning:focus, .btn-warning.focus {\n box-shadow: 0 0 0 3px rgba(255, 193, 7, 0.5);\n}\n\n.btn-warning.disabled, .btn-warning:disabled {\n background-color: #ffc107;\n border-color: #ffc107;\n}\n\n.btn-warning:active, .btn-warning.active,\n.show > .btn-warning.dropdown-toggle {\n background-color: #e0a800;\n background-image: none;\n border-color: #d39e00;\n}\n\n.btn-danger {\n color: #fff;\n background-color: #dc3545;\n border-color: #dc3545;\n}\n\n.btn-danger:hover {\n color: #fff;\n background-color: #c82333;\n border-color: #bd2130;\n}\n\n.btn-danger:focus, .btn-danger.focus {\n box-shadow: 0 0 0 3px rgba(220, 53, 69, 0.5);\n}\n\n.btn-danger.disabled, .btn-danger:disabled {\n background-color: #dc3545;\n border-color: #dc3545;\n}\n\n.btn-danger:active, .btn-danger.active,\n.show > .btn-danger.dropdown-toggle {\n background-color: #c82333;\n background-image: none;\n border-color: #bd2130;\n}\n\n.btn-light {\n color: #111;\n background-color: #f8f9fa;\n border-color: #f8f9fa;\n}\n\n.btn-light:hover {\n color: #111;\n background-color: #e2e6ea;\n border-color: #dae0e5;\n}\n\n.btn-light:focus, .btn-light.focus {\n box-shadow: 0 0 0 3px rgba(248, 249, 250, 0.5);\n}\n\n.btn-light.disabled, .btn-light:disabled {\n background-color: #f8f9fa;\n border-color: #f8f9fa;\n}\n\n.btn-light:active, .btn-light.active,\n.show > .btn-light.dropdown-toggle {\n background-color: #e2e6ea;\n background-image: none;\n border-color: #dae0e5;\n}\n\n.btn-dark {\n color: #fff;\n background-color: #343a40;\n border-color: #343a40;\n}\n\n.btn-dark:hover {\n color: #fff;\n background-color: #23272b;\n border-color: #1d2124;\n}\n\n.btn-dark:focus, .btn-dark.focus {\n box-shadow: 0 0 0 3px rgba(52, 58, 64, 0.5);\n}\n\n.btn-dark.disabled, .btn-dark:disabled {\n background-color: #343a40;\n border-color: #343a40;\n}\n\n.btn-dark:active, .btn-dark.active,\n.show > .btn-dark.dropdown-toggle {\n background-color: #23272b;\n background-image: none;\n border-color: #1d2124;\n}\n\n.btn-outline-primary {\n color: #007bff;\n background-color: transparent;\n background-image: none;\n border-color: #007bff;\n}\n\n.btn-outline-primary:hover {\n color: #fff;\n background-color: #007bff;\n border-color: #007bff;\n}\n\n.btn-outline-primary:focus, .btn-outline-primary.focus {\n box-shadow: 0 0 0 3px rgba(0, 123, 255, 0.5);\n}\n\n.btn-outline-primary.disabled, .btn-outline-primary:disabled {\n color: #007bff;\n background-color: transparent;\n}\n\n.btn-outline-primary:active, .btn-outline-primary.active,\n.show > .btn-outline-primary.dropdown-toggle {\n color: #fff;\n background-color: #007bff;\n border-color: #007bff;\n}\n\n.btn-outline-secondary {\n color: #868e96;\n background-color: transparent;\n background-image: none;\n border-color: #868e96;\n}\n\n.btn-outline-secondary:hover {\n color: #fff;\n background-color: #868e96;\n border-color: #868e96;\n}\n\n.btn-outline-secondary:focus, .btn-outline-secondary.focus {\n box-shadow: 0 0 0 3px rgba(134, 142, 150, 0.5);\n}\n\n.btn-outline-secondary.disabled, .btn-outline-secondary:disabled {\n color: #868e96;\n background-color: transparent;\n}\n\n.btn-outline-secondary:active, .btn-outline-secondary.active,\n.show > .btn-outline-secondary.dropdown-toggle {\n color: #fff;\n background-color: #868e96;\n border-color: #868e96;\n}\n\n.btn-outline-success {\n color: #28a745;\n background-color: transparent;\n background-image: none;\n border-color: #28a745;\n}\n\n.btn-outline-success:hover {\n color: #fff;\n background-color: #28a745;\n border-color: #28a745;\n}\n\n.btn-outline-success:focus, .btn-outline-success.focus {\n box-shadow: 0 0 0 3px rgba(40, 167, 69, 0.5);\n}\n\n.btn-outline-success.disabled, .btn-outline-success:disabled {\n color: #28a745;\n background-color: transparent;\n}\n\n.btn-outline-success:active, .btn-outline-success.active,\n.show > .btn-outline-success.dropdown-toggle {\n color: #fff;\n background-color: #28a745;\n border-color: #28a745;\n}\n\n.btn-outline-info {\n color: #17a2b8;\n background-color: transparent;\n background-image: none;\n border-color: #17a2b8;\n}\n\n.btn-outline-info:hover {\n color: #fff;\n background-color: #17a2b8;\n border-color: #17a2b8;\n}\n\n.btn-outline-info:focus, .btn-outline-info.focus {\n box-shadow: 0 0 0 3px rgba(23, 162, 184, 0.5);\n}\n\n.btn-outline-info.disabled, .btn-outline-info:disabled {\n color: #17a2b8;\n background-color: transparent;\n}\n\n.btn-outline-info:active, .btn-outline-info.active,\n.show > .btn-outline-info.dropdown-toggle {\n color: #fff;\n background-color: #17a2b8;\n border-color: #17a2b8;\n}\n\n.btn-outline-warning {\n color: #ffc107;\n background-color: transparent;\n background-image: none;\n border-color: #ffc107;\n}\n\n.btn-outline-warning:hover {\n color: #fff;\n background-color: #ffc107;\n border-color: #ffc107;\n}\n\n.btn-outline-warning:focus, .btn-outline-warning.focus {\n box-shadow: 0 0 0 3px rgba(255, 193, 7, 0.5);\n}\n\n.btn-outline-warning.disabled, .btn-outline-warning:disabled {\n color: #ffc107;\n background-color: transparent;\n}\n\n.btn-outline-warning:active, .btn-outline-warning.active,\n.show > .btn-outline-warning.dropdown-toggle {\n color: #fff;\n background-color: #ffc107;\n border-color: #ffc107;\n}\n\n.btn-outline-danger {\n color: #dc3545;\n background-color: transparent;\n background-image: none;\n border-color: #dc3545;\n}\n\n.btn-outline-danger:hover {\n color: #fff;\n background-color: #dc3545;\n border-color: #dc3545;\n}\n\n.btn-outline-danger:focus, .btn-outline-danger.focus {\n box-shadow: 0 0 0 3px rgba(220, 53, 69, 0.5);\n}\n\n.btn-outline-danger.disabled, .btn-outline-danger:disabled {\n color: #dc3545;\n background-color: transparent;\n}\n\n.btn-outline-danger:active, .btn-outline-danger.active,\n.show > .btn-outline-danger.dropdown-toggle {\n color: #fff;\n background-color: #dc3545;\n border-color: #dc3545;\n}\n\n.btn-outline-light {\n color: #f8f9fa;\n background-color: transparent;\n background-image: none;\n border-color: #f8f9fa;\n}\n\n.btn-outline-light:hover {\n color: #fff;\n background-color: #f8f9fa;\n border-color: #f8f9fa;\n}\n\n.btn-outline-light:focus, .btn-outline-light.focus {\n box-shadow: 0 0 0 3px rgba(248, 249, 250, 0.5);\n}\n\n.btn-outline-light.disabled, .btn-outline-light:disabled {\n color: #f8f9fa;\n background-color: transparent;\n}\n\n.btn-outline-light:active, .btn-outline-light.active,\n.show > .btn-outline-light.dropdown-toggle {\n color: #fff;\n background-color: #f8f9fa;\n border-color: #f8f9fa;\n}\n\n.btn-outline-dark {\n color: #343a40;\n background-color: transparent;\n background-image: none;\n border-color: #343a40;\n}\n\n.btn-outline-dark:hover {\n color: #fff;\n background-color: #343a40;\n border-color: #343a40;\n}\n\n.btn-outline-dark:focus, .btn-outline-dark.focus {\n box-shadow: 0 0 0 3px rgba(52, 58, 64, 0.5);\n}\n\n.btn-outline-dark.disabled, .btn-outline-dark:disabled {\n color: #343a40;\n background-color: transparent;\n}\n\n.btn-outline-dark:active, .btn-outline-dark.active,\n.show > .btn-outline-dark.dropdown-toggle {\n color: #fff;\n background-color: #343a40;\n border-color: #343a40;\n}\n\n.btn-link {\n font-weight: normal;\n color: #007bff;\n border-radius: 0;\n}\n\n.btn-link, .btn-link:active, .btn-link.active, .btn-link:disabled {\n background-color: transparent;\n}\n\n.btn-link, .btn-link:focus, .btn-link:active {\n border-color: transparent;\n box-shadow: none;\n}\n\n.btn-link:hover {\n border-color: transparent;\n}\n\n.btn-link:focus, .btn-link:hover {\n color: #0056b3;\n text-decoration: underline;\n background-color: transparent;\n}\n\n.btn-link:disabled {\n color: #868e96;\n}\n\n.btn-link:disabled:focus, .btn-link:disabled:hover {\n text-decoration: none;\n}\n\n.btn-lg, .btn-group-lg > .btn {\n padding: 0.5rem 1rem;\n font-size: 1.25rem;\n line-height: 1.5;\n border-radius: 0.3rem;\n}\n\n.btn-sm, .btn-group-sm > .btn {\n padding: 0.25rem 0.5rem;\n font-size: 0.875rem;\n line-height: 1.5;\n border-radius: 0.2rem;\n}\n\n.btn-block {\n display: block;\n width: 100%;\n}\n\n.btn-block + .btn-block {\n margin-top: 0.5rem;\n}\n\ninput[type=\"submit\"].btn-block,\ninput[type=\"reset\"].btn-block,\ninput[type=\"button\"].btn-block {\n width: 100%;\n}\n\n.fade {\n opacity: 0;\n transition: opacity 0.15s linear;\n}\n\n.fade.show {\n opacity: 1;\n}\n\n.collapse {\n display: none;\n}\n\n.collapse.show {\n display: block;\n}\n\ntr.collapse.show {\n display: table-row;\n}\n\ntbody.collapse.show {\n display: table-row-group;\n}\n\n.collapsing {\n position: relative;\n height: 0;\n overflow: hidden;\n transition: height 0.35s ease;\n}\n\n.dropup,\n.dropdown {\n position: relative;\n}\n\n.dropdown-toggle::after {\n display: inline-block;\n width: 0;\n height: 0;\n margin-left: 0.255em;\n vertical-align: 0.255em;\n content: \"\";\n border-top: 0.3em solid;\n border-right: 0.3em solid transparent;\n border-left: 0.3em solid transparent;\n}\n\n.dropdown-toggle:empty::after {\n margin-left: 0;\n}\n\n.dropup .dropdown-menu {\n margin-top: 0;\n margin-bottom: 0.125rem;\n}\n\n.dropup .dropdown-toggle::after {\n border-top: 0;\n border-bottom: 0.3em solid;\n}\n\n.dropdown-menu {\n position: absolute;\n top: 100%;\n left: 0;\n z-index: 1000;\n display: none;\n float: left;\n min-width: 10rem;\n padding: 0.5rem 0;\n margin: 0.125rem 0 0;\n font-size: 1rem;\n color: #212529;\n text-align: left;\n list-style: none;\n background-color: #fff;\n background-clip: padding-box;\n border: 1px solid rgba(0, 0, 0, 0.15);\n border-radius: 0.25rem;\n}\n\n.dropdown-divider {\n height: 0;\n margin: 0.5rem 0;\n overflow: hidden;\n border-top: 1px solid #e9ecef;\n}\n\n.dropdown-item {\n display: block;\n width: 100%;\n padding: 0.25rem 1.5rem;\n clear: both;\n font-weight: normal;\n color: #212529;\n text-align: inherit;\n white-space: nowrap;\n background: none;\n border: 0;\n}\n\n.dropdown-item:focus, .dropdown-item:hover {\n color: #16181b;\n text-decoration: none;\n background-color: #f8f9fa;\n}\n\n.dropdown-item.active, .dropdown-item:active {\n color: #fff;\n text-decoration: none;\n background-color: #007bff;\n}\n\n.dropdown-item.disabled, .dropdown-item:disabled {\n color: #868e96;\n background-color: transparent;\n}\n\n.show > a {\n outline: 0;\n}\n\n.dropdown-menu.show {\n display: block;\n}\n\n.dropdown-header {\n display: block;\n padding: 0.5rem 1.5rem;\n margin-bottom: 0;\n font-size: 0.875rem;\n color: #868e96;\n white-space: nowrap;\n}\n\n.btn-group,\n.btn-group-vertical {\n position: relative;\n display: inline-flex;\n vertical-align: middle;\n}\n\n.btn-group > .btn,\n.btn-group-vertical > .btn {\n position: relative;\n flex: 0 1 auto;\n margin-bottom: 0;\n}\n\n.btn-group > .btn:hover,\n.btn-group-vertical > .btn:hover {\n z-index: 2;\n}\n\n.btn-group > .btn:focus, .btn-group > .btn:active, .btn-group > .btn.active,\n.btn-group-vertical > .btn:focus,\n.btn-group-vertical > .btn:active,\n.btn-group-vertical > .btn.active {\n z-index: 2;\n}\n\n.btn-group .btn + .btn,\n.btn-group .btn + .btn-group,\n.btn-group .btn-group + .btn,\n.btn-group .btn-group + .btn-group,\n.btn-group-vertical .btn + .btn,\n.btn-group-vertical .btn + .btn-group,\n.btn-group-vertical .btn-group + .btn,\n.btn-group-vertical .btn-group + .btn-group {\n margin-left: -1px;\n}\n\n.btn-toolbar {\n display: flex;\n flex-wrap: wrap;\n justify-content: flex-start;\n}\n\n.btn-toolbar .input-group {\n width: auto;\n}\n\n.btn-group > .btn:not(:first-child):not(:last-child):not(.dropdown-toggle) {\n border-radius: 0;\n}\n\n.btn-group > .btn:first-child {\n margin-left: 0;\n}\n\n.btn-group > .btn:first-child:not(:last-child):not(.dropdown-toggle) {\n border-top-right-radius: 0;\n border-bottom-right-radius: 0;\n}\n\n.btn-group > .btn:last-child:not(:first-child),\n.btn-group > .dropdown-toggle:not(:first-child) {\n border-top-left-radius: 0;\n border-bottom-left-radius: 0;\n}\n\n.btn-group > .btn-group {\n float: left;\n}\n\n.btn-group > .btn-group:not(:first-child):not(:last-child) > .btn {\n border-radius: 0;\n}\n\n.btn-group > .btn-group:first-child:not(:last-child) > .btn:last-child,\n.btn-group > .btn-group:first-child:not(:last-child) > .dropdown-toggle {\n border-top-right-radius: 0;\n border-bottom-right-radius: 0;\n}\n\n.btn-group > .btn-group:last-child:not(:first-child) > .btn:first-child {\n border-top-left-radius: 0;\n border-bottom-left-radius: 0;\n}\n\n.btn + .dropdown-toggle-split {\n padding-right: 0.5625rem;\n padding-left: 0.5625rem;\n}\n\n.btn + .dropdown-toggle-split::after {\n margin-left: 0;\n}\n\n.btn-sm + .dropdown-toggle-split, .btn-group-sm > .btn + .dropdown-toggle-split {\n padding-right: 0.375rem;\n padding-left: 0.375rem;\n}\n\n.btn-lg + .dropdown-toggle-split, .btn-group-lg > .btn + .dropdown-toggle-split {\n padding-right: 0.75rem;\n padding-left: 0.75rem;\n}\n\n.btn-group-vertical {\n display: inline-flex;\n flex-direction: column;\n align-items: flex-start;\n justify-content: center;\n}\n\n.btn-group-vertical .btn,\n.btn-group-vertical .btn-group {\n width: 100%;\n}\n\n.btn-group-vertical > .btn + .btn,\n.btn-group-vertical > .btn + .btn-group,\n.btn-group-vertical > .btn-group + .btn,\n.btn-group-vertical > .btn-group + .btn-group {\n margin-top: -1px;\n margin-left: 0;\n}\n\n.btn-group-vertical > .btn:not(:first-child):not(:last-child) {\n border-radius: 0;\n}\n\n.btn-group-vertical > .btn:first-child:not(:last-child) {\n border-bottom-right-radius: 0;\n border-bottom-left-radius: 0;\n}\n\n.btn-group-vertical > .btn:last-child:not(:first-child) {\n border-top-left-radius: 0;\n border-top-right-radius: 0;\n}\n\n.btn-group-vertical > .btn-group:not(:first-child):not(:last-child) > .btn {\n border-radius: 0;\n}\n\n.btn-group-vertical > .btn-group:first-child:not(:last-child) > .btn:last-child,\n.btn-group-vertical > .btn-group:first-child:not(:last-child) > .dropdown-toggle {\n border-bottom-right-radius: 0;\n border-bottom-left-radius: 0;\n}\n\n.btn-group-vertical > .btn-group:last-child:not(:first-child) > .btn:first-child {\n border-top-left-radius: 0;\n border-top-right-radius: 0;\n}\n\n[data-toggle=\"buttons\"] > .btn input[type=\"radio\"],\n[data-toggle=\"buttons\"] > .btn input[type=\"checkbox\"],\n[data-toggle=\"buttons\"] > .btn-group > .btn input[type=\"radio\"],\n[data-toggle=\"buttons\"] > .btn-group > .btn input[type=\"checkbox\"] {\n position: absolute;\n clip: rect(0, 0, 0, 0);\n pointer-events: none;\n}\n\n.input-group {\n position: relative;\n display: flex;\n width: 100%;\n}\n\n.input-group .form-control {\n position: relative;\n z-index: 2;\n flex: 1 1 auto;\n width: 1%;\n margin-bottom: 0;\n}\n\n.input-group .form-control:focus, .input-group .form-control:active, .input-group .form-control:hover {\n z-index: 3;\n}\n\n.input-group-addon,\n.input-group-btn,\n.input-group .form-control {\n display: flex;\n align-items: center;\n}\n\n.input-group-addon:not(:first-child):not(:last-child),\n.input-group-btn:not(:first-child):not(:last-child),\n.input-group .form-control:not(:first-child):not(:last-child) {\n border-radius: 0;\n}\n\n.input-group-addon,\n.input-group-btn {\n white-space: nowrap;\n vertical-align: middle;\n}\n\n.input-group-addon {\n padding: 0.5rem 0.75rem;\n margin-bottom: 0;\n font-size: 1rem;\n font-weight: normal;\n line-height: 1.25;\n color: #495057;\n text-align: center;\n background-color: #e9ecef;\n border: 1px solid rgba(0, 0, 0, 0.15);\n border-radius: 0.25rem;\n}\n\n.input-group-addon.form-control-sm,\n.input-group-sm > .input-group-addon,\n.input-group-sm > .input-group-btn > .input-group-addon.btn {\n padding: 0.25rem 0.5rem;\n font-size: 0.875rem;\n border-radius: 0.2rem;\n}\n\n.input-group-addon.form-control-lg,\n.input-group-lg > .input-group-addon,\n.input-group-lg > .input-group-btn > .input-group-addon.btn {\n padding: 0.5rem 1rem;\n font-size: 1.25rem;\n border-radius: 0.3rem;\n}\n\n.input-group-addon input[type=\"radio\"],\n.input-group-addon input[type=\"checkbox\"] {\n margin-top: 0;\n}\n\n.input-group .form-control:not(:last-child),\n.input-group-addon:not(:last-child),\n.input-group-btn:not(:last-child) > .btn,\n.input-group-btn:not(:last-child) > .btn-group > .btn,\n.input-group-btn:not(:last-child) > .dropdown-toggle,\n.input-group-btn:not(:first-child) > .btn:not(:last-child):not(.dropdown-toggle),\n.input-group-btn:not(:first-child) > .btn-group:not(:last-child) > .btn {\n border-top-right-radius: 0;\n border-bottom-right-radius: 0;\n}\n\n.input-group-addon:not(:last-child) {\n border-right: 0;\n}\n\n.input-group .form-control:not(:first-child),\n.input-group-addon:not(:first-child),\n.input-group-btn:not(:first-child) > .btn,\n.input-group-btn:not(:first-child) > .btn-group > .btn,\n.input-group-btn:not(:first-child) > .dropdown-toggle,\n.input-group-btn:not(:last-child) > .btn:not(:first-child),\n.input-group-btn:not(:last-child) > .btn-group:not(:first-child) > .btn {\n border-top-left-radius: 0;\n border-bottom-left-radius: 0;\n}\n\n.form-control + .input-group-addon:not(:first-child) {\n border-left: 0;\n}\n\n.input-group-btn {\n position: relative;\n font-size: 0;\n white-space: nowrap;\n}\n\n.input-group-btn > .btn {\n position: relative;\n}\n\n.input-group-btn > .btn + .btn {\n margin-left: -1px;\n}\n\n.input-group-btn > .btn:focus, .input-group-btn > .btn:active, .input-group-btn > .btn:hover {\n z-index: 3;\n}\n\n.input-group-btn:not(:last-child) > .btn,\n.input-group-btn:not(:last-child) > .btn-group {\n margin-right: -1px;\n}\n\n.input-group-btn:not(:first-child) > .btn,\n.input-group-btn:not(:first-child) > .btn-group {\n z-index: 2;\n margin-left: -1px;\n}\n\n.input-group-btn:not(:first-child) > .btn:focus, .input-group-btn:not(:first-child) > .btn:active, .input-group-btn:not(:first-child) > .btn:hover,\n.input-group-btn:not(:first-child) > .btn-group:focus,\n.input-group-btn:not(:first-child) > .btn-group:active,\n.input-group-btn:not(:first-child) > .btn-group:hover {\n z-index: 3;\n}\n\n.custom-control {\n position: relative;\n display: inline-flex;\n min-height: 1.5rem;\n padding-left: 1.5rem;\n margin-right: 1rem;\n}\n\n.custom-control-input {\n position: absolute;\n z-index: -1;\n opacity: 0;\n}\n\n.custom-control-input:checked ~ .custom-control-indicator {\n color: #fff;\n background-color: #007bff;\n}\n\n.custom-control-input:focus ~ .custom-control-indicator {\n box-shadow: 0 0 0 1px #fff, 0 0 0 3px #007bff;\n}\n\n.custom-control-input:active ~ .custom-control-indicator {\n color: #fff;\n background-color: #b3d7ff;\n}\n\n.custom-control-input:disabled ~ .custom-control-indicator {\n background-color: #e9ecef;\n}\n\n.custom-control-input:disabled ~ .custom-control-description {\n color: #868e96;\n}\n\n.custom-control-indicator {\n position: absolute;\n top: 0.25rem;\n left: 0;\n display: block;\n width: 1rem;\n height: 1rem;\n pointer-events: none;\n user-select: none;\n background-color: #ddd;\n background-repeat: no-repeat;\n background-position: center center;\n background-size: 50% 50%;\n}\n\n.custom-checkbox .custom-control-indicator {\n border-radius: 0.25rem;\n}\n\n.custom-checkbox .custom-control-input:checked ~ .custom-control-indicator {\n background-image: url(\"data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3E%3Cpath fill='%23fff' d='M6.564.75l-3.59 3.612-1.538-1.55L0 4.26 2.974 7.25 8 2.193z'/%3E%3C/svg%3E\");\n}\n\n.custom-checkbox .custom-control-input:indeterminate ~ .custom-control-indicator {\n background-color: #007bff;\n background-image: url(\"data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 4'%3E%3Cpath stroke='%23fff' d='M0 2h4'/%3E%3C/svg%3E\");\n}\n\n.custom-radio .custom-control-indicator {\n border-radius: 50%;\n}\n\n.custom-radio .custom-control-input:checked ~ .custom-control-indicator {\n background-image: url(\"data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3E%3Ccircle r='3' fill='%23fff'/%3E%3C/svg%3E\");\n}\n\n.custom-controls-stacked {\n display: flex;\n flex-direction: column;\n}\n\n.custom-controls-stacked .custom-control {\n margin-bottom: 0.25rem;\n}\n\n.custom-controls-stacked .custom-control + .custom-control {\n margin-left: 0;\n}\n\n.custom-select {\n display: inline-block;\n max-width: 100%;\n height: calc(2.25rem + 2px);\n padding: 0.375rem 1.75rem 0.375rem 0.75rem;\n line-height: 1.25;\n color: #495057;\n vertical-align: middle;\n background: #fff url(\"data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 5'%3E%3Cpath fill='%23333' d='M2 0L0 2h4zm0 5L0 3h4z'/%3E%3C/svg%3E\") no-repeat right 0.75rem center;\n background-size: 8px 10px;\n border: 1px solid rgba(0, 0, 0, 0.15);\n border-radius: 0.25rem;\n appearance: none;\n}\n\n.custom-select:focus {\n border-color: #80bdff;\n outline: none;\n}\n\n.custom-select:focus::-ms-value {\n color: #495057;\n background-color: #fff;\n}\n\n.custom-select:disabled {\n color: #868e96;\n background-color: #e9ecef;\n}\n\n.custom-select::-ms-expand {\n opacity: 0;\n}\n\n.custom-select-sm {\n height: calc(1.8125rem + 2px);\n padding-top: 0.375rem;\n padding-bottom: 0.375rem;\n font-size: 75%;\n}\n\n.custom-file {\n position: relative;\n display: inline-block;\n max-width: 100%;\n height: 2.5rem;\n margin-bottom: 0;\n}\n\n.custom-file-input {\n min-width: 14rem;\n max-width: 100%;\n height: 2.5rem;\n margin: 0;\n opacity: 0;\n}\n\n.custom-file-control {\n position: absolute;\n top: 0;\n right: 0;\n left: 0;\n z-index: 5;\n height: 2.5rem;\n padding: 0.5rem 1rem;\n line-height: 1.5;\n color: #495057;\n pointer-events: none;\n user-select: none;\n background-color: #fff;\n border: 1px solid rgba(0, 0, 0, 0.15);\n border-radius: 0.25rem;\n}\n\n.custom-file-control:lang(en):empty::after {\n content: \"Choose file...\";\n}\n\n.custom-file-control::before {\n position: absolute;\n top: -1px;\n right: -1px;\n bottom: -1px;\n z-index: 6;\n display: block;\n height: 2.5rem;\n padding: 0.5rem 1rem;\n line-height: 1.5;\n color: #495057;\n background-color: #e9ecef;\n border: 1px solid rgba(0, 0, 0, 0.15);\n border-radius: 0 0.25rem 0.25rem 0;\n}\n\n.custom-file-control:lang(en)::before {\n content: \"Browse\";\n}\n\n.nav {\n display: flex;\n flex-wrap: wrap;\n padding-left: 0;\n margin-bottom: 0;\n list-style: none;\n}\n\n.nav-link {\n display: block;\n padding: 0.5rem 1rem;\n}\n\n.nav-link:focus, .nav-link:hover {\n text-decoration: none;\n}\n\n.nav-link.disabled {\n color: #868e96;\n}\n\n.nav-tabs {\n border-bottom: 1px solid #ddd;\n}\n\n.nav-tabs .nav-item {\n margin-bottom: -1px;\n}\n\n.nav-tabs .nav-link {\n border: 1px solid transparent;\n border-top-left-radius: 0.25rem;\n border-top-right-radius: 0.25rem;\n}\n\n.nav-tabs .nav-link:focus, .nav-tabs .nav-link:hover {\n border-color: #e9ecef #e9ecef #ddd;\n}\n\n.nav-tabs .nav-link.disabled {\n color: #868e96;\n background-color: transparent;\n border-color: transparent;\n}\n\n.nav-tabs .nav-link.active,\n.nav-tabs .nav-item.show .nav-link {\n color: #495057;\n background-color: #fff;\n border-color: #ddd #ddd #fff;\n}\n\n.nav-tabs .dropdown-menu {\n margin-top: -1px;\n border-top-left-radius: 0;\n border-top-right-radius: 0;\n}\n\n.nav-pills .nav-link {\n border-radius: 0.25rem;\n}\n\n.nav-pills .nav-link.active,\n.show > .nav-pills .nav-link {\n color: #fff;\n background-color: #007bff;\n}\n\n.nav-fill .nav-item {\n flex: 1 1 auto;\n text-align: center;\n}\n\n.nav-justified .nav-item {\n flex-basis: 0;\n flex-grow: 1;\n text-align: center;\n}\n\n.tab-content > .tab-pane {\n display: none;\n}\n\n.tab-content > .active {\n display: block;\n}\n\n.navbar {\n position: relative;\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n justify-content: space-between;\n padding: 0.5rem 1rem;\n}\n\n.navbar > .container,\n.navbar > .container-fluid {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n justify-content: space-between;\n}\n\n.navbar-brand {\n display: inline-block;\n padding-top: 0.3125rem;\n padding-bottom: 0.3125rem;\n margin-right: 1rem;\n font-size: 1.25rem;\n line-height: inherit;\n white-space: nowrap;\n}\n\n.navbar-brand:focus, .navbar-brand:hover {\n text-decoration: none;\n}\n\n.navbar-nav {\n display: flex;\n flex-direction: column;\n padding-left: 0;\n margin-bottom: 0;\n list-style: none;\n}\n\n.navbar-nav .nav-link {\n padding-right: 0;\n padding-left: 0;\n}\n\n.navbar-nav .dropdown-menu {\n position: static;\n float: none;\n}\n\n.navbar-text {\n display: inline-block;\n padding-top: 0.5rem;\n padding-bottom: 0.5rem;\n}\n\n.navbar-collapse {\n flex-basis: 100%;\n align-items: center;\n}\n\n.navbar-toggler {\n padding: 0.25rem 0.75rem;\n font-size: 1.25rem;\n line-height: 1;\n background: transparent;\n border: 1px solid transparent;\n border-radius: 0.25rem;\n}\n\n.navbar-toggler:focus, .navbar-toggler:hover {\n text-decoration: none;\n}\n\n.navbar-toggler-icon {\n display: inline-block;\n width: 1.5em;\n height: 1.5em;\n vertical-align: middle;\n content: \"\";\n background: no-repeat center center;\n background-size: 100% 100%;\n}\n\n@media (max-width: 575px) {\n .navbar-expand-sm > .container,\n .navbar-expand-sm > .container-fluid {\n padding-right: 0;\n padding-left: 0;\n }\n}\n\n@media (min-width: 576px) {\n .navbar-expand-sm {\n flex-direction: row;\n flex-wrap: nowrap;\n justify-content: flex-start;\n }\n .navbar-expand-sm .navbar-nav {\n flex-direction: row;\n }\n .navbar-expand-sm .navbar-nav .dropdown-menu {\n position: absolute;\n }\n .navbar-expand-sm .navbar-nav .dropdown-menu-right {\n right: 0;\n left: auto;\n }\n .navbar-expand-sm .navbar-nav .nav-link {\n padding-right: .5rem;\n padding-left: .5rem;\n }\n .navbar-expand-sm > .container,\n .navbar-expand-sm > .container-fluid {\n flex-wrap: nowrap;\n }\n .navbar-expand-sm .navbar-collapse {\n display: flex !important;\n }\n .navbar-expand-sm .navbar-toggler {\n display: none;\n }\n}\n\n@media (max-width: 767px) {\n .navbar-expand-md > .container,\n .navbar-expand-md > .container-fluid {\n padding-right: 0;\n padding-left: 0;\n }\n}\n\n@media (min-width: 768px) {\n .navbar-expand-md {\n flex-direction: row;\n flex-wrap: nowrap;\n justify-content: flex-start;\n }\n .navbar-expand-md .navbar-nav {\n flex-direction: row;\n }\n .navbar-expand-md .navbar-nav .dropdown-menu {\n position: absolute;\n }\n .navbar-expand-md .navbar-nav .dropdown-menu-right {\n right: 0;\n left: auto;\n }\n .navbar-expand-md .navbar-nav .nav-link {\n padding-right: .5rem;\n padding-left: .5rem;\n }\n .navbar-expand-md > .container,\n .navbar-expand-md > .container-fluid {\n flex-wrap: nowrap;\n }\n .navbar-expand-md .navbar-collapse {\n display: flex !important;\n }\n .navbar-expand-md .navbar-toggler {\n display: none;\n }\n}\n\n@media (max-width: 991px) {\n .navbar-expand-lg > .container,\n .navbar-expand-lg > .container-fluid {\n padding-right: 0;\n padding-left: 0;\n }\n}\n\n@media (min-width: 992px) {\n .navbar-expand-lg {\n flex-direction: row;\n flex-wrap: nowrap;\n justify-content: flex-start;\n }\n .navbar-expand-lg .navbar-nav {\n flex-direction: row;\n }\n .navbar-expand-lg .navbar-nav .dropdown-menu {\n position: absolute;\n }\n .navbar-expand-lg .navbar-nav .dropdown-menu-right {\n right: 0;\n left: auto;\n }\n .navbar-expand-lg .navbar-nav .nav-link {\n padding-right: .5rem;\n padding-left: .5rem;\n }\n .navbar-expand-lg > .container,\n .navbar-expand-lg > .container-fluid {\n flex-wrap: nowrap;\n }\n .navbar-expand-lg .navbar-collapse {\n display: flex !important;\n }\n .navbar-expand-lg .navbar-toggler {\n display: none;\n }\n}\n\n@media (max-width: 1199px) {\n .navbar-expand-xl > .container,\n .navbar-expand-xl > .container-fluid {\n padding-right: 0;\n padding-left: 0;\n }\n}\n\n@media (min-width: 1200px) {\n .navbar-expand-xl {\n flex-direction: row;\n flex-wrap: nowrap;\n justify-content: flex-start;\n }\n .navbar-expand-xl .navbar-nav {\n flex-direction: row;\n }\n .navbar-expand-xl .navbar-nav .dropdown-menu {\n position: absolute;\n }\n .navbar-expand-xl .navbar-nav .dropdown-menu-right {\n right: 0;\n left: auto;\n }\n .navbar-expand-xl .navbar-nav .nav-link {\n padding-right: .5rem;\n padding-left: .5rem;\n }\n .navbar-expand-xl > .container,\n .navbar-expand-xl > .container-fluid {\n flex-wrap: nowrap;\n }\n .navbar-expand-xl .navbar-collapse {\n display: flex !important;\n }\n .navbar-expand-xl .navbar-toggler {\n display: none;\n }\n}\n\n.navbar-expand {\n flex-direction: row;\n flex-wrap: nowrap;\n justify-content: flex-start;\n}\n\n.navbar-expand > .container,\n.navbar-expand > .container-fluid {\n padding-right: 0;\n padding-left: 0;\n}\n\n.navbar-expand .navbar-nav {\n flex-direction: row;\n}\n\n.navbar-expand .navbar-nav .dropdown-menu {\n position: absolute;\n}\n\n.navbar-expand .navbar-nav .dropdown-menu-right {\n right: 0;\n left: auto;\n}\n\n.navbar-expand .navbar-nav .nav-link {\n padding-right: .5rem;\n padding-left: .5rem;\n}\n\n.navbar-expand > .container,\n.navbar-expand > .container-fluid {\n flex-wrap: nowrap;\n}\n\n.navbar-expand .navbar-collapse {\n display: flex !important;\n}\n\n.navbar-expand .navbar-toggler {\n display: none;\n}\n\n.navbar-light .navbar-brand {\n color: rgba(0, 0, 0, 0.9);\n}\n\n.navbar-light .navbar-brand:focus, .navbar-light .navbar-brand:hover {\n color: rgba(0, 0, 0, 0.9);\n}\n\n.navbar-light .navbar-nav .nav-link {\n color: rgba(0, 0, 0, 0.5);\n}\n\n.navbar-light .navbar-nav .nav-link:focus, .navbar-light .navbar-nav .nav-link:hover {\n color: rgba(0, 0, 0, 0.7);\n}\n\n.navbar-light .navbar-nav .nav-link.disabled {\n color: rgba(0, 0, 0, 0.3);\n}\n\n.navbar-light .navbar-nav .show > .nav-link,\n.navbar-light .navbar-nav .active > .nav-link,\n.navbar-light .navbar-nav .nav-link.show,\n.navbar-light .navbar-nav .nav-link.active {\n color: rgba(0, 0, 0, 0.9);\n}\n\n.navbar-light .navbar-toggler {\n color: rgba(0, 0, 0, 0.5);\n border-color: rgba(0, 0, 0, 0.1);\n}\n\n.navbar-light .navbar-toggler-icon {\n background-image: url(\"data:image/svg+xml;charset=utf8,%3Csvg viewBox='0 0 30 30' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath stroke='rgba(0, 0, 0, 0.5)' stroke-width='2' stroke-linecap='round' stroke-miterlimit='10' d='M4 7h22M4 15h22M4 23h22'/%3E%3C/svg%3E\");\n}\n\n.navbar-light .navbar-text {\n color: rgba(0, 0, 0, 0.5);\n}\n\n.navbar-dark .navbar-brand {\n color: white;\n}\n\n.navbar-dark .navbar-brand:focus, .navbar-dark .navbar-brand:hover {\n color: white;\n}\n\n.navbar-dark .navbar-nav .nav-link {\n color: rgba(255, 255, 255, 0.5);\n}\n\n.navbar-dark .navbar-nav .nav-link:focus, .navbar-dark .navbar-nav .nav-link:hover {\n color: rgba(255, 255, 255, 0.75);\n}\n\n.navbar-dark .navbar-nav .nav-link.disabled {\n color: rgba(255, 255, 255, 0.25);\n}\n\n.navbar-dark .navbar-nav .show > .nav-link,\n.navbar-dark .navbar-nav .active > .nav-link,\n.navbar-dark .navbar-nav .nav-link.show,\n.navbar-dark .navbar-nav .nav-link.active {\n color: white;\n}\n\n.navbar-dark .navbar-toggler {\n color: rgba(255, 255, 255, 0.5);\n border-color: rgba(255, 255, 255, 0.1);\n}\n\n.navbar-dark .navbar-toggler-icon {\n background-image: url(\"data:image/svg+xml;charset=utf8,%3Csvg viewBox='0 0 30 30' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath stroke='rgba(255, 255, 255, 0.5)' stroke-width='2' stroke-linecap='round' stroke-miterlimit='10' d='M4 7h22M4 15h22M4 23h22'/%3E%3C/svg%3E\");\n}\n\n.navbar-dark .navbar-text {\n color: rgba(255, 255, 255, 0.5);\n}\n\n.card {\n position: relative;\n display: flex;\n flex-direction: column;\n min-width: 0;\n word-wrap: break-word;\n background-color: #fff;\n background-clip: border-box;\n border: 1px solid rgba(0, 0, 0, 0.125);\n border-radius: 0.25rem;\n}\n\n.card-body {\n flex: 1 1 auto;\n padding: 1.25rem;\n}\n\n.card-title {\n margin-bottom: 0.75rem;\n}\n\n.card-subtitle {\n margin-top: -0.375rem;\n margin-bottom: 0;\n}\n\n.card-text:last-child {\n margin-bottom: 0;\n}\n\n.card-link:hover {\n text-decoration: none;\n}\n\n.card-link + .card-link {\n margin-left: 1.25rem;\n}\n\n.card > .list-group:first-child .list-group-item:first-child {\n border-top-left-radius: 0.25rem;\n border-top-right-radius: 0.25rem;\n}\n\n.card > .list-group:last-child .list-group-item:last-child {\n border-bottom-right-radius: 0.25rem;\n border-bottom-left-radius: 0.25rem;\n}\n\n.card-header {\n padding: 0.75rem 1.25rem;\n margin-bottom: 0;\n background-color: rgba(0, 0, 0, 0.03);\n border-bottom: 1px solid rgba(0, 0, 0, 0.125);\n}\n\n.card-header:first-child {\n border-radius: calc(0.25rem - 1px) calc(0.25rem - 1px) 0 0;\n}\n\n.card-footer {\n padding: 0.75rem 1.25rem;\n background-color: rgba(0, 0, 0, 0.03);\n border-top: 1px solid rgba(0, 0, 0, 0.125);\n}\n\n.card-footer:last-child {\n border-radius: 0 0 calc(0.25rem - 1px) calc(0.25rem - 1px);\n}\n\n.card-header-tabs {\n margin-right: -0.625rem;\n margin-bottom: -0.75rem;\n margin-left: -0.625rem;\n border-bottom: 0;\n}\n\n.card-header-pills {\n margin-right: -0.625rem;\n margin-left: -0.625rem;\n}\n\n.card-img-overlay {\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n padding: 1.25rem;\n}\n\n.card-img {\n width: 100%;\n border-radius: calc(0.25rem - 1px);\n}\n\n.card-img-top {\n width: 100%;\n border-top-left-radius: calc(0.25rem - 1px);\n border-top-right-radius: calc(0.25rem - 1px);\n}\n\n.card-img-bottom {\n width: 100%;\n border-bottom-right-radius: calc(0.25rem - 1px);\n border-bottom-left-radius: calc(0.25rem - 1px);\n}\n\n@media (min-width: 576px) {\n .card-deck {\n display: flex;\n flex-flow: row wrap;\n margin-right: -15px;\n margin-left: -15px;\n }\n .card-deck .card {\n display: flex;\n flex: 1 0 0%;\n flex-direction: column;\n margin-right: 15px;\n margin-left: 15px;\n }\n}\n\n@media (min-width: 576px) {\n .card-group {\n display: flex;\n flex-flow: row wrap;\n }\n .card-group .card {\n flex: 1 0 0%;\n }\n .card-group .card + .card {\n margin-left: 0;\n border-left: 0;\n }\n .card-group .card:first-child {\n border-top-right-radius: 0;\n border-bottom-right-radius: 0;\n }\n .card-group .card:first-child .card-img-top {\n border-top-right-radius: 0;\n }\n .card-group .card:first-child .card-img-bottom {\n border-bottom-right-radius: 0;\n }\n .card-group .card:last-child {\n border-top-left-radius: 0;\n border-bottom-left-radius: 0;\n }\n .card-group .card:last-child .card-img-top {\n border-top-left-radius: 0;\n }\n .card-group .card:last-child .card-img-bottom {\n border-bottom-left-radius: 0;\n }\n .card-group .card:not(:first-child):not(:last-child) {\n border-radius: 0;\n }\n .card-group .card:not(:first-child):not(:last-child) .card-img-top,\n .card-group .card:not(:first-child):not(:last-child) .card-img-bottom {\n border-radius: 0;\n }\n}\n\n.card-columns .card {\n margin-bottom: 0.75rem;\n}\n\n@media (min-width: 576px) {\n .card-columns {\n column-count: 3;\n column-gap: 1.25rem;\n }\n .card-columns .card {\n display: inline-block;\n width: 100%;\n }\n}\n\n.breadcrumb {\n padding: 0.75rem 1rem;\n margin-bottom: 1rem;\n list-style: none;\n background-color: #e9ecef;\n border-radius: 0.25rem;\n}\n\n.breadcrumb::after {\n display: block;\n clear: both;\n content: \"\";\n}\n\n.breadcrumb-item {\n float: left;\n}\n\n.breadcrumb-item + .breadcrumb-item::before {\n display: inline-block;\n padding-right: 0.5rem;\n padding-left: 0.5rem;\n color: #868e96;\n content: \"/\";\n}\n\n.breadcrumb-item + .breadcrumb-item:hover::before {\n text-decoration: underline;\n}\n\n.breadcrumb-item + .breadcrumb-item:hover::before {\n text-decoration: none;\n}\n\n.breadcrumb-item.active {\n color: #868e96;\n}\n\n.pagination {\n display: flex;\n padding-left: 0;\n list-style: none;\n border-radius: 0.25rem;\n}\n\n.page-item:first-child .page-link {\n margin-left: 0;\n border-top-left-radius: 0.25rem;\n border-bottom-left-radius: 0.25rem;\n}\n\n.page-item:last-child .page-link {\n border-top-right-radius: 0.25rem;\n border-bottom-right-radius: 0.25rem;\n}\n\n.page-item.active .page-link {\n z-index: 2;\n color: #fff;\n background-color: #007bff;\n border-color: #007bff;\n}\n\n.page-item.disabled .page-link {\n color: #868e96;\n pointer-events: none;\n background-color: #fff;\n border-color: #ddd;\n}\n\n.page-link {\n position: relative;\n display: block;\n padding: 0.5rem 0.75rem;\n margin-left: -1px;\n line-height: 1.25;\n color: #007bff;\n background-color: #fff;\n border: 1px solid #ddd;\n}\n\n.page-link:focus, .page-link:hover {\n color: #0056b3;\n text-decoration: none;\n background-color: #e9ecef;\n border-color: #ddd;\n}\n\n.pagination-lg .page-link {\n padding: 0.75rem 1.5rem;\n font-size: 1.25rem;\n line-height: 1.5;\n}\n\n.pagination-lg .page-item:first-child .page-link {\n border-top-left-radius: 0.3rem;\n border-bottom-left-radius: 0.3rem;\n}\n\n.pagination-lg .page-item:last-child .page-link {\n border-top-right-radius: 0.3rem;\n border-bottom-right-radius: 0.3rem;\n}\n\n.pagination-sm .page-link {\n padding: 0.25rem 0.5rem;\n font-size: 0.875rem;\n line-height: 1.5;\n}\n\n.pagination-sm .page-item:first-child .page-link {\n border-top-left-radius: 0.2rem;\n border-bottom-left-radius: 0.2rem;\n}\n\n.pagination-sm .page-item:last-child .page-link {\n border-top-right-radius: 0.2rem;\n border-bottom-right-radius: 0.2rem;\n}\n\n.badge {\n display: inline-block;\n padding: 0.25em 0.4em;\n font-size: 75%;\n font-weight: bold;\n line-height: 1;\n color: #fff;\n text-align: center;\n white-space: nowrap;\n vertical-align: baseline;\n border-radius: 0.25rem;\n}\n\n.badge:empty {\n display: none;\n}\n\n.btn .badge {\n position: relative;\n top: -1px;\n}\n\n.badge-pill {\n padding-right: 0.6em;\n padding-left: 0.6em;\n border-radius: 10rem;\n}\n\n.badge-primary {\n color: #fff;\n background-color: #007bff;\n}\n\n.badge-primary[href]:focus, .badge-primary[href]:hover {\n color: #fff;\n text-decoration: none;\n background-color: #0062cc;\n}\n\n.badge-secondary {\n color: #fff;\n background-color: #868e96;\n}\n\n.badge-secondary[href]:focus, .badge-secondary[href]:hover {\n color: #fff;\n text-decoration: none;\n background-color: #6c757d;\n}\n\n.badge-success {\n color: #fff;\n background-color: #28a745;\n}\n\n.badge-success[href]:focus, .badge-success[href]:hover {\n color: #fff;\n text-decoration: none;\n background-color: #1e7e34;\n}\n\n.badge-info {\n color: #fff;\n background-color: #17a2b8;\n}\n\n.badge-info[href]:focus, .badge-info[href]:hover {\n color: #fff;\n text-decoration: none;\n background-color: #117a8b;\n}\n\n.badge-warning {\n color: #111;\n background-color: #ffc107;\n}\n\n.badge-warning[href]:focus, .badge-warning[href]:hover {\n color: #111;\n text-decoration: none;\n background-color: #d39e00;\n}\n\n.badge-danger {\n color: #fff;\n background-color: #dc3545;\n}\n\n.badge-danger[href]:focus, .badge-danger[href]:hover {\n color: #fff;\n text-decoration: none;\n background-color: #bd2130;\n}\n\n.badge-light {\n color: #111;\n background-color: #f8f9fa;\n}\n\n.badge-light[href]:focus, .badge-light[href]:hover {\n color: #111;\n text-decoration: none;\n background-color: #dae0e5;\n}\n\n.badge-dark {\n color: #fff;\n background-color: #343a40;\n}\n\n.badge-dark[href]:focus, .badge-dark[href]:hover {\n color: #fff;\n text-decoration: none;\n background-color: #1d2124;\n}\n\n.jumbotron {\n padding: 2rem 1rem;\n margin-bottom: 2rem;\n background-color: #e9ecef;\n border-radius: 0.3rem;\n}\n\n@media (min-width: 576px) {\n .jumbotron {\n padding: 4rem 2rem;\n }\n}\n\n.jumbotron-fluid {\n padding-right: 0;\n padding-left: 0;\n border-radius: 0;\n}\n\n.alert {\n padding: 0.75rem 1.25rem;\n margin-bottom: 1rem;\n border: 1px solid transparent;\n border-radius: 0.25rem;\n}\n\n.alert-heading {\n color: inherit;\n}\n\n.alert-link {\n font-weight: bold;\n}\n\n.alert-dismissible .close {\n position: relative;\n top: -0.75rem;\n right: -1.25rem;\n padding: 0.75rem 1.25rem;\n color: inherit;\n}\n\n.alert-primary {\n color: #004085;\n background-color: #cce5ff;\n border-color: #b8daff;\n}\n\n.alert-primary hr {\n border-top-color: #9fcdff;\n}\n\n.alert-primary .alert-link {\n color: #002752;\n}\n\n.alert-secondary {\n color: #464a4e;\n background-color: #e7e8ea;\n border-color: #dddfe2;\n}\n\n.alert-secondary hr {\n border-top-color: #cfd2d6;\n}\n\n.alert-secondary .alert-link {\n color: #2e3133;\n}\n\n.alert-success {\n color: #155724;\n background-color: #d4edda;\n border-color: #c3e6cb;\n}\n\n.alert-success hr {\n border-top-color: #b1dfbb;\n}\n\n.alert-success .alert-link {\n color: #0b2e13;\n}\n\n.alert-info {\n color: #0c5460;\n background-color: #d1ecf1;\n border-color: #bee5eb;\n}\n\n.alert-info hr {\n border-top-color: #abdde5;\n}\n\n.alert-info .alert-link {\n color: #062c33;\n}\n\n.alert-warning {\n color: #856404;\n background-color: #fff3cd;\n border-color: #ffeeba;\n}\n\n.alert-warning hr {\n border-top-color: #ffe8a1;\n}\n\n.alert-warning .alert-link {\n color: #533f03;\n}\n\n.alert-danger {\n color: #721c24;\n background-color: #f8d7da;\n border-color: #f5c6cb;\n}\n\n.alert-danger hr {\n border-top-color: #f1b0b7;\n}\n\n.alert-danger .alert-link {\n color: #491217;\n}\n\n.alert-light {\n color: #818182;\n background-color: #fefefe;\n border-color: #fdfdfe;\n}\n\n.alert-light hr {\n border-top-color: #ececf6;\n}\n\n.alert-light .alert-link {\n color: #686868;\n}\n\n.alert-dark {\n color: #1b1e21;\n background-color: #d6d8d9;\n border-color: #c6c8ca;\n}\n\n.alert-dark hr {\n border-top-color: #b9bbbe;\n}\n\n.alert-dark .alert-link {\n color: #040505;\n}\n\n@keyframes progress-bar-stripes {\n from {\n background-position: 1rem 0;\n }\n to {\n background-position: 0 0;\n }\n}\n\n.progress {\n display: flex;\n overflow: hidden;\n font-size: 0.75rem;\n line-height: 1rem;\n text-align: center;\n background-color: #e9ecef;\n border-radius: 0.25rem;\n}\n\n.progress-bar {\n height: 1rem;\n line-height: 1rem;\n color: #fff;\n background-color: #007bff;\n transition: width 0.6s ease;\n}\n\n.progress-bar-striped {\n 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);\n background-size: 1rem 1rem;\n}\n\n.progress-bar-animated {\n animation: progress-bar-stripes 1s linear infinite;\n}\n\n.media {\n display: flex;\n align-items: flex-start;\n}\n\n.media-body {\n flex: 1;\n}\n\n.list-group {\n display: flex;\n flex-direction: column;\n padding-left: 0;\n margin-bottom: 0;\n}\n\n.list-group-item-action {\n width: 100%;\n color: #495057;\n text-align: inherit;\n}\n\n.list-group-item-action:focus, .list-group-item-action:hover {\n color: #495057;\n text-decoration: none;\n background-color: #f8f9fa;\n}\n\n.list-group-item-action:active {\n color: #212529;\n background-color: #e9ecef;\n}\n\n.list-group-item {\n position: relative;\n display: block;\n padding: 0.75rem 1.25rem;\n margin-bottom: -1px;\n background-color: #fff;\n border: 1px solid rgba(0, 0, 0, 0.125);\n}\n\n.list-group-item:first-child {\n border-top-left-radius: 0.25rem;\n border-top-right-radius: 0.25rem;\n}\n\n.list-group-item:last-child {\n margin-bottom: 0;\n border-bottom-right-radius: 0.25rem;\n border-bottom-left-radius: 0.25rem;\n}\n\n.list-group-item:focus, .list-group-item:hover {\n text-decoration: none;\n}\n\n.list-group-item.disabled, .list-group-item:disabled {\n color: #868e96;\n background-color: #fff;\n}\n\n.list-group-item.active {\n z-index: 2;\n color: #fff;\n background-color: #007bff;\n border-color: #007bff;\n}\n\n.list-group-flush .list-group-item {\n border-right: 0;\n border-left: 0;\n border-radius: 0;\n}\n\n.list-group-flush:first-child .list-group-item:first-child {\n border-top: 0;\n}\n\n.list-group-flush:last-child .list-group-item:last-child {\n border-bottom: 0;\n}\n\n.list-group-item-primary {\n color: #004085;\n background-color: #b8daff;\n}\n\na.list-group-item-primary,\nbutton.list-group-item-primary {\n color: #004085;\n}\n\na.list-group-item-primary:focus, a.list-group-item-primary:hover,\nbutton.list-group-item-primary:focus,\nbutton.list-group-item-primary:hover {\n color: #004085;\n background-color: #9fcdff;\n}\n\na.list-group-item-primary.active,\nbutton.list-group-item-primary.active {\n color: #fff;\n background-color: #004085;\n border-color: #004085;\n}\n\n.list-group-item-secondary {\n color: #464a4e;\n background-color: #dddfe2;\n}\n\na.list-group-item-secondary,\nbutton.list-group-item-secondary {\n color: #464a4e;\n}\n\na.list-group-item-secondary:focus, a.list-group-item-secondary:hover,\nbutton.list-group-item-secondary:focus,\nbutton.list-group-item-secondary:hover {\n color: #464a4e;\n background-color: #cfd2d6;\n}\n\na.list-group-item-secondary.active,\nbutton.list-group-item-secondary.active {\n color: #fff;\n background-color: #464a4e;\n border-color: #464a4e;\n}\n\n.list-group-item-success {\n color: #155724;\n background-color: #c3e6cb;\n}\n\na.list-group-item-success,\nbutton.list-group-item-success {\n color: #155724;\n}\n\na.list-group-item-success:focus, a.list-group-item-success:hover,\nbutton.list-group-item-success:focus,\nbutton.list-group-item-success:hover {\n color: #155724;\n background-color: #b1dfbb;\n}\n\na.list-group-item-success.active,\nbutton.list-group-item-success.active {\n color: #fff;\n background-color: #155724;\n border-color: #155724;\n}\n\n.list-group-item-info {\n color: #0c5460;\n background-color: #bee5eb;\n}\n\na.list-group-item-info,\nbutton.list-group-item-info {\n color: #0c5460;\n}\n\na.list-group-item-info:focus, a.list-group-item-info:hover,\nbutton.list-group-item-info:focus,\nbutton.list-group-item-info:hover {\n color: #0c5460;\n background-color: #abdde5;\n}\n\na.list-group-item-info.active,\nbutton.list-group-item-info.active {\n color: #fff;\n background-color: #0c5460;\n border-color: #0c5460;\n}\n\n.list-group-item-warning {\n color: #856404;\n background-color: #ffeeba;\n}\n\na.list-group-item-warning,\nbutton.list-group-item-warning {\n color: #856404;\n}\n\na.list-group-item-warning:focus, a.list-group-item-warning:hover,\nbutton.list-group-item-warning:focus,\nbutton.list-group-item-warning:hover {\n color: #856404;\n background-color: #ffe8a1;\n}\n\na.list-group-item-warning.active,\nbutton.list-group-item-warning.active {\n color: #fff;\n background-color: #856404;\n border-color: #856404;\n}\n\n.list-group-item-danger {\n color: #721c24;\n background-color: #f5c6cb;\n}\n\na.list-group-item-danger,\nbutton.list-group-item-danger {\n color: #721c24;\n}\n\na.list-group-item-danger:focus, a.list-group-item-danger:hover,\nbutton.list-group-item-danger:focus,\nbutton.list-group-item-danger:hover {\n color: #721c24;\n background-color: #f1b0b7;\n}\n\na.list-group-item-danger.active,\nbutton.list-group-item-danger.active {\n color: #fff;\n background-color: #721c24;\n border-color: #721c24;\n}\n\n.list-group-item-light {\n color: #818182;\n background-color: #fdfdfe;\n}\n\na.list-group-item-light,\nbutton.list-group-item-light {\n color: #818182;\n}\n\na.list-group-item-light:focus, a.list-group-item-light:hover,\nbutton.list-group-item-light:focus,\nbutton.list-group-item-light:hover {\n color: #818182;\n background-color: #ececf6;\n}\n\na.list-group-item-light.active,\nbutton.list-group-item-light.active {\n color: #fff;\n background-color: #818182;\n border-color: #818182;\n}\n\n.list-group-item-dark {\n color: #1b1e21;\n background-color: #c6c8ca;\n}\n\na.list-group-item-dark,\nbutton.list-group-item-dark {\n color: #1b1e21;\n}\n\na.list-group-item-dark:focus, a.list-group-item-dark:hover,\nbutton.list-group-item-dark:focus,\nbutton.list-group-item-dark:hover {\n color: #1b1e21;\n background-color: #b9bbbe;\n}\n\na.list-group-item-dark.active,\nbutton.list-group-item-dark.active {\n color: #fff;\n background-color: #1b1e21;\n border-color: #1b1e21;\n}\n\n.close {\n float: right;\n font-size: 1.5rem;\n font-weight: bold;\n line-height: 1;\n color: #000;\n text-shadow: 0 1px 0 #fff;\n opacity: .5;\n}\n\n.close:focus, .close:hover {\n color: #000;\n text-decoration: none;\n opacity: .75;\n}\n\nbutton.close {\n padding: 0;\n background: transparent;\n border: 0;\n -webkit-appearance: none;\n}\n\n.modal-open {\n overflow: hidden;\n}\n\n.modal {\n position: fixed;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: 1050;\n display: none;\n overflow: hidden;\n outline: 0;\n}\n\n.modal.fade .modal-dialog {\n transition: transform 0.3s ease-out;\n transform: translate(0, -25%);\n}\n\n.modal.show .modal-dialog {\n transform: translate(0, 0);\n}\n\n.modal-open .modal {\n overflow-x: hidden;\n overflow-y: auto;\n}\n\n.modal-dialog {\n position: relative;\n width: auto;\n margin: 10px;\n}\n\n.modal-content {\n position: relative;\n display: flex;\n flex-direction: column;\n background-color: #fff;\n background-clip: padding-box;\n border: 1px solid rgba(0, 0, 0, 0.2);\n border-radius: 0.3rem;\n outline: 0;\n}\n\n.modal-backdrop {\n position: fixed;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: 1040;\n background-color: #000;\n}\n\n.modal-backdrop.fade {\n opacity: 0;\n}\n\n.modal-backdrop.show {\n opacity: 0.5;\n}\n\n.modal-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 15px;\n border-bottom: 1px solid #e9ecef;\n}\n\n.modal-title {\n margin-bottom: 0;\n line-height: 1.5;\n}\n\n.modal-body {\n position: relative;\n flex: 1 1 auto;\n padding: 15px;\n}\n\n.modal-footer {\n display: flex;\n align-items: center;\n justify-content: flex-end;\n padding: 15px;\n border-top: 1px solid #e9ecef;\n}\n\n.modal-footer > :not(:first-child) {\n margin-left: .25rem;\n}\n\n.modal-footer > :not(:last-child) {\n margin-right: .25rem;\n}\n\n.modal-scrollbar-measure {\n position: absolute;\n top: -9999px;\n width: 50px;\n height: 50px;\n overflow: scroll;\n}\n\n@media (min-width: 576px) {\n .modal-dialog {\n max-width: 500px;\n margin: 30px auto;\n }\n .modal-sm {\n max-width: 300px;\n }\n}\n\n@media (min-width: 992px) {\n .modal-lg {\n max-width: 800px;\n }\n}\n\n.tooltip {\n position: absolute;\n z-index: 1070;\n display: block;\n margin: 0;\n font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, \"Helvetica Neue\", Arial, sans-serif;\n font-style: normal;\n font-weight: normal;\n line-height: 1.5;\n text-align: left;\n text-align: start;\n text-decoration: none;\n text-shadow: none;\n text-transform: none;\n letter-spacing: normal;\n word-break: normal;\n word-spacing: normal;\n white-space: normal;\n line-break: auto;\n font-size: 0.875rem;\n word-wrap: break-word;\n opacity: 0;\n}\n\n.tooltip.show {\n opacity: 0.9;\n}\n\n.tooltip .arrow {\n position: absolute;\n display: block;\n width: 5px;\n height: 5px;\n}\n\n.tooltip.bs-tooltip-top, .tooltip.bs-tooltip-auto[x-placement^=\"top\"] {\n padding: 5px 0;\n}\n\n.tooltip.bs-tooltip-top .arrow, .tooltip.bs-tooltip-auto[x-placement^=\"top\"] .arrow {\n bottom: 0;\n}\n\n.tooltip.bs-tooltip-top .arrow::before, .tooltip.bs-tooltip-auto[x-placement^=\"top\"] .arrow::before {\n margin-left: -3px;\n content: \"\";\n border-width: 5px 5px 0;\n border-top-color: #000;\n}\n\n.tooltip.bs-tooltip-right, .tooltip.bs-tooltip-auto[x-placement^=\"right\"] {\n padding: 0 5px;\n}\n\n.tooltip.bs-tooltip-right .arrow, .tooltip.bs-tooltip-auto[x-placement^=\"right\"] .arrow {\n left: 0;\n}\n\n.tooltip.bs-tooltip-right .arrow::before, .tooltip.bs-tooltip-auto[x-placement^=\"right\"] .arrow::before {\n margin-top: -3px;\n content: \"\";\n border-width: 5px 5px 5px 0;\n border-right-color: #000;\n}\n\n.tooltip.bs-tooltip-bottom, .tooltip.bs-tooltip-auto[x-placement^=\"bottom\"] {\n padding: 5px 0;\n}\n\n.tooltip.bs-tooltip-bottom .arrow, .tooltip.bs-tooltip-auto[x-placement^=\"bottom\"] .arrow {\n top: 0;\n}\n\n.tooltip.bs-tooltip-bottom .arrow::before, .tooltip.bs-tooltip-auto[x-placement^=\"bottom\"] .arrow::before {\n margin-left: -3px;\n content: \"\";\n border-width: 0 5px 5px;\n border-bottom-color: #000;\n}\n\n.tooltip.bs-tooltip-left, .tooltip.bs-tooltip-auto[x-placement^=\"left\"] {\n padding: 0 5px;\n}\n\n.tooltip.bs-tooltip-left .arrow, .tooltip.bs-tooltip-auto[x-placement^=\"left\"] .arrow {\n right: 0;\n}\n\n.tooltip.bs-tooltip-left .arrow::before, .tooltip.bs-tooltip-auto[x-placement^=\"left\"] .arrow::before {\n right: 0;\n margin-top: -3px;\n content: \"\";\n border-width: 5px 0 5px 5px;\n border-left-color: #000;\n}\n\n.tooltip .arrow::before {\n position: absolute;\n border-color: transparent;\n border-style: solid;\n}\n\n.tooltip-inner {\n max-width: 200px;\n padding: 3px 8px;\n color: #fff;\n text-align: center;\n background-color: #000;\n border-radius: 0.25rem;\n}\n\n.popover {\n position: absolute;\n top: 0;\n left: 0;\n z-index: 1060;\n display: block;\n max-width: 276px;\n padding: 1px;\n font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, \"Helvetica Neue\", Arial, sans-serif;\n font-style: normal;\n font-weight: normal;\n line-height: 1.5;\n text-align: left;\n text-align: start;\n text-decoration: none;\n text-shadow: none;\n text-transform: none;\n letter-spacing: normal;\n word-break: normal;\n word-spacing: normal;\n white-space: normal;\n line-break: auto;\n font-size: 0.875rem;\n word-wrap: break-word;\n background-color: #fff;\n background-clip: padding-box;\n border: 1px solid rgba(0, 0, 0, 0.2);\n border-radius: 0.3rem;\n}\n\n.popover .arrow {\n position: absolute;\n display: block;\n width: 10px;\n height: 5px;\n}\n\n.popover .arrow::before,\n.popover .arrow::after {\n position: absolute;\n display: block;\n border-color: transparent;\n border-style: solid;\n}\n\n.popover .arrow::before {\n content: \"\";\n border-width: 11px;\n}\n\n.popover .arrow::after {\n content: \"\";\n border-width: 11px;\n}\n\n.popover.bs-popover-top, .popover.bs-popover-auto[x-placement^=\"top\"] {\n margin-bottom: 10px;\n}\n\n.popover.bs-popover-top .arrow, .popover.bs-popover-auto[x-placement^=\"top\"] .arrow {\n bottom: 0;\n}\n\n.popover.bs-popover-top .arrow::before, .popover.bs-popover-auto[x-placement^=\"top\"] .arrow::before,\n.popover.bs-popover-top .arrow::after, .popover.bs-popover-auto[x-placement^=\"top\"] .arrow::after {\n border-bottom-width: 0;\n}\n\n.popover.bs-popover-top .arrow::before, .popover.bs-popover-auto[x-placement^=\"top\"] .arrow::before {\n bottom: -11px;\n margin-left: -6px;\n border-top-color: rgba(0, 0, 0, 0.25);\n}\n\n.popover.bs-popover-top .arrow::after, .popover.bs-popover-auto[x-placement^=\"top\"] .arrow::after {\n bottom: -10px;\n margin-left: -6px;\n border-top-color: #fff;\n}\n\n.popover.bs-popover-right, .popover.bs-popover-auto[x-placement^=\"right\"] {\n margin-left: 10px;\n}\n\n.popover.bs-popover-right .arrow, .popover.bs-popover-auto[x-placement^=\"right\"] .arrow {\n left: 0;\n}\n\n.popover.bs-popover-right .arrow::before, .popover.bs-popover-auto[x-placement^=\"right\"] .arrow::before,\n.popover.bs-popover-right .arrow::after, .popover.bs-popover-auto[x-placement^=\"right\"] .arrow::after {\n margin-top: -8px;\n border-left-width: 0;\n}\n\n.popover.bs-popover-right .arrow::before, .popover.bs-popover-auto[x-placement^=\"right\"] .arrow::before {\n left: -11px;\n border-right-color: rgba(0, 0, 0, 0.25);\n}\n\n.popover.bs-popover-right .arrow::after, .popover.bs-popover-auto[x-placement^=\"right\"] .arrow::after {\n left: -10px;\n border-right-color: #fff;\n}\n\n.popover.bs-popover-bottom, .popover.bs-popover-auto[x-placement^=\"bottom\"] {\n margin-top: 10px;\n}\n\n.popover.bs-popover-bottom .arrow, .popover.bs-popover-auto[x-placement^=\"bottom\"] .arrow {\n top: 0;\n}\n\n.popover.bs-popover-bottom .arrow::before, .popover.bs-popover-auto[x-placement^=\"bottom\"] .arrow::before,\n.popover.bs-popover-bottom .arrow::after, .popover.bs-popover-auto[x-placement^=\"bottom\"] .arrow::after {\n margin-left: -7px;\n border-top-width: 0;\n}\n\n.popover.bs-popover-bottom .arrow::before, .popover.bs-popover-auto[x-placement^=\"bottom\"] .arrow::before {\n top: -11px;\n border-bottom-color: rgba(0, 0, 0, 0.25);\n}\n\n.popover.bs-popover-bottom .arrow::after, .popover.bs-popover-auto[x-placement^=\"bottom\"] .arrow::after {\n top: -10px;\n border-bottom-color: #fff;\n}\n\n.popover.bs-popover-bottom .popover-header::before, .popover.bs-popover-auto[x-placement^=\"bottom\"] .popover-header::before {\n position: absolute;\n top: 0;\n left: 50%;\n display: block;\n width: 20px;\n margin-left: -10px;\n content: \"\";\n border-bottom: 1px solid #f7f7f7;\n}\n\n.popover.bs-popover-left, .popover.bs-popover-auto[x-placement^=\"left\"] {\n margin-right: 10px;\n}\n\n.popover.bs-popover-left .arrow, .popover.bs-popover-auto[x-placement^=\"left\"] .arrow {\n right: 0;\n}\n\n.popover.bs-popover-left .arrow::before, .popover.bs-popover-auto[x-placement^=\"left\"] .arrow::before,\n.popover.bs-popover-left .arrow::after, .popover.bs-popover-auto[x-placement^=\"left\"] .arrow::after {\n margin-top: -8px;\n border-right-width: 0;\n}\n\n.popover.bs-popover-left .arrow::before, .popover.bs-popover-auto[x-placement^=\"left\"] .arrow::before {\n right: -11px;\n border-left-color: rgba(0, 0, 0, 0.25);\n}\n\n.popover.bs-popover-left .arrow::after, .popover.bs-popover-auto[x-placement^=\"left\"] .arrow::after {\n right: -10px;\n border-left-color: #fff;\n}\n\n.popover-header {\n padding: 8px 14px;\n margin-bottom: 0;\n font-size: 1rem;\n color: inherit;\n background-color: #f7f7f7;\n border-bottom: 1px solid #ebebeb;\n border-top-left-radius: calc(0.3rem - 1px);\n border-top-right-radius: calc(0.3rem - 1px);\n}\n\n.popover-header:empty {\n display: none;\n}\n\n.popover-body {\n padding: 9px 14px;\n color: #212529;\n}\n\n.carousel {\n position: relative;\n}\n\n.carousel-inner {\n position: relative;\n width: 100%;\n overflow: hidden;\n}\n\n.carousel-item {\n position: relative;\n display: none;\n align-items: center;\n width: 100%;\n transition: transform 0.6s ease;\n backface-visibility: hidden;\n perspective: 1000px;\n}\n\n.carousel-item.active,\n.carousel-item-next,\n.carousel-item-prev {\n display: block;\n}\n\n.carousel-item-next,\n.carousel-item-prev {\n position: absolute;\n top: 0;\n}\n\n.carousel-item-next.carousel-item-left,\n.carousel-item-prev.carousel-item-right {\n transform: translateX(0);\n}\n\n@supports (transform-style: preserve-3d) {\n .carousel-item-next.carousel-item-left,\n .carousel-item-prev.carousel-item-right {\n transform: translate3d(0, 0, 0);\n }\n}\n\n.carousel-item-next,\n.active.carousel-item-right {\n transform: translateX(100%);\n}\n\n@supports (transform-style: preserve-3d) {\n .carousel-item-next,\n .active.carousel-item-right {\n transform: translate3d(100%, 0, 0);\n }\n}\n\n.carousel-item-prev,\n.active.carousel-item-left {\n transform: translateX(-100%);\n}\n\n@supports (transform-style: preserve-3d) {\n .carousel-item-prev,\n .active.carousel-item-left {\n transform: translate3d(-100%, 0, 0);\n }\n}\n\n.carousel-control-prev,\n.carousel-control-next {\n position: absolute;\n top: 0;\n bottom: 0;\n display: flex;\n align-items: center;\n justify-content: center;\n width: 15%;\n color: #fff;\n text-align: center;\n opacity: 0.5;\n}\n\n.carousel-control-prev:focus, .carousel-control-prev:hover,\n.carousel-control-next:focus,\n.carousel-control-next:hover {\n color: #fff;\n text-decoration: none;\n outline: 0;\n opacity: .9;\n}\n\n.carousel-control-prev {\n left: 0;\n}\n\n.carousel-control-next {\n right: 0;\n}\n\n.carousel-control-prev-icon,\n.carousel-control-next-icon {\n display: inline-block;\n width: 20px;\n height: 20px;\n background: transparent no-repeat center center;\n background-size: 100% 100%;\n}\n\n.carousel-control-prev-icon {\n background-image: url(\"data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' viewBox='0 0 8 8'%3E%3Cpath d='M4 0l-4 4 4 4 1.5-1.5-2.5-2.5 2.5-2.5-1.5-1.5z'/%3E%3C/svg%3E\");\n}\n\n.carousel-control-next-icon {\n background-image: url(\"data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' viewBox='0 0 8 8'%3E%3Cpath d='M1.5 0l-1.5 1.5 2.5 2.5-2.5 2.5 1.5 1.5 4-4-4-4z'/%3E%3C/svg%3E\");\n}\n\n.carousel-indicators {\n position: absolute;\n right: 0;\n bottom: 10px;\n left: 0;\n z-index: 15;\n display: flex;\n justify-content: center;\n padding-left: 0;\n margin-right: 15%;\n margin-left: 15%;\n list-style: none;\n}\n\n.carousel-indicators li {\n position: relative;\n flex: 0 1 auto;\n width: 30px;\n height: 3px;\n margin-right: 3px;\n margin-left: 3px;\n text-indent: -999px;\n background-color: rgba(255, 255, 255, 0.5);\n}\n\n.carousel-indicators li::before {\n position: absolute;\n top: -10px;\n left: 0;\n display: inline-block;\n width: 100%;\n height: 10px;\n content: \"\";\n}\n\n.carousel-indicators li::after {\n position: absolute;\n bottom: -10px;\n left: 0;\n display: inline-block;\n width: 100%;\n height: 10px;\n content: \"\";\n}\n\n.carousel-indicators .active {\n background-color: #fff;\n}\n\n.carousel-caption {\n position: absolute;\n right: 15%;\n bottom: 20px;\n left: 15%;\n z-index: 10;\n padding-top: 20px;\n padding-bottom: 20px;\n color: #fff;\n text-align: center;\n}\n\n.align-baseline {\n vertical-align: baseline !important;\n}\n\n.align-top {\n vertical-align: top !important;\n}\n\n.align-middle {\n vertical-align: middle !important;\n}\n\n.align-bottom {\n vertical-align: bottom !important;\n}\n\n.align-text-bottom {\n vertical-align: text-bottom !important;\n}\n\n.align-text-top {\n vertical-align: text-top !important;\n}\n\n.bg-primary {\n background-color: #007bff !important;\n}\n\na.bg-primary:focus, a.bg-primary:hover {\n background-color: #0062cc !important;\n}\n\n.bg-secondary {\n background-color: #868e96 !important;\n}\n\na.bg-secondary:focus, a.bg-secondary:hover {\n background-color: #6c757d !important;\n}\n\n.bg-success {\n background-color: #28a745 !important;\n}\n\na.bg-success:focus, a.bg-success:hover {\n background-color: #1e7e34 !important;\n}\n\n.bg-info {\n background-color: #17a2b8 !important;\n}\n\na.bg-info:focus, a.bg-info:hover {\n background-color: #117a8b !important;\n}\n\n.bg-warning {\n background-color: #ffc107 !important;\n}\n\na.bg-warning:focus, a.bg-warning:hover {\n background-color: #d39e00 !important;\n}\n\n.bg-danger {\n background-color: #dc3545 !important;\n}\n\na.bg-danger:focus, a.bg-danger:hover {\n background-color: #bd2130 !important;\n}\n\n.bg-light {\n background-color: #f8f9fa !important;\n}\n\na.bg-light:focus, a.bg-light:hover {\n background-color: #dae0e5 !important;\n}\n\n.bg-dark {\n background-color: #343a40 !important;\n}\n\na.bg-dark:focus, a.bg-dark:hover {\n background-color: #1d2124 !important;\n}\n\n.bg-white {\n background-color: #fff !important;\n}\n\n.bg-transparent {\n background-color: transparent !important;\n}\n\n.border {\n border: 1px solid #e9ecef !important;\n}\n\n.border-0 {\n border: 0 !important;\n}\n\n.border-top-0 {\n border-top: 0 !important;\n}\n\n.border-right-0 {\n border-right: 0 !important;\n}\n\n.border-bottom-0 {\n border-bottom: 0 !important;\n}\n\n.border-left-0 {\n border-left: 0 !important;\n}\n\n.border-primary {\n border-color: #007bff !important;\n}\n\n.border-secondary {\n border-color: #868e96 !important;\n}\n\n.border-success {\n border-color: #28a745 !important;\n}\n\n.border-info {\n border-color: #17a2b8 !important;\n}\n\n.border-warning {\n border-color: #ffc107 !important;\n}\n\n.border-danger {\n border-color: #dc3545 !important;\n}\n\n.border-light {\n border-color: #f8f9fa !important;\n}\n\n.border-dark {\n border-color: #343a40 !important;\n}\n\n.border-white {\n border-color: #fff !important;\n}\n\n.rounded {\n border-radius: 0.25rem !important;\n}\n\n.rounded-top {\n border-top-left-radius: 0.25rem !important;\n border-top-right-radius: 0.25rem !important;\n}\n\n.rounded-right {\n border-top-right-radius: 0.25rem !important;\n border-bottom-right-radius: 0.25rem !important;\n}\n\n.rounded-bottom {\n border-bottom-right-radius: 0.25rem !important;\n border-bottom-left-radius: 0.25rem !important;\n}\n\n.rounded-left {\n border-top-left-radius: 0.25rem !important;\n border-bottom-left-radius: 0.25rem !important;\n}\n\n.rounded-circle {\n border-radius: 50%;\n}\n\n.rounded-0 {\n border-radius: 0;\n}\n\n.clearfix::after {\n display: block;\n clear: both;\n content: \"\";\n}\n\n.d-none {\n display: none !important;\n}\n\n.d-inline {\n display: inline !important;\n}\n\n.d-inline-block {\n display: inline-block !important;\n}\n\n.d-block {\n display: block !important;\n}\n\n.d-table {\n display: table !important;\n}\n\n.d-table-cell {\n display: table-cell !important;\n}\n\n.d-flex {\n display: flex !important;\n}\n\n.d-inline-flex {\n display: inline-flex !important;\n}\n\n@media (min-width: 576px) {\n .d-sm-none {\n display: none !important;\n }\n .d-sm-inline {\n display: inline !important;\n }\n .d-sm-inline-block {\n display: inline-block !important;\n }\n .d-sm-block {\n display: block !important;\n }\n .d-sm-table {\n display: table !important;\n }\n .d-sm-table-cell {\n display: table-cell !important;\n }\n .d-sm-flex {\n display: flex !important;\n }\n .d-sm-inline-flex {\n display: inline-flex !important;\n }\n}\n\n@media (min-width: 768px) {\n .d-md-none {\n display: none !important;\n }\n .d-md-inline {\n display: inline !important;\n }\n .d-md-inline-block {\n display: inline-block !important;\n }\n .d-md-block {\n display: block !important;\n }\n .d-md-table {\n display: table !important;\n }\n .d-md-table-cell {\n display: table-cell !important;\n }\n .d-md-flex {\n display: flex !important;\n }\n .d-md-inline-flex {\n display: inline-flex !important;\n }\n}\n\n@media (min-width: 992px) {\n .d-lg-none {\n display: none !important;\n }\n .d-lg-inline {\n display: inline !important;\n }\n .d-lg-inline-block {\n display: inline-block !important;\n }\n .d-lg-block {\n display: block !important;\n }\n .d-lg-table {\n display: table !important;\n }\n .d-lg-table-cell {\n display: table-cell !important;\n }\n .d-lg-flex {\n display: flex !important;\n }\n .d-lg-inline-flex {\n display: inline-flex !important;\n }\n}\n\n@media (min-width: 1200px) {\n .d-xl-none {\n display: none !important;\n }\n .d-xl-inline {\n display: inline !important;\n }\n .d-xl-inline-block {\n display: inline-block !important;\n }\n .d-xl-block {\n display: block !important;\n }\n .d-xl-table {\n display: table !important;\n }\n .d-xl-table-cell {\n display: table-cell !important;\n }\n .d-xl-flex {\n display: flex !important;\n }\n .d-xl-inline-flex {\n display: inline-flex !important;\n }\n}\n\n.d-print-block {\n display: none !important;\n}\n\n@media print {\n .d-print-block {\n display: block !important;\n }\n}\n\n.d-print-inline {\n display: none !important;\n}\n\n@media print {\n .d-print-inline {\n display: inline !important;\n }\n}\n\n.d-print-inline-block {\n display: none !important;\n}\n\n@media print {\n .d-print-inline-block {\n display: inline-block !important;\n }\n}\n\n@media print {\n .d-print-none {\n display: none !important;\n }\n}\n\n.embed-responsive {\n position: relative;\n display: block;\n width: 100%;\n padding: 0;\n overflow: hidden;\n}\n\n.embed-responsive::before {\n display: block;\n content: \"\";\n}\n\n.embed-responsive .embed-responsive-item,\n.embed-responsive iframe,\n.embed-responsive embed,\n.embed-responsive object,\n.embed-responsive video {\n position: absolute;\n top: 0;\n bottom: 0;\n left: 0;\n width: 100%;\n height: 100%;\n border: 0;\n}\n\n.embed-responsive-21by9::before {\n padding-top: 42.857143%;\n}\n\n.embed-responsive-16by9::before {\n padding-top: 56.25%;\n}\n\n.embed-responsive-4by3::before {\n padding-top: 75%;\n}\n\n.embed-responsive-1by1::before {\n padding-top: 100%;\n}\n\n.flex-row {\n flex-direction: row !important;\n}\n\n.flex-column {\n flex-direction: column !important;\n}\n\n.flex-row-reverse {\n flex-direction: row-reverse !important;\n}\n\n.flex-column-reverse {\n flex-direction: column-reverse !important;\n}\n\n.flex-wrap {\n flex-wrap: wrap !important;\n}\n\n.flex-nowrap {\n flex-wrap: nowrap !important;\n}\n\n.flex-wrap-reverse {\n flex-wrap: wrap-reverse !important;\n}\n\n.justify-content-start {\n justify-content: flex-start !important;\n}\n\n.justify-content-end {\n justify-content: flex-end !important;\n}\n\n.justify-content-center {\n justify-content: center !important;\n}\n\n.justify-content-between {\n justify-content: space-between !important;\n}\n\n.justify-content-around {\n justify-content: space-around !important;\n}\n\n.align-items-start {\n align-items: flex-start !important;\n}\n\n.align-items-end {\n align-items: flex-end !important;\n}\n\n.align-items-center {\n align-items: center !important;\n}\n\n.align-items-baseline {\n align-items: baseline !important;\n}\n\n.align-items-stretch {\n align-items: stretch !important;\n}\n\n.align-content-start {\n align-content: flex-start !important;\n}\n\n.align-content-end {\n align-content: flex-end !important;\n}\n\n.align-content-center {\n align-content: center !important;\n}\n\n.align-content-between {\n align-content: space-between !important;\n}\n\n.align-content-around {\n align-content: space-around !important;\n}\n\n.align-content-stretch {\n align-content: stretch !important;\n}\n\n.align-self-auto {\n align-self: auto !important;\n}\n\n.align-self-start {\n align-self: flex-start !important;\n}\n\n.align-self-end {\n align-self: flex-end !important;\n}\n\n.align-self-center {\n align-self: center !important;\n}\n\n.align-self-baseline {\n align-self: baseline !important;\n}\n\n.align-self-stretch {\n align-self: stretch !important;\n}\n\n@media (min-width: 576px) {\n .flex-sm-row {\n flex-direction: row !important;\n }\n .flex-sm-column {\n flex-direction: column !important;\n }\n .flex-sm-row-reverse {\n flex-direction: row-reverse !important;\n }\n .flex-sm-column-reverse {\n flex-direction: column-reverse !important;\n }\n .flex-sm-wrap {\n flex-wrap: wrap !important;\n }\n .flex-sm-nowrap {\n flex-wrap: nowrap !important;\n }\n .flex-sm-wrap-reverse {\n flex-wrap: wrap-reverse !important;\n }\n .justify-content-sm-start {\n justify-content: flex-start !important;\n }\n .justify-content-sm-end {\n justify-content: flex-end !important;\n }\n .justify-content-sm-center {\n justify-content: center !important;\n }\n .justify-content-sm-between {\n justify-content: space-between !important;\n }\n .justify-content-sm-around {\n justify-content: space-around !important;\n }\n .align-items-sm-start {\n align-items: flex-start !important;\n }\n .align-items-sm-end {\n align-items: flex-end !important;\n }\n .align-items-sm-center {\n align-items: center !important;\n }\n .align-items-sm-baseline {\n align-items: baseline !important;\n }\n .align-items-sm-stretch {\n align-items: stretch !important;\n }\n .align-content-sm-start {\n align-content: flex-start !important;\n }\n .align-content-sm-end {\n align-content: flex-end !important;\n }\n .align-content-sm-center {\n align-content: center !important;\n }\n .align-content-sm-between {\n align-content: space-between !important;\n }\n .align-content-sm-around {\n align-content: space-around !important;\n }\n .align-content-sm-stretch {\n align-content: stretch !important;\n }\n .align-self-sm-auto {\n align-self: auto !important;\n }\n .align-self-sm-start {\n align-self: flex-start !important;\n }\n .align-self-sm-end {\n align-self: flex-end !important;\n }\n .align-self-sm-center {\n align-self: center !important;\n }\n .align-self-sm-baseline {\n align-self: baseline !important;\n }\n .align-self-sm-stretch {\n align-self: stretch !important;\n }\n}\n\n@media (min-width: 768px) {\n .flex-md-row {\n flex-direction: row !important;\n }\n .flex-md-column {\n flex-direction: column !important;\n }\n .flex-md-row-reverse {\n flex-direction: row-reverse !important;\n }\n .flex-md-column-reverse {\n flex-direction: column-reverse !important;\n }\n .flex-md-wrap {\n flex-wrap: wrap !important;\n }\n .flex-md-nowrap {\n flex-wrap: nowrap !important;\n }\n .flex-md-wrap-reverse {\n flex-wrap: wrap-reverse !important;\n }\n .justify-content-md-start {\n justify-content: flex-start !important;\n }\n .justify-content-md-end {\n justify-content: flex-end !important;\n }\n .justify-content-md-center {\n justify-content: center !important;\n }\n .justify-content-md-between {\n justify-content: space-between !important;\n }\n .justify-content-md-around {\n justify-content: space-around !important;\n }\n .align-items-md-start {\n align-items: flex-start !important;\n }\n .align-items-md-end {\n align-items: flex-end !important;\n }\n .align-items-md-center {\n align-items: center !important;\n }\n .align-items-md-baseline {\n align-items: baseline !important;\n }\n .align-items-md-stretch {\n align-items: stretch !important;\n }\n .align-content-md-start {\n align-content: flex-start !important;\n }\n .align-content-md-end {\n align-content: flex-end !important;\n }\n .align-content-md-center {\n align-content: center !important;\n }\n .align-content-md-between {\n align-content: space-between !important;\n }\n .align-content-md-around {\n align-content: space-around !important;\n }\n .align-content-md-stretch {\n align-content: stretch !important;\n }\n .align-self-md-auto {\n align-self: auto !important;\n }\n .align-self-md-start {\n align-self: flex-start !important;\n }\n .align-self-md-end {\n align-self: flex-end !important;\n }\n .align-self-md-center {\n align-self: center !important;\n }\n .align-self-md-baseline {\n align-self: baseline !important;\n }\n .align-self-md-stretch {\n align-self: stretch !important;\n }\n}\n\n@media (min-width: 992px) {\n .flex-lg-row {\n flex-direction: row !important;\n }\n .flex-lg-column {\n flex-direction: column !important;\n }\n .flex-lg-row-reverse {\n flex-direction: row-reverse !important;\n }\n .flex-lg-column-reverse {\n flex-direction: column-reverse !important;\n }\n .flex-lg-wrap {\n flex-wrap: wrap !important;\n }\n .flex-lg-nowrap {\n flex-wrap: nowrap !important;\n }\n .flex-lg-wrap-reverse {\n flex-wrap: wrap-reverse !important;\n }\n .justify-content-lg-start {\n justify-content: flex-start !important;\n }\n .justify-content-lg-end {\n justify-content: flex-end !important;\n }\n .justify-content-lg-center {\n justify-content: center !important;\n }\n .justify-content-lg-between {\n justify-content: space-between !important;\n }\n .justify-content-lg-around {\n justify-content: space-around !important;\n }\n .align-items-lg-start {\n align-items: flex-start !important;\n }\n .align-items-lg-end {\n align-items: flex-end !important;\n }\n .align-items-lg-center {\n align-items: center !important;\n }\n .align-items-lg-baseline {\n align-items: baseline !important;\n }\n .align-items-lg-stretch {\n align-items: stretch !important;\n }\n .align-content-lg-start {\n align-content: flex-start !important;\n }\n .align-content-lg-end {\n align-content: flex-end !important;\n }\n .align-content-lg-center {\n align-content: center !important;\n }\n .align-content-lg-between {\n align-content: space-between !important;\n }\n .align-content-lg-around {\n align-content: space-around !important;\n }\n .align-content-lg-stretch {\n align-content: stretch !important;\n }\n .align-self-lg-auto {\n align-self: auto !important;\n }\n .align-self-lg-start {\n align-self: flex-start !important;\n }\n .align-self-lg-end {\n align-self: flex-end !important;\n }\n .align-self-lg-center {\n align-self: center !important;\n }\n .align-self-lg-baseline {\n align-self: baseline !important;\n }\n .align-self-lg-stretch {\n align-self: stretch !important;\n }\n}\n\n@media (min-width: 1200px) {\n .flex-xl-row {\n flex-direction: row !important;\n }\n .flex-xl-column {\n flex-direction: column !important;\n }\n .flex-xl-row-reverse {\n flex-direction: row-reverse !important;\n }\n .flex-xl-column-reverse {\n flex-direction: column-reverse !important;\n }\n .flex-xl-wrap {\n flex-wrap: wrap !important;\n }\n .flex-xl-nowrap {\n flex-wrap: nowrap !important;\n }\n .flex-xl-wrap-reverse {\n flex-wrap: wrap-reverse !important;\n }\n .justify-content-xl-start {\n justify-content: flex-start !important;\n }\n .justify-content-xl-end {\n justify-content: flex-end !important;\n }\n .justify-content-xl-center {\n justify-content: center !important;\n }\n .justify-content-xl-between {\n justify-content: space-between !important;\n }\n .justify-content-xl-around {\n justify-content: space-around !important;\n }\n .align-items-xl-start {\n align-items: flex-start !important;\n }\n .align-items-xl-end {\n align-items: flex-end !important;\n }\n .align-items-xl-center {\n align-items: center !important;\n }\n .align-items-xl-baseline {\n align-items: baseline !important;\n }\n .align-items-xl-stretch {\n align-items: stretch !important;\n }\n .align-content-xl-start {\n align-content: flex-start !important;\n }\n .align-content-xl-end {\n align-content: flex-end !important;\n }\n .align-content-xl-center {\n align-content: center !important;\n }\n .align-content-xl-between {\n align-content: space-between !important;\n }\n .align-content-xl-around {\n align-content: space-around !important;\n }\n .align-content-xl-stretch {\n align-content: stretch !important;\n }\n .align-self-xl-auto {\n align-self: auto !important;\n }\n .align-self-xl-start {\n align-self: flex-start !important;\n }\n .align-self-xl-end {\n align-self: flex-end !important;\n }\n .align-self-xl-center {\n align-self: center !important;\n }\n .align-self-xl-baseline {\n align-self: baseline !important;\n }\n .align-self-xl-stretch {\n align-self: stretch !important;\n }\n}\n\n.float-left {\n float: left !important;\n}\n\n.float-right {\n float: right !important;\n}\n\n.float-none {\n float: none !important;\n}\n\n@media (min-width: 576px) {\n .float-sm-left {\n float: left !important;\n }\n .float-sm-right {\n float: right !important;\n }\n .float-sm-none {\n float: none !important;\n }\n}\n\n@media (min-width: 768px) {\n .float-md-left {\n float: left !important;\n }\n .float-md-right {\n float: right !important;\n }\n .float-md-none {\n float: none !important;\n }\n}\n\n@media (min-width: 992px) {\n .float-lg-left {\n float: left !important;\n }\n .float-lg-right {\n float: right !important;\n }\n .float-lg-none {\n float: none !important;\n }\n}\n\n@media (min-width: 1200px) {\n .float-xl-left {\n float: left !important;\n }\n .float-xl-right {\n float: right !important;\n }\n .float-xl-none {\n float: none !important;\n }\n}\n\n.fixed-top {\n position: fixed;\n top: 0;\n right: 0;\n left: 0;\n z-index: 1030;\n}\n\n.fixed-bottom {\n position: fixed;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: 1030;\n}\n\n@supports (position: sticky) {\n .sticky-top {\n position: sticky;\n top: 0;\n z-index: 1020;\n }\n}\n\n.sr-only {\n position: absolute;\n width: 1px;\n height: 1px;\n padding: 0;\n overflow: hidden;\n clip: rect(0, 0, 0, 0);\n white-space: nowrap;\n clip-path: inset(50%);\n border: 0;\n}\n\n.sr-only-focusable:active, .sr-only-focusable:focus {\n position: static;\n width: auto;\n height: auto;\n overflow: visible;\n clip: auto;\n white-space: normal;\n clip-path: none;\n}\n\n.w-25 {\n width: 25% !important;\n}\n\n.w-50 {\n width: 50% !important;\n}\n\n.w-75 {\n width: 75% !important;\n}\n\n.w-100 {\n width: 100% !important;\n}\n\n.h-25 {\n height: 25% !important;\n}\n\n.h-50 {\n height: 50% !important;\n}\n\n.h-75 {\n height: 75% !important;\n}\n\n.h-100 {\n height: 100% !important;\n}\n\n.mw-100 {\n max-width: 100% !important;\n}\n\n.mh-100 {\n max-height: 100% !important;\n}\n\n.m-0 {\n margin: 0 !important;\n}\n\n.mt-0 {\n margin-top: 0 !important;\n}\n\n.mr-0 {\n margin-right: 0 !important;\n}\n\n.mb-0 {\n margin-bottom: 0 !important;\n}\n\n.ml-0 {\n margin-left: 0 !important;\n}\n\n.mx-0 {\n margin-right: 0 !important;\n margin-left: 0 !important;\n}\n\n.my-0 {\n margin-top: 0 !important;\n margin-bottom: 0 !important;\n}\n\n.m-1 {\n margin: 0.25rem !important;\n}\n\n.mt-1 {\n margin-top: 0.25rem !important;\n}\n\n.mr-1 {\n margin-right: 0.25rem !important;\n}\n\n.mb-1 {\n margin-bottom: 0.25rem !important;\n}\n\n.ml-1 {\n margin-left: 0.25rem !important;\n}\n\n.mx-1 {\n margin-right: 0.25rem !important;\n margin-left: 0.25rem !important;\n}\n\n.my-1 {\n margin-top: 0.25rem !important;\n margin-bottom: 0.25rem !important;\n}\n\n.m-2 {\n margin: 0.5rem !important;\n}\n\n.mt-2 {\n margin-top: 0.5rem !important;\n}\n\n.mr-2 {\n margin-right: 0.5rem !important;\n}\n\n.mb-2 {\n margin-bottom: 0.5rem !important;\n}\n\n.ml-2 {\n margin-left: 0.5rem !important;\n}\n\n.mx-2 {\n margin-right: 0.5rem !important;\n margin-left: 0.5rem !important;\n}\n\n.my-2 {\n margin-top: 0.5rem !important;\n margin-bottom: 0.5rem !important;\n}\n\n.m-3 {\n margin: 1rem !important;\n}\n\n.mt-3 {\n margin-top: 1rem !important;\n}\n\n.mr-3 {\n margin-right: 1rem !important;\n}\n\n.mb-3 {\n margin-bottom: 1rem !important;\n}\n\n.ml-3 {\n margin-left: 1rem !important;\n}\n\n.mx-3 {\n margin-right: 1rem !important;\n margin-left: 1rem !important;\n}\n\n.my-3 {\n margin-top: 1rem !important;\n margin-bottom: 1rem !important;\n}\n\n.m-4 {\n margin: 1.5rem !important;\n}\n\n.mt-4 {\n margin-top: 1.5rem !important;\n}\n\n.mr-4 {\n margin-right: 1.5rem !important;\n}\n\n.mb-4 {\n margin-bottom: 1.5rem !important;\n}\n\n.ml-4 {\n margin-left: 1.5rem !important;\n}\n\n.mx-4 {\n margin-right: 1.5rem !important;\n margin-left: 1.5rem !important;\n}\n\n.my-4 {\n margin-top: 1.5rem !important;\n margin-bottom: 1.5rem !important;\n}\n\n.m-5 {\n margin: 3rem !important;\n}\n\n.mt-5 {\n margin-top: 3rem !important;\n}\n\n.mr-5 {\n margin-right: 3rem !important;\n}\n\n.mb-5 {\n margin-bottom: 3rem !important;\n}\n\n.ml-5 {\n margin-left: 3rem !important;\n}\n\n.mx-5 {\n margin-right: 3rem !important;\n margin-left: 3rem !important;\n}\n\n.my-5 {\n margin-top: 3rem !important;\n margin-bottom: 3rem !important;\n}\n\n.p-0 {\n padding: 0 !important;\n}\n\n.pt-0 {\n padding-top: 0 !important;\n}\n\n.pr-0 {\n padding-right: 0 !important;\n}\n\n.pb-0 {\n padding-bottom: 0 !important;\n}\n\n.pl-0 {\n padding-left: 0 !important;\n}\n\n.px-0 {\n padding-right: 0 !important;\n padding-left: 0 !important;\n}\n\n.py-0 {\n padding-top: 0 !important;\n padding-bottom: 0 !important;\n}\n\n.p-1 {\n padding: 0.25rem !important;\n}\n\n.pt-1 {\n padding-top: 0.25rem !important;\n}\n\n.pr-1 {\n padding-right: 0.25rem !important;\n}\n\n.pb-1 {\n padding-bottom: 0.25rem !important;\n}\n\n.pl-1 {\n padding-left: 0.25rem !important;\n}\n\n.px-1 {\n padding-right: 0.25rem !important;\n padding-left: 0.25rem !important;\n}\n\n.py-1 {\n padding-top: 0.25rem !important;\n padding-bottom: 0.25rem !important;\n}\n\n.p-2 {\n padding: 0.5rem !important;\n}\n\n.pt-2 {\n padding-top: 0.5rem !important;\n}\n\n.pr-2 {\n padding-right: 0.5rem !important;\n}\n\n.pb-2 {\n padding-bottom: 0.5rem !important;\n}\n\n.pl-2 {\n padding-left: 0.5rem !important;\n}\n\n.px-2 {\n padding-right: 0.5rem !important;\n padding-left: 0.5rem !important;\n}\n\n.py-2 {\n padding-top: 0.5rem !important;\n padding-bottom: 0.5rem !important;\n}\n\n.p-3 {\n padding: 1rem !important;\n}\n\n.pt-3 {\n padding-top: 1rem !important;\n}\n\n.pr-3 {\n padding-right: 1rem !important;\n}\n\n.pb-3 {\n padding-bottom: 1rem !important;\n}\n\n.pl-3 {\n padding-left: 1rem !important;\n}\n\n.px-3 {\n padding-right: 1rem !important;\n padding-left: 1rem !important;\n}\n\n.py-3 {\n padding-top: 1rem !important;\n padding-bottom: 1rem !important;\n}\n\n.p-4 {\n padding: 1.5rem !important;\n}\n\n.pt-4 {\n padding-top: 1.5rem !important;\n}\n\n.pr-4 {\n padding-right: 1.5rem !important;\n}\n\n.pb-4 {\n padding-bottom: 1.5rem !important;\n}\n\n.pl-4 {\n padding-left: 1.5rem !important;\n}\n\n.px-4 {\n padding-right: 1.5rem !important;\n padding-left: 1.5rem !important;\n}\n\n.py-4 {\n padding-top: 1.5rem !important;\n padding-bottom: 1.5rem !important;\n}\n\n.p-5 {\n padding: 3rem !important;\n}\n\n.pt-5 {\n padding-top: 3rem !important;\n}\n\n.pr-5 {\n padding-right: 3rem !important;\n}\n\n.pb-5 {\n padding-bottom: 3rem !important;\n}\n\n.pl-5 {\n padding-left: 3rem !important;\n}\n\n.px-5 {\n padding-right: 3rem !important;\n padding-left: 3rem !important;\n}\n\n.py-5 {\n padding-top: 3rem !important;\n padding-bottom: 3rem !important;\n}\n\n.m-auto {\n margin: auto !important;\n}\n\n.mt-auto {\n margin-top: auto !important;\n}\n\n.mr-auto {\n margin-right: auto !important;\n}\n\n.mb-auto {\n margin-bottom: auto !important;\n}\n\n.ml-auto {\n margin-left: auto !important;\n}\n\n.mx-auto {\n margin-right: auto !important;\n margin-left: auto !important;\n}\n\n.my-auto {\n margin-top: auto !important;\n margin-bottom: auto !important;\n}\n\n@media (min-width: 576px) {\n .m-sm-0 {\n margin: 0 !important;\n }\n .mt-sm-0 {\n margin-top: 0 !important;\n }\n .mr-sm-0 {\n margin-right: 0 !important;\n }\n .mb-sm-0 {\n margin-bottom: 0 !important;\n }\n .ml-sm-0 {\n margin-left: 0 !important;\n }\n .mx-sm-0 {\n margin-right: 0 !important;\n margin-left: 0 !important;\n }\n .my-sm-0 {\n margin-top: 0 !important;\n margin-bottom: 0 !important;\n }\n .m-sm-1 {\n margin: 0.25rem !important;\n }\n .mt-sm-1 {\n margin-top: 0.25rem !important;\n }\n .mr-sm-1 {\n margin-right: 0.25rem !important;\n }\n .mb-sm-1 {\n margin-bottom: 0.25rem !important;\n }\n .ml-sm-1 {\n margin-left: 0.25rem !important;\n }\n .mx-sm-1 {\n margin-right: 0.25rem !important;\n margin-left: 0.25rem !important;\n }\n .my-sm-1 {\n margin-top: 0.25rem !important;\n margin-bottom: 0.25rem !important;\n }\n .m-sm-2 {\n margin: 0.5rem !important;\n }\n .mt-sm-2 {\n margin-top: 0.5rem !important;\n }\n .mr-sm-2 {\n margin-right: 0.5rem !important;\n }\n .mb-sm-2 {\n margin-bottom: 0.5rem !important;\n }\n .ml-sm-2 {\n margin-left: 0.5rem !important;\n }\n .mx-sm-2 {\n margin-right: 0.5rem !important;\n margin-left: 0.5rem !important;\n }\n .my-sm-2 {\n margin-top: 0.5rem !important;\n margin-bottom: 0.5rem !important;\n }\n .m-sm-3 {\n margin: 1rem !important;\n }\n .mt-sm-3 {\n margin-top: 1rem !important;\n }\n .mr-sm-3 {\n margin-right: 1rem !important;\n }\n .mb-sm-3 {\n margin-bottom: 1rem !important;\n }\n .ml-sm-3 {\n margin-left: 1rem !important;\n }\n .mx-sm-3 {\n margin-right: 1rem !important;\n margin-left: 1rem !important;\n }\n .my-sm-3 {\n margin-top: 1rem !important;\n margin-bottom: 1rem !important;\n }\n .m-sm-4 {\n margin: 1.5rem !important;\n }\n .mt-sm-4 {\n margin-top: 1.5rem !important;\n }\n .mr-sm-4 {\n margin-right: 1.5rem !important;\n }\n .mb-sm-4 {\n margin-bottom: 1.5rem !important;\n }\n .ml-sm-4 {\n margin-left: 1.5rem !important;\n }\n .mx-sm-4 {\n margin-right: 1.5rem !important;\n margin-left: 1.5rem !important;\n }\n .my-sm-4 {\n margin-top: 1.5rem !important;\n margin-bottom: 1.5rem !important;\n }\n .m-sm-5 {\n margin: 3rem !important;\n }\n .mt-sm-5 {\n margin-top: 3rem !important;\n }\n .mr-sm-5 {\n margin-right: 3rem !important;\n }\n .mb-sm-5 {\n margin-bottom: 3rem !important;\n }\n .ml-sm-5 {\n margin-left: 3rem !important;\n }\n .mx-sm-5 {\n margin-right: 3rem !important;\n margin-left: 3rem !important;\n }\n .my-sm-5 {\n margin-top: 3rem !important;\n margin-bottom: 3rem !important;\n }\n .p-sm-0 {\n padding: 0 !important;\n }\n .pt-sm-0 {\n padding-top: 0 !important;\n }\n .pr-sm-0 {\n padding-right: 0 !important;\n }\n .pb-sm-0 {\n padding-bottom: 0 !important;\n }\n .pl-sm-0 {\n padding-left: 0 !important;\n }\n .px-sm-0 {\n padding-right: 0 !important;\n padding-left: 0 !important;\n }\n .py-sm-0 {\n padding-top: 0 !important;\n padding-bottom: 0 !important;\n }\n .p-sm-1 {\n padding: 0.25rem !important;\n }\n .pt-sm-1 {\n padding-top: 0.25rem !important;\n }\n .pr-sm-1 {\n padding-right: 0.25rem !important;\n }\n .pb-sm-1 {\n padding-bottom: 0.25rem !important;\n }\n .pl-sm-1 {\n padding-left: 0.25rem !important;\n }\n .px-sm-1 {\n padding-right: 0.25rem !important;\n padding-left: 0.25rem !important;\n }\n .py-sm-1 {\n padding-top: 0.25rem !important;\n padding-bottom: 0.25rem !important;\n }\n .p-sm-2 {\n padding: 0.5rem !important;\n }\n .pt-sm-2 {\n padding-top: 0.5rem !important;\n }\n .pr-sm-2 {\n padding-right: 0.5rem !important;\n }\n .pb-sm-2 {\n padding-bottom: 0.5rem !important;\n }\n .pl-sm-2 {\n padding-left: 0.5rem !important;\n }\n .px-sm-2 {\n padding-right: 0.5rem !important;\n padding-left: 0.5rem !important;\n }\n .py-sm-2 {\n padding-top: 0.5rem !important;\n padding-bottom: 0.5rem !important;\n }\n .p-sm-3 {\n padding: 1rem !important;\n }\n .pt-sm-3 {\n padding-top: 1rem !important;\n }\n .pr-sm-3 {\n padding-right: 1rem !important;\n }\n .pb-sm-3 {\n padding-bottom: 1rem !important;\n }\n .pl-sm-3 {\n padding-left: 1rem !important;\n }\n .px-sm-3 {\n padding-right: 1rem !important;\n padding-left: 1rem !important;\n }\n .py-sm-3 {\n padding-top: 1rem !important;\n padding-bottom: 1rem !important;\n }\n .p-sm-4 {\n padding: 1.5rem !important;\n }\n .pt-sm-4 {\n padding-top: 1.5rem !important;\n }\n .pr-sm-4 {\n padding-right: 1.5rem !important;\n }\n .pb-sm-4 {\n padding-bottom: 1.5rem !important;\n }\n .pl-sm-4 {\n padding-left: 1.5rem !important;\n }\n .px-sm-4 {\n padding-right: 1.5rem !important;\n padding-left: 1.5rem !important;\n }\n .py-sm-4 {\n padding-top: 1.5rem !important;\n padding-bottom: 1.5rem !important;\n }\n .p-sm-5 {\n padding: 3rem !important;\n }\n .pt-sm-5 {\n padding-top: 3rem !important;\n }\n .pr-sm-5 {\n padding-right: 3rem !important;\n }\n .pb-sm-5 {\n padding-bottom: 3rem !important;\n }\n .pl-sm-5 {\n padding-left: 3rem !important;\n }\n .px-sm-5 {\n padding-right: 3rem !important;\n padding-left: 3rem !important;\n }\n .py-sm-5 {\n padding-top: 3rem !important;\n padding-bottom: 3rem !important;\n }\n .m-sm-auto {\n margin: auto !important;\n }\n .mt-sm-auto {\n margin-top: auto !important;\n }\n .mr-sm-auto {\n margin-right: auto !important;\n }\n .mb-sm-auto {\n margin-bottom: auto !important;\n }\n .ml-sm-auto {\n margin-left: auto !important;\n }\n .mx-sm-auto {\n margin-right: auto !important;\n margin-left: auto !important;\n }\n .my-sm-auto {\n margin-top: auto !important;\n margin-bottom: auto !important;\n }\n}\n\n@media (min-width: 768px) {\n .m-md-0 {\n margin: 0 !important;\n }\n .mt-md-0 {\n margin-top: 0 !important;\n }\n .mr-md-0 {\n margin-right: 0 !important;\n }\n .mb-md-0 {\n margin-bottom: 0 !important;\n }\n .ml-md-0 {\n margin-left: 0 !important;\n }\n .mx-md-0 {\n margin-right: 0 !important;\n margin-left: 0 !important;\n }\n .my-md-0 {\n margin-top: 0 !important;\n margin-bottom: 0 !important;\n }\n .m-md-1 {\n margin: 0.25rem !important;\n }\n .mt-md-1 {\n margin-top: 0.25rem !important;\n }\n .mr-md-1 {\n margin-right: 0.25rem !important;\n }\n .mb-md-1 {\n margin-bottom: 0.25rem !important;\n }\n .ml-md-1 {\n margin-left: 0.25rem !important;\n }\n .mx-md-1 {\n margin-right: 0.25rem !important;\n margin-left: 0.25rem !important;\n }\n .my-md-1 {\n margin-top: 0.25rem !important;\n margin-bottom: 0.25rem !important;\n }\n .m-md-2 {\n margin: 0.5rem !important;\n }\n .mt-md-2 {\n margin-top: 0.5rem !important;\n }\n .mr-md-2 {\n margin-right: 0.5rem !important;\n }\n .mb-md-2 {\n margin-bottom: 0.5rem !important;\n }\n .ml-md-2 {\n margin-left: 0.5rem !important;\n }\n .mx-md-2 {\n margin-right: 0.5rem !important;\n margin-left: 0.5rem !important;\n }\n .my-md-2 {\n margin-top: 0.5rem !important;\n margin-bottom: 0.5rem !important;\n }\n .m-md-3 {\n margin: 1rem !important;\n }\n .mt-md-3 {\n margin-top: 1rem !important;\n }\n .mr-md-3 {\n margin-right: 1rem !important;\n }\n .mb-md-3 {\n margin-bottom: 1rem !important;\n }\n .ml-md-3 {\n margin-left: 1rem !important;\n }\n .mx-md-3 {\n margin-right: 1rem !important;\n margin-left: 1rem !important;\n }\n .my-md-3 {\n margin-top: 1rem !important;\n margin-bottom: 1rem !important;\n }\n .m-md-4 {\n margin: 1.5rem !important;\n }\n .mt-md-4 {\n margin-top: 1.5rem !important;\n }\n .mr-md-4 {\n margin-right: 1.5rem !important;\n }\n .mb-md-4 {\n margin-bottom: 1.5rem !important;\n }\n .ml-md-4 {\n margin-left: 1.5rem !important;\n }\n .mx-md-4 {\n margin-right: 1.5rem !important;\n margin-left: 1.5rem !important;\n }\n .my-md-4 {\n margin-top: 1.5rem !important;\n margin-bottom: 1.5rem !important;\n }\n .m-md-5 {\n margin: 3rem !important;\n }\n .mt-md-5 {\n margin-top: 3rem !important;\n }\n .mr-md-5 {\n margin-right: 3rem !important;\n }\n .mb-md-5 {\n margin-bottom: 3rem !important;\n }\n .ml-md-5 {\n margin-left: 3rem !important;\n }\n .mx-md-5 {\n margin-right: 3rem !important;\n margin-left: 3rem !important;\n }\n .my-md-5 {\n margin-top: 3rem !important;\n margin-bottom: 3rem !important;\n }\n .p-md-0 {\n padding: 0 !important;\n }\n .pt-md-0 {\n padding-top: 0 !important;\n }\n .pr-md-0 {\n padding-right: 0 !important;\n }\n .pb-md-0 {\n padding-bottom: 0 !important;\n }\n .pl-md-0 {\n padding-left: 0 !important;\n }\n .px-md-0 {\n padding-right: 0 !important;\n padding-left: 0 !important;\n }\n .py-md-0 {\n padding-top: 0 !important;\n padding-bottom: 0 !important;\n }\n .p-md-1 {\n padding: 0.25rem !important;\n }\n .pt-md-1 {\n padding-top: 0.25rem !important;\n }\n .pr-md-1 {\n padding-right: 0.25rem !important;\n }\n .pb-md-1 {\n padding-bottom: 0.25rem !important;\n }\n .pl-md-1 {\n padding-left: 0.25rem !important;\n }\n .px-md-1 {\n padding-right: 0.25rem !important;\n padding-left: 0.25rem !important;\n }\n .py-md-1 {\n padding-top: 0.25rem !important;\n padding-bottom: 0.25rem !important;\n }\n .p-md-2 {\n padding: 0.5rem !important;\n }\n .pt-md-2 {\n padding-top: 0.5rem !important;\n }\n .pr-md-2 {\n padding-right: 0.5rem !important;\n }\n .pb-md-2 {\n padding-bottom: 0.5rem !important;\n }\n .pl-md-2 {\n padding-left: 0.5rem !important;\n }\n .px-md-2 {\n padding-right: 0.5rem !important;\n padding-left: 0.5rem !important;\n }\n .py-md-2 {\n padding-top: 0.5rem !important;\n padding-bottom: 0.5rem !important;\n }\n .p-md-3 {\n padding: 1rem !important;\n }\n .pt-md-3 {\n padding-top: 1rem !important;\n }\n .pr-md-3 {\n padding-right: 1rem !important;\n }\n .pb-md-3 {\n padding-bottom: 1rem !important;\n }\n .pl-md-3 {\n padding-left: 1rem !important;\n }\n .px-md-3 {\n padding-right: 1rem !important;\n padding-left: 1rem !important;\n }\n .py-md-3 {\n padding-top: 1rem !important;\n padding-bottom: 1rem !important;\n }\n .p-md-4 {\n padding: 1.5rem !important;\n }\n .pt-md-4 {\n padding-top: 1.5rem !important;\n }\n .pr-md-4 {\n padding-right: 1.5rem !important;\n }\n .pb-md-4 {\n padding-bottom: 1.5rem !important;\n }\n .pl-md-4 {\n padding-left: 1.5rem !important;\n }\n .px-md-4 {\n padding-right: 1.5rem !important;\n padding-left: 1.5rem !important;\n }\n .py-md-4 {\n padding-top: 1.5rem !important;\n padding-bottom: 1.5rem !important;\n }\n .p-md-5 {\n padding: 3rem !important;\n }\n .pt-md-5 {\n padding-top: 3rem !important;\n }\n .pr-md-5 {\n padding-right: 3rem !important;\n }\n .pb-md-5 {\n padding-bottom: 3rem !important;\n }\n .pl-md-5 {\n padding-left: 3rem !important;\n }\n .px-md-5 {\n padding-right: 3rem !important;\n padding-left: 3rem !important;\n }\n .py-md-5 {\n padding-top: 3rem !important;\n padding-bottom: 3rem !important;\n }\n .m-md-auto {\n margin: auto !important;\n }\n .mt-md-auto {\n margin-top: auto !important;\n }\n .mr-md-auto {\n margin-right: auto !important;\n }\n .mb-md-auto {\n margin-bottom: auto !important;\n }\n .ml-md-auto {\n margin-left: auto !important;\n }\n .mx-md-auto {\n margin-right: auto !important;\n margin-left: auto !important;\n }\n .my-md-auto {\n margin-top: auto !important;\n margin-bottom: auto !important;\n }\n}\n\n@media (min-width: 992px) {\n .m-lg-0 {\n margin: 0 !important;\n }\n .mt-lg-0 {\n margin-top: 0 !important;\n }\n .mr-lg-0 {\n margin-right: 0 !important;\n }\n .mb-lg-0 {\n margin-bottom: 0 !important;\n }\n .ml-lg-0 {\n margin-left: 0 !important;\n }\n .mx-lg-0 {\n margin-right: 0 !important;\n margin-left: 0 !important;\n }\n .my-lg-0 {\n margin-top: 0 !important;\n margin-bottom: 0 !important;\n }\n .m-lg-1 {\n margin: 0.25rem !important;\n }\n .mt-lg-1 {\n margin-top: 0.25rem !important;\n }\n .mr-lg-1 {\n margin-right: 0.25rem !important;\n }\n .mb-lg-1 {\n margin-bottom: 0.25rem !important;\n }\n .ml-lg-1 {\n margin-left: 0.25rem !important;\n }\n .mx-lg-1 {\n margin-right: 0.25rem !important;\n margin-left: 0.25rem !important;\n }\n .my-lg-1 {\n margin-top: 0.25rem !important;\n margin-bottom: 0.25rem !important;\n }\n .m-lg-2 {\n margin: 0.5rem !important;\n }\n .mt-lg-2 {\n margin-top: 0.5rem !important;\n }\n .mr-lg-2 {\n margin-right: 0.5rem !important;\n }\n .mb-lg-2 {\n margin-bottom: 0.5rem !important;\n }\n .ml-lg-2 {\n margin-left: 0.5rem !important;\n }\n .mx-lg-2 {\n margin-right: 0.5rem !important;\n margin-left: 0.5rem !important;\n }\n .my-lg-2 {\n margin-top: 0.5rem !important;\n margin-bottom: 0.5rem !important;\n }\n .m-lg-3 {\n margin: 1rem !important;\n }\n .mt-lg-3 {\n margin-top: 1rem !important;\n }\n .mr-lg-3 {\n margin-right: 1rem !important;\n }\n .mb-lg-3 {\n margin-bottom: 1rem !important;\n }\n .ml-lg-3 {\n margin-left: 1rem !important;\n }\n .mx-lg-3 {\n margin-right: 1rem !important;\n margin-left: 1rem !important;\n }\n .my-lg-3 {\n margin-top: 1rem !important;\n margin-bottom: 1rem !important;\n }\n .m-lg-4 {\n margin: 1.5rem !important;\n }\n .mt-lg-4 {\n margin-top: 1.5rem !important;\n }\n .mr-lg-4 {\n margin-right: 1.5rem !important;\n }\n .mb-lg-4 {\n margin-bottom: 1.5rem !important;\n }\n .ml-lg-4 {\n margin-left: 1.5rem !important;\n }\n .mx-lg-4 {\n margin-right: 1.5rem !important;\n margin-left: 1.5rem !important;\n }\n .my-lg-4 {\n margin-top: 1.5rem !important;\n margin-bottom: 1.5rem !important;\n }\n .m-lg-5 {\n margin: 3rem !important;\n }\n .mt-lg-5 {\n margin-top: 3rem !important;\n }\n .mr-lg-5 {\n margin-right: 3rem !important;\n }\n .mb-lg-5 {\n margin-bottom: 3rem !important;\n }\n .ml-lg-5 {\n margin-left: 3rem !important;\n }\n .mx-lg-5 {\n margin-right: 3rem !important;\n margin-left: 3rem !important;\n }\n .my-lg-5 {\n margin-top: 3rem !important;\n margin-bottom: 3rem !important;\n }\n .p-lg-0 {\n padding: 0 !important;\n }\n .pt-lg-0 {\n padding-top: 0 !important;\n }\n .pr-lg-0 {\n padding-right: 0 !important;\n }\n .pb-lg-0 {\n padding-bottom: 0 !important;\n }\n .pl-lg-0 {\n padding-left: 0 !important;\n }\n .px-lg-0 {\n padding-right: 0 !important;\n padding-left: 0 !important;\n }\n .py-lg-0 {\n padding-top: 0 !important;\n padding-bottom: 0 !important;\n }\n .p-lg-1 {\n padding: 0.25rem !important;\n }\n .pt-lg-1 {\n padding-top: 0.25rem !important;\n }\n .pr-lg-1 {\n padding-right: 0.25rem !important;\n }\n .pb-lg-1 {\n padding-bottom: 0.25rem !important;\n }\n .pl-lg-1 {\n padding-left: 0.25rem !important;\n }\n .px-lg-1 {\n padding-right: 0.25rem !important;\n padding-left: 0.25rem !important;\n }\n .py-lg-1 {\n padding-top: 0.25rem !important;\n padding-bottom: 0.25rem !important;\n }\n .p-lg-2 {\n padding: 0.5rem !important;\n }\n .pt-lg-2 {\n padding-top: 0.5rem !important;\n }\n .pr-lg-2 {\n padding-right: 0.5rem !important;\n }\n .pb-lg-2 {\n padding-bottom: 0.5rem !important;\n }\n .pl-lg-2 {\n padding-left: 0.5rem !important;\n }\n .px-lg-2 {\n padding-right: 0.5rem !important;\n padding-left: 0.5rem !important;\n }\n .py-lg-2 {\n padding-top: 0.5rem !important;\n padding-bottom: 0.5rem !important;\n }\n .p-lg-3 {\n padding: 1rem !important;\n }\n .pt-lg-3 {\n padding-top: 1rem !important;\n }\n .pr-lg-3 {\n padding-right: 1rem !important;\n }\n .pb-lg-3 {\n padding-bottom: 1rem !important;\n }\n .pl-lg-3 {\n padding-left: 1rem !important;\n }\n .px-lg-3 {\n padding-right: 1rem !important;\n padding-left: 1rem !important;\n }\n .py-lg-3 {\n padding-top: 1rem !important;\n padding-bottom: 1rem !important;\n }\n .p-lg-4 {\n padding: 1.5rem !important;\n }\n .pt-lg-4 {\n padding-top: 1.5rem !important;\n }\n .pr-lg-4 {\n padding-right: 1.5rem !important;\n }\n .pb-lg-4 {\n padding-bottom: 1.5rem !important;\n }\n .pl-lg-4 {\n padding-left: 1.5rem !important;\n }\n .px-lg-4 {\n padding-right: 1.5rem !important;\n padding-left: 1.5rem !important;\n }\n .py-lg-4 {\n padding-top: 1.5rem !important;\n padding-bottom: 1.5rem !important;\n }\n .p-lg-5 {\n padding: 3rem !important;\n }\n .pt-lg-5 {\n padding-top: 3rem !important;\n }\n .pr-lg-5 {\n padding-right: 3rem !important;\n }\n .pb-lg-5 {\n padding-bottom: 3rem !important;\n }\n .pl-lg-5 {\n padding-left: 3rem !important;\n }\n .px-lg-5 {\n padding-right: 3rem !important;\n padding-left: 3rem !important;\n }\n .py-lg-5 {\n padding-top: 3rem !important;\n padding-bottom: 3rem !important;\n }\n .m-lg-auto {\n margin: auto !important;\n }\n .mt-lg-auto {\n margin-top: auto !important;\n }\n .mr-lg-auto {\n margin-right: auto !important;\n }\n .mb-lg-auto {\n margin-bottom: auto !important;\n }\n .ml-lg-auto {\n margin-left: auto !important;\n }\n .mx-lg-auto {\n margin-right: auto !important;\n margin-left: auto !important;\n }\n .my-lg-auto {\n margin-top: auto !important;\n margin-bottom: auto !important;\n }\n}\n\n@media (min-width: 1200px) {\n .m-xl-0 {\n margin: 0 !important;\n }\n .mt-xl-0 {\n margin-top: 0 !important;\n }\n .mr-xl-0 {\n margin-right: 0 !important;\n }\n .mb-xl-0 {\n margin-bottom: 0 !important;\n }\n .ml-xl-0 {\n margin-left: 0 !important;\n }\n .mx-xl-0 {\n margin-right: 0 !important;\n margin-left: 0 !important;\n }\n .my-xl-0 {\n margin-top: 0 !important;\n margin-bottom: 0 !important;\n }\n .m-xl-1 {\n margin: 0.25rem !important;\n }\n .mt-xl-1 {\n margin-top: 0.25rem !important;\n }\n .mr-xl-1 {\n margin-right: 0.25rem !important;\n }\n .mb-xl-1 {\n margin-bottom: 0.25rem !important;\n }\n .ml-xl-1 {\n margin-left: 0.25rem !important;\n }\n .mx-xl-1 {\n margin-right: 0.25rem !important;\n margin-left: 0.25rem !important;\n }\n .my-xl-1 {\n margin-top: 0.25rem !important;\n margin-bottom: 0.25rem !important;\n }\n .m-xl-2 {\n margin: 0.5rem !important;\n }\n .mt-xl-2 {\n margin-top: 0.5rem !important;\n }\n .mr-xl-2 {\n margin-right: 0.5rem !important;\n }\n .mb-xl-2 {\n margin-bottom: 0.5rem !important;\n }\n .ml-xl-2 {\n margin-left: 0.5rem !important;\n }\n .mx-xl-2 {\n margin-right: 0.5rem !important;\n margin-left: 0.5rem !important;\n }\n .my-xl-2 {\n margin-top: 0.5rem !important;\n margin-bottom: 0.5rem !important;\n }\n .m-xl-3 {\n margin: 1rem !important;\n }\n .mt-xl-3 {\n margin-top: 1rem !important;\n }\n .mr-xl-3 {\n margin-right: 1rem !important;\n }\n .mb-xl-3 {\n margin-bottom: 1rem !important;\n }\n .ml-xl-3 {\n margin-left: 1rem !important;\n }\n .mx-xl-3 {\n margin-right: 1rem !important;\n margin-left: 1rem !important;\n }\n .my-xl-3 {\n margin-top: 1rem !important;\n margin-bottom: 1rem !important;\n }\n .m-xl-4 {\n margin: 1.5rem !important;\n }\n .mt-xl-4 {\n margin-top: 1.5rem !important;\n }\n .mr-xl-4 {\n margin-right: 1.5rem !important;\n }\n .mb-xl-4 {\n margin-bottom: 1.5rem !important;\n }\n .ml-xl-4 {\n margin-left: 1.5rem !important;\n }\n .mx-xl-4 {\n margin-right: 1.5rem !important;\n margin-left: 1.5rem !important;\n }\n .my-xl-4 {\n margin-top: 1.5rem !important;\n margin-bottom: 1.5rem !important;\n }\n .m-xl-5 {\n margin: 3rem !important;\n }\n .mt-xl-5 {\n margin-top: 3rem !important;\n }\n .mr-xl-5 {\n margin-right: 3rem !important;\n }\n .mb-xl-5 {\n margin-bottom: 3rem !important;\n }\n .ml-xl-5 {\n margin-left: 3rem !important;\n }\n .mx-xl-5 {\n margin-right: 3rem !important;\n margin-left: 3rem !important;\n }\n .my-xl-5 {\n margin-top: 3rem !important;\n margin-bottom: 3rem !important;\n }\n .p-xl-0 {\n padding: 0 !important;\n }\n .pt-xl-0 {\n padding-top: 0 !important;\n }\n .pr-xl-0 {\n padding-right: 0 !important;\n }\n .pb-xl-0 {\n padding-bottom: 0 !important;\n }\n .pl-xl-0 {\n padding-left: 0 !important;\n }\n .px-xl-0 {\n padding-right: 0 !important;\n padding-left: 0 !important;\n }\n .py-xl-0 {\n padding-top: 0 !important;\n padding-bottom: 0 !important;\n }\n .p-xl-1 {\n padding: 0.25rem !important;\n }\n .pt-xl-1 {\n padding-top: 0.25rem !important;\n }\n .pr-xl-1 {\n padding-right: 0.25rem !important;\n }\n .pb-xl-1 {\n padding-bottom: 0.25rem !important;\n }\n .pl-xl-1 {\n padding-left: 0.25rem !important;\n }\n .px-xl-1 {\n padding-right: 0.25rem !important;\n padding-left: 0.25rem !important;\n }\n .py-xl-1 {\n padding-top: 0.25rem !important;\n padding-bottom: 0.25rem !important;\n }\n .p-xl-2 {\n padding: 0.5rem !important;\n }\n .pt-xl-2 {\n padding-top: 0.5rem !important;\n }\n .pr-xl-2 {\n padding-right: 0.5rem !important;\n }\n .pb-xl-2 {\n padding-bottom: 0.5rem !important;\n }\n .pl-xl-2 {\n padding-left: 0.5rem !important;\n }\n .px-xl-2 {\n padding-right: 0.5rem !important;\n padding-left: 0.5rem !important;\n }\n .py-xl-2 {\n padding-top: 0.5rem !important;\n padding-bottom: 0.5rem !important;\n }\n .p-xl-3 {\n padding: 1rem !important;\n }\n .pt-xl-3 {\n padding-top: 1rem !important;\n }\n .pr-xl-3 {\n padding-right: 1rem !important;\n }\n .pb-xl-3 {\n padding-bottom: 1rem !important;\n }\n .pl-xl-3 {\n padding-left: 1rem !important;\n }\n .px-xl-3 {\n padding-right: 1rem !important;\n padding-left: 1rem !important;\n }\n .py-xl-3 {\n padding-top: 1rem !important;\n padding-bottom: 1rem !important;\n }\n .p-xl-4 {\n padding: 1.5rem !important;\n }\n .pt-xl-4 {\n padding-top: 1.5rem !important;\n }\n .pr-xl-4 {\n padding-right: 1.5rem !important;\n }\n .pb-xl-4 {\n padding-bottom: 1.5rem !important;\n }\n .pl-xl-4 {\n padding-left: 1.5rem !important;\n }\n .px-xl-4 {\n padding-right: 1.5rem !important;\n padding-left: 1.5rem !important;\n }\n .py-xl-4 {\n padding-top: 1.5rem !important;\n padding-bottom: 1.5rem !important;\n }\n .p-xl-5 {\n padding: 3rem !important;\n }\n .pt-xl-5 {\n padding-top: 3rem !important;\n }\n .pr-xl-5 {\n padding-right: 3rem !important;\n }\n .pb-xl-5 {\n padding-bottom: 3rem !important;\n }\n .pl-xl-5 {\n padding-left: 3rem !important;\n }\n .px-xl-5 {\n padding-right: 3rem !important;\n padding-left: 3rem !important;\n }\n .py-xl-5 {\n padding-top: 3rem !important;\n padding-bottom: 3rem !important;\n }\n .m-xl-auto {\n margin: auto !important;\n }\n .mt-xl-auto {\n margin-top: auto !important;\n }\n .mr-xl-auto {\n margin-right: auto !important;\n }\n .mb-xl-auto {\n margin-bottom: auto !important;\n }\n .ml-xl-auto {\n margin-left: auto !important;\n }\n .mx-xl-auto {\n margin-right: auto !important;\n margin-left: auto !important;\n }\n .my-xl-auto {\n margin-top: auto !important;\n margin-bottom: auto !important;\n }\n}\n\n.text-justify {\n text-align: justify !important;\n}\n\n.text-nowrap {\n white-space: nowrap !important;\n}\n\n.text-truncate {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.text-left {\n text-align: left !important;\n}\n\n.text-right {\n text-align: right !important;\n}\n\n.text-center {\n text-align: center !important;\n}\n\n@media (min-width: 576px) {\n .text-sm-left {\n text-align: left !important;\n }\n .text-sm-right {\n text-align: right !important;\n }\n .text-sm-center {\n text-align: center !important;\n }\n}\n\n@media (min-width: 768px) {\n .text-md-left {\n text-align: left !important;\n }\n .text-md-right {\n text-align: right !important;\n }\n .text-md-center {\n text-align: center !important;\n }\n}\n\n@media (min-width: 992px) {\n .text-lg-left {\n text-align: left !important;\n }\n .text-lg-right {\n text-align: right !important;\n }\n .text-lg-center {\n text-align: center !important;\n }\n}\n\n@media (min-width: 1200px) {\n .text-xl-left {\n text-align: left !important;\n }\n .text-xl-right {\n text-align: right !important;\n }\n .text-xl-center {\n text-align: center !important;\n }\n}\n\n.text-lowercase {\n text-transform: lowercase !important;\n}\n\n.text-uppercase {\n text-transform: uppercase !important;\n}\n\n.text-capitalize {\n text-transform: capitalize !important;\n}\n\n.font-weight-normal {\n font-weight: normal;\n}\n\n.font-weight-bold {\n font-weight: bold;\n}\n\n.font-italic {\n font-style: italic;\n}\n\n.text-white {\n color: #fff !important;\n}\n\n.text-primary {\n color: #007bff !important;\n}\n\na.text-primary:focus, a.text-primary:hover {\n color: #0062cc !important;\n}\n\n.text-secondary {\n color: #868e96 !important;\n}\n\na.text-secondary:focus, a.text-secondary:hover {\n color: #6c757d !important;\n}\n\n.text-success {\n color: #28a745 !important;\n}\n\na.text-success:focus, a.text-success:hover {\n color: #1e7e34 !important;\n}\n\n.text-info {\n color: #17a2b8 !important;\n}\n\na.text-info:focus, a.text-info:hover {\n color: #117a8b !important;\n}\n\n.text-warning {\n color: #ffc107 !important;\n}\n\na.text-warning:focus, a.text-warning:hover {\n color: #d39e00 !important;\n}\n\n.text-danger {\n color: #dc3545 !important;\n}\n\na.text-danger:focus, a.text-danger:hover {\n color: #bd2130 !important;\n}\n\n.text-light {\n color: #f8f9fa !important;\n}\n\na.text-light:focus, a.text-light:hover {\n color: #dae0e5 !important;\n}\n\n.text-dark {\n color: #343a40 !important;\n}\n\na.text-dark:focus, a.text-dark:hover {\n color: #1d2124 !important;\n}\n\n.text-muted {\n color: #868e96 !important;\n}\n\n.text-hide {\n font: 0/0 a;\n color: transparent;\n text-shadow: none;\n background-color: transparent;\n border: 0;\n}\n\n.visible {\n visibility: visible !important;\n}\n\n.invisible {\n visibility: hidden !important;\n}\n\n/*# sourceMappingURL=bootstrap.css.map */","// scss-lint:disable QualifyingElement, DuplicateProperty, VendorPrefix\n\n// Reboot\n//\n// Normalization of HTML elements, manually forked from Normalize.css to remove\n// styles targeting irrelevant browsers while applying new styles.\n//\n// Normalize is licensed MIT. https://github.com/necolas/normalize.css\n\n\n// Document\n//\n// 1. Change from `box-sizing: content-box` so that `width` is not affected by `padding` or `border`.\n// 2. Change the default font family in all browsers.\n// 3. Correct the line height in all browsers.\n// 4. Prevent adjustments of font size after orientation changes in IE on Windows Phone and in iOS.\n// 5. Setting @viewport causes scrollbars to overlap content in IE11 and Edge, so\n// we force a non-overlapping, non-auto-hiding scrollbar to counteract.\n// 6. Change the default tap highlight to be completely transparent in iOS.\n\nhtml {\n box-sizing: border-box; // 1\n font-family: sans-serif; // 2\n line-height: 1.15; // 3\n -webkit-text-size-adjust: 100%; // 4\n -ms-text-size-adjust: 100%; // 4\n -ms-overflow-style: scrollbar; // 5\n -webkit-tap-highlight-color: rgba(0,0,0,0); // 6\n}\n\n*,\n*::before,\n*::after {\n box-sizing: inherit; // 1\n}\n\n// IE10+ doesn't honor `<meta name=\"viewport\">` in some cases.\n@at-root {\n @-ms-viewport { width: device-width; }\n}\n\n// Shim for \"new\" HTML5 structural elements to display correctly (IE10, older browsers)\narticle, aside, dialog, figcaption, figure, footer, header, hgroup, main, nav, section {\n display: block;\n}\n\n// Body\n//\n// 1. Remove the margin in all browsers.\n// 2. As a best practice, apply a default `background-color`.\n\nbody {\n margin: 0; // 1\n font-family: $font-family-base;\n font-size: $font-size-base;\n font-weight: $font-weight-base;\n line-height: $line-height-base;\n color: $body-color;\n background-color: $body-bg; // 2\n}\n\n// Suppress the focus outline on elements that cannot be accessed via keyboard.\n// This prevents an unwanted focus outline from appearing around elements that\n// might still respond to pointer events.\n//\n// Credit: https://github.com/suitcss/base\n[tabindex=\"-1\"]:focus {\n outline: none !important;\n}\n\n\n// Content grouping\n//\n// 1. Add the correct box sizing in Firefox.\n// 2. Show the overflow in Edge and IE.\n\nhr {\n box-sizing: content-box; // 1\n height: 0; // 1\n overflow: visible; // 2\n}\n\n\n//\n// Typography\n//\n\n// Remove top margins from headings\n//\n// By default, `<h1>`-`<h6>` all receive top and bottom margins. We nuke the top\n// margin for easier control within type scales as it avoids margin collapsing.\nh1, h2, h3, h4, h5, h6 {\n margin-top: 0;\n margin-bottom: .5rem;\n}\n\n// Reset margins on paragraphs\n//\n// Similarly, the top margin on `<p>`s get reset. However, we also reset the\n// bottom margin to use `rem` units instead of `em`.\np {\n margin-top: 0;\n margin-bottom: 1rem;\n}\n\n// Abbreviations\n//\n// 1. Remove the bottom border in Firefox 39-.\n// 2. Add the correct text decoration in Chrome, Edge, IE, Opera, and Safari.\n// 3. Add explicit cursor to indicate changed behavior.\n// 4. Duplicate behavior to the data-* attribute for our tooltip plugin\n\nabbr[title],\nabbr[data-original-title] { // 4\n text-decoration: underline; // 2\n text-decoration: underline dotted; // 2\n cursor: help; // 3\n border-bottom: 0; // 1\n}\n\naddress {\n margin-bottom: 1rem;\n font-style: normal;\n line-height: inherit;\n}\n\nol,\nul,\ndl {\n margin-top: 0;\n margin-bottom: 1rem;\n}\n\nol ol,\nul ul,\nol ul,\nul ol {\n margin-bottom: 0;\n}\n\ndt {\n font-weight: $dt-font-weight;\n}\n\ndd {\n margin-bottom: .5rem;\n margin-left: 0; // Undo browser default\n}\n\nblockquote {\n margin: 0 0 1rem;\n}\n\ndfn {\n font-style: italic; // Add the correct font style in Android 4.3-\n}\n\nb,\nstrong {\n font-weight: bolder; // Add the correct font weight in Chrome, Edge, and Safari\n}\n\nsmall {\n font-size: 80%; // Add the correct font size in all browsers\n}\n\n//\n// Prevent `sub` and `sup` elements from affecting the line height in\n// all browsers.\n//\n\nsub,\nsup {\n position: relative;\n font-size: 75%;\n line-height: 0;\n vertical-align: baseline;\n}\n\nsub { bottom: -.25em; }\nsup { top: -.5em; }\n\n\n//\n// Links\n//\n\na {\n color: $link-color;\n text-decoration: $link-decoration;\n background-color: transparent; // Remove the gray background on active links in IE 10.\n -webkit-text-decoration-skip: objects; // Remove gaps in links underline in iOS 8+ and Safari 8+.\n\n @include hover {\n color: $link-hover-color;\n text-decoration: $link-hover-decoration;\n }\n}\n\n// And undo these styles for placeholder links/named anchors (without href)\n// which have not been made explicitly keyboard-focusable (without tabindex).\n// It would be more straightforward to just use a[href] in previous block, but that\n// causes specificity issues in many other styles that are too complex to fix.\n// See https://github.com/twbs/bootstrap/issues/19402\n\na:not([href]):not([tabindex]) {\n color: inherit;\n text-decoration: none;\n\n @include hover-focus {\n color: inherit;\n text-decoration: none;\n }\n\n &:focus {\n outline: 0;\n }\n}\n\n\n//\n// Code\n//\n\npre,\ncode,\nkbd,\nsamp {\n font-family: monospace, monospace; // Correct the inheritance and scaling of font size in all browsers.\n font-size: 1em; // Correct the odd `em` font sizing in all browsers.\n}\n\npre {\n // Remove browser default top margin\n margin-top: 0;\n // Reset browser default of `1em` to use `rem`s\n margin-bottom: 1rem;\n // Don't allow content to break outside\n overflow: auto;\n}\n\n\n//\n// Figures\n//\n\nfigure {\n // Apply a consistent margin strategy (matches our type styles).\n margin: 0 0 1rem;\n}\n\n\n//\n// Images and content\n//\n\nimg {\n vertical-align: middle;\n border-style: none; // Remove the border on images inside links in IE 10-.\n}\n\nsvg:not(:root) {\n overflow: hidden; // Hide the overflow in IE\n}\n\n\n// Avoid 300ms click delay on touch devices that support the `touch-action` CSS property.\n//\n// In particular, unlike most other browsers, IE11+Edge on Windows 10 on touch devices and IE Mobile 10-11\n// DON'T remove the click delay when `<meta name=\"viewport\" content=\"width=device-width\">` is present.\n// However, they DO support removing the click delay via `touch-action: manipulation`.\n// See:\n// * https://v4-alpha.getbootstrap.com/content/reboot/#click-delay-optimization-for-touch\n// * http://caniuse.com/#feat=css-touch-action\n// * https://patrickhlauke.github.io/touch/tests/results/#suppressing-300ms-delay\n\na,\narea,\nbutton,\n[role=\"button\"],\ninput,\nlabel,\nselect,\nsummary,\ntextarea {\n touch-action: manipulation;\n}\n\n\n//\n// Tables\n//\n\ntable {\n border-collapse: collapse; // Prevent double borders\n}\n\ncaption {\n padding-top: $table-cell-padding;\n padding-bottom: $table-cell-padding;\n color: $text-muted;\n text-align: left;\n caption-side: bottom;\n}\n\nth {\n // Matches default `<td>` alignment\n text-align: left;\n}\n\n\n//\n// Forms\n//\n\nlabel {\n // Allow labels to use `margin` for spacing.\n display: inline-block;\n margin-bottom: .5rem;\n}\n\n// Work around a Firefox/IE bug where the transparent `button` background\n// results in a loss of the default `button` focus styles.\n//\n// Credit: https://github.com/suitcss/base/\nbutton:focus {\n outline: 1px dotted;\n outline: 5px auto -webkit-focus-ring-color;\n}\n\ninput,\nbutton,\nselect,\noptgroup,\ntextarea {\n margin: 0; // Remove the margin in Firefox and Safari\n font-family: inherit;\n font-size: inherit;\n line-height: inherit;\n}\n\nbutton,\ninput {\n overflow: visible; // Show the overflow in Edge\n}\n\nbutton,\nselect {\n text-transform: none; // Remove the inheritance of text transform in Firefox\n}\n\n// 1. Prevent a WebKit bug where (2) destroys native `audio` and `video`\n// controls in Android 4.\n// 2. Correct the inability to style clickable types in iOS and Safari.\nbutton,\nhtml [type=\"button\"], // 1\n[type=\"reset\"],\n[type=\"submit\"] {\n -webkit-appearance: button; // 2\n}\n\n// Remove inner border and padding from Firefox, but don't restore the outline like Normalize.\nbutton::-moz-focus-inner,\n[type=\"button\"]::-moz-focus-inner,\n[type=\"reset\"]::-moz-focus-inner,\n[type=\"submit\"]::-moz-focus-inner {\n padding: 0;\n border-style: none;\n}\n\ninput[type=\"radio\"],\ninput[type=\"checkbox\"] {\n box-sizing: border-box; // 1. Add the correct box sizing in IE 10-\n padding: 0; // 2. Remove the padding in IE 10-\n}\n\n\ninput[type=\"date\"],\ninput[type=\"time\"],\ninput[type=\"datetime-local\"],\ninput[type=\"month\"] {\n // Remove the default appearance of temporal inputs to avoid a Mobile Safari\n // bug where setting a custom line-height prevents text from being vertically\n // centered within the input.\n // See https://bugs.webkit.org/show_bug.cgi?id=139848\n // and https://github.com/twbs/bootstrap/issues/11266\n -webkit-appearance: listbox;\n}\n\ntextarea {\n overflow: auto; // Remove the default vertical scrollbar in IE.\n // Textareas should really only resize vertically so they don't break their (horizontal) containers.\n resize: vertical;\n}\n\nfieldset {\n // Browsers set a default `min-width: min-content;` on fieldsets,\n // unlike e.g. `<div>`s, which have `min-width: 0;` by default.\n // So we reset that to ensure fieldsets behave more like a standard block element.\n // See https://github.com/twbs/bootstrap/issues/12359\n // and https://html.spec.whatwg.org/multipage/#the-fieldset-and-legend-elements\n min-width: 0;\n // Reset the default outline behavior of fieldsets so they don't affect page layout.\n padding: 0;\n margin: 0;\n border: 0;\n}\n\n// 1. Correct the text wrapping in Edge and IE.\n// 2. Correct the color inheritance from `fieldset` elements in IE.\nlegend {\n display: block;\n width: 100%;\n max-width: 100%; // 1\n padding: 0;\n margin-bottom: .5rem;\n font-size: 1.5rem;\n line-height: inherit;\n color: inherit; // 2\n white-space: normal; // 1\n}\n\nprogress {\n vertical-align: baseline; // Add the correct vertical alignment in Chrome, Firefox, and Opera.\n}\n\n// Correct the cursor style of increment and decrement buttons in Chrome.\n[type=\"number\"]::-webkit-inner-spin-button,\n[type=\"number\"]::-webkit-outer-spin-button {\n height: auto;\n}\n\n[type=\"search\"] {\n // This overrides the extra rounded corners on search inputs in iOS so that our\n // `.form-control` class can properly style them. Note that this cannot simply\n // be added to `.form-control` as it's not specific enough. For details, see\n // https://github.com/twbs/bootstrap/issues/11586.\n outline-offset: -2px; // 2. Correct the outline style in Safari.\n -webkit-appearance: none;\n}\n\n//\n// Remove the inner padding and cancel buttons in Chrome and Safari on macOS.\n//\n\n[type=\"search\"]::-webkit-search-cancel-button,\n[type=\"search\"]::-webkit-search-decoration {\n -webkit-appearance: none;\n}\n\n//\n// 1. Correct the inability to style clickable types in iOS and Safari.\n// 2. Change font properties to `inherit` in Safari.\n//\n\n::-webkit-file-upload-button {\n font: inherit; // 2\n -webkit-appearance: button; // 1\n}\n\n//\n// Correct element displays\n//\n\noutput {\n display: inline-block;\n}\n\nsummary {\n display: list-item; // Add the correct display in all browsers\n}\n\ntemplate {\n display: none; // Add the correct display in IE\n}\n\n// Always hide an element with the `hidden` HTML attribute (from PureCSS).\n// Needed for proper display in IE 10-.\n[hidden] {\n display: none !important;\n}\n","// Variables\n//\n// Copy settings from this file into the provided `_custom.scss` to override\n// the Bootstrap defaults without modifying key, versioned files.\n//\n// Variables should follow the `$component-state-property-size` formula for\n// consistent naming. Ex: $nav-link-disabled-color and $modal-content-box-shadow-xs.\n\n// Table of Contents\n//\n// Color system\n// Options\n// Spacing\n// Body\n// Links\n// Grid breakpoints\n// Grid containers\n// Grid columns\n// Fonts\n// Components\n// Tables\n// Buttons\n// Forms\n// Dropdowns\n// Z-index master list\n// Navs\n// Navbar\n// Pagination\n// Jumbotron\n// Form states and alerts\n// Cards\n// Tooltips\n// Popovers\n// Badges\n// Modals\n// Alerts\n// Progress bars\n// List group\n// Image thumbnails\n// Figures\n// Breadcrumbs\n// Carousel\n// Close\n// Code\n\n\n//\n// Color system\n//\n\n$white: #fff !default;\n$gray-100: #f8f9fa !default;\n$gray-200: #e9ecef !default;\n$gray-300: #dee2e6 !default;\n$gray-400: #ced4da !default;\n$gray-500: #adb5bd !default;\n$gray-600: #868e96 !default;\n$gray-700: #495057 !default;\n$gray-800: #343a40 !default;\n$gray-900: #212529 !default;\n$black: #000 !default;\n\n$grays: (\n 100: $gray-100,\n 200: $gray-200,\n 300: $gray-300,\n 400: $gray-400,\n 500: $gray-500,\n 600: $gray-600,\n 700: $gray-700,\n 800: $gray-800,\n 900: $gray-900\n) !default;\n\n$blue: #007bff !default;\n$indigo: #6610f2 !default;\n$purple: #6f42c1 !default;\n$pink: #e83e8c !default;\n$red: #dc3545 !default;\n$orange: #fd7e14 !default;\n$yellow: #ffc107 !default;\n$green: #28a745 !default;\n$teal: #20c997 !default;\n$cyan: #17a2b8 !default;\n\n$colors: (\n blue: $blue,\n indigo: $indigo,\n purple: $purple,\n pink: $pink,\n red: $red,\n orange: $orange,\n yellow: $yellow,\n green: $green,\n teal: $teal,\n cyan: $cyan,\n white: $white,\n gray: $gray-600,\n gray-dark: $gray-800\n) !default;\n\n$theme-colors: (\n primary: $blue,\n secondary: $gray-600,\n success: $green,\n info: $cyan,\n warning: $yellow,\n danger: $red,\n light: $gray-100,\n dark: $gray-800\n) !default;\n\n// Set a specific jump point for requesting color jumps\n$theme-color-interval: 8% !default;\n\n\n// Options\n//\n// Quickly modify global styling by enabling or disabling optional features.\n\n$enable-rounded: true !default;\n$enable-shadows: false !default;\n$enable-gradients: false !default;\n$enable-transitions: true !default;\n$enable-hover-media-query: false !default;\n$enable-grid-classes: true !default;\n$enable-print-styles: true !default;\n\n\n// Spacing\n//\n// Control the default styling of most Bootstrap elements by modifying these\n// variables. Mostly focused on spacing.\n// You can add more entries to the $spacers map, should you need more variation.\n\n$spacer: 1rem !default;\n$spacers: (\n 0: 0,\n 1: ($spacer * .25),\n 2: ($spacer * .5),\n 3: $spacer,\n 4: ($spacer * 1.5),\n 5: ($spacer * 3)\n) !default;\n\n// This variable affects the `.h-*` and `.w-*` classes.\n$sizes: (\n 25: 25%,\n 50: 50%,\n 75: 75%,\n 100: 100%\n) !default;\n\n// Body\n//\n// Settings for the `<body>` element.\n\n$body-bg: $white !default;\n$body-color: $gray-900 !default;\n\n// Links\n//\n// Style anchor elements.\n\n$link-color: theme-color(\"primary\") !default;\n$link-decoration: none !default;\n$link-hover-color: darken($link-color, 15%) !default;\n$link-hover-decoration: underline !default;\n\n\n// Grid breakpoints\n//\n// Define the minimum dimensions at which your layout will change,\n// adapting to different screen sizes, for use in media queries.\n\n$grid-breakpoints: (\n xs: 0,\n sm: 576px,\n md: 768px,\n lg: 992px,\n xl: 1200px\n) !default;\n@include _assert-ascending($grid-breakpoints, \"$grid-breakpoints\");\n@include _assert-starts-at-zero($grid-breakpoints);\n\n\n// Grid containers\n//\n// Define the maximum width of `.container` for different screen sizes.\n\n$container-max-widths: (\n sm: 540px,\n md: 720px,\n lg: 960px,\n xl: 1140px\n) !default;\n@include _assert-ascending($container-max-widths, \"$container-max-widths\");\n\n\n// Grid columns\n//\n// Set the number of columns and specify the width of the gutters.\n\n$grid-columns: 12 !default;\n$grid-gutter-width: 30px !default;\n\n// Components\n//\n// Define common padding and border radius sizes and more.\n\n$line-height-lg: 1.5 !default;\n$line-height-sm: 1.5 !default;\n\n$border-width: 1px !default;\n\n$border-radius: .25rem !default;\n$border-radius-lg: .3rem !default;\n$border-radius-sm: .2rem !default;\n\n$component-active-color: $white !default;\n$component-active-bg: theme-color(\"primary\") !default;\n\n$caret-width: .3em !default;\n\n$transition-base: all .2s ease-in-out !default;\n$transition-fade: opacity .15s linear !default;\n$transition-collapse: height .35s ease !default;\n\n\n// Fonts\n//\n// Font, line-height, and color for body text, headings, and more.\n\n$font-family-sans-serif: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, \"Helvetica Neue\", Arial, sans-serif !default;\n$font-family-monospace: Menlo, Monaco, Consolas, \"Liberation Mono\", \"Courier New\", monospace !default;\n$font-family-base: $font-family-sans-serif !default;\n\n$font-size-base: 1rem !default; // Assumes the browser default, typically `16px`\n$font-size-lg: 1.25rem !default;\n$font-size-sm: .875rem !default;\n\n$font-weight-normal: normal !default;\n$font-weight-bold: bold !default;\n\n$font-weight-base: $font-weight-normal !default;\n$line-height-base: 1.5 !default;\n\n$h1-font-size: 2.5rem !default;\n$h2-font-size: 2rem !default;\n$h3-font-size: 1.75rem !default;\n$h4-font-size: 1.5rem !default;\n$h5-font-size: 1.25rem !default;\n$h6-font-size: 1rem !default;\n\n$headings-margin-bottom: ($spacer / 2) !default;\n$headings-font-family: inherit !default;\n$headings-font-weight: 500 !default;\n$headings-line-height: 1.1 !default;\n$headings-color: inherit !default;\n\n$display1-size: 6rem !default;\n$display2-size: 5.5rem !default;\n$display3-size: 4.5rem !default;\n$display4-size: 3.5rem !default;\n\n$display1-weight: 300 !default;\n$display2-weight: 300 !default;\n$display3-weight: 300 !default;\n$display4-weight: 300 !default;\n$display-line-height: $headings-line-height !default;\n\n$lead-font-size: 1.25rem !default;\n$lead-font-weight: 300 !default;\n\n$small-font-size: 80% !default;\n\n$text-muted: $gray-600 !default;\n\n$blockquote-small-color: $gray-600 !default;\n$blockquote-font-size: ($font-size-base * 1.25) !default;\n\n$hr-border-color: rgba($black,.1) !default;\n$hr-border-width: $border-width !default;\n\n$mark-padding: .2em !default;\n\n$dt-font-weight: $font-weight-bold !default;\n\n$kbd-box-shadow: inset 0 -.1rem 0 rgba($black,.25) !default;\n$nested-kbd-font-weight: $font-weight-bold !default;\n\n$list-inline-padding: 5px !default;\n\n$mark-bg: #fcf8e3 !default;\n\n\n// Tables\n//\n// Customizes the `.table` component with basic values, each used across all table variations.\n\n$table-cell-padding: .75rem !default;\n$table-cell-padding-sm: .3rem !default;\n\n$table-bg: transparent !default;\n$table-accent-bg: rgba($black,.05) !default;\n$table-hover-bg: rgba($black,.075) !default;\n$table-active-bg: $table-hover-bg !default;\n\n$table-border-width: $border-width !default;\n$table-border-color: $gray-200 !default;\n\n$table-head-bg: $gray-200 !default;\n$table-head-color: $gray-700 !default;\n\n$table-inverse-bg: $gray-900 !default;\n$table-inverse-accent-bg: rgba($white, .05) !default;\n$table-inverse-hover-bg: rgba($white, .075) !default;\n$table-inverse-border-color: lighten($gray-900, 7.5%) !default;\n$table-inverse-color: $body-bg !default;\n\n\n// Buttons\n//\n// For each of Bootstrap's buttons, define text, background and border color.\n\n$input-btn-padding-y: .5rem !default;\n$input-btn-padding-x: .75rem !default;\n$input-btn-line-height: 1.25 !default;\n\n$input-btn-padding-y-sm: .25rem !default;\n$input-btn-padding-x-sm: .5rem !default;\n$input-btn-line-height-sm: 1.5 !default;\n\n$input-btn-padding-y-lg: .5rem !default;\n$input-btn-padding-x-lg: 1rem !default;\n$input-btn-line-height-lg: 1.5 !default;\n\n$btn-font-weight: $font-weight-normal !default;\n$btn-box-shadow: inset 0 1px 0 rgba($white,.15), 0 1px 1px rgba($black,.075) !default;\n$btn-focus-box-shadow: 0 0 0 3px rgba(theme-color(\"primary\"), .25) !default;\n$btn-active-box-shadow: inset 0 3px 5px rgba($black,.125) !default;\n\n$btn-link-disabled-color: $gray-600 !default;\n\n$btn-block-spacing-y: .5rem !default;\n\n// Allows for customizing button radius independently from global border radius\n$btn-border-radius: $border-radius !default;\n$btn-border-radius-lg: $border-radius-lg !default;\n$btn-border-radius-sm: $border-radius-sm !default;\n\n$btn-transition: all .15s ease-in-out !default;\n\n\n// Forms\n\n$input-bg: $white !default;\n$input-disabled-bg: $gray-200 !default;\n\n$input-color: $gray-700 !default;\n$input-border-color: rgba($black,.15) !default;\n$input-btn-border-width: $border-width !default; // For form controls and buttons\n$input-box-shadow: inset 0 1px 1px rgba($black,.075) !default;\n\n$input-border-radius: $border-radius !default;\n$input-border-radius-lg: $border-radius-lg !default;\n$input-border-radius-sm: $border-radius-sm !default;\n\n$input-focus-bg: $input-bg !default;\n$input-focus-border-color: lighten(theme-color(\"primary\"), 25%) !default;\n$input-focus-box-shadow: $input-box-shadow, $btn-focus-box-shadow !default;\n$input-focus-color: $input-color !default;\n\n$input-placeholder-color: $gray-600 !default;\n\n$input-height-border: $input-btn-border-width * 2 !default;\n\n$input-height-inner: ($font-size-base * $input-btn-line-height) + ($input-btn-padding-y * 2) !default;\n$input-height: calc(#{$input-height-inner} + #{$input-height-border}) !default;\n\n$input-height-inner-sm: ($font-size-sm * $input-btn-line-height-sm) + ($input-btn-padding-y-sm * 2) !default;\n$input-height-sm: calc(#{$input-height-inner-sm} + #{$input-height-border}) !default;\n\n$input-height-inner-lg: ($font-size-sm * $input-btn-line-height-lg) + ($input-btn-padding-y-lg * 2) !default;\n$input-height-lg: calc(#{$input-height-inner-lg} + #{$input-height-border}) !default;\n\n$input-transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s !default;\n\n$form-text-margin-top: .25rem !default;\n\n$form-check-margin-bottom: .5rem !default;\n$form-check-input-gutter: 1.25rem !default;\n$form-check-input-margin-y: .25rem !default;\n$form-check-input-margin-x: .25rem !default;\n\n$form-check-inline-margin-x: .75rem !default;\n\n$form-group-margin-bottom: 1rem !default;\n\n$input-group-addon-bg: $gray-200 !default;\n$input-group-addon-border-color: $input-border-color !default;\n\n$custom-control-gutter: 1.5rem !default;\n$custom-control-spacer-y: .25rem !default;\n$custom-control-spacer-x: 1rem !default;\n\n$custom-control-indicator-size: 1rem !default;\n$custom-control-indicator-bg: #ddd !default;\n$custom-control-indicator-bg-size: 50% 50% !default;\n$custom-control-indicator-box-shadow: inset 0 .25rem .25rem rgba($black,.1) !default;\n\n$custom-control-indicator-disabled-bg: $gray-200 !default;\n$custom-control-description-disabled-color: $gray-600 !default;\n\n$custom-control-indicator-checked-color: $white !default;\n$custom-control-indicator-checked-bg: theme-color(\"primary\") !default;\n$custom-control-indicator-checked-box-shadow: none !default;\n\n$custom-control-indicator-focus-box-shadow: 0 0 0 1px $body-bg, 0 0 0 3px theme-color(\"primary\") !default;\n\n$custom-control-indicator-active-color: $white !default;\n$custom-control-indicator-active-bg: lighten(theme-color(\"primary\"), 35%) !default;\n$custom-control-indicator-active-box-shadow: none !default;\n\n$custom-checkbox-indicator-border-radius: $border-radius !default;\n$custom-checkbox-indicator-icon-checked: str-replace(url(\"data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3E%3Cpath fill='#{$custom-control-indicator-checked-color}' d='M6.564.75l-3.59 3.612-1.538-1.55L0 4.26 2.974 7.25 8 2.193z'/%3E%3C/svg%3E\"), \"#\", \"%23\") !default;\n\n$custom-checkbox-indicator-indeterminate-bg: theme-color(\"primary\") !default;\n$custom-checkbox-indicator-indeterminate-color: $custom-control-indicator-checked-color !default;\n$custom-checkbox-indicator-icon-indeterminate: str-replace(url(\"data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 4'%3E%3Cpath stroke='#{$custom-checkbox-indicator-indeterminate-color}' d='M0 2h4'/%3E%3C/svg%3E\"), \"#\", \"%23\") !default;\n$custom-checkbox-indicator-indeterminate-box-shadow: none !default;\n\n$custom-radio-indicator-border-radius: 50% !default;\n$custom-radio-indicator-icon-checked: str-replace(url(\"data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3E%3Ccircle r='3' fill='#{$custom-control-indicator-checked-color}'/%3E%3C/svg%3E\"), \"#\", \"%23\") !default;\n\n$custom-select-padding-y: .375rem !default;\n$custom-select-padding-x: .75rem !default;\n$custom-select-height: $input-height !default;\n$custom-select-indicator-padding: 1rem !default; // Extra padding to account for the presence of the background-image based indicator\n$custom-select-line-height: $input-btn-line-height !default;\n$custom-select-color: $input-color !default;\n$custom-select-disabled-color: $gray-600 !default;\n$custom-select-bg: $white !default;\n$custom-select-disabled-bg: $gray-200 !default;\n$custom-select-bg-size: 8px 10px !default; // In pixels because image dimensions\n$custom-select-indicator-color: #333 !default;\n$custom-select-indicator: str-replace(url(\"data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 5'%3E%3Cpath fill='#{$custom-select-indicator-color}' d='M2 0L0 2h4zm0 5L0 3h4z'/%3E%3C/svg%3E\"), \"#\", \"%23\") !default;\n$custom-select-border-width: $input-btn-border-width !default;\n$custom-select-border-color: $input-border-color !default;\n$custom-select-border-radius: $border-radius !default;\n\n$custom-select-focus-border-color: lighten(theme-color(\"primary\"), 25%) !default;\n$custom-select-focus-box-shadow: inset 0 1px 2px rgba($black, .075), 0 0 5px rgba($custom-select-focus-border-color, .5) !default;\n\n$custom-select-font-size-sm: 75% !default;\n$custom-select-height-sm: $input-height-sm !default;\n\n$custom-file-height: 2.5rem !default;\n$custom-file-width: 14rem !default;\n$custom-file-focus-box-shadow: 0 0 0 .075rem $white, 0 0 0 .2rem theme-color(\"primary\") !default;\n\n$custom-file-padding-y: 1rem !default;\n$custom-file-padding-x: .5rem !default;\n$custom-file-line-height: 1.5 !default;\n$custom-file-color: $gray-700 !default;\n$custom-file-bg: $white !default;\n$custom-file-border-width: $border-width !default;\n$custom-file-border-color: $input-border-color !default;\n$custom-file-border-radius: $border-radius !default;\n$custom-file-box-shadow: inset 0 .2rem .4rem rgba($black,.05) !default;\n$custom-file-button-color: $custom-file-color !default;\n$custom-file-button-bg: $gray-200 !default;\n$custom-file-text: (\n placeholder: (\n en: \"Choose file...\"\n ),\n button-label: (\n en: \"Browse\"\n )\n) !default;\n\n\n// Form validation\n$form-feedback-valid-color: theme-color(\"success\") !default;\n$form-feedback-invalid-color: theme-color(\"danger\") !default;\n\n\n// Dropdowns\n//\n// Dropdown menu container and contents.\n\n$dropdown-min-width: 10rem !default;\n$dropdown-padding-y: .5rem !default;\n$dropdown-spacer: .125rem !default;\n$dropdown-bg: $white !default;\n$dropdown-border-color: rgba($black,.15) !default;\n$dropdown-border-width: $border-width !default;\n$dropdown-divider-bg: $gray-200 !default;\n$dropdown-box-shadow: 0 .5rem 1rem rgba($black,.175) !default;\n\n$dropdown-link-color: $gray-900 !default;\n$dropdown-link-hover-color: darken($gray-900, 5%) !default;\n$dropdown-link-hover-bg: $gray-100 !default;\n\n$dropdown-link-active-color: $component-active-color !default;\n$dropdown-link-active-bg: $component-active-bg !default;\n\n$dropdown-link-disabled-color: $gray-600 !default;\n\n$dropdown-item-padding-y: .25rem !default;\n$dropdown-item-padding-x: 1.5rem !default;\n\n$dropdown-header-color: $gray-600 !default;\n\n\n// Z-index master list\n//\n// Warning: Avoid customizing these values. They're used for a bird's eye view\n// of components dependent on the z-axis and are designed to all work together.\n\n$zindex-dropdown: 1000 !default;\n$zindex-sticky: 1020 !default;\n$zindex-fixed: 1030 !default;\n$zindex-modal-backdrop: 1040 !default;\n$zindex-modal: 1050 !default;\n$zindex-popover: 1060 !default;\n$zindex-tooltip: 1070 !default;\n\n// Navs\n\n$nav-link-padding-y: .5rem !default;\n$nav-link-padding-x: 1rem !default;\n$nav-link-disabled-color: $gray-600 !default;\n\n$nav-tabs-border-color: #ddd !default;\n$nav-tabs-border-width: $border-width !default;\n$nav-tabs-border-radius: $border-radius !default;\n$nav-tabs-link-hover-border-color: $gray-200 !default;\n$nav-tabs-link-active-color: $gray-700 !default;\n$nav-tabs-link-active-bg: $body-bg !default;\n$nav-tabs-link-active-border-color: #ddd !default;\n\n$nav-pills-border-radius: $border-radius !default;\n$nav-pills-link-active-color: $component-active-color !default;\n$nav-pills-link-active-bg: $component-active-bg !default;\n\n// Navbar\n\n$navbar-padding-y: ($spacer / 2) !default;\n$navbar-padding-x: $spacer !default;\n\n$navbar-brand-font-size: $font-size-lg !default;\n// Compute the navbar-brand padding-y so the navbar-brand will have the same height as navbar-text and nav-link\n$nav-link-height: $navbar-brand-font-size * $line-height-base !default;\n$navbar-brand-height: ($font-size-base * $line-height-base + $nav-link-padding-y * 2) !default;\n$navbar-brand-padding-y: ($navbar-brand-height - $nav-link-height) / 2 !default;\n\n$navbar-toggler-padding-y: .25rem !default;\n$navbar-toggler-padding-x: .75rem !default;\n$navbar-toggler-font-size: $font-size-lg !default;\n$navbar-toggler-border-radius: $btn-border-radius !default;\n\n$navbar-dark-color: rgba($white,.5) !default;\n$navbar-dark-hover-color: rgba($white,.75) !default;\n$navbar-dark-active-color: rgba($white,1) !default;\n$navbar-dark-disabled-color: rgba($white,.25) !default;\n$navbar-dark-toggler-icon-bg: str-replace(url(\"data:image/svg+xml;charset=utf8,%3Csvg viewBox='0 0 30 30' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath stroke='#{$navbar-dark-color}' stroke-width='2' stroke-linecap='round' stroke-miterlimit='10' d='M4 7h22M4 15h22M4 23h22'/%3E%3C/svg%3E\"), \"#\", \"%23\") !default;\n$navbar-dark-toggler-border-color: rgba($white,.1) !default;\n\n$navbar-light-color: rgba($black,.5) !default;\n$navbar-light-hover-color: rgba($black,.7) !default;\n$navbar-light-active-color: rgba($black,.9) !default;\n$navbar-light-disabled-color: rgba($black,.3) !default;\n$navbar-light-toggler-icon-bg: str-replace(url(\"data:image/svg+xml;charset=utf8,%3Csvg viewBox='0 0 30 30' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath stroke='#{$navbar-light-color}' stroke-width='2' stroke-linecap='round' stroke-miterlimit='10' d='M4 7h22M4 15h22M4 23h22'/%3E%3C/svg%3E\"), \"#\", \"%23\") !default;\n$navbar-light-toggler-border-color: rgba($black,.1) !default;\n\n// Pagination\n\n$pagination-padding-y: .5rem !default;\n$pagination-padding-x: .75rem !default;\n$pagination-padding-y-sm: .25rem !default;\n$pagination-padding-x-sm: .5rem !default;\n$pagination-padding-y-lg: .75rem !default;\n$pagination-padding-x-lg: 1.5rem !default;\n$pagination-line-height: 1.25 !default;\n\n$pagination-color: $link-color !default;\n$pagination-bg: $white !default;\n$pagination-border-width: $border-width !default;\n$pagination-border-color: #ddd !default;\n\n$pagination-hover-color: $link-hover-color !default;\n$pagination-hover-bg: $gray-200 !default;\n$pagination-hover-border-color: #ddd !default;\n\n$pagination-active-color: $white !default;\n$pagination-active-bg: theme-color(\"primary\") !default;\n$pagination-active-border-color: theme-color(\"primary\") !default;\n\n$pagination-disabled-color: $gray-600 !default;\n$pagination-disabled-bg: $white !default;\n$pagination-disabled-border-color: #ddd !default;\n\n\n// Jumbotron\n\n$jumbotron-padding: 2rem !default;\n$jumbotron-bg: $gray-200 !default;\n\n\n// Cards\n\n$card-spacer-y: .75rem !default;\n$card-spacer-x: 1.25rem !default;\n$card-border-width: 1px !default;\n$card-border-radius: $border-radius !default;\n$card-border-color: rgba($black,.125) !default;\n$card-inner-border-radius: calc(#{$card-border-radius} - #{$card-border-width}) !default;\n$card-cap-bg: rgba($black, .03) !default;\n$card-bg: $white !default;\n\n$card-img-overlay-padding: 1.25rem !default;\n\n$card-deck-margin: ($grid-gutter-width / 2) !default;\n\n$card-columns-count: 3 !default;\n$card-columns-gap: 1.25rem !default;\n$card-columns-margin: $card-spacer-y !default;\n\n\n// Tooltips\n\n$tooltip-max-width: 200px !default;\n$tooltip-color: $white !default;\n$tooltip-bg: $black !default;\n$tooltip-opacity: .9 !default;\n$tooltip-padding-y: 3px !default;\n$tooltip-padding-x: 8px !default;\n$tooltip-margin: 0 !default;\n\n\n$tooltip-arrow-width: 5px !default;\n$tooltip-arrow-height: 5px !default;\n$tooltip-arrow-color: $tooltip-bg !default;\n\n\n// Popovers\n\n$popover-inner-padding: 1px !default;\n$popover-bg: $white !default;\n$popover-max-width: 276px !default;\n$popover-border-width: $border-width !default;\n$popover-border-color: rgba($black,.2) !default;\n$popover-box-shadow: 0 5px 10px rgba($black,.2) !default;\n\n$popover-header-bg: darken($popover-bg, 3%) !default;\n$popover-header-color: $headings-color !default;\n$popover-header-padding-y: 8px !default;\n$popover-header-padding-x: 14px !default;\n\n$popover-body-color: $body-color !default;\n$popover-body-padding-y: 9px !default;\n$popover-body-padding-x: 14px !default;\n\n$popover-arrow-width: 10px !default;\n$popover-arrow-height: 5px !default;\n$popover-arrow-color: $popover-bg !default;\n\n$popover-arrow-outer-width: ($popover-arrow-width + 1px) !default;\n$popover-arrow-outer-color: fade-in($popover-border-color, .05) !default;\n\n\n// Badges\n\n$badge-color: $white !default;\n$badge-font-size: 75% !default;\n$badge-font-weight: $font-weight-bold !default;\n$badge-padding-y: .25em !default;\n$badge-padding-x: .4em !default;\n\n$badge-pill-padding-x: .6em !default;\n// Use a higher than normal value to ensure completely rounded edges when\n// customizing padding or font-size on labels.\n$badge-pill-border-radius: 10rem !default;\n\n\n// Modals\n\n// Padding applied to the modal body\n$modal-inner-padding: 15px !default;\n\n$modal-dialog-margin: 10px !default;\n$modal-dialog-margin-y-sm-up: 30px !default;\n\n$modal-title-line-height: $line-height-base !default;\n\n$modal-content-bg: $white !default;\n$modal-content-border-color: rgba($black,.2) !default;\n$modal-content-border-width: $border-width !default;\n$modal-content-box-shadow-xs: 0 3px 9px rgba($black,.5) !default;\n$modal-content-box-shadow-sm-up: 0 5px 15px rgba($black,.5) !default;\n\n$modal-backdrop-bg: $black !default;\n$modal-backdrop-opacity: .5 !default;\n$modal-header-border-color: $gray-200 !default;\n$modal-footer-border-color: $modal-header-border-color !default;\n$modal-header-border-width: $modal-content-border-width !default;\n$modal-footer-border-width: $modal-header-border-width !default;\n$modal-header-padding: 15px !default;\n\n$modal-lg: 800px !default;\n$modal-md: 500px !default;\n$modal-sm: 300px !default;\n\n$modal-transition: transform .3s ease-out !default;\n\n\n// Alerts\n//\n// Define alert colors, border radius, and padding.\n\n$alert-padding-y: .75rem !default;\n$alert-padding-x: 1.25rem !default;\n$alert-margin-bottom: 1rem !default;\n$alert-border-radius: $border-radius !default;\n$alert-link-font-weight: $font-weight-bold !default;\n$alert-border-width: $border-width !default;\n\n\n// Progress bars\n\n$progress-height: 1rem !default;\n$progress-font-size: .75rem !default;\n$progress-bg: $gray-200 !default;\n$progress-border-radius: $border-radius !default;\n$progress-box-shadow: inset 0 .1rem .1rem rgba($black,.1) !default;\n$progress-bar-color: $white !default;\n$progress-bar-bg: theme-color(\"primary\") !default;\n$progress-bar-animation-timing: 1s linear infinite !default;\n$progress-bar-transition: width .6s ease !default;\n\n// List group\n\n$list-group-bg: $white !default;\n$list-group-border-color: rgba($black,.125) !default;\n$list-group-border-width: $border-width !default;\n$list-group-border-radius: $border-radius !default;\n\n$list-group-item-padding-y: .75rem !default;\n$list-group-item-padding-x: 1.25rem !default;\n\n$list-group-hover-bg: $gray-100 !default;\n$list-group-active-color: $component-active-color !default;\n$list-group-active-bg: $component-active-bg !default;\n$list-group-active-border-color: $list-group-active-bg !default;\n\n$list-group-disabled-color: $gray-600 !default;\n$list-group-disabled-bg: $list-group-bg !default;\n\n$list-group-action-color: $gray-700 !default;\n$list-group-action-hover-color: $list-group-action-color !default;\n\n$list-group-action-active-color: $body-color !default;\n$list-group-action-active-bg: $gray-200 !default;\n\n\n// Image thumbnails\n\n$thumbnail-padding: .25rem !default;\n$thumbnail-bg: $body-bg !default;\n$thumbnail-border-width: $border-width !default;\n$thumbnail-border-color: #ddd !default;\n$thumbnail-border-radius: $border-radius !default;\n$thumbnail-box-shadow: 0 1px 2px rgba($black,.075) !default;\n$thumbnail-transition: all .2s ease-in-out !default;\n\n\n// Figures\n\n$figure-caption-font-size: 90% !default;\n$figure-caption-color: $gray-600 !default;\n\n\n// Breadcrumbs\n\n$breadcrumb-padding-y: .75rem !default;\n$breadcrumb-padding-x: 1rem !default;\n$breadcrumb-item-padding: .5rem !default;\n\n$breadcrumb-bg: $gray-200 !default;\n$breadcrumb-divider-color: $gray-600 !default;\n$breadcrumb-active-color: $gray-600 !default;\n$breadcrumb-divider: \"/\" !default;\n\n\n// Carousel\n\n$carousel-control-color: $white !default;\n$carousel-control-width: 15% !default;\n$carousel-control-opacity: .5 !default;\n\n$carousel-indicator-width: 30px !default;\n$carousel-indicator-height: 3px !default;\n$carousel-indicator-spacer: 3px !default;\n$carousel-indicator-active-bg: $white !default;\n\n$carousel-caption-width: 70% !default;\n$carousel-caption-color: $white !default;\n\n$carousel-control-icon-width: 20px !default;\n\n$carousel-control-prev-icon-bg: str-replace(url(\"data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='#{$carousel-control-color}' viewBox='0 0 8 8'%3E%3Cpath d='M4 0l-4 4 4 4 1.5-1.5-2.5-2.5 2.5-2.5-1.5-1.5z'/%3E%3C/svg%3E\"), \"#\", \"%23\") !default;\n$carousel-control-next-icon-bg: str-replace(url(\"data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='#{$carousel-control-color}' viewBox='0 0 8 8'%3E%3Cpath d='M1.5 0l-1.5 1.5 2.5 2.5-2.5 2.5 1.5 1.5 4-4-4-4z'/%3E%3C/svg%3E\"), \"#\", \"%23\") !default;\n\n$carousel-transition: transform .6s ease !default;\n\n\n// Close\n\n$close-font-size: $font-size-base * 1.5 !default;\n$close-font-weight: $font-weight-bold !default;\n$close-color: $black !default;\n$close-text-shadow: 0 1px 0 $white !default;\n\n// Code\n\n$code-font-size: 90% !default;\n$code-padding-y: .2rem !default;\n$code-padding-x: .4rem !default;\n$code-color: #bd4147 !default;\n$code-bg: $gray-100 !default;\n\n$kbd-color: $white !default;\n$kbd-bg: $gray-900 !default;\n\n$pre-color: $gray-900 !default;\n$pre-scrollable-max-height: 340px !default;\n","@mixin hover {\n // TODO: re-enable along with mq4-hover-shim\n// @if $enable-hover-media-query {\n// // See Media Queries Level 4: https://drafts.csswg.org/mediaqueries/#hover\n// // Currently shimmed by https://github.com/twbs/mq4-hover-shim\n// @media (hover: hover) {\n// &:hover { @content }\n// }\n// }\n// @else {\n// scss-lint:disable Indentation\n &:hover { @content }\n// scss-lint:enable Indentation\n// }\n}\n\n\n@mixin hover-focus {\n @if $enable-hover-media-query {\n &:focus { @content }\n @include hover { @content }\n } @else {\n &:focus,\n &:hover {\n @content\n }\n }\n}\n\n@mixin plain-hover-focus {\n @if $enable-hover-media-query {\n &,\n &:focus {\n @content\n }\n @include hover { @content }\n } @else {\n &,\n &:focus,\n &:hover {\n @content\n }\n }\n}\n\n@mixin hover-focus-active {\n @if $enable-hover-media-query {\n &:focus,\n &:active {\n @content\n }\n @include hover { @content }\n } @else {\n &:focus,\n &:active,\n &:hover {\n @content\n }\n }\n}\n","//\n// Headings\n//\n\nh1, h2, h3, h4, h5, h6,\n.h1, .h2, .h3, .h4, .h5, .h6 {\n margin-bottom: $headings-margin-bottom;\n font-family: $headings-font-family;\n font-weight: $headings-font-weight;\n line-height: $headings-line-height;\n color: $headings-color;\n}\n\nh1, .h1 { font-size: $h1-font-size; }\nh2, .h2 { font-size: $h2-font-size; }\nh3, .h3 { font-size: $h3-font-size; }\nh4, .h4 { font-size: $h4-font-size; }\nh5, .h5 { font-size: $h5-font-size; }\nh6, .h6 { font-size: $h6-font-size; }\n\n.lead {\n font-size: $lead-font-size;\n font-weight: $lead-font-weight;\n}\n\n// Type display classes\n.display-1 {\n font-size: $display1-size;\n font-weight: $display1-weight;\n line-height: $display-line-height;\n}\n.display-2 {\n font-size: $display2-size;\n font-weight: $display2-weight;\n line-height: $display-line-height;\n}\n.display-3 {\n font-size: $display3-size;\n font-weight: $display3-weight;\n line-height: $display-line-height;\n}\n.display-4 {\n font-size: $display4-size;\n font-weight: $display4-weight;\n line-height: $display-line-height;\n}\n\n\n//\n// Horizontal rules\n//\n\nhr {\n margin-top: 1rem;\n margin-bottom: 1rem;\n border: 0;\n border-top: $hr-border-width solid $hr-border-color;\n}\n\n\n//\n// Emphasis\n//\n\nsmall,\n.small {\n font-size: $small-font-size;\n font-weight: $font-weight-normal;\n}\n\nmark,\n.mark {\n padding: $mark-padding;\n background-color: $mark-bg;\n}\n\n\n//\n// Lists\n//\n\n.list-unstyled {\n @include list-unstyled;\n}\n\n// Inline turns list items into inline-block\n.list-inline {\n @include list-unstyled;\n}\n.list-inline-item {\n display: inline-block;\n\n &:not(:last-child) {\n margin-right: $list-inline-padding;\n }\n}\n\n\n//\n// Misc\n//\n\n// Builds on `abbr`\n.initialism {\n font-size: 90%;\n text-transform: uppercase;\n}\n\n// Blockquotes\n.blockquote {\n margin-bottom: $spacer;\n font-size: $blockquote-font-size;\n}\n\n.blockquote-footer {\n display: block;\n font-size: 80%; // back to default font-size\n color: $blockquote-small-color;\n\n &::before {\n content: \"\\2014 \\00A0\"; // em dash, nbsp\n }\n}\n","// Lists\n\n// Unstyled keeps list items block level, just removes default browser padding and list-style\n@mixin list-unstyled {\n padding-left: 0;\n list-style: none;\n}\n","// Responsive images (ensure images don't scale beyond their parents)\n//\n// This is purposefully opt-in via an explicit class rather than being the default for all `<img>`s.\n// We previously tried the \"images are responsive by default\" approach in Bootstrap v2,\n// and abandoned it in Bootstrap v3 because it breaks lots of third-party widgets (including Google Maps)\n// which weren't expecting the images within themselves to be involuntarily resized.\n// See also https://github.com/twbs/bootstrap/issues/18178\n.img-fluid {\n @include img-fluid;\n}\n\n\n// Image thumbnails\n.img-thumbnail {\n padding: $thumbnail-padding;\n background-color: $thumbnail-bg;\n border: $thumbnail-border-width solid $thumbnail-border-color;\n @include border-radius($thumbnail-border-radius);\n @include transition($thumbnail-transition);\n @include box-shadow($thumbnail-box-shadow);\n\n // Keep them at most 100% wide\n @include img-fluid;\n}\n\n//\n// Figures\n//\n\n.figure {\n // Ensures the caption's text aligns with the image.\n display: inline-block;\n}\n\n.figure-img {\n margin-bottom: ($spacer / 2);\n line-height: 1;\n}\n\n.figure-caption {\n font-size: $figure-caption-font-size;\n color: $figure-caption-color;\n}\n","// Image Mixins\n// - Responsive image\n// - Retina image\n\n\n// Responsive image\n//\n// Keep images from scaling beyond the width of their parents.\n\n@mixin img-fluid {\n // Part 1: Set a maximum relative to the parent\n max-width: 100%;\n // Part 2: Override the height to auto, otherwise images will be stretched\n // when setting a width and height attribute on the img element.\n height: auto;\n}\n\n\n// Retina image\n//\n// Short retina mixin for setting background-image and -size.\n\n@mixin img-retina($file-1x, $file-2x, $width-1x, $height-1x) {\n background-image: url($file-1x);\n\n // Autoprefixer takes care of adding -webkit-min-device-pixel-ratio and -o-min-device-pixel-ratio,\n // but doesn't convert dppx=>dpi.\n // There's no such thing as unprefixed min-device-pixel-ratio since it's nonstandard.\n // Compatibility info: http://caniuse.com/#feat=css-media-resolution\n @media\n only screen and (min-resolution: 192dpi), // IE9-11 don't support dppx\n only screen and (min-resolution: 2dppx) { // Standardized\n background-image: url($file-2x);\n background-size: $width-1x $height-1x;\n }\n}\n","// Single side border-radius\n\n@mixin border-radius($radius: $border-radius) {\n @if $enable-rounded {\n border-radius: $radius;\n }\n}\n\n@mixin border-top-radius($radius) {\n @if $enable-rounded {\n border-top-left-radius: $radius;\n border-top-right-radius: $radius;\n }\n}\n\n@mixin border-right-radius($radius) {\n @if $enable-rounded {\n border-top-right-radius: $radius;\n border-bottom-right-radius: $radius;\n }\n}\n\n@mixin border-bottom-radius($radius) {\n @if $enable-rounded {\n border-bottom-right-radius: $radius;\n border-bottom-left-radius: $radius;\n }\n}\n\n@mixin border-left-radius($radius) {\n @if $enable-rounded {\n border-top-left-radius: $radius;\n border-bottom-left-radius: $radius;\n }\n}\n","@mixin transition($transition...) {\n @if $enable-transitions {\n @if length($transition) == 0 {\n transition: $transition-base;\n } @else {\n transition: $transition;\n }\n }\n}\n","// Inline and block code styles\ncode,\nkbd,\npre,\nsamp {\n font-family: $font-family-monospace;\n}\n\n// Inline code\ncode {\n padding: $code-padding-y $code-padding-x;\n font-size: $code-font-size;\n color: $code-color;\n background-color: $code-bg;\n @include border-radius($border-radius);\n\n // Streamline the style when inside anchors to avoid broken underline and more\n a > & {\n padding: 0;\n color: inherit;\n background-color: inherit;\n }\n}\n\n// User input typically entered via keyboard\nkbd {\n padding: $code-padding-y $code-padding-x;\n font-size: $code-font-size;\n color: $kbd-color;\n background-color: $kbd-bg;\n @include border-radius($border-radius-sm);\n @include box-shadow($kbd-box-shadow);\n\n kbd {\n padding: 0;\n font-size: 100%;\n font-weight: $nested-kbd-font-weight;\n @include box-shadow(none);\n }\n}\n\n// Blocks of code\npre {\n display: block;\n margin-top: 0;\n margin-bottom: 1rem;\n font-size: $code-font-size;\n color: $pre-color;\n\n // Account for some code outputs that place code tags in pre tags\n code {\n padding: 0;\n font-size: inherit;\n color: inherit;\n background-color: transparent;\n border-radius: 0;\n }\n}\n\n// Enable scrollable blocks of code\n.pre-scrollable {\n max-height: $pre-scrollable-max-height;\n overflow-y: scroll;\n}\n","// Container widths\n//\n// Set the container width, and override it for fixed navbars in media queries.\n\n@if $enable-grid-classes {\n .container {\n @include make-container();\n @include make-container-max-widths();\n }\n}\n\n// Fluid container\n//\n// Utilizes the mixin meant for fixed width containers, but with 100% width for\n// fluid, full width layouts.\n\n@if $enable-grid-classes {\n .container-fluid {\n width: 100%;\n @include make-container();\n }\n}\n\n// Row\n//\n// Rows contain and clear the floats of your columns.\n\n@if $enable-grid-classes {\n .row {\n @include make-row();\n }\n\n // Remove the negative margin from default .row, then the horizontal padding\n // from all immediate children columns (to prevent runaway style inheritance).\n .no-gutters {\n margin-right: 0;\n margin-left: 0;\n\n > .col,\n > [class*=\"col-\"] {\n padding-right: 0;\n padding-left: 0;\n }\n }\n}\n\n// Columns\n//\n// Common styles for small and large grid columns\n\n@if $enable-grid-classes {\n @include make-grid-columns();\n}\n","/// Grid system\n//\n// Generate semantic grid columns with these mixins.\n\n@mixin make-container() {\n margin-right: auto;\n margin-left: auto;\n padding-right: ($grid-gutter-width / 2);\n padding-left: ($grid-gutter-width / 2);\n width: 100%;\n}\n\n\n// For each breakpoint, define the maximum width of the container in a media query\n@mixin make-container-max-widths($max-widths: $container-max-widths, $breakpoints: $grid-breakpoints) {\n @each $breakpoint, $container-max-width in $max-widths {\n @include media-breakpoint-up($breakpoint, $breakpoints) {\n max-width: $container-max-width;\n }\n }\n}\n\n@mixin make-row() {\n display: flex;\n flex-wrap: wrap;\n margin-right: ($grid-gutter-width / -2);\n margin-left: ($grid-gutter-width / -2);\n}\n\n@mixin make-col-ready() {\n position: relative;\n // Prevent columns from becoming too narrow when at smaller grid tiers by\n // always setting `width: 100%;`. This works because we use `flex` values\n // later on to override this initial width.\n width: 100%;\n min-height: 1px; // Prevent collapsing\n padding-right: ($grid-gutter-width / 2);\n padding-left: ($grid-gutter-width / 2);\n}\n\n@mixin make-col($size, $columns: $grid-columns) {\n flex: 0 0 percentage($size / $columns);\n // Add a `max-width` to ensure content within each column does not blow out\n // the width of the column. Applies to IE10+ and Firefox. Chrome and Safari\n // do not appear to require this.\n max-width: percentage($size / $columns);\n}\n","// Breakpoint viewport sizes and media queries.\n//\n// Breakpoints are defined as a map of (name: minimum width), order from small to large:\n//\n// (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px)\n//\n// The map defined in the `$grid-breakpoints` global variable is used as the `$breakpoints` argument by default.\n\n// Name of the next breakpoint, or null for the last breakpoint.\n//\n// >> breakpoint-next(sm)\n// md\n// >> breakpoint-next(sm, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px))\n// md\n// >> breakpoint-next(sm, $breakpoint-names: (xs sm md lg xl))\n// md\n@function breakpoint-next($name, $breakpoints: $grid-breakpoints, $breakpoint-names: map-keys($breakpoints)) {\n $n: index($breakpoint-names, $name);\n @return if($n < length($breakpoint-names), nth($breakpoint-names, $n + 1), null);\n}\n\n// Minimum breakpoint width. Null for the smallest (first) breakpoint.\n//\n// >> breakpoint-min(sm, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px))\n// 576px\n@function breakpoint-min($name, $breakpoints: $grid-breakpoints) {\n $min: map-get($breakpoints, $name);\n @return if($min != 0, $min, null);\n}\n\n// Maximum breakpoint width. Null for the largest (last) breakpoint.\n// The maximum value is calculated as the minimum of the next one less 0.1.\n//\n// >> breakpoint-max(sm, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px))\n// 767px\n@function breakpoint-max($name, $breakpoints: $grid-breakpoints) {\n $next: breakpoint-next($name, $breakpoints);\n @return if($next, breakpoint-min($next, $breakpoints) - 1px, null);\n}\n\n// Returns a blank string if smallest breakpoint, otherwise returns the name with a dash infront.\n// Useful for making responsive utilities.\n//\n// >> breakpoint-infix(xs, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px))\n// \"\" (Returns a blank string)\n// >> breakpoint-infix(sm, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px))\n// \"-sm\"\n@function breakpoint-infix($name, $breakpoints: $grid-breakpoints) {\n @return if(breakpoint-min($name, $breakpoints) == null, \"\", \"-#{$name}\");\n}\n\n// Media of at least the minimum breakpoint width. No query for the smallest breakpoint.\n// Makes the @content apply to the given breakpoint and wider.\n@mixin media-breakpoint-up($name, $breakpoints: $grid-breakpoints) {\n $min: breakpoint-min($name, $breakpoints);\n @if $min {\n @media (min-width: $min) {\n @content;\n }\n } @else {\n @content;\n }\n}\n\n// Media of at most the maximum breakpoint width. No query for the largest breakpoint.\n// Makes the @content apply to the given breakpoint and narrower.\n@mixin media-breakpoint-down($name, $breakpoints: $grid-breakpoints) {\n $max: breakpoint-max($name, $breakpoints);\n @if $max {\n @media (max-width: $max) {\n @content;\n }\n } @else {\n @content;\n }\n}\n\n// Media that spans multiple breakpoint widths.\n// Makes the @content apply between the min and max breakpoints\n@mixin media-breakpoint-between($lower, $upper, $breakpoints: $grid-breakpoints) {\n $min: breakpoint-min($lower, $breakpoints);\n $max: breakpoint-max($upper, $breakpoints);\n\n @media (min-width: $min) and (max-width: $max) {\n @content;\n }\n}\n\n// Media between the breakpoint's minimum and maximum widths.\n// No minimum for the smallest breakpoint, and no maximum for the largest one.\n// Makes the @content apply only to the given breakpoint, not viewports any wider or narrower.\n@mixin media-breakpoint-only($name, $breakpoints: $grid-breakpoints) {\n $min: breakpoint-min($name, $breakpoints);\n $max: breakpoint-max($name, $breakpoints);\n\n @if $min != null and $max != null {\n @media (min-width: $min) and (max-width: $max) {\n @content;\n }\n } @else if $max == null {\n @include media-breakpoint-up($name)\n } @else if $min == null {\n @include media-breakpoint-down($name)\n }\n}\n","// Framework grid generation\n//\n// Used only by Bootstrap to generate the correct number of grid classes given\n// any value of `$grid-columns`.\n\n@mixin make-grid-columns($columns: $grid-columns, $gutter: $grid-gutter-width, $breakpoints: $grid-breakpoints) {\n // Common properties for all breakpoints\n %grid-column {\n position: relative;\n width: 100%;\n min-height: 1px; // Prevent columns from collapsing when empty\n padding-right: ($gutter / 2);\n padding-left: ($gutter / 2);\n }\n\n @each $breakpoint in map-keys($breakpoints) {\n $infix: breakpoint-infix($breakpoint, $breakpoints);\n\n // Allow columns to stretch full width below their breakpoints\n @for $i from 1 through $columns {\n .col#{$infix}-#{$i} {\n @extend %grid-column;\n }\n }\n .col#{$infix},\n .col#{$infix}-auto {\n @extend %grid-column;\n }\n\n @include media-breakpoint-up($breakpoint, $breakpoints) {\n // Provide basic `.col-{bp}` classes for equal-width flexbox columns\n .col#{$infix} {\n flex-basis: 0;\n flex-grow: 1;\n max-width: 100%;\n }\n .col#{$infix}-auto {\n flex: 0 0 auto;\n width: auto;\n max-width: none; // Reset earlier grid tiers\n }\n\n @for $i from 1 through $columns {\n .col#{$infix}-#{$i} {\n @include make-col($i, $columns);\n }\n }\n\n @for $i from 1 through $columns {\n .order#{$infix}-#{$i} {\n order: $i;\n }\n }\n }\n }\n}\n","//\n// Basic Bootstrap table\n//\n\n.table {\n width: 100%;\n max-width: 100%;\n margin-bottom: $spacer;\n background-color: $table-bg; // Reset for nesting within parents with `background-color`.\n\n th,\n td {\n padding: $table-cell-padding;\n vertical-align: top;\n border-top: $table-border-width solid $table-border-color;\n }\n\n thead th {\n vertical-align: bottom;\n border-bottom: (2 * $table-border-width) solid $table-border-color;\n }\n\n tbody + tbody {\n border-top: (2 * $table-border-width) solid $table-border-color;\n }\n\n .table {\n background-color: $body-bg;\n }\n}\n\n\n//\n// Condensed table w/ half padding\n//\n\n.table-sm {\n th,\n td {\n padding: $table-cell-padding-sm;\n }\n}\n\n\n// Bordered version\n//\n// Add borders all around the table and between all the columns.\n\n.table-bordered {\n border: $table-border-width solid $table-border-color;\n\n th,\n td {\n border: $table-border-width solid $table-border-color;\n }\n\n thead {\n th,\n td {\n border-bottom-width: (2 * $table-border-width);\n }\n }\n}\n\n\n// Zebra-striping\n//\n// Default zebra-stripe styles (alternating gray and transparent backgrounds)\n\n.table-striped {\n tbody tr:nth-of-type(odd) {\n background-color: $table-accent-bg;\n }\n}\n\n\n// Hover effect\n//\n// Placed here since it has to come after the potential zebra striping\n\n.table-hover {\n tbody tr {\n @include hover {\n background-color: $table-hover-bg;\n }\n }\n}\n\n\n// Table backgrounds\n//\n// Exact selectors below required to override `.table-striped` and prevent\n// inheritance to nested tables.\n\n@each $color, $value in $theme-colors {\n @include table-row-variant($color, theme-color-level($color, -9));\n}\n\n@include table-row-variant(active, $table-active-bg);\n\n\n// Inverse styles\n//\n// Same table markup, but inverted color scheme: dark background and light text.\n\n.thead-inverse {\n th {\n color: $table-inverse-color;\n background-color: $table-inverse-bg;\n }\n}\n\n.thead-default {\n th {\n color: $table-head-color;\n background-color: $table-head-bg;\n }\n}\n\n.table-inverse {\n color: $table-inverse-color;\n background-color: $table-inverse-bg;\n\n th,\n td,\n thead th {\n border-color: $table-inverse-border-color;\n }\n\n &.table-bordered {\n border: 0;\n }\n\n &.table-striped {\n tbody tr:nth-of-type(odd) {\n background-color: $table-inverse-accent-bg;\n }\n }\n\n &.table-hover {\n tbody tr {\n @include hover {\n background-color: $table-inverse-hover-bg;\n }\n }\n }\n}\n\n\n// Responsive tables\n//\n// Add `.table-responsive` to `.table`s and we'll make them mobile friendly by\n// enabling horizontal scrolling. Only applies <768px. Everything above that\n// will display normally.\n\n.table-responsive {\n @include media-breakpoint-down(md) {\n display: block;\n width: 100%;\n overflow-x: auto;\n -ms-overflow-style: -ms-autohiding-scrollbar; // See https://github.com/twbs/bootstrap/pull/10057\n\n // Prevent double border on horizontal scroll due to use of `display: block;`\n &.table-bordered {\n border: 0;\n }\n }\n}\n","// Tables\n\n@mixin table-row-variant($state, $background) {\n // Exact selectors below required to override `.table-striped` and prevent\n // inheritance to nested tables.\n .table-#{$state} {\n &,\n > th,\n > td {\n background-color: $background;\n }\n }\n\n // Hover states for `.table-hover`\n // Note: this is not available for cells or rows within `thead` or `tfoot`.\n .table-hover {\n $hover-background: darken($background, 5%);\n\n .table-#{$state} {\n @include hover {\n background-color: $hover-background;\n\n > td,\n > th {\n background-color: $hover-background;\n }\n }\n }\n }\n}\n","// Bootstrap functions\n//\n// Utility mixins and functions for evalutating source code across our variables, maps, and mixins.\n\n// Ascending\n// Used to evaluate Sass maps like our grid breakpoints.\n@mixin _assert-ascending($map, $map-name) {\n $prev-key: null;\n $prev-num: null;\n @each $key, $num in $map {\n @if $prev-num == null {\n // Do nothing\n } @else if not comparable($prev-num, $num) {\n @warn \"Potentially invalid value for #{$map-name}: This map must be in ascending order, but key '#{$key}' has value #{$num} whose unit makes it incomparable to #{$prev-num}, the value of the previous key '#{$prev-key}' !\";\n } @else if $prev-num >= $num {\n @warn \"Invalid value for #{$map-name}: This map must be in ascending order, but key '#{$key}' has value #{$num} which isn't greater than #{$prev-num}, the value of the previous key '#{$prev-key}' !\";\n }\n $prev-key: $key;\n $prev-num: $num;\n }\n}\n\n// Starts at zero\n// Another grid mixin that ensures the min-width of the lowest breakpoint starts at 0.\n@mixin _assert-starts-at-zero($map) {\n $values: map-values($map);\n $first-value: nth($values, 1);\n @if $first-value != 0 {\n @warn \"First breakpoint in `$grid-breakpoints` must start at 0, but starts at #{$first-value}.\";\n }\n}\n\n// Replace `$search` with `$replace` in `$string`\n// Used on our SVG icon backgrounds for custom forms.\n//\n// @author Hugo Giraudel\n// @param {String} $string - Initial string\n// @param {String} $search - Substring to replace\n// @param {String} $replace ('') - New value\n// @return {String} - Updated string\n@function str-replace($string, $search, $replace: \"\") {\n $index: str-index($string, $search);\n\n @if $index {\n @return str-slice($string, 1, $index - 1) + $replace + str-replace(str-slice($string, $index + str-length($search)), $search, $replace);\n }\n\n @return $string;\n}\n\n// Color contrast\n@mixin color-yiq($color) {\n $r: red($color);\n $g: green($color);\n $b: blue($color);\n\n $yiq: (($r * 299) + ($g * 587) + ($b * 114)) / 1000;\n\n @if ($yiq >= 150) {\n color: #111;\n } @else {\n color: #fff;\n }\n}\n\n// Retreive color Sass maps\n@function color($key: \"blue\") {\n @return map-get($colors, $key);\n}\n\n@function theme-color($key: \"primary\") {\n @return map-get($theme-colors, $key);\n}\n\n@function grayscale($key: \"100\") {\n @return map-get($grays, $key);\n}\n\n// Request a theme color level\n@function theme-color-level($color-name: \"primary\", $level: 0) {\n $color: theme-color($color-name);\n $color-base: if($level > 0, #000, #fff);\n\n @if $level < 0 {\n // Lighter values need a quick double negative for the Sass math to work\n @return mix($color-base, $color, $level * -1 * $theme-color-interval);\n } @else {\n @return mix($color-base, $color, $level * $theme-color-interval);\n }\n}\n","// scss-lint:disable QualifyingElement, VendorPrefix\n\n//\n// Textual form controls\n//\n\n.form-control {\n display: block;\n width: 100%;\n // // Make inputs at least the height of their button counterpart (base line-height + padding + border)\n // height: $input-height;\n padding: $input-btn-padding-y $input-btn-padding-x;\n font-size: $font-size-base;\n line-height: $input-btn-line-height;\n color: $input-color;\n background-color: $input-bg;\n // Reset unusual Firefox-on-Android default style; see https://github.com/necolas/normalize.css/issues/214.\n background-image: none;\n background-clip: padding-box;\n border: $input-btn-border-width solid $input-border-color;\n\n // Note: This has no effect on <select>s in some browsers, due to the limited stylability of `<select>`s in CSS.\n @if $enable-rounded {\n // Manually use the if/else instead of the mixin to account for iOS override\n border-radius: $input-border-radius;\n } @else {\n // Otherwise undo the iOS default\n border-radius: 0;\n }\n\n @include box-shadow($input-box-shadow);\n @include transition($input-transition);\n\n // Unstyle the caret on `<select>`s in IE10+.\n &::-ms-expand {\n background-color: transparent;\n border: 0;\n }\n\n // Customize the `:focus` state to imitate native WebKit styles.\n @include form-control-focus();\n\n // Placeholder\n &::placeholder {\n color: $input-placeholder-color;\n // Override Firefox's unusual default opacity; see https://github.com/twbs/bootstrap/pull/11526.\n opacity: 1;\n }\n\n // Disabled and read-only inputs\n //\n // HTML5 says that controls under a fieldset > legend:first-child won't be\n // disabled if the fieldset is disabled. Due to implementation difficulty, we\n // don't honor that edge case; we style them as disabled anyway.\n &:disabled,\n &[readonly] {\n background-color: $input-disabled-bg;\n // iOS fix for unreadable disabled content; see https://github.com/twbs/bootstrap/issues/11655.\n opacity: 1;\n }\n}\n\nselect.form-control {\n &:not([size]):not([multiple]) {\n height: $input-height;\n }\n\n &:focus::-ms-value {\n // Suppress the nested default white text on blue background highlight given to\n // the selected option text when the (still closed) <select> receives focus\n // in IE and (under certain conditions) Edge, as it looks bad and cannot be made to\n // match the appearance of the native widget.\n // See https://github.com/twbs/bootstrap/issues/19398.\n color: $input-color;\n background-color: $input-bg;\n }\n}\n\n// Make file inputs better match text inputs by forcing them to new lines.\n.form-control-file,\n.form-control-range {\n display: block;\n}\n\n\n//\n// Labels\n//\n\n// For use with horizontal and inline forms, when you need the label text to\n// align with the form controls.\n.col-form-label {\n padding-top: calc(#{$input-btn-padding-y} - #{$input-btn-border-width} * 2);\n padding-bottom: calc(#{$input-btn-padding-y} - #{$input-btn-border-width} * 2);\n margin-bottom: 0; // Override the `<label>` default\n}\n\n.col-form-label-lg {\n padding-top: calc(#{$input-btn-padding-y-lg} - #{$input-btn-border-width} * 2);\n padding-bottom: calc(#{$input-btn-padding-y-lg} - #{$input-btn-border-width} * 2);\n font-size: $font-size-lg;\n}\n\n.col-form-label-sm {\n padding-top: calc(#{$input-btn-padding-y-sm} - #{$input-btn-border-width} * 2);\n padding-bottom: calc(#{$input-btn-padding-y-sm} - #{$input-btn-border-width} * 2);\n font-size: $font-size-sm;\n}\n\n\n//\n// Legends\n//\n\n// For use with horizontal and inline forms, when you need the legend text to\n// be the same size as regular labels, and to align with the form controls.\n.col-form-legend {\n padding-top: $input-btn-padding-y;\n padding-bottom: $input-btn-padding-y;\n margin-bottom: 0;\n font-size: $font-size-base;\n}\n\n\n// Readonly controls as plain text\n//\n// Apply class to a readonly input to make it appear like regular plain\n// text (without any border, background color, focus indicator)\n\n.form-control-plaintext {\n padding-top: $input-btn-padding-y;\n padding-bottom: $input-btn-padding-y;\n margin-bottom: 0; // match inputs if this class comes on inputs with default margins\n line-height: $input-btn-line-height;\n border: solid transparent;\n border-width: $input-btn-border-width 0;\n\n &.form-control-sm,\n &.form-control-lg {\n padding-right: 0;\n padding-left: 0;\n }\n}\n\n\n// Form control sizing\n//\n// Build on `.form-control` with modifier classes to decrease or increase the\n// height and font-size of form controls.\n//\n// The `.form-group-* form-control` variations are sadly duplicated to avoid the\n// issue documented in https://github.com/twbs/bootstrap/issues/15074.\n\n.form-control-sm {\n padding: $input-btn-padding-y-sm $input-btn-padding-x-sm;\n font-size: $font-size-sm;\n line-height: $input-btn-line-height-sm;\n @include border-radius($input-border-radius-sm);\n}\n\nselect.form-control-sm {\n &:not([size]):not([multiple]) {\n height: $input-height-sm;\n }\n}\n\n.form-control-lg {\n padding: $input-btn-padding-y-lg $input-btn-padding-x-lg;\n font-size: $font-size-lg;\n line-height: $input-btn-line-height-lg;\n @include border-radius($input-border-radius-lg);\n}\n\nselect.form-control-lg {\n &:not([size]):not([multiple]) {\n height: $input-height-lg;\n }\n}\n\n\n// Form groups\n//\n// Designed to help with the organization and spacing of vertical forms. For\n// horizontal forms, use the predefined grid classes.\n\n.form-group {\n margin-bottom: $form-group-margin-bottom;\n}\n\n.form-text {\n display: block;\n margin-top: $form-text-margin-top;\n}\n\n\n// Form grid\n//\n// Special replacement for our grid system's `.row` for tighter form layouts.\n\n.form-row {\n display: flex;\n flex-wrap: wrap;\n margin-right: -5px;\n margin-left: -5px;\n\n > .col,\n > [class*=\"col-\"] {\n padding-right: 5px;\n padding-left: 5px;\n }\n}\n\n\n// Checkboxes and radios\n//\n// Indent the labels to position radios/checkboxes as hanging controls.\n\n.form-check {\n position: relative;\n display: block;\n margin-bottom: $form-check-margin-bottom;\n\n &.disabled {\n .form-check-label {\n color: $text-muted;\n }\n }\n}\n\n.form-check-label {\n padding-left: $form-check-input-gutter;\n margin-bottom: 0; // Override default `<label>` bottom margin\n}\n\n.form-check-input {\n position: absolute;\n margin-top: $form-check-input-margin-y;\n margin-left: -$form-check-input-gutter;\n\n &:only-child {\n position: static;\n }\n}\n\n// Radios and checkboxes on same line\n.form-check-inline {\n display: inline-block;\n\n .form-check-label {\n vertical-align: middle;\n }\n\n + .form-check-inline {\n margin-left: $form-check-inline-margin-x;\n }\n}\n\n\n// Form validation\n//\n// Provide feedback to users when form field values are valid or invalid. Works\n// primarily for client-side validation via scoped `:invalid` and `:valid`\n// pseudo-classes but also includes `.is-invalid` and `.is-valid` classes for\n// server side validation.\n\n.invalid-feedback {\n display: none;\n margin-top: .25rem;\n font-size: .875rem;\n color: $form-feedback-invalid-color;\n}\n\n.invalid-tooltip {\n position: absolute;\n top: 100%;\n z-index: 5;\n display: none;\n width: 250px;\n padding: .5rem;\n margin-top: .1rem;\n font-size: .875rem;\n line-height: 1;\n color: #fff;\n background-color: rgba($form-feedback-invalid-color,.8);\n border-radius: .2rem;\n}\n\n@include form-validation-state(\"valid\", $form-feedback-valid-color);\n@include form-validation-state(\"invalid\", $form-feedback-invalid-color);\n\n// Inline forms\n//\n// Make forms appear inline(-block) by adding the `.form-inline` class. Inline\n// forms begin stacked on extra small (mobile) devices and then go inline when\n// viewports reach <768px.\n//\n// Requires wrapping inputs and labels with `.form-group` for proper display of\n// default HTML form controls and our custom form controls (e.g., input groups).\n\n.form-inline {\n display: flex;\n flex-flow: row wrap;\n align-items: center; // Prevent shorter elements from growing to same height as others (e.g., small buttons growing to normal sized button height)\n\n // Because we use flex, the initial sizing of checkboxes is collapsed and\n // doesn't occupy the full-width (which is what we want for xs grid tier),\n // so we force that here.\n .form-check {\n width: 100%;\n }\n\n // Kick in the inline\n @include media-breakpoint-up(sm) {\n label {\n display: flex;\n align-items: center;\n justify-content: center;\n margin-bottom: 0;\n }\n\n // Inline-block all the things for \"inline\"\n .form-group {\n display: flex;\n flex: 0 0 auto;\n flex-flow: row wrap;\n align-items: center;\n margin-bottom: 0;\n }\n\n // Allow folks to *not* use `.form-group`\n .form-control {\n display: inline-block;\n width: auto; // Prevent labels from stacking above inputs in `.form-group`\n vertical-align: middle;\n }\n\n // Make static controls behave like regular ones\n .form-control-plaintext {\n display: inline-block;\n }\n\n .input-group {\n width: auto;\n }\n\n .form-control-label {\n margin-bottom: 0;\n vertical-align: middle;\n }\n\n // Remove default margin on radios/checkboxes that were used for stacking, and\n // then undo the floating of radios and checkboxes to match.\n .form-check {\n display: flex;\n align-items: center;\n justify-content: center;\n width: auto;\n margin-top: 0;\n margin-bottom: 0;\n }\n .form-check-label {\n padding-left: 0;\n }\n .form-check-input {\n position: relative;\n margin-top: 0;\n margin-right: $form-check-input-margin-x;\n margin-left: 0;\n }\n\n // Custom form controls\n .custom-control {\n display: flex;\n align-items: center;\n justify-content: center;\n padding-left: 0;\n }\n .custom-control-indicator {\n position: static;\n display: inline-block;\n margin-right: $form-check-input-margin-x; // Flexbox alignment means we lose our HTML space here, so we compensate.\n vertical-align: text-bottom;\n }\n\n // Re-override the feedback icon.\n .has-feedback .form-control-feedback {\n top: 0;\n }\n }\n}\n","// Form control focus state\n//\n// Generate a customized focus state and for any input with the specified color,\n// which defaults to the `@input-border-color-focus` variable.\n//\n// We highly encourage you to not customize the default value, but instead use\n// this to tweak colors on an as-needed basis. This aesthetic change is based on\n// WebKit's default styles, but applicable to a wider range of browsers. Its\n// usability and accessibility should be taken into account with any change.\n//\n// Example usage: change the default blue border and shadow to white for better\n// contrast against a dark gray background.\n@mixin form-control-focus() {\n &:focus {\n color: $input-focus-color;\n background-color: $input-focus-bg;\n border-color: $input-focus-border-color;\n outline: none;\n @include box-shadow($input-focus-box-shadow);\n }\n}\n\n\n@mixin form-validation-state($state, $color) {\n\n .form-control,\n .custom-select {\n .was-validated &:#{$state},\n &.is-#{$state} {\n border-color: $color;\n\n &:focus {\n box-shadow: 0 0 0 .2rem rgba($color,.25);\n }\n\n ~ .invalid-feedback,\n ~ .invalid-tooltip {\n display: block;\n }\n }\n }\n\n\n // TODO: redo check markup lol crap\n .form-check-input {\n .was-validated &:#{$state},\n &.is-#{$state} {\n + .form-check-label {\n color: $color;\n }\n }\n }\n\n // custom radios and checks\n .custom-control-input {\n .was-validated &:#{$state},\n &.is-#{$state} {\n ~ .custom-control-indicator {\n background-color: rgba($color, .25);\n }\n ~ .custom-control-description {\n color: $color;\n }\n }\n }\n\n // custom file\n .custom-file-input {\n .was-validated &:#{$state},\n &.is-#{$state} {\n ~ .custom-file-control {\n border-color: $color;\n\n &::before { border-color: inherit; }\n }\n &:focus {\n box-shadow: 0 0 0 .2rem rgba($color,.25);\n }\n }\n }\n}\n","// scss-lint:disable QualifyingElement\n\n//\n// Base styles\n//\n\n.btn {\n display: inline-block;\n font-weight: $btn-font-weight;\n text-align: center;\n white-space: nowrap;\n vertical-align: middle;\n user-select: none;\n border: $input-btn-border-width solid transparent;\n @include button-size($input-btn-padding-y, $input-btn-padding-x, $font-size-base, $input-btn-line-height, $btn-border-radius);\n @include transition($btn-transition);\n\n // Share hover and focus styles\n @include hover-focus {\n text-decoration: none;\n }\n &:focus,\n &.focus {\n outline: 0;\n box-shadow: $btn-focus-box-shadow;\n }\n\n // Disabled comes first so active can properly restyle\n &.disabled,\n &:disabled {\n opacity: .65;\n @include box-shadow(none);\n }\n\n &:active,\n &.active {\n background-image: none;\n @include box-shadow($btn-focus-box-shadow, $btn-active-box-shadow);\n }\n}\n\n// Future-proof disabling of clicks on `<a>` elements\na.btn.disabled,\nfieldset[disabled] a.btn {\n pointer-events: none;\n}\n\n\n//\n// Alternate buttons\n//\n\n@each $color, $value in $theme-colors {\n .btn-#{$color} {\n @include button-variant($value, $value);\n }\n}\n\n@each $color, $value in $theme-colors {\n .btn-outline-#{$color} {\n @include button-outline-variant($value, #fff);\n }\n}\n\n\n//\n// Link buttons\n//\n\n// Make a button look and behave like a link\n.btn-link {\n font-weight: $font-weight-normal;\n color: $link-color;\n border-radius: 0;\n\n &,\n &:active,\n &.active,\n &:disabled {\n background-color: transparent;\n @include box-shadow(none);\n }\n &,\n &:focus,\n &:active {\n border-color: transparent;\n box-shadow: none;\n }\n @include hover {\n border-color: transparent;\n }\n @include hover-focus {\n color: $link-hover-color;\n text-decoration: $link-hover-decoration;\n background-color: transparent;\n }\n &:disabled {\n color: $btn-link-disabled-color;\n\n @include hover-focus {\n text-decoration: none;\n }\n }\n}\n\n\n//\n// Button Sizes\n//\n\n.btn-lg {\n @include button-size($input-btn-padding-y-lg, $input-btn-padding-x-lg, $font-size-lg, $line-height-lg, $btn-border-radius-lg);\n}\n\n.btn-sm {\n @include button-size($input-btn-padding-y-sm, $input-btn-padding-x-sm, $font-size-sm, $line-height-sm, $btn-border-radius-sm);\n}\n\n\n//\n// Block button\n//\n\n.btn-block {\n display: block;\n width: 100%;\n}\n\n// Vertically space out multiple block buttons\n.btn-block + .btn-block {\n margin-top: $btn-block-spacing-y;\n}\n\n// Specificity overrides\ninput[type=\"submit\"],\ninput[type=\"reset\"],\ninput[type=\"button\"] {\n &.btn-block {\n width: 100%;\n }\n}\n","// Button variants\n//\n// Easily pump out default styles, as well as :hover, :focus, :active,\n// and disabled options for all buttons\n\n@mixin button-variant($background, $border, $active-background: darken($background, 7.5%), $active-border: darken($border, 10%)) {\n @include color-yiq($background);\n background-color: $background;\n border-color: $border;\n @include box-shadow($btn-box-shadow);\n\n &:hover {\n @include color-yiq($background);\n background-color: $active-background;\n border-color: $active-border;\n }\n\n &:focus,\n &.focus {\n // Avoid using mixin so we can pass custom focus shadow properly\n @if $enable-shadows {\n box-shadow: $btn-box-shadow, 0 0 0 3px rgba($border, .5);\n } @else {\n box-shadow: 0 0 0 3px rgba($border, .5);\n }\n }\n\n // Disabled comes first so active can properly restyle\n &.disabled,\n &:disabled {\n background-color: $background;\n border-color: $border;\n }\n\n &:active,\n &.active,\n .show > &.dropdown-toggle {\n background-color: $active-background;\n background-image: none; // Remove the gradient for the pressed/active state\n border-color: $active-border;\n @include box-shadow($btn-active-box-shadow);\n }\n}\n\n@mixin button-outline-variant($color, $color-hover: #fff) {\n color: $color;\n background-color: transparent;\n background-image: none;\n border-color: $color;\n\n @include hover {\n color: $color-hover;\n background-color: $color;\n border-color: $color;\n }\n\n &:focus,\n &.focus {\n box-shadow: 0 0 0 3px rgba($color, .5);\n }\n\n &.disabled,\n &:disabled {\n color: $color;\n background-color: transparent;\n }\n\n &:active,\n &.active,\n .show > &.dropdown-toggle {\n color: $color-hover;\n background-color: $color;\n border-color: $color;\n }\n}\n\n// Button sizes\n@mixin button-size($padding-y, $padding-x, $font-size, $line-height, $border-radius) {\n padding: $padding-y $padding-x;\n font-size: $font-size;\n line-height: $line-height;\n @include border-radius($border-radius);\n}\n",".fade {\n opacity: 0;\n @include transition($transition-fade);\n\n &.show {\n opacity: 1;\n }\n}\n\n.collapse {\n display: none;\n &.show {\n display: block;\n }\n}\n\ntr {\n &.collapse.show {\n display: table-row;\n }\n}\n\ntbody {\n &.collapse.show {\n display: table-row-group;\n }\n}\n\n.collapsing {\n position: relative;\n height: 0;\n overflow: hidden;\n @include transition($transition-collapse);\n}\n","// The dropdown wrapper (`<div>`)\n.dropup,\n.dropdown {\n position: relative;\n}\n\n.dropdown-toggle {\n // Generate the caret automatically\n &::after {\n display: inline-block;\n width: 0;\n height: 0;\n margin-left: $caret-width * .85;\n vertical-align: $caret-width * .85;\n content: \"\";\n border-top: $caret-width solid;\n border-right: $caret-width solid transparent;\n border-left: $caret-width solid transparent;\n }\n\n &:empty::after {\n margin-left: 0;\n }\n}\n\n// Allow for dropdowns to go bottom up (aka, dropup-menu)\n// Just add .dropup after the standard .dropdown class and you're set.\n.dropup {\n .dropdown-menu {\n margin-top: 0;\n margin-bottom: $dropdown-spacer;\n }\n\n .dropdown-toggle {\n &::after {\n border-top: 0;\n border-bottom: $caret-width solid;\n }\n }\n}\n\n// The dropdown menu\n.dropdown-menu {\n position: absolute;\n top: 100%;\n left: 0;\n z-index: $zindex-dropdown;\n display: none; // none by default, but block on \"open\" of the menu\n float: left;\n min-width: $dropdown-min-width;\n padding: $dropdown-padding-y 0;\n margin: $dropdown-spacer 0 0; // override default ul\n font-size: $font-size-base; // Redeclare because nesting can cause inheritance issues\n color: $body-color;\n text-align: left; // Ensures proper alignment if parent has it changed (e.g., modal footer)\n list-style: none;\n background-color: $dropdown-bg;\n background-clip: padding-box;\n border: $dropdown-border-width solid $dropdown-border-color;\n @include border-radius($border-radius);\n @include box-shadow($dropdown-box-shadow);\n}\n\n// Dividers (basically an `<hr>`) within the dropdown\n.dropdown-divider {\n @include nav-divider($dropdown-divider-bg);\n}\n\n// Links, buttons, and more within the dropdown menu\n//\n// `<button>`-specific styles are denoted with `// For <button>s`\n.dropdown-item {\n display: block;\n width: 100%; // For `<button>`s\n padding: $dropdown-item-padding-y $dropdown-item-padding-x;\n clear: both;\n font-weight: $font-weight-normal;\n color: $dropdown-link-color;\n text-align: inherit; // For `<button>`s\n white-space: nowrap; // prevent links from randomly breaking onto new lines\n background: none; // For `<button>`s\n border: 0; // For `<button>`s\n\n @include hover-focus {\n color: $dropdown-link-hover-color;\n text-decoration: none;\n background-color: $dropdown-link-hover-bg;\n }\n\n &.active,\n &:active {\n color: $dropdown-link-active-color;\n text-decoration: none;\n background-color: $dropdown-link-active-bg;\n }\n\n &.disabled,\n &:disabled {\n color: $dropdown-link-disabled-color;\n background-color: transparent;\n // Remove CSS gradients if they're enabled\n @if $enable-gradients {\n background-image: none;\n }\n }\n}\n\n// Open state for the dropdown\n.show {\n // Remove the outline when :focus is triggered\n > a {\n outline: 0;\n }\n}\n\n.dropdown-menu.show {\n display: block;\n}\n\n// Dropdown section headers\n.dropdown-header {\n display: block;\n padding: $dropdown-padding-y $dropdown-item-padding-x;\n margin-bottom: 0; // for use with heading elements\n font-size: $font-size-sm;\n color: $dropdown-header-color;\n white-space: nowrap; // as with > li > a\n}\n","// Horizontal dividers\n//\n// Dividers (basically an hr) within dropdowns and nav lists\n\n@mixin nav-divider($color: #e5e5e5) {\n height: 0;\n margin: ($spacer / 2) 0;\n overflow: hidden;\n border-top: 1px solid $color;\n}\n","// scss-lint:disable QualifyingElement\n\n// Make the div behave like a button\n.btn-group,\n.btn-group-vertical {\n position: relative;\n display: inline-flex;\n vertical-align: middle; // match .btn alignment given font-size hack above\n\n > .btn {\n position: relative;\n flex: 0 1 auto;\n margin-bottom: 0;\n\n // Bring the hover, focused, and \"active\" buttons to the front to overlay\n // the borders properly\n @include hover {\n z-index: 2;\n }\n &:focus,\n &:active,\n &.active {\n z-index: 2;\n }\n }\n\n // Prevent double borders when buttons are next to each other\n .btn + .btn,\n .btn + .btn-group,\n .btn-group + .btn,\n .btn-group + .btn-group {\n margin-left: -$input-btn-border-width;\n }\n}\n\n// Optional: Group multiple button groups together for a toolbar\n.btn-toolbar {\n display: flex;\n flex-wrap: wrap;\n justify-content: flex-start;\n\n .input-group {\n width: auto;\n }\n}\n\n.btn-group > .btn:not(:first-child):not(:last-child):not(.dropdown-toggle) {\n border-radius: 0;\n}\n\n// 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\n.btn-group > .btn:first-child {\n margin-left: 0;\n\n &:not(:last-child):not(.dropdown-toggle) {\n @include border-right-radius(0);\n }\n}\n// Need .dropdown-toggle since :last-child doesn't apply given a .dropdown-menu immediately after it\n.btn-group > .btn:last-child:not(:first-child),\n.btn-group > .dropdown-toggle:not(:first-child) {\n @include border-left-radius(0);\n}\n\n// Custom edits for including btn-groups within btn-groups (useful for including dropdown buttons within a btn-group)\n.btn-group > .btn-group {\n float: left;\n}\n.btn-group > .btn-group:not(:first-child):not(:last-child) > .btn {\n border-radius: 0;\n}\n.btn-group > .btn-group:first-child:not(:last-child) {\n > .btn:last-child,\n > .dropdown-toggle {\n @include border-right-radius(0);\n }\n}\n.btn-group > .btn-group:last-child:not(:first-child) > .btn:first-child {\n @include border-left-radius(0);\n}\n\n\n// Sizing\n//\n// Remix the default button sizing classes into new ones for easier manipulation.\n\n.btn-group-sm > .btn { @extend .btn-sm; }\n.btn-group-lg > .btn { @extend .btn-lg; }\n\n\n//\n// Split button dropdowns\n//\n\n.btn + .dropdown-toggle-split {\n padding-right: $input-btn-padding-x * .75;\n padding-left: $input-btn-padding-x * .75;\n\n &::after {\n margin-left: 0;\n }\n}\n\n.btn-sm + .dropdown-toggle-split {\n padding-right: $input-btn-padding-x-sm * .75;\n padding-left: $input-btn-padding-x-sm * .75;\n}\n\n.btn-lg + .dropdown-toggle-split {\n padding-right: $input-btn-padding-x-lg * .75;\n padding-left: $input-btn-padding-x-lg * .75;\n}\n\n\n// The clickable button for toggling the menu\n// Set the same inset shadow as the :active state\n.btn-group.show .dropdown-toggle {\n @include box-shadow($btn-active-box-shadow);\n\n // Show no shadow for `.btn-link` since it has no other button styles.\n &.btn-link {\n @include box-shadow(none);\n }\n}\n\n\n//\n// Vertical button groups\n//\n\n.btn-group-vertical {\n display: inline-flex;\n flex-direction: column;\n align-items: flex-start;\n justify-content: center;\n\n .btn,\n .btn-group {\n width: 100%;\n }\n\n > .btn + .btn,\n > .btn + .btn-group,\n > .btn-group + .btn,\n > .btn-group + .btn-group {\n margin-top: -$input-btn-border-width;\n margin-left: 0;\n }\n}\n\n.btn-group-vertical > .btn {\n &:not(:first-child):not(:last-child) {\n border-radius: 0;\n }\n &:first-child:not(:last-child) {\n @include border-bottom-radius(0);\n }\n &:last-child:not(:first-child) {\n @include border-top-radius(0);\n }\n}\n.btn-group-vertical > .btn-group:not(:first-child):not(:last-child) > .btn {\n border-radius: 0;\n}\n.btn-group-vertical > .btn-group:first-child:not(:last-child) {\n > .btn:last-child,\n > .dropdown-toggle {\n @include border-bottom-radius(0);\n }\n}\n.btn-group-vertical > .btn-group:last-child:not(:first-child) > .btn:first-child {\n @include border-top-radius(0);\n}\n\n\n// Checkbox and radio options\n//\n// In order to support the browser's form validation feedback, powered by the\n// `required` attribute, we have to \"hide\" the inputs via `clip`. We cannot use\n// `display: none;` or `visibility: hidden;` as that also hides the popover.\n// Simply visually hiding the inputs via `opacity` would leave them clickable in\n// certain cases which is prevented by using `clip` and `pointer-events`.\n// This way, we ensure a DOM element is visible to position the popover from.\n//\n// See https://github.com/twbs/bootstrap/pull/12794 and\n// https://github.com/twbs/bootstrap/pull/14559 for more information.\n\n[data-toggle=\"buttons\"] {\n > .btn,\n > .btn-group > .btn {\n input[type=\"radio\"],\n input[type=\"checkbox\"] {\n position: absolute;\n clip: rect(0,0,0,0);\n pointer-events: none;\n }\n }\n}\n","//\n// Base styles\n//\n\n.input-group {\n position: relative;\n display: flex;\n width: 100%;\n\n .form-control {\n // Ensure that the input is always above the *appended* addon button for\n // proper border colors.\n position: relative;\n z-index: 2;\n flex: 1 1 auto;\n // Add width 1% and flex-basis auto to ensure that button will not wrap out\n // the column. Applies to IE Edge+ and Firefox. Chrome does not require this.\n width: 1%;\n margin-bottom: 0;\n\n // Bring the \"active\" form control to the front\n @include hover-focus-active {\n z-index: 3;\n }\n }\n}\n\n.input-group-addon,\n.input-group-btn,\n.input-group .form-control {\n // Vertically centers the content of the addons within the input group\n display: flex;\n align-items: center;\n\n &:not(:first-child):not(:last-child) {\n @include border-radius(0);\n }\n}\n\n.input-group-addon,\n.input-group-btn {\n white-space: nowrap;\n vertical-align: middle; // Match the inputs\n}\n\n\n// Sizing options\n//\n// Remix the default form control sizing classes into new ones for easier\n// manipulation.\n\n.input-group-lg > .form-control,\n.input-group-lg > .input-group-addon,\n.input-group-lg > .input-group-btn > .btn {\n @extend .form-control-lg;\n}\n.input-group-sm > .form-control,\n.input-group-sm > .input-group-addon,\n.input-group-sm > .input-group-btn > .btn {\n @extend .form-control-sm;\n}\n\n\n//\n// Text input groups\n//\n\n.input-group-addon {\n padding: $input-btn-padding-y $input-btn-padding-x;\n margin-bottom: 0; // Allow use of <label> elements by overriding our default margin-bottom\n font-size: $font-size-base; // Match inputs\n font-weight: $font-weight-normal;\n line-height: $input-btn-line-height;\n color: $input-color;\n text-align: center;\n background-color: $input-group-addon-bg;\n border: $input-btn-border-width solid $input-group-addon-border-color;\n @include border-radius($input-border-radius);\n\n // Sizing\n &.form-control-sm {\n padding: $input-btn-padding-y-sm $input-btn-padding-x-sm;\n font-size: $font-size-sm;\n @include border-radius($input-border-radius-sm);\n }\n\n &.form-control-lg {\n padding: $input-btn-padding-y-lg $input-btn-padding-x-lg;\n font-size: $font-size-lg;\n @include border-radius($input-border-radius-lg);\n }\n\n // scss-lint:disable QualifyingElement\n // Nuke default margins from checkboxes and radios to vertically center within.\n input[type=\"radio\"],\n input[type=\"checkbox\"] {\n margin-top: 0;\n }\n // scss-lint:enable QualifyingElement\n}\n\n\n//\n// Reset rounded corners\n//\n\n.input-group .form-control:not(:last-child),\n.input-group-addon:not(:last-child),\n.input-group-btn:not(:last-child) > .btn,\n.input-group-btn:not(:last-child) > .btn-group > .btn,\n.input-group-btn:not(:last-child) > .dropdown-toggle,\n.input-group-btn:not(:first-child) > .btn:not(:last-child):not(.dropdown-toggle),\n.input-group-btn:not(:first-child) > .btn-group:not(:last-child) > .btn {\n @include border-right-radius(0);\n}\n.input-group-addon:not(:last-child) {\n border-right: 0;\n}\n.input-group .form-control:not(:first-child),\n.input-group-addon:not(:first-child),\n.input-group-btn:not(:first-child) > .btn,\n.input-group-btn:not(:first-child) > .btn-group > .btn,\n.input-group-btn:not(:first-child) > .dropdown-toggle,\n.input-group-btn:not(:last-child) > .btn:not(:first-child),\n.input-group-btn:not(:last-child) > .btn-group:not(:first-child) > .btn {\n @include border-left-radius(0);\n}\n.form-control + .input-group-addon:not(:first-child) {\n border-left: 0;\n}\n\n//\n// Button input groups\n//\n\n.input-group-btn {\n position: relative;\n // Jankily prevent input button groups from wrapping with `white-space` and\n // `font-size` in combination with `inline-block` on buttons.\n font-size: 0;\n white-space: nowrap;\n\n // Negative margin for spacing, position for bringing hovered/focused/actived\n // element above the siblings.\n > .btn {\n position: relative;\n\n + .btn {\n margin-left: (-$input-btn-border-width);\n }\n\n // Bring the \"active\" button to the front\n @include hover-focus-active {\n z-index: 3;\n }\n }\n\n // Negative margin to only have a single, shared border between the two\n &:not(:last-child) {\n > .btn,\n > .btn-group {\n margin-right: (-$input-btn-border-width);\n }\n }\n &:not(:first-child) {\n > .btn,\n > .btn-group {\n z-index: 2;\n margin-left: (-$input-btn-border-width);\n // Because specificity\n @include hover-focus-active {\n z-index: 3;\n }\n }\n }\n}\n","// scss-lint:disable PropertyCount, VendorPrefix\n\n// Embedded icons from Open Iconic.\n// Released under MIT and copyright 2014 Waybury.\n// https://useiconic.com/open\n\n\n// Checkboxes and radios\n//\n// Base class takes care of all the key behavioral aspects.\n\n.custom-control {\n position: relative;\n display: inline-flex;\n min-height: (1rem * $line-height-base);\n padding-left: $custom-control-gutter;\n margin-right: $custom-control-spacer-x;\n}\n\n.custom-control-input {\n position: absolute;\n z-index: -1; // Put the input behind the label so it doesn't overlay text\n opacity: 0;\n\n &:checked ~ .custom-control-indicator {\n color: $custom-control-indicator-checked-color;\n background-color: $custom-control-indicator-checked-bg;\n @include box-shadow($custom-control-indicator-checked-box-shadow);\n }\n\n &:focus ~ .custom-control-indicator {\n // the mixin is not used here to make sure there is feedback\n box-shadow: $custom-control-indicator-focus-box-shadow;\n }\n\n &:active ~ .custom-control-indicator {\n color: $custom-control-indicator-active-color;\n background-color: $custom-control-indicator-active-bg;\n @include box-shadow($custom-control-indicator-active-box-shadow);\n }\n\n &:disabled {\n ~ .custom-control-indicator {\n background-color: $custom-control-indicator-disabled-bg;\n }\n\n ~ .custom-control-description {\n color: $custom-control-description-disabled-color;\n }\n }\n}\n\n// Custom indicator\n//\n// Generates a shadow element to create our makeshift checkbox/radio background.\n\n.custom-control-indicator {\n position: absolute;\n top: (($line-height-base - $custom-control-indicator-size) / 2);\n left: 0;\n display: block;\n width: $custom-control-indicator-size;\n height: $custom-control-indicator-size;\n pointer-events: none;\n user-select: none;\n background-color: $custom-control-indicator-bg;\n background-repeat: no-repeat;\n background-position: center center;\n background-size: $custom-control-indicator-bg-size;\n @include box-shadow($custom-control-indicator-box-shadow);\n}\n\n// Checkboxes\n//\n// Tweak just a few things for checkboxes.\n\n.custom-checkbox {\n .custom-control-indicator {\n @include border-radius($custom-checkbox-indicator-border-radius);\n }\n\n .custom-control-input:checked ~ .custom-control-indicator {\n background-image: $custom-checkbox-indicator-icon-checked;\n }\n\n .custom-control-input:indeterminate ~ .custom-control-indicator {\n background-color: $custom-checkbox-indicator-indeterminate-bg;\n background-image: $custom-checkbox-indicator-icon-indeterminate;\n @include box-shadow($custom-checkbox-indicator-indeterminate-box-shadow);\n }\n}\n\n// Radios\n//\n// Tweak just a few things for radios.\n\n.custom-radio {\n .custom-control-indicator {\n border-radius: $custom-radio-indicator-border-radius;\n }\n\n .custom-control-input:checked ~ .custom-control-indicator {\n background-image: $custom-radio-indicator-icon-checked;\n }\n}\n\n\n// Layout options\n//\n// By default radios and checkboxes are `inline-block` with no additional spacing\n// set. Use these optional classes to tweak the layout.\n\n.custom-controls-stacked {\n display: flex;\n flex-direction: column;\n\n .custom-control {\n margin-bottom: $custom-control-spacer-y;\n\n + .custom-control {\n margin-left: 0;\n }\n }\n}\n\n\n// Select\n//\n// Replaces the browser default select with a custom one, mostly pulled from\n// http://primercss.io.\n//\n\n.custom-select {\n display: inline-block;\n max-width: 100%;\n height: $input-height;\n padding: $custom-select-padding-y ($custom-select-padding-x + $custom-select-indicator-padding) $custom-select-padding-y $custom-select-padding-x;\n line-height: $custom-select-line-height;\n color: $custom-select-color;\n vertical-align: middle;\n background: $custom-select-bg $custom-select-indicator no-repeat right $custom-select-padding-x center;\n background-size: $custom-select-bg-size;\n border: $custom-select-border-width solid $custom-select-border-color;\n @if $enable-rounded {\n border-radius: $custom-select-border-radius;\n } @else {\n border-radius: 0;\n }\n appearance: none;\n\n &:focus {\n border-color: $custom-select-focus-border-color;\n outline: none;\n @include box-shadow($custom-select-focus-box-shadow);\n\n &::-ms-value {\n // For visual consistency with other platforms/browsers,\n // supress the default white text on blue background highlight given to\n // the selected option text when the (still closed) <select> receives focus\n // in IE and (under certain conditions) Edge.\n // See https://github.com/twbs/bootstrap/issues/19398.\n color: $input-color;\n background-color: $input-bg;\n }\n }\n\n &:disabled {\n color: $custom-select-disabled-color;\n background-color: $custom-select-disabled-bg;\n }\n\n // Hides the default caret in IE11\n &::-ms-expand {\n opacity: 0;\n }\n}\n\n.custom-select-sm {\n height: $custom-select-height-sm;\n padding-top: $custom-select-padding-y;\n padding-bottom: $custom-select-padding-y;\n font-size: $custom-select-font-size-sm;\n}\n\n\n// File\n//\n// Custom file input.\n\n.custom-file {\n position: relative;\n display: inline-block;\n max-width: 100%;\n height: $custom-file-height;\n margin-bottom: 0;\n}\n\n.custom-file-input {\n min-width: $custom-file-width;\n max-width: 100%;\n height: $custom-file-height;\n margin: 0;\n opacity: 0;\n\n &:focus ~ .custom-file-control {\n @include box-shadow($custom-file-focus-box-shadow);\n }\n}\n\n.custom-file-control {\n position: absolute;\n top: 0;\n right: 0;\n left: 0;\n z-index: 5;\n height: $custom-file-height;\n padding: $custom-file-padding-x $custom-file-padding-y;\n line-height: $custom-file-line-height;\n color: $custom-file-color;\n pointer-events: none;\n user-select: none;\n background-color: $custom-file-bg;\n border: $custom-file-border-width solid $custom-file-border-color;\n @include border-radius($custom-file-border-radius);\n @include box-shadow($custom-file-box-shadow);\n\n @each $lang, $text in map-get($custom-file-text, placeholder) {\n &:lang(#{$lang}):empty::after {\n content: $text;\n }\n }\n\n &::before {\n position: absolute;\n top: -$custom-file-border-width;\n right: -$custom-file-border-width;\n bottom: -$custom-file-border-width;\n z-index: 6;\n display: block;\n height: $custom-file-height;\n padding: $custom-file-padding-x $custom-file-padding-y;\n line-height: $custom-file-line-height;\n color: $custom-file-button-color;\n background-color: $custom-file-button-bg;\n border: $custom-file-border-width solid $custom-file-border-color;\n @include border-radius(0 $custom-file-border-radius $custom-file-border-radius 0);\n }\n\n @each $lang, $text in map-get($custom-file-text, button-label) {\n &:lang(#{$lang})::before {\n content: $text;\n }\n }\n}\n","// Base class\n//\n// Kickstart any navigation component with a set of style resets. Works with\n// `<nav>`s or `<ul>`s.\n\n.nav {\n display: flex;\n flex-wrap: wrap;\n padding-left: 0;\n margin-bottom: 0;\n list-style: none;\n}\n\n.nav-link {\n display: block;\n padding: $nav-link-padding-y $nav-link-padding-x;\n\n @include hover-focus {\n text-decoration: none;\n }\n\n // Disabled state lightens text\n &.disabled {\n color: $nav-link-disabled-color;\n }\n}\n\n//\n// Tabs\n//\n\n.nav-tabs {\n border-bottom: $nav-tabs-border-width solid $nav-tabs-border-color;\n\n .nav-item {\n margin-bottom: -$nav-tabs-border-width;\n }\n\n .nav-link {\n border: $nav-tabs-border-width solid transparent;\n @include border-top-radius($nav-tabs-border-radius);\n\n @include hover-focus {\n border-color: $nav-tabs-link-hover-border-color $nav-tabs-link-hover-border-color $nav-tabs-border-color;\n }\n\n &.disabled {\n color: $nav-link-disabled-color;\n background-color: transparent;\n border-color: transparent;\n }\n }\n\n .nav-link.active,\n .nav-item.show .nav-link {\n color: $nav-tabs-link-active-color;\n background-color: $nav-tabs-link-active-bg;\n border-color: $nav-tabs-link-active-border-color $nav-tabs-link-active-border-color $nav-tabs-link-active-bg;\n }\n\n .dropdown-menu {\n // Make dropdown border overlap tab border\n margin-top: -$nav-tabs-border-width;\n // Remove the top rounded corners here since there is a hard edge above the menu\n @include border-top-radius(0);\n }\n}\n\n\n//\n// Pills\n//\n\n.nav-pills {\n .nav-link {\n @include border-radius($nav-pills-border-radius);\n\n &.active,\n .show > & {\n color: $nav-pills-link-active-color;\n background-color: $nav-pills-link-active-bg;\n }\n }\n}\n\n\n//\n// Justified variants\n//\n\n.nav-fill {\n .nav-item {\n flex: 1 1 auto;\n text-align: center;\n }\n}\n\n.nav-justified {\n .nav-item {\n flex-basis: 0;\n flex-grow: 1;\n text-align: center;\n }\n}\n\n\n// Tabbable tabs\n//\n// Hide tabbable panes to start, show them when `.active`\n\n.tab-content {\n > .tab-pane {\n display: none;\n }\n > .active {\n display: block;\n }\n}\n","// Contents\n//\n// Navbar\n// Navbar brand\n// Navbar nav\n// Navbar text\n// Navbar divider\n// Responsive navbar\n// Navbar position\n// Navbar themes\n\n\n// Navbar\n//\n// Provide a static navbar from which we expand to create full-width, fixed, and\n// other navbar variations.\n\n.navbar {\n position: relative;\n display: flex;\n flex-wrap: wrap; // allow us to do the line break for collapsing content\n align-items: center;\n justify-content: space-between; // space out brand from logo\n padding: $navbar-padding-y $navbar-padding-x;\n\n // Because flex properties aren't inherited, we need to redeclare these first\n // few properities so that content nested within behave properly.\n > .container,\n > .container-fluid {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n justify-content: space-between;\n }\n}\n\n\n// Navbar brand\n//\n// Used for brand, project, or site names.\n\n.navbar-brand {\n display: inline-block;\n padding-top: $navbar-brand-padding-y;\n padding-bottom: $navbar-brand-padding-y;\n margin-right: $navbar-padding-x;\n font-size: $navbar-brand-font-size;\n line-height: inherit;\n white-space: nowrap;\n\n @include hover-focus {\n text-decoration: none;\n }\n}\n\n\n// Navbar nav\n//\n// Custom navbar navigation (doesn't require `.nav`, but does make use of `.nav-link`).\n\n.navbar-nav {\n display: flex;\n flex-direction: column; // cannot use `inherit` to get the `.navbar`s value\n padding-left: 0;\n margin-bottom: 0;\n list-style: none;\n\n .nav-link {\n padding-right: 0;\n padding-left: 0;\n }\n\n .dropdown-menu {\n position: static;\n float: none;\n }\n}\n\n\n// Navbar text\n//\n//\n\n.navbar-text {\n display: inline-block;\n padding-top: $nav-link-padding-y;\n padding-bottom: $nav-link-padding-y;\n}\n\n\n// Responsive navbar\n//\n// Custom styles for responsive collapsing and toggling of navbar contents.\n// Powered by the collapse Bootstrap JavaScript plugin.\n\n// When collapsed, prevent the toggleable navbar contents from appearing in\n// the default flexbox row orienation. Requires the use of `flex-wrap: wrap`\n// on the `.navbar` parent.\n.navbar-collapse {\n flex-basis: 100%;\n // For always expanded or extra full navbars, ensure content aligns itself\n // properly vertically. Can be easily overridden with flex utilities.\n align-items: center;\n}\n\n// Button for toggling the navbar when in its collapsed state\n.navbar-toggler {\n padding: $navbar-toggler-padding-y $navbar-toggler-padding-x;\n font-size: $navbar-toggler-font-size;\n line-height: 1;\n background: transparent; // remove default button style\n border: $border-width solid transparent; // remove default button style\n @include border-radius($navbar-toggler-border-radius);\n\n @include hover-focus {\n text-decoration: none;\n }\n}\n\n// Keep as a separate element so folks can easily override it with another icon\n// or image file as needed.\n.navbar-toggler-icon {\n display: inline-block;\n width: 1.5em;\n height: 1.5em;\n vertical-align: middle;\n content: \"\";\n background: no-repeat center center;\n background-size: 100% 100%;\n}\n\n// Generate series of `.navbar-expand-*` responsive classes for configuring\n// where your navbar collapses.\n.navbar-expand {\n @each $breakpoint in map-keys($grid-breakpoints) {\n $next: breakpoint-next($breakpoint, $grid-breakpoints);\n $infix: breakpoint-infix($next, $grid-breakpoints);\n\n &#{$infix} {\n @include media-breakpoint-down($breakpoint) {\n > .container,\n > .container-fluid {\n padding-right: 0;\n padding-left: 0;\n }\n }\n\n @include media-breakpoint-up($next) {\n flex-direction: row;\n flex-wrap: nowrap;\n justify-content: flex-start;\n\n .navbar-nav {\n flex-direction: row;\n\n .dropdown-menu {\n position: absolute;\n }\n\n .dropdown-menu-right {\n right: 0;\n left: auto; // Reset the default from `.dropdown-menu`\n }\n\n .nav-link {\n padding-right: .5rem;\n padding-left: .5rem;\n }\n }\n\n // For nesting containers, have to redeclare for alignment purposes\n > .container,\n > .container-fluid {\n flex-wrap: nowrap;\n }\n\n // scss-lint:disable ImportantRule\n .navbar-collapse {\n display: flex !important;\n }\n // scss-lint:enable ImportantRule\n\n .navbar-toggler {\n display: none;\n }\n }\n }\n }\n}\n\n\n// Navbar themes\n//\n// Styles for switching between navbars with light or dark background.\n\n// Dark links against a light background\n.navbar-light {\n .navbar-brand {\n color: $navbar-light-active-color;\n\n @include hover-focus {\n color: $navbar-light-active-color;\n }\n }\n\n .navbar-nav {\n .nav-link {\n color: $navbar-light-color;\n\n @include hover-focus {\n color: $navbar-light-hover-color;\n }\n\n &.disabled {\n color: $navbar-light-disabled-color;\n }\n }\n\n .show > .nav-link,\n .active > .nav-link,\n .nav-link.show,\n .nav-link.active {\n color: $navbar-light-active-color;\n }\n }\n\n .navbar-toggler {\n color: $navbar-light-color;\n border-color: $navbar-light-toggler-border-color;\n }\n\n .navbar-toggler-icon {\n background-image: $navbar-light-toggler-icon-bg;\n }\n\n .navbar-text {\n color: $navbar-light-color;\n }\n}\n\n// White links against a dark background\n.navbar-dark {\n .navbar-brand {\n color: $navbar-dark-active-color;\n\n @include hover-focus {\n color: $navbar-dark-active-color;\n }\n }\n\n .navbar-nav {\n .nav-link {\n color: $navbar-dark-color;\n\n @include hover-focus {\n color: $navbar-dark-hover-color;\n }\n\n &.disabled {\n color: $navbar-dark-disabled-color;\n }\n }\n\n .show > .nav-link,\n .active > .nav-link,\n .nav-link.show,\n .nav-link.active {\n color: $navbar-dark-active-color;\n }\n }\n\n .navbar-toggler {\n color: $navbar-dark-color;\n border-color: $navbar-dark-toggler-border-color;\n }\n\n .navbar-toggler-icon {\n background-image: $navbar-dark-toggler-icon-bg;\n }\n\n .navbar-text {\n color: $navbar-dark-color;\n }\n}\n","//\n// Base styles\n//\n\n.card {\n position: relative;\n display: flex;\n flex-direction: column;\n min-width: 0;\n word-wrap: break-word;\n background-color: $card-bg;\n background-clip: border-box;\n border: $card-border-width solid $card-border-color;\n @include border-radius($card-border-radius);\n}\n\n.card-body {\n // Enable `flex-grow: 1` for decks and groups so that card blocks take up\n // as much space as possible, ensuring footers are aligned to the bottom.\n flex: 1 1 auto;\n padding: $card-spacer-x;\n}\n\n.card-title {\n margin-bottom: $card-spacer-y;\n}\n\n.card-subtitle {\n margin-top: -($card-spacer-y / 2);\n margin-bottom: 0;\n}\n\n.card-text:last-child {\n margin-bottom: 0;\n}\n\n.card-link {\n @include hover {\n text-decoration: none;\n }\n\n + .card-link {\n margin-left: $card-spacer-x;\n }\n}\n\n.card {\n > .list-group:first-child {\n .list-group-item:first-child {\n @include border-top-radius($card-border-radius);\n }\n }\n\n > .list-group:last-child {\n .list-group-item:last-child {\n @include border-bottom-radius($card-border-radius);\n }\n }\n}\n\n\n//\n// Optional textual caps\n//\n\n.card-header {\n padding: $card-spacer-y $card-spacer-x;\n margin-bottom: 0; // Removes the default margin-bottom of <hN>\n background-color: $card-cap-bg;\n border-bottom: $card-border-width solid $card-border-color;\n\n &:first-child {\n @include border-radius($card-inner-border-radius $card-inner-border-radius 0 0);\n }\n}\n\n.card-footer {\n padding: $card-spacer-y $card-spacer-x;\n background-color: $card-cap-bg;\n border-top: $card-border-width solid $card-border-color;\n\n &:last-child {\n @include border-radius(0 0 $card-inner-border-radius $card-inner-border-radius);\n }\n}\n\n\n//\n// Header navs\n//\n\n.card-header-tabs {\n margin-right: -($card-spacer-x / 2);\n margin-bottom: -$card-spacer-y;\n margin-left: -($card-spacer-x / 2);\n border-bottom: 0;\n}\n\n.card-header-pills {\n margin-right: -($card-spacer-x / 2);\n margin-left: -($card-spacer-x / 2);\n}\n\n// Card image\n.card-img-overlay {\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n padding: $card-img-overlay-padding;\n}\n\n.card-img {\n width: 100%; // Required because we use flexbox and this inherently applies align-self: stretch\n @include border-radius($card-inner-border-radius);\n}\n\n// Card image caps\n.card-img-top {\n width: 100%; // Required because we use flexbox and this inherently applies align-self: stretch\n @include border-top-radius($card-inner-border-radius);\n}\n\n.card-img-bottom {\n width: 100%; // Required because we use flexbox and this inherently applies align-self: stretch\n @include border-bottom-radius($card-inner-border-radius);\n}\n\n\n// Card deck\n\n@include media-breakpoint-up(sm) {\n .card-deck {\n display: flex;\n flex-flow: row wrap;\n margin-right: -$card-deck-margin;\n margin-left: -$card-deck-margin;\n\n .card {\n display: flex;\n flex: 1 0 0%;\n flex-direction: column;\n margin-right: $card-deck-margin;\n margin-left: $card-deck-margin;\n }\n }\n}\n\n\n//\n// Card groups\n//\n\n@include media-breakpoint-up(sm) {\n .card-group {\n display: flex;\n flex-flow: row wrap;\n\n .card {\n flex: 1 0 0%;\n\n + .card {\n margin-left: 0;\n border-left: 0;\n }\n\n // Handle rounded corners\n @if $enable-rounded {\n &:first-child {\n @include border-right-radius(0);\n\n .card-img-top {\n border-top-right-radius: 0;\n }\n .card-img-bottom {\n border-bottom-right-radius: 0;\n }\n }\n &:last-child {\n @include border-left-radius(0);\n\n .card-img-top {\n border-top-left-radius: 0;\n }\n .card-img-bottom {\n border-bottom-left-radius: 0;\n }\n }\n\n &:not(:first-child):not(:last-child) {\n border-radius: 0;\n\n .card-img-top,\n .card-img-bottom {\n border-radius: 0;\n }\n }\n }\n }\n }\n}\n\n\n//\n// Columns\n//\n\n.card-columns {\n .card {\n margin-bottom: $card-columns-margin;\n }\n\n @include media-breakpoint-up(sm) {\n column-count: $card-columns-count;\n column-gap: $card-columns-gap;\n\n .card {\n display: inline-block; // Don't let them vertically span multiple columns\n width: 100%; // Don't let their width change\n }\n }\n}\n",".breadcrumb {\n padding: $breadcrumb-padding-y $breadcrumb-padding-x;\n margin-bottom: 1rem;\n list-style: none;\n background-color: $breadcrumb-bg;\n @include border-radius($border-radius);\n @include clearfix;\n}\n\n.breadcrumb-item {\n float: left;\n\n // The separator between breadcrumbs (by default, a forward-slash: \"/\")\n + .breadcrumb-item::before {\n display: inline-block; // Suppress underlining of the separator in modern browsers\n padding-right: $breadcrumb-item-padding;\n padding-left: $breadcrumb-item-padding;\n color: $breadcrumb-divider-color;\n content: \"#{$breadcrumb-divider}\";\n }\n\n // IE9-11 hack to properly handle hyperlink underlines for breadcrumbs built\n // without `<ul>`s. The `::before` pseudo-element generates an element\n // *within* the .breadcrumb-item and thereby inherits the `text-decoration`.\n //\n // To trick IE into suppressing the underline, we give the pseudo-element an\n // underline and then immediately remove it.\n + .breadcrumb-item:hover::before {\n text-decoration: underline;\n }\n + .breadcrumb-item:hover::before {\n text-decoration: none;\n }\n\n &.active {\n color: $breadcrumb-active-color;\n }\n}\n","@mixin clearfix() {\n &::after {\n display: block;\n clear: both;\n content: \"\";\n }\n}\n",".pagination {\n display: flex;\n // 1-2: Disable browser default list styles\n padding-left: 0; // 1\n list-style: none; // 2\n @include border-radius();\n}\n\n.page-item {\n &:first-child {\n .page-link {\n margin-left: 0;\n @include border-left-radius($border-radius);\n }\n }\n &:last-child {\n .page-link {\n @include border-right-radius($border-radius);\n }\n }\n\n &.active .page-link {\n z-index: 2;\n color: $pagination-active-color;\n background-color: $pagination-active-bg;\n border-color: $pagination-active-border-color;\n }\n\n &.disabled .page-link {\n color: $pagination-disabled-color;\n pointer-events: none;\n background-color: $pagination-disabled-bg;\n border-color: $pagination-disabled-border-color;\n }\n}\n\n.page-link {\n position: relative;\n display: block;\n padding: $pagination-padding-y $pagination-padding-x;\n margin-left: -1px;\n line-height: $pagination-line-height;\n color: $pagination-color;\n background-color: $pagination-bg;\n border: $pagination-border-width solid $pagination-border-color;\n\n @include hover-focus {\n color: $pagination-hover-color;\n text-decoration: none;\n background-color: $pagination-hover-bg;\n border-color: $pagination-hover-border-color;\n }\n}\n\n\n//\n// Sizing\n//\n\n.pagination-lg {\n @include pagination-size($pagination-padding-y-lg, $pagination-padding-x-lg, $font-size-lg, $line-height-lg, $border-radius-lg);\n}\n\n.pagination-sm {\n @include pagination-size($pagination-padding-y-sm, $pagination-padding-x-sm, $font-size-sm, $line-height-sm, $border-radius-sm);\n}\n","// Pagination\n\n@mixin pagination-size($padding-y, $padding-x, $font-size, $line-height, $border-radius) {\n .page-link {\n padding: $padding-y $padding-x;\n font-size: $font-size;\n line-height: $line-height;\n }\n\n .page-item {\n &:first-child {\n .page-link {\n @include border-left-radius($border-radius);\n }\n }\n &:last-child {\n .page-link {\n @include border-right-radius($border-radius);\n }\n }\n }\n}\n","// Base class\n//\n// Requires one of the contextual, color modifier classes for `color` and\n// `background-color`.\n\n.badge {\n display: inline-block;\n padding: $badge-padding-y $badge-padding-x;\n font-size: $badge-font-size;\n font-weight: $badge-font-weight;\n line-height: 1;\n color: $badge-color;\n text-align: center;\n white-space: nowrap;\n vertical-align: baseline;\n @include border-radius();\n\n // Empty badges collapse automatically\n &:empty {\n display: none;\n }\n}\n\n// Quick fix for badges in buttons\n.btn .badge {\n position: relative;\n top: -1px;\n}\n\n// Pill badges\n//\n// Make them extra rounded with a modifier to replace v3's badges.\n\n.badge-pill {\n padding-right: $badge-pill-padding-x;\n padding-left: $badge-pill-padding-x;\n @include border-radius($badge-pill-border-radius);\n}\n\n// Colors\n//\n// Contextual variations (linked badges get darker on :hover).\n\n@each $color, $value in $theme-colors {\n .badge-#{$color} {\n @include badge-variant($value);\n }\n}\n","@mixin badge-variant($bg) {\n @include color-yiq($bg);\n background-color: $bg;\n\n &[href] {\n @include hover-focus {\n @include color-yiq($bg);\n text-decoration: none;\n background-color: darken($bg, 10%);\n }\n }\n}\n",".jumbotron {\n padding: $jumbotron-padding ($jumbotron-padding / 2);\n margin-bottom: $jumbotron-padding;\n background-color: $jumbotron-bg;\n @include border-radius($border-radius-lg);\n\n @include media-breakpoint-up(sm) {\n padding: ($jumbotron-padding * 2) $jumbotron-padding;\n }\n}\n\n.jumbotron-fluid {\n padding-right: 0;\n padding-left: 0;\n @include border-radius(0);\n}\n","//\n// Base styles\n//\n\n.alert {\n padding: $alert-padding-y $alert-padding-x;\n margin-bottom: $alert-margin-bottom;\n border: $alert-border-width solid transparent;\n @include border-radius($alert-border-radius);\n}\n\n// Headings for larger alerts\n.alert-heading {\n // Specified to prevent conflicts of changing $headings-color\n color: inherit;\n}\n\n// Provide class for links that match alerts\n.alert-link {\n font-weight: $alert-link-font-weight;\n}\n\n\n// Dismissible alerts\n//\n// Expand the right padding and account for the close button's positioning.\n\n.alert-dismissible {\n // Adjust close link position\n .close {\n position: relative;\n top: -$alert-padding-y;\n right: -$alert-padding-x;\n padding: $alert-padding-y $alert-padding-x;\n color: inherit;\n }\n}\n\n\n// Alternate styles\n//\n// Generate contextual modifier classes for colorizing the alert.\n\n@each $color, $value in $theme-colors {\n .alert-#{$color} {\n @include alert-variant(theme-color-level($color, -10), theme-color-level($color, -9), theme-color-level($color, 6));\n }\n}\n","@mixin alert-variant($background, $border, $color) {\n color: $color;\n background-color: $background;\n border-color: $border;\n\n hr {\n border-top-color: darken($border, 5%);\n }\n\n .alert-link {\n color: darken($color, 10%);\n }\n}\n","@keyframes progress-bar-stripes {\n from { background-position: $progress-height 0; }\n to { background-position: 0 0; }\n}\n\n.progress {\n display: flex;\n overflow: hidden; // force rounded corners by cropping it\n font-size: $progress-font-size;\n line-height: $progress-height;\n text-align: center;\n background-color: $progress-bg;\n @include border-radius($progress-border-radius);\n @include box-shadow($progress-box-shadow);\n}\n\n.progress-bar {\n height: $progress-height;\n line-height: $progress-height;\n color: $progress-bar-color;\n background-color: $progress-bar-bg;\n @include transition($progress-bar-transition);\n}\n\n.progress-bar-striped {\n @include gradient-striped();\n background-size: $progress-height $progress-height;\n}\n\n.progress-bar-animated {\n animation: progress-bar-stripes $progress-bar-animation-timing;\n}\n","// Gradients\n\n// Horizontal gradient, from left to right\n//\n// Creates two color stops, start and end, by specifying a color and position for each color stop.\n@mixin gradient-x($start-color: #555, $end-color: #333, $start-percent: 0%, $end-percent: 100%) {\n background-image: linear-gradient(to right, $start-color $start-percent, $end-color $end-percent);\n background-repeat: repeat-x;\n}\n\n// Vertical gradient, from top to bottom\n//\n// Creates two color stops, start and end, by specifying a color and position for each color stop.\n@mixin gradient-y($start-color: #555, $end-color: #333, $start-percent: 0%, $end-percent: 100%) {\n background-image: linear-gradient(to bottom, $start-color $start-percent, $end-color $end-percent);\n background-repeat: repeat-x;\n}\n\n@mixin gradient-directional($start-color: #555, $end-color: #333, $deg: 45deg) {\n background-image: linear-gradient($deg, $start-color, $end-color);\n background-repeat: repeat-x;\n}\n@mixin gradient-x-three-colors($start-color: #00b3ee, $mid-color: #7a43b6, $color-stop: 50%, $end-color: #c3325f) {\n background-image: linear-gradient(to right, $start-color, $mid-color $color-stop, $end-color);\n background-repeat: no-repeat;\n}\n@mixin gradient-y-three-colors($start-color: #00b3ee, $mid-color: #7a43b6, $color-stop: 50%, $end-color: #c3325f) {\n background-image: linear-gradient($start-color, $mid-color $color-stop, $end-color);\n background-repeat: no-repeat;\n}\n@mixin gradient-radial($inner-color: #555, $outer-color: #333) {\n background-image: radial-gradient(circle, $inner-color, $outer-color);\n background-repeat: no-repeat;\n}\n@mixin gradient-striped($color: rgba(255,255,255,.15), $angle: 45deg) {\n background-image: linear-gradient($angle, $color 25%, transparent 25%, transparent 50%, $color 50%, $color 75%, transparent 75%, transparent);\n}\n",".media {\n display: flex;\n align-items: flex-start;\n}\n\n.media-body {\n flex: 1;\n}\n","// Base class\n//\n// Easily usable on <ul>, <ol>, or <div>.\n\n.list-group {\n display: flex;\n flex-direction: column;\n\n // No need to set list-style: none; since .list-group-item is block level\n padding-left: 0; // reset padding because ul and ol\n margin-bottom: 0;\n}\n\n\n// Interactive list items\n//\n// Use anchor or button elements instead of `li`s or `div`s to create interactive\n// list items. Includes an extra `.active` modifier class for selected items.\n\n.list-group-item-action {\n width: 100%; // For `<button>`s (anchors become 100% by default though)\n color: $list-group-action-color;\n text-align: inherit; // For `<button>`s (anchors inherit)\n\n // Hover state\n @include hover-focus {\n color: $list-group-action-hover-color;\n text-decoration: none;\n background-color: $list-group-hover-bg;\n }\n\n &:active {\n color: $list-group-action-active-color;\n background-color: $list-group-action-active-bg;\n }\n}\n\n\n// Individual list items\n//\n// Use on `li`s or `div`s within the `.list-group` parent.\n\n.list-group-item {\n position: relative;\n display: block;\n padding: $list-group-item-padding-y $list-group-item-padding-x;\n // Place the border on the list items and negative margin up for better styling\n margin-bottom: -$list-group-border-width;\n background-color: $list-group-bg;\n border: $list-group-border-width solid $list-group-border-color;\n\n &:first-child {\n @include border-top-radius($list-group-border-radius);\n }\n\n &:last-child {\n margin-bottom: 0;\n @include border-bottom-radius($list-group-border-radius);\n }\n\n @include hover-focus {\n text-decoration: none;\n }\n\n &.disabled,\n &:disabled {\n color: $list-group-disabled-color;\n background-color: $list-group-disabled-bg;\n }\n\n // Include both here for `<a>`s and `<button>`s\n &.active {\n z-index: 2; // Place active items above their siblings for proper border styling\n color: $list-group-active-color;\n background-color: $list-group-active-bg;\n border-color: $list-group-active-border-color;\n }\n}\n\n\n// Flush list items\n//\n// Remove borders and border-radius to keep list group items edge-to-edge. Most\n// useful within other components (e.g., cards).\n\n.list-group-flush {\n .list-group-item {\n border-right: 0;\n border-left: 0;\n border-radius: 0;\n }\n\n &:first-child {\n .list-group-item:first-child {\n border-top: 0;\n }\n }\n\n &:last-child {\n .list-group-item:last-child {\n border-bottom: 0;\n }\n }\n}\n\n\n// Contextual variants\n//\n// Add modifier classes to change text and background color on individual items.\n// Organizationally, this must come after the `:hover` states.\n\n@each $color, $value in $theme-colors {\n @include list-group-item-variant($color, theme-color-level($color, -9), theme-color-level($color, 6));\n}\n","// List Groups\n\n@mixin list-group-item-variant($state, $background, $color) {\n .list-group-item-#{$state} {\n color: $color;\n background-color: $background;\n }\n\n //scss-lint:disable QualifyingElement\n a.list-group-item-#{$state},\n button.list-group-item-#{$state} {\n color: $color;\n\n @include hover-focus {\n color: $color;\n background-color: darken($background, 5%);\n }\n\n &.active {\n color: #fff;\n background-color: $color;\n border-color: $color;\n }\n }\n // scss-lint:enable QualifyingElement\n}\n",".close {\n float: right;\n font-size: $close-font-size;\n font-weight: $close-font-weight;\n line-height: 1;\n color: $close-color;\n text-shadow: $close-text-shadow;\n opacity: .5;\n\n @include hover-focus {\n color: $close-color;\n text-decoration: none;\n opacity: .75;\n }\n}\n\n// Additional properties for button version\n// iOS requires the button element instead of an anchor tag.\n// If you want the anchor version, it requires `href=\"#\"`.\n// See https://developer.mozilla.org/en-US/docs/Web/Events/click#Safari_Mobile\n\n// scss-lint:disable QualifyingElement\nbutton.close {\n padding: 0;\n background: transparent;\n border: 0;\n -webkit-appearance: none;\n}\n// scss-lint:enable QualifyingElement\n","// .modal-open - body class for killing the scroll\n// .modal - container to scroll within\n// .modal-dialog - positioning shell for the actual modal\n// .modal-content - actual modal w/ bg and corners and stuff\n\n\n// Kill the scroll on the body\n.modal-open {\n overflow: hidden;\n}\n\n// Container that the modal scrolls within\n.modal {\n position: fixed;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: $zindex-modal;\n display: none;\n overflow: hidden;\n // Prevent Chrome on Windows from adding a focus outline. For details, see\n // https://github.com/twbs/bootstrap/pull/10951.\n outline: 0;\n // We deliberately don't use `-webkit-overflow-scrolling: touch;` due to a\n // gnarly iOS Safari bug: https://bugs.webkit.org/show_bug.cgi?id=158342\n // See also https://github.com/twbs/bootstrap/issues/17695\n\n // When fading in the modal, animate it to slide down\n &.fade .modal-dialog {\n @include transition($modal-transition);\n transform: translate(0, -25%);\n }\n &.show .modal-dialog { transform: translate(0, 0); }\n}\n.modal-open .modal {\n overflow-x: hidden;\n overflow-y: auto;\n}\n\n// Shell div to position the modal with bottom padding\n.modal-dialog {\n position: relative;\n width: auto;\n margin: $modal-dialog-margin;\n}\n\n// Actual modal\n.modal-content {\n position: relative;\n display: flex;\n flex-direction: column;\n background-color: $modal-content-bg;\n background-clip: padding-box;\n border: $modal-content-border-width solid $modal-content-border-color;\n @include border-radius($border-radius-lg);\n @include box-shadow($modal-content-box-shadow-xs);\n // Remove focus outline from opened modal\n outline: 0;\n}\n\n// Modal background\n.modal-backdrop {\n position: fixed;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: $zindex-modal-backdrop;\n background-color: $modal-backdrop-bg;\n\n // Fade for backdrop\n &.fade { opacity: 0; }\n &.show { opacity: $modal-backdrop-opacity; }\n}\n\n// Modal header\n// Top section of the modal w/ title and dismiss\n.modal-header {\n display: flex;\n align-items: center; // vertically center it\n justify-content: space-between; // Put modal header elements (title and dismiss) on opposite ends\n padding: $modal-header-padding;\n border-bottom: $modal-header-border-width solid $modal-header-border-color;\n}\n\n// Title text within header\n.modal-title {\n margin-bottom: 0;\n line-height: $modal-title-line-height;\n}\n\n// Modal body\n// Where all modal content resides (sibling of .modal-header and .modal-footer)\n.modal-body {\n position: relative;\n // Enable `flex-grow: 1` so that the body take up as much space as possible\n // when should there be a fixed height on `.modal-dialog`.\n flex: 1 1 auto;\n padding: $modal-inner-padding;\n}\n\n// Footer (for actions)\n.modal-footer {\n display: flex;\n align-items: center; // vertically center\n justify-content: flex-end; // Right align buttons with flex property because text-align doesn't work on flex items\n padding: $modal-inner-padding;\n border-top: $modal-footer-border-width solid $modal-footer-border-color;\n\n // Easily place margin between footer elements\n > :not(:first-child) { margin-left: .25rem; }\n > :not(:last-child) { margin-right: .25rem; }\n}\n\n// Measure scrollbar width for padding body during modal show/hide\n.modal-scrollbar-measure {\n position: absolute;\n top: -9999px;\n width: 50px;\n height: 50px;\n overflow: scroll;\n}\n\n// Scale up the modal\n@include media-breakpoint-up(sm) {\n // Automatically set modal's width for larger viewports\n .modal-dialog {\n max-width: $modal-md;\n margin: $modal-dialog-margin-y-sm-up auto;\n }\n\n .modal-content {\n @include box-shadow($modal-content-box-shadow-sm-up);\n }\n\n .modal-sm { max-width: $modal-sm; }\n}\n\n@include media-breakpoint-up(lg) {\n .modal-lg { max-width: $modal-lg; }\n}\n","// Base class\n.tooltip {\n position: absolute;\n z-index: $zindex-tooltip;\n display: block;\n margin: $tooltip-margin;\n // Our parent element can be arbitrary since tooltips are by default inserted as a sibling of their target element.\n // So reset our font and text properties to avoid inheriting weird values.\n @include reset-text();\n font-size: $font-size-sm;\n // Allow breaking very long words so they don't overflow the tooltip's bounds\n word-wrap: break-word;\n opacity: 0;\n\n &.show { opacity: $tooltip-opacity; }\n\n .arrow {\n position: absolute;\n display: block;\n width: $tooltip-arrow-width;\n height: $tooltip-arrow-height;\n }\n\n &.bs-tooltip-top {\n padding: $tooltip-arrow-width 0;\n .arrow {\n bottom: 0;\n }\n\n .arrow::before {\n margin-left: -($tooltip-arrow-width - 2);\n content: \"\";\n border-width: $tooltip-arrow-width $tooltip-arrow-width 0;\n border-top-color: $tooltip-arrow-color;\n }\n }\n &.bs-tooltip-right {\n padding: 0 $tooltip-arrow-width;\n .arrow {\n left: 0;\n }\n\n .arrow::before {\n margin-top: -($tooltip-arrow-width - 2);\n content: \"\";\n border-width: $tooltip-arrow-width $tooltip-arrow-width $tooltip-arrow-width 0;\n border-right-color: $tooltip-arrow-color;\n }\n }\n &.bs-tooltip-bottom {\n padding: $tooltip-arrow-width 0;\n .arrow {\n top: 0;\n }\n\n .arrow::before {\n margin-left: -($tooltip-arrow-width - 2);\n content: \"\";\n border-width: 0 $tooltip-arrow-width $tooltip-arrow-width;\n border-bottom-color: $tooltip-arrow-color;\n }\n }\n &.bs-tooltip-left {\n padding: 0 $tooltip-arrow-width;\n .arrow {\n right: 0;\n }\n\n .arrow::before {\n right: 0;\n margin-top: -($tooltip-arrow-width - 2);\n content: \"\";\n border-width: $tooltip-arrow-width 0 $tooltip-arrow-width $tooltip-arrow-width;\n border-left-color: $tooltip-arrow-color;\n }\n }\n &.bs-tooltip-auto {\n &[x-placement^=\"top\"] {\n @extend .bs-tooltip-top;\n }\n &[x-placement^=\"right\"] {\n @extend .bs-tooltip-right;\n }\n &[x-placement^=\"bottom\"] {\n @extend .bs-tooltip-bottom;\n }\n &[x-placement^=\"left\"] {\n @extend .bs-tooltip-left;\n }\n }\n\n .arrow::before {\n position: absolute;\n border-color: transparent;\n border-style: solid;\n }\n}\n\n// Wrapper for the tooltip content\n.tooltip-inner {\n max-width: $tooltip-max-width;\n padding: $tooltip-padding-y $tooltip-padding-x;\n color: $tooltip-color;\n text-align: center;\n background-color: $tooltip-bg;\n @include border-radius($border-radius);\n}\n","// scss-lint:disable DuplicateProperty\n@mixin reset-text {\n font-family: $font-family-base;\n // We deliberately do NOT reset font-size or word-wrap.\n font-style: normal;\n font-weight: $font-weight-normal;\n line-height: $line-height-base;\n text-align: left; // Fallback for where `start` is not supported\n text-align: start;\n text-decoration: none;\n text-shadow: none;\n text-transform: none;\n letter-spacing: normal;\n word-break: normal;\n word-spacing: normal;\n white-space: normal;\n line-break: auto;\n}\n",".popover {\n position: absolute;\n top: 0;\n left: 0;\n z-index: $zindex-popover;\n display: block;\n max-width: $popover-max-width;\n padding: $popover-inner-padding;\n // Our parent element can be arbitrary since tooltips are by default inserted as a sibling of their target element.\n // So reset our font and text properties to avoid inheriting weird values.\n @include reset-text();\n font-size: $font-size-sm;\n // Allow breaking very long words so they don't overflow the popover's bounds\n word-wrap: break-word;\n background-color: $popover-bg;\n background-clip: padding-box;\n border: $popover-border-width solid $popover-border-color;\n @include border-radius($border-radius-lg);\n @include box-shadow($popover-box-shadow);\n\n // Arrows\n //\n // .arrow is outer, .arrow::after is inner\n\n .arrow {\n position: absolute;\n display: block;\n width: $popover-arrow-width;\n height: $popover-arrow-height;\n }\n\n .arrow::before,\n .arrow::after {\n position: absolute;\n display: block;\n border-color: transparent;\n border-style: solid;\n }\n\n .arrow::before {\n content: \"\";\n border-width: $popover-arrow-outer-width;\n }\n .arrow::after {\n content: \"\";\n border-width: $popover-arrow-outer-width;\n }\n\n // Popover directions\n\n &.bs-popover-top {\n margin-bottom: $popover-arrow-width;\n\n .arrow {\n bottom: 0;\n }\n\n .arrow::before,\n .arrow::after {\n border-bottom-width: 0;\n }\n\n .arrow::before {\n bottom: -$popover-arrow-outer-width;\n margin-left: -($popover-arrow-outer-width - 5);\n border-top-color: $popover-arrow-outer-color;\n }\n\n .arrow::after {\n bottom: -($popover-arrow-outer-width - 1);\n margin-left: -($popover-arrow-outer-width - 5);\n border-top-color: $popover-arrow-color;\n }\n }\n\n &.bs-popover-right {\n margin-left: $popover-arrow-width;\n\n .arrow {\n left: 0;\n }\n\n .arrow::before,\n .arrow::after {\n margin-top: -($popover-arrow-outer-width - 3);\n border-left-width: 0;\n }\n\n .arrow::before {\n left: -$popover-arrow-outer-width;\n border-right-color: $popover-arrow-outer-color;\n }\n\n .arrow::after {\n left: -($popover-arrow-outer-width - 1);\n border-right-color: $popover-arrow-color;\n }\n }\n\n &.bs-popover-bottom {\n margin-top: $popover-arrow-width;\n\n .arrow {\n top: 0;\n }\n\n .arrow::before,\n .arrow::after {\n margin-left: -($popover-arrow-width - 3);\n border-top-width: 0;\n }\n\n .arrow::before {\n top: -$popover-arrow-outer-width;\n border-bottom-color: $popover-arrow-outer-color;\n }\n\n .arrow::after {\n top: -($popover-arrow-outer-width - 1);\n border-bottom-color: $popover-arrow-color;\n }\n\n // This will remove the popover-header's border just below the arrow\n .popover-header::before {\n position: absolute;\n top: 0;\n left: 50%;\n display: block;\n width: 20px;\n margin-left: -10px;\n content: \"\";\n border-bottom: 1px solid $popover-header-bg;\n }\n }\n\n &.bs-popover-left {\n margin-right: $popover-arrow-width;\n\n .arrow {\n right: 0;\n }\n\n .arrow::before,\n .arrow::after {\n margin-top: -($popover-arrow-outer-width - 3);\n border-right-width: 0;\n }\n\n .arrow::before {\n right: -$popover-arrow-outer-width;\n border-left-color: $popover-arrow-outer-color;\n }\n\n .arrow::after {\n right: -($popover-arrow-outer-width - 1);\n border-left-color: $popover-arrow-color;\n }\n }\n &.bs-popover-auto {\n &[x-placement^=\"top\"] {\n @extend .bs-popover-top;\n }\n &[x-placement^=\"right\"] {\n @extend .bs-popover-right;\n }\n &[x-placement^=\"bottom\"] {\n @extend .bs-popover-bottom;\n }\n &[x-placement^=\"left\"] {\n @extend .bs-popover-left;\n }\n }\n}\n\n\n// Offset the popover to account for the popover arrow\n.popover-header {\n padding: $popover-header-padding-y $popover-header-padding-x;\n margin-bottom: 0; // Reset the default from Reboot\n font-size: $font-size-base;\n color: $popover-header-color;\n background-color: $popover-header-bg;\n border-bottom: $popover-border-width solid darken($popover-header-bg, 5%);\n $offset-border-width: calc(#{$border-radius-lg} - #{$popover-border-width});\n @include border-top-radius($offset-border-width);\n\n &:empty {\n display: none;\n }\n}\n\n.popover-body {\n padding: $popover-body-padding-y $popover-body-padding-x;\n color: $popover-body-color;\n}\n","// Wrapper for the slide container and indicators\n.carousel {\n position: relative;\n}\n\n.carousel-inner {\n position: relative;\n width: 100%;\n overflow: hidden;\n}\n\n.carousel-item {\n position: relative;\n display: none;\n align-items: center;\n width: 100%;\n @include transition($carousel-transition);\n backface-visibility: hidden;\n perspective: 1000px;\n}\n\n.carousel-item.active,\n.carousel-item-next,\n.carousel-item-prev {\n display: block;\n}\n\n.carousel-item-next,\n.carousel-item-prev {\n position: absolute;\n top: 0;\n}\n\n// CSS3 transforms when supported by the browser\n.carousel-item-next.carousel-item-left,\n.carousel-item-prev.carousel-item-right {\n transform: translateX(0);\n\n @supports (transform-style: preserve-3d) {\n transform: translate3d(0, 0, 0);\n }\n}\n\n.carousel-item-next,\n.active.carousel-item-right {\n transform: translateX(100%);\n\n @supports (transform-style: preserve-3d) {\n transform: translate3d(100%, 0, 0);\n }\n}\n\n.carousel-item-prev,\n.active.carousel-item-left {\n transform: translateX(-100%);\n\n @supports (transform-style: preserve-3d) {\n transform: translate3d(-100%, 0, 0);\n }\n}\n\n\n//\n// Left/right controls for nav\n//\n\n.carousel-control-prev,\n.carousel-control-next {\n position: absolute;\n top: 0;\n bottom: 0;\n // Use flex for alignment (1-3)\n display: flex; // 1. allow flex styles\n align-items: center; // 2. vertically center contents\n justify-content: center; // 3. horizontally center contents\n width: $carousel-control-width;\n color: $carousel-control-color;\n text-align: center;\n opacity: $carousel-control-opacity;\n // We can't have a transition here because WebKit cancels the carousel\n // animation if you trip this while in the middle of another animation.\n\n // Hover/focus state\n @include hover-focus {\n color: $carousel-control-color;\n text-decoration: none;\n outline: 0;\n opacity: .9;\n }\n}\n.carousel-control-prev {\n left: 0;\n}\n.carousel-control-next {\n right: 0;\n}\n\n// Icons for within\n.carousel-control-prev-icon,\n.carousel-control-next-icon {\n display: inline-block;\n width: $carousel-control-icon-width;\n height: $carousel-control-icon-width;\n background: transparent no-repeat center center;\n background-size: 100% 100%;\n}\n.carousel-control-prev-icon {\n background-image: $carousel-control-prev-icon-bg;\n}\n.carousel-control-next-icon {\n background-image: $carousel-control-next-icon-bg;\n}\n\n\n// Optional indicator pips\n//\n// Add an ordered list with the following class and add a list item for each\n// slide your carousel holds.\n\n.carousel-indicators {\n position: absolute;\n right: 0;\n bottom: 10px;\n left: 0;\n z-index: 15;\n display: flex;\n justify-content: center;\n padding-left: 0; // override <ol> default\n // Use the .carousel-control's width as margin so we don't overlay those\n margin-right: $carousel-control-width;\n margin-left: $carousel-control-width;\n list-style: none;\n\n li {\n position: relative;\n flex: 0 1 auto;\n width: $carousel-indicator-width;\n height: $carousel-indicator-height;\n margin-right: $carousel-indicator-spacer;\n margin-left: $carousel-indicator-spacer;\n text-indent: -999px;\n background-color: rgba($carousel-indicator-active-bg, .5);\n\n // Use pseudo classes to increase the hit area by 10px on top and bottom.\n &::before {\n position: absolute;\n top: -10px;\n left: 0;\n display: inline-block;\n width: 100%;\n height: 10px;\n content: \"\";\n }\n &::after {\n position: absolute;\n bottom: -10px;\n left: 0;\n display: inline-block;\n width: 100%;\n height: 10px;\n content: \"\";\n }\n }\n\n .active {\n background-color: $carousel-indicator-active-bg;\n }\n}\n\n\n// Optional captions\n//\n//\n\n.carousel-caption {\n position: absolute;\n right: ((100% - $carousel-caption-width) / 2);\n bottom: 20px;\n left: ((100% - $carousel-caption-width) / 2);\n z-index: 10;\n padding-top: 20px;\n padding-bottom: 20px;\n color: $carousel-caption-color;\n text-align: center;\n}\n",".align-baseline { vertical-align: baseline !important; } // Browser default\n.align-top { vertical-align: top !important; }\n.align-middle { vertical-align: middle !important; }\n.align-bottom { vertical-align: bottom !important; }\n.align-text-bottom { vertical-align: text-bottom !important; }\n.align-text-top { vertical-align: text-top !important; }\n","// Contextual backgrounds\n\n@mixin bg-variant($parent, $color) {\n #{$parent} {\n background-color: $color !important;\n }\n a#{$parent} {\n @include hover-focus {\n background-color: darken($color, 10%) !important;\n }\n }\n}\n","@each $color, $value in $theme-colors {\n @include bg-variant('.bg-#{$color}', $value);\n}\n\n.bg-white { background-color: $white !important; }\n.bg-transparent { background-color: transparent !important; }\n","//\n// Border\n//\n\n.border { border: 1px solid $gray-200 !important; }\n.border-0 { border: 0 !important; }\n.border-top-0 { border-top: 0 !important; }\n.border-right-0 { border-right: 0 !important; }\n.border-bottom-0 { border-bottom: 0 !important; }\n.border-left-0 { border-left: 0 !important; }\n\n@each $color, $value in $theme-colors {\n .border-#{$color} {\n border-color: $value !important;\n }\n}\n\n.border-white {\n border-color: $white !important;\n}\n\n//\n// Border-radius\n//\n\n.rounded {\n border-radius: $border-radius !important;\n}\n.rounded-top {\n border-top-left-radius: $border-radius !important;\n border-top-right-radius: $border-radius !important;\n}\n.rounded-right {\n border-top-right-radius: $border-radius !important;\n border-bottom-right-radius: $border-radius !important;\n}\n.rounded-bottom {\n border-bottom-right-radius: $border-radius !important;\n border-bottom-left-radius: $border-radius !important;\n}\n.rounded-left {\n border-top-left-radius: $border-radius !important;\n border-bottom-left-radius: $border-radius !important;\n}\n\n.rounded-circle {\n border-radius: 50%;\n}\n\n.rounded-0 {\n border-radius: 0;\n}\n","//\n// Utilities for common `display` values\n//\n\n@each $breakpoint in map-keys($grid-breakpoints) {\n @include media-breakpoint-up($breakpoint) {\n $infix: breakpoint-infix($breakpoint, $grid-breakpoints);\n\n .d#{$infix}-none { display: none !important; }\n .d#{$infix}-inline { display: inline !important; }\n .d#{$infix}-inline-block { display: inline-block !important; }\n .d#{$infix}-block { display: block !important; }\n .d#{$infix}-table { display: table !important; }\n .d#{$infix}-table-cell { display: table-cell !important; }\n .d#{$infix}-flex { display: flex !important; }\n .d#{$infix}-inline-flex { display: inline-flex !important; }\n }\n}\n\n\n//\n// Utilities for toggling `display` in print\n//\n\n.d-print-block {\n display: none !important;\n\n @media print {\n display: block !important;\n }\n}\n\n.d-print-inline {\n display: none !important;\n\n @media print {\n display: inline !important;\n }\n}\n\n.d-print-inline-block {\n display: none !important;\n\n @media print {\n display: inline-block !important;\n }\n}\n\n.d-print-none {\n @media print {\n display: none !important;\n }\n}\n","// Credit: Nicolas Gallagher and SUIT CSS.\n\n.embed-responsive {\n position: relative;\n display: block;\n width: 100%;\n padding: 0;\n overflow: hidden;\n\n &::before {\n display: block;\n content: \"\";\n }\n\n .embed-responsive-item,\n iframe,\n embed,\n object,\n video {\n position: absolute;\n top: 0;\n bottom: 0;\n left: 0;\n width: 100%;\n height: 100%;\n border: 0;\n }\n}\n\n.embed-responsive-21by9 {\n &::before {\n padding-top: percentage(9 / 21);\n }\n}\n\n.embed-responsive-16by9 {\n &::before {\n padding-top: percentage(9 / 16);\n }\n}\n\n.embed-responsive-4by3 {\n &::before {\n padding-top: percentage(3 / 4);\n }\n}\n\n.embed-responsive-1by1 {\n &::before {\n padding-top: percentage(1 / 1);\n }\n}\n","// Flex variation\n//\n// Custom styles for additional flex alignment options.\n\n@each $breakpoint in map-keys($grid-breakpoints) {\n @include media-breakpoint-up($breakpoint) {\n $infix: breakpoint-infix($breakpoint, $grid-breakpoints);\n\n .flex#{$infix}-row { flex-direction: row !important; }\n .flex#{$infix}-column { flex-direction: column !important; }\n .flex#{$infix}-row-reverse { flex-direction: row-reverse !important; }\n .flex#{$infix}-column-reverse { flex-direction: column-reverse !important; }\n\n .flex#{$infix}-wrap { flex-wrap: wrap !important; }\n .flex#{$infix}-nowrap { flex-wrap: nowrap !important; }\n .flex#{$infix}-wrap-reverse { flex-wrap: wrap-reverse !important; }\n\n .justify-content#{$infix}-start { justify-content: flex-start !important; }\n .justify-content#{$infix}-end { justify-content: flex-end !important; }\n .justify-content#{$infix}-center { justify-content: center !important; }\n .justify-content#{$infix}-between { justify-content: space-between !important; }\n .justify-content#{$infix}-around { justify-content: space-around !important; }\n\n .align-items#{$infix}-start { align-items: flex-start !important; }\n .align-items#{$infix}-end { align-items: flex-end !important; }\n .align-items#{$infix}-center { align-items: center !important; }\n .align-items#{$infix}-baseline { align-items: baseline !important; }\n .align-items#{$infix}-stretch { align-items: stretch !important; }\n\n .align-content#{$infix}-start { align-content: flex-start !important; }\n .align-content#{$infix}-end { align-content: flex-end !important; }\n .align-content#{$infix}-center { align-content: center !important; }\n .align-content#{$infix}-between { align-content: space-between !important; }\n .align-content#{$infix}-around { align-content: space-around !important; }\n .align-content#{$infix}-stretch { align-content: stretch !important; }\n\n .align-self#{$infix}-auto { align-self: auto !important; }\n .align-self#{$infix}-start { align-self: flex-start !important; }\n .align-self#{$infix}-end { align-self: flex-end !important; }\n .align-self#{$infix}-center { align-self: center !important; }\n .align-self#{$infix}-baseline { align-self: baseline !important; }\n .align-self#{$infix}-stretch { align-self: stretch !important; }\n }\n}\n","@each $breakpoint in map-keys($grid-breakpoints) {\n @include media-breakpoint-up($breakpoint) {\n $infix: breakpoint-infix($breakpoint, $grid-breakpoints);\n\n .float#{$infix}-left { @include float-left; }\n .float#{$infix}-right { @include float-right; }\n .float#{$infix}-none { @include float-none; }\n }\n}\n","@mixin float-left {\n float: left !important;\n}\n@mixin float-right {\n float: right !important;\n}\n@mixin float-none {\n float: none !important;\n}\n","// Positioning\n\n.fixed-top {\n position: fixed;\n top: 0;\n right: 0;\n left: 0;\n z-index: $zindex-fixed;\n}\n\n.fixed-bottom {\n position: fixed;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: $zindex-fixed;\n}\n\n.sticky-top {\n @supports (position: sticky) {\n position: sticky;\n top: 0;\n z-index: $zindex-sticky;\n }\n}\n","//\n// Screenreaders\n//\n\n.sr-only {\n @include sr-only();\n}\n\n.sr-only-focusable {\n @include sr-only-focusable();\n}\n","// Only display content to screen readers\n//\n// See: http://a11yproject.com/posts/how-to-hide-content\n// See: http://hugogiraudel.com/2016/10/13/css-hide-and-seek/\n\n@mixin sr-only {\n position: absolute;\n width: 1px;\n height: 1px;\n padding: 0;\n overflow: hidden;\n clip: rect(0,0,0,0);\n white-space: nowrap;\n clip-path: inset(50%);\n border: 0;\n}\n\n// Use in conjunction with .sr-only to only display content when it's focused.\n//\n// Useful for \"Skip to main content\" links; see https://www.w3.org/TR/2013/NOTE-WCAG20-TECHS-20130905/G1\n//\n// Credit: HTML5 Boilerplate\n\n@mixin sr-only-focusable {\n &:active,\n &:focus {\n position: static;\n width: auto;\n height: auto;\n overflow: visible;\n clip: auto;\n white-space: normal;\n clip-path: none;\n }\n}\n","// Width and height\n\n@each $prop, $abbrev in (width: w, height: h) {\n @each $size, $length in $sizes {\n .#{$abbrev}-#{$size} { #{$prop}: $length !important; }\n }\n}\n\n.mw-100 { max-width: 100% !important; }\n.mh-100 { max-height: 100% !important; }\n","// Margin and Padding\n\n@each $breakpoint in map-keys($grid-breakpoints) {\n @include media-breakpoint-up($breakpoint) {\n $infix: breakpoint-infix($breakpoint, $grid-breakpoints);\n\n @each $prop, $abbrev in (margin: m, padding: p) {\n @each $size, $length in $spacers {\n\n .#{$abbrev}#{$infix}-#{$size} { #{$prop}: $length !important; }\n .#{$abbrev}t#{$infix}-#{$size} { #{$prop}-top: $length !important; }\n .#{$abbrev}r#{$infix}-#{$size} { #{$prop}-right: $length !important; }\n .#{$abbrev}b#{$infix}-#{$size} { #{$prop}-bottom: $length !important; }\n .#{$abbrev}l#{$infix}-#{$size} { #{$prop}-left: $length !important; }\n .#{$abbrev}x#{$infix}-#{$size} {\n #{$prop}-right: $length !important;\n #{$prop}-left: $length !important;\n }\n .#{$abbrev}y#{$infix}-#{$size} {\n #{$prop}-top: $length !important;\n #{$prop}-bottom: $length !important;\n }\n }\n }\n\n // Some special margin utils\n .m#{$infix}-auto { margin: auto !important; }\n .mt#{$infix}-auto { margin-top: auto !important; }\n .mr#{$infix}-auto { margin-right: auto !important; }\n .mb#{$infix}-auto { margin-bottom: auto !important; }\n .ml#{$infix}-auto { margin-left: auto !important; }\n .mx#{$infix}-auto {\n margin-right: auto !important;\n margin-left: auto !important;\n }\n .my#{$infix}-auto {\n margin-top: auto !important;\n margin-bottom: auto !important;\n }\n }\n}\n","//\n// Text\n//\n\n// Alignment\n\n.text-justify { text-align: justify !important; }\n.text-nowrap { white-space: nowrap !important; }\n.text-truncate { @include text-truncate; }\n\n// Responsive alignment\n\n@each $breakpoint in map-keys($grid-breakpoints) {\n @include media-breakpoint-up($breakpoint) {\n $infix: breakpoint-infix($breakpoint, $grid-breakpoints);\n\n .text#{$infix}-left { text-align: left !important; }\n .text#{$infix}-right { text-align: right !important; }\n .text#{$infix}-center { text-align: center !important; }\n }\n}\n\n// Transformation\n\n.text-lowercase { text-transform: lowercase !important; }\n.text-uppercase { text-transform: uppercase !important; }\n.text-capitalize { text-transform: capitalize !important; }\n\n// Weight and italics\n\n.font-weight-normal { font-weight: $font-weight-normal; }\n.font-weight-bold { font-weight: $font-weight-bold; }\n.font-italic { font-style: italic; }\n\n// Contextual colors\n\n.text-white { color: #fff !important; }\n\n@each $color, $value in $theme-colors {\n @include text-emphasis-variant('.text-#{$color}', $value);\n}\n\n.text-muted { color: $text-muted !important; }\n\n// Misc\n\n.text-hide {\n @include text-hide();\n}\n","// Text truncate\n// Requires inline-block or block for proper styling\n\n@mixin text-truncate() {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n","// Typography\n\n@mixin text-emphasis-variant($parent, $color) {\n #{$parent} {\n color: $color !important;\n }\n a#{$parent} {\n @include hover-focus {\n color: darken($color, 10%) !important;\n }\n }\n}\n","// CSS image replacement\n@mixin text-hide() {\n font: 0/0 a;\n color: transparent;\n text-shadow: none;\n background-color: transparent;\n border: 0;\n}\n","//\n// Visibility utilities\n//\n\n.visible {\n @include invisible(visible);\n}\n\n.invisible {\n @include invisible(hidden);\n}\n","// Visibility\n\n@mixin invisible($visibility) {\n visibility: $visibility !important;\n}\n"]} \ No newline at end of file
diff --git a/library/bootstrap/css/bootstrap.min.css b/library/bootstrap/css/bootstrap.min.css
index d7780d69e..622b5a94d 100644
--- a/library/bootstrap/css/bootstrap.min.css
+++ b/library/bootstrap/css/bootstrap.min.css
@@ -1,6 +1,7 @@
/*!
- * Bootstrap v4.0.0-alpha.6 (https://getbootstrap.com)
+ * Bootstrap v4.0.0-beta (https://getbootstrap.com)
* Copyright 2011-2017 The Bootstrap Authors
* Copyright 2011-2017 Twitter, Inc.
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
- */@media print{*,::after,::before,blockquote::first-letter,blockquote::first-line,div::first-letter,div::first-line,li::first-letter,li::first-line,p::first-letter,p::first-line{text-shadow:none!important;-webkit-box-shadow:none!important;box-shadow:none!important}a,a:visited{text-decoration:underline}abbr[title]::after{content:" (" attr(title) ")"}pre{white-space:pre-wrap!important}blockquote,pre{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}img,tr{page-break-inside:avoid}h2,h3,p{orphans:3;widows:3}h2,h3{page-break-after:avoid}.navbar{display:none}.badge{border:1px solid #000}.table{border-collapse:collapse!important}.table td,.table th{background-color:#fff!important}.table-bordered td,.table-bordered th{border:1px solid #ddd!important}}html{-webkit-box-sizing:border-box;box-sizing:border-box;font-family:sans-serif;line-height:1.15;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%;-ms-overflow-style:scrollbar;-webkit-tap-highlight-color:transparent}*,::after,::before{-webkit-box-sizing:inherit;box-sizing:inherit}@-ms-viewport{width:device-width}body{margin:0;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif;font-size:1rem;font-weight:400;line-height:1.5;color:#292b2c;background-color:#fff}[tabindex="-1"]:focus{outline:0!important}hr{-webkit-box-sizing:content-box;box-sizing:content-box;height:0;overflow:visible}h1,h2,h3,h4,h5,h6{margin-top:0;margin-bottom:.5rem}p{margin-top:0;margin-bottom:1rem}abbr[data-original-title],abbr[title]{text-decoration:underline;text-decoration:underline dotted;cursor:help;border-bottom:0}address{margin-bottom:1rem;font-style:normal;line-height:inherit}dl,ol,ul{margin-top:0;margin-bottom:1rem}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}dt{font-weight:700}dd{margin-bottom:.5rem;margin-left:0}blockquote{margin:0 0 1rem}dfn{font-style:italic}b,strong{font-weight:bolder}small{font-size:80%}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}a{color:#0275d8;text-decoration:none;background-color:transparent;-webkit-text-decoration-skip:objects}a:hover{color:#014c8c;text-decoration:underline}a:not([href]):not([tabindex]){color:inherit;text-decoration:none}a:not([href]):not([tabindex]):focus,a:not([href]):not([tabindex]):hover{color:inherit;text-decoration:none}a:not([href]):not([tabindex]):focus{outline:0}code,kbd,pre,samp{font-family:monospace,monospace;font-size:1em}pre{margin-top:0;margin-bottom:1rem;overflow:auto}figure{margin:0 0 1rem}img{vertical-align:middle;border-style:none}svg:not(:root){overflow:hidden}[role=button],a,area,button,input,label,select,summary,textarea{-ms-touch-action:manipulation;touch-action:manipulation}table{border-collapse:collapse}caption{padding-top:.75rem;padding-bottom:.75rem;color:#636c72;text-align:left;caption-side:bottom}th{text-align:left}label{display:inline-block;margin-bottom:.5rem}button:focus{outline:1px dotted;outline:5px auto -webkit-focus-ring-color}button,input,optgroup,select,textarea{margin:0;font-family:inherit;font-size:inherit;line-height:inherit}button,input{overflow:visible}button,select{text-transform:none}[type=reset],[type=submit],button,html [type=button]{-webkit-appearance:button}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{padding:0;border-style:none}input[type=checkbox],input[type=radio]{-webkit-box-sizing:border-box;box-sizing:border-box;padding:0}input[type=date],input[type=datetime-local],input[type=month],input[type=time]{-webkit-appearance:listbox}textarea{overflow:auto;resize:vertical}fieldset{min-width:0;padding:0;margin:0;border:0}legend{display:block;width:100%;max-width:100%;padding:0;margin-bottom:.5rem;font-size:1.5rem;line-height:inherit;color:inherit;white-space:normal}progress{vertical-align:baseline}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{outline-offset:-2px;-webkit-appearance:none}[type=search]::-webkit-search-cancel-button,[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{font:inherit;-webkit-appearance:button}output{display:inline-block}summary{display:list-item}template{display:none}[hidden]{display:none!important}.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{margin-bottom:.5rem;font-family:inherit;font-weight:500;line-height:1.1;color:inherit}.h1,h1{font-size:2.5rem}.h2,h2{font-size:2rem}.h3,h3{font-size:1.75rem}.h4,h4{font-size:1.5rem}.h5,h5{font-size:1.25rem}.h6,h6{font-size:1rem}.lead{font-size:1.25rem;font-weight:300}.display-1{font-size:6rem;font-weight:300;line-height:1.1}.display-2{font-size:5.5rem;font-weight:300;line-height:1.1}.display-3{font-size:4.5rem;font-weight:300;line-height:1.1}.display-4{font-size:3.5rem;font-weight:300;line-height:1.1}hr{margin-top:1rem;margin-bottom:1rem;border:0;border-top:1px solid rgba(0,0,0,.1)}.small,small{font-size:80%;font-weight:400}.mark,mark{padding:.2em;background-color:#fcf8e3}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;list-style:none}.list-inline-item{display:inline-block}.list-inline-item:not(:last-child){margin-right:5px}.initialism{font-size:90%;text-transform:uppercase}.blockquote{padding:.5rem 1rem;margin-bottom:1rem;font-size:1.25rem;border-left:.25rem solid #eceeef}.blockquote-footer{display:block;font-size:80%;color:#636c72}.blockquote-footer::before{content:"\2014 \00A0"}.blockquote-reverse{padding-right:1rem;padding-left:0;text-align:right;border-right:.25rem solid #eceeef;border-left:0}.blockquote-reverse .blockquote-footer::before{content:""}.blockquote-reverse .blockquote-footer::after{content:"\00A0 \2014"}.img-fluid{max-width:100%;height:auto}.img-thumbnail{padding:.25rem;background-color:#fff;border:1px solid #ddd;border-radius:.25rem;-webkit-transition:all .2s ease-in-out;-o-transition:all .2s ease-in-out;transition:all .2s ease-in-out;max-width:100%;height:auto}.figure{display:inline-block}.figure-img{margin-bottom:.5rem;line-height:1}.figure-caption{font-size:90%;color:#636c72}code,kbd,pre,samp{font-family:Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace}code{padding:.2rem .4rem;font-size:90%;color:#bd4147;background-color:#f7f7f9;border-radius:.25rem}a>code{padding:0;color:inherit;background-color:inherit}kbd{padding:.2rem .4rem;font-size:90%;color:#fff;background-color:#292b2c;border-radius:.2rem}kbd kbd{padding:0;font-size:100%;font-weight:700}pre{display:block;margin-top:0;margin-bottom:1rem;font-size:90%;color:#292b2c}pre code{padding:0;font-size:inherit;color:inherit;background-color:transparent;border-radius:0}.pre-scrollable{max-height:340px;overflow-y:scroll}.container{margin-right:auto;margin-left:auto;padding-right:15px;padding-left:15px}@media (min-width:576px){.container{padding-right:15px;padding-left:15px}}@media (min-width:768px){.container{padding-right:15px;padding-left:15px}}@media (min-width:992px){.container{padding-right:15px;padding-left:15px}}@media (min-width:1200px){.container{padding-right:15px;padding-left:15px}}@media (min-width:576px){.container{width:540px;max-width:100%}}@media (min-width:768px){.container{width:720px;max-width:100%}}@media (min-width:992px){.container{width:960px;max-width:100%}}@media (min-width:1200px){.container{width:1140px;max-width:100%}}.container-fluid{width:100%;margin-right:auto;margin-left:auto;padding-right:15px;padding-left:15px}@media (min-width:576px){.container-fluid{padding-right:15px;padding-left:15px}}@media (min-width:768px){.container-fluid{padding-right:15px;padding-left:15px}}@media (min-width:992px){.container-fluid{padding-right:15px;padding-left:15px}}@media (min-width:1200px){.container-fluid{padding-right:15px;padding-left:15px}}.row{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;margin-right:-15px;margin-left:-15px}@media (min-width:576px){.row{margin-right:-15px;margin-left:-15px}}@media (min-width:768px){.row{margin-right:-15px;margin-left:-15px}}@media (min-width:992px){.row{margin-right:-15px;margin-left:-15px}}@media (min-width:1200px){.row{margin-right:-15px;margin-left:-15px}}.no-gutters{margin-right:0;margin-left:0}.no-gutters>.col,.no-gutters>[class*=col-]{padding-right:0;padding-left:0}.col,.col-1,.col-10,.col-11,.col-12,.col-2,.col-3,.col-4,.col-5,.col-6,.col-7,.col-8,.col-9,.col-auto,.col-lg,.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.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-auto,.col-md,.col-md-1,.col-md-10,.col-md-11,.col-md-12,.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-auto,.col-sm,.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.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-auto,.col-xl,.col-xl-1,.col-xl-10,.col-xl-11,.col-xl-12,.col-xl-2,.col-xl-3,.col-xl-4,.col-xl-5,.col-xl-6,.col-xl-7,.col-xl-8,.col-xl-9,.col-xl-auto{position:relative;width:100%;min-height:1px;padding-right:15px;padding-left:15px}@media (min-width:576px){.col,.col-1,.col-10,.col-11,.col-12,.col-2,.col-3,.col-4,.col-5,.col-6,.col-7,.col-8,.col-9,.col-auto,.col-lg,.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.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-auto,.col-md,.col-md-1,.col-md-10,.col-md-11,.col-md-12,.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-auto,.col-sm,.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.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-auto,.col-xl,.col-xl-1,.col-xl-10,.col-xl-11,.col-xl-12,.col-xl-2,.col-xl-3,.col-xl-4,.col-xl-5,.col-xl-6,.col-xl-7,.col-xl-8,.col-xl-9,.col-xl-auto{padding-right:15px;padding-left:15px}}@media (min-width:768px){.col,.col-1,.col-10,.col-11,.col-12,.col-2,.col-3,.col-4,.col-5,.col-6,.col-7,.col-8,.col-9,.col-auto,.col-lg,.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.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-auto,.col-md,.col-md-1,.col-md-10,.col-md-11,.col-md-12,.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-auto,.col-sm,.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.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-auto,.col-xl,.col-xl-1,.col-xl-10,.col-xl-11,.col-xl-12,.col-xl-2,.col-xl-3,.col-xl-4,.col-xl-5,.col-xl-6,.col-xl-7,.col-xl-8,.col-xl-9,.col-xl-auto{padding-right:15px;padding-left:15px}}@media (min-width:992px){.col,.col-1,.col-10,.col-11,.col-12,.col-2,.col-3,.col-4,.col-5,.col-6,.col-7,.col-8,.col-9,.col-auto,.col-lg,.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.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-auto,.col-md,.col-md-1,.col-md-10,.col-md-11,.col-md-12,.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-auto,.col-sm,.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.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-auto,.col-xl,.col-xl-1,.col-xl-10,.col-xl-11,.col-xl-12,.col-xl-2,.col-xl-3,.col-xl-4,.col-xl-5,.col-xl-6,.col-xl-7,.col-xl-8,.col-xl-9,.col-xl-auto{padding-right:15px;padding-left:15px}}@media (min-width:1200px){.col,.col-1,.col-10,.col-11,.col-12,.col-2,.col-3,.col-4,.col-5,.col-6,.col-7,.col-8,.col-9,.col-auto,.col-lg,.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.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-auto,.col-md,.col-md-1,.col-md-10,.col-md-11,.col-md-12,.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-auto,.col-sm,.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.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-auto,.col-xl,.col-xl-1,.col-xl-10,.col-xl-11,.col-xl-12,.col-xl-2,.col-xl-3,.col-xl-4,.col-xl-5,.col-xl-6,.col-xl-7,.col-xl-8,.col-xl-9,.col-xl-auto{padding-right:15px;padding-left:15px}}.col{-webkit-flex-basis:0;-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-auto{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;width:auto}.col-1{width:8.333333%}.col-2{width:16.666667%}.col-3{width:25%}.col-4{width:33.333333%}.col-5{width:41.666667%}.col-6{width:50%}.col-7{width:58.333333%}.col-8{width:66.666667%}.col-9{width:75%}.col-10{width:83.333333%}.col-11{width:91.666667%}.col-12{width:100%}.pull-0{right:auto}.pull-1{right:8.333333%}.pull-2{right:16.666667%}.pull-3{right:25%}.pull-4{right:33.333333%}.pull-5{right:41.666667%}.pull-6{right:50%}.pull-7{right:58.333333%}.pull-8{right:66.666667%}.pull-9{right:75%}.pull-10{right:83.333333%}.pull-11{right:91.666667%}.pull-12{right:100%}.push-0{left:auto}.push-1{left:8.333333%}.push-2{left:16.666667%}.push-3{left:25%}.push-4{left:33.333333%}.push-5{left:41.666667%}.push-6{left:50%}.push-7{left:58.333333%}.push-8{left:66.666667%}.push-9{left:75%}.push-10{left:83.333333%}.push-11{left:91.666667%}.push-12{left:100%}.offset-1{margin-left:8.333333%}.offset-2{margin-left:16.666667%}.offset-3{margin-left:25%}.offset-4{margin-left:33.333333%}.offset-5{margin-left:41.666667%}.offset-6{margin-left:50%}.offset-7{margin-left:58.333333%}.offset-8{margin-left:66.666667%}.offset-9{margin-left:75%}.offset-10{margin-left:83.333333%}.offset-11{margin-left:91.666667%}@media (min-width:576px){.col-sm{-webkit-flex-basis:0;-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-sm-auto{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;width:auto}.col-sm-1{width:8.333333%}.col-sm-2{width:16.666667%}.col-sm-3{width:25%}.col-sm-4{width:33.333333%}.col-sm-5{width:41.666667%}.col-sm-6{width:50%}.col-sm-7{width:58.333333%}.col-sm-8{width:66.666667%}.col-sm-9{width:75%}.col-sm-10{width:83.333333%}.col-sm-11{width:91.666667%}.col-sm-12{width:100%}.pull-sm-0{right:auto}.pull-sm-1{right:8.333333%}.pull-sm-2{right:16.666667%}.pull-sm-3{right:25%}.pull-sm-4{right:33.333333%}.pull-sm-5{right:41.666667%}.pull-sm-6{right:50%}.pull-sm-7{right:58.333333%}.pull-sm-8{right:66.666667%}.pull-sm-9{right:75%}.pull-sm-10{right:83.333333%}.pull-sm-11{right:91.666667%}.pull-sm-12{right:100%}.push-sm-0{left:auto}.push-sm-1{left:8.333333%}.push-sm-2{left:16.666667%}.push-sm-3{left:25%}.push-sm-4{left:33.333333%}.push-sm-5{left:41.666667%}.push-sm-6{left:50%}.push-sm-7{left:58.333333%}.push-sm-8{left:66.666667%}.push-sm-9{left:75%}.push-sm-10{left:83.333333%}.push-sm-11{left:91.666667%}.push-sm-12{left:100%}.offset-sm-0{margin-left:0}.offset-sm-1{margin-left:8.333333%}.offset-sm-2{margin-left:16.666667%}.offset-sm-3{margin-left:25%}.offset-sm-4{margin-left:33.333333%}.offset-sm-5{margin-left:41.666667%}.offset-sm-6{margin-left:50%}.offset-sm-7{margin-left:58.333333%}.offset-sm-8{margin-left:66.666667%}.offset-sm-9{margin-left:75%}.offset-sm-10{margin-left:83.333333%}.offset-sm-11{margin-left:91.666667%}}@media (min-width:768px){.col-md{-webkit-flex-basis:0;-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-md-auto{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;width:auto}.col-md-1{width:8.333333%}.col-md-2{width:16.666667%}.col-md-3{width:25%}.col-md-4{width:33.333333%}.col-md-5{width:41.666667%}.col-md-6{width:50%}.col-md-7{width:58.333333%}.col-md-8{width:66.666667%}.col-md-9{width:75%}.col-md-10{width:83.333333%}.col-md-11{width:91.666667%}.col-md-12{width:100%}.pull-md-0{right:auto}.pull-md-1{right:8.333333%}.pull-md-2{right:16.666667%}.pull-md-3{right:25%}.pull-md-4{right:33.333333%}.pull-md-5{right:41.666667%}.pull-md-6{right:50%}.pull-md-7{right:58.333333%}.pull-md-8{right:66.666667%}.pull-md-9{right:75%}.pull-md-10{right:83.333333%}.pull-md-11{right:91.666667%}.pull-md-12{right:100%}.push-md-0{left:auto}.push-md-1{left:8.333333%}.push-md-2{left:16.666667%}.push-md-3{left:25%}.push-md-4{left:33.333333%}.push-md-5{left:41.666667%}.push-md-6{left:50%}.push-md-7{left:58.333333%}.push-md-8{left:66.666667%}.push-md-9{left:75%}.push-md-10{left:83.333333%}.push-md-11{left:91.666667%}.push-md-12{left:100%}.offset-md-0{margin-left:0}.offset-md-1{margin-left:8.333333%}.offset-md-2{margin-left:16.666667%}.offset-md-3{margin-left:25%}.offset-md-4{margin-left:33.333333%}.offset-md-5{margin-left:41.666667%}.offset-md-6{margin-left:50%}.offset-md-7{margin-left:58.333333%}.offset-md-8{margin-left:66.666667%}.offset-md-9{margin-left:75%}.offset-md-10{margin-left:83.333333%}.offset-md-11{margin-left:91.666667%}}@media (min-width:992px){.col-lg{-webkit-flex-basis:0;-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-lg-auto{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;width:auto}.col-lg-1{width:8.333333%}.col-lg-2{width:16.666667%}.col-lg-3{width:25%}.col-lg-4{width:33.333333%}.col-lg-5{width:41.666667%}.col-lg-6{width:50%}.col-lg-7{width:58.333333%}.col-lg-8{width:66.666667%}.col-lg-9{width:75%}.col-lg-10{width:83.333333%}.col-lg-11{width:91.666667%}.col-lg-12{width:100%}.pull-lg-0{right:auto}.pull-lg-1{right:8.333333%}.pull-lg-2{right:16.666667%}.pull-lg-3{right:25%}.pull-lg-4{right:33.333333%}.pull-lg-5{right:41.666667%}.pull-lg-6{right:50%}.pull-lg-7{right:58.333333%}.pull-lg-8{right:66.666667%}.pull-lg-9{right:75%}.pull-lg-10{right:83.333333%}.pull-lg-11{right:91.666667%}.pull-lg-12{right:100%}.push-lg-0{left:auto}.push-lg-1{left:8.333333%}.push-lg-2{left:16.666667%}.push-lg-3{left:25%}.push-lg-4{left:33.333333%}.push-lg-5{left:41.666667%}.push-lg-6{left:50%}.push-lg-7{left:58.333333%}.push-lg-8{left:66.666667%}.push-lg-9{left:75%}.push-lg-10{left:83.333333%}.push-lg-11{left:91.666667%}.push-lg-12{left:100%}.offset-lg-0{margin-left:0}.offset-lg-1{margin-left:8.333333%}.offset-lg-2{margin-left:16.666667%}.offset-lg-3{margin-left:25%}.offset-lg-4{margin-left:33.333333%}.offset-lg-5{margin-left:41.666667%}.offset-lg-6{margin-left:50%}.offset-lg-7{margin-left:58.333333%}.offset-lg-8{margin-left:66.666667%}.offset-lg-9{margin-left:75%}.offset-lg-10{margin-left:83.333333%}.offset-lg-11{margin-left:91.666667%}}@media (min-width:1200px){.col-xl{-webkit-flex-basis:0;-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-xl-auto{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;width:auto}.col-xl-1{width:8.333333%}.col-xl-2{width:16.666667%}.col-xl-3{width:25%}.col-xl-4{width:33.333333%}.col-xl-5{width:41.666667%}.col-xl-6{width:50%}.col-xl-7{width:58.333333%}.col-xl-8{width:66.666667%}.col-xl-9{width:75%}.col-xl-10{width:83.333333%}.col-xl-11{width:91.666667%}.col-xl-12{width:100%}.pull-xl-0{right:auto}.pull-xl-1{right:8.333333%}.pull-xl-2{right:16.666667%}.pull-xl-3{right:25%}.pull-xl-4{right:33.333333%}.pull-xl-5{right:41.666667%}.pull-xl-6{right:50%}.pull-xl-7{right:58.333333%}.pull-xl-8{right:66.666667%}.pull-xl-9{right:75%}.pull-xl-10{right:83.333333%}.pull-xl-11{right:91.666667%}.pull-xl-12{right:100%}.push-xl-0{left:auto}.push-xl-1{left:8.333333%}.push-xl-2{left:16.666667%}.push-xl-3{left:25%}.push-xl-4{left:33.333333%}.push-xl-5{left:41.666667%}.push-xl-6{left:50%}.push-xl-7{left:58.333333%}.push-xl-8{left:66.666667%}.push-xl-9{left:75%}.push-xl-10{left:83.333333%}.push-xl-11{left:91.666667%}.push-xl-12{left:100%}.offset-xl-0{margin-left:0}.offset-xl-1{margin-left:8.333333%}.offset-xl-2{margin-left:16.666667%}.offset-xl-3{margin-left:25%}.offset-xl-4{margin-left:33.333333%}.offset-xl-5{margin-left:41.666667%}.offset-xl-6{margin-left:50%}.offset-xl-7{margin-left:58.333333%}.offset-xl-8{margin-left:66.666667%}.offset-xl-9{margin-left:75%}.offset-xl-10{margin-left:83.333333%}.offset-xl-11{margin-left:91.666667%}}.table{width:100%;max-width:100%;margin-bottom:1rem;background-color:transparent}.table td,.table th{padding:.75rem;vertical-align:top;border-top:1px solid #eceeef}.table thead th{vertical-align:bottom;border-bottom:2px solid #eceeef}.table tbody+tbody{border-top:2px solid #eceeef}.table .table{background-color:#fff}.table-sm td,.table-sm th{padding:.3rem}.table-bordered{border:1px solid #eceeef}.table-bordered td,.table-bordered th{border:1px solid #eceeef}.table-bordered thead td,.table-bordered thead th{border-bottom-width:2px}.table-striped tbody tr:nth-of-type(odd){background-color:rgba(0,0,0,.05)}.table-hover tbody tr:hover{background-color:rgba(0,0,0,.075)}.table-active,.table-active>td,.table-active>th{background-color:rgba(0,0,0,.075)}.table-hover .table-active:hover{background-color:rgba(0,0,0,.075)}.table-hover .table-active:hover>td,.table-hover .table-active:hover>th{background-color:rgba(0,0,0,.075)}.table-success,.table-success>td,.table-success>th{background-color:#dff0d8}.table-hover .table-success:hover{background-color:#d0e9c6}.table-hover .table-success:hover>td,.table-hover .table-success:hover>th{background-color:#d0e9c6}.table-info,.table-info>td,.table-info>th{background-color:#d9edf7}.table-hover .table-info:hover{background-color:#c4e3f3}.table-hover .table-info:hover>td,.table-hover .table-info:hover>th{background-color:#c4e3f3}.table-warning,.table-warning>td,.table-warning>th{background-color:#fcf8e3}.table-hover .table-warning:hover{background-color:#faf2cc}.table-hover .table-warning:hover>td,.table-hover .table-warning:hover>th{background-color:#faf2cc}.table-danger,.table-danger>td,.table-danger>th{background-color:#f2dede}.table-hover .table-danger:hover{background-color:#ebcccc}.table-hover .table-danger:hover>td,.table-hover .table-danger:hover>th{background-color:#ebcccc}.thead-inverse th{color:#fff;background-color:#292b2c}.thead-default th{color:#464a4c;background-color:#eceeef}.table-inverse{color:#fff;background-color:#292b2c}.table-inverse td,.table-inverse th,.table-inverse thead th{border-color:#3b3e40}.table-inverse.table-bordered{border:0}.table-inverse.table-striped tbody tr:nth-of-type(odd){background-color:rgba(255,255,255,.05)}.table-inverse.table-hover tbody tr:hover{background-color:rgba(255,255,255,.075)}@media (max-width:991px){.table-responsive{display:block;width:100%;overflow-x:auto;-ms-overflow-style:-ms-autohiding-scrollbar}.table-responsive.table-bordered{border:0}}.form-control{display:block;width:100%;padding:.5rem 1rem;font-size:1rem;line-height:1.25;color:#464a4c;background-color:#fff;background-image:none;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid rgba(0,0,0,.15);border-radius:.25rem;-webkit-transition:border-color ease-in-out .15s,-webkit-box-shadow ease-in-out .15s;transition:border-color ease-in-out .15s,-webkit-box-shadow ease-in-out .15s;-o-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;transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s,-webkit-box-shadow ease-in-out .15s}.form-control::-ms-expand{background-color:transparent;border:0}.form-control:focus{color:#464a4c;background-color:#fff;border-color:#5cb3fd;outline:0}.form-control::-webkit-input-placeholder{color:#636c72;opacity:1}.form-control::-moz-placeholder{color:#636c72;opacity:1}.form-control:-ms-input-placeholder{color:#636c72;opacity:1}.form-control::placeholder{color:#636c72;opacity:1}.form-control:disabled,.form-control[readonly]{background-color:#eceeef;opacity:1}select.form-control:not([size]):not([multiple]){height:calc(2.25rem + 2px)}select.form-control:focus::-ms-value{color:#464a4c;background-color:#fff}.form-control-file,.form-control-range{display:block}.col-form-label{padding-top:calc(.5rem - 1px * 2);padding-bottom:calc(.5rem - 1px * 2);margin-bottom:0}.col-form-label-lg{padding-top:calc(.5rem - 1px * 2);padding-bottom:calc(.5rem - 1px * 2);font-size:1.25rem}.col-form-label-sm{padding-top:calc(.25rem - 1px * 2);padding-bottom:calc(.25rem - 1px * 2);font-size:.875rem}.col-form-legend{padding-top:.5rem;padding-bottom:.5rem;margin-bottom:0;font-size:1rem}.form-control-static{padding-top:.5rem;padding-bottom:.5rem;margin-bottom:0;line-height:1.25;border:solid transparent;border-width:1px 0}.form-control-static.form-control-lg,.form-control-static.form-control-sm,.input-group-lg>.form-control-static.form-control,.input-group-lg>.form-control-static.input-group-addon,.input-group-lg>.input-group-btn>.form-control-static.btn,.input-group-sm>.form-control-static.form-control,.input-group-sm>.form-control-static.input-group-addon,.input-group-sm>.input-group-btn>.form-control-static.btn{padding-right:0;padding-left:0}.form-control-sm,.input-group-sm>.form-control,.input-group-sm>.input-group-addon,.input-group-sm>.input-group-btn>.btn{padding:.25rem .5rem;font-size:.875rem;line-height:1.5;border-radius:.2rem}.input-group-sm>.input-group-btn>select.btn:not([size]):not([multiple]),.input-group-sm>select.form-control:not([size]):not([multiple]),.input-group-sm>select.input-group-addon:not([size]):not([multiple]),select.form-control-sm:not([size]):not([multiple]){height:calc(1.8125rem + 2px)}.form-control-lg,.input-group-lg>.form-control,.input-group-lg>.input-group-addon,.input-group-lg>.input-group-btn>.btn{padding:.5rem 1rem;font-size:1.25rem;line-height:1.5;border-radius:.3rem}.input-group-lg>.input-group-btn>select.btn:not([size]):not([multiple]),.input-group-lg>select.form-control:not([size]):not([multiple]),.input-group-lg>select.input-group-addon:not([size]):not([multiple]),select.form-control-lg:not([size]):not([multiple]){height:calc(2.875rem + 2px)}.form-group{margin-bottom:1rem}.form-text{display:block;margin-top:.25rem}.form-check{position:relative;display:block;margin-bottom:.5rem}.form-check.disabled .form-check-label{color:#636c72}.form-check-label{padding-left:1.25rem;margin-bottom:0}.form-check-input{position:absolute;margin-top:.25rem;margin-left:-1.25rem}.form-check-input:only-child{position:static}.form-check-inline{display:inline-block}.form-check-inline .form-check-label{vertical-align:middle}.form-check-inline+.form-check-inline{margin-left:.75rem}.form-control-feedback{margin-top:.25rem}.form-control-danger,.form-control-success,.form-control-warning{padding-right:3rem;background-repeat:no-repeat;background-position:center right .5625rem;-webkit-background-size:1.125rem 1.125rem;background-size:1.125rem 1.125rem}.has-success .col-form-label,.has-success .custom-control,.has-success .form-check-label,.has-success .form-control-feedback,.has-success .form-control-label{color:#5cb85c}.has-success .custom-file-control,.has-success .custom-select,.has-success .form-control{border-color:#5cb85c}.has-success .input-group-addon{color:#5cb85c;background-color:#eaf6ea;border-color:#5cb85c}.has-success .form-control-success{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3E%3Cpath fill='%235cb85c' d='M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3E%3C/svg%3E")}.has-warning .col-form-label,.has-warning .custom-control,.has-warning .form-check-label,.has-warning .form-control-feedback,.has-warning .form-control-label{color:#f0ad4e}.has-warning .custom-file-control,.has-warning .custom-select,.has-warning .form-control{border-color:#f0ad4e}.has-warning .input-group-addon{color:#f0ad4e;background-color:#fff;border-color:#f0ad4e}.has-warning .form-control-warning{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3E%3Cpath fill='%23f0ad4e' d='M4.4 5.324h-.8v-2.46h.8zm0 1.42h-.8V5.89h.8zM3.76.63L.04 7.075c-.115.2.016.425.26.426h7.397c.242 0 .372-.226.258-.426C6.726 4.924 5.47 2.79 4.253.63c-.113-.174-.39-.174-.494 0z'/%3E%3C/svg%3E")}.has-danger .col-form-label,.has-danger .custom-control,.has-danger .form-check-label,.has-danger .form-control-feedback,.has-danger .form-control-label{color:#d9534f}.has-danger .custom-file-control,.has-danger .custom-select,.has-danger .form-control{border-color:#d9534f}.has-danger .input-group-addon{color:#d9534f;background-color:#fdf7f7;border-color:#d9534f}.has-danger .form-control-danger{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23d9534f' viewBox='-2 -2 7 7'%3E%3Cpath stroke='%23d9534f' d='M0 0l3 3m0-3L0 3'/%3E%3Ccircle r='.5'/%3E%3Ccircle cx='3' r='.5'/%3E%3Ccircle cy='3' r='.5'/%3E%3Ccircle cx='3' cy='3' r='.5'/%3E%3C/svg%3E")}.form-inline{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-flow:row wrap;-ms-flex-flow:row wrap;flex-flow:row wrap;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center}.form-inline .form-check{width:100%}@media (min-width:576px){.form-inline label{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;margin-bottom:0}.form-inline .form-group{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-flow:row wrap;-ms-flex-flow:row wrap;flex-flow:row wrap;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;margin-bottom:0}.form-inline .form-control{display:inline-block;width:auto;vertical-align:middle}.form-inline .form-control-static{display:inline-block}.form-inline .input-group{width:auto}.form-inline .form-control-label{margin-bottom:0;vertical-align:middle}.form-inline .form-check{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;width:auto;margin-top:0;margin-bottom:0}.form-inline .form-check-label{padding-left:0}.form-inline .form-check-input{position:relative;margin-top:0;margin-right:.25rem;margin-left:0}.form-inline .custom-control{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;padding-left:0}.form-inline .custom-control-indicator{position:static;display:inline-block;margin-right:.25rem;vertical-align:text-bottom}.form-inline .has-feedback .form-control-feedback{top:0}}.btn{display:inline-block;font-weight:400;text-align:center;white-space:nowrap;vertical-align:middle;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;border:1px solid transparent;padding:.5rem 1rem;font-size:1rem;line-height:1.25;border-radius:.25rem;-webkit-transition:all .2s ease-in-out;-o-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.btn:focus,.btn:hover{text-decoration:none}.btn.focus,.btn:focus{outline:0;-webkit-box-shadow:0 0 0 2px rgba(2,117,216,.25);box-shadow:0 0 0 2px rgba(2,117,216,.25)}.btn.disabled,.btn:disabled{opacity:.65}.btn.active,.btn:active{background-image:none}a.btn.disabled,fieldset[disabled] a.btn{pointer-events:none}.btn-primary{color:#fff;background-color:#0275d8;border-color:#0275d8}.btn-primary:hover{color:#fff;background-color:#025aa5;border-color:#01549b}.btn-primary.focus,.btn-primary:focus{-webkit-box-shadow:0 0 0 2px rgba(2,117,216,.5);box-shadow:0 0 0 2px rgba(2,117,216,.5)}.btn-primary.disabled,.btn-primary:disabled{background-color:#0275d8;border-color:#0275d8}.btn-primary.active,.btn-primary:active,.show>.btn-primary.dropdown-toggle{color:#fff;background-color:#025aa5;background-image:none;border-color:#01549b}.btn-secondary{color:#292b2c;background-color:#fff;border-color:#ccc}.btn-secondary:hover{color:#292b2c;background-color:#e6e6e6;border-color:#adadad}.btn-secondary.focus,.btn-secondary:focus{-webkit-box-shadow:0 0 0 2px rgba(204,204,204,.5);box-shadow:0 0 0 2px rgba(204,204,204,.5)}.btn-secondary.disabled,.btn-secondary:disabled{background-color:#fff;border-color:#ccc}.btn-secondary.active,.btn-secondary:active,.show>.btn-secondary.dropdown-toggle{color:#292b2c;background-color:#e6e6e6;background-image:none;border-color:#adadad}.btn-info{color:#fff;background-color:#5bc0de;border-color:#5bc0de}.btn-info:hover{color:#fff;background-color:#31b0d5;border-color:#2aabd2}.btn-info.focus,.btn-info:focus{-webkit-box-shadow:0 0 0 2px rgba(91,192,222,.5);box-shadow:0 0 0 2px rgba(91,192,222,.5)}.btn-info.disabled,.btn-info:disabled{background-color:#5bc0de;border-color:#5bc0de}.btn-info.active,.btn-info:active,.show>.btn-info.dropdown-toggle{color:#fff;background-color:#31b0d5;background-image:none;border-color:#2aabd2}.btn-success{color:#fff;background-color:#5cb85c;border-color:#5cb85c}.btn-success:hover{color:#fff;background-color:#449d44;border-color:#419641}.btn-success.focus,.btn-success:focus{-webkit-box-shadow:0 0 0 2px rgba(92,184,92,.5);box-shadow:0 0 0 2px rgba(92,184,92,.5)}.btn-success.disabled,.btn-success:disabled{background-color:#5cb85c;border-color:#5cb85c}.btn-success.active,.btn-success:active,.show>.btn-success.dropdown-toggle{color:#fff;background-color:#449d44;background-image:none;border-color:#419641}.btn-warning{color:#fff;background-color:#f0ad4e;border-color:#f0ad4e}.btn-warning:hover{color:#fff;background-color:#ec971f;border-color:#eb9316}.btn-warning.focus,.btn-warning:focus{-webkit-box-shadow:0 0 0 2px rgba(240,173,78,.5);box-shadow:0 0 0 2px rgba(240,173,78,.5)}.btn-warning.disabled,.btn-warning:disabled{background-color:#f0ad4e;border-color:#f0ad4e}.btn-warning.active,.btn-warning:active,.show>.btn-warning.dropdown-toggle{color:#fff;background-color:#ec971f;background-image:none;border-color:#eb9316}.btn-danger{color:#fff;background-color:#d9534f;border-color:#d9534f}.btn-danger:hover{color:#fff;background-color:#c9302c;border-color:#c12e2a}.btn-danger.focus,.btn-danger:focus{-webkit-box-shadow:0 0 0 2px rgba(217,83,79,.5);box-shadow:0 0 0 2px rgba(217,83,79,.5)}.btn-danger.disabled,.btn-danger:disabled{background-color:#d9534f;border-color:#d9534f}.btn-danger.active,.btn-danger:active,.show>.btn-danger.dropdown-toggle{color:#fff;background-color:#c9302c;background-image:none;border-color:#c12e2a}.btn-outline-primary{color:#0275d8;background-color:transparent;background-image:none;border-color:#0275d8}.btn-outline-primary:hover{color:#fff;background-color:#0275d8;border-color:#0275d8}.btn-outline-primary.focus,.btn-outline-primary:focus{-webkit-box-shadow:0 0 0 2px rgba(2,117,216,.5);box-shadow:0 0 0 2px rgba(2,117,216,.5)}.btn-outline-primary.disabled,.btn-outline-primary:disabled{color:#0275d8;background-color:transparent}.btn-outline-primary.active,.btn-outline-primary:active,.show>.btn-outline-primary.dropdown-toggle{color:#fff;background-color:#0275d8;border-color:#0275d8}.btn-outline-secondary{color:#ccc;background-color:transparent;background-image:none;border-color:#ccc}.btn-outline-secondary:hover{color:#292b2c;background-color:#ccc;border-color:#ccc}.btn-outline-secondary.focus,.btn-outline-secondary:focus{-webkit-box-shadow:0 0 0 2px rgba(204,204,204,.5);box-shadow:0 0 0 2px rgba(204,204,204,.5)}.btn-outline-secondary.disabled,.btn-outline-secondary:disabled{color:#ccc;background-color:transparent}.btn-outline-secondary.active,.btn-outline-secondary:active,.show>.btn-outline-secondary.dropdown-toggle{color:#292b2c;background-color:#ccc;border-color:#ccc}.btn-outline-info{color:#5bc0de;background-color:transparent;background-image:none;border-color:#5bc0de}.btn-outline-info:hover{color:#fff;background-color:#5bc0de;border-color:#5bc0de}.btn-outline-info.focus,.btn-outline-info:focus{-webkit-box-shadow:0 0 0 2px rgba(91,192,222,.5);box-shadow:0 0 0 2px rgba(91,192,222,.5)}.btn-outline-info.disabled,.btn-outline-info:disabled{color:#5bc0de;background-color:transparent}.btn-outline-info.active,.btn-outline-info:active,.show>.btn-outline-info.dropdown-toggle{color:#fff;background-color:#5bc0de;border-color:#5bc0de}.btn-outline-success{color:#5cb85c;background-color:transparent;background-image:none;border-color:#5cb85c}.btn-outline-success:hover{color:#fff;background-color:#5cb85c;border-color:#5cb85c}.btn-outline-success.focus,.btn-outline-success:focus{-webkit-box-shadow:0 0 0 2px rgba(92,184,92,.5);box-shadow:0 0 0 2px rgba(92,184,92,.5)}.btn-outline-success.disabled,.btn-outline-success:disabled{color:#5cb85c;background-color:transparent}.btn-outline-success.active,.btn-outline-success:active,.show>.btn-outline-success.dropdown-toggle{color:#fff;background-color:#5cb85c;border-color:#5cb85c}.btn-outline-warning{color:#f0ad4e;background-color:transparent;background-image:none;border-color:#f0ad4e}.btn-outline-warning:hover{color:#fff;background-color:#f0ad4e;border-color:#f0ad4e}.btn-outline-warning.focus,.btn-outline-warning:focus{-webkit-box-shadow:0 0 0 2px rgba(240,173,78,.5);box-shadow:0 0 0 2px rgba(240,173,78,.5)}.btn-outline-warning.disabled,.btn-outline-warning:disabled{color:#f0ad4e;background-color:transparent}.btn-outline-warning.active,.btn-outline-warning:active,.show>.btn-outline-warning.dropdown-toggle{color:#fff;background-color:#f0ad4e;border-color:#f0ad4e}.btn-outline-danger{color:#d9534f;background-color:transparent;background-image:none;border-color:#d9534f}.btn-outline-danger:hover{color:#fff;background-color:#d9534f;border-color:#d9534f}.btn-outline-danger.focus,.btn-outline-danger:focus{-webkit-box-shadow:0 0 0 2px rgba(217,83,79,.5);box-shadow:0 0 0 2px rgba(217,83,79,.5)}.btn-outline-danger.disabled,.btn-outline-danger:disabled{color:#d9534f;background-color:transparent}.btn-outline-danger.active,.btn-outline-danger:active,.show>.btn-outline-danger.dropdown-toggle{color:#fff;background-color:#d9534f;border-color:#d9534f}.btn-link{font-weight:400;color:#0275d8;border-radius:0}.btn-link,.btn-link.active,.btn-link:active,.btn-link:disabled{background-color:transparent}.btn-link,.btn-link:active,.btn-link:focus{border-color:transparent}.btn-link:hover{border-color:transparent}.btn-link:focus,.btn-link:hover{color:#014c8c;text-decoration:underline;background-color:transparent}.btn-link:disabled{color:#636c72}.btn-link:disabled:focus,.btn-link:disabled:hover{text-decoration:none}.btn-group-lg>.btn,.btn-lg{padding:.5rem 1rem;font-size:1.25rem;line-height:1.5;border-radius:.3rem}.btn-group-sm>.btn,.btn-sm{padding:.25rem .5rem;font-size:.875rem;line-height:1.5;border-radius:.2rem}.btn-block{display:block;width:100%}.btn-block+.btn-block{margin-top:.5rem}input[type=button].btn-block,input[type=reset].btn-block,input[type=submit].btn-block{width:100%}.fade{opacity:0;-webkit-transition:opacity .15s linear;-o-transition:opacity .15s linear;transition:opacity .15s linear}.fade.show{opacity:1}.collapse{display:none}.collapse.show{display:block}tr.collapse.show{display:table-row}tbody.collapse.show{display:table-row-group}.collapsing{position:relative;height:0;overflow:hidden;-webkit-transition:height .35s ease;-o-transition:height .35s ease;transition:height .35s ease}.dropdown,.dropup{position:relative}.dropdown-toggle::after{display:inline-block;width:0;height:0;margin-left:.3em;vertical-align:middle;content:"";border-top:.3em solid;border-right:.3em solid transparent;border-left:.3em solid transparent}.dropdown-toggle:empty::after{margin-left:0}.dropup .dropdown-toggle::after{border-top:0;border-bottom:.3em solid}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:10rem;padding:.5rem 0;margin:.125rem 0 0;font-size:1rem;color:#292b2c;text-align:left;list-style:none;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid rgba(0,0,0,.15);border-radius:.25rem}.dropdown-divider{height:0;margin:.5rem 0;overflow:hidden;border-top:1px solid #eceeef}.dropdown-item{display:block;width:100%;padding:.25rem 1.5rem;clear:both;font-weight:400;color:#292b2c;text-align:inherit;white-space:nowrap;background:0 0;border:0}.dropdown-item:focus,.dropdown-item:hover{color:#1d1e1f;text-decoration:none;background-color:#f7f7f9}.dropdown-item.active,.dropdown-item:active{color:#fff;text-decoration:none;background-color:#0275d8}.dropdown-item.disabled,.dropdown-item:disabled{color:#636c72;background-color:transparent}.show>.dropdown-menu{display:block}.show>a{outline:0}.dropdown-menu-right{right:0;left:auto}.dropdown-menu-left{right:auto;left:0}.dropdown-header{display:block;padding:.5rem 1.5rem;margin-bottom:0;font-size:.875rem;color:#636c72;white-space:nowrap}.dropup .dropdown-menu{top:auto;bottom:100%;margin-bottom:.125rem}.btn-group,.btn-group-vertical{position:relative;display:-webkit-inline-box;display:-webkit-inline-flex;display:-ms-inline-flexbox;display:inline-flex;vertical-align:middle}.btn-group-vertical>.btn,.btn-group>.btn{position:relative;-webkit-box-flex:0;-webkit-flex:0 1 auto;-ms-flex:0 1 auto;flex:0 1 auto;margin-bottom:0}.btn-group-vertical>.btn:hover,.btn-group>.btn:hover{z-index:2}.btn-group-vertical>.btn.active,.btn-group-vertical>.btn:active,.btn-group-vertical>.btn:focus,.btn-group>.btn.active,.btn-group>.btn:active,.btn-group>.btn:focus{z-index:2}.btn-group .btn+.btn,.btn-group .btn+.btn-group,.btn-group .btn-group+.btn,.btn-group .btn-group+.btn-group,.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-left:-1px}.btn-toolbar{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-box-pack:start;-webkit-justify-content:flex-start;-ms-flex-pack:start;justify-content:flex-start}.btn-toolbar .input-group{width:auto}.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-top-left-radius:0;border-bottom-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:not(:last-child)>.btn:last-child,.btn-group>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn-group:last-child:not(:first-child)>.btn:first-child{border-top-left-radius:0;border-bottom-left-radius:0}.btn+.dropdown-toggle-split{padding-right:.75rem;padding-left:.75rem}.btn+.dropdown-toggle-split::after{margin-left:0}.btn-group-sm>.btn+.dropdown-toggle-split,.btn-sm+.dropdown-toggle-split{padding-right:.375rem;padding-left:.375rem}.btn-group-lg>.btn+.dropdown-toggle-split,.btn-lg+.dropdown-toggle-split{padding-right:.75rem;padding-left:.75rem}.btn-group-vertical{display:-webkit-inline-box;display:-webkit-inline-flex;display:-ms-inline-flexbox;display:inline-flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-box-align:start;-webkit-align-items:flex-start;-ms-flex-align:start;align-items:flex-start;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center}.btn-group-vertical .btn,.btn-group-vertical .btn-group{width:100%}.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-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn:last-child:not(:first-child){border-top-left-radius:0;border-top-right-radius:0}.btn-group-vertical>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group-vertical>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group-vertical>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn-group:last-child:not(:first-child)>.btn:first-child{border-top-left-radius:0;border-top-right-radius:0}[data-toggle=buttons]>.btn input[type=checkbox],[data-toggle=buttons]>.btn input[type=radio],[data-toggle=buttons]>.btn-group>.btn input[type=checkbox],[data-toggle=buttons]>.btn-group>.btn input[type=radio]{position:absolute;clip:rect(0,0,0,0);pointer-events:none}.input-group{position:relative;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;width:100%}.input-group .form-control{position:relative;z-index:2;-webkit-box-flex:1;-webkit-flex:1 1 auto;-ms-flex:1 1 auto;flex:1 1 auto;width:1%;margin-bottom:0}.input-group .form-control:active,.input-group .form-control:focus,.input-group .form-control:hover{z-index:3}.input-group .form-control,.input-group-addon,.input-group-btn{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center}.input-group .form-control:not(:first-child):not(:last-child),.input-group-addon:not(:first-child):not(:last-child),.input-group-btn:not(:first-child):not(:last-child){border-radius:0}.input-group-addon,.input-group-btn{white-space:nowrap;vertical-align:middle}.input-group-addon{padding:.5rem 1rem;margin-bottom:0;font-size:1rem;font-weight:400;line-height:1.25;color:#464a4c;text-align:center;background-color:#eceeef;border:1px solid rgba(0,0,0,.15);border-radius:.25rem}.input-group-addon.form-control-sm,.input-group-sm>.input-group-addon,.input-group-sm>.input-group-btn>.input-group-addon.btn{padding:.25rem .5rem;font-size:.875rem;border-radius:.2rem}.input-group-addon.form-control-lg,.input-group-lg>.input-group-addon,.input-group-lg>.input-group-btn>.input-group-addon.btn{padding:.5rem 1rem;font-size:1.25rem;border-radius:.3rem}.input-group-addon input[type=checkbox],.input-group-addon input[type=radio]{margin-top:0}.input-group .form-control:not(:last-child),.input-group-addon:not(:last-child),.input-group-btn:not(:first-child)>.btn-group:not(:last-child)>.btn,.input-group-btn:not(:first-child)>.btn:not(:last-child):not(.dropdown-toggle),.input-group-btn:not(:last-child)>.btn,.input-group-btn:not(:last-child)>.btn-group>.btn,.input-group-btn:not(:last-child)>.dropdown-toggle{border-top-right-radius:0;border-bottom-right-radius:0}.input-group-addon:not(:last-child){border-right:0}.input-group .form-control:not(:first-child),.input-group-addon:not(:first-child),.input-group-btn:not(:first-child)>.btn,.input-group-btn:not(:first-child)>.btn-group>.btn,.input-group-btn:not(:first-child)>.dropdown-toggle,.input-group-btn:not(:last-child)>.btn-group:not(:first-child)>.btn,.input-group-btn:not(:last-child)>.btn:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.form-control+.input-group-addon:not(:first-child){border-left:0}.input-group-btn{position:relative;font-size:0;white-space:nowrap}.input-group-btn>.btn{position:relative}.input-group-btn>.btn+.btn{margin-left:-1px}.input-group-btn>.btn:active,.input-group-btn>.btn:focus,.input-group-btn>.btn:hover{z-index:3}.input-group-btn:not(:last-child)>.btn,.input-group-btn:not(:last-child)>.btn-group{margin-right:-1px}.input-group-btn:not(:first-child)>.btn,.input-group-btn:not(:first-child)>.btn-group{z-index:2;margin-left:-1px}.input-group-btn:not(:first-child)>.btn-group:active,.input-group-btn:not(:first-child)>.btn-group:focus,.input-group-btn:not(:first-child)>.btn-group:hover,.input-group-btn:not(:first-child)>.btn:active,.input-group-btn:not(:first-child)>.btn:focus,.input-group-btn:not(:first-child)>.btn:hover{z-index:3}.custom-control{position:relative;display:-webkit-inline-box;display:-webkit-inline-flex;display:-ms-inline-flexbox;display:inline-flex;min-height:1.5rem;padding-left:1.5rem;margin-right:1rem}.custom-control-input{position:absolute;z-index:-1;opacity:0}.custom-control-input:checked~.custom-control-indicator{color:#fff;background-color:#0275d8}.custom-control-input:focus~.custom-control-indicator{-webkit-box-shadow:0 0 0 1px #fff,0 0 0 3px #0275d8;box-shadow:0 0 0 1px #fff,0 0 0 3px #0275d8}.custom-control-input:active~.custom-control-indicator{color:#fff;background-color:#8fcafe}.custom-control-input:disabled~.custom-control-indicator{background-color:#eceeef}.custom-control-input:disabled~.custom-control-description{color:#636c72}.custom-control-indicator{position:absolute;top:.25rem;left:0;display:block;width:1rem;height:1rem;pointer-events:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background-color:#ddd;background-repeat:no-repeat;background-position:center center;-webkit-background-size:50% 50%;background-size:50% 50%}.custom-checkbox .custom-control-indicator{border-radius:.25rem}.custom-checkbox .custom-control-input:checked~.custom-control-indicator{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3E%3Cpath fill='%23fff' d='M6.564.75l-3.59 3.612-1.538-1.55L0 4.26 2.974 7.25 8 2.193z'/%3E%3C/svg%3E")}.custom-checkbox .custom-control-input:indeterminate~.custom-control-indicator{background-color:#0275d8;background-image:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 4'%3E%3Cpath stroke='%23fff' d='M0 2h4'/%3E%3C/svg%3E")}.custom-radio .custom-control-indicator{border-radius:50%}.custom-radio .custom-control-input:checked~.custom-control-indicator{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3E%3Ccircle r='3' fill='%23fff'/%3E%3C/svg%3E")}.custom-controls-stacked{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column}.custom-controls-stacked .custom-control{margin-bottom:.25rem}.custom-controls-stacked .custom-control+.custom-control{margin-left:0}.custom-select{display:inline-block;max-width:100%;height:calc(2.25rem + 2px);padding:.375rem 1.75rem .375rem .75rem;line-height:1.25;color:#464a4c;vertical-align:middle;background:#fff url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 5'%3E%3Cpath fill='%23333' d='M2 0L0 2h4zm0 5L0 3h4z'/%3E%3C/svg%3E") no-repeat right .75rem center;-webkit-background-size:8px 10px;background-size:8px 10px;border:1px solid rgba(0,0,0,.15);border-radius:.25rem;-webkit-appearance:none;-moz-appearance:none;appearance:none}.custom-select:focus{border-color:#5cb3fd;outline:0}.custom-select:focus::-ms-value{color:#464a4c;background-color:#fff}.custom-select:disabled{color:#636c72;background-color:#eceeef}.custom-select::-ms-expand{opacity:0}.custom-select-sm{padding-top:.375rem;padding-bottom:.375rem;font-size:75%}.custom-file{position:relative;display:inline-block;max-width:100%;height:2.5rem;margin-bottom:0}.custom-file-input{min-width:14rem;max-width:100%;height:2.5rem;margin:0;opacity:0}.custom-file-control{position:absolute;top:0;right:0;left:0;z-index:5;height:2.5rem;padding:.5rem 1rem;line-height:1.5;color:#464a4c;pointer-events:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background-color:#fff;border:1px solid rgba(0,0,0,.15);border-radius:.25rem}.custom-file-control:lang(en):empty::after{content:"Choose file..."}.custom-file-control::before{position:absolute;top:-1px;right:-1px;bottom:-1px;z-index:6;display:block;height:2.5rem;padding:.5rem 1rem;line-height:1.5;color:#464a4c;background-color:#eceeef;border:1px solid rgba(0,0,0,.15);border-radius:0 .25rem .25rem 0}.custom-file-control:lang(en)::before{content:"Browse"}.nav{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;padding-left:0;margin-bottom:0;list-style:none}.nav-link{display:block;padding:.5rem 1rem}.nav-link:focus,.nav-link:hover{text-decoration:none}.nav-link.disabled{color:#636c72}.nav-tabs{border-bottom:1px solid #ddd}.nav-tabs .nav-item{margin-bottom:-1px}.nav-tabs .nav-link{border:1px solid transparent;border-top-left-radius:.25rem;border-top-right-radius:.25rem}.nav-tabs .nav-link:focus,.nav-tabs .nav-link:hover{border-color:#eceeef #eceeef #ddd}.nav-tabs .nav-link.disabled{color:#636c72;background-color:transparent;border-color:transparent}.nav-tabs .nav-item.show .nav-link,.nav-tabs .nav-link.active{color:#464a4c;background-color:#fff;border-color:#ddd #ddd #fff}.nav-tabs .dropdown-menu{margin-top:-1px;border-top-left-radius:0;border-top-right-radius:0}.nav-pills .nav-link{border-radius:.25rem}.nav-pills .nav-link.active,.show .nav-pills .nav-link{color:#fff;background-color:#0275d8}.nav-fill .nav-item{-webkit-box-flex:1;-webkit-flex:1 1 auto;-ms-flex:1 1 auto;flex:1 1 auto;text-align:center}.nav-justified .nav-item{-webkit-flex-basis:0;-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;text-align:center}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.navbar{position:relative;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;padding:.5rem 1rem}.navbar>.container,.navbar>.container-fluid{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between}@media (max-width:575px){.navbar>.container,.navbar>.container-fluid{width:100%;margin-right:0;margin-left:0}}.navbar-brand{display:inline-block;padding-top:.3125rem;padding-bottom:.3125rem;margin-right:1rem;font-size:1.25rem;line-height:inherit;white-space:nowrap}.navbar-brand:focus,.navbar-brand:hover{text-decoration:none}.navbar-nav{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;padding-left:0;margin-bottom:0;list-style:none}.navbar-nav .nav-link{padding-right:0;padding-left:0}.navbar-text{display:inline-block;padding-top:.5rem;padding-bottom:.5rem}.navbar-collapse{-webkit-flex-basis:100%;-ms-flex-preferred-size:100%;flex-basis:100%}.navbar-toggler{padding:.25rem .75rem;font-size:1.25rem;line-height:1;background:0 0;border:1px solid transparent;border-radius:.25rem}.navbar-toggler:focus,.navbar-toggler:hover{text-decoration:none}.navbar-toggler-icon{display:inline-block;width:1.5em;height:1.5em;vertical-align:middle;content:"";background:no-repeat center center;-webkit-background-size:100% 100%;background-size:100% 100%}@media (max-width:575px){.navbar-expand-sm .navbar-nav .dropdown-menu{position:static;float:none}.navbar-expand-sm>.container,.navbar-expand-sm>.container-fluid{padding-right:0;padding-left:0}}@media (min-width:576px){.navbar-expand-sm{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;-webkit-box-pack:start;-webkit-justify-content:flex-start;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand-sm .navbar-nav{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row}.navbar-expand-sm .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-sm .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-sm>.container,.navbar-expand-sm>.container-fluid{-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand-sm .navbar-collapse{display:-webkit-box!important;display:-webkit-flex!important;display:-ms-flexbox!important;display:flex!important}.navbar-expand-sm .navbar-toggler{display:none}}@media (max-width:767px){.navbar-expand-md .navbar-nav .dropdown-menu{position:static;float:none}.navbar-expand-md>.container,.navbar-expand-md>.container-fluid{padding-right:0;padding-left:0}}@media (min-width:768px){.navbar-expand-md{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;-webkit-box-pack:start;-webkit-justify-content:flex-start;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand-md .navbar-nav{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row}.navbar-expand-md .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-md .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-md>.container,.navbar-expand-md>.container-fluid{-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand-md .navbar-collapse{display:-webkit-box!important;display:-webkit-flex!important;display:-ms-flexbox!important;display:flex!important}.navbar-expand-md .navbar-toggler{display:none}}@media (max-width:991px){.navbar-expand-lg .navbar-nav .dropdown-menu{position:static;float:none}.navbar-expand-lg>.container,.navbar-expand-lg>.container-fluid{padding-right:0;padding-left:0}}@media (min-width:992px){.navbar-expand-lg{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;-webkit-box-pack:start;-webkit-justify-content:flex-start;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand-lg .navbar-nav{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row}.navbar-expand-lg .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-lg .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-lg>.container,.navbar-expand-lg>.container-fluid{-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand-lg .navbar-collapse{display:-webkit-box!important;display:-webkit-flex!important;display:-ms-flexbox!important;display:flex!important}.navbar-expand-lg .navbar-toggler{display:none}}@media (max-width:1199px){.navbar-expand-xl .navbar-nav .dropdown-menu{position:static;float:none}.navbar-expand-xl>.container,.navbar-expand-xl>.container-fluid{padding-right:0;padding-left:0}}@media (min-width:1200px){.navbar-expand-xl{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;-webkit-box-pack:start;-webkit-justify-content:flex-start;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand-xl .navbar-nav{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row}.navbar-expand-xl .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-xl .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-xl>.container,.navbar-expand-xl>.container-fluid{-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand-xl .navbar-collapse{display:-webkit-box!important;display:-webkit-flex!important;display:-ms-flexbox!important;display:flex!important}.navbar-expand-xl .navbar-toggler{display:none}}.navbar-expand{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;-webkit-box-pack:start;-webkit-justify-content:flex-start;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand .navbar-nav .dropdown-menu{position:static;float:none}.navbar-expand>.container,.navbar-expand>.container-fluid{padding-right:0;padding-left:0}.navbar-expand .navbar-nav{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row}.navbar-expand .navbar-nav .dropdown-menu{position:absolute}.navbar-expand .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand>.container,.navbar-expand>.container-fluid{-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand .navbar-collapse{display:-webkit-box!important;display:-webkit-flex!important;display:-ms-flexbox!important;display:flex!important}.navbar-expand .navbar-toggler{display:none}.navbar-light .navbar-brand{color:rgba(0,0,0,.9)}.navbar-light .navbar-brand:focus,.navbar-light .navbar-brand:hover{color:rgba(0,0,0,.9)}.navbar-light .navbar-nav .nav-link{color:rgba(0,0,0,.5)}.navbar-light .navbar-nav .nav-link:focus,.navbar-light .navbar-nav .nav-link:hover{color:rgba(0,0,0,.7)}.navbar-light .navbar-nav .nav-link.disabled{color:rgba(0,0,0,.3)}.navbar-light .navbar-nav .active>.nav-link,.navbar-light .navbar-nav .nav-link.active,.navbar-light .navbar-nav .nav-link.show,.navbar-light .navbar-nav .show>.nav-link{color:rgba(0,0,0,.9)}.navbar-light .navbar-toggler{color:rgba(0,0,0,.5);border-color:rgba(0,0,0,.1)}.navbar-light .navbar-toggler-icon{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg viewBox='0 0 30 30' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath stroke='rgba(0, 0, 0, 0.5)' stroke-width='2' stroke-linecap='round' stroke-miterlimit='10' d='M4 7h22M4 15h22M4 23h22'/%3E%3C/svg%3E")}.navbar-light .navbar-text{color:rgba(0,0,0,.5)}.navbar-inverse .navbar-brand{color:#fff}.navbar-inverse .navbar-brand:focus,.navbar-inverse .navbar-brand:hover{color:#fff}.navbar-inverse .navbar-nav .nav-link{color:rgba(255,255,255,.5)}.navbar-inverse .navbar-nav .nav-link:focus,.navbar-inverse .navbar-nav .nav-link:hover{color:rgba(255,255,255,.75)}.navbar-inverse .navbar-nav .nav-link.disabled{color:rgba(255,255,255,.25)}.navbar-inverse .navbar-nav .active>.nav-link,.navbar-inverse .navbar-nav .nav-link.active,.navbar-inverse .navbar-nav .nav-link.show,.navbar-inverse .navbar-nav .show>.nav-link{color:#fff}.navbar-inverse .navbar-toggler{color:rgba(255,255,255,.5);border-color:rgba(255,255,255,.1)}.navbar-inverse .navbar-toggler-icon{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg viewBox='0 0 30 30' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath stroke='rgba(255, 255, 255, 0.5)' stroke-width='2' stroke-linecap='round' stroke-miterlimit='10' d='M4 7h22M4 15h22M4 23h22'/%3E%3C/svg%3E")}.navbar-inverse .navbar-text{color:rgba(255,255,255,.5)}.card{position:relative;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;background-color:#fff;border:1px solid rgba(0,0,0,.125);border-radius:.25rem}.card-block{-webkit-box-flex:1;-webkit-flex:1 1 auto;-ms-flex:1 1 auto;flex:1 1 auto;padding:1.25rem}.card-title{margin-bottom:.75rem;word-break:break-all}.card-subtitle{margin-top:-.375rem;margin-bottom:0}.card-text:last-child{margin-bottom:0}.card-link:hover{text-decoration:none}.card-link+.card-link{margin-left:1.25rem}.card>.list-group:first-child .list-group-item:first-child{border-top-left-radius:.25rem;border-top-right-radius:.25rem}.card>.list-group:last-child .list-group-item:last-child{border-bottom-right-radius:.25rem;border-bottom-left-radius:.25rem}.card-header{padding:.75rem 1.25rem;margin-bottom:0;background-color:#f7f7f9;border-bottom:1px solid rgba(0,0,0,.125)}.card-header:first-child{border-radius:calc(.25rem - 1px) calc(.25rem - 1px) 0 0}.card-footer{padding:.75rem 1.25rem;background-color:#f7f7f9;border-top:1px solid rgba(0,0,0,.125)}.card-footer:last-child{border-radius:0 0 calc(.25rem - 1px) calc(.25rem - 1px)}.card-header-tabs{margin-right:-.625rem;margin-bottom:-.75rem;margin-left:-.625rem;border-bottom:0}.card-header-pills{margin-right:-.625rem;margin-left:-.625rem}.card-primary{background-color:#0275d8;border-color:#0275d8}.card-primary .card-footer,.card-primary .card-header{background-color:transparent}.card-success{background-color:#5cb85c;border-color:#5cb85c}.card-success .card-footer,.card-success .card-header{background-color:transparent}.card-info{background-color:#5bc0de;border-color:#5bc0de}.card-info .card-footer,.card-info .card-header{background-color:transparent}.card-warning{background-color:#f0ad4e;border-color:#f0ad4e}.card-warning .card-footer,.card-warning .card-header{background-color:transparent}.card-danger{background-color:#d9534f;border-color:#d9534f}.card-danger .card-footer,.card-danger .card-header{background-color:transparent}.card-outline-primary{background-color:transparent;border-color:#0275d8}.card-outline-primary .card-footer,.card-outline-primary .card-header{background-color:transparent;border-color:#0275d8}.card-outline-secondary{background-color:transparent;border-color:#ccc}.card-outline-secondary .card-footer,.card-outline-secondary .card-header{background-color:transparent;border-color:#ccc}.card-outline-info{background-color:transparent;border-color:#5bc0de}.card-outline-info .card-footer,.card-outline-info .card-header{background-color:transparent;border-color:#5bc0de}.card-outline-success{background-color:transparent;border-color:#5cb85c}.card-outline-success .card-footer,.card-outline-success .card-header{background-color:transparent;border-color:#5cb85c}.card-outline-warning{background-color:transparent;border-color:#f0ad4e}.card-outline-warning .card-footer,.card-outline-warning .card-header{background-color:transparent;border-color:#f0ad4e}.card-outline-danger{background-color:transparent;border-color:#d9534f}.card-outline-danger .card-footer,.card-outline-danger .card-header{background-color:transparent;border-color:#d9534f}.card-inverse{color:rgba(255,255,255,.65)}.card-inverse .card-footer,.card-inverse .card-header{background-color:transparent;border-color:rgba(255,255,255,.2)}.card-inverse .card-blockquote,.card-inverse .card-footer,.card-inverse .card-header,.card-inverse .card-title{color:#fff}.card-inverse .card-blockquote .blockquote-footer,.card-inverse .card-link,.card-inverse .card-subtitle,.card-inverse .card-text{color:rgba(255,255,255,.65)}.card-inverse .card-link:focus,.card-inverse .card-link:hover{color:#fff}.card-blockquote{padding:0;margin-bottom:0;border-left:0}.card-img-overlay{position:absolute;top:0;right:0;bottom:0;left:0;padding:1.25rem}.card-img{width:100%;border-radius:calc(.25rem - 1px)}.card-img-top{width:100%;border-top-left-radius:calc(.25rem - 1px);border-top-right-radius:calc(.25rem - 1px)}.card-img-bottom{width:100%;border-bottom-right-radius:calc(.25rem - 1px);border-bottom-left-radius:calc(.25rem - 1px)}@media (min-width:576px){.card-deck{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-flow:row wrap;-ms-flex-flow:row wrap;flex-flow:row wrap;margin-right:-15px;margin-left:-15px}.card-deck .card{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-flex:1;-webkit-flex:1 0 0;-ms-flex:1 0 0px;flex:1 0 0%;-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;margin-right:15px;margin-left:15px}}@media (min-width:576px){.card-group{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-flow:row wrap;-ms-flex-flow:row wrap;flex-flow:row wrap}.card-group .card{-webkit-box-flex:1;-webkit-flex:1 0 0;-ms-flex:1 0 0px;flex:1 0 0%}.card-group .card+.card{margin-left:0;border-left:0}.card-group .card:first-child{border-top-right-radius:0;border-bottom-right-radius:0}.card-group .card:first-child .card-img-top{border-top-right-radius:0}.card-group .card:first-child .card-img-bottom{border-bottom-right-radius:0}.card-group .card:last-child{border-top-left-radius:0;border-bottom-left-radius:0}.card-group .card:last-child .card-img-top{border-top-left-radius:0}.card-group .card:last-child .card-img-bottom{border-bottom-left-radius:0}.card-group .card:not(:first-child):not(:last-child){border-radius:0}.card-group .card:not(:first-child):not(:last-child) .card-img-bottom,.card-group .card:not(:first-child):not(:last-child) .card-img-top{border-radius:0}}.card-columns .card{margin-bottom:.75rem}@media (min-width:576px){.card-columns{-webkit-column-count:3;-moz-column-count:3;column-count:3;-webkit-column-gap:1.25rem;-moz-column-gap:1.25rem;column-gap:1.25rem}.card-columns .card{display:inline-block;width:100%}}.breadcrumb{padding:.75rem 1rem;margin-bottom:1rem;list-style:none;background-color:#eceeef;border-radius:.25rem}.breadcrumb::after{display:block;clear:both;content:""}.breadcrumb-item{float:left}.breadcrumb-item+.breadcrumb-item::before{display:inline-block;padding-right:.5rem;padding-left:.5rem;color:#636c72;content:"/"}.breadcrumb-item+.breadcrumb-item:hover::before{text-decoration:underline}.breadcrumb-item+.breadcrumb-item:hover::before{text-decoration:none}.breadcrumb-item.active{color:#636c72}.pagination{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;padding-left:0;list-style:none;border-radius:.25rem}.page-item:first-child .page-link{margin-left:0;border-top-left-radius:.25rem;border-bottom-left-radius:.25rem}.page-item:last-child .page-link{border-top-right-radius:.25rem;border-bottom-right-radius:.25rem}.page-item.active .page-link{z-index:2;color:#fff;background-color:#0275d8;border-color:#0275d8}.page-item.disabled .page-link{color:#636c72;pointer-events:none;background-color:#fff;border-color:#ddd}.page-link{position:relative;display:block;padding:.5rem .75rem;margin-left:-1px;line-height:1.25;color:#0275d8;background-color:#fff;border:1px solid #ddd}.page-link:focus,.page-link:hover{color:#014c8c;text-decoration:none;background-color:#eceeef;border-color:#ddd}.pagination-lg .page-link{padding:.75rem 1.5rem;font-size:1.25rem}.pagination-lg .page-item:first-child .page-link{border-top-left-radius:.3rem;border-bottom-left-radius:.3rem}.pagination-lg .page-item:last-child .page-link{border-top-right-radius:.3rem;border-bottom-right-radius:.3rem}.pagination-sm .page-link{padding:.25rem .5rem;font-size:.875rem}.pagination-sm .page-item:first-child .page-link{border-top-left-radius:.2rem;border-bottom-left-radius:.2rem}.pagination-sm .page-item:last-child .page-link{border-top-right-radius:.2rem;border-bottom-right-radius:.2rem}.badge{display:inline-block;padding:.25em .4em;font-size:75%;font-weight:700;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25rem}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}a.badge:focus,a.badge:hover{color:#fff;text-decoration:none}.badge-pill{padding-right:.6em;padding-left:.6em;border-radius:10rem}.badge-default{background-color:#636c72}.badge-default[href]:focus,.badge-default[href]:hover{background-color:#4b5257}.badge-primary{background-color:#0275d8}.badge-primary[href]:focus,.badge-primary[href]:hover{background-color:#025aa5}.badge-success{background-color:#5cb85c}.badge-success[href]:focus,.badge-success[href]:hover{background-color:#449d44}.badge-info{background-color:#5bc0de}.badge-info[href]:focus,.badge-info[href]:hover{background-color:#31b0d5}.badge-warning{background-color:#f0ad4e}.badge-warning[href]:focus,.badge-warning[href]:hover{background-color:#ec971f}.badge-danger{background-color:#d9534f}.badge-danger[href]:focus,.badge-danger[href]:hover{background-color:#c9302c}.jumbotron{padding:2rem 1rem;margin-bottom:2rem;background-color:#eceeef;border-radius:.3rem}@media (min-width:576px){.jumbotron{padding:4rem 2rem}}.jumbotron-fluid{padding-right:0;padding-left:0;border-radius:0}.alert{padding:.75rem 1.25rem;margin-bottom:1rem;border:1px solid transparent;border-radius:.25rem}.alert-heading{color:inherit}.alert-link{font-weight:700}.alert-dismissible .close{position:relative;top:-.75rem;right:-1.25rem;padding:.75rem 1.25rem;color:inherit}.alert-success{color:#3c763d;background-color:#dff0d8;border-color:#d0e9c6}.alert-success hr{border-top-color:#c1e2b3}.alert-success .alert-link{color:#2b542c}.alert-info{color:#31708f;background-color:#d9edf7;border-color:#bcdff1}.alert-info hr{border-top-color:#a6d5ec}.alert-info .alert-link{color:#245269}.alert-warning{color:#8a6d3b;background-color:#fcf8e3;border-color:#faf2cc}.alert-warning hr{border-top-color:#f7ecb5}.alert-warning .alert-link{color:#66512c}.alert-danger{color:#a94442;background-color:#f2dede;border-color:#ebcccc}.alert-danger hr{border-top-color:#e4b9b9}.alert-danger .alert-link{color:#843534}@-webkit-keyframes progress-bar-stripes{from{background-position:1rem 0}to{background-position:0 0}}@-o-keyframes progress-bar-stripes{from{background-position:1rem 0}to{background-position:0 0}}@keyframes progress-bar-stripes{from{background-position:1rem 0}to{background-position:0 0}}.progress{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;overflow:hidden;font-size:.75rem;line-height:1rem;text-align:center;background-color:#eceeef;border-radius:.25rem}.progress-bar{height:1rem;line-height:1rem;color:#fff;background-color:#0275d8;-webkit-transition:width .6s ease;-o-transition:width .6s ease;transition:width .6s ease}.progress-bar-striped{background-image:-webkit-linear-gradient(45deg,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(45deg,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(45deg,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);-webkit-background-size:1rem 1rem;background-size:1rem 1rem}.progress-bar-animated{-webkit-animation:progress-bar-stripes 1s linear infinite;-o-animation:progress-bar-stripes 1s linear infinite;animation:progress-bar-stripes 1s linear infinite}.media{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-align:start;-webkit-align-items:flex-start;-ms-flex-align:start;align-items:flex-start}.media-body{-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1 1 0%}.list-group{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;padding-left:0;margin-bottom:0}.list-group-item-action{width:100%;color:#464a4c;text-align:inherit}.list-group-item-action:focus,.list-group-item-action:hover{color:#464a4c;text-decoration:none;background-color:#f7f7f9}.list-group-item-action:active{color:#292b2c;background-color:#eceeef}.list-group-item{position:relative;display:block;padding:.75rem 1.25rem;margin-bottom:-1px;background-color:#fff;border:1px solid rgba(0,0,0,.125)}.list-group-item:first-child{border-top-left-radius:.25rem;border-top-right-radius:.25rem}.list-group-item:last-child{margin-bottom:0;border-bottom-right-radius:.25rem;border-bottom-left-radius:.25rem}.list-group-item:focus,.list-group-item:hover{text-decoration:none}.list-group-item.disabled,.list-group-item:disabled{color:#636c72;background-color:#fff}.list-group-item.active{z-index:2;color:#fff;background-color:#0275d8;border-color:#0275d8}.list-group-flush .list-group-item{border-right:0;border-left:0;border-radius:0}.list-group-flush:first-child .list-group-item:first-child{border-top:0}.list-group-flush:last-child .list-group-item:last-child{border-bottom:0}.list-group-item-success{color:#3c763d;background-color:#dff0d8}a.list-group-item-success,button.list-group-item-success{color:#3c763d}a.list-group-item-success:focus,a.list-group-item-success:hover,button.list-group-item-success:focus,button.list-group-item-success:hover{color:#3c763d;background-color:#d0e9c6}a.list-group-item-success.active,button.list-group-item-success.active{color:#fff;background-color:#3c763d;border-color:#3c763d}.list-group-item-info{color:#31708f;background-color:#d9edf7}a.list-group-item-info,button.list-group-item-info{color:#31708f}a.list-group-item-info:focus,a.list-group-item-info:hover,button.list-group-item-info:focus,button.list-group-item-info:hover{color:#31708f;background-color:#c4e3f3}a.list-group-item-info.active,button.list-group-item-info.active{color:#fff;background-color:#31708f;border-color:#31708f}.list-group-item-warning{color:#8a6d3b;background-color:#fcf8e3}a.list-group-item-warning,button.list-group-item-warning{color:#8a6d3b}a.list-group-item-warning:focus,a.list-group-item-warning:hover,button.list-group-item-warning:focus,button.list-group-item-warning:hover{color:#8a6d3b;background-color:#faf2cc}a.list-group-item-warning.active,button.list-group-item-warning.active{color:#fff;background-color:#8a6d3b;border-color:#8a6d3b}.list-group-item-danger{color:#a94442;background-color:#f2dede}a.list-group-item-danger,button.list-group-item-danger{color:#a94442}a.list-group-item-danger:focus,a.list-group-item-danger:hover,button.list-group-item-danger:focus,button.list-group-item-danger:hover{color:#a94442;background-color:#ebcccc}a.list-group-item-danger.active,button.list-group-item-danger.active{color:#fff;background-color:#a94442;border-color:#a94442}.embed-responsive{position:relative;display:block;width:100%;padding:0;overflow:hidden}.embed-responsive::before{display:block;content:""}.embed-responsive .embed-responsive-item,.embed-responsive embed,.embed-responsive iframe,.embed-responsive object,.embed-responsive video{position:absolute;top:0;bottom:0;left:0;width:100%;height:100%;border:0}.embed-responsive-21by9::before{padding-top:42.857143%}.embed-responsive-16by9::before{padding-top:56.25%}.embed-responsive-4by3::before{padding-top:75%}.embed-responsive-1by1::before{padding-top:100%}.close{float:right;font-size:1.5rem;font-weight:700;line-height:1;color:#000;text-shadow:0 1px 0 #fff;opacity:.5}.close:focus,.close:hover{color:#000;text-decoration:none;opacity:.75}button.close{padding:0;background:0 0;border:0;-webkit-appearance:none}.modal-open{overflow:hidden}.modal{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1050;display:none;overflow:hidden;outline:0}.modal.fade .modal-dialog{-webkit-transition:-webkit-transform .3s ease-out;transition:-webkit-transform .3s ease-out;-o-transition:-o-transform .3s ease-out;transition:transform .3s ease-out;transition:transform .3s ease-out,-webkit-transform .3s ease-out,-o-transform .3s ease-out;-webkit-transform:translate(0,-25%);-o-transform:translate(0,-25%);transform:translate(0,-25%)}.modal.show .modal-dialog{-webkit-transform:translate(0,0);-o-transform:translate(0,0);transform:translate(0,0)}.modal-open .modal{overflow-x:hidden;overflow-y:auto}.modal-dialog{position:relative;width:auto;margin:10px}.modal-content{position:relative;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid rgba(0,0,0,.2);border-radius:.3rem;outline:0}.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;background-color:#000}.modal-backdrop.fade{opacity:0}.modal-backdrop.show{opacity:.5}.modal-header{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;padding:15px;border-bottom:1px solid #eceeef}.modal-title{margin-bottom:0;line-height:1.5}.modal-body{position:relative;-webkit-box-flex:1;-webkit-flex:1 1 auto;-ms-flex:1 1 auto;flex:1 1 auto;padding:15px}.modal-footer{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:end;-webkit-justify-content:flex-end;-ms-flex-pack:end;justify-content:flex-end;padding:15px;border-top:1px solid #eceeef}.modal-footer>:not(:first-child){margin-left:.25rem}.modal-footer>:not(:last-child){margin-right:.25rem}.modal-scrollbar-measure{position:absolute;top:-9999px;width:50px;height:50px;overflow:scroll}@media (min-width:576px){.modal-dialog{max-width:500px;margin:30px auto}.modal-sm{max-width:300px}}@media (min-width:992px){.modal-lg{max-width:800px}}.tooltip{position:absolute;z-index:1070;display:block;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif;font-style:normal;font-weight:400;line-height:1.5;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;white-space:normal;line-break:auto;font-size:.875rem;word-wrap:break-word;opacity:0}.tooltip.show{opacity:.9}.tooltip.bs-tether-element-attached-bottom,.tooltip.tooltip-top{padding:5px 0;margin-top:-3px}.tooltip.bs-tether-element-attached-bottom .tooltip-inner::before,.tooltip.tooltip-top .tooltip-inner::before{bottom:0;left:50%;margin-left:-5px;content:"";border-width:5px 5px 0;border-top-color:#000}.tooltip.bs-tether-element-attached-left,.tooltip.tooltip-right{padding:0 5px;margin-left:3px}.tooltip.bs-tether-element-attached-left .tooltip-inner::before,.tooltip.tooltip-right .tooltip-inner::before{top:50%;left:0;margin-top:-5px;content:"";border-width:5px 5px 5px 0;border-right-color:#000}.tooltip.bs-tether-element-attached-top,.tooltip.tooltip-bottom{padding:5px 0;margin-top:3px}.tooltip.bs-tether-element-attached-top .tooltip-inner::before,.tooltip.tooltip-bottom .tooltip-inner::before{top:0;left:50%;margin-left:-5px;content:"";border-width:0 5px 5px;border-bottom-color:#000}.tooltip.bs-tether-element-attached-right,.tooltip.tooltip-left{padding:0 5px;margin-left:-3px}.tooltip.bs-tether-element-attached-right .tooltip-inner::before,.tooltip.tooltip-left .tooltip-inner::before{top:50%;right:0;margin-top:-5px;content:"";border-width:5px 0 5px 5px;border-left-color:#000}.tooltip-inner{max-width:200px;padding:3px 8px;color:#fff;text-align:center;background-color:#000;border-radius:.25rem}.tooltip-inner::before{position:absolute;width:0;height:0;border-color:transparent;border-style:solid}.popover{position:absolute;top:0;left:0;z-index:1060;display:block;max-width:276px;padding:1px;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif;font-style:normal;font-weight:400;line-height:1.5;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;white-space:normal;line-break:auto;font-size:.875rem;word-wrap:break-word;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid rgba(0,0,0,.2);border-radius:.3rem}.popover.bs-tether-element-attached-bottom,.popover.popover-top{margin-top:-10px}.popover.bs-tether-element-attached-bottom::after,.popover.bs-tether-element-attached-bottom::before,.popover.popover-top::after,.popover.popover-top::before{left:50%;border-bottom-width:0}.popover.bs-tether-element-attached-bottom::before,.popover.popover-top::before{bottom:-11px;margin-left:-11px;border-top-color:rgba(0,0,0,.25)}.popover.bs-tether-element-attached-bottom::after,.popover.popover-top::after{bottom:-10px;margin-left:-10px;border-top-color:#fff}.popover.bs-tether-element-attached-left,.popover.popover-right{margin-left:10px}.popover.bs-tether-element-attached-left::after,.popover.bs-tether-element-attached-left::before,.popover.popover-right::after,.popover.popover-right::before{top:50%;border-left-width:0}.popover.bs-tether-element-attached-left::before,.popover.popover-right::before{left:-11px;margin-top:-11px;border-right-color:rgba(0,0,0,.25)}.popover.bs-tether-element-attached-left::after,.popover.popover-right::after{left:-10px;margin-top:-10px;border-right-color:#fff}.popover.bs-tether-element-attached-top,.popover.popover-bottom{margin-top:10px}.popover.bs-tether-element-attached-top::after,.popover.bs-tether-element-attached-top::before,.popover.popover-bottom::after,.popover.popover-bottom::before{left:50%;border-top-width:0}.popover.bs-tether-element-attached-top::before,.popover.popover-bottom::before{top:-11px;margin-left:-11px;border-bottom-color:rgba(0,0,0,.25)}.popover.bs-tether-element-attached-top::after,.popover.popover-bottom::after{top:-10px;margin-left:-10px;border-bottom-color:#fff}.popover.bs-tether-element-attached-top .popover-title::before,.popover.popover-bottom .popover-title::before{position:absolute;top:0;left:50%;display:block;width:20px;margin-left:-10px;content:"";border-bottom:1px solid #f7f7f7}.popover.bs-tether-element-attached-right,.popover.popover-left{margin-left:-10px}.popover.bs-tether-element-attached-right::after,.popover.bs-tether-element-attached-right::before,.popover.popover-left::after,.popover.popover-left::before{top:50%;border-right-width:0}.popover.bs-tether-element-attached-right::before,.popover.popover-left::before{right:-11px;margin-top:-11px;border-left-color:rgba(0,0,0,.25)}.popover.bs-tether-element-attached-right::after,.popover.popover-left::after{right:-10px;margin-top:-10px;border-left-color:#fff}.popover-title{padding:8px 14px;margin-bottom:0;font-size:1rem;color:inherit;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;border-top-left-radius:calc(.3rem - 1px);border-top-right-radius:calc(.3rem - 1px)}.popover-title:empty{display:none}.popover-content{padding:9px 14px;color:#292b2c}.popover::after,.popover::before{position:absolute;display:block;width:0;height:0;border-color:transparent;border-style:solid}.popover::before{content:"";border-width:11px}.popover::after{content:"";border-width:10px}.carousel{position:relative}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-item{position:relative;display:none;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;width:100%;-webkit-transition:-webkit-transform .6s ease;transition:-webkit-transform .6s ease;-o-transition:-o-transform .6s ease;transition:transform .6s ease;transition:transform .6s ease,-webkit-transform .6s ease,-o-transform .6s ease;-webkit-backface-visibility:hidden;backface-visibility:hidden;-webkit-perspective:1000px;perspective:1000px}.carousel-item-next,.carousel-item-prev,.carousel-item.active{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.carousel-item-next,.carousel-item-prev{position:absolute;top:0}.carousel-item-next.carousel-item-left,.carousel-item-prev.carousel-item-right{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}.active.carousel-item-right,.carousel-item-next{-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0)}.active.carousel-item-left,.carousel-item-prev{-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0)}.carousel-control-next,.carousel-control-prev{position:absolute;top:0;bottom:0;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;width:15%;color:#fff;text-align:center;opacity:.5}.carousel-control-next:focus,.carousel-control-next:hover,.carousel-control-prev:focus,.carousel-control-prev:hover{color:#fff;text-decoration:none;outline:0;opacity:.9}.carousel-control-prev{left:0}.carousel-control-next{right:0}.carousel-control-next-icon,.carousel-control-prev-icon{display:inline-block;width:20px;height:20px;background:transparent no-repeat center center;-webkit-background-size:100% 100%;background-size:100% 100%}.carousel-control-prev-icon{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' viewBox='0 0 8 8'%3E%3Cpath d='M4 0l-4 4 4 4 1.5-1.5-2.5-2.5 2.5-2.5-1.5-1.5z'/%3E%3C/svg%3E")}.carousel-control-next-icon{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' viewBox='0 0 8 8'%3E%3Cpath d='M1.5 0l-1.5 1.5 2.5 2.5-2.5 2.5 1.5 1.5 4-4-4-4z'/%3E%3C/svg%3E")}.carousel-indicators{position:absolute;right:0;bottom:10px;left:0;z-index:15;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;padding-left:0;margin-right:15%;margin-left:15%;list-style:none}.carousel-indicators li{position:relative;-webkit-box-flex:1;-webkit-flex:1 0 auto;-ms-flex:1 0 auto;flex:1 0 auto;max-width:30px;height:3px;margin-right:3px;margin-left:3px;text-indent:-999px;background-color:rgba(255,255,255,.5)}.carousel-indicators li::before{position:absolute;top:-10px;left:0;display:inline-block;width:100%;height:10px;content:""}.carousel-indicators li::after{position:absolute;bottom:-10px;left:0;display:inline-block;width:100%;height:10px;content:""}.carousel-indicators .active{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}.align-baseline{vertical-align:baseline!important}.align-top{vertical-align:top!important}.align-middle{vertical-align:middle!important}.align-bottom{vertical-align:bottom!important}.align-text-bottom{vertical-align:text-bottom!important}.align-text-top{vertical-align:text-top!important}.bg-faded{background-color:#f7f7f7}.bg-primary{background-color:#0275d8!important}a.bg-primary:focus,a.bg-primary:hover{background-color:#025aa5!important}.bg-success{background-color:#5cb85c!important}a.bg-success:focus,a.bg-success:hover{background-color:#449d44!important}.bg-info{background-color:#5bc0de!important}a.bg-info:focus,a.bg-info:hover{background-color:#31b0d5!important}.bg-warning{background-color:#f0ad4e!important}a.bg-warning:focus,a.bg-warning:hover{background-color:#ec971f!important}.bg-danger{background-color:#d9534f!important}a.bg-danger:focus,a.bg-danger:hover{background-color:#c9302c!important}.bg-inverse{background-color:#292b2c!important}a.bg-inverse:focus,a.bg-inverse:hover{background-color:#101112!important}.border-0{border:0!important}.border-top-0{border-top:0!important}.border-right-0{border-right:0!important}.border-bottom-0{border-bottom:0!important}.border-left-0{border-left:0!important}.rounded{border-radius:.25rem}.rounded-top{border-top-left-radius:.25rem;border-top-right-radius:.25rem}.rounded-right{border-top-right-radius:.25rem;border-bottom-right-radius:.25rem}.rounded-bottom{border-bottom-right-radius:.25rem;border-bottom-left-radius:.25rem}.rounded-left{border-top-left-radius:.25rem;border-bottom-left-radius:.25rem}.rounded-circle{border-radius:50%}.rounded-0{border-radius:0}.clearfix::after{display:block;clear:both;content:""}.d-none{display:none!important}.d-inline{display:inline!important}.d-inline-block{display:inline-block!important}.d-block{display:block!important}.d-table{display:table!important}.d-table-cell{display:table-cell!important}.d-flex{display:-webkit-box!important;display:-webkit-flex!important;display:-ms-flexbox!important;display:flex!important}.d-inline-flex{display:-webkit-inline-box!important;display:-webkit-inline-flex!important;display:-ms-inline-flexbox!important;display:inline-flex!important}@media (min-width:576px){.d-sm-none{display:none!important}.d-sm-inline{display:inline!important}.d-sm-inline-block{display:inline-block!important}.d-sm-block{display:block!important}.d-sm-table{display:table!important}.d-sm-table-cell{display:table-cell!important}.d-sm-flex{display:-webkit-box!important;display:-webkit-flex!important;display:-ms-flexbox!important;display:flex!important}.d-sm-inline-flex{display:-webkit-inline-box!important;display:-webkit-inline-flex!important;display:-ms-inline-flexbox!important;display:inline-flex!important}}@media (min-width:768px){.d-md-none{display:none!important}.d-md-inline{display:inline!important}.d-md-inline-block{display:inline-block!important}.d-md-block{display:block!important}.d-md-table{display:table!important}.d-md-table-cell{display:table-cell!important}.d-md-flex{display:-webkit-box!important;display:-webkit-flex!important;display:-ms-flexbox!important;display:flex!important}.d-md-inline-flex{display:-webkit-inline-box!important;display:-webkit-inline-flex!important;display:-ms-inline-flexbox!important;display:inline-flex!important}}@media (min-width:992px){.d-lg-none{display:none!important}.d-lg-inline{display:inline!important}.d-lg-inline-block{display:inline-block!important}.d-lg-block{display:block!important}.d-lg-table{display:table!important}.d-lg-table-cell{display:table-cell!important}.d-lg-flex{display:-webkit-box!important;display:-webkit-flex!important;display:-ms-flexbox!important;display:flex!important}.d-lg-inline-flex{display:-webkit-inline-box!important;display:-webkit-inline-flex!important;display:-ms-inline-flexbox!important;display:inline-flex!important}}@media (min-width:1200px){.d-xl-none{display:none!important}.d-xl-inline{display:inline!important}.d-xl-inline-block{display:inline-block!important}.d-xl-block{display:block!important}.d-xl-table{display:table!important}.d-xl-table-cell{display:table-cell!important}.d-xl-flex{display:-webkit-box!important;display:-webkit-flex!important;display:-ms-flexbox!important;display:flex!important}.d-xl-inline-flex{display:-webkit-inline-box!important;display:-webkit-inline-flex!important;display:-ms-inline-flexbox!important;display:inline-flex!important}}.d-print-block{display:none!important}@media print{.d-print-block{display:block!important}}.d-print-inline{display:none!important}@media print{.d-print-inline{display:inline!important}}.d-print-inline-block{display:none!important}@media print{.d-print-inline-block{display:inline-block!important}}@media print{.d-print-none{display:none!important}}.order-first{-webkit-box-ordinal-group:0;-webkit-order:-1;-ms-flex-order:-1;order:-1}.order-last{-webkit-box-ordinal-group:2;-webkit-order:1;-ms-flex-order:1;order:1}.order-0{-webkit-box-ordinal-group:1;-webkit-order:0;-ms-flex-order:0;order:0}.flex-row{-webkit-box-orient:horizontal!important;-webkit-box-direction:normal!important;-webkit-flex-direction:row!important;-ms-flex-direction:row!important;flex-direction:row!important}.flex-column{-webkit-box-orient:vertical!important;-webkit-box-direction:normal!important;-webkit-flex-direction:column!important;-ms-flex-direction:column!important;flex-direction:column!important}.flex-row-reverse{-webkit-box-orient:horizontal!important;-webkit-box-direction:reverse!important;-webkit-flex-direction:row-reverse!important;-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-column-reverse{-webkit-box-orient:vertical!important;-webkit-box-direction:reverse!important;-webkit-flex-direction:column-reverse!important;-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-wrap{-webkit-flex-wrap:wrap!important;-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-nowrap{-webkit-flex-wrap:nowrap!important;-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-wrap-reverse{-webkit-flex-wrap:wrap-reverse!important;-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.justify-content-start{-webkit-box-pack:start!important;-webkit-justify-content:flex-start!important;-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-end{-webkit-box-pack:end!important;-webkit-justify-content:flex-end!important;-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-center{-webkit-box-pack:center!important;-webkit-justify-content:center!important;-ms-flex-pack:center!important;justify-content:center!important}.justify-content-between{-webkit-box-pack:justify!important;-webkit-justify-content:space-between!important;-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-around{-webkit-justify-content:space-around!important;-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-start{-webkit-box-align:start!important;-webkit-align-items:flex-start!important;-ms-flex-align:start!important;align-items:flex-start!important}.align-items-end{-webkit-box-align:end!important;-webkit-align-items:flex-end!important;-ms-flex-align:end!important;align-items:flex-end!important}.align-items-center{-webkit-box-align:center!important;-webkit-align-items:center!important;-ms-flex-align:center!important;align-items:center!important}.align-items-baseline{-webkit-box-align:baseline!important;-webkit-align-items:baseline!important;-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-stretch{-webkit-box-align:stretch!important;-webkit-align-items:stretch!important;-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-start{-webkit-align-content:flex-start!important;-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-end{-webkit-align-content:flex-end!important;-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-center{-webkit-align-content:center!important;-ms-flex-line-pack:center!important;align-content:center!important}.align-content-between{-webkit-align-content:space-between!important;-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-around{-webkit-align-content:space-around!important;-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-stretch{-webkit-align-content:stretch!important;-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-auto{-webkit-align-self:auto!important;-ms-flex-item-align:auto!important;-ms-grid-row-align:auto!important;align-self:auto!important}.align-self-start{-webkit-align-self:flex-start!important;-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-end{-webkit-align-self:flex-end!important;-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-center{-webkit-align-self:center!important;-ms-flex-item-align:center!important;-ms-grid-row-align:center!important;align-self:center!important}.align-self-baseline{-webkit-align-self:baseline!important;-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-stretch{-webkit-align-self:stretch!important;-ms-flex-item-align:stretch!important;-ms-grid-row-align:stretch!important;align-self:stretch!important}@media (min-width:576px){.order-sm-first{-webkit-box-ordinal-group:0;-webkit-order:-1;-ms-flex-order:-1;order:-1}.order-sm-last{-webkit-box-ordinal-group:2;-webkit-order:1;-ms-flex-order:1;order:1}.order-sm-0{-webkit-box-ordinal-group:1;-webkit-order:0;-ms-flex-order:0;order:0}.flex-sm-row{-webkit-box-orient:horizontal!important;-webkit-box-direction:normal!important;-webkit-flex-direction:row!important;-ms-flex-direction:row!important;flex-direction:row!important}.flex-sm-column{-webkit-box-orient:vertical!important;-webkit-box-direction:normal!important;-webkit-flex-direction:column!important;-ms-flex-direction:column!important;flex-direction:column!important}.flex-sm-row-reverse{-webkit-box-orient:horizontal!important;-webkit-box-direction:reverse!important;-webkit-flex-direction:row-reverse!important;-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-sm-column-reverse{-webkit-box-orient:vertical!important;-webkit-box-direction:reverse!important;-webkit-flex-direction:column-reverse!important;-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-sm-wrap{-webkit-flex-wrap:wrap!important;-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-sm-nowrap{-webkit-flex-wrap:nowrap!important;-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-sm-wrap-reverse{-webkit-flex-wrap:wrap-reverse!important;-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.justify-content-sm-start{-webkit-box-pack:start!important;-webkit-justify-content:flex-start!important;-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-sm-end{-webkit-box-pack:end!important;-webkit-justify-content:flex-end!important;-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-sm-center{-webkit-box-pack:center!important;-webkit-justify-content:center!important;-ms-flex-pack:center!important;justify-content:center!important}.justify-content-sm-between{-webkit-box-pack:justify!important;-webkit-justify-content:space-between!important;-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-sm-around{-webkit-justify-content:space-around!important;-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-sm-start{-webkit-box-align:start!important;-webkit-align-items:flex-start!important;-ms-flex-align:start!important;align-items:flex-start!important}.align-items-sm-end{-webkit-box-align:end!important;-webkit-align-items:flex-end!important;-ms-flex-align:end!important;align-items:flex-end!important}.align-items-sm-center{-webkit-box-align:center!important;-webkit-align-items:center!important;-ms-flex-align:center!important;align-items:center!important}.align-items-sm-baseline{-webkit-box-align:baseline!important;-webkit-align-items:baseline!important;-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-sm-stretch{-webkit-box-align:stretch!important;-webkit-align-items:stretch!important;-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-sm-start{-webkit-align-content:flex-start!important;-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-sm-end{-webkit-align-content:flex-end!important;-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-sm-center{-webkit-align-content:center!important;-ms-flex-line-pack:center!important;align-content:center!important}.align-content-sm-between{-webkit-align-content:space-between!important;-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-sm-around{-webkit-align-content:space-around!important;-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-sm-stretch{-webkit-align-content:stretch!important;-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-sm-auto{-webkit-align-self:auto!important;-ms-flex-item-align:auto!important;-ms-grid-row-align:auto!important;align-self:auto!important}.align-self-sm-start{-webkit-align-self:flex-start!important;-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-sm-end{-webkit-align-self:flex-end!important;-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-sm-center{-webkit-align-self:center!important;-ms-flex-item-align:center!important;-ms-grid-row-align:center!important;align-self:center!important}.align-self-sm-baseline{-webkit-align-self:baseline!important;-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-sm-stretch{-webkit-align-self:stretch!important;-ms-flex-item-align:stretch!important;-ms-grid-row-align:stretch!important;align-self:stretch!important}}@media (min-width:768px){.order-md-first{-webkit-box-ordinal-group:0;-webkit-order:-1;-ms-flex-order:-1;order:-1}.order-md-last{-webkit-box-ordinal-group:2;-webkit-order:1;-ms-flex-order:1;order:1}.order-md-0{-webkit-box-ordinal-group:1;-webkit-order:0;-ms-flex-order:0;order:0}.flex-md-row{-webkit-box-orient:horizontal!important;-webkit-box-direction:normal!important;-webkit-flex-direction:row!important;-ms-flex-direction:row!important;flex-direction:row!important}.flex-md-column{-webkit-box-orient:vertical!important;-webkit-box-direction:normal!important;-webkit-flex-direction:column!important;-ms-flex-direction:column!important;flex-direction:column!important}.flex-md-row-reverse{-webkit-box-orient:horizontal!important;-webkit-box-direction:reverse!important;-webkit-flex-direction:row-reverse!important;-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-md-column-reverse{-webkit-box-orient:vertical!important;-webkit-box-direction:reverse!important;-webkit-flex-direction:column-reverse!important;-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-md-wrap{-webkit-flex-wrap:wrap!important;-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-md-nowrap{-webkit-flex-wrap:nowrap!important;-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-md-wrap-reverse{-webkit-flex-wrap:wrap-reverse!important;-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.justify-content-md-start{-webkit-box-pack:start!important;-webkit-justify-content:flex-start!important;-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-md-end{-webkit-box-pack:end!important;-webkit-justify-content:flex-end!important;-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-md-center{-webkit-box-pack:center!important;-webkit-justify-content:center!important;-ms-flex-pack:center!important;justify-content:center!important}.justify-content-md-between{-webkit-box-pack:justify!important;-webkit-justify-content:space-between!important;-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-md-around{-webkit-justify-content:space-around!important;-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-md-start{-webkit-box-align:start!important;-webkit-align-items:flex-start!important;-ms-flex-align:start!important;align-items:flex-start!important}.align-items-md-end{-webkit-box-align:end!important;-webkit-align-items:flex-end!important;-ms-flex-align:end!important;align-items:flex-end!important}.align-items-md-center{-webkit-box-align:center!important;-webkit-align-items:center!important;-ms-flex-align:center!important;align-items:center!important}.align-items-md-baseline{-webkit-box-align:baseline!important;-webkit-align-items:baseline!important;-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-md-stretch{-webkit-box-align:stretch!important;-webkit-align-items:stretch!important;-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-md-start{-webkit-align-content:flex-start!important;-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-md-end{-webkit-align-content:flex-end!important;-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-md-center{-webkit-align-content:center!important;-ms-flex-line-pack:center!important;align-content:center!important}.align-content-md-between{-webkit-align-content:space-between!important;-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-md-around{-webkit-align-content:space-around!important;-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-md-stretch{-webkit-align-content:stretch!important;-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-md-auto{-webkit-align-self:auto!important;-ms-flex-item-align:auto!important;-ms-grid-row-align:auto!important;align-self:auto!important}.align-self-md-start{-webkit-align-self:flex-start!important;-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-md-end{-webkit-align-self:flex-end!important;-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-md-center{-webkit-align-self:center!important;-ms-flex-item-align:center!important;-ms-grid-row-align:center!important;align-self:center!important}.align-self-md-baseline{-webkit-align-self:baseline!important;-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-md-stretch{-webkit-align-self:stretch!important;-ms-flex-item-align:stretch!important;-ms-grid-row-align:stretch!important;align-self:stretch!important}}@media (min-width:992px){.order-lg-first{-webkit-box-ordinal-group:0;-webkit-order:-1;-ms-flex-order:-1;order:-1}.order-lg-last{-webkit-box-ordinal-group:2;-webkit-order:1;-ms-flex-order:1;order:1}.order-lg-0{-webkit-box-ordinal-group:1;-webkit-order:0;-ms-flex-order:0;order:0}.flex-lg-row{-webkit-box-orient:horizontal!important;-webkit-box-direction:normal!important;-webkit-flex-direction:row!important;-ms-flex-direction:row!important;flex-direction:row!important}.flex-lg-column{-webkit-box-orient:vertical!important;-webkit-box-direction:normal!important;-webkit-flex-direction:column!important;-ms-flex-direction:column!important;flex-direction:column!important}.flex-lg-row-reverse{-webkit-box-orient:horizontal!important;-webkit-box-direction:reverse!important;-webkit-flex-direction:row-reverse!important;-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-lg-column-reverse{-webkit-box-orient:vertical!important;-webkit-box-direction:reverse!important;-webkit-flex-direction:column-reverse!important;-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-lg-wrap{-webkit-flex-wrap:wrap!important;-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-lg-nowrap{-webkit-flex-wrap:nowrap!important;-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-lg-wrap-reverse{-webkit-flex-wrap:wrap-reverse!important;-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.justify-content-lg-start{-webkit-box-pack:start!important;-webkit-justify-content:flex-start!important;-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-lg-end{-webkit-box-pack:end!important;-webkit-justify-content:flex-end!important;-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-lg-center{-webkit-box-pack:center!important;-webkit-justify-content:center!important;-ms-flex-pack:center!important;justify-content:center!important}.justify-content-lg-between{-webkit-box-pack:justify!important;-webkit-justify-content:space-between!important;-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-lg-around{-webkit-justify-content:space-around!important;-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-lg-start{-webkit-box-align:start!important;-webkit-align-items:flex-start!important;-ms-flex-align:start!important;align-items:flex-start!important}.align-items-lg-end{-webkit-box-align:end!important;-webkit-align-items:flex-end!important;-ms-flex-align:end!important;align-items:flex-end!important}.align-items-lg-center{-webkit-box-align:center!important;-webkit-align-items:center!important;-ms-flex-align:center!important;align-items:center!important}.align-items-lg-baseline{-webkit-box-align:baseline!important;-webkit-align-items:baseline!important;-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-lg-stretch{-webkit-box-align:stretch!important;-webkit-align-items:stretch!important;-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-lg-start{-webkit-align-content:flex-start!important;-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-lg-end{-webkit-align-content:flex-end!important;-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-lg-center{-webkit-align-content:center!important;-ms-flex-line-pack:center!important;align-content:center!important}.align-content-lg-between{-webkit-align-content:space-between!important;-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-lg-around{-webkit-align-content:space-around!important;-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-lg-stretch{-webkit-align-content:stretch!important;-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-lg-auto{-webkit-align-self:auto!important;-ms-flex-item-align:auto!important;-ms-grid-row-align:auto!important;align-self:auto!important}.align-self-lg-start{-webkit-align-self:flex-start!important;-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-lg-end{-webkit-align-self:flex-end!important;-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-lg-center{-webkit-align-self:center!important;-ms-flex-item-align:center!important;-ms-grid-row-align:center!important;align-self:center!important}.align-self-lg-baseline{-webkit-align-self:baseline!important;-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-lg-stretch{-webkit-align-self:stretch!important;-ms-flex-item-align:stretch!important;-ms-grid-row-align:stretch!important;align-self:stretch!important}}@media (min-width:1200px){.order-xl-first{-webkit-box-ordinal-group:0;-webkit-order:-1;-ms-flex-order:-1;order:-1}.order-xl-last{-webkit-box-ordinal-group:2;-webkit-order:1;-ms-flex-order:1;order:1}.order-xl-0{-webkit-box-ordinal-group:1;-webkit-order:0;-ms-flex-order:0;order:0}.flex-xl-row{-webkit-box-orient:horizontal!important;-webkit-box-direction:normal!important;-webkit-flex-direction:row!important;-ms-flex-direction:row!important;flex-direction:row!important}.flex-xl-column{-webkit-box-orient:vertical!important;-webkit-box-direction:normal!important;-webkit-flex-direction:column!important;-ms-flex-direction:column!important;flex-direction:column!important}.flex-xl-row-reverse{-webkit-box-orient:horizontal!important;-webkit-box-direction:reverse!important;-webkit-flex-direction:row-reverse!important;-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-xl-column-reverse{-webkit-box-orient:vertical!important;-webkit-box-direction:reverse!important;-webkit-flex-direction:column-reverse!important;-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-xl-wrap{-webkit-flex-wrap:wrap!important;-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-xl-nowrap{-webkit-flex-wrap:nowrap!important;-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-xl-wrap-reverse{-webkit-flex-wrap:wrap-reverse!important;-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.justify-content-xl-start{-webkit-box-pack:start!important;-webkit-justify-content:flex-start!important;-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-xl-end{-webkit-box-pack:end!important;-webkit-justify-content:flex-end!important;-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-xl-center{-webkit-box-pack:center!important;-webkit-justify-content:center!important;-ms-flex-pack:center!important;justify-content:center!important}.justify-content-xl-between{-webkit-box-pack:justify!important;-webkit-justify-content:space-between!important;-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-xl-around{-webkit-justify-content:space-around!important;-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-xl-start{-webkit-box-align:start!important;-webkit-align-items:flex-start!important;-ms-flex-align:start!important;align-items:flex-start!important}.align-items-xl-end{-webkit-box-align:end!important;-webkit-align-items:flex-end!important;-ms-flex-align:end!important;align-items:flex-end!important}.align-items-xl-center{-webkit-box-align:center!important;-webkit-align-items:center!important;-ms-flex-align:center!important;align-items:center!important}.align-items-xl-baseline{-webkit-box-align:baseline!important;-webkit-align-items:baseline!important;-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-xl-stretch{-webkit-box-align:stretch!important;-webkit-align-items:stretch!important;-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-xl-start{-webkit-align-content:flex-start!important;-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-xl-end{-webkit-align-content:flex-end!important;-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-xl-center{-webkit-align-content:center!important;-ms-flex-line-pack:center!important;align-content:center!important}.align-content-xl-between{-webkit-align-content:space-between!important;-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-xl-around{-webkit-align-content:space-around!important;-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-xl-stretch{-webkit-align-content:stretch!important;-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-xl-auto{-webkit-align-self:auto!important;-ms-flex-item-align:auto!important;-ms-grid-row-align:auto!important;align-self:auto!important}.align-self-xl-start{-webkit-align-self:flex-start!important;-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-xl-end{-webkit-align-self:flex-end!important;-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-xl-center{-webkit-align-self:center!important;-ms-flex-item-align:center!important;-ms-grid-row-align:center!important;align-self:center!important}.align-self-xl-baseline{-webkit-align-self:baseline!important;-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-xl-stretch{-webkit-align-self:stretch!important;-ms-flex-item-align:stretch!important;-ms-grid-row-align:stretch!important;align-self:stretch!important}}.float-left{float:left!important}.float-right{float:right!important}.float-none{float:none!important}@media (min-width:576px){.float-sm-left{float:left!important}.float-sm-right{float:right!important}.float-sm-none{float:none!important}}@media (min-width:768px){.float-md-left{float:left!important}.float-md-right{float:right!important}.float-md-none{float:none!important}}@media (min-width:992px){.float-lg-left{float:left!important}.float-lg-right{float:right!important}.float-lg-none{float:none!important}}@media (min-width:1200px){.float-xl-left{float:left!important}.float-xl-right{float:right!important}.float-xl-none{float:none!important}}.fixed-top{position:fixed;top:0;right:0;left:0;z-index:1030}.fixed-bottom{position:fixed;right:0;bottom:0;left:0;z-index:1030}.sticky-top{position:-webkit-sticky;position:sticky;top:0;z-index:1020}.sr-only{position:absolute;width:1px;height:1px;padding:0;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;-webkit-clip-path:inset(50%);clip-path:inset(50%);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;overflow:visible;clip:auto;white-space:normal;-webkit-clip-path:none;clip-path:none}.w-25{width:25%!important}.w-50{width:50%!important}.w-75{width:75%!important}.w-100{width:100%!important}.h-25{height:25%!important}.h-50{height:50%!important}.h-75{height:75%!important}.h-100{height:100%!important}.mw-100{max-width:100%!important}.mh-100{max-height:100%!important}.m-0{margin:0!important}.mt-0{margin-top:0!important}.mr-0{margin-right:0!important}.mb-0{margin-bottom:0!important}.ml-0{margin-left:0!important}.mx-0{margin-right:0!important;margin-left:0!important}.my-0{margin-top:0!important;margin-bottom:0!important}.m-1{margin:.25rem!important}.mt-1{margin-top:.25rem!important}.mr-1{margin-right:.25rem!important}.mb-1{margin-bottom:.25rem!important}.ml-1{margin-left:.25rem!important}.mx-1{margin-right:.25rem!important;margin-left:.25rem!important}.my-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.m-2{margin:.5rem!important}.mt-2{margin-top:.5rem!important}.mr-2{margin-right:.5rem!important}.mb-2{margin-bottom:.5rem!important}.ml-2{margin-left:.5rem!important}.mx-2{margin-right:.5rem!important;margin-left:.5rem!important}.my-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.m-3{margin:1rem!important}.mt-3{margin-top:1rem!important}.mr-3{margin-right:1rem!important}.mb-3{margin-bottom:1rem!important}.ml-3{margin-left:1rem!important}.mx-3{margin-right:1rem!important;margin-left:1rem!important}.my-3{margin-top:1rem!important;margin-bottom:1rem!important}.m-4{margin:1.5rem!important}.mt-4{margin-top:1.5rem!important}.mr-4{margin-right:1.5rem!important}.mb-4{margin-bottom:1.5rem!important}.ml-4{margin-left:1.5rem!important}.mx-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.my-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.m-5{margin:3rem!important}.mt-5{margin-top:3rem!important}.mr-5{margin-right:3rem!important}.mb-5{margin-bottom:3rem!important}.ml-5{margin-left:3rem!important}.mx-5{margin-right:3rem!important;margin-left:3rem!important}.my-5{margin-top:3rem!important;margin-bottom:3rem!important}.p-0{padding:0!important}.pt-0{padding-top:0!important}.pr-0{padding-right:0!important}.pb-0{padding-bottom:0!important}.pl-0{padding-left:0!important}.px-0{padding-right:0!important;padding-left:0!important}.py-0{padding-top:0!important;padding-bottom:0!important}.p-1{padding:.25rem!important}.pt-1{padding-top:.25rem!important}.pr-1{padding-right:.25rem!important}.pb-1{padding-bottom:.25rem!important}.pl-1{padding-left:.25rem!important}.px-1{padding-right:.25rem!important;padding-left:.25rem!important}.py-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.p-2{padding:.5rem!important}.pt-2{padding-top:.5rem!important}.pr-2{padding-right:.5rem!important}.pb-2{padding-bottom:.5rem!important}.pl-2{padding-left:.5rem!important}.px-2{padding-right:.5rem!important;padding-left:.5rem!important}.py-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.p-3{padding:1rem!important}.pt-3{padding-top:1rem!important}.pr-3{padding-right:1rem!important}.pb-3{padding-bottom:1rem!important}.pl-3{padding-left:1rem!important}.px-3{padding-right:1rem!important;padding-left:1rem!important}.py-3{padding-top:1rem!important;padding-bottom:1rem!important}.p-4{padding:1.5rem!important}.pt-4{padding-top:1.5rem!important}.pr-4{padding-right:1.5rem!important}.pb-4{padding-bottom:1.5rem!important}.pl-4{padding-left:1.5rem!important}.px-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.py-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.p-5{padding:3rem!important}.pt-5{padding-top:3rem!important}.pr-5{padding-right:3rem!important}.pb-5{padding-bottom:3rem!important}.pl-5{padding-left:3rem!important}.px-5{padding-right:3rem!important;padding-left:3rem!important}.py-5{padding-top:3rem!important;padding-bottom:3rem!important}.m-auto{margin:auto!important}.mt-auto{margin-top:auto!important}.mr-auto{margin-right:auto!important}.mb-auto{margin-bottom:auto!important}.ml-auto{margin-left:auto!important}.mx-auto{margin-right:auto!important;margin-left:auto!important}.my-auto{margin-top:auto!important;margin-bottom:auto!important}@media (min-width:576px){.m-sm-0{margin:0!important}.mt-sm-0{margin-top:0!important}.mr-sm-0{margin-right:0!important}.mb-sm-0{margin-bottom:0!important}.ml-sm-0{margin-left:0!important}.mx-sm-0{margin-right:0!important;margin-left:0!important}.my-sm-0{margin-top:0!important;margin-bottom:0!important}.m-sm-1{margin:.25rem!important}.mt-sm-1{margin-top:.25rem!important}.mr-sm-1{margin-right:.25rem!important}.mb-sm-1{margin-bottom:.25rem!important}.ml-sm-1{margin-left:.25rem!important}.mx-sm-1{margin-right:.25rem!important;margin-left:.25rem!important}.my-sm-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.m-sm-2{margin:.5rem!important}.mt-sm-2{margin-top:.5rem!important}.mr-sm-2{margin-right:.5rem!important}.mb-sm-2{margin-bottom:.5rem!important}.ml-sm-2{margin-left:.5rem!important}.mx-sm-2{margin-right:.5rem!important;margin-left:.5rem!important}.my-sm-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.m-sm-3{margin:1rem!important}.mt-sm-3{margin-top:1rem!important}.mr-sm-3{margin-right:1rem!important}.mb-sm-3{margin-bottom:1rem!important}.ml-sm-3{margin-left:1rem!important}.mx-sm-3{margin-right:1rem!important;margin-left:1rem!important}.my-sm-3{margin-top:1rem!important;margin-bottom:1rem!important}.m-sm-4{margin:1.5rem!important}.mt-sm-4{margin-top:1.5rem!important}.mr-sm-4{margin-right:1.5rem!important}.mb-sm-4{margin-bottom:1.5rem!important}.ml-sm-4{margin-left:1.5rem!important}.mx-sm-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.my-sm-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.m-sm-5{margin:3rem!important}.mt-sm-5{margin-top:3rem!important}.mr-sm-5{margin-right:3rem!important}.mb-sm-5{margin-bottom:3rem!important}.ml-sm-5{margin-left:3rem!important}.mx-sm-5{margin-right:3rem!important;margin-left:3rem!important}.my-sm-5{margin-top:3rem!important;margin-bottom:3rem!important}.p-sm-0{padding:0!important}.pt-sm-0{padding-top:0!important}.pr-sm-0{padding-right:0!important}.pb-sm-0{padding-bottom:0!important}.pl-sm-0{padding-left:0!important}.px-sm-0{padding-right:0!important;padding-left:0!important}.py-sm-0{padding-top:0!important;padding-bottom:0!important}.p-sm-1{padding:.25rem!important}.pt-sm-1{padding-top:.25rem!important}.pr-sm-1{padding-right:.25rem!important}.pb-sm-1{padding-bottom:.25rem!important}.pl-sm-1{padding-left:.25rem!important}.px-sm-1{padding-right:.25rem!important;padding-left:.25rem!important}.py-sm-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.p-sm-2{padding:.5rem!important}.pt-sm-2{padding-top:.5rem!important}.pr-sm-2{padding-right:.5rem!important}.pb-sm-2{padding-bottom:.5rem!important}.pl-sm-2{padding-left:.5rem!important}.px-sm-2{padding-right:.5rem!important;padding-left:.5rem!important}.py-sm-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.p-sm-3{padding:1rem!important}.pt-sm-3{padding-top:1rem!important}.pr-sm-3{padding-right:1rem!important}.pb-sm-3{padding-bottom:1rem!important}.pl-sm-3{padding-left:1rem!important}.px-sm-3{padding-right:1rem!important;padding-left:1rem!important}.py-sm-3{padding-top:1rem!important;padding-bottom:1rem!important}.p-sm-4{padding:1.5rem!important}.pt-sm-4{padding-top:1.5rem!important}.pr-sm-4{padding-right:1.5rem!important}.pb-sm-4{padding-bottom:1.5rem!important}.pl-sm-4{padding-left:1.5rem!important}.px-sm-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.py-sm-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.p-sm-5{padding:3rem!important}.pt-sm-5{padding-top:3rem!important}.pr-sm-5{padding-right:3rem!important}.pb-sm-5{padding-bottom:3rem!important}.pl-sm-5{padding-left:3rem!important}.px-sm-5{padding-right:3rem!important;padding-left:3rem!important}.py-sm-5{padding-top:3rem!important;padding-bottom:3rem!important}.m-sm-auto{margin:auto!important}.mt-sm-auto{margin-top:auto!important}.mr-sm-auto{margin-right:auto!important}.mb-sm-auto{margin-bottom:auto!important}.ml-sm-auto{margin-left:auto!important}.mx-sm-auto{margin-right:auto!important;margin-left:auto!important}.my-sm-auto{margin-top:auto!important;margin-bottom:auto!important}}@media (min-width:768px){.m-md-0{margin:0!important}.mt-md-0{margin-top:0!important}.mr-md-0{margin-right:0!important}.mb-md-0{margin-bottom:0!important}.ml-md-0{margin-left:0!important}.mx-md-0{margin-right:0!important;margin-left:0!important}.my-md-0{margin-top:0!important;margin-bottom:0!important}.m-md-1{margin:.25rem!important}.mt-md-1{margin-top:.25rem!important}.mr-md-1{margin-right:.25rem!important}.mb-md-1{margin-bottom:.25rem!important}.ml-md-1{margin-left:.25rem!important}.mx-md-1{margin-right:.25rem!important;margin-left:.25rem!important}.my-md-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.m-md-2{margin:.5rem!important}.mt-md-2{margin-top:.5rem!important}.mr-md-2{margin-right:.5rem!important}.mb-md-2{margin-bottom:.5rem!important}.ml-md-2{margin-left:.5rem!important}.mx-md-2{margin-right:.5rem!important;margin-left:.5rem!important}.my-md-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.m-md-3{margin:1rem!important}.mt-md-3{margin-top:1rem!important}.mr-md-3{margin-right:1rem!important}.mb-md-3{margin-bottom:1rem!important}.ml-md-3{margin-left:1rem!important}.mx-md-3{margin-right:1rem!important;margin-left:1rem!important}.my-md-3{margin-top:1rem!important;margin-bottom:1rem!important}.m-md-4{margin:1.5rem!important}.mt-md-4{margin-top:1.5rem!important}.mr-md-4{margin-right:1.5rem!important}.mb-md-4{margin-bottom:1.5rem!important}.ml-md-4{margin-left:1.5rem!important}.mx-md-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.my-md-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.m-md-5{margin:3rem!important}.mt-md-5{margin-top:3rem!important}.mr-md-5{margin-right:3rem!important}.mb-md-5{margin-bottom:3rem!important}.ml-md-5{margin-left:3rem!important}.mx-md-5{margin-right:3rem!important;margin-left:3rem!important}.my-md-5{margin-top:3rem!important;margin-bottom:3rem!important}.p-md-0{padding:0!important}.pt-md-0{padding-top:0!important}.pr-md-0{padding-right:0!important}.pb-md-0{padding-bottom:0!important}.pl-md-0{padding-left:0!important}.px-md-0{padding-right:0!important;padding-left:0!important}.py-md-0{padding-top:0!important;padding-bottom:0!important}.p-md-1{padding:.25rem!important}.pt-md-1{padding-top:.25rem!important}.pr-md-1{padding-right:.25rem!important}.pb-md-1{padding-bottom:.25rem!important}.pl-md-1{padding-left:.25rem!important}.px-md-1{padding-right:.25rem!important;padding-left:.25rem!important}.py-md-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.p-md-2{padding:.5rem!important}.pt-md-2{padding-top:.5rem!important}.pr-md-2{padding-right:.5rem!important}.pb-md-2{padding-bottom:.5rem!important}.pl-md-2{padding-left:.5rem!important}.px-md-2{padding-right:.5rem!important;padding-left:.5rem!important}.py-md-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.p-md-3{padding:1rem!important}.pt-md-3{padding-top:1rem!important}.pr-md-3{padding-right:1rem!important}.pb-md-3{padding-bottom:1rem!important}.pl-md-3{padding-left:1rem!important}.px-md-3{padding-right:1rem!important;padding-left:1rem!important}.py-md-3{padding-top:1rem!important;padding-bottom:1rem!important}.p-md-4{padding:1.5rem!important}.pt-md-4{padding-top:1.5rem!important}.pr-md-4{padding-right:1.5rem!important}.pb-md-4{padding-bottom:1.5rem!important}.pl-md-4{padding-left:1.5rem!important}.px-md-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.py-md-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.p-md-5{padding:3rem!important}.pt-md-5{padding-top:3rem!important}.pr-md-5{padding-right:3rem!important}.pb-md-5{padding-bottom:3rem!important}.pl-md-5{padding-left:3rem!important}.px-md-5{padding-right:3rem!important;padding-left:3rem!important}.py-md-5{padding-top:3rem!important;padding-bottom:3rem!important}.m-md-auto{margin:auto!important}.mt-md-auto{margin-top:auto!important}.mr-md-auto{margin-right:auto!important}.mb-md-auto{margin-bottom:auto!important}.ml-md-auto{margin-left:auto!important}.mx-md-auto{margin-right:auto!important;margin-left:auto!important}.my-md-auto{margin-top:auto!important;margin-bottom:auto!important}}@media (min-width:992px){.m-lg-0{margin:0!important}.mt-lg-0{margin-top:0!important}.mr-lg-0{margin-right:0!important}.mb-lg-0{margin-bottom:0!important}.ml-lg-0{margin-left:0!important}.mx-lg-0{margin-right:0!important;margin-left:0!important}.my-lg-0{margin-top:0!important;margin-bottom:0!important}.m-lg-1{margin:.25rem!important}.mt-lg-1{margin-top:.25rem!important}.mr-lg-1{margin-right:.25rem!important}.mb-lg-1{margin-bottom:.25rem!important}.ml-lg-1{margin-left:.25rem!important}.mx-lg-1{margin-right:.25rem!important;margin-left:.25rem!important}.my-lg-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.m-lg-2{margin:.5rem!important}.mt-lg-2{margin-top:.5rem!important}.mr-lg-2{margin-right:.5rem!important}.mb-lg-2{margin-bottom:.5rem!important}.ml-lg-2{margin-left:.5rem!important}.mx-lg-2{margin-right:.5rem!important;margin-left:.5rem!important}.my-lg-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.m-lg-3{margin:1rem!important}.mt-lg-3{margin-top:1rem!important}.mr-lg-3{margin-right:1rem!important}.mb-lg-3{margin-bottom:1rem!important}.ml-lg-3{margin-left:1rem!important}.mx-lg-3{margin-right:1rem!important;margin-left:1rem!important}.my-lg-3{margin-top:1rem!important;margin-bottom:1rem!important}.m-lg-4{margin:1.5rem!important}.mt-lg-4{margin-top:1.5rem!important}.mr-lg-4{margin-right:1.5rem!important}.mb-lg-4{margin-bottom:1.5rem!important}.ml-lg-4{margin-left:1.5rem!important}.mx-lg-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.my-lg-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.m-lg-5{margin:3rem!important}.mt-lg-5{margin-top:3rem!important}.mr-lg-5{margin-right:3rem!important}.mb-lg-5{margin-bottom:3rem!important}.ml-lg-5{margin-left:3rem!important}.mx-lg-5{margin-right:3rem!important;margin-left:3rem!important}.my-lg-5{margin-top:3rem!important;margin-bottom:3rem!important}.p-lg-0{padding:0!important}.pt-lg-0{padding-top:0!important}.pr-lg-0{padding-right:0!important}.pb-lg-0{padding-bottom:0!important}.pl-lg-0{padding-left:0!important}.px-lg-0{padding-right:0!important;padding-left:0!important}.py-lg-0{padding-top:0!important;padding-bottom:0!important}.p-lg-1{padding:.25rem!important}.pt-lg-1{padding-top:.25rem!important}.pr-lg-1{padding-right:.25rem!important}.pb-lg-1{padding-bottom:.25rem!important}.pl-lg-1{padding-left:.25rem!important}.px-lg-1{padding-right:.25rem!important;padding-left:.25rem!important}.py-lg-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.p-lg-2{padding:.5rem!important}.pt-lg-2{padding-top:.5rem!important}.pr-lg-2{padding-right:.5rem!important}.pb-lg-2{padding-bottom:.5rem!important}.pl-lg-2{padding-left:.5rem!important}.px-lg-2{padding-right:.5rem!important;padding-left:.5rem!important}.py-lg-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.p-lg-3{padding:1rem!important}.pt-lg-3{padding-top:1rem!important}.pr-lg-3{padding-right:1rem!important}.pb-lg-3{padding-bottom:1rem!important}.pl-lg-3{padding-left:1rem!important}.px-lg-3{padding-right:1rem!important;padding-left:1rem!important}.py-lg-3{padding-top:1rem!important;padding-bottom:1rem!important}.p-lg-4{padding:1.5rem!important}.pt-lg-4{padding-top:1.5rem!important}.pr-lg-4{padding-right:1.5rem!important}.pb-lg-4{padding-bottom:1.5rem!important}.pl-lg-4{padding-left:1.5rem!important}.px-lg-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.py-lg-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.p-lg-5{padding:3rem!important}.pt-lg-5{padding-top:3rem!important}.pr-lg-5{padding-right:3rem!important}.pb-lg-5{padding-bottom:3rem!important}.pl-lg-5{padding-left:3rem!important}.px-lg-5{padding-right:3rem!important;padding-left:3rem!important}.py-lg-5{padding-top:3rem!important;padding-bottom:3rem!important}.m-lg-auto{margin:auto!important}.mt-lg-auto{margin-top:auto!important}.mr-lg-auto{margin-right:auto!important}.mb-lg-auto{margin-bottom:auto!important}.ml-lg-auto{margin-left:auto!important}.mx-lg-auto{margin-right:auto!important;margin-left:auto!important}.my-lg-auto{margin-top:auto!important;margin-bottom:auto!important}}@media (min-width:1200px){.m-xl-0{margin:0!important}.mt-xl-0{margin-top:0!important}.mr-xl-0{margin-right:0!important}.mb-xl-0{margin-bottom:0!important}.ml-xl-0{margin-left:0!important}.mx-xl-0{margin-right:0!important;margin-left:0!important}.my-xl-0{margin-top:0!important;margin-bottom:0!important}.m-xl-1{margin:.25rem!important}.mt-xl-1{margin-top:.25rem!important}.mr-xl-1{margin-right:.25rem!important}.mb-xl-1{margin-bottom:.25rem!important}.ml-xl-1{margin-left:.25rem!important}.mx-xl-1{margin-right:.25rem!important;margin-left:.25rem!important}.my-xl-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.m-xl-2{margin:.5rem!important}.mt-xl-2{margin-top:.5rem!important}.mr-xl-2{margin-right:.5rem!important}.mb-xl-2{margin-bottom:.5rem!important}.ml-xl-2{margin-left:.5rem!important}.mx-xl-2{margin-right:.5rem!important;margin-left:.5rem!important}.my-xl-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.m-xl-3{margin:1rem!important}.mt-xl-3{margin-top:1rem!important}.mr-xl-3{margin-right:1rem!important}.mb-xl-3{margin-bottom:1rem!important}.ml-xl-3{margin-left:1rem!important}.mx-xl-3{margin-right:1rem!important;margin-left:1rem!important}.my-xl-3{margin-top:1rem!important;margin-bottom:1rem!important}.m-xl-4{margin:1.5rem!important}.mt-xl-4{margin-top:1.5rem!important}.mr-xl-4{margin-right:1.5rem!important}.mb-xl-4{margin-bottom:1.5rem!important}.ml-xl-4{margin-left:1.5rem!important}.mx-xl-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.my-xl-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.m-xl-5{margin:3rem!important}.mt-xl-5{margin-top:3rem!important}.mr-xl-5{margin-right:3rem!important}.mb-xl-5{margin-bottom:3rem!important}.ml-xl-5{margin-left:3rem!important}.mx-xl-5{margin-right:3rem!important;margin-left:3rem!important}.my-xl-5{margin-top:3rem!important;margin-bottom:3rem!important}.p-xl-0{padding:0!important}.pt-xl-0{padding-top:0!important}.pr-xl-0{padding-right:0!important}.pb-xl-0{padding-bottom:0!important}.pl-xl-0{padding-left:0!important}.px-xl-0{padding-right:0!important;padding-left:0!important}.py-xl-0{padding-top:0!important;padding-bottom:0!important}.p-xl-1{padding:.25rem!important}.pt-xl-1{padding-top:.25rem!important}.pr-xl-1{padding-right:.25rem!important}.pb-xl-1{padding-bottom:.25rem!important}.pl-xl-1{padding-left:.25rem!important}.px-xl-1{padding-right:.25rem!important;padding-left:.25rem!important}.py-xl-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.p-xl-2{padding:.5rem!important}.pt-xl-2{padding-top:.5rem!important}.pr-xl-2{padding-right:.5rem!important}.pb-xl-2{padding-bottom:.5rem!important}.pl-xl-2{padding-left:.5rem!important}.px-xl-2{padding-right:.5rem!important;padding-left:.5rem!important}.py-xl-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.p-xl-3{padding:1rem!important}.pt-xl-3{padding-top:1rem!important}.pr-xl-3{padding-right:1rem!important}.pb-xl-3{padding-bottom:1rem!important}.pl-xl-3{padding-left:1rem!important}.px-xl-3{padding-right:1rem!important;padding-left:1rem!important}.py-xl-3{padding-top:1rem!important;padding-bottom:1rem!important}.p-xl-4{padding:1.5rem!important}.pt-xl-4{padding-top:1.5rem!important}.pr-xl-4{padding-right:1.5rem!important}.pb-xl-4{padding-bottom:1.5rem!important}.pl-xl-4{padding-left:1.5rem!important}.px-xl-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.py-xl-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.p-xl-5{padding:3rem!important}.pt-xl-5{padding-top:3rem!important}.pr-xl-5{padding-right:3rem!important}.pb-xl-5{padding-bottom:3rem!important}.pl-xl-5{padding-left:3rem!important}.px-xl-5{padding-right:3rem!important;padding-left:3rem!important}.py-xl-5{padding-top:3rem!important;padding-bottom:3rem!important}.m-xl-auto{margin:auto!important}.mt-xl-auto{margin-top:auto!important}.mr-xl-auto{margin-right:auto!important}.mb-xl-auto{margin-bottom:auto!important}.ml-xl-auto{margin-left:auto!important}.mx-xl-auto{margin-right:auto!important;margin-left:auto!important}.my-xl-auto{margin-top:auto!important;margin-bottom:auto!important}}.text-justify{text-align:justify!important}.text-nowrap{white-space:nowrap!important}.text-truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.text-left{text-align:left!important}.text-right{text-align:right!important}.text-center{text-align:center!important}@media (min-width:576px){.text-sm-left{text-align:left!important}.text-sm-right{text-align:right!important}.text-sm-center{text-align:center!important}}@media (min-width:768px){.text-md-left{text-align:left!important}.text-md-right{text-align:right!important}.text-md-center{text-align:center!important}}@media (min-width:992px){.text-lg-left{text-align:left!important}.text-lg-right{text-align:right!important}.text-lg-center{text-align:center!important}}@media (min-width:1200px){.text-xl-left{text-align:left!important}.text-xl-right{text-align:right!important}.text-xl-center{text-align:center!important}}.text-lowercase{text-transform:lowercase!important}.text-uppercase{text-transform:uppercase!important}.text-capitalize{text-transform:capitalize!important}.font-weight-normal{font-weight:400}.font-weight-bold{font-weight:700}.font-italic{font-style:italic}.text-white{color:#fff!important}.text-muted{color:#636c72!important}a.text-muted:focus,a.text-muted:hover{color:#4b5257!important}.text-primary{color:#0275d8!important}a.text-primary:focus,a.text-primary:hover{color:#025aa5!important}.text-success{color:#5cb85c!important}a.text-success:focus,a.text-success:hover{color:#449d44!important}.text-info{color:#5bc0de!important}a.text-info:focus,a.text-info:hover{color:#31b0d5!important}.text-warning{color:#f0ad4e!important}a.text-warning:focus,a.text-warning:hover{color:#ec971f!important}.text-danger{color:#d9534f!important}a.text-danger:focus,a.text-danger:hover{color:#c9302c!important}.text-gray-dark{color:#292b2c!important}a.text-gray-dark:focus,a.text-gray-dark:hover{color:#101112!important}.text-hide{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.visible{visibility:visible!important}.invisible{visibility:hidden!important}/*# sourceMappingURL=bootstrap.min.css.map */ \ No newline at end of file
+ */@media print{*,::after,::before{text-shadow:none!important;box-shadow:none!important}a,a:visited{text-decoration:underline}abbr[title]::after{content:" (" attr(title) ")"}pre{white-space:pre-wrap!important}blockquote,pre{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}img,tr{page-break-inside:avoid}h2,h3,p{orphans:3;widows:3}h2,h3{page-break-after:avoid}.navbar{display:none}.badge{border:1px solid #000}.table{border-collapse:collapse!important}.table td,.table th{background-color:#fff!important}.table-bordered td,.table-bordered th{border:1px solid #ddd!important}}html{box-sizing:border-box;font-family:sans-serif;line-height:1.15;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%;-ms-overflow-style:scrollbar;-webkit-tap-highlight-color:transparent}*,::after,::before{box-sizing:inherit}@-ms-viewport{width:device-width}article,aside,dialog,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}body{margin:0;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif;font-size:1rem;font-weight:400;line-height:1.5;color:#212529;background-color:#fff}[tabindex="-1"]:focus{outline:0!important}hr{box-sizing:content-box;height:0;overflow:visible}h1,h2,h3,h4,h5,h6{margin-top:0;margin-bottom:.5rem}p{margin-top:0;margin-bottom:1rem}abbr[data-original-title],abbr[title]{text-decoration:underline;-webkit-text-decoration:underline dotted;text-decoration:underline dotted;cursor:help;border-bottom:0}address{margin-bottom:1rem;font-style:normal;line-height:inherit}dl,ol,ul{margin-top:0;margin-bottom:1rem}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}dt{font-weight:700}dd{margin-bottom:.5rem;margin-left:0}blockquote{margin:0 0 1rem}dfn{font-style:italic}b,strong{font-weight:bolder}small{font-size:80%}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}a{color:#007bff;text-decoration:none;background-color:transparent;-webkit-text-decoration-skip:objects}a:hover{color:#0056b3;text-decoration:underline}a:not([href]):not([tabindex]){color:inherit;text-decoration:none}a:not([href]):not([tabindex]):focus,a:not([href]):not([tabindex]):hover{color:inherit;text-decoration:none}a:not([href]):not([tabindex]):focus{outline:0}code,kbd,pre,samp{font-family:monospace,monospace;font-size:1em}pre{margin-top:0;margin-bottom:1rem;overflow:auto}figure{margin:0 0 1rem}img{vertical-align:middle;border-style:none}svg:not(:root){overflow:hidden}[role=button],a,area,button,input,label,select,summary,textarea{-ms-touch-action:manipulation;touch-action:manipulation}table{border-collapse:collapse}caption{padding-top:.75rem;padding-bottom:.75rem;color:#868e96;text-align:left;caption-side:bottom}th{text-align:left}label{display:inline-block;margin-bottom:.5rem}button:focus{outline:1px dotted;outline:5px auto -webkit-focus-ring-color}button,input,optgroup,select,textarea{margin:0;font-family:inherit;font-size:inherit;line-height:inherit}button,input{overflow:visible}button,select{text-transform:none}[type=reset],[type=submit],button,html [type=button]{-webkit-appearance:button}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{padding:0;border-style:none}input[type=checkbox],input[type=radio]{box-sizing:border-box;padding:0}input[type=date],input[type=datetime-local],input[type=month],input[type=time]{-webkit-appearance:listbox}textarea{overflow:auto;resize:vertical}fieldset{min-width:0;padding:0;margin:0;border:0}legend{display:block;width:100%;max-width:100%;padding:0;margin-bottom:.5rem;font-size:1.5rem;line-height:inherit;color:inherit;white-space:normal}progress{vertical-align:baseline}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{outline-offset:-2px;-webkit-appearance:none}[type=search]::-webkit-search-cancel-button,[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{font:inherit;-webkit-appearance:button}output{display:inline-block}summary{display:list-item}template{display:none}[hidden]{display:none!important}.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{margin-bottom:.5rem;font-family:inherit;font-weight:500;line-height:1.1;color:inherit}.h1,h1{font-size:2.5rem}.h2,h2{font-size:2rem}.h3,h3{font-size:1.75rem}.h4,h4{font-size:1.5rem}.h5,h5{font-size:1.25rem}.h6,h6{font-size:1rem}.lead{font-size:1.25rem;font-weight:300}.display-1{font-size:6rem;font-weight:300;line-height:1.1}.display-2{font-size:5.5rem;font-weight:300;line-height:1.1}.display-3{font-size:4.5rem;font-weight:300;line-height:1.1}.display-4{font-size:3.5rem;font-weight:300;line-height:1.1}hr{margin-top:1rem;margin-bottom:1rem;border:0;border-top:1px solid rgba(0,0,0,.1)}.small,small{font-size:80%;font-weight:400}.mark,mark{padding:.2em;background-color:#fcf8e3}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;list-style:none}.list-inline-item{display:inline-block}.list-inline-item:not(:last-child){margin-right:5px}.initialism{font-size:90%;text-transform:uppercase}.blockquote{margin-bottom:1rem;font-size:1.25rem}.blockquote-footer{display:block;font-size:80%;color:#868e96}.blockquote-footer::before{content:"\2014 \00A0"}.img-fluid{max-width:100%;height:auto}.img-thumbnail{padding:.25rem;background-color:#fff;border:1px solid #ddd;border-radius:.25rem;transition:all .2s ease-in-out;max-width:100%;height:auto}.figure{display:inline-block}.figure-img{margin-bottom:.5rem;line-height:1}.figure-caption{font-size:90%;color:#868e96}code,kbd,pre,samp{font-family:Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace}code{padding:.2rem .4rem;font-size:90%;color:#bd4147;background-color:#f8f9fa;border-radius:.25rem}a>code{padding:0;color:inherit;background-color:inherit}kbd{padding:.2rem .4rem;font-size:90%;color:#fff;background-color:#212529;border-radius:.2rem}kbd kbd{padding:0;font-size:100%;font-weight:700}pre{display:block;margin-top:0;margin-bottom:1rem;font-size:90%;color:#212529}pre code{padding:0;font-size:inherit;color:inherit;background-color:transparent;border-radius:0}.pre-scrollable{max-height:340px;overflow-y:scroll}.container{margin-right:auto;margin-left:auto;padding-right:15px;padding-left:15px;width:100%}@media (min-width:576px){.container{max-width:540px}}@media (min-width:768px){.container{max-width:720px}}@media (min-width:992px){.container{max-width:960px}}@media (min-width:1200px){.container{max-width:1140px}}.container-fluid{width:100%;margin-right:auto;margin-left:auto;padding-right:15px;padding-left:15px;width:100%}.row{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;margin-right:-15px;margin-left:-15px}.no-gutters{margin-right:0;margin-left:0}.no-gutters>.col,.no-gutters>[class*=col-]{padding-right:0;padding-left:0}.col,.col-1,.col-10,.col-11,.col-12,.col-2,.col-3,.col-4,.col-5,.col-6,.col-7,.col-8,.col-9,.col-auto,.col-lg,.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.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-auto,.col-md,.col-md-1,.col-md-10,.col-md-11,.col-md-12,.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-auto,.col-sm,.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.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-auto,.col-xl,.col-xl-1,.col-xl-10,.col-xl-11,.col-xl-12,.col-xl-2,.col-xl-3,.col-xl-4,.col-xl-5,.col-xl-6,.col-xl-7,.col-xl-8,.col-xl-9,.col-xl-auto{position:relative;width:100%;min-height:1px;padding-right:15px;padding-left:15px}.col{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:none}.col-1{-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-2{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-3{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-4{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-5{-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-6{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-7{-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-8{-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-9{-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-10{-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-11{-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-12{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-1{-ms-flex-order:1;order:1}.order-2{-ms-flex-order:2;order:2}.order-3{-ms-flex-order:3;order:3}.order-4{-ms-flex-order:4;order:4}.order-5{-ms-flex-order:5;order:5}.order-6{-ms-flex-order:6;order:6}.order-7{-ms-flex-order:7;order:7}.order-8{-ms-flex-order:8;order:8}.order-9{-ms-flex-order:9;order:9}.order-10{-ms-flex-order:10;order:10}.order-11{-ms-flex-order:11;order:11}.order-12{-ms-flex-order:12;order:12}@media (min-width:576px){.col-sm{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-sm-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:none}.col-sm-1{-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-sm-2{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-sm-3{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-sm-4{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-sm-5{-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-sm-6{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-sm-7{-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-sm-8{-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-sm-9{-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-sm-10{-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-sm-11{-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-sm-12{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-sm-1{-ms-flex-order:1;order:1}.order-sm-2{-ms-flex-order:2;order:2}.order-sm-3{-ms-flex-order:3;order:3}.order-sm-4{-ms-flex-order:4;order:4}.order-sm-5{-ms-flex-order:5;order:5}.order-sm-6{-ms-flex-order:6;order:6}.order-sm-7{-ms-flex-order:7;order:7}.order-sm-8{-ms-flex-order:8;order:8}.order-sm-9{-ms-flex-order:9;order:9}.order-sm-10{-ms-flex-order:10;order:10}.order-sm-11{-ms-flex-order:11;order:11}.order-sm-12{-ms-flex-order:12;order:12}}@media (min-width:768px){.col-md{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-md-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:none}.col-md-1{-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-md-2{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-md-3{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-md-4{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-md-5{-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-md-6{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-md-7{-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-md-8{-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-md-9{-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-md-10{-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-md-11{-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-md-12{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-md-1{-ms-flex-order:1;order:1}.order-md-2{-ms-flex-order:2;order:2}.order-md-3{-ms-flex-order:3;order:3}.order-md-4{-ms-flex-order:4;order:4}.order-md-5{-ms-flex-order:5;order:5}.order-md-6{-ms-flex-order:6;order:6}.order-md-7{-ms-flex-order:7;order:7}.order-md-8{-ms-flex-order:8;order:8}.order-md-9{-ms-flex-order:9;order:9}.order-md-10{-ms-flex-order:10;order:10}.order-md-11{-ms-flex-order:11;order:11}.order-md-12{-ms-flex-order:12;order:12}}@media (min-width:992px){.col-lg{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-lg-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:none}.col-lg-1{-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-lg-2{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-lg-3{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-lg-4{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-lg-5{-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-lg-6{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-lg-7{-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-lg-8{-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-lg-9{-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-lg-10{-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-lg-11{-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-lg-12{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-lg-1{-ms-flex-order:1;order:1}.order-lg-2{-ms-flex-order:2;order:2}.order-lg-3{-ms-flex-order:3;order:3}.order-lg-4{-ms-flex-order:4;order:4}.order-lg-5{-ms-flex-order:5;order:5}.order-lg-6{-ms-flex-order:6;order:6}.order-lg-7{-ms-flex-order:7;order:7}.order-lg-8{-ms-flex-order:8;order:8}.order-lg-9{-ms-flex-order:9;order:9}.order-lg-10{-ms-flex-order:10;order:10}.order-lg-11{-ms-flex-order:11;order:11}.order-lg-12{-ms-flex-order:12;order:12}}@media (min-width:1200px){.col-xl{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-xl-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:none}.col-xl-1{-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-xl-2{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-xl-3{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-xl-4{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-xl-5{-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-xl-6{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-xl-7{-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-xl-8{-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-xl-9{-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-xl-10{-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-xl-11{-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-xl-12{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-xl-1{-ms-flex-order:1;order:1}.order-xl-2{-ms-flex-order:2;order:2}.order-xl-3{-ms-flex-order:3;order:3}.order-xl-4{-ms-flex-order:4;order:4}.order-xl-5{-ms-flex-order:5;order:5}.order-xl-6{-ms-flex-order:6;order:6}.order-xl-7{-ms-flex-order:7;order:7}.order-xl-8{-ms-flex-order:8;order:8}.order-xl-9{-ms-flex-order:9;order:9}.order-xl-10{-ms-flex-order:10;order:10}.order-xl-11{-ms-flex-order:11;order:11}.order-xl-12{-ms-flex-order:12;order:12}}.table{width:100%;max-width:100%;margin-bottom:1rem;background-color:transparent}.table td,.table th{padding:.75rem;vertical-align:top;border-top:1px solid #e9ecef}.table thead th{vertical-align:bottom;border-bottom:2px solid #e9ecef}.table tbody+tbody{border-top:2px solid #e9ecef}.table .table{background-color:#fff}.table-sm td,.table-sm th{padding:.3rem}.table-bordered{border:1px solid #e9ecef}.table-bordered td,.table-bordered th{border:1px solid #e9ecef}.table-bordered thead td,.table-bordered thead th{border-bottom-width:2px}.table-striped tbody tr:nth-of-type(odd){background-color:rgba(0,0,0,.05)}.table-hover tbody tr:hover{background-color:rgba(0,0,0,.075)}.table-primary,.table-primary>td,.table-primary>th{background-color:#b8daff}.table-hover .table-primary:hover{background-color:#9fcdff}.table-hover .table-primary:hover>td,.table-hover .table-primary:hover>th{background-color:#9fcdff}.table-secondary,.table-secondary>td,.table-secondary>th{background-color:#dddfe2}.table-hover .table-secondary:hover{background-color:#cfd2d6}.table-hover .table-secondary:hover>td,.table-hover .table-secondary:hover>th{background-color:#cfd2d6}.table-success,.table-success>td,.table-success>th{background-color:#c3e6cb}.table-hover .table-success:hover{background-color:#b1dfbb}.table-hover .table-success:hover>td,.table-hover .table-success:hover>th{background-color:#b1dfbb}.table-info,.table-info>td,.table-info>th{background-color:#bee5eb}.table-hover .table-info:hover{background-color:#abdde5}.table-hover .table-info:hover>td,.table-hover .table-info:hover>th{background-color:#abdde5}.table-warning,.table-warning>td,.table-warning>th{background-color:#ffeeba}.table-hover .table-warning:hover{background-color:#ffe8a1}.table-hover .table-warning:hover>td,.table-hover .table-warning:hover>th{background-color:#ffe8a1}.table-danger,.table-danger>td,.table-danger>th{background-color:#f5c6cb}.table-hover .table-danger:hover{background-color:#f1b0b7}.table-hover .table-danger:hover>td,.table-hover .table-danger:hover>th{background-color:#f1b0b7}.table-light,.table-light>td,.table-light>th{background-color:#fdfdfe}.table-hover .table-light:hover{background-color:#ececf6}.table-hover .table-light:hover>td,.table-hover .table-light:hover>th{background-color:#ececf6}.table-dark,.table-dark>td,.table-dark>th{background-color:#c6c8ca}.table-hover .table-dark:hover{background-color:#b9bbbe}.table-hover .table-dark:hover>td,.table-hover .table-dark:hover>th{background-color:#b9bbbe}.table-active,.table-active>td,.table-active>th{background-color:rgba(0,0,0,.075)}.table-hover .table-active:hover{background-color:rgba(0,0,0,.075)}.table-hover .table-active:hover>td,.table-hover .table-active:hover>th{background-color:rgba(0,0,0,.075)}.thead-inverse th{color:#fff;background-color:#212529}.thead-default th{color:#495057;background-color:#e9ecef}.table-inverse{color:#fff;background-color:#212529}.table-inverse td,.table-inverse th,.table-inverse thead th{border-color:#32383e}.table-inverse.table-bordered{border:0}.table-inverse.table-striped tbody tr:nth-of-type(odd){background-color:rgba(255,255,255,.05)}.table-inverse.table-hover tbody tr:hover{background-color:rgba(255,255,255,.075)}@media (max-width:991px){.table-responsive{display:block;width:100%;overflow-x:auto;-ms-overflow-style:-ms-autohiding-scrollbar}.table-responsive.table-bordered{border:0}}.form-control{display:block;width:100%;padding:.5rem .75rem;font-size:1rem;line-height:1.25;color:#495057;background-color:#fff;background-image:none;background-clip:padding-box;border:1px solid rgba(0,0,0,.15);border-radius:.25rem;transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s}.form-control::-ms-expand{background-color:transparent;border:0}.form-control:focus{color:#495057;background-color:#fff;border-color:#80bdff;outline:0}.form-control::-webkit-input-placeholder{color:#868e96;opacity:1}.form-control:-ms-input-placeholder{color:#868e96;opacity:1}.form-control::placeholder{color:#868e96;opacity:1}.form-control:disabled,.form-control[readonly]{background-color:#e9ecef;opacity:1}select.form-control:not([size]):not([multiple]){height:calc(2.25rem + 2px)}select.form-control:focus::-ms-value{color:#495057;background-color:#fff}.form-control-file,.form-control-range{display:block}.col-form-label{padding-top:calc(.5rem - 1px * 2);padding-bottom:calc(.5rem - 1px * 2);margin-bottom:0}.col-form-label-lg{padding-top:calc(.5rem - 1px * 2);padding-bottom:calc(.5rem - 1px * 2);font-size:1.25rem}.col-form-label-sm{padding-top:calc(.25rem - 1px * 2);padding-bottom:calc(.25rem - 1px * 2);font-size:.875rem}.col-form-legend{padding-top:.5rem;padding-bottom:.5rem;margin-bottom:0;font-size:1rem}.form-control-plaintext{padding-top:.5rem;padding-bottom:.5rem;margin-bottom:0;line-height:1.25;border:solid transparent;border-width:1px 0}.form-control-plaintext.form-control-lg,.form-control-plaintext.form-control-sm,.input-group-lg>.form-control-plaintext.form-control,.input-group-lg>.form-control-plaintext.input-group-addon,.input-group-lg>.input-group-btn>.form-control-plaintext.btn,.input-group-sm>.form-control-plaintext.form-control,.input-group-sm>.form-control-plaintext.input-group-addon,.input-group-sm>.input-group-btn>.form-control-plaintext.btn{padding-right:0;padding-left:0}.form-control-sm,.input-group-sm>.form-control,.input-group-sm>.input-group-addon,.input-group-sm>.input-group-btn>.btn{padding:.25rem .5rem;font-size:.875rem;line-height:1.5;border-radius:.2rem}.input-group-sm>.input-group-btn>select.btn:not([size]):not([multiple]),.input-group-sm>select.form-control:not([size]):not([multiple]),.input-group-sm>select.input-group-addon:not([size]):not([multiple]),select.form-control-sm:not([size]):not([multiple]){height:calc(1.8125rem + 2px)}.form-control-lg,.input-group-lg>.form-control,.input-group-lg>.input-group-addon,.input-group-lg>.input-group-btn>.btn{padding:.5rem 1rem;font-size:1.25rem;line-height:1.5;border-radius:.3rem}.input-group-lg>.input-group-btn>select.btn:not([size]):not([multiple]),.input-group-lg>select.form-control:not([size]):not([multiple]),.input-group-lg>select.input-group-addon:not([size]):not([multiple]),select.form-control-lg:not([size]):not([multiple]){height:calc(2.3125rem + 2px)}.form-group{margin-bottom:1rem}.form-text{display:block;margin-top:.25rem}.form-row{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;margin-right:-5px;margin-left:-5px}.form-row>.col,.form-row>[class*=col-]{padding-right:5px;padding-left:5px}.form-check{position:relative;display:block;margin-bottom:.5rem}.form-check.disabled .form-check-label{color:#868e96}.form-check-label{padding-left:1.25rem;margin-bottom:0}.form-check-input{position:absolute;margin-top:.25rem;margin-left:-1.25rem}.form-check-input:only-child{position:static}.form-check-inline{display:inline-block}.form-check-inline .form-check-label{vertical-align:middle}.form-check-inline+.form-check-inline{margin-left:.75rem}.invalid-feedback{display:none;margin-top:.25rem;font-size:.875rem;color:#dc3545}.invalid-tooltip{position:absolute;top:100%;z-index:5;display:none;width:250px;padding:.5rem;margin-top:.1rem;font-size:.875rem;line-height:1;color:#fff;background-color:rgba(220,53,69,.8);border-radius:.2rem}.custom-select.is-valid,.form-control.is-valid,.was-validated .custom-select:valid,.was-validated .form-control:valid{border-color:#28a745}.custom-select.is-valid:focus,.form-control.is-valid:focus,.was-validated .custom-select:valid:focus,.was-validated .form-control:valid:focus{box-shadow:0 0 0 .2rem rgba(40,167,69,.25)}.custom-select.is-valid~.invalid-feedback,.custom-select.is-valid~.invalid-tooltip,.form-control.is-valid~.invalid-feedback,.form-control.is-valid~.invalid-tooltip,.was-validated .custom-select:valid~.invalid-feedback,.was-validated .custom-select:valid~.invalid-tooltip,.was-validated .form-control:valid~.invalid-feedback,.was-validated .form-control:valid~.invalid-tooltip{display:block}.form-check-input.is-valid+.form-check-label,.was-validated .form-check-input:valid+.form-check-label{color:#28a745}.custom-control-input.is-valid~.custom-control-indicator,.was-validated .custom-control-input:valid~.custom-control-indicator{background-color:rgba(40,167,69,.25)}.custom-control-input.is-valid~.custom-control-description,.was-validated .custom-control-input:valid~.custom-control-description{color:#28a745}.custom-file-input.is-valid~.custom-file-control,.was-validated .custom-file-input:valid~.custom-file-control{border-color:#28a745}.custom-file-input.is-valid~.custom-file-control::before,.was-validated .custom-file-input:valid~.custom-file-control::before{border-color:inherit}.custom-file-input.is-valid:focus,.was-validated .custom-file-input:valid:focus{box-shadow:0 0 0 .2rem rgba(40,167,69,.25)}.custom-select.is-invalid,.form-control.is-invalid,.was-validated .custom-select:invalid,.was-validated .form-control:invalid{border-color:#dc3545}.custom-select.is-invalid:focus,.form-control.is-invalid:focus,.was-validated .custom-select:invalid:focus,.was-validated .form-control:invalid:focus{box-shadow:0 0 0 .2rem rgba(220,53,69,.25)}.custom-select.is-invalid~.invalid-feedback,.custom-select.is-invalid~.invalid-tooltip,.form-control.is-invalid~.invalid-feedback,.form-control.is-invalid~.invalid-tooltip,.was-validated .custom-select:invalid~.invalid-feedback,.was-validated .custom-select:invalid~.invalid-tooltip,.was-validated .form-control:invalid~.invalid-feedback,.was-validated .form-control:invalid~.invalid-tooltip{display:block}.form-check-input.is-invalid+.form-check-label,.was-validated .form-check-input:invalid+.form-check-label{color:#dc3545}.custom-control-input.is-invalid~.custom-control-indicator,.was-validated .custom-control-input:invalid~.custom-control-indicator{background-color:rgba(220,53,69,.25)}.custom-control-input.is-invalid~.custom-control-description,.was-validated .custom-control-input:invalid~.custom-control-description{color:#dc3545}.custom-file-input.is-invalid~.custom-file-control,.was-validated .custom-file-input:invalid~.custom-file-control{border-color:#dc3545}.custom-file-input.is-invalid~.custom-file-control::before,.was-validated .custom-file-input:invalid~.custom-file-control::before{border-color:inherit}.custom-file-input.is-invalid:focus,.was-validated .custom-file-input:invalid:focus{box-shadow:0 0 0 .2rem rgba(220,53,69,.25)}.form-inline{display:-ms-flexbox;display:flex;-ms-flex-flow:row wrap;flex-flow:row wrap;-ms-flex-align:center;align-items:center}.form-inline .form-check{width:100%}@media (min-width:576px){.form-inline label{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center;margin-bottom:0}.form-inline .form-group{display:-ms-flexbox;display:flex;-ms-flex:0 0 auto;flex:0 0 auto;-ms-flex-flow:row wrap;flex-flow:row wrap;-ms-flex-align:center;align-items:center;margin-bottom:0}.form-inline .form-control{display:inline-block;width:auto;vertical-align:middle}.form-inline .form-control-plaintext{display:inline-block}.form-inline .input-group{width:auto}.form-inline .form-control-label{margin-bottom:0;vertical-align:middle}.form-inline .form-check{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center;width:auto;margin-top:0;margin-bottom:0}.form-inline .form-check-label{padding-left:0}.form-inline .form-check-input{position:relative;margin-top:0;margin-right:.25rem;margin-left:0}.form-inline .custom-control{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center;padding-left:0}.form-inline .custom-control-indicator{position:static;display:inline-block;margin-right:.25rem;vertical-align:text-bottom}.form-inline .has-feedback .form-control-feedback{top:0}}.btn{display:inline-block;font-weight:400;text-align:center;white-space:nowrap;vertical-align:middle;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;border:1px solid transparent;padding:.5rem .75rem;font-size:1rem;line-height:1.25;border-radius:.25rem;transition:all .15s ease-in-out}.btn:focus,.btn:hover{text-decoration:none}.btn.focus,.btn:focus{outline:0;box-shadow:0 0 0 3px rgba(0,123,255,.25)}.btn.disabled,.btn:disabled{opacity:.65}.btn.active,.btn:active{background-image:none}a.btn.disabled,fieldset[disabled] a.btn{pointer-events:none}.btn-primary{color:#fff;background-color:#007bff;border-color:#007bff}.btn-primary:hover{color:#fff;background-color:#0069d9;border-color:#0062cc}.btn-primary.focus,.btn-primary:focus{box-shadow:0 0 0 3px rgba(0,123,255,.5)}.btn-primary.disabled,.btn-primary:disabled{background-color:#007bff;border-color:#007bff}.btn-primary.active,.btn-primary:active,.show>.btn-primary.dropdown-toggle{background-color:#0069d9;background-image:none;border-color:#0062cc}.btn-secondary{color:#fff;background-color:#868e96;border-color:#868e96}.btn-secondary:hover{color:#fff;background-color:#727b84;border-color:#6c757d}.btn-secondary.focus,.btn-secondary:focus{box-shadow:0 0 0 3px rgba(134,142,150,.5)}.btn-secondary.disabled,.btn-secondary:disabled{background-color:#868e96;border-color:#868e96}.btn-secondary.active,.btn-secondary:active,.show>.btn-secondary.dropdown-toggle{background-color:#727b84;background-image:none;border-color:#6c757d}.btn-success{color:#fff;background-color:#28a745;border-color:#28a745}.btn-success:hover{color:#fff;background-color:#218838;border-color:#1e7e34}.btn-success.focus,.btn-success:focus{box-shadow:0 0 0 3px rgba(40,167,69,.5)}.btn-success.disabled,.btn-success:disabled{background-color:#28a745;border-color:#28a745}.btn-success.active,.btn-success:active,.show>.btn-success.dropdown-toggle{background-color:#218838;background-image:none;border-color:#1e7e34}.btn-info{color:#fff;background-color:#17a2b8;border-color:#17a2b8}.btn-info:hover{color:#fff;background-color:#138496;border-color:#117a8b}.btn-info.focus,.btn-info:focus{box-shadow:0 0 0 3px rgba(23,162,184,.5)}.btn-info.disabled,.btn-info:disabled{background-color:#17a2b8;border-color:#17a2b8}.btn-info.active,.btn-info:active,.show>.btn-info.dropdown-toggle{background-color:#138496;background-image:none;border-color:#117a8b}.btn-warning{color:#111;background-color:#ffc107;border-color:#ffc107}.btn-warning:hover{color:#111;background-color:#e0a800;border-color:#d39e00}.btn-warning.focus,.btn-warning:focus{box-shadow:0 0 0 3px rgba(255,193,7,.5)}.btn-warning.disabled,.btn-warning:disabled{background-color:#ffc107;border-color:#ffc107}.btn-warning.active,.btn-warning:active,.show>.btn-warning.dropdown-toggle{background-color:#e0a800;background-image:none;border-color:#d39e00}.btn-danger{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-danger:hover{color:#fff;background-color:#c82333;border-color:#bd2130}.btn-danger.focus,.btn-danger:focus{box-shadow:0 0 0 3px rgba(220,53,69,.5)}.btn-danger.disabled,.btn-danger:disabled{background-color:#dc3545;border-color:#dc3545}.btn-danger.active,.btn-danger:active,.show>.btn-danger.dropdown-toggle{background-color:#c82333;background-image:none;border-color:#bd2130}.btn-light{color:#111;background-color:#f8f9fa;border-color:#f8f9fa}.btn-light:hover{color:#111;background-color:#e2e6ea;border-color:#dae0e5}.btn-light.focus,.btn-light:focus{box-shadow:0 0 0 3px rgba(248,249,250,.5)}.btn-light.disabled,.btn-light:disabled{background-color:#f8f9fa;border-color:#f8f9fa}.btn-light.active,.btn-light:active,.show>.btn-light.dropdown-toggle{background-color:#e2e6ea;background-image:none;border-color:#dae0e5}.btn-dark{color:#fff;background-color:#343a40;border-color:#343a40}.btn-dark:hover{color:#fff;background-color:#23272b;border-color:#1d2124}.btn-dark.focus,.btn-dark:focus{box-shadow:0 0 0 3px rgba(52,58,64,.5)}.btn-dark.disabled,.btn-dark:disabled{background-color:#343a40;border-color:#343a40}.btn-dark.active,.btn-dark:active,.show>.btn-dark.dropdown-toggle{background-color:#23272b;background-image:none;border-color:#1d2124}.btn-outline-primary{color:#007bff;background-color:transparent;background-image:none;border-color:#007bff}.btn-outline-primary:hover{color:#fff;background-color:#007bff;border-color:#007bff}.btn-outline-primary.focus,.btn-outline-primary:focus{box-shadow:0 0 0 3px rgba(0,123,255,.5)}.btn-outline-primary.disabled,.btn-outline-primary:disabled{color:#007bff;background-color:transparent}.btn-outline-primary.active,.btn-outline-primary:active,.show>.btn-outline-primary.dropdown-toggle{color:#fff;background-color:#007bff;border-color:#007bff}.btn-outline-secondary{color:#868e96;background-color:transparent;background-image:none;border-color:#868e96}.btn-outline-secondary:hover{color:#fff;background-color:#868e96;border-color:#868e96}.btn-outline-secondary.focus,.btn-outline-secondary:focus{box-shadow:0 0 0 3px rgba(134,142,150,.5)}.btn-outline-secondary.disabled,.btn-outline-secondary:disabled{color:#868e96;background-color:transparent}.btn-outline-secondary.active,.btn-outline-secondary:active,.show>.btn-outline-secondary.dropdown-toggle{color:#fff;background-color:#868e96;border-color:#868e96}.btn-outline-success{color:#28a745;background-color:transparent;background-image:none;border-color:#28a745}.btn-outline-success:hover{color:#fff;background-color:#28a745;border-color:#28a745}.btn-outline-success.focus,.btn-outline-success:focus{box-shadow:0 0 0 3px rgba(40,167,69,.5)}.btn-outline-success.disabled,.btn-outline-success:disabled{color:#28a745;background-color:transparent}.btn-outline-success.active,.btn-outline-success:active,.show>.btn-outline-success.dropdown-toggle{color:#fff;background-color:#28a745;border-color:#28a745}.btn-outline-info{color:#17a2b8;background-color:transparent;background-image:none;border-color:#17a2b8}.btn-outline-info:hover{color:#fff;background-color:#17a2b8;border-color:#17a2b8}.btn-outline-info.focus,.btn-outline-info:focus{box-shadow:0 0 0 3px rgba(23,162,184,.5)}.btn-outline-info.disabled,.btn-outline-info:disabled{color:#17a2b8;background-color:transparent}.btn-outline-info.active,.btn-outline-info:active,.show>.btn-outline-info.dropdown-toggle{color:#fff;background-color:#17a2b8;border-color:#17a2b8}.btn-outline-warning{color:#ffc107;background-color:transparent;background-image:none;border-color:#ffc107}.btn-outline-warning:hover{color:#fff;background-color:#ffc107;border-color:#ffc107}.btn-outline-warning.focus,.btn-outline-warning:focus{box-shadow:0 0 0 3px rgba(255,193,7,.5)}.btn-outline-warning.disabled,.btn-outline-warning:disabled{color:#ffc107;background-color:transparent}.btn-outline-warning.active,.btn-outline-warning:active,.show>.btn-outline-warning.dropdown-toggle{color:#fff;background-color:#ffc107;border-color:#ffc107}.btn-outline-danger{color:#dc3545;background-color:transparent;background-image:none;border-color:#dc3545}.btn-outline-danger:hover{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-outline-danger.focus,.btn-outline-danger:focus{box-shadow:0 0 0 3px rgba(220,53,69,.5)}.btn-outline-danger.disabled,.btn-outline-danger:disabled{color:#dc3545;background-color:transparent}.btn-outline-danger.active,.btn-outline-danger:active,.show>.btn-outline-danger.dropdown-toggle{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-outline-light{color:#f8f9fa;background-color:transparent;background-image:none;border-color:#f8f9fa}.btn-outline-light:hover{color:#fff;background-color:#f8f9fa;border-color:#f8f9fa}.btn-outline-light.focus,.btn-outline-light:focus{box-shadow:0 0 0 3px rgba(248,249,250,.5)}.btn-outline-light.disabled,.btn-outline-light:disabled{color:#f8f9fa;background-color:transparent}.btn-outline-light.active,.btn-outline-light:active,.show>.btn-outline-light.dropdown-toggle{color:#fff;background-color:#f8f9fa;border-color:#f8f9fa}.btn-outline-dark{color:#343a40;background-color:transparent;background-image:none;border-color:#343a40}.btn-outline-dark:hover{color:#fff;background-color:#343a40;border-color:#343a40}.btn-outline-dark.focus,.btn-outline-dark:focus{box-shadow:0 0 0 3px rgba(52,58,64,.5)}.btn-outline-dark.disabled,.btn-outline-dark:disabled{color:#343a40;background-color:transparent}.btn-outline-dark.active,.btn-outline-dark:active,.show>.btn-outline-dark.dropdown-toggle{color:#fff;background-color:#343a40;border-color:#343a40}.btn-link{font-weight:400;color:#007bff;border-radius:0}.btn-link,.btn-link.active,.btn-link:active,.btn-link:disabled{background-color:transparent}.btn-link,.btn-link:active,.btn-link:focus{border-color:transparent;box-shadow:none}.btn-link:hover{border-color:transparent}.btn-link:focus,.btn-link:hover{color:#0056b3;text-decoration:underline;background-color:transparent}.btn-link:disabled{color:#868e96}.btn-link:disabled:focus,.btn-link:disabled:hover{text-decoration:none}.btn-group-lg>.btn,.btn-lg{padding:.5rem 1rem;font-size:1.25rem;line-height:1.5;border-radius:.3rem}.btn-group-sm>.btn,.btn-sm{padding:.25rem .5rem;font-size:.875rem;line-height:1.5;border-radius:.2rem}.btn-block{display:block;width:100%}.btn-block+.btn-block{margin-top:.5rem}input[type=button].btn-block,input[type=reset].btn-block,input[type=submit].btn-block{width:100%}.fade{opacity:0;transition:opacity .15s linear}.fade.show{opacity:1}.collapse{display:none}.collapse.show{display:block}tr.collapse.show{display:table-row}tbody.collapse.show{display:table-row-group}.collapsing{position:relative;height:0;overflow:hidden;transition:height .35s ease}.dropdown,.dropup{position:relative}.dropdown-toggle::after{display:inline-block;width:0;height:0;margin-left:.255em;vertical-align:.255em;content:"";border-top:.3em solid;border-right:.3em solid transparent;border-left:.3em solid transparent}.dropdown-toggle:empty::after{margin-left:0}.dropup .dropdown-menu{margin-top:0;margin-bottom:.125rem}.dropup .dropdown-toggle::after{border-top:0;border-bottom:.3em solid}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:10rem;padding:.5rem 0;margin:.125rem 0 0;font-size:1rem;color:#212529;text-align:left;list-style:none;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,.15);border-radius:.25rem}.dropdown-divider{height:0;margin:.5rem 0;overflow:hidden;border-top:1px solid #e9ecef}.dropdown-item{display:block;width:100%;padding:.25rem 1.5rem;clear:both;font-weight:400;color:#212529;text-align:inherit;white-space:nowrap;background:0 0;border:0}.dropdown-item:focus,.dropdown-item:hover{color:#16181b;text-decoration:none;background-color:#f8f9fa}.dropdown-item.active,.dropdown-item:active{color:#fff;text-decoration:none;background-color:#007bff}.dropdown-item.disabled,.dropdown-item:disabled{color:#868e96;background-color:transparent}.show>a{outline:0}.dropdown-menu.show{display:block}.dropdown-header{display:block;padding:.5rem 1.5rem;margin-bottom:0;font-size:.875rem;color:#868e96;white-space:nowrap}.btn-group,.btn-group-vertical{position:relative;display:-ms-inline-flexbox;display:inline-flex;vertical-align:middle}.btn-group-vertical>.btn,.btn-group>.btn{position:relative;-ms-flex:0 1 auto;flex:0 1 auto;margin-bottom:0}.btn-group-vertical>.btn:hover,.btn-group>.btn:hover{z-index:2}.btn-group-vertical>.btn.active,.btn-group-vertical>.btn:active,.btn-group-vertical>.btn:focus,.btn-group>.btn.active,.btn-group>.btn:active,.btn-group>.btn:focus{z-index:2}.btn-group .btn+.btn,.btn-group .btn+.btn-group,.btn-group .btn-group+.btn,.btn-group .btn-group+.btn-group,.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-left:-1px}.btn-toolbar{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-pack:start;justify-content:flex-start}.btn-toolbar .input-group{width:auto}.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-top-left-radius:0;border-bottom-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:not(:last-child)>.btn:last-child,.btn-group>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn-group:last-child:not(:first-child)>.btn:first-child{border-top-left-radius:0;border-bottom-left-radius:0}.btn+.dropdown-toggle-split{padding-right:.5625rem;padding-left:.5625rem}.btn+.dropdown-toggle-split::after{margin-left:0}.btn-group-sm>.btn+.dropdown-toggle-split,.btn-sm+.dropdown-toggle-split{padding-right:.375rem;padding-left:.375rem}.btn-group-lg>.btn+.dropdown-toggle-split,.btn-lg+.dropdown-toggle-split{padding-right:.75rem;padding-left:.75rem}.btn-group-vertical{display:-ms-inline-flexbox;display:inline-flex;-ms-flex-direction:column;flex-direction:column;-ms-flex-align:start;align-items:flex-start;-ms-flex-pack:center;justify-content:center}.btn-group-vertical .btn,.btn-group-vertical .btn-group{width:100%}.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-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn:last-child:not(:first-child){border-top-left-radius:0;border-top-right-radius:0}.btn-group-vertical>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group-vertical>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group-vertical>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn-group:last-child:not(:first-child)>.btn:first-child{border-top-left-radius:0;border-top-right-radius:0}[data-toggle=buttons]>.btn input[type=checkbox],[data-toggle=buttons]>.btn input[type=radio],[data-toggle=buttons]>.btn-group>.btn input[type=checkbox],[data-toggle=buttons]>.btn-group>.btn input[type=radio]{position:absolute;clip:rect(0,0,0,0);pointer-events:none}.input-group{position:relative;display:-ms-flexbox;display:flex;width:100%}.input-group .form-control{position:relative;z-index:2;-ms-flex:1 1 auto;flex:1 1 auto;width:1%;margin-bottom:0}.input-group .form-control:active,.input-group .form-control:focus,.input-group .form-control:hover{z-index:3}.input-group .form-control,.input-group-addon,.input-group-btn{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center}.input-group .form-control:not(:first-child):not(:last-child),.input-group-addon:not(:first-child):not(:last-child),.input-group-btn:not(:first-child):not(:last-child){border-radius:0}.input-group-addon,.input-group-btn{white-space:nowrap;vertical-align:middle}.input-group-addon{padding:.5rem .75rem;margin-bottom:0;font-size:1rem;font-weight:400;line-height:1.25;color:#495057;text-align:center;background-color:#e9ecef;border:1px solid rgba(0,0,0,.15);border-radius:.25rem}.input-group-addon.form-control-sm,.input-group-sm>.input-group-addon,.input-group-sm>.input-group-btn>.input-group-addon.btn{padding:.25rem .5rem;font-size:.875rem;border-radius:.2rem}.input-group-addon.form-control-lg,.input-group-lg>.input-group-addon,.input-group-lg>.input-group-btn>.input-group-addon.btn{padding:.5rem 1rem;font-size:1.25rem;border-radius:.3rem}.input-group-addon input[type=checkbox],.input-group-addon input[type=radio]{margin-top:0}.input-group .form-control:not(:last-child),.input-group-addon:not(:last-child),.input-group-btn:not(:first-child)>.btn-group:not(:last-child)>.btn,.input-group-btn:not(:first-child)>.btn:not(:last-child):not(.dropdown-toggle),.input-group-btn:not(:last-child)>.btn,.input-group-btn:not(:last-child)>.btn-group>.btn,.input-group-btn:not(:last-child)>.dropdown-toggle{border-top-right-radius:0;border-bottom-right-radius:0}.input-group-addon:not(:last-child){border-right:0}.input-group .form-control:not(:first-child),.input-group-addon:not(:first-child),.input-group-btn:not(:first-child)>.btn,.input-group-btn:not(:first-child)>.btn-group>.btn,.input-group-btn:not(:first-child)>.dropdown-toggle,.input-group-btn:not(:last-child)>.btn-group:not(:first-child)>.btn,.input-group-btn:not(:last-child)>.btn:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.form-control+.input-group-addon:not(:first-child){border-left:0}.input-group-btn{position:relative;font-size:0;white-space:nowrap}.input-group-btn>.btn{position:relative}.input-group-btn>.btn+.btn{margin-left:-1px}.input-group-btn>.btn:active,.input-group-btn>.btn:focus,.input-group-btn>.btn:hover{z-index:3}.input-group-btn:not(:last-child)>.btn,.input-group-btn:not(:last-child)>.btn-group{margin-right:-1px}.input-group-btn:not(:first-child)>.btn,.input-group-btn:not(:first-child)>.btn-group{z-index:2;margin-left:-1px}.input-group-btn:not(:first-child)>.btn-group:active,.input-group-btn:not(:first-child)>.btn-group:focus,.input-group-btn:not(:first-child)>.btn-group:hover,.input-group-btn:not(:first-child)>.btn:active,.input-group-btn:not(:first-child)>.btn:focus,.input-group-btn:not(:first-child)>.btn:hover{z-index:3}.custom-control{position:relative;display:-ms-inline-flexbox;display:inline-flex;min-height:1.5rem;padding-left:1.5rem;margin-right:1rem}.custom-control-input{position:absolute;z-index:-1;opacity:0}.custom-control-input:checked~.custom-control-indicator{color:#fff;background-color:#007bff}.custom-control-input:focus~.custom-control-indicator{box-shadow:0 0 0 1px #fff,0 0 0 3px #007bff}.custom-control-input:active~.custom-control-indicator{color:#fff;background-color:#b3d7ff}.custom-control-input:disabled~.custom-control-indicator{background-color:#e9ecef}.custom-control-input:disabled~.custom-control-description{color:#868e96}.custom-control-indicator{position:absolute;top:.25rem;left:0;display:block;width:1rem;height:1rem;pointer-events:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background-color:#ddd;background-repeat:no-repeat;background-position:center center;background-size:50% 50%}.custom-checkbox .custom-control-indicator{border-radius:.25rem}.custom-checkbox .custom-control-input:checked~.custom-control-indicator{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3E%3Cpath fill='%23fff' d='M6.564.75l-3.59 3.612-1.538-1.55L0 4.26 2.974 7.25 8 2.193z'/%3E%3C/svg%3E")}.custom-checkbox .custom-control-input:indeterminate~.custom-control-indicator{background-color:#007bff;background-image:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 4'%3E%3Cpath stroke='%23fff' d='M0 2h4'/%3E%3C/svg%3E")}.custom-radio .custom-control-indicator{border-radius:50%}.custom-radio .custom-control-input:checked~.custom-control-indicator{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3E%3Ccircle r='3' fill='%23fff'/%3E%3C/svg%3E")}.custom-controls-stacked{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column}.custom-controls-stacked .custom-control{margin-bottom:.25rem}.custom-controls-stacked .custom-control+.custom-control{margin-left:0}.custom-select{display:inline-block;max-width:100%;height:calc(2.25rem + 2px);padding:.375rem 1.75rem .375rem .75rem;line-height:1.25;color:#495057;vertical-align:middle;background:#fff url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 5'%3E%3Cpath fill='%23333' d='M2 0L0 2h4zm0 5L0 3h4z'/%3E%3C/svg%3E") no-repeat right .75rem center;background-size:8px 10px;border:1px solid rgba(0,0,0,.15);border-radius:.25rem;-webkit-appearance:none;-moz-appearance:none;appearance:none}.custom-select:focus{border-color:#80bdff;outline:0}.custom-select:focus::-ms-value{color:#495057;background-color:#fff}.custom-select:disabled{color:#868e96;background-color:#e9ecef}.custom-select::-ms-expand{opacity:0}.custom-select-sm{height:calc(1.8125rem + 2px);padding-top:.375rem;padding-bottom:.375rem;font-size:75%}.custom-file{position:relative;display:inline-block;max-width:100%;height:2.5rem;margin-bottom:0}.custom-file-input{min-width:14rem;max-width:100%;height:2.5rem;margin:0;opacity:0}.custom-file-control{position:absolute;top:0;right:0;left:0;z-index:5;height:2.5rem;padding:.5rem 1rem;line-height:1.5;color:#495057;pointer-events:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background-color:#fff;border:1px solid rgba(0,0,0,.15);border-radius:.25rem}.custom-file-control:lang(en):empty::after{content:"Choose file..."}.custom-file-control::before{position:absolute;top:-1px;right:-1px;bottom:-1px;z-index:6;display:block;height:2.5rem;padding:.5rem 1rem;line-height:1.5;color:#495057;background-color:#e9ecef;border:1px solid rgba(0,0,0,.15);border-radius:0 .25rem .25rem 0}.custom-file-control:lang(en)::before{content:"Browse"}.nav{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;padding-left:0;margin-bottom:0;list-style:none}.nav-link{display:block;padding:.5rem 1rem}.nav-link:focus,.nav-link:hover{text-decoration:none}.nav-link.disabled{color:#868e96}.nav-tabs{border-bottom:1px solid #ddd}.nav-tabs .nav-item{margin-bottom:-1px}.nav-tabs .nav-link{border:1px solid transparent;border-top-left-radius:.25rem;border-top-right-radius:.25rem}.nav-tabs .nav-link:focus,.nav-tabs .nav-link:hover{border-color:#e9ecef #e9ecef #ddd}.nav-tabs .nav-link.disabled{color:#868e96;background-color:transparent;border-color:transparent}.nav-tabs .nav-item.show .nav-link,.nav-tabs .nav-link.active{color:#495057;background-color:#fff;border-color:#ddd #ddd #fff}.nav-tabs .dropdown-menu{margin-top:-1px;border-top-left-radius:0;border-top-right-radius:0}.nav-pills .nav-link{border-radius:.25rem}.nav-pills .nav-link.active,.show>.nav-pills .nav-link{color:#fff;background-color:#007bff}.nav-fill .nav-item{-ms-flex:1 1 auto;flex:1 1 auto;text-align:center}.nav-justified .nav-item{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;text-align:center}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.navbar{position:relative;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-align:center;align-items:center;-ms-flex-pack:justify;justify-content:space-between;padding:.5rem 1rem}.navbar>.container,.navbar>.container-fluid{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-align:center;align-items:center;-ms-flex-pack:justify;justify-content:space-between}.navbar-brand{display:inline-block;padding-top:.3125rem;padding-bottom:.3125rem;margin-right:1rem;font-size:1.25rem;line-height:inherit;white-space:nowrap}.navbar-brand:focus,.navbar-brand:hover{text-decoration:none}.navbar-nav{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;padding-left:0;margin-bottom:0;list-style:none}.navbar-nav .nav-link{padding-right:0;padding-left:0}.navbar-nav .dropdown-menu{position:static;float:none}.navbar-text{display:inline-block;padding-top:.5rem;padding-bottom:.5rem}.navbar-collapse{-ms-flex-preferred-size:100%;flex-basis:100%;-ms-flex-align:center;align-items:center}.navbar-toggler{padding:.25rem .75rem;font-size:1.25rem;line-height:1;background:0 0;border:1px solid transparent;border-radius:.25rem}.navbar-toggler:focus,.navbar-toggler:hover{text-decoration:none}.navbar-toggler-icon{display:inline-block;width:1.5em;height:1.5em;vertical-align:middle;content:"";background:no-repeat center center;background-size:100% 100%}@media (max-width:575px){.navbar-expand-sm>.container,.navbar-expand-sm>.container-fluid{padding-right:0;padding-left:0}}@media (min-width:576px){.navbar-expand-sm{-ms-flex-direction:row;flex-direction:row;-ms-flex-wrap:nowrap;flex-wrap:nowrap;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand-sm .navbar-nav{-ms-flex-direction:row;flex-direction:row}.navbar-expand-sm .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-sm .navbar-nav .dropdown-menu-right{right:0;left:auto}.navbar-expand-sm .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-sm>.container,.navbar-expand-sm>.container-fluid{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand-sm .navbar-collapse{display:-ms-flexbox!important;display:flex!important}.navbar-expand-sm .navbar-toggler{display:none}}@media (max-width:767px){.navbar-expand-md>.container,.navbar-expand-md>.container-fluid{padding-right:0;padding-left:0}}@media (min-width:768px){.navbar-expand-md{-ms-flex-direction:row;flex-direction:row;-ms-flex-wrap:nowrap;flex-wrap:nowrap;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand-md .navbar-nav{-ms-flex-direction:row;flex-direction:row}.navbar-expand-md .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-md .navbar-nav .dropdown-menu-right{right:0;left:auto}.navbar-expand-md .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-md>.container,.navbar-expand-md>.container-fluid{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand-md .navbar-collapse{display:-ms-flexbox!important;display:flex!important}.navbar-expand-md .navbar-toggler{display:none}}@media (max-width:991px){.navbar-expand-lg>.container,.navbar-expand-lg>.container-fluid{padding-right:0;padding-left:0}}@media (min-width:992px){.navbar-expand-lg{-ms-flex-direction:row;flex-direction:row;-ms-flex-wrap:nowrap;flex-wrap:nowrap;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand-lg .navbar-nav{-ms-flex-direction:row;flex-direction:row}.navbar-expand-lg .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-lg .navbar-nav .dropdown-menu-right{right:0;left:auto}.navbar-expand-lg .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-lg>.container,.navbar-expand-lg>.container-fluid{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand-lg .navbar-collapse{display:-ms-flexbox!important;display:flex!important}.navbar-expand-lg .navbar-toggler{display:none}}@media (max-width:1199px){.navbar-expand-xl>.container,.navbar-expand-xl>.container-fluid{padding-right:0;padding-left:0}}@media (min-width:1200px){.navbar-expand-xl{-ms-flex-direction:row;flex-direction:row;-ms-flex-wrap:nowrap;flex-wrap:nowrap;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand-xl .navbar-nav{-ms-flex-direction:row;flex-direction:row}.navbar-expand-xl .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-xl .navbar-nav .dropdown-menu-right{right:0;left:auto}.navbar-expand-xl .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-xl>.container,.navbar-expand-xl>.container-fluid{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand-xl .navbar-collapse{display:-ms-flexbox!important;display:flex!important}.navbar-expand-xl .navbar-toggler{display:none}}.navbar-expand{-ms-flex-direction:row;flex-direction:row;-ms-flex-wrap:nowrap;flex-wrap:nowrap;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand>.container,.navbar-expand>.container-fluid{padding-right:0;padding-left:0}.navbar-expand .navbar-nav{-ms-flex-direction:row;flex-direction:row}.navbar-expand .navbar-nav .dropdown-menu{position:absolute}.navbar-expand .navbar-nav .dropdown-menu-right{right:0;left:auto}.navbar-expand .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand>.container,.navbar-expand>.container-fluid{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand .navbar-collapse{display:-ms-flexbox!important;display:flex!important}.navbar-expand .navbar-toggler{display:none}.navbar-light .navbar-brand{color:rgba(0,0,0,.9)}.navbar-light .navbar-brand:focus,.navbar-light .navbar-brand:hover{color:rgba(0,0,0,.9)}.navbar-light .navbar-nav .nav-link{color:rgba(0,0,0,.5)}.navbar-light .navbar-nav .nav-link:focus,.navbar-light .navbar-nav .nav-link:hover{color:rgba(0,0,0,.7)}.navbar-light .navbar-nav .nav-link.disabled{color:rgba(0,0,0,.3)}.navbar-light .navbar-nav .active>.nav-link,.navbar-light .navbar-nav .nav-link.active,.navbar-light .navbar-nav .nav-link.show,.navbar-light .navbar-nav .show>.nav-link{color:rgba(0,0,0,.9)}.navbar-light .navbar-toggler{color:rgba(0,0,0,.5);border-color:rgba(0,0,0,.1)}.navbar-light .navbar-toggler-icon{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg viewBox='0 0 30 30' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath stroke='rgba(0, 0, 0, 0.5)' stroke-width='2' stroke-linecap='round' stroke-miterlimit='10' d='M4 7h22M4 15h22M4 23h22'/%3E%3C/svg%3E")}.navbar-light .navbar-text{color:rgba(0,0,0,.5)}.navbar-dark .navbar-brand{color:#fff}.navbar-dark .navbar-brand:focus,.navbar-dark .navbar-brand:hover{color:#fff}.navbar-dark .navbar-nav .nav-link{color:rgba(255,255,255,.5)}.navbar-dark .navbar-nav .nav-link:focus,.navbar-dark .navbar-nav .nav-link:hover{color:rgba(255,255,255,.75)}.navbar-dark .navbar-nav .nav-link.disabled{color:rgba(255,255,255,.25)}.navbar-dark .navbar-nav .active>.nav-link,.navbar-dark .navbar-nav .nav-link.active,.navbar-dark .navbar-nav .nav-link.show,.navbar-dark .navbar-nav .show>.nav-link{color:#fff}.navbar-dark .navbar-toggler{color:rgba(255,255,255,.5);border-color:rgba(255,255,255,.1)}.navbar-dark .navbar-toggler-icon{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg viewBox='0 0 30 30' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath stroke='rgba(255, 255, 255, 0.5)' stroke-width='2' stroke-linecap='round' stroke-miterlimit='10' d='M4 7h22M4 15h22M4 23h22'/%3E%3C/svg%3E")}.navbar-dark .navbar-text{color:rgba(255,255,255,.5)}.card{position:relative;display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;min-width:0;word-wrap:break-word;background-color:#fff;background-clip:border-box;border:1px solid rgba(0,0,0,.125);border-radius:.25rem}.card-body{-ms-flex:1 1 auto;flex:1 1 auto;padding:1.25rem}.card-title{margin-bottom:.75rem}.card-subtitle{margin-top:-.375rem;margin-bottom:0}.card-text:last-child{margin-bottom:0}.card-link:hover{text-decoration:none}.card-link+.card-link{margin-left:1.25rem}.card>.list-group:first-child .list-group-item:first-child{border-top-left-radius:.25rem;border-top-right-radius:.25rem}.card>.list-group:last-child .list-group-item:last-child{border-bottom-right-radius:.25rem;border-bottom-left-radius:.25rem}.card-header{padding:.75rem 1.25rem;margin-bottom:0;background-color:rgba(0,0,0,.03);border-bottom:1px solid rgba(0,0,0,.125)}.card-header:first-child{border-radius:calc(.25rem - 1px) calc(.25rem - 1px) 0 0}.card-footer{padding:.75rem 1.25rem;background-color:rgba(0,0,0,.03);border-top:1px solid rgba(0,0,0,.125)}.card-footer:last-child{border-radius:0 0 calc(.25rem - 1px) calc(.25rem - 1px)}.card-header-tabs{margin-right:-.625rem;margin-bottom:-.75rem;margin-left:-.625rem;border-bottom:0}.card-header-pills{margin-right:-.625rem;margin-left:-.625rem}.card-img-overlay{position:absolute;top:0;right:0;bottom:0;left:0;padding:1.25rem}.card-img{width:100%;border-radius:calc(.25rem - 1px)}.card-img-top{width:100%;border-top-left-radius:calc(.25rem - 1px);border-top-right-radius:calc(.25rem - 1px)}.card-img-bottom{width:100%;border-bottom-right-radius:calc(.25rem - 1px);border-bottom-left-radius:calc(.25rem - 1px)}@media (min-width:576px){.card-deck{display:-ms-flexbox;display:flex;-ms-flex-flow:row wrap;flex-flow:row wrap;margin-right:-15px;margin-left:-15px}.card-deck .card{display:-ms-flexbox;display:flex;-ms-flex:1 0 0%;flex:1 0 0%;-ms-flex-direction:column;flex-direction:column;margin-right:15px;margin-left:15px}}@media (min-width:576px){.card-group{display:-ms-flexbox;display:flex;-ms-flex-flow:row wrap;flex-flow:row wrap}.card-group .card{-ms-flex:1 0 0%;flex:1 0 0%}.card-group .card+.card{margin-left:0;border-left:0}.card-group .card:first-child{border-top-right-radius:0;border-bottom-right-radius:0}.card-group .card:first-child .card-img-top{border-top-right-radius:0}.card-group .card:first-child .card-img-bottom{border-bottom-right-radius:0}.card-group .card:last-child{border-top-left-radius:0;border-bottom-left-radius:0}.card-group .card:last-child .card-img-top{border-top-left-radius:0}.card-group .card:last-child .card-img-bottom{border-bottom-left-radius:0}.card-group .card:not(:first-child):not(:last-child){border-radius:0}.card-group .card:not(:first-child):not(:last-child) .card-img-bottom,.card-group .card:not(:first-child):not(:last-child) .card-img-top{border-radius:0}}.card-columns .card{margin-bottom:.75rem}@media (min-width:576px){.card-columns{-webkit-column-count:3;column-count:3;-webkit-column-gap:1.25rem;column-gap:1.25rem}.card-columns .card{display:inline-block;width:100%}}.breadcrumb{padding:.75rem 1rem;margin-bottom:1rem;list-style:none;background-color:#e9ecef;border-radius:.25rem}.breadcrumb::after{display:block;clear:both;content:""}.breadcrumb-item{float:left}.breadcrumb-item+.breadcrumb-item::before{display:inline-block;padding-right:.5rem;padding-left:.5rem;color:#868e96;content:"/"}.breadcrumb-item+.breadcrumb-item:hover::before{text-decoration:underline}.breadcrumb-item+.breadcrumb-item:hover::before{text-decoration:none}.breadcrumb-item.active{color:#868e96}.pagination{display:-ms-flexbox;display:flex;padding-left:0;list-style:none;border-radius:.25rem}.page-item:first-child .page-link{margin-left:0;border-top-left-radius:.25rem;border-bottom-left-radius:.25rem}.page-item:last-child .page-link{border-top-right-radius:.25rem;border-bottom-right-radius:.25rem}.page-item.active .page-link{z-index:2;color:#fff;background-color:#007bff;border-color:#007bff}.page-item.disabled .page-link{color:#868e96;pointer-events:none;background-color:#fff;border-color:#ddd}.page-link{position:relative;display:block;padding:.5rem .75rem;margin-left:-1px;line-height:1.25;color:#007bff;background-color:#fff;border:1px solid #ddd}.page-link:focus,.page-link:hover{color:#0056b3;text-decoration:none;background-color:#e9ecef;border-color:#ddd}.pagination-lg .page-link{padding:.75rem 1.5rem;font-size:1.25rem;line-height:1.5}.pagination-lg .page-item:first-child .page-link{border-top-left-radius:.3rem;border-bottom-left-radius:.3rem}.pagination-lg .page-item:last-child .page-link{border-top-right-radius:.3rem;border-bottom-right-radius:.3rem}.pagination-sm .page-link{padding:.25rem .5rem;font-size:.875rem;line-height:1.5}.pagination-sm .page-item:first-child .page-link{border-top-left-radius:.2rem;border-bottom-left-radius:.2rem}.pagination-sm .page-item:last-child .page-link{border-top-right-radius:.2rem;border-bottom-right-radius:.2rem}.badge{display:inline-block;padding:.25em .4em;font-size:75%;font-weight:700;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25rem}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.badge-pill{padding-right:.6em;padding-left:.6em;border-radius:10rem}.badge-primary{color:#fff;background-color:#007bff}.badge-primary[href]:focus,.badge-primary[href]:hover{color:#fff;text-decoration:none;background-color:#0062cc}.badge-secondary{color:#fff;background-color:#868e96}.badge-secondary[href]:focus,.badge-secondary[href]:hover{color:#fff;text-decoration:none;background-color:#6c757d}.badge-success{color:#fff;background-color:#28a745}.badge-success[href]:focus,.badge-success[href]:hover{color:#fff;text-decoration:none;background-color:#1e7e34}.badge-info{color:#fff;background-color:#17a2b8}.badge-info[href]:focus,.badge-info[href]:hover{color:#fff;text-decoration:none;background-color:#117a8b}.badge-warning{color:#111;background-color:#ffc107}.badge-warning[href]:focus,.badge-warning[href]:hover{color:#111;text-decoration:none;background-color:#d39e00}.badge-danger{color:#fff;background-color:#dc3545}.badge-danger[href]:focus,.badge-danger[href]:hover{color:#fff;text-decoration:none;background-color:#bd2130}.badge-light{color:#111;background-color:#f8f9fa}.badge-light[href]:focus,.badge-light[href]:hover{color:#111;text-decoration:none;background-color:#dae0e5}.badge-dark{color:#fff;background-color:#343a40}.badge-dark[href]:focus,.badge-dark[href]:hover{color:#fff;text-decoration:none;background-color:#1d2124}.jumbotron{padding:2rem 1rem;margin-bottom:2rem;background-color:#e9ecef;border-radius:.3rem}@media (min-width:576px){.jumbotron{padding:4rem 2rem}}.jumbotron-fluid{padding-right:0;padding-left:0;border-radius:0}.alert{padding:.75rem 1.25rem;margin-bottom:1rem;border:1px solid transparent;border-radius:.25rem}.alert-heading{color:inherit}.alert-link{font-weight:700}.alert-dismissible .close{position:relative;top:-.75rem;right:-1.25rem;padding:.75rem 1.25rem;color:inherit}.alert-primary{color:#004085;background-color:#cce5ff;border-color:#b8daff}.alert-primary hr{border-top-color:#9fcdff}.alert-primary .alert-link{color:#002752}.alert-secondary{color:#464a4e;background-color:#e7e8ea;border-color:#dddfe2}.alert-secondary hr{border-top-color:#cfd2d6}.alert-secondary .alert-link{color:#2e3133}.alert-success{color:#155724;background-color:#d4edda;border-color:#c3e6cb}.alert-success hr{border-top-color:#b1dfbb}.alert-success .alert-link{color:#0b2e13}.alert-info{color:#0c5460;background-color:#d1ecf1;border-color:#bee5eb}.alert-info hr{border-top-color:#abdde5}.alert-info .alert-link{color:#062c33}.alert-warning{color:#856404;background-color:#fff3cd;border-color:#ffeeba}.alert-warning hr{border-top-color:#ffe8a1}.alert-warning .alert-link{color:#533f03}.alert-danger{color:#721c24;background-color:#f8d7da;border-color:#f5c6cb}.alert-danger hr{border-top-color:#f1b0b7}.alert-danger .alert-link{color:#491217}.alert-light{color:#818182;background-color:#fefefe;border-color:#fdfdfe}.alert-light hr{border-top-color:#ececf6}.alert-light .alert-link{color:#686868}.alert-dark{color:#1b1e21;background-color:#d6d8d9;border-color:#c6c8ca}.alert-dark hr{border-top-color:#b9bbbe}.alert-dark .alert-link{color:#040505}@-webkit-keyframes progress-bar-stripes{from{background-position:1rem 0}to{background-position:0 0}}@keyframes progress-bar-stripes{from{background-position:1rem 0}to{background-position:0 0}}.progress{display:-ms-flexbox;display:flex;overflow:hidden;font-size:.75rem;line-height:1rem;text-align:center;background-color:#e9ecef;border-radius:.25rem}.progress-bar{height:1rem;line-height:1rem;color:#fff;background-color:#007bff;transition:width .6s ease}.progress-bar-striped{background-image:linear-gradient(45deg,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-size:1rem 1rem}.progress-bar-animated{-webkit-animation:progress-bar-stripes 1s linear infinite;animation:progress-bar-stripes 1s linear infinite}.media{display:-ms-flexbox;display:flex;-ms-flex-align:start;align-items:flex-start}.media-body{-ms-flex:1;flex:1}.list-group{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;padding-left:0;margin-bottom:0}.list-group-item-action{width:100%;color:#495057;text-align:inherit}.list-group-item-action:focus,.list-group-item-action:hover{color:#495057;text-decoration:none;background-color:#f8f9fa}.list-group-item-action:active{color:#212529;background-color:#e9ecef}.list-group-item{position:relative;display:block;padding:.75rem 1.25rem;margin-bottom:-1px;background-color:#fff;border:1px solid rgba(0,0,0,.125)}.list-group-item:first-child{border-top-left-radius:.25rem;border-top-right-radius:.25rem}.list-group-item:last-child{margin-bottom:0;border-bottom-right-radius:.25rem;border-bottom-left-radius:.25rem}.list-group-item:focus,.list-group-item:hover{text-decoration:none}.list-group-item.disabled,.list-group-item:disabled{color:#868e96;background-color:#fff}.list-group-item.active{z-index:2;color:#fff;background-color:#007bff;border-color:#007bff}.list-group-flush .list-group-item{border-right:0;border-left:0;border-radius:0}.list-group-flush:first-child .list-group-item:first-child{border-top:0}.list-group-flush:last-child .list-group-item:last-child{border-bottom:0}.list-group-item-primary{color:#004085;background-color:#b8daff}a.list-group-item-primary,button.list-group-item-primary{color:#004085}a.list-group-item-primary:focus,a.list-group-item-primary:hover,button.list-group-item-primary:focus,button.list-group-item-primary:hover{color:#004085;background-color:#9fcdff}a.list-group-item-primary.active,button.list-group-item-primary.active{color:#fff;background-color:#004085;border-color:#004085}.list-group-item-secondary{color:#464a4e;background-color:#dddfe2}a.list-group-item-secondary,button.list-group-item-secondary{color:#464a4e}a.list-group-item-secondary:focus,a.list-group-item-secondary:hover,button.list-group-item-secondary:focus,button.list-group-item-secondary:hover{color:#464a4e;background-color:#cfd2d6}a.list-group-item-secondary.active,button.list-group-item-secondary.active{color:#fff;background-color:#464a4e;border-color:#464a4e}.list-group-item-success{color:#155724;background-color:#c3e6cb}a.list-group-item-success,button.list-group-item-success{color:#155724}a.list-group-item-success:focus,a.list-group-item-success:hover,button.list-group-item-success:focus,button.list-group-item-success:hover{color:#155724;background-color:#b1dfbb}a.list-group-item-success.active,button.list-group-item-success.active{color:#fff;background-color:#155724;border-color:#155724}.list-group-item-info{color:#0c5460;background-color:#bee5eb}a.list-group-item-info,button.list-group-item-info{color:#0c5460}a.list-group-item-info:focus,a.list-group-item-info:hover,button.list-group-item-info:focus,button.list-group-item-info:hover{color:#0c5460;background-color:#abdde5}a.list-group-item-info.active,button.list-group-item-info.active{color:#fff;background-color:#0c5460;border-color:#0c5460}.list-group-item-warning{color:#856404;background-color:#ffeeba}a.list-group-item-warning,button.list-group-item-warning{color:#856404}a.list-group-item-warning:focus,a.list-group-item-warning:hover,button.list-group-item-warning:focus,button.list-group-item-warning:hover{color:#856404;background-color:#ffe8a1}a.list-group-item-warning.active,button.list-group-item-warning.active{color:#fff;background-color:#856404;border-color:#856404}.list-group-item-danger{color:#721c24;background-color:#f5c6cb}a.list-group-item-danger,button.list-group-item-danger{color:#721c24}a.list-group-item-danger:focus,a.list-group-item-danger:hover,button.list-group-item-danger:focus,button.list-group-item-danger:hover{color:#721c24;background-color:#f1b0b7}a.list-group-item-danger.active,button.list-group-item-danger.active{color:#fff;background-color:#721c24;border-color:#721c24}.list-group-item-light{color:#818182;background-color:#fdfdfe}a.list-group-item-light,button.list-group-item-light{color:#818182}a.list-group-item-light:focus,a.list-group-item-light:hover,button.list-group-item-light:focus,button.list-group-item-light:hover{color:#818182;background-color:#ececf6}a.list-group-item-light.active,button.list-group-item-light.active{color:#fff;background-color:#818182;border-color:#818182}.list-group-item-dark{color:#1b1e21;background-color:#c6c8ca}a.list-group-item-dark,button.list-group-item-dark{color:#1b1e21}a.list-group-item-dark:focus,a.list-group-item-dark:hover,button.list-group-item-dark:focus,button.list-group-item-dark:hover{color:#1b1e21;background-color:#b9bbbe}a.list-group-item-dark.active,button.list-group-item-dark.active{color:#fff;background-color:#1b1e21;border-color:#1b1e21}.close{float:right;font-size:1.5rem;font-weight:700;line-height:1;color:#000;text-shadow:0 1px 0 #fff;opacity:.5}.close:focus,.close:hover{color:#000;text-decoration:none;opacity:.75}button.close{padding:0;background:0 0;border:0;-webkit-appearance:none}.modal-open{overflow:hidden}.modal{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1050;display:none;overflow:hidden;outline:0}.modal.fade .modal-dialog{transition:-webkit-transform .3s ease-out;transition:transform .3s ease-out;transition:transform .3s ease-out,-webkit-transform .3s ease-out;-webkit-transform:translate(0,-25%);transform:translate(0,-25%)}.modal.show .modal-dialog{-webkit-transform:translate(0,0);transform:translate(0,0)}.modal-open .modal{overflow-x:hidden;overflow-y:auto}.modal-dialog{position:relative;width:auto;margin:10px}.modal-content{position:relative;display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,.2);border-radius:.3rem;outline:0}.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;background-color:#000}.modal-backdrop.fade{opacity:0}.modal-backdrop.show{opacity:.5}.modal-header{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;-ms-flex-pack:justify;justify-content:space-between;padding:15px;border-bottom:1px solid #e9ecef}.modal-title{margin-bottom:0;line-height:1.5}.modal-body{position:relative;-ms-flex:1 1 auto;flex:1 1 auto;padding:15px}.modal-footer{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;-ms-flex-pack:end;justify-content:flex-end;padding:15px;border-top:1px solid #e9ecef}.modal-footer>:not(:first-child){margin-left:.25rem}.modal-footer>:not(:last-child){margin-right:.25rem}.modal-scrollbar-measure{position:absolute;top:-9999px;width:50px;height:50px;overflow:scroll}@media (min-width:576px){.modal-dialog{max-width:500px;margin:30px auto}.modal-sm{max-width:300px}}@media (min-width:992px){.modal-lg{max-width:800px}}.tooltip{position:absolute;z-index:1070;display:block;margin:0;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif;font-style:normal;font-weight:400;line-height:1.5;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;white-space:normal;line-break:auto;font-size:.875rem;word-wrap:break-word;opacity:0}.tooltip.show{opacity:.9}.tooltip .arrow{position:absolute;display:block;width:5px;height:5px}.tooltip.bs-tooltip-auto[x-placement^=top],.tooltip.bs-tooltip-top{padding:5px 0}.tooltip.bs-tooltip-auto[x-placement^=top] .arrow,.tooltip.bs-tooltip-top .arrow{bottom:0}.tooltip.bs-tooltip-auto[x-placement^=top] .arrow::before,.tooltip.bs-tooltip-top .arrow::before{margin-left:-3px;content:"";border-width:5px 5px 0;border-top-color:#000}.tooltip.bs-tooltip-auto[x-placement^=right],.tooltip.bs-tooltip-right{padding:0 5px}.tooltip.bs-tooltip-auto[x-placement^=right] .arrow,.tooltip.bs-tooltip-right .arrow{left:0}.tooltip.bs-tooltip-auto[x-placement^=right] .arrow::before,.tooltip.bs-tooltip-right .arrow::before{margin-top:-3px;content:"";border-width:5px 5px 5px 0;border-right-color:#000}.tooltip.bs-tooltip-auto[x-placement^=bottom],.tooltip.bs-tooltip-bottom{padding:5px 0}.tooltip.bs-tooltip-auto[x-placement^=bottom] .arrow,.tooltip.bs-tooltip-bottom .arrow{top:0}.tooltip.bs-tooltip-auto[x-placement^=bottom] .arrow::before,.tooltip.bs-tooltip-bottom .arrow::before{margin-left:-3px;content:"";border-width:0 5px 5px;border-bottom-color:#000}.tooltip.bs-tooltip-auto[x-placement^=left],.tooltip.bs-tooltip-left{padding:0 5px}.tooltip.bs-tooltip-auto[x-placement^=left] .arrow,.tooltip.bs-tooltip-left .arrow{right:0}.tooltip.bs-tooltip-auto[x-placement^=left] .arrow::before,.tooltip.bs-tooltip-left .arrow::before{right:0;margin-top:-3px;content:"";border-width:5px 0 5px 5px;border-left-color:#000}.tooltip .arrow::before{position:absolute;border-color:transparent;border-style:solid}.tooltip-inner{max-width:200px;padding:3px 8px;color:#fff;text-align:center;background-color:#000;border-radius:.25rem}.popover{position:absolute;top:0;left:0;z-index:1060;display:block;max-width:276px;padding:1px;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif;font-style:normal;font-weight:400;line-height:1.5;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;white-space:normal;line-break:auto;font-size:.875rem;word-wrap:break-word;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,.2);border-radius:.3rem}.popover .arrow{position:absolute;display:block;width:10px;height:5px}.popover .arrow::after,.popover .arrow::before{position:absolute;display:block;border-color:transparent;border-style:solid}.popover .arrow::before{content:"";border-width:11px}.popover .arrow::after{content:"";border-width:11px}.popover.bs-popover-auto[x-placement^=top],.popover.bs-popover-top{margin-bottom:10px}.popover.bs-popover-auto[x-placement^=top] .arrow,.popover.bs-popover-top .arrow{bottom:0}.popover.bs-popover-auto[x-placement^=top] .arrow::after,.popover.bs-popover-auto[x-placement^=top] .arrow::before,.popover.bs-popover-top .arrow::after,.popover.bs-popover-top .arrow::before{border-bottom-width:0}.popover.bs-popover-auto[x-placement^=top] .arrow::before,.popover.bs-popover-top .arrow::before{bottom:-11px;margin-left:-6px;border-top-color:rgba(0,0,0,.25)}.popover.bs-popover-auto[x-placement^=top] .arrow::after,.popover.bs-popover-top .arrow::after{bottom:-10px;margin-left:-6px;border-top-color:#fff}.popover.bs-popover-auto[x-placement^=right],.popover.bs-popover-right{margin-left:10px}.popover.bs-popover-auto[x-placement^=right] .arrow,.popover.bs-popover-right .arrow{left:0}.popover.bs-popover-auto[x-placement^=right] .arrow::after,.popover.bs-popover-auto[x-placement^=right] .arrow::before,.popover.bs-popover-right .arrow::after,.popover.bs-popover-right .arrow::before{margin-top:-8px;border-left-width:0}.popover.bs-popover-auto[x-placement^=right] .arrow::before,.popover.bs-popover-right .arrow::before{left:-11px;border-right-color:rgba(0,0,0,.25)}.popover.bs-popover-auto[x-placement^=right] .arrow::after,.popover.bs-popover-right .arrow::after{left:-10px;border-right-color:#fff}.popover.bs-popover-auto[x-placement^=bottom],.popover.bs-popover-bottom{margin-top:10px}.popover.bs-popover-auto[x-placement^=bottom] .arrow,.popover.bs-popover-bottom .arrow{top:0}.popover.bs-popover-auto[x-placement^=bottom] .arrow::after,.popover.bs-popover-auto[x-placement^=bottom] .arrow::before,.popover.bs-popover-bottom .arrow::after,.popover.bs-popover-bottom .arrow::before{margin-left:-7px;border-top-width:0}.popover.bs-popover-auto[x-placement^=bottom] .arrow::before,.popover.bs-popover-bottom .arrow::before{top:-11px;border-bottom-color:rgba(0,0,0,.25)}.popover.bs-popover-auto[x-placement^=bottom] .arrow::after,.popover.bs-popover-bottom .arrow::after{top:-10px;border-bottom-color:#fff}.popover.bs-popover-auto[x-placement^=bottom] .popover-header::before,.popover.bs-popover-bottom .popover-header::before{position:absolute;top:0;left:50%;display:block;width:20px;margin-left:-10px;content:"";border-bottom:1px solid #f7f7f7}.popover.bs-popover-auto[x-placement^=left],.popover.bs-popover-left{margin-right:10px}.popover.bs-popover-auto[x-placement^=left] .arrow,.popover.bs-popover-left .arrow{right:0}.popover.bs-popover-auto[x-placement^=left] .arrow::after,.popover.bs-popover-auto[x-placement^=left] .arrow::before,.popover.bs-popover-left .arrow::after,.popover.bs-popover-left .arrow::before{margin-top:-8px;border-right-width:0}.popover.bs-popover-auto[x-placement^=left] .arrow::before,.popover.bs-popover-left .arrow::before{right:-11px;border-left-color:rgba(0,0,0,.25)}.popover.bs-popover-auto[x-placement^=left] .arrow::after,.popover.bs-popover-left .arrow::after{right:-10px;border-left-color:#fff}.popover-header{padding:8px 14px;margin-bottom:0;font-size:1rem;color:inherit;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;border-top-left-radius:calc(.3rem - 1px);border-top-right-radius:calc(.3rem - 1px)}.popover-header:empty{display:none}.popover-body{padding:9px 14px;color:#212529}.carousel{position:relative}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-item{position:relative;display:none;-ms-flex-align:center;align-items:center;width:100%;transition:-webkit-transform .6s ease;transition:transform .6s ease;transition:transform .6s ease,-webkit-transform .6s ease;-webkit-backface-visibility:hidden;backface-visibility:hidden;-webkit-perspective:1000px;perspective:1000px}.carousel-item-next,.carousel-item-prev,.carousel-item.active{display:block}.carousel-item-next,.carousel-item-prev{position:absolute;top:0}.carousel-item-next.carousel-item-left,.carousel-item-prev.carousel-item-right{-webkit-transform:translateX(0);transform:translateX(0)}@supports ((-webkit-transform-style:preserve-3d) or (transform-style:preserve-3d)){.carousel-item-next.carousel-item-left,.carousel-item-prev.carousel-item-right{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}}.active.carousel-item-right,.carousel-item-next{-webkit-transform:translateX(100%);transform:translateX(100%)}@supports ((-webkit-transform-style:preserve-3d) or (transform-style:preserve-3d)){.active.carousel-item-right,.carousel-item-next{-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0)}}.active.carousel-item-left,.carousel-item-prev{-webkit-transform:translateX(-100%);transform:translateX(-100%)}@supports ((-webkit-transform-style:preserve-3d) or (transform-style:preserve-3d)){.active.carousel-item-left,.carousel-item-prev{-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0)}}.carousel-control-next,.carousel-control-prev{position:absolute;top:0;bottom:0;display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center;width:15%;color:#fff;text-align:center;opacity:.5}.carousel-control-next:focus,.carousel-control-next:hover,.carousel-control-prev:focus,.carousel-control-prev:hover{color:#fff;text-decoration:none;outline:0;opacity:.9}.carousel-control-prev{left:0}.carousel-control-next{right:0}.carousel-control-next-icon,.carousel-control-prev-icon{display:inline-block;width:20px;height:20px;background:transparent no-repeat center center;background-size:100% 100%}.carousel-control-prev-icon{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' viewBox='0 0 8 8'%3E%3Cpath d='M4 0l-4 4 4 4 1.5-1.5-2.5-2.5 2.5-2.5-1.5-1.5z'/%3E%3C/svg%3E")}.carousel-control-next-icon{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' viewBox='0 0 8 8'%3E%3Cpath d='M1.5 0l-1.5 1.5 2.5 2.5-2.5 2.5 1.5 1.5 4-4-4-4z'/%3E%3C/svg%3E")}.carousel-indicators{position:absolute;right:0;bottom:10px;left:0;z-index:15;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;padding-left:0;margin-right:15%;margin-left:15%;list-style:none}.carousel-indicators li{position:relative;-ms-flex:0 1 auto;flex:0 1 auto;width:30px;height:3px;margin-right:3px;margin-left:3px;text-indent:-999px;background-color:rgba(255,255,255,.5)}.carousel-indicators li::before{position:absolute;top:-10px;left:0;display:inline-block;width:100%;height:10px;content:""}.carousel-indicators li::after{position:absolute;bottom:-10px;left:0;display:inline-block;width:100%;height:10px;content:""}.carousel-indicators .active{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}.align-baseline{vertical-align:baseline!important}.align-top{vertical-align:top!important}.align-middle{vertical-align:middle!important}.align-bottom{vertical-align:bottom!important}.align-text-bottom{vertical-align:text-bottom!important}.align-text-top{vertical-align:text-top!important}.bg-primary{background-color:#007bff!important}a.bg-primary:focus,a.bg-primary:hover{background-color:#0062cc!important}.bg-secondary{background-color:#868e96!important}a.bg-secondary:focus,a.bg-secondary:hover{background-color:#6c757d!important}.bg-success{background-color:#28a745!important}a.bg-success:focus,a.bg-success:hover{background-color:#1e7e34!important}.bg-info{background-color:#17a2b8!important}a.bg-info:focus,a.bg-info:hover{background-color:#117a8b!important}.bg-warning{background-color:#ffc107!important}a.bg-warning:focus,a.bg-warning:hover{background-color:#d39e00!important}.bg-danger{background-color:#dc3545!important}a.bg-danger:focus,a.bg-danger:hover{background-color:#bd2130!important}.bg-light{background-color:#f8f9fa!important}a.bg-light:focus,a.bg-light:hover{background-color:#dae0e5!important}.bg-dark{background-color:#343a40!important}a.bg-dark:focus,a.bg-dark:hover{background-color:#1d2124!important}.bg-white{background-color:#fff!important}.bg-transparent{background-color:transparent!important}.border{border:1px solid #e9ecef!important}.border-0{border:0!important}.border-top-0{border-top:0!important}.border-right-0{border-right:0!important}.border-bottom-0{border-bottom:0!important}.border-left-0{border-left:0!important}.border-primary{border-color:#007bff!important}.border-secondary{border-color:#868e96!important}.border-success{border-color:#28a745!important}.border-info{border-color:#17a2b8!important}.border-warning{border-color:#ffc107!important}.border-danger{border-color:#dc3545!important}.border-light{border-color:#f8f9fa!important}.border-dark{border-color:#343a40!important}.border-white{border-color:#fff!important}.rounded{border-radius:.25rem!important}.rounded-top{border-top-left-radius:.25rem!important;border-top-right-radius:.25rem!important}.rounded-right{border-top-right-radius:.25rem!important;border-bottom-right-radius:.25rem!important}.rounded-bottom{border-bottom-right-radius:.25rem!important;border-bottom-left-radius:.25rem!important}.rounded-left{border-top-left-radius:.25rem!important;border-bottom-left-radius:.25rem!important}.rounded-circle{border-radius:50%}.rounded-0{border-radius:0}.clearfix::after{display:block;clear:both;content:""}.d-none{display:none!important}.d-inline{display:inline!important}.d-inline-block{display:inline-block!important}.d-block{display:block!important}.d-table{display:table!important}.d-table-cell{display:table-cell!important}.d-flex{display:-ms-flexbox!important;display:flex!important}.d-inline-flex{display:-ms-inline-flexbox!important;display:inline-flex!important}@media (min-width:576px){.d-sm-none{display:none!important}.d-sm-inline{display:inline!important}.d-sm-inline-block{display:inline-block!important}.d-sm-block{display:block!important}.d-sm-table{display:table!important}.d-sm-table-cell{display:table-cell!important}.d-sm-flex{display:-ms-flexbox!important;display:flex!important}.d-sm-inline-flex{display:-ms-inline-flexbox!important;display:inline-flex!important}}@media (min-width:768px){.d-md-none{display:none!important}.d-md-inline{display:inline!important}.d-md-inline-block{display:inline-block!important}.d-md-block{display:block!important}.d-md-table{display:table!important}.d-md-table-cell{display:table-cell!important}.d-md-flex{display:-ms-flexbox!important;display:flex!important}.d-md-inline-flex{display:-ms-inline-flexbox!important;display:inline-flex!important}}@media (min-width:992px){.d-lg-none{display:none!important}.d-lg-inline{display:inline!important}.d-lg-inline-block{display:inline-block!important}.d-lg-block{display:block!important}.d-lg-table{display:table!important}.d-lg-table-cell{display:table-cell!important}.d-lg-flex{display:-ms-flexbox!important;display:flex!important}.d-lg-inline-flex{display:-ms-inline-flexbox!important;display:inline-flex!important}}@media (min-width:1200px){.d-xl-none{display:none!important}.d-xl-inline{display:inline!important}.d-xl-inline-block{display:inline-block!important}.d-xl-block{display:block!important}.d-xl-table{display:table!important}.d-xl-table-cell{display:table-cell!important}.d-xl-flex{display:-ms-flexbox!important;display:flex!important}.d-xl-inline-flex{display:-ms-inline-flexbox!important;display:inline-flex!important}}.d-print-block{display:none!important}@media print{.d-print-block{display:block!important}}.d-print-inline{display:none!important}@media print{.d-print-inline{display:inline!important}}.d-print-inline-block{display:none!important}@media print{.d-print-inline-block{display:inline-block!important}}@media print{.d-print-none{display:none!important}}.embed-responsive{position:relative;display:block;width:100%;padding:0;overflow:hidden}.embed-responsive::before{display:block;content:""}.embed-responsive .embed-responsive-item,.embed-responsive embed,.embed-responsive iframe,.embed-responsive object,.embed-responsive video{position:absolute;top:0;bottom:0;left:0;width:100%;height:100%;border:0}.embed-responsive-21by9::before{padding-top:42.857143%}.embed-responsive-16by9::before{padding-top:56.25%}.embed-responsive-4by3::before{padding-top:75%}.embed-responsive-1by1::before{padding-top:100%}.flex-row{-ms-flex-direction:row!important;flex-direction:row!important}.flex-column{-ms-flex-direction:column!important;flex-direction:column!important}.flex-row-reverse{-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-column-reverse{-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.justify-content-start{-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-end{-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-center{-ms-flex-pack:center!important;justify-content:center!important}.justify-content-between{-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-start{-ms-flex-align:start!important;align-items:flex-start!important}.align-items-end{-ms-flex-align:end!important;align-items:flex-end!important}.align-items-center{-ms-flex-align:center!important;align-items:center!important}.align-items-baseline{-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-stretch{-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}@media (min-width:576px){.flex-sm-row{-ms-flex-direction:row!important;flex-direction:row!important}.flex-sm-column{-ms-flex-direction:column!important;flex-direction:column!important}.flex-sm-row-reverse{-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-sm-column-reverse{-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-sm-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-sm-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-sm-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.justify-content-sm-start{-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-sm-end{-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-sm-center{-ms-flex-pack:center!important;justify-content:center!important}.justify-content-sm-between{-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-sm-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-sm-start{-ms-flex-align:start!important;align-items:flex-start!important}.align-items-sm-end{-ms-flex-align:end!important;align-items:flex-end!important}.align-items-sm-center{-ms-flex-align:center!important;align-items:center!important}.align-items-sm-baseline{-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-sm-stretch{-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-sm-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-sm-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-sm-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-sm-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-sm-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-sm-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-sm-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-sm-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-sm-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-sm-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-sm-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-sm-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}}@media (min-width:768px){.flex-md-row{-ms-flex-direction:row!important;flex-direction:row!important}.flex-md-column{-ms-flex-direction:column!important;flex-direction:column!important}.flex-md-row-reverse{-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-md-column-reverse{-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-md-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-md-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-md-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.justify-content-md-start{-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-md-end{-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-md-center{-ms-flex-pack:center!important;justify-content:center!important}.justify-content-md-between{-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-md-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-md-start{-ms-flex-align:start!important;align-items:flex-start!important}.align-items-md-end{-ms-flex-align:end!important;align-items:flex-end!important}.align-items-md-center{-ms-flex-align:center!important;align-items:center!important}.align-items-md-baseline{-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-md-stretch{-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-md-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-md-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-md-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-md-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-md-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-md-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-md-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-md-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-md-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-md-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-md-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-md-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}}@media (min-width:992px){.flex-lg-row{-ms-flex-direction:row!important;flex-direction:row!important}.flex-lg-column{-ms-flex-direction:column!important;flex-direction:column!important}.flex-lg-row-reverse{-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-lg-column-reverse{-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-lg-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-lg-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-lg-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.justify-content-lg-start{-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-lg-end{-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-lg-center{-ms-flex-pack:center!important;justify-content:center!important}.justify-content-lg-between{-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-lg-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-lg-start{-ms-flex-align:start!important;align-items:flex-start!important}.align-items-lg-end{-ms-flex-align:end!important;align-items:flex-end!important}.align-items-lg-center{-ms-flex-align:center!important;align-items:center!important}.align-items-lg-baseline{-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-lg-stretch{-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-lg-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-lg-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-lg-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-lg-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-lg-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-lg-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-lg-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-lg-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-lg-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-lg-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-lg-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-lg-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}}@media (min-width:1200px){.flex-xl-row{-ms-flex-direction:row!important;flex-direction:row!important}.flex-xl-column{-ms-flex-direction:column!important;flex-direction:column!important}.flex-xl-row-reverse{-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-xl-column-reverse{-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-xl-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-xl-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-xl-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.justify-content-xl-start{-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-xl-end{-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-xl-center{-ms-flex-pack:center!important;justify-content:center!important}.justify-content-xl-between{-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-xl-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-xl-start{-ms-flex-align:start!important;align-items:flex-start!important}.align-items-xl-end{-ms-flex-align:end!important;align-items:flex-end!important}.align-items-xl-center{-ms-flex-align:center!important;align-items:center!important}.align-items-xl-baseline{-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-xl-stretch{-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-xl-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-xl-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-xl-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-xl-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-xl-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-xl-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-xl-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-xl-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-xl-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-xl-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-xl-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-xl-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}}.float-left{float:left!important}.float-right{float:right!important}.float-none{float:none!important}@media (min-width:576px){.float-sm-left{float:left!important}.float-sm-right{float:right!important}.float-sm-none{float:none!important}}@media (min-width:768px){.float-md-left{float:left!important}.float-md-right{float:right!important}.float-md-none{float:none!important}}@media (min-width:992px){.float-lg-left{float:left!important}.float-lg-right{float:right!important}.float-lg-none{float:none!important}}@media (min-width:1200px){.float-xl-left{float:left!important}.float-xl-right{float:right!important}.float-xl-none{float:none!important}}.fixed-top{position:fixed;top:0;right:0;left:0;z-index:1030}.fixed-bottom{position:fixed;right:0;bottom:0;left:0;z-index:1030}@supports ((position:-webkit-sticky) or (position:sticky)){.sticky-top{position:-webkit-sticky;position:sticky;top:0;z-index:1020}}.sr-only{position:absolute;width:1px;height:1px;padding:0;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;-webkit-clip-path:inset(50%);clip-path:inset(50%);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;overflow:visible;clip:auto;white-space:normal;-webkit-clip-path:none;clip-path:none}.w-25{width:25%!important}.w-50{width:50%!important}.w-75{width:75%!important}.w-100{width:100%!important}.h-25{height:25%!important}.h-50{height:50%!important}.h-75{height:75%!important}.h-100{height:100%!important}.mw-100{max-width:100%!important}.mh-100{max-height:100%!important}.m-0{margin:0!important}.mt-0{margin-top:0!important}.mr-0{margin-right:0!important}.mb-0{margin-bottom:0!important}.ml-0{margin-left:0!important}.mx-0{margin-right:0!important;margin-left:0!important}.my-0{margin-top:0!important;margin-bottom:0!important}.m-1{margin:.25rem!important}.mt-1{margin-top:.25rem!important}.mr-1{margin-right:.25rem!important}.mb-1{margin-bottom:.25rem!important}.ml-1{margin-left:.25rem!important}.mx-1{margin-right:.25rem!important;margin-left:.25rem!important}.my-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.m-2{margin:.5rem!important}.mt-2{margin-top:.5rem!important}.mr-2{margin-right:.5rem!important}.mb-2{margin-bottom:.5rem!important}.ml-2{margin-left:.5rem!important}.mx-2{margin-right:.5rem!important;margin-left:.5rem!important}.my-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.m-3{margin:1rem!important}.mt-3{margin-top:1rem!important}.mr-3{margin-right:1rem!important}.mb-3{margin-bottom:1rem!important}.ml-3{margin-left:1rem!important}.mx-3{margin-right:1rem!important;margin-left:1rem!important}.my-3{margin-top:1rem!important;margin-bottom:1rem!important}.m-4{margin:1.5rem!important}.mt-4{margin-top:1.5rem!important}.mr-4{margin-right:1.5rem!important}.mb-4{margin-bottom:1.5rem!important}.ml-4{margin-left:1.5rem!important}.mx-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.my-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.m-5{margin:3rem!important}.mt-5{margin-top:3rem!important}.mr-5{margin-right:3rem!important}.mb-5{margin-bottom:3rem!important}.ml-5{margin-left:3rem!important}.mx-5{margin-right:3rem!important;margin-left:3rem!important}.my-5{margin-top:3rem!important;margin-bottom:3rem!important}.p-0{padding:0!important}.pt-0{padding-top:0!important}.pr-0{padding-right:0!important}.pb-0{padding-bottom:0!important}.pl-0{padding-left:0!important}.px-0{padding-right:0!important;padding-left:0!important}.py-0{padding-top:0!important;padding-bottom:0!important}.p-1{padding:.25rem!important}.pt-1{padding-top:.25rem!important}.pr-1{padding-right:.25rem!important}.pb-1{padding-bottom:.25rem!important}.pl-1{padding-left:.25rem!important}.px-1{padding-right:.25rem!important;padding-left:.25rem!important}.py-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.p-2{padding:.5rem!important}.pt-2{padding-top:.5rem!important}.pr-2{padding-right:.5rem!important}.pb-2{padding-bottom:.5rem!important}.pl-2{padding-left:.5rem!important}.px-2{padding-right:.5rem!important;padding-left:.5rem!important}.py-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.p-3{padding:1rem!important}.pt-3{padding-top:1rem!important}.pr-3{padding-right:1rem!important}.pb-3{padding-bottom:1rem!important}.pl-3{padding-left:1rem!important}.px-3{padding-right:1rem!important;padding-left:1rem!important}.py-3{padding-top:1rem!important;padding-bottom:1rem!important}.p-4{padding:1.5rem!important}.pt-4{padding-top:1.5rem!important}.pr-4{padding-right:1.5rem!important}.pb-4{padding-bottom:1.5rem!important}.pl-4{padding-left:1.5rem!important}.px-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.py-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.p-5{padding:3rem!important}.pt-5{padding-top:3rem!important}.pr-5{padding-right:3rem!important}.pb-5{padding-bottom:3rem!important}.pl-5{padding-left:3rem!important}.px-5{padding-right:3rem!important;padding-left:3rem!important}.py-5{padding-top:3rem!important;padding-bottom:3rem!important}.m-auto{margin:auto!important}.mt-auto{margin-top:auto!important}.mr-auto{margin-right:auto!important}.mb-auto{margin-bottom:auto!important}.ml-auto{margin-left:auto!important}.mx-auto{margin-right:auto!important;margin-left:auto!important}.my-auto{margin-top:auto!important;margin-bottom:auto!important}@media (min-width:576px){.m-sm-0{margin:0!important}.mt-sm-0{margin-top:0!important}.mr-sm-0{margin-right:0!important}.mb-sm-0{margin-bottom:0!important}.ml-sm-0{margin-left:0!important}.mx-sm-0{margin-right:0!important;margin-left:0!important}.my-sm-0{margin-top:0!important;margin-bottom:0!important}.m-sm-1{margin:.25rem!important}.mt-sm-1{margin-top:.25rem!important}.mr-sm-1{margin-right:.25rem!important}.mb-sm-1{margin-bottom:.25rem!important}.ml-sm-1{margin-left:.25rem!important}.mx-sm-1{margin-right:.25rem!important;margin-left:.25rem!important}.my-sm-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.m-sm-2{margin:.5rem!important}.mt-sm-2{margin-top:.5rem!important}.mr-sm-2{margin-right:.5rem!important}.mb-sm-2{margin-bottom:.5rem!important}.ml-sm-2{margin-left:.5rem!important}.mx-sm-2{margin-right:.5rem!important;margin-left:.5rem!important}.my-sm-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.m-sm-3{margin:1rem!important}.mt-sm-3{margin-top:1rem!important}.mr-sm-3{margin-right:1rem!important}.mb-sm-3{margin-bottom:1rem!important}.ml-sm-3{margin-left:1rem!important}.mx-sm-3{margin-right:1rem!important;margin-left:1rem!important}.my-sm-3{margin-top:1rem!important;margin-bottom:1rem!important}.m-sm-4{margin:1.5rem!important}.mt-sm-4{margin-top:1.5rem!important}.mr-sm-4{margin-right:1.5rem!important}.mb-sm-4{margin-bottom:1.5rem!important}.ml-sm-4{margin-left:1.5rem!important}.mx-sm-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.my-sm-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.m-sm-5{margin:3rem!important}.mt-sm-5{margin-top:3rem!important}.mr-sm-5{margin-right:3rem!important}.mb-sm-5{margin-bottom:3rem!important}.ml-sm-5{margin-left:3rem!important}.mx-sm-5{margin-right:3rem!important;margin-left:3rem!important}.my-sm-5{margin-top:3rem!important;margin-bottom:3rem!important}.p-sm-0{padding:0!important}.pt-sm-0{padding-top:0!important}.pr-sm-0{padding-right:0!important}.pb-sm-0{padding-bottom:0!important}.pl-sm-0{padding-left:0!important}.px-sm-0{padding-right:0!important;padding-left:0!important}.py-sm-0{padding-top:0!important;padding-bottom:0!important}.p-sm-1{padding:.25rem!important}.pt-sm-1{padding-top:.25rem!important}.pr-sm-1{padding-right:.25rem!important}.pb-sm-1{padding-bottom:.25rem!important}.pl-sm-1{padding-left:.25rem!important}.px-sm-1{padding-right:.25rem!important;padding-left:.25rem!important}.py-sm-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.p-sm-2{padding:.5rem!important}.pt-sm-2{padding-top:.5rem!important}.pr-sm-2{padding-right:.5rem!important}.pb-sm-2{padding-bottom:.5rem!important}.pl-sm-2{padding-left:.5rem!important}.px-sm-2{padding-right:.5rem!important;padding-left:.5rem!important}.py-sm-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.p-sm-3{padding:1rem!important}.pt-sm-3{padding-top:1rem!important}.pr-sm-3{padding-right:1rem!important}.pb-sm-3{padding-bottom:1rem!important}.pl-sm-3{padding-left:1rem!important}.px-sm-3{padding-right:1rem!important;padding-left:1rem!important}.py-sm-3{padding-top:1rem!important;padding-bottom:1rem!important}.p-sm-4{padding:1.5rem!important}.pt-sm-4{padding-top:1.5rem!important}.pr-sm-4{padding-right:1.5rem!important}.pb-sm-4{padding-bottom:1.5rem!important}.pl-sm-4{padding-left:1.5rem!important}.px-sm-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.py-sm-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.p-sm-5{padding:3rem!important}.pt-sm-5{padding-top:3rem!important}.pr-sm-5{padding-right:3rem!important}.pb-sm-5{padding-bottom:3rem!important}.pl-sm-5{padding-left:3rem!important}.px-sm-5{padding-right:3rem!important;padding-left:3rem!important}.py-sm-5{padding-top:3rem!important;padding-bottom:3rem!important}.m-sm-auto{margin:auto!important}.mt-sm-auto{margin-top:auto!important}.mr-sm-auto{margin-right:auto!important}.mb-sm-auto{margin-bottom:auto!important}.ml-sm-auto{margin-left:auto!important}.mx-sm-auto{margin-right:auto!important;margin-left:auto!important}.my-sm-auto{margin-top:auto!important;margin-bottom:auto!important}}@media (min-width:768px){.m-md-0{margin:0!important}.mt-md-0{margin-top:0!important}.mr-md-0{margin-right:0!important}.mb-md-0{margin-bottom:0!important}.ml-md-0{margin-left:0!important}.mx-md-0{margin-right:0!important;margin-left:0!important}.my-md-0{margin-top:0!important;margin-bottom:0!important}.m-md-1{margin:.25rem!important}.mt-md-1{margin-top:.25rem!important}.mr-md-1{margin-right:.25rem!important}.mb-md-1{margin-bottom:.25rem!important}.ml-md-1{margin-left:.25rem!important}.mx-md-1{margin-right:.25rem!important;margin-left:.25rem!important}.my-md-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.m-md-2{margin:.5rem!important}.mt-md-2{margin-top:.5rem!important}.mr-md-2{margin-right:.5rem!important}.mb-md-2{margin-bottom:.5rem!important}.ml-md-2{margin-left:.5rem!important}.mx-md-2{margin-right:.5rem!important;margin-left:.5rem!important}.my-md-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.m-md-3{margin:1rem!important}.mt-md-3{margin-top:1rem!important}.mr-md-3{margin-right:1rem!important}.mb-md-3{margin-bottom:1rem!important}.ml-md-3{margin-left:1rem!important}.mx-md-3{margin-right:1rem!important;margin-left:1rem!important}.my-md-3{margin-top:1rem!important;margin-bottom:1rem!important}.m-md-4{margin:1.5rem!important}.mt-md-4{margin-top:1.5rem!important}.mr-md-4{margin-right:1.5rem!important}.mb-md-4{margin-bottom:1.5rem!important}.ml-md-4{margin-left:1.5rem!important}.mx-md-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.my-md-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.m-md-5{margin:3rem!important}.mt-md-5{margin-top:3rem!important}.mr-md-5{margin-right:3rem!important}.mb-md-5{margin-bottom:3rem!important}.ml-md-5{margin-left:3rem!important}.mx-md-5{margin-right:3rem!important;margin-left:3rem!important}.my-md-5{margin-top:3rem!important;margin-bottom:3rem!important}.p-md-0{padding:0!important}.pt-md-0{padding-top:0!important}.pr-md-0{padding-right:0!important}.pb-md-0{padding-bottom:0!important}.pl-md-0{padding-left:0!important}.px-md-0{padding-right:0!important;padding-left:0!important}.py-md-0{padding-top:0!important;padding-bottom:0!important}.p-md-1{padding:.25rem!important}.pt-md-1{padding-top:.25rem!important}.pr-md-1{padding-right:.25rem!important}.pb-md-1{padding-bottom:.25rem!important}.pl-md-1{padding-left:.25rem!important}.px-md-1{padding-right:.25rem!important;padding-left:.25rem!important}.py-md-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.p-md-2{padding:.5rem!important}.pt-md-2{padding-top:.5rem!important}.pr-md-2{padding-right:.5rem!important}.pb-md-2{padding-bottom:.5rem!important}.pl-md-2{padding-left:.5rem!important}.px-md-2{padding-right:.5rem!important;padding-left:.5rem!important}.py-md-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.p-md-3{padding:1rem!important}.pt-md-3{padding-top:1rem!important}.pr-md-3{padding-right:1rem!important}.pb-md-3{padding-bottom:1rem!important}.pl-md-3{padding-left:1rem!important}.px-md-3{padding-right:1rem!important;padding-left:1rem!important}.py-md-3{padding-top:1rem!important;padding-bottom:1rem!important}.p-md-4{padding:1.5rem!important}.pt-md-4{padding-top:1.5rem!important}.pr-md-4{padding-right:1.5rem!important}.pb-md-4{padding-bottom:1.5rem!important}.pl-md-4{padding-left:1.5rem!important}.px-md-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.py-md-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.p-md-5{padding:3rem!important}.pt-md-5{padding-top:3rem!important}.pr-md-5{padding-right:3rem!important}.pb-md-5{padding-bottom:3rem!important}.pl-md-5{padding-left:3rem!important}.px-md-5{padding-right:3rem!important;padding-left:3rem!important}.py-md-5{padding-top:3rem!important;padding-bottom:3rem!important}.m-md-auto{margin:auto!important}.mt-md-auto{margin-top:auto!important}.mr-md-auto{margin-right:auto!important}.mb-md-auto{margin-bottom:auto!important}.ml-md-auto{margin-left:auto!important}.mx-md-auto{margin-right:auto!important;margin-left:auto!important}.my-md-auto{margin-top:auto!important;margin-bottom:auto!important}}@media (min-width:992px){.m-lg-0{margin:0!important}.mt-lg-0{margin-top:0!important}.mr-lg-0{margin-right:0!important}.mb-lg-0{margin-bottom:0!important}.ml-lg-0{margin-left:0!important}.mx-lg-0{margin-right:0!important;margin-left:0!important}.my-lg-0{margin-top:0!important;margin-bottom:0!important}.m-lg-1{margin:.25rem!important}.mt-lg-1{margin-top:.25rem!important}.mr-lg-1{margin-right:.25rem!important}.mb-lg-1{margin-bottom:.25rem!important}.ml-lg-1{margin-left:.25rem!important}.mx-lg-1{margin-right:.25rem!important;margin-left:.25rem!important}.my-lg-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.m-lg-2{margin:.5rem!important}.mt-lg-2{margin-top:.5rem!important}.mr-lg-2{margin-right:.5rem!important}.mb-lg-2{margin-bottom:.5rem!important}.ml-lg-2{margin-left:.5rem!important}.mx-lg-2{margin-right:.5rem!important;margin-left:.5rem!important}.my-lg-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.m-lg-3{margin:1rem!important}.mt-lg-3{margin-top:1rem!important}.mr-lg-3{margin-right:1rem!important}.mb-lg-3{margin-bottom:1rem!important}.ml-lg-3{margin-left:1rem!important}.mx-lg-3{margin-right:1rem!important;margin-left:1rem!important}.my-lg-3{margin-top:1rem!important;margin-bottom:1rem!important}.m-lg-4{margin:1.5rem!important}.mt-lg-4{margin-top:1.5rem!important}.mr-lg-4{margin-right:1.5rem!important}.mb-lg-4{margin-bottom:1.5rem!important}.ml-lg-4{margin-left:1.5rem!important}.mx-lg-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.my-lg-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.m-lg-5{margin:3rem!important}.mt-lg-5{margin-top:3rem!important}.mr-lg-5{margin-right:3rem!important}.mb-lg-5{margin-bottom:3rem!important}.ml-lg-5{margin-left:3rem!important}.mx-lg-5{margin-right:3rem!important;margin-left:3rem!important}.my-lg-5{margin-top:3rem!important;margin-bottom:3rem!important}.p-lg-0{padding:0!important}.pt-lg-0{padding-top:0!important}.pr-lg-0{padding-right:0!important}.pb-lg-0{padding-bottom:0!important}.pl-lg-0{padding-left:0!important}.px-lg-0{padding-right:0!important;padding-left:0!important}.py-lg-0{padding-top:0!important;padding-bottom:0!important}.p-lg-1{padding:.25rem!important}.pt-lg-1{padding-top:.25rem!important}.pr-lg-1{padding-right:.25rem!important}.pb-lg-1{padding-bottom:.25rem!important}.pl-lg-1{padding-left:.25rem!important}.px-lg-1{padding-right:.25rem!important;padding-left:.25rem!important}.py-lg-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.p-lg-2{padding:.5rem!important}.pt-lg-2{padding-top:.5rem!important}.pr-lg-2{padding-right:.5rem!important}.pb-lg-2{padding-bottom:.5rem!important}.pl-lg-2{padding-left:.5rem!important}.px-lg-2{padding-right:.5rem!important;padding-left:.5rem!important}.py-lg-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.p-lg-3{padding:1rem!important}.pt-lg-3{padding-top:1rem!important}.pr-lg-3{padding-right:1rem!important}.pb-lg-3{padding-bottom:1rem!important}.pl-lg-3{padding-left:1rem!important}.px-lg-3{padding-right:1rem!important;padding-left:1rem!important}.py-lg-3{padding-top:1rem!important;padding-bottom:1rem!important}.p-lg-4{padding:1.5rem!important}.pt-lg-4{padding-top:1.5rem!important}.pr-lg-4{padding-right:1.5rem!important}.pb-lg-4{padding-bottom:1.5rem!important}.pl-lg-4{padding-left:1.5rem!important}.px-lg-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.py-lg-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.p-lg-5{padding:3rem!important}.pt-lg-5{padding-top:3rem!important}.pr-lg-5{padding-right:3rem!important}.pb-lg-5{padding-bottom:3rem!important}.pl-lg-5{padding-left:3rem!important}.px-lg-5{padding-right:3rem!important;padding-left:3rem!important}.py-lg-5{padding-top:3rem!important;padding-bottom:3rem!important}.m-lg-auto{margin:auto!important}.mt-lg-auto{margin-top:auto!important}.mr-lg-auto{margin-right:auto!important}.mb-lg-auto{margin-bottom:auto!important}.ml-lg-auto{margin-left:auto!important}.mx-lg-auto{margin-right:auto!important;margin-left:auto!important}.my-lg-auto{margin-top:auto!important;margin-bottom:auto!important}}@media (min-width:1200px){.m-xl-0{margin:0!important}.mt-xl-0{margin-top:0!important}.mr-xl-0{margin-right:0!important}.mb-xl-0{margin-bottom:0!important}.ml-xl-0{margin-left:0!important}.mx-xl-0{margin-right:0!important;margin-left:0!important}.my-xl-0{margin-top:0!important;margin-bottom:0!important}.m-xl-1{margin:.25rem!important}.mt-xl-1{margin-top:.25rem!important}.mr-xl-1{margin-right:.25rem!important}.mb-xl-1{margin-bottom:.25rem!important}.ml-xl-1{margin-left:.25rem!important}.mx-xl-1{margin-right:.25rem!important;margin-left:.25rem!important}.my-xl-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.m-xl-2{margin:.5rem!important}.mt-xl-2{margin-top:.5rem!important}.mr-xl-2{margin-right:.5rem!important}.mb-xl-2{margin-bottom:.5rem!important}.ml-xl-2{margin-left:.5rem!important}.mx-xl-2{margin-right:.5rem!important;margin-left:.5rem!important}.my-xl-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.m-xl-3{margin:1rem!important}.mt-xl-3{margin-top:1rem!important}.mr-xl-3{margin-right:1rem!important}.mb-xl-3{margin-bottom:1rem!important}.ml-xl-3{margin-left:1rem!important}.mx-xl-3{margin-right:1rem!important;margin-left:1rem!important}.my-xl-3{margin-top:1rem!important;margin-bottom:1rem!important}.m-xl-4{margin:1.5rem!important}.mt-xl-4{margin-top:1.5rem!important}.mr-xl-4{margin-right:1.5rem!important}.mb-xl-4{margin-bottom:1.5rem!important}.ml-xl-4{margin-left:1.5rem!important}.mx-xl-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.my-xl-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.m-xl-5{margin:3rem!important}.mt-xl-5{margin-top:3rem!important}.mr-xl-5{margin-right:3rem!important}.mb-xl-5{margin-bottom:3rem!important}.ml-xl-5{margin-left:3rem!important}.mx-xl-5{margin-right:3rem!important;margin-left:3rem!important}.my-xl-5{margin-top:3rem!important;margin-bottom:3rem!important}.p-xl-0{padding:0!important}.pt-xl-0{padding-top:0!important}.pr-xl-0{padding-right:0!important}.pb-xl-0{padding-bottom:0!important}.pl-xl-0{padding-left:0!important}.px-xl-0{padding-right:0!important;padding-left:0!important}.py-xl-0{padding-top:0!important;padding-bottom:0!important}.p-xl-1{padding:.25rem!important}.pt-xl-1{padding-top:.25rem!important}.pr-xl-1{padding-right:.25rem!important}.pb-xl-1{padding-bottom:.25rem!important}.pl-xl-1{padding-left:.25rem!important}.px-xl-1{padding-right:.25rem!important;padding-left:.25rem!important}.py-xl-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.p-xl-2{padding:.5rem!important}.pt-xl-2{padding-top:.5rem!important}.pr-xl-2{padding-right:.5rem!important}.pb-xl-2{padding-bottom:.5rem!important}.pl-xl-2{padding-left:.5rem!important}.px-xl-2{padding-right:.5rem!important;padding-left:.5rem!important}.py-xl-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.p-xl-3{padding:1rem!important}.pt-xl-3{padding-top:1rem!important}.pr-xl-3{padding-right:1rem!important}.pb-xl-3{padding-bottom:1rem!important}.pl-xl-3{padding-left:1rem!important}.px-xl-3{padding-right:1rem!important;padding-left:1rem!important}.py-xl-3{padding-top:1rem!important;padding-bottom:1rem!important}.p-xl-4{padding:1.5rem!important}.pt-xl-4{padding-top:1.5rem!important}.pr-xl-4{padding-right:1.5rem!important}.pb-xl-4{padding-bottom:1.5rem!important}.pl-xl-4{padding-left:1.5rem!important}.px-xl-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.py-xl-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.p-xl-5{padding:3rem!important}.pt-xl-5{padding-top:3rem!important}.pr-xl-5{padding-right:3rem!important}.pb-xl-5{padding-bottom:3rem!important}.pl-xl-5{padding-left:3rem!important}.px-xl-5{padding-right:3rem!important;padding-left:3rem!important}.py-xl-5{padding-top:3rem!important;padding-bottom:3rem!important}.m-xl-auto{margin:auto!important}.mt-xl-auto{margin-top:auto!important}.mr-xl-auto{margin-right:auto!important}.mb-xl-auto{margin-bottom:auto!important}.ml-xl-auto{margin-left:auto!important}.mx-xl-auto{margin-right:auto!important;margin-left:auto!important}.my-xl-auto{margin-top:auto!important;margin-bottom:auto!important}}.text-justify{text-align:justify!important}.text-nowrap{white-space:nowrap!important}.text-truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.text-left{text-align:left!important}.text-right{text-align:right!important}.text-center{text-align:center!important}@media (min-width:576px){.text-sm-left{text-align:left!important}.text-sm-right{text-align:right!important}.text-sm-center{text-align:center!important}}@media (min-width:768px){.text-md-left{text-align:left!important}.text-md-right{text-align:right!important}.text-md-center{text-align:center!important}}@media (min-width:992px){.text-lg-left{text-align:left!important}.text-lg-right{text-align:right!important}.text-lg-center{text-align:center!important}}@media (min-width:1200px){.text-xl-left{text-align:left!important}.text-xl-right{text-align:right!important}.text-xl-center{text-align:center!important}}.text-lowercase{text-transform:lowercase!important}.text-uppercase{text-transform:uppercase!important}.text-capitalize{text-transform:capitalize!important}.font-weight-normal{font-weight:400}.font-weight-bold{font-weight:700}.font-italic{font-style:italic}.text-white{color:#fff!important}.text-primary{color:#007bff!important}a.text-primary:focus,a.text-primary:hover{color:#0062cc!important}.text-secondary{color:#868e96!important}a.text-secondary:focus,a.text-secondary:hover{color:#6c757d!important}.text-success{color:#28a745!important}a.text-success:focus,a.text-success:hover{color:#1e7e34!important}.text-info{color:#17a2b8!important}a.text-info:focus,a.text-info:hover{color:#117a8b!important}.text-warning{color:#ffc107!important}a.text-warning:focus,a.text-warning:hover{color:#d39e00!important}.text-danger{color:#dc3545!important}a.text-danger:focus,a.text-danger:hover{color:#bd2130!important}.text-light{color:#f8f9fa!important}a.text-light:focus,a.text-light:hover{color:#dae0e5!important}.text-dark{color:#343a40!important}a.text-dark:focus,a.text-dark:hover{color:#1d2124!important}.text-muted{color:#868e96!important}.text-hide{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.visible{visibility:visible!important}.invisible{visibility:hidden!important}
+/*# sourceMappingURL=bootstrap.min.css.map */ \ No newline at end of file
diff --git a/library/bootstrap/css/bootstrap.min.css.map b/library/bootstrap/css/bootstrap.min.css.map
index de864dddd..24aa4f0c2 100644
--- a/library/bootstrap/css/bootstrap.min.css.map
+++ b/library/bootstrap/css/bootstrap.min.css.map
@@ -1 +1 @@
-{"version":3,"sources":["../../scss/bootstrap.scss","../../scss/_print.scss","dist/css/bootstrap.css","../../scss/_reboot.scss","bootstrap.css","../../scss/mixins/_hover.scss","../../scss/_type.scss","../../scss/mixins/_lists.scss","../../scss/_images.scss","../../scss/mixins/_image.scss","../../scss/mixins/_border-radius.scss","../../scss/mixins/_transition.scss","../../scss/_code.scss","../../scss/_grid.scss","../../scss/mixins/_grid.scss","../../scss/mixins/_breakpoints.scss","../../scss/mixins/_grid-framework.scss","../../scss/_tables.scss","../../scss/mixins/_table-row.scss","../../scss/_forms.scss","../../scss/mixins/_forms.scss","../../scss/_buttons.scss","../../scss/mixins/_buttons.scss","../../scss/_transitions.scss","../../scss/_dropdown.scss","../../scss/mixins/_nav-divider.scss","../../scss/_button-group.scss","../../scss/_input-group.scss","../../scss/_custom-forms.scss","../../scss/_nav.scss","../../scss/_navbar.scss","../../scss/_card.scss","../../scss/mixins/_cards.scss","../../scss/_breadcrumb.scss","../../scss/mixins/_clearfix.scss","../../scss/_pagination.scss","../../scss/mixins/_pagination.scss","../../scss/_badge.scss","../../scss/mixins/_badge.scss","../../scss/_jumbotron.scss","../../scss/_alert.scss","../../scss/mixins/_alert.scss","../../scss/_progress.scss","../../scss/mixins/_gradients.scss","../../scss/_media.scss","../../scss/_list-group.scss","../../scss/mixins/_list-group.scss","../../scss/_responsive-embed.scss","../../scss/_close.scss","../../scss/_modal.scss","../../scss/_tooltip.scss","../../scss/mixins/_reset-text.scss","../../scss/_popover.scss","../../scss/_carousel.scss","../../scss/utilities/_align.scss","../../scss/utilities/_background.scss","../../scss/mixins/_background-variant.scss","../../scss/utilities/_borders.scss","../../scss/utilities/_display.scss","../../scss/utilities/_flex.scss","../../scss/utilities/_float.scss","../../scss/mixins/_float.scss","../../scss/utilities/_position.scss","../../scss/utilities/_screenreaders.scss","../../scss/mixins/_screen-reader.scss","../../scss/utilities/_sizing.scss","../../scss/utilities/_spacing.scss","../../scss/utilities/_text.scss","../../scss/mixins/_text-truncate.scss","../../scss/mixins/_text-emphasis.scss","../../scss/mixins/_text-hide.scss","../../scss/utilities/_visibility.scss","../../scss/mixins/_visibility.scss"],"names":[],"mappings":"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R,MAAA,WEhCQ,QFgCR,MAAA,IEhCQ,SFgCR,MAAA,WEhCQ,SFgCR,MAAA,WEhCQ,SFgCR,MAAA,KEhCQ,QF4BR,KAAA,KE5BQ,QF4BR,KAAA,UE5BQ,QF4BR,KAAA,WE5BQ,QF4BR,KAAA,IE5BQ,QF4BR,KAAA,WE5BQ,QF4BR,KAAA,WE5BQ,QF4BR,KAAA,IE5BQ,QF4BR,KAAA,WE5BQ,QF4BR,KAAA,WE5BQ,QF4BR,KAAA,IE5BQ,SF4BR,KAAA,WE5BQ,SF4BR,KAAA,WE5BQ,SF4BR,KAAA,KEnBQ,UFeR,YAAA,UEfQ,UFeR,YAAA,WEfQ,UFeR,YAAA,IEfQ,UFeR,YAAA,WEfQ,UFeR,YAAA,WEfQ,UFeR,YAAA,IEfQ,UFeR,YAAA,WEfQ,UFeR,YAAA,WEfQ,UFeR,YAAA,IEfQ,WFeR,YAAA,WEfQ,WFeR,YAAA,WCjBE,yBCzBE,QACE,mBAAA,EAAA,wBAAA,EAAA,WAAA,EACA,iBAAA,EAAA,kBAAA,EAAA,kBAAA,EAAA,UAAA,EACA,UAAA,KAEF,aACE,iBAAA,EAAA,aAAA,EAAA,EAAA,KAAA,SAAA,EAAA,EAAA,KAAA,KAAA,EAAA,EAAA,KACA,MAAA,KAIA,UF2BN,MAAA,UE3BM,UF2BN,MAAA,WE3BM,UF2BN,MAAA,IE3BM,UF2BN,MAAA,WE3BM,UF2BN,MAAA,WE3BM,UF2BN,MAAA,IE3BM,UF2BN,MAAA,WE3BM,UF2BN,MAAA,WE3BM,UF2BN,MAAA,IE3BM,WF2BN,MAAA,WE3BM,WF2BN,MAAA,WE3BM,WF2BN,MAAA,KEpBQ,WFgCR,MAAA,KEhCQ,WFgCR,MAAA,UEhCQ,WFgCR,MAAA,WEhCQ,WFgCR,MAAA,IEhCQ,WFgCR,MAAA,WEhCQ,WFgCR,MAAA,WEhCQ,WFgCR,MAAA,IEhCQ,WFgCR,MAAA,WEhCQ,WFgCR,MAAA,WEhCQ,WFgCR,MAAA,IEhCQ,YFgCR,MAAA,WEhCQ,YFgCR,MAAA,WEhCQ,YFgCR,MAAA,KEhCQ,WF4BR,KAAA,KE5BQ,WF4BR,KAAA,UE5BQ,WF4BR,KAAA,WE5BQ,WF4BR,KAAA,IE5BQ,WF4BR,KAAA,WE5BQ,WF4BR,KAAA,WE5BQ,WF4BR,KAAA,IE5BQ,WF4BR,KAAA,WE5BQ,WF4BR,KAAA,WE5BQ,WF4BR,KAAA,IE5BQ,YF4BR,KAAA,WE5BQ,YF4BR,KAAA,WE5BQ,YF4BR,KAAA,KEnBQ,aFeR,YAAA,EEfQ,aFeR,YAAA,UEfQ,aFeR,YAAA,WEfQ,aFeR,YAAA,IEfQ,aFeR,YAAA,WEfQ,aFeR,YAAA,WEfQ,aFeR,YAAA,IEfQ,aFeR,YAAA,WEfQ,aFeR,YAAA,WEfQ,aFeR,YAAA,IEfQ,cFeR,YAAA,WEfQ,cFeR,YAAA,YCjBE,yBCzBE,QACE,mBAAA,EAAA,wBAAA,EAAA,WAAA,EACA,iBAAA,EAAA,kBAAA,EAAA,kBAAA,EAAA,UAAA,EACA,UAAA,KAEF,aACE,iBAAA,EAAA,aAAA,EAAA,EAAA,KAAA,SAAA,EAAA,EAAA,KAAA,KAAA,EAAA,EAAA,KACA,MAAA,KAIA,UF2BN,MAAA,UE3BM,UF2BN,MAAA,WE3BM,UF2BN,MAAA,IE3BM,UF2BN,MAAA,WE3BM,UF2BN,MAAA,WE3BM,UF2BN,MAAA,IE3BM,UF2BN,MAAA,WE3BM,UF2BN,MAAA,WE3BM,UF2BN,MAAA,IE3BM,WF2BN,MAAA,WE3BM,WF2BN,MAAA,WE3BM,WF2BN,MAAA,KEpBQ,WFgCR,MAAA,KEhCQ,WFgCR,MAAA,UEhCQ,WFgCR,MAAA,WEhCQ,WFgCR,MAAA,IEhCQ,WFgCR,MAAA,WEhCQ,WFgCR,MAAA,WEhCQ,WFgCR,MAAA,IEhCQ,WFgCR,MAAA,WEhCQ,WFgCR,MAAA,WEhCQ,WFgCR,MAAA,IEhCQ,YFgCR,MAAA,WEhCQ,YFgCR,MAAA,WEhCQ,YFgCR,MAAA,KEhCQ,WF4BR,KAAA,KE5BQ,WF4BR,KAAA,UE5BQ,WF4BR,KAAA,WE5BQ,WF4BR,KAAA,IE5BQ,WF4BR,KAAA,WE5BQ,WF4BR,KAAA,WE5BQ,WF4BR,KAAA,IE5BQ,WF4BR,KAAA,WE5BQ,WF4BR,KAAA,WE5BQ,WF4BR,KAAA,IE5BQ,YF4BR,KAAA,WE5BQ,YF4BR,KAAA,WE5BQ,YF4BR,KAAA,KEnBQ,aFeR,YAAA,EEfQ,aFeR,YAAA,UEfQ,aFeR,YAAA,WEfQ,aFeR,YAAA,IEfQ,aFeR,YAAA,WEfQ,aFeR,YAAA,WEfQ,aFeR,YAAA,IEfQ,aFeR,YAAA,WEfQ,aFeR,YAAA,WEfQ,aFeR,YAAA,IEfQ,cFeR,YAAA,WEfQ,cFeR,YAAA,YCjBE,yBCzBE,QACE,mBAAA,EAAA,wBAAA,EAAA,WAAA,EACA,iBAAA,EAAA,kBAAA,EAAA,kBAAA,EAAA,UAAA,EACA,UAAA,KAEF,aACE,iBAAA,EAAA,aAAA,EAAA,EAAA,KAAA,SAAA,EAAA,EAAA,KAAA,KAAA,EAAA,EAAA,KACA,MAAA,KAIA,UF2BN,MAAA,UE3BM,UF2BN,MAAA,WE3BM,UF2BN,MAAA,IE3BM,UF2BN,MAAA,WE3BM,UF2BN,MAAA,WE3BM,UF2BN,MAAA,IE3BM,UF2BN,MAAA,WE3BM,UF2BN,MAAA,WE3BM,UF2BN,MAAA,IE3BM,WF2BN,MAAA,WE3BM,WF2BN,MAAA,WE3BM,WF2BN,MAAA,KEpBQ,WFgCR,MAAA,KEhCQ,WFgCR,MAAA,UEhCQ,WFgCR,MAAA,WEhCQ,WFgCR,MAAA,IEhCQ,WFgCR,MAAA,WEhCQ,WFgCR,MAAA,WEhCQ,WFgCR,MAAA,IEhCQ,WFgCR,MAAA,WEhCQ,WFgCR,MAAA,WEhCQ,WFgCR,MAAA,IEhCQ,YFgCR,MAAA,WEhCQ,YFgCR,MAAA,WEhCQ,YFgCR,MAAA,KEhCQ,WF4BR,KAAA,KE5BQ,WF4BR,KAAA,UE5BQ,WF4BR,KAAA,WE5BQ,WF4BR,KAAA,IE5BQ,WF4BR,KAAA,WE5BQ,WF4BR,KAAA,WE5BQ,WF4BR,KAAA,IE5BQ,WF4BR,KAAA,WE5BQ,WF4BR,KAAA,WE5BQ,WF4BR,KAAA,IE5BQ,YF4BR,KAAA,WE5BQ,YF4BR,KAAA,WE5BQ,YF4BR,KAAA,KEnBQ,aFeR,YAAA,EEfQ,aFeR,YAAA,UEfQ,aFeR,YAAA,WEfQ,aFeR,YAAA,IEfQ,aFeR,YAAA,WEfQ,aFeR,YAAA,WEfQ,aFeR,YAAA,IEfQ,aFeR,YAAA,WEfQ,aFeR,YAAA,WEfQ,aFeR,YAAA,IEfQ,cFeR,YAAA,WEfQ,cFeR,YAAA,YCjBE,0BCzBE,QACE,mBAAA,EAAA,wBAAA,EAAA,WAAA,EACA,iBAAA,EAAA,kBAAA,EAAA,kBAAA,EAAA,UAAA,EACA,UAAA,KAEF,aACE,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"} \ No newline at end of file
+{"version":3,"sources":["../../scss/bootstrap.scss","../../scss/_print.scss","dist/css/bootstrap.css","../../scss/_reboot.scss","bootstrap.css","../../scss/mixins/_hover.scss","../../scss/_type.scss","../../scss/mixins/_lists.scss","../../scss/_images.scss","../../scss/mixins/_image.scss","../../scss/mixins/_border-radius.scss","../../scss/mixins/_transition.scss","../../scss/_code.scss","../../scss/_grid.scss","../../scss/mixins/_grid.scss","../../scss/mixins/_breakpoints.scss","../../scss/mixins/_grid-framework.scss","../../scss/_tables.scss","../../scss/mixins/_table-row.scss","../../scss/_forms.scss","../../scss/mixins/_forms.scss","../../scss/_buttons.scss","../../scss/mixins/_buttons.scss","../../scss/_functions.scss","../../scss/_transitions.scss","../../scss/_dropdown.scss","../../scss/mixins/_nav-divider.scss","../../scss/_button-group.scss","../../scss/_input-group.scss","../../scss/_custom-forms.scss","../../scss/_nav.scss","../../scss/_navbar.scss","../../scss/_card.scss","../../scss/_breadcrumb.scss","../../scss/mixins/_clearfix.scss","../../scss/_pagination.scss","../../scss/mixins/_pagination.scss","../../scss/_badge.scss","../../scss/mixins/_badge.scss","../../scss/_jumbotron.scss","../../scss/_alert.scss","../../scss/mixins/_alert.scss","../../scss/_progress.scss","../../scss/mixins/_gradients.scss","../../scss/_media.scss","../../scss/_list-group.scss","../../scss/mixins/_list-group.scss","../../scss/_close.scss","../../scss/_modal.scss","../../scss/_tooltip.scss","../../scss/mixins/_reset-text.scss","../../scss/_popover.scss","../../scss/_carousel.scss","../../scss/utilities/_align.scss","../../scss/mixins/_background-variant.scss","../../scss/utilities/_background.scss","../../scss/utilities/_borders.scss","../../scss/utilities/_display.scss","../../scss/utilities/_embed.scss","../../scss/utilities/_flex.scss","../../scss/utilities/_float.scss","../../scss/mixins/_float.scss","../../scss/utilities/_position.scss","../../scss/utilities/_screenreaders.scss","../../scss/mixins/_screen-reader.scss","../../scss/utilities/_sizing.scss","../../scss/utilities/_spacing.scss","../../scss/utilities/_text.scss","../../scss/mixins/_text-truncate.scss","../../scss/mixins/_text-emphasis.scss","../../scss/mixins/_text-hide.scss","../../scss/utilities/_visibility.scss","../../scss/mixins/_visibility.scss"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Bootstrap v4.0.0-beta (https://getbootstrap.com)\n * Copyright 2011-2017 The Bootstrap Authors\n * Copyright 2011-2017 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n */\n\n@import \"functions\";\n@import \"variables\";\n@import \"mixins\";\n@import \"print\";\n@import \"reboot\";\n@import \"type\";\n@import \"images\";\n@import \"code\";\n@import \"grid\";\n@import \"tables\";\n@import \"forms\";\n@import \"buttons\";\n@import \"transitions\";\n@import \"dropdown\";\n@import \"button-group\";\n@import \"input-group\";\n@import \"custom-forms\";\n@import \"nav\";\n@import \"navbar\";\n@import \"card\";\n@import \"breadcrumb\";\n@import \"pagination\";\n@import \"badge\";\n@import \"jumbotron\";\n@import \"alert\";\n@import \"progress\";\n@import \"media\";\n@import \"list-group\";\n@import \"close\";\n@import \"modal\";\n@import \"tooltip\";\n@import \"popover\";\n@import \"carousel\";\n@import \"utilities\";\n","// scss-lint:disable QualifyingElement\n\n// Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css\n\n// ==========================================================================\n// Print styles.\n// Inlined to avoid the additional HTTP request:\n// http://www.phpied.com/delay-loading-your-print-css/\n// ==========================================================================\n\n@if $enable-print-styles {\n @media print {\n *,\n *::before,\n *::after {\n // Bootstrap specific; comment out `color` and `background`\n //color: #000 !important; // Black prints faster:\n // http://www.sanbeiji.com/archives/953\n text-shadow: none !important;\n //background: transparent !important;\n box-shadow: none !important;\n }\n\n a,\n a:visited {\n text-decoration: underline;\n }\n\n // Bootstrap specific; comment the following selector out\n //a[href]::after {\n // content: \" (\" attr(href) \")\";\n //}\n\n abbr[title]::after {\n content: \" (\" attr(title) \")\";\n }\n\n // Bootstrap specific; comment the following selector out\n //\n // Don't show links that are fragment identifiers,\n // or use the `javascript:` pseudo protocol\n //\n\n //a[href^=\"#\"]::after,\n //a[href^=\"javascript:\"]::after {\n // content: \"\";\n //}\n\n pre {\n white-space: pre-wrap !important;\n }\n pre,\n blockquote {\n border: $border-width solid #999; // Bootstrap custom code; using `$border-width` instead of 1px\n page-break-inside: avoid;\n }\n\n //\n // Printing Tables:\n // http://css-discuss.incutio.com/wiki/Printing_Tables\n //\n\n thead {\n display: table-header-group;\n }\n\n tr,\n img {\n page-break-inside: avoid;\n }\n\n p,\n h2,\n h3 {\n orphans: 3;\n widows: 3;\n }\n\n h2,\n h3 {\n page-break-after: avoid;\n }\n\n // Bootstrap specific changes start\n\n // Bootstrap components\n .navbar {\n display: none;\n }\n .badge {\n border: $border-width solid #000;\n }\n\n .table {\n border-collapse: collapse !important;\n\n td,\n th {\n background-color: #fff !important;\n }\n }\n .table-bordered {\n th,\n td {\n border: 1px solid #ddd !important;\n }\n }\n\n // Bootstrap specific changes end\n }\n}\n","/*!\n * Bootstrap v4.0.0-beta (https://getbootstrap.com)\n * Copyright 2011-2017 The Bootstrap Authors\n * Copyright 2011-2017 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n */\n@media print {\n *,\n *::before,\n *::after {\n text-shadow: none !important;\n box-shadow: none !important;\n }\n a,\n a:visited {\n text-decoration: underline;\n }\n abbr[title]::after {\n content: \" (\" attr(title) \")\";\n }\n pre {\n white-space: pre-wrap !important;\n }\n pre,\n blockquote {\n border: 1px solid #999;\n page-break-inside: avoid;\n }\n thead {\n display: table-header-group;\n }\n tr,\n img {\n page-break-inside: avoid;\n }\n p,\n h2,\n h3 {\n orphans: 3;\n widows: 3;\n }\n h2,\n h3 {\n page-break-after: avoid;\n }\n .navbar {\n display: none;\n }\n .badge {\n border: 1px solid #000;\n }\n .table {\n border-collapse: collapse !important;\n }\n .table td,\n .table th {\n background-color: #fff !important;\n }\n .table-bordered th,\n .table-bordered td {\n border: 1px solid #ddd !important;\n }\n}\n\nhtml {\n box-sizing: border-box;\n font-family: sans-serif;\n line-height: 1.15;\n -webkit-text-size-adjust: 100%;\n -ms-text-size-adjust: 100%;\n -ms-overflow-style: scrollbar;\n -webkit-tap-highlight-color: transparent;\n}\n\n*,\n*::before,\n*::after {\n box-sizing: inherit;\n}\n\n@-ms-viewport {\n width: device-width;\n}\n\narticle, aside, dialog, figcaption, figure, footer, header, hgroup, main, nav, section {\n display: block;\n}\n\nbody {\n margin: 0;\n font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, \"Helvetica Neue\", Arial, sans-serif;\n font-size: 1rem;\n font-weight: normal;\n line-height: 1.5;\n color: #212529;\n background-color: #fff;\n}\n\n[tabindex=\"-1\"]:focus {\n outline: none !important;\n}\n\nhr {\n box-sizing: content-box;\n height: 0;\n overflow: visible;\n}\n\nh1, h2, h3, h4, h5, h6 {\n margin-top: 0;\n margin-bottom: .5rem;\n}\n\np {\n margin-top: 0;\n margin-bottom: 1rem;\n}\n\nabbr[title],\nabbr[data-original-title] {\n text-decoration: underline;\n -webkit-text-decoration: underline dotted;\n text-decoration: underline dotted;\n cursor: help;\n border-bottom: 0;\n}\n\naddress {\n margin-bottom: 1rem;\n font-style: normal;\n line-height: inherit;\n}\n\nol,\nul,\ndl {\n margin-top: 0;\n margin-bottom: 1rem;\n}\n\nol ol,\nul ul,\nol ul,\nul ol {\n margin-bottom: 0;\n}\n\ndt {\n font-weight: bold;\n}\n\ndd {\n margin-bottom: .5rem;\n margin-left: 0;\n}\n\nblockquote {\n margin: 0 0 1rem;\n}\n\ndfn {\n font-style: italic;\n}\n\nb,\nstrong {\n font-weight: bolder;\n}\n\nsmall {\n font-size: 80%;\n}\n\nsub,\nsup {\n position: relative;\n font-size: 75%;\n line-height: 0;\n vertical-align: baseline;\n}\n\nsub {\n bottom: -.25em;\n}\n\nsup {\n top: -.5em;\n}\n\na {\n color: #007bff;\n text-decoration: none;\n background-color: transparent;\n -webkit-text-decoration-skip: objects;\n}\n\na:hover {\n color: #0056b3;\n text-decoration: underline;\n}\n\na:not([href]):not([tabindex]) {\n color: inherit;\n text-decoration: none;\n}\n\na:not([href]):not([tabindex]):focus, a:not([href]):not([tabindex]):hover {\n color: inherit;\n text-decoration: none;\n}\n\na:not([href]):not([tabindex]):focus {\n outline: 0;\n}\n\npre,\ncode,\nkbd,\nsamp {\n font-family: monospace, monospace;\n font-size: 1em;\n}\n\npre {\n margin-top: 0;\n margin-bottom: 1rem;\n overflow: auto;\n}\n\nfigure {\n margin: 0 0 1rem;\n}\n\nimg {\n vertical-align: middle;\n border-style: none;\n}\n\nsvg:not(:root) {\n overflow: hidden;\n}\n\na,\narea,\nbutton,\n[role=\"button\"],\ninput,\nlabel,\nselect,\nsummary,\ntextarea {\n -ms-touch-action: manipulation;\n touch-action: manipulation;\n}\n\ntable {\n border-collapse: collapse;\n}\n\ncaption {\n padding-top: 0.75rem;\n padding-bottom: 0.75rem;\n color: #868e96;\n text-align: left;\n caption-side: bottom;\n}\n\nth {\n text-align: left;\n}\n\nlabel {\n display: inline-block;\n margin-bottom: .5rem;\n}\n\nbutton:focus {\n outline: 1px dotted;\n outline: 5px auto -webkit-focus-ring-color;\n}\n\ninput,\nbutton,\nselect,\noptgroup,\ntextarea {\n margin: 0;\n font-family: inherit;\n font-size: inherit;\n line-height: inherit;\n}\n\nbutton,\ninput {\n overflow: visible;\n}\n\nbutton,\nselect {\n text-transform: none;\n}\n\nbutton,\nhtml [type=\"button\"],\n[type=\"reset\"],\n[type=\"submit\"] {\n -webkit-appearance: button;\n}\n\nbutton::-moz-focus-inner,\n[type=\"button\"]::-moz-focus-inner,\n[type=\"reset\"]::-moz-focus-inner,\n[type=\"submit\"]::-moz-focus-inner {\n padding: 0;\n border-style: none;\n}\n\ninput[type=\"radio\"],\ninput[type=\"checkbox\"] {\n box-sizing: border-box;\n padding: 0;\n}\n\ninput[type=\"date\"],\ninput[type=\"time\"],\ninput[type=\"datetime-local\"],\ninput[type=\"month\"] {\n -webkit-appearance: listbox;\n}\n\ntextarea {\n overflow: auto;\n resize: vertical;\n}\n\nfieldset {\n min-width: 0;\n padding: 0;\n margin: 0;\n border: 0;\n}\n\nlegend {\n display: block;\n width: 100%;\n max-width: 100%;\n padding: 0;\n margin-bottom: .5rem;\n font-size: 1.5rem;\n line-height: inherit;\n color: inherit;\n white-space: normal;\n}\n\nprogress {\n vertical-align: baseline;\n}\n\n[type=\"number\"]::-webkit-inner-spin-button,\n[type=\"number\"]::-webkit-outer-spin-button {\n height: auto;\n}\n\n[type=\"search\"] {\n outline-offset: -2px;\n -webkit-appearance: none;\n}\n\n[type=\"search\"]::-webkit-search-cancel-button,\n[type=\"search\"]::-webkit-search-decoration {\n -webkit-appearance: none;\n}\n\n::-webkit-file-upload-button {\n font: inherit;\n -webkit-appearance: button;\n}\n\noutput {\n display: inline-block;\n}\n\nsummary {\n display: list-item;\n}\n\ntemplate {\n display: none;\n}\n\n[hidden] {\n display: none !important;\n}\n\nh1, h2, h3, h4, h5, h6,\n.h1, .h2, .h3, .h4, .h5, .h6 {\n margin-bottom: 0.5rem;\n font-family: inherit;\n font-weight: 500;\n line-height: 1.1;\n color: inherit;\n}\n\nh1, .h1 {\n font-size: 2.5rem;\n}\n\nh2, .h2 {\n font-size: 2rem;\n}\n\nh3, .h3 {\n font-size: 1.75rem;\n}\n\nh4, .h4 {\n font-size: 1.5rem;\n}\n\nh5, .h5 {\n font-size: 1.25rem;\n}\n\nh6, .h6 {\n font-size: 1rem;\n}\n\n.lead {\n font-size: 1.25rem;\n font-weight: 300;\n}\n\n.display-1 {\n font-size: 6rem;\n font-weight: 300;\n line-height: 1.1;\n}\n\n.display-2 {\n font-size: 5.5rem;\n font-weight: 300;\n line-height: 1.1;\n}\n\n.display-3 {\n font-size: 4.5rem;\n font-weight: 300;\n line-height: 1.1;\n}\n\n.display-4 {\n font-size: 3.5rem;\n font-weight: 300;\n line-height: 1.1;\n}\n\nhr {\n margin-top: 1rem;\n margin-bottom: 1rem;\n border: 0;\n border-top: 1px solid rgba(0, 0, 0, 0.1);\n}\n\nsmall,\n.small {\n font-size: 80%;\n font-weight: normal;\n}\n\nmark,\n.mark {\n padding: 0.2em;\n background-color: #fcf8e3;\n}\n\n.list-unstyled {\n padding-left: 0;\n list-style: none;\n}\n\n.list-inline {\n padding-left: 0;\n list-style: none;\n}\n\n.list-inline-item {\n display: inline-block;\n}\n\n.list-inline-item:not(:last-child) {\n margin-right: 5px;\n}\n\n.initialism {\n font-size: 90%;\n text-transform: uppercase;\n}\n\n.blockquote {\n margin-bottom: 1rem;\n font-size: 1.25rem;\n}\n\n.blockquote-footer {\n display: block;\n font-size: 80%;\n color: #868e96;\n}\n\n.blockquote-footer::before {\n content: \"\\2014 \\00A0\";\n}\n\n.img-fluid {\n max-width: 100%;\n height: auto;\n}\n\n.img-thumbnail {\n padding: 0.25rem;\n background-color: #fff;\n border: 1px solid #ddd;\n border-radius: 0.25rem;\n transition: all 0.2s ease-in-out;\n max-width: 100%;\n height: auto;\n}\n\n.figure {\n display: inline-block;\n}\n\n.figure-img {\n margin-bottom: 0.5rem;\n line-height: 1;\n}\n\n.figure-caption {\n font-size: 90%;\n color: #868e96;\n}\n\ncode,\nkbd,\npre,\nsamp {\n font-family: Menlo, Monaco, Consolas, \"Liberation Mono\", \"Courier New\", monospace;\n}\n\ncode {\n padding: 0.2rem 0.4rem;\n font-size: 90%;\n color: #bd4147;\n background-color: #f8f9fa;\n border-radius: 0.25rem;\n}\n\na > code {\n padding: 0;\n color: inherit;\n background-color: inherit;\n}\n\nkbd {\n padding: 0.2rem 0.4rem;\n font-size: 90%;\n color: #fff;\n background-color: #212529;\n border-radius: 0.2rem;\n}\n\nkbd kbd {\n padding: 0;\n font-size: 100%;\n font-weight: bold;\n}\n\npre {\n display: block;\n margin-top: 0;\n margin-bottom: 1rem;\n font-size: 90%;\n color: #212529;\n}\n\npre code {\n padding: 0;\n font-size: inherit;\n color: inherit;\n background-color: transparent;\n border-radius: 0;\n}\n\n.pre-scrollable {\n max-height: 340px;\n overflow-y: scroll;\n}\n\n.container {\n margin-right: auto;\n margin-left: auto;\n padding-right: 15px;\n padding-left: 15px;\n width: 100%;\n}\n\n@media (min-width: 576px) {\n .container {\n max-width: 540px;\n }\n}\n\n@media (min-width: 768px) {\n .container {\n max-width: 720px;\n }\n}\n\n@media (min-width: 992px) {\n .container {\n max-width: 960px;\n }\n}\n\n@media (min-width: 1200px) {\n .container {\n max-width: 1140px;\n }\n}\n\n.container-fluid {\n width: 100%;\n margin-right: auto;\n margin-left: auto;\n padding-right: 15px;\n padding-left: 15px;\n width: 100%;\n}\n\n.row {\n display: -ms-flexbox;\n display: flex;\n -ms-flex-wrap: wrap;\n flex-wrap: wrap;\n margin-right: -15px;\n margin-left: -15px;\n}\n\n.no-gutters {\n margin-right: 0;\n margin-left: 0;\n}\n\n.no-gutters > .col,\n.no-gutters > [class*=\"col-\"] {\n padding-right: 0;\n padding-left: 0;\n}\n\n.col-1, .col-2, .col-3, .col-4, .col-5, .col-6, .col-7, .col-8, .col-9, .col-10, .col-11, .col-12, .col,\n.col-auto, .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, .col-sm,\n.col-sm-auto, .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, .col-md,\n.col-md-auto, .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, .col-lg,\n.col-lg-auto, .col-xl-1, .col-xl-2, .col-xl-3, .col-xl-4, .col-xl-5, .col-xl-6, .col-xl-7, .col-xl-8, .col-xl-9, .col-xl-10, .col-xl-11, .col-xl-12, .col-xl,\n.col-xl-auto {\n position: relative;\n width: 100%;\n min-height: 1px;\n padding-right: 15px;\n padding-left: 15px;\n}\n\n.col {\n -ms-flex-preferred-size: 0;\n flex-basis: 0;\n -ms-flex-positive: 1;\n flex-grow: 1;\n max-width: 100%;\n}\n\n.col-auto {\n -ms-flex: 0 0 auto;\n flex: 0 0 auto;\n width: auto;\n max-width: none;\n}\n\n.col-1 {\n -ms-flex: 0 0 8.333333%;\n flex: 0 0 8.333333%;\n max-width: 8.333333%;\n}\n\n.col-2 {\n -ms-flex: 0 0 16.666667%;\n flex: 0 0 16.666667%;\n max-width: 16.666667%;\n}\n\n.col-3 {\n -ms-flex: 0 0 25%;\n flex: 0 0 25%;\n max-width: 25%;\n}\n\n.col-4 {\n -ms-flex: 0 0 33.333333%;\n flex: 0 0 33.333333%;\n max-width: 33.333333%;\n}\n\n.col-5 {\n -ms-flex: 0 0 41.666667%;\n flex: 0 0 41.666667%;\n max-width: 41.666667%;\n}\n\n.col-6 {\n -ms-flex: 0 0 50%;\n flex: 0 0 50%;\n max-width: 50%;\n}\n\n.col-7 {\n -ms-flex: 0 0 58.333333%;\n flex: 0 0 58.333333%;\n max-width: 58.333333%;\n}\n\n.col-8 {\n -ms-flex: 0 0 66.666667%;\n flex: 0 0 66.666667%;\n max-width: 66.666667%;\n}\n\n.col-9 {\n -ms-flex: 0 0 75%;\n flex: 0 0 75%;\n max-width: 75%;\n}\n\n.col-10 {\n -ms-flex: 0 0 83.333333%;\n flex: 0 0 83.333333%;\n max-width: 83.333333%;\n}\n\n.col-11 {\n -ms-flex: 0 0 91.666667%;\n flex: 0 0 91.666667%;\n max-width: 91.666667%;\n}\n\n.col-12 {\n -ms-flex: 0 0 100%;\n flex: 0 0 100%;\n max-width: 100%;\n}\n\n.order-1 {\n -ms-flex-order: 1;\n order: 1;\n}\n\n.order-2 {\n -ms-flex-order: 2;\n order: 2;\n}\n\n.order-3 {\n -ms-flex-order: 3;\n order: 3;\n}\n\n.order-4 {\n -ms-flex-order: 4;\n order: 4;\n}\n\n.order-5 {\n -ms-flex-order: 5;\n order: 5;\n}\n\n.order-6 {\n -ms-flex-order: 6;\n order: 6;\n}\n\n.order-7 {\n -ms-flex-order: 7;\n order: 7;\n}\n\n.order-8 {\n -ms-flex-order: 8;\n order: 8;\n}\n\n.order-9 {\n -ms-flex-order: 9;\n order: 9;\n}\n\n.order-10 {\n -ms-flex-order: 10;\n order: 10;\n}\n\n.order-11 {\n -ms-flex-order: 11;\n order: 11;\n}\n\n.order-12 {\n -ms-flex-order: 12;\n order: 12;\n}\n\n@media (min-width: 576px) {\n .col-sm {\n -ms-flex-preferred-size: 0;\n flex-basis: 0;\n -ms-flex-positive: 1;\n flex-grow: 1;\n max-width: 100%;\n }\n .col-sm-auto {\n -ms-flex: 0 0 auto;\n flex: 0 0 auto;\n width: auto;\n max-width: none;\n }\n .col-sm-1 {\n -ms-flex: 0 0 8.333333%;\n flex: 0 0 8.333333%;\n max-width: 8.333333%;\n }\n .col-sm-2 {\n -ms-flex: 0 0 16.666667%;\n flex: 0 0 16.666667%;\n max-width: 16.666667%;\n }\n .col-sm-3 {\n -ms-flex: 0 0 25%;\n flex: 0 0 25%;\n max-width: 25%;\n }\n .col-sm-4 {\n -ms-flex: 0 0 33.333333%;\n flex: 0 0 33.333333%;\n max-width: 33.333333%;\n }\n .col-sm-5 {\n -ms-flex: 0 0 41.666667%;\n flex: 0 0 41.666667%;\n max-width: 41.666667%;\n }\n .col-sm-6 {\n -ms-flex: 0 0 50%;\n flex: 0 0 50%;\n max-width: 50%;\n }\n .col-sm-7 {\n -ms-flex: 0 0 58.333333%;\n flex: 0 0 58.333333%;\n max-width: 58.333333%;\n }\n .col-sm-8 {\n -ms-flex: 0 0 66.666667%;\n flex: 0 0 66.666667%;\n max-width: 66.666667%;\n }\n .col-sm-9 {\n -ms-flex: 0 0 75%;\n flex: 0 0 75%;\n max-width: 75%;\n }\n .col-sm-10 {\n -ms-flex: 0 0 83.333333%;\n flex: 0 0 83.333333%;\n max-width: 83.333333%;\n }\n .col-sm-11 {\n -ms-flex: 0 0 91.666667%;\n flex: 0 0 91.666667%;\n max-width: 91.666667%;\n }\n .col-sm-12 {\n -ms-flex: 0 0 100%;\n flex: 0 0 100%;\n max-width: 100%;\n }\n .order-sm-1 {\n -ms-flex-order: 1;\n order: 1;\n }\n .order-sm-2 {\n -ms-flex-order: 2;\n order: 2;\n }\n .order-sm-3 {\n -ms-flex-order: 3;\n order: 3;\n }\n .order-sm-4 {\n -ms-flex-order: 4;\n order: 4;\n }\n .order-sm-5 {\n -ms-flex-order: 5;\n order: 5;\n }\n .order-sm-6 {\n -ms-flex-order: 6;\n order: 6;\n }\n .order-sm-7 {\n -ms-flex-order: 7;\n order: 7;\n }\n .order-sm-8 {\n -ms-flex-order: 8;\n order: 8;\n }\n .order-sm-9 {\n -ms-flex-order: 9;\n order: 9;\n }\n .order-sm-10 {\n -ms-flex-order: 10;\n order: 10;\n }\n .order-sm-11 {\n -ms-flex-order: 11;\n order: 11;\n }\n .order-sm-12 {\n -ms-flex-order: 12;\n order: 12;\n }\n}\n\n@media (min-width: 768px) {\n .col-md {\n -ms-flex-preferred-size: 0;\n flex-basis: 0;\n -ms-flex-positive: 1;\n flex-grow: 1;\n max-width: 100%;\n }\n .col-md-auto {\n -ms-flex: 0 0 auto;\n flex: 0 0 auto;\n width: auto;\n max-width: none;\n }\n .col-md-1 {\n -ms-flex: 0 0 8.333333%;\n flex: 0 0 8.333333%;\n max-width: 8.333333%;\n }\n .col-md-2 {\n -ms-flex: 0 0 16.666667%;\n flex: 0 0 16.666667%;\n max-width: 16.666667%;\n }\n .col-md-3 {\n -ms-flex: 0 0 25%;\n flex: 0 0 25%;\n max-width: 25%;\n }\n .col-md-4 {\n -ms-flex: 0 0 33.333333%;\n flex: 0 0 33.333333%;\n max-width: 33.333333%;\n }\n .col-md-5 {\n -ms-flex: 0 0 41.666667%;\n flex: 0 0 41.666667%;\n max-width: 41.666667%;\n }\n .col-md-6 {\n -ms-flex: 0 0 50%;\n flex: 0 0 50%;\n max-width: 50%;\n }\n .col-md-7 {\n -ms-flex: 0 0 58.333333%;\n flex: 0 0 58.333333%;\n max-width: 58.333333%;\n }\n .col-md-8 {\n -ms-flex: 0 0 66.666667%;\n flex: 0 0 66.666667%;\n max-width: 66.666667%;\n }\n .col-md-9 {\n -ms-flex: 0 0 75%;\n flex: 0 0 75%;\n max-width: 75%;\n }\n .col-md-10 {\n -ms-flex: 0 0 83.333333%;\n flex: 0 0 83.333333%;\n max-width: 83.333333%;\n }\n .col-md-11 {\n -ms-flex: 0 0 91.666667%;\n flex: 0 0 91.666667%;\n max-width: 91.666667%;\n }\n .col-md-12 {\n -ms-flex: 0 0 100%;\n flex: 0 0 100%;\n max-width: 100%;\n }\n .order-md-1 {\n -ms-flex-order: 1;\n order: 1;\n }\n .order-md-2 {\n -ms-flex-order: 2;\n order: 2;\n }\n .order-md-3 {\n -ms-flex-order: 3;\n order: 3;\n }\n .order-md-4 {\n -ms-flex-order: 4;\n order: 4;\n }\n .order-md-5 {\n -ms-flex-order: 5;\n order: 5;\n }\n .order-md-6 {\n -ms-flex-order: 6;\n order: 6;\n }\n .order-md-7 {\n -ms-flex-order: 7;\n order: 7;\n }\n .order-md-8 {\n -ms-flex-order: 8;\n order: 8;\n }\n .order-md-9 {\n -ms-flex-order: 9;\n order: 9;\n }\n .order-md-10 {\n -ms-flex-order: 10;\n order: 10;\n }\n .order-md-11 {\n -ms-flex-order: 11;\n order: 11;\n }\n .order-md-12 {\n -ms-flex-order: 12;\n order: 12;\n }\n}\n\n@media (min-width: 992px) {\n .col-lg {\n -ms-flex-preferred-size: 0;\n flex-basis: 0;\n -ms-flex-positive: 1;\n flex-grow: 1;\n max-width: 100%;\n }\n .col-lg-auto {\n -ms-flex: 0 0 auto;\n flex: 0 0 auto;\n width: auto;\n max-width: none;\n }\n .col-lg-1 {\n -ms-flex: 0 0 8.333333%;\n flex: 0 0 8.333333%;\n max-width: 8.333333%;\n }\n .col-lg-2 {\n -ms-flex: 0 0 16.666667%;\n flex: 0 0 16.666667%;\n max-width: 16.666667%;\n }\n .col-lg-3 {\n -ms-flex: 0 0 25%;\n flex: 0 0 25%;\n max-width: 25%;\n }\n .col-lg-4 {\n -ms-flex: 0 0 33.333333%;\n flex: 0 0 33.333333%;\n max-width: 33.333333%;\n }\n .col-lg-5 {\n -ms-flex: 0 0 41.666667%;\n flex: 0 0 41.666667%;\n max-width: 41.666667%;\n }\n .col-lg-6 {\n -ms-flex: 0 0 50%;\n flex: 0 0 50%;\n max-width: 50%;\n }\n .col-lg-7 {\n -ms-flex: 0 0 58.333333%;\n flex: 0 0 58.333333%;\n max-width: 58.333333%;\n }\n .col-lg-8 {\n -ms-flex: 0 0 66.666667%;\n flex: 0 0 66.666667%;\n max-width: 66.666667%;\n }\n .col-lg-9 {\n -ms-flex: 0 0 75%;\n flex: 0 0 75%;\n max-width: 75%;\n }\n .col-lg-10 {\n -ms-flex: 0 0 83.333333%;\n flex: 0 0 83.333333%;\n max-width: 83.333333%;\n }\n .col-lg-11 {\n -ms-flex: 0 0 91.666667%;\n flex: 0 0 91.666667%;\n max-width: 91.666667%;\n }\n .col-lg-12 {\n -ms-flex: 0 0 100%;\n flex: 0 0 100%;\n max-width: 100%;\n }\n .order-lg-1 {\n -ms-flex-order: 1;\n order: 1;\n }\n .order-lg-2 {\n -ms-flex-order: 2;\n order: 2;\n }\n .order-lg-3 {\n -ms-flex-order: 3;\n order: 3;\n }\n .order-lg-4 {\n -ms-flex-order: 4;\n order: 4;\n }\n .order-lg-5 {\n -ms-flex-order: 5;\n order: 5;\n }\n .order-lg-6 {\n -ms-flex-order: 6;\n order: 6;\n }\n .order-lg-7 {\n -ms-flex-order: 7;\n order: 7;\n }\n .order-lg-8 {\n -ms-flex-order: 8;\n order: 8;\n }\n .order-lg-9 {\n -ms-flex-order: 9;\n order: 9;\n }\n .order-lg-10 {\n -ms-flex-order: 10;\n order: 10;\n }\n .order-lg-11 {\n -ms-flex-order: 11;\n order: 11;\n }\n .order-lg-12 {\n -ms-flex-order: 12;\n order: 12;\n }\n}\n\n@media (min-width: 1200px) {\n .col-xl {\n -ms-flex-preferred-size: 0;\n flex-basis: 0;\n -ms-flex-positive: 1;\n flex-grow: 1;\n max-width: 100%;\n }\n .col-xl-auto {\n -ms-flex: 0 0 auto;\n flex: 0 0 auto;\n width: auto;\n max-width: none;\n }\n .col-xl-1 {\n -ms-flex: 0 0 8.333333%;\n flex: 0 0 8.333333%;\n max-width: 8.333333%;\n }\n .col-xl-2 {\n -ms-flex: 0 0 16.666667%;\n flex: 0 0 16.666667%;\n max-width: 16.666667%;\n }\n .col-xl-3 {\n -ms-flex: 0 0 25%;\n flex: 0 0 25%;\n max-width: 25%;\n }\n .col-xl-4 {\n -ms-flex: 0 0 33.333333%;\n flex: 0 0 33.333333%;\n max-width: 33.333333%;\n }\n .col-xl-5 {\n -ms-flex: 0 0 41.666667%;\n flex: 0 0 41.666667%;\n max-width: 41.666667%;\n }\n .col-xl-6 {\n -ms-flex: 0 0 50%;\n flex: 0 0 50%;\n max-width: 50%;\n }\n .col-xl-7 {\n -ms-flex: 0 0 58.333333%;\n flex: 0 0 58.333333%;\n max-width: 58.333333%;\n }\n .col-xl-8 {\n -ms-flex: 0 0 66.666667%;\n flex: 0 0 66.666667%;\n max-width: 66.666667%;\n }\n .col-xl-9 {\n -ms-flex: 0 0 75%;\n flex: 0 0 75%;\n max-width: 75%;\n }\n .col-xl-10 {\n -ms-flex: 0 0 83.333333%;\n flex: 0 0 83.333333%;\n max-width: 83.333333%;\n }\n .col-xl-11 {\n -ms-flex: 0 0 91.666667%;\n flex: 0 0 91.666667%;\n max-width: 91.666667%;\n }\n .col-xl-12 {\n -ms-flex: 0 0 100%;\n flex: 0 0 100%;\n max-width: 100%;\n }\n .order-xl-1 {\n -ms-flex-order: 1;\n order: 1;\n }\n .order-xl-2 {\n -ms-flex-order: 2;\n order: 2;\n }\n .order-xl-3 {\n -ms-flex-order: 3;\n order: 3;\n }\n .order-xl-4 {\n -ms-flex-order: 4;\n order: 4;\n }\n .order-xl-5 {\n -ms-flex-order: 5;\n order: 5;\n }\n .order-xl-6 {\n -ms-flex-order: 6;\n order: 6;\n }\n .order-xl-7 {\n -ms-flex-order: 7;\n order: 7;\n }\n .order-xl-8 {\n -ms-flex-order: 8;\n order: 8;\n }\n .order-xl-9 {\n -ms-flex-order: 9;\n order: 9;\n }\n .order-xl-10 {\n -ms-flex-order: 10;\n order: 10;\n }\n .order-xl-11 {\n -ms-flex-order: 11;\n order: 11;\n }\n .order-xl-12 {\n -ms-flex-order: 12;\n order: 12;\n }\n}\n\n.table {\n width: 100%;\n max-width: 100%;\n margin-bottom: 1rem;\n background-color: transparent;\n}\n\n.table th,\n.table td {\n padding: 0.75rem;\n vertical-align: top;\n border-top: 1px solid #e9ecef;\n}\n\n.table thead th {\n vertical-align: bottom;\n border-bottom: 2px solid #e9ecef;\n}\n\n.table tbody + tbody {\n border-top: 2px solid #e9ecef;\n}\n\n.table .table {\n background-color: #fff;\n}\n\n.table-sm th,\n.table-sm td {\n padding: 0.3rem;\n}\n\n.table-bordered {\n border: 1px solid #e9ecef;\n}\n\n.table-bordered th,\n.table-bordered td {\n border: 1px solid #e9ecef;\n}\n\n.table-bordered thead th,\n.table-bordered thead td {\n border-bottom-width: 2px;\n}\n\n.table-striped tbody tr:nth-of-type(odd) {\n background-color: rgba(0, 0, 0, 0.05);\n}\n\n.table-hover tbody tr:hover {\n background-color: rgba(0, 0, 0, 0.075);\n}\n\n.table-primary,\n.table-primary > th,\n.table-primary > td {\n background-color: #b8daff;\n}\n\n.table-hover .table-primary:hover {\n background-color: #9fcdff;\n}\n\n.table-hover .table-primary:hover > td,\n.table-hover .table-primary:hover > th {\n background-color: #9fcdff;\n}\n\n.table-secondary,\n.table-secondary > th,\n.table-secondary > td {\n background-color: #dddfe2;\n}\n\n.table-hover .table-secondary:hover {\n background-color: #cfd2d6;\n}\n\n.table-hover .table-secondary:hover > td,\n.table-hover .table-secondary:hover > th {\n background-color: #cfd2d6;\n}\n\n.table-success,\n.table-success > th,\n.table-success > td {\n background-color: #c3e6cb;\n}\n\n.table-hover .table-success:hover {\n background-color: #b1dfbb;\n}\n\n.table-hover .table-success:hover > td,\n.table-hover .table-success:hover > th {\n background-color: #b1dfbb;\n}\n\n.table-info,\n.table-info > th,\n.table-info > td {\n background-color: #bee5eb;\n}\n\n.table-hover .table-info:hover {\n background-color: #abdde5;\n}\n\n.table-hover .table-info:hover > td,\n.table-hover .table-info:hover > th {\n background-color: #abdde5;\n}\n\n.table-warning,\n.table-warning > th,\n.table-warning > td {\n background-color: #ffeeba;\n}\n\n.table-hover .table-warning:hover {\n background-color: #ffe8a1;\n}\n\n.table-hover .table-warning:hover > td,\n.table-hover .table-warning:hover > th {\n background-color: #ffe8a1;\n}\n\n.table-danger,\n.table-danger > th,\n.table-danger > td {\n background-color: #f5c6cb;\n}\n\n.table-hover .table-danger:hover {\n background-color: #f1b0b7;\n}\n\n.table-hover .table-danger:hover > td,\n.table-hover .table-danger:hover > th {\n background-color: #f1b0b7;\n}\n\n.table-light,\n.table-light > th,\n.table-light > td {\n background-color: #fdfdfe;\n}\n\n.table-hover .table-light:hover {\n background-color: #ececf6;\n}\n\n.table-hover .table-light:hover > td,\n.table-hover .table-light:hover > th {\n background-color: #ececf6;\n}\n\n.table-dark,\n.table-dark > th,\n.table-dark > td {\n background-color: #c6c8ca;\n}\n\n.table-hover .table-dark:hover {\n background-color: #b9bbbe;\n}\n\n.table-hover .table-dark:hover > td,\n.table-hover .table-dark:hover > th {\n background-color: #b9bbbe;\n}\n\n.table-active,\n.table-active > th,\n.table-active > td {\n background-color: rgba(0, 0, 0, 0.075);\n}\n\n.table-hover .table-active:hover {\n background-color: rgba(0, 0, 0, 0.075);\n}\n\n.table-hover .table-active:hover > td,\n.table-hover .table-active:hover > th {\n background-color: rgba(0, 0, 0, 0.075);\n}\n\n.thead-inverse th {\n color: #fff;\n background-color: #212529;\n}\n\n.thead-default th {\n color: #495057;\n background-color: #e9ecef;\n}\n\n.table-inverse {\n color: #fff;\n background-color: #212529;\n}\n\n.table-inverse th,\n.table-inverse td,\n.table-inverse thead th {\n border-color: #32383e;\n}\n\n.table-inverse.table-bordered {\n border: 0;\n}\n\n.table-inverse.table-striped tbody tr:nth-of-type(odd) {\n background-color: rgba(255, 255, 255, 0.05);\n}\n\n.table-inverse.table-hover tbody tr:hover {\n background-color: rgba(255, 255, 255, 0.075);\n}\n\n@media (max-width: 991px) {\n .table-responsive {\n display: block;\n width: 100%;\n overflow-x: auto;\n -ms-overflow-style: -ms-autohiding-scrollbar;\n }\n .table-responsive.table-bordered {\n border: 0;\n }\n}\n\n.form-control {\n display: block;\n width: 100%;\n padding: 0.5rem 0.75rem;\n font-size: 1rem;\n line-height: 1.25;\n color: #495057;\n background-color: #fff;\n background-image: none;\n background-clip: padding-box;\n border: 1px solid rgba(0, 0, 0, 0.15);\n border-radius: 0.25rem;\n transition: border-color ease-in-out 0.15s, box-shadow ease-in-out 0.15s;\n}\n\n.form-control::-ms-expand {\n background-color: transparent;\n border: 0;\n}\n\n.form-control:focus {\n color: #495057;\n background-color: #fff;\n border-color: #80bdff;\n outline: none;\n}\n\n.form-control::-webkit-input-placeholder {\n color: #868e96;\n opacity: 1;\n}\n\n.form-control:-ms-input-placeholder {\n color: #868e96;\n opacity: 1;\n}\n\n.form-control::placeholder {\n color: #868e96;\n opacity: 1;\n}\n\n.form-control:disabled, .form-control[readonly] {\n background-color: #e9ecef;\n opacity: 1;\n}\n\nselect.form-control:not([size]):not([multiple]) {\n height: calc(2.25rem + 2px);\n}\n\nselect.form-control:focus::-ms-value {\n color: #495057;\n background-color: #fff;\n}\n\n.form-control-file,\n.form-control-range {\n display: block;\n}\n\n.col-form-label {\n padding-top: calc(0.5rem - 1px * 2);\n padding-bottom: calc(0.5rem - 1px * 2);\n margin-bottom: 0;\n}\n\n.col-form-label-lg {\n padding-top: calc(0.5rem - 1px * 2);\n padding-bottom: calc(0.5rem - 1px * 2);\n font-size: 1.25rem;\n}\n\n.col-form-label-sm {\n padding-top: calc(0.25rem - 1px * 2);\n padding-bottom: calc(0.25rem - 1px * 2);\n font-size: 0.875rem;\n}\n\n.col-form-legend {\n padding-top: 0.5rem;\n padding-bottom: 0.5rem;\n margin-bottom: 0;\n font-size: 1rem;\n}\n\n.form-control-plaintext {\n padding-top: 0.5rem;\n padding-bottom: 0.5rem;\n margin-bottom: 0;\n line-height: 1.25;\n border: solid transparent;\n border-width: 1px 0;\n}\n\n.form-control-plaintext.form-control-sm, .input-group-sm > .form-control-plaintext.form-control,\n.input-group-sm > .form-control-plaintext.input-group-addon,\n.input-group-sm > .input-group-btn > .form-control-plaintext.btn, .form-control-plaintext.form-control-lg, .input-group-lg > .form-control-plaintext.form-control,\n.input-group-lg > .form-control-plaintext.input-group-addon,\n.input-group-lg > .input-group-btn > .form-control-plaintext.btn {\n padding-right: 0;\n padding-left: 0;\n}\n\n.form-control-sm, .input-group-sm > .form-control,\n.input-group-sm > .input-group-addon,\n.input-group-sm > .input-group-btn > .btn {\n padding: 0.25rem 0.5rem;\n font-size: 0.875rem;\n line-height: 1.5;\n border-radius: 0.2rem;\n}\n\nselect.form-control-sm:not([size]):not([multiple]), .input-group-sm > select.form-control:not([size]):not([multiple]),\n.input-group-sm > select.input-group-addon:not([size]):not([multiple]),\n.input-group-sm > .input-group-btn > select.btn:not([size]):not([multiple]) {\n height: calc(1.8125rem + 2px);\n}\n\n.form-control-lg, .input-group-lg > .form-control,\n.input-group-lg > .input-group-addon,\n.input-group-lg > .input-group-btn > .btn {\n padding: 0.5rem 1rem;\n font-size: 1.25rem;\n line-height: 1.5;\n border-radius: 0.3rem;\n}\n\nselect.form-control-lg:not([size]):not([multiple]), .input-group-lg > select.form-control:not([size]):not([multiple]),\n.input-group-lg > select.input-group-addon:not([size]):not([multiple]),\n.input-group-lg > .input-group-btn > select.btn:not([size]):not([multiple]) {\n height: calc(2.3125rem + 2px);\n}\n\n.form-group {\n margin-bottom: 1rem;\n}\n\n.form-text {\n display: block;\n margin-top: 0.25rem;\n}\n\n.form-row {\n display: -ms-flexbox;\n display: flex;\n -ms-flex-wrap: wrap;\n flex-wrap: wrap;\n margin-right: -5px;\n margin-left: -5px;\n}\n\n.form-row > .col,\n.form-row > [class*=\"col-\"] {\n padding-right: 5px;\n padding-left: 5px;\n}\n\n.form-check {\n position: relative;\n display: block;\n margin-bottom: 0.5rem;\n}\n\n.form-check.disabled .form-check-label {\n color: #868e96;\n}\n\n.form-check-label {\n padding-left: 1.25rem;\n margin-bottom: 0;\n}\n\n.form-check-input {\n position: absolute;\n margin-top: 0.25rem;\n margin-left: -1.25rem;\n}\n\n.form-check-input:only-child {\n position: static;\n}\n\n.form-check-inline {\n display: inline-block;\n}\n\n.form-check-inline .form-check-label {\n vertical-align: middle;\n}\n\n.form-check-inline + .form-check-inline {\n margin-left: 0.75rem;\n}\n\n.invalid-feedback {\n display: none;\n margin-top: .25rem;\n font-size: .875rem;\n color: #dc3545;\n}\n\n.invalid-tooltip {\n position: absolute;\n top: 100%;\n z-index: 5;\n display: none;\n width: 250px;\n padding: .5rem;\n margin-top: .1rem;\n font-size: .875rem;\n line-height: 1;\n color: #fff;\n background-color: rgba(220, 53, 69, 0.8);\n border-radius: .2rem;\n}\n\n.was-validated .form-control:valid, .form-control.is-valid, .was-validated\n.custom-select:valid,\n.custom-select.is-valid {\n border-color: #28a745;\n}\n\n.was-validated .form-control:valid:focus, .form-control.is-valid:focus, .was-validated\n.custom-select:valid:focus,\n.custom-select.is-valid:focus {\n box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.25);\n}\n\n.was-validated .form-control:valid ~ .invalid-feedback,\n.was-validated .form-control:valid ~ .invalid-tooltip, .form-control.is-valid ~ .invalid-feedback,\n.form-control.is-valid ~ .invalid-tooltip, .was-validated\n.custom-select:valid ~ .invalid-feedback,\n.was-validated\n.custom-select:valid ~ .invalid-tooltip,\n.custom-select.is-valid ~ .invalid-feedback,\n.custom-select.is-valid ~ .invalid-tooltip {\n display: block;\n}\n\n.was-validated .form-check-input:valid + .form-check-label, .form-check-input.is-valid + .form-check-label {\n color: #28a745;\n}\n\n.was-validated .custom-control-input:valid ~ .custom-control-indicator, .custom-control-input.is-valid ~ .custom-control-indicator {\n background-color: rgba(40, 167, 69, 0.25);\n}\n\n.was-validated .custom-control-input:valid ~ .custom-control-description, .custom-control-input.is-valid ~ .custom-control-description {\n color: #28a745;\n}\n\n.was-validated .custom-file-input:valid ~ .custom-file-control, .custom-file-input.is-valid ~ .custom-file-control {\n border-color: #28a745;\n}\n\n.was-validated .custom-file-input:valid ~ .custom-file-control::before, .custom-file-input.is-valid ~ .custom-file-control::before {\n border-color: inherit;\n}\n\n.was-validated .custom-file-input:valid:focus, .custom-file-input.is-valid:focus {\n box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.25);\n}\n\n.was-validated .form-control:invalid, .form-control.is-invalid, .was-validated\n.custom-select:invalid,\n.custom-select.is-invalid {\n border-color: #dc3545;\n}\n\n.was-validated .form-control:invalid:focus, .form-control.is-invalid:focus, .was-validated\n.custom-select:invalid:focus,\n.custom-select.is-invalid:focus {\n box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.25);\n}\n\n.was-validated .form-control:invalid ~ .invalid-feedback,\n.was-validated .form-control:invalid ~ .invalid-tooltip, .form-control.is-invalid ~ .invalid-feedback,\n.form-control.is-invalid ~ .invalid-tooltip, .was-validated\n.custom-select:invalid ~ .invalid-feedback,\n.was-validated\n.custom-select:invalid ~ .invalid-tooltip,\n.custom-select.is-invalid ~ .invalid-feedback,\n.custom-select.is-invalid ~ .invalid-tooltip {\n display: block;\n}\n\n.was-validated .form-check-input:invalid + .form-check-label, .form-check-input.is-invalid + .form-check-label {\n color: #dc3545;\n}\n\n.was-validated .custom-control-input:invalid ~ .custom-control-indicator, .custom-control-input.is-invalid ~ .custom-control-indicator {\n background-color: rgba(220, 53, 69, 0.25);\n}\n\n.was-validated .custom-control-input:invalid ~ .custom-control-description, .custom-control-input.is-invalid ~ .custom-control-description {\n color: #dc3545;\n}\n\n.was-validated .custom-file-input:invalid ~ .custom-file-control, .custom-file-input.is-invalid ~ .custom-file-control {\n border-color: #dc3545;\n}\n\n.was-validated .custom-file-input:invalid ~ .custom-file-control::before, .custom-file-input.is-invalid ~ .custom-file-control::before {\n border-color: inherit;\n}\n\n.was-validated .custom-file-input:invalid:focus, .custom-file-input.is-invalid:focus {\n box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.25);\n}\n\n.form-inline {\n display: -ms-flexbox;\n display: flex;\n -ms-flex-flow: row wrap;\n flex-flow: row wrap;\n -ms-flex-align: center;\n align-items: center;\n}\n\n.form-inline .form-check {\n width: 100%;\n}\n\n@media (min-width: 576px) {\n .form-inline label {\n display: -ms-flexbox;\n display: flex;\n -ms-flex-align: center;\n align-items: center;\n -ms-flex-pack: center;\n justify-content: center;\n margin-bottom: 0;\n }\n .form-inline .form-group {\n display: -ms-flexbox;\n display: flex;\n -ms-flex: 0 0 auto;\n flex: 0 0 auto;\n -ms-flex-flow: row wrap;\n flex-flow: row wrap;\n -ms-flex-align: center;\n align-items: center;\n margin-bottom: 0;\n }\n .form-inline .form-control {\n display: inline-block;\n width: auto;\n vertical-align: middle;\n }\n .form-inline .form-control-plaintext {\n display: inline-block;\n }\n .form-inline .input-group {\n width: auto;\n }\n .form-inline .form-control-label {\n margin-bottom: 0;\n vertical-align: middle;\n }\n .form-inline .form-check {\n display: -ms-flexbox;\n display: flex;\n -ms-flex-align: center;\n align-items: center;\n -ms-flex-pack: center;\n justify-content: center;\n width: auto;\n margin-top: 0;\n margin-bottom: 0;\n }\n .form-inline .form-check-label {\n padding-left: 0;\n }\n .form-inline .form-check-input {\n position: relative;\n margin-top: 0;\n margin-right: 0.25rem;\n margin-left: 0;\n }\n .form-inline .custom-control {\n display: -ms-flexbox;\n display: flex;\n -ms-flex-align: center;\n align-items: center;\n -ms-flex-pack: center;\n justify-content: center;\n padding-left: 0;\n }\n .form-inline .custom-control-indicator {\n position: static;\n display: inline-block;\n margin-right: 0.25rem;\n vertical-align: text-bottom;\n }\n .form-inline .has-feedback .form-control-feedback {\n top: 0;\n }\n}\n\n.btn {\n display: inline-block;\n font-weight: normal;\n text-align: center;\n white-space: nowrap;\n vertical-align: middle;\n -webkit-user-select: none;\n -moz-user-select: none;\n -ms-user-select: none;\n user-select: none;\n border: 1px solid transparent;\n padding: 0.5rem 0.75rem;\n font-size: 1rem;\n line-height: 1.25;\n border-radius: 0.25rem;\n transition: all 0.15s ease-in-out;\n}\n\n.btn:focus, .btn:hover {\n text-decoration: none;\n}\n\n.btn:focus, .btn.focus {\n outline: 0;\n box-shadow: 0 0 0 3px rgba(0, 123, 255, 0.25);\n}\n\n.btn.disabled, .btn:disabled {\n opacity: .65;\n}\n\n.btn:active, .btn.active {\n background-image: none;\n}\n\na.btn.disabled,\nfieldset[disabled] a.btn {\n pointer-events: none;\n}\n\n.btn-primary {\n color: #fff;\n background-color: #007bff;\n border-color: #007bff;\n}\n\n.btn-primary:hover {\n color: #fff;\n background-color: #0069d9;\n border-color: #0062cc;\n}\n\n.btn-primary:focus, .btn-primary.focus {\n box-shadow: 0 0 0 3px rgba(0, 123, 255, 0.5);\n}\n\n.btn-primary.disabled, .btn-primary:disabled {\n background-color: #007bff;\n border-color: #007bff;\n}\n\n.btn-primary:active, .btn-primary.active,\n.show > .btn-primary.dropdown-toggle {\n background-color: #0069d9;\n background-image: none;\n border-color: #0062cc;\n}\n\n.btn-secondary {\n color: #fff;\n background-color: #868e96;\n border-color: #868e96;\n}\n\n.btn-secondary:hover {\n color: #fff;\n background-color: #727b84;\n border-color: #6c757d;\n}\n\n.btn-secondary:focus, .btn-secondary.focus {\n box-shadow: 0 0 0 3px rgba(134, 142, 150, 0.5);\n}\n\n.btn-secondary.disabled, .btn-secondary:disabled {\n background-color: #868e96;\n border-color: #868e96;\n}\n\n.btn-secondary:active, .btn-secondary.active,\n.show > .btn-secondary.dropdown-toggle {\n background-color: #727b84;\n background-image: none;\n border-color: #6c757d;\n}\n\n.btn-success {\n color: #fff;\n background-color: #28a745;\n border-color: #28a745;\n}\n\n.btn-success:hover {\n color: #fff;\n background-color: #218838;\n border-color: #1e7e34;\n}\n\n.btn-success:focus, .btn-success.focus {\n box-shadow: 0 0 0 3px rgba(40, 167, 69, 0.5);\n}\n\n.btn-success.disabled, .btn-success:disabled {\n background-color: #28a745;\n border-color: #28a745;\n}\n\n.btn-success:active, .btn-success.active,\n.show > .btn-success.dropdown-toggle {\n background-color: #218838;\n background-image: none;\n border-color: #1e7e34;\n}\n\n.btn-info {\n color: #fff;\n background-color: #17a2b8;\n border-color: #17a2b8;\n}\n\n.btn-info:hover {\n color: #fff;\n background-color: #138496;\n border-color: #117a8b;\n}\n\n.btn-info:focus, .btn-info.focus {\n box-shadow: 0 0 0 3px rgba(23, 162, 184, 0.5);\n}\n\n.btn-info.disabled, .btn-info:disabled {\n background-color: #17a2b8;\n border-color: #17a2b8;\n}\n\n.btn-info:active, .btn-info.active,\n.show > .btn-info.dropdown-toggle {\n background-color: #138496;\n background-image: none;\n border-color: #117a8b;\n}\n\n.btn-warning {\n color: #111;\n background-color: #ffc107;\n border-color: #ffc107;\n}\n\n.btn-warning:hover {\n color: #111;\n background-color: #e0a800;\n border-color: #d39e00;\n}\n\n.btn-warning:focus, .btn-warning.focus {\n box-shadow: 0 0 0 3px rgba(255, 193, 7, 0.5);\n}\n\n.btn-warning.disabled, .btn-warning:disabled {\n background-color: #ffc107;\n border-color: #ffc107;\n}\n\n.btn-warning:active, .btn-warning.active,\n.show > .btn-warning.dropdown-toggle {\n background-color: #e0a800;\n background-image: none;\n border-color: #d39e00;\n}\n\n.btn-danger {\n color: #fff;\n background-color: #dc3545;\n border-color: #dc3545;\n}\n\n.btn-danger:hover {\n color: #fff;\n background-color: #c82333;\n border-color: #bd2130;\n}\n\n.btn-danger:focus, .btn-danger.focus {\n box-shadow: 0 0 0 3px rgba(220, 53, 69, 0.5);\n}\n\n.btn-danger.disabled, .btn-danger:disabled {\n background-color: #dc3545;\n border-color: #dc3545;\n}\n\n.btn-danger:active, .btn-danger.active,\n.show > .btn-danger.dropdown-toggle {\n background-color: #c82333;\n background-image: none;\n border-color: #bd2130;\n}\n\n.btn-light {\n color: #111;\n background-color: #f8f9fa;\n border-color: #f8f9fa;\n}\n\n.btn-light:hover {\n color: #111;\n background-color: #e2e6ea;\n border-color: #dae0e5;\n}\n\n.btn-light:focus, .btn-light.focus {\n box-shadow: 0 0 0 3px rgba(248, 249, 250, 0.5);\n}\n\n.btn-light.disabled, .btn-light:disabled {\n background-color: #f8f9fa;\n border-color: #f8f9fa;\n}\n\n.btn-light:active, .btn-light.active,\n.show > .btn-light.dropdown-toggle {\n background-color: #e2e6ea;\n background-image: none;\n border-color: #dae0e5;\n}\n\n.btn-dark {\n color: #fff;\n background-color: #343a40;\n border-color: #343a40;\n}\n\n.btn-dark:hover {\n color: #fff;\n background-color: #23272b;\n border-color: #1d2124;\n}\n\n.btn-dark:focus, .btn-dark.focus {\n box-shadow: 0 0 0 3px rgba(52, 58, 64, 0.5);\n}\n\n.btn-dark.disabled, .btn-dark:disabled {\n background-color: #343a40;\n border-color: #343a40;\n}\n\n.btn-dark:active, .btn-dark.active,\n.show > .btn-dark.dropdown-toggle {\n background-color: #23272b;\n background-image: none;\n border-color: #1d2124;\n}\n\n.btn-outline-primary {\n color: #007bff;\n background-color: transparent;\n background-image: none;\n border-color: #007bff;\n}\n\n.btn-outline-primary:hover {\n color: #fff;\n background-color: #007bff;\n border-color: #007bff;\n}\n\n.btn-outline-primary:focus, .btn-outline-primary.focus {\n box-shadow: 0 0 0 3px rgba(0, 123, 255, 0.5);\n}\n\n.btn-outline-primary.disabled, .btn-outline-primary:disabled {\n color: #007bff;\n background-color: transparent;\n}\n\n.btn-outline-primary:active, .btn-outline-primary.active,\n.show > .btn-outline-primary.dropdown-toggle {\n color: #fff;\n background-color: #007bff;\n border-color: #007bff;\n}\n\n.btn-outline-secondary {\n color: #868e96;\n background-color: transparent;\n background-image: none;\n border-color: #868e96;\n}\n\n.btn-outline-secondary:hover {\n color: #fff;\n background-color: #868e96;\n border-color: #868e96;\n}\n\n.btn-outline-secondary:focus, .btn-outline-secondary.focus {\n box-shadow: 0 0 0 3px rgba(134, 142, 150, 0.5);\n}\n\n.btn-outline-secondary.disabled, .btn-outline-secondary:disabled {\n color: #868e96;\n background-color: transparent;\n}\n\n.btn-outline-secondary:active, .btn-outline-secondary.active,\n.show > .btn-outline-secondary.dropdown-toggle {\n color: #fff;\n background-color: #868e96;\n border-color: #868e96;\n}\n\n.btn-outline-success {\n color: #28a745;\n background-color: transparent;\n background-image: none;\n border-color: #28a745;\n}\n\n.btn-outline-success:hover {\n color: #fff;\n background-color: #28a745;\n border-color: #28a745;\n}\n\n.btn-outline-success:focus, .btn-outline-success.focus {\n box-shadow: 0 0 0 3px rgba(40, 167, 69, 0.5);\n}\n\n.btn-outline-success.disabled, .btn-outline-success:disabled {\n color: #28a745;\n background-color: transparent;\n}\n\n.btn-outline-success:active, .btn-outline-success.active,\n.show > .btn-outline-success.dropdown-toggle {\n color: #fff;\n background-color: #28a745;\n border-color: #28a745;\n}\n\n.btn-outline-info {\n color: #17a2b8;\n background-color: transparent;\n background-image: none;\n border-color: #17a2b8;\n}\n\n.btn-outline-info:hover {\n color: #fff;\n background-color: #17a2b8;\n border-color: #17a2b8;\n}\n\n.btn-outline-info:focus, .btn-outline-info.focus {\n box-shadow: 0 0 0 3px rgba(23, 162, 184, 0.5);\n}\n\n.btn-outline-info.disabled, .btn-outline-info:disabled {\n color: #17a2b8;\n background-color: transparent;\n}\n\n.btn-outline-info:active, .btn-outline-info.active,\n.show > .btn-outline-info.dropdown-toggle {\n color: #fff;\n background-color: #17a2b8;\n border-color: #17a2b8;\n}\n\n.btn-outline-warning {\n color: #ffc107;\n background-color: transparent;\n background-image: none;\n border-color: #ffc107;\n}\n\n.btn-outline-warning:hover {\n color: #fff;\n background-color: #ffc107;\n border-color: #ffc107;\n}\n\n.btn-outline-warning:focus, .btn-outline-warning.focus {\n box-shadow: 0 0 0 3px rgba(255, 193, 7, 0.5);\n}\n\n.btn-outline-warning.disabled, .btn-outline-warning:disabled {\n color: #ffc107;\n background-color: transparent;\n}\n\n.btn-outline-warning:active, .btn-outline-warning.active,\n.show > .btn-outline-warning.dropdown-toggle {\n color: #fff;\n background-color: #ffc107;\n border-color: #ffc107;\n}\n\n.btn-outline-danger {\n color: #dc3545;\n background-color: transparent;\n background-image: none;\n border-color: #dc3545;\n}\n\n.btn-outline-danger:hover {\n color: #fff;\n background-color: #dc3545;\n border-color: #dc3545;\n}\n\n.btn-outline-danger:focus, .btn-outline-danger.focus {\n box-shadow: 0 0 0 3px rgba(220, 53, 69, 0.5);\n}\n\n.btn-outline-danger.disabled, .btn-outline-danger:disabled {\n color: #dc3545;\n background-color: transparent;\n}\n\n.btn-outline-danger:active, .btn-outline-danger.active,\n.show > .btn-outline-danger.dropdown-toggle {\n color: #fff;\n background-color: #dc3545;\n border-color: #dc3545;\n}\n\n.btn-outline-light {\n color: #f8f9fa;\n background-color: transparent;\n background-image: none;\n border-color: #f8f9fa;\n}\n\n.btn-outline-light:hover {\n color: #fff;\n background-color: #f8f9fa;\n border-color: #f8f9fa;\n}\n\n.btn-outline-light:focus, .btn-outline-light.focus {\n box-shadow: 0 0 0 3px rgba(248, 249, 250, 0.5);\n}\n\n.btn-outline-light.disabled, .btn-outline-light:disabled {\n color: #f8f9fa;\n background-color: transparent;\n}\n\n.btn-outline-light:active, .btn-outline-light.active,\n.show > .btn-outline-light.dropdown-toggle {\n color: #fff;\n background-color: #f8f9fa;\n border-color: #f8f9fa;\n}\n\n.btn-outline-dark {\n color: #343a40;\n background-color: transparent;\n background-image: none;\n border-color: #343a40;\n}\n\n.btn-outline-dark:hover {\n color: #fff;\n background-color: #343a40;\n border-color: #343a40;\n}\n\n.btn-outline-dark:focus, .btn-outline-dark.focus {\n box-shadow: 0 0 0 3px rgba(52, 58, 64, 0.5);\n}\n\n.btn-outline-dark.disabled, .btn-outline-dark:disabled {\n color: #343a40;\n background-color: transparent;\n}\n\n.btn-outline-dark:active, .btn-outline-dark.active,\n.show > .btn-outline-dark.dropdown-toggle {\n color: #fff;\n background-color: #343a40;\n border-color: #343a40;\n}\n\n.btn-link {\n font-weight: normal;\n color: #007bff;\n border-radius: 0;\n}\n\n.btn-link, .btn-link:active, .btn-link.active, .btn-link:disabled {\n background-color: transparent;\n}\n\n.btn-link, .btn-link:focus, .btn-link:active {\n border-color: transparent;\n box-shadow: none;\n}\n\n.btn-link:hover {\n border-color: transparent;\n}\n\n.btn-link:focus, .btn-link:hover {\n color: #0056b3;\n text-decoration: underline;\n background-color: transparent;\n}\n\n.btn-link:disabled {\n color: #868e96;\n}\n\n.btn-link:disabled:focus, .btn-link:disabled:hover {\n text-decoration: none;\n}\n\n.btn-lg, .btn-group-lg > .btn {\n padding: 0.5rem 1rem;\n font-size: 1.25rem;\n line-height: 1.5;\n border-radius: 0.3rem;\n}\n\n.btn-sm, .btn-group-sm > .btn {\n padding: 0.25rem 0.5rem;\n font-size: 0.875rem;\n line-height: 1.5;\n border-radius: 0.2rem;\n}\n\n.btn-block {\n display: block;\n width: 100%;\n}\n\n.btn-block + .btn-block {\n margin-top: 0.5rem;\n}\n\ninput[type=\"submit\"].btn-block,\ninput[type=\"reset\"].btn-block,\ninput[type=\"button\"].btn-block {\n width: 100%;\n}\n\n.fade {\n opacity: 0;\n transition: opacity 0.15s linear;\n}\n\n.fade.show {\n opacity: 1;\n}\n\n.collapse {\n display: none;\n}\n\n.collapse.show {\n display: block;\n}\n\ntr.collapse.show {\n display: table-row;\n}\n\ntbody.collapse.show {\n display: table-row-group;\n}\n\n.collapsing {\n position: relative;\n height: 0;\n overflow: hidden;\n transition: height 0.35s ease;\n}\n\n.dropup,\n.dropdown {\n position: relative;\n}\n\n.dropdown-toggle::after {\n display: inline-block;\n width: 0;\n height: 0;\n margin-left: 0.255em;\n vertical-align: 0.255em;\n content: \"\";\n border-top: 0.3em solid;\n border-right: 0.3em solid transparent;\n border-left: 0.3em solid transparent;\n}\n\n.dropdown-toggle:empty::after {\n margin-left: 0;\n}\n\n.dropup .dropdown-menu {\n margin-top: 0;\n margin-bottom: 0.125rem;\n}\n\n.dropup .dropdown-toggle::after {\n border-top: 0;\n border-bottom: 0.3em solid;\n}\n\n.dropdown-menu {\n position: absolute;\n top: 100%;\n left: 0;\n z-index: 1000;\n display: none;\n float: left;\n min-width: 10rem;\n padding: 0.5rem 0;\n margin: 0.125rem 0 0;\n font-size: 1rem;\n color: #212529;\n text-align: left;\n list-style: none;\n background-color: #fff;\n background-clip: padding-box;\n border: 1px solid rgba(0, 0, 0, 0.15);\n border-radius: 0.25rem;\n}\n\n.dropdown-divider {\n height: 0;\n margin: 0.5rem 0;\n overflow: hidden;\n border-top: 1px solid #e9ecef;\n}\n\n.dropdown-item {\n display: block;\n width: 100%;\n padding: 0.25rem 1.5rem;\n clear: both;\n font-weight: normal;\n color: #212529;\n text-align: inherit;\n white-space: nowrap;\n background: none;\n border: 0;\n}\n\n.dropdown-item:focus, .dropdown-item:hover {\n color: #16181b;\n text-decoration: none;\n background-color: #f8f9fa;\n}\n\n.dropdown-item.active, .dropdown-item:active {\n color: #fff;\n text-decoration: none;\n background-color: #007bff;\n}\n\n.dropdown-item.disabled, .dropdown-item:disabled {\n color: #868e96;\n background-color: transparent;\n}\n\n.show > a {\n outline: 0;\n}\n\n.dropdown-menu.show {\n display: block;\n}\n\n.dropdown-header {\n display: block;\n padding: 0.5rem 1.5rem;\n margin-bottom: 0;\n font-size: 0.875rem;\n color: #868e96;\n white-space: nowrap;\n}\n\n.btn-group,\n.btn-group-vertical {\n position: relative;\n display: -ms-inline-flexbox;\n display: inline-flex;\n vertical-align: middle;\n}\n\n.btn-group > .btn,\n.btn-group-vertical > .btn {\n position: relative;\n -ms-flex: 0 1 auto;\n flex: 0 1 auto;\n margin-bottom: 0;\n}\n\n.btn-group > .btn:hover,\n.btn-group-vertical > .btn:hover {\n z-index: 2;\n}\n\n.btn-group > .btn:focus, .btn-group > .btn:active, .btn-group > .btn.active,\n.btn-group-vertical > .btn:focus,\n.btn-group-vertical > .btn:active,\n.btn-group-vertical > .btn.active {\n z-index: 2;\n}\n\n.btn-group .btn + .btn,\n.btn-group .btn + .btn-group,\n.btn-group .btn-group + .btn,\n.btn-group .btn-group + .btn-group,\n.btn-group-vertical .btn + .btn,\n.btn-group-vertical .btn + .btn-group,\n.btn-group-vertical .btn-group + .btn,\n.btn-group-vertical .btn-group + .btn-group {\n margin-left: -1px;\n}\n\n.btn-toolbar {\n display: -ms-flexbox;\n display: flex;\n -ms-flex-wrap: wrap;\n flex-wrap: wrap;\n -ms-flex-pack: start;\n justify-content: flex-start;\n}\n\n.btn-toolbar .input-group {\n width: auto;\n}\n\n.btn-group > .btn:not(:first-child):not(:last-child):not(.dropdown-toggle) {\n border-radius: 0;\n}\n\n.btn-group > .btn:first-child {\n margin-left: 0;\n}\n\n.btn-group > .btn:first-child:not(:last-child):not(.dropdown-toggle) {\n border-top-right-radius: 0;\n border-bottom-right-radius: 0;\n}\n\n.btn-group > .btn:last-child:not(:first-child),\n.btn-group > .dropdown-toggle:not(:first-child) {\n border-top-left-radius: 0;\n border-bottom-left-radius: 0;\n}\n\n.btn-group > .btn-group {\n float: left;\n}\n\n.btn-group > .btn-group:not(:first-child):not(:last-child) > .btn {\n border-radius: 0;\n}\n\n.btn-group > .btn-group:first-child:not(:last-child) > .btn:last-child,\n.btn-group > .btn-group:first-child:not(:last-child) > .dropdown-toggle {\n border-top-right-radius: 0;\n border-bottom-right-radius: 0;\n}\n\n.btn-group > .btn-group:last-child:not(:first-child) > .btn:first-child {\n border-top-left-radius: 0;\n border-bottom-left-radius: 0;\n}\n\n.btn + .dropdown-toggle-split {\n padding-right: 0.5625rem;\n padding-left: 0.5625rem;\n}\n\n.btn + .dropdown-toggle-split::after {\n margin-left: 0;\n}\n\n.btn-sm + .dropdown-toggle-split, .btn-group-sm > .btn + .dropdown-toggle-split {\n padding-right: 0.375rem;\n padding-left: 0.375rem;\n}\n\n.btn-lg + .dropdown-toggle-split, .btn-group-lg > .btn + .dropdown-toggle-split {\n padding-right: 0.75rem;\n padding-left: 0.75rem;\n}\n\n.btn-group-vertical {\n display: -ms-inline-flexbox;\n display: inline-flex;\n -ms-flex-direction: column;\n flex-direction: column;\n -ms-flex-align: start;\n align-items: flex-start;\n -ms-flex-pack: center;\n justify-content: center;\n}\n\n.btn-group-vertical .btn,\n.btn-group-vertical .btn-group {\n width: 100%;\n}\n\n.btn-group-vertical > .btn + .btn,\n.btn-group-vertical > .btn + .btn-group,\n.btn-group-vertical > .btn-group + .btn,\n.btn-group-vertical > .btn-group + .btn-group {\n margin-top: -1px;\n margin-left: 0;\n}\n\n.btn-group-vertical > .btn:not(:first-child):not(:last-child) {\n border-radius: 0;\n}\n\n.btn-group-vertical > .btn:first-child:not(:last-child) {\n border-bottom-right-radius: 0;\n border-bottom-left-radius: 0;\n}\n\n.btn-group-vertical > .btn:last-child:not(:first-child) {\n border-top-left-radius: 0;\n border-top-right-radius: 0;\n}\n\n.btn-group-vertical > .btn-group:not(:first-child):not(:last-child) > .btn {\n border-radius: 0;\n}\n\n.btn-group-vertical > .btn-group:first-child:not(:last-child) > .btn:last-child,\n.btn-group-vertical > .btn-group:first-child:not(:last-child) > .dropdown-toggle {\n border-bottom-right-radius: 0;\n border-bottom-left-radius: 0;\n}\n\n.btn-group-vertical > .btn-group:last-child:not(:first-child) > .btn:first-child {\n border-top-left-radius: 0;\n border-top-right-radius: 0;\n}\n\n[data-toggle=\"buttons\"] > .btn input[type=\"radio\"],\n[data-toggle=\"buttons\"] > .btn input[type=\"checkbox\"],\n[data-toggle=\"buttons\"] > .btn-group > .btn input[type=\"radio\"],\n[data-toggle=\"buttons\"] > .btn-group > .btn input[type=\"checkbox\"] {\n position: absolute;\n clip: rect(0, 0, 0, 0);\n pointer-events: none;\n}\n\n.input-group {\n position: relative;\n display: -ms-flexbox;\n display: flex;\n width: 100%;\n}\n\n.input-group .form-control {\n position: relative;\n z-index: 2;\n -ms-flex: 1 1 auto;\n flex: 1 1 auto;\n width: 1%;\n margin-bottom: 0;\n}\n\n.input-group .form-control:focus, .input-group .form-control:active, .input-group .form-control:hover {\n z-index: 3;\n}\n\n.input-group-addon,\n.input-group-btn,\n.input-group .form-control {\n display: -ms-flexbox;\n display: flex;\n -ms-flex-align: center;\n align-items: center;\n}\n\n.input-group-addon:not(:first-child):not(:last-child),\n.input-group-btn:not(:first-child):not(:last-child),\n.input-group .form-control:not(:first-child):not(:last-child) {\n border-radius: 0;\n}\n\n.input-group-addon,\n.input-group-btn {\n white-space: nowrap;\n vertical-align: middle;\n}\n\n.input-group-addon {\n padding: 0.5rem 0.75rem;\n margin-bottom: 0;\n font-size: 1rem;\n font-weight: normal;\n line-height: 1.25;\n color: #495057;\n text-align: center;\n background-color: #e9ecef;\n border: 1px solid rgba(0, 0, 0, 0.15);\n border-radius: 0.25rem;\n}\n\n.input-group-addon.form-control-sm,\n.input-group-sm > .input-group-addon,\n.input-group-sm > .input-group-btn > .input-group-addon.btn {\n padding: 0.25rem 0.5rem;\n font-size: 0.875rem;\n border-radius: 0.2rem;\n}\n\n.input-group-addon.form-control-lg,\n.input-group-lg > .input-group-addon,\n.input-group-lg > .input-group-btn > .input-group-addon.btn {\n padding: 0.5rem 1rem;\n font-size: 1.25rem;\n border-radius: 0.3rem;\n}\n\n.input-group-addon input[type=\"radio\"],\n.input-group-addon input[type=\"checkbox\"] {\n margin-top: 0;\n}\n\n.input-group .form-control:not(:last-child),\n.input-group-addon:not(:last-child),\n.input-group-btn:not(:last-child) > .btn,\n.input-group-btn:not(:last-child) > .btn-group > .btn,\n.input-group-btn:not(:last-child) > .dropdown-toggle,\n.input-group-btn:not(:first-child) > .btn:not(:last-child):not(.dropdown-toggle),\n.input-group-btn:not(:first-child) > .btn-group:not(:last-child) > .btn {\n border-top-right-radius: 0;\n border-bottom-right-radius: 0;\n}\n\n.input-group-addon:not(:last-child) {\n border-right: 0;\n}\n\n.input-group .form-control:not(:first-child),\n.input-group-addon:not(:first-child),\n.input-group-btn:not(:first-child) > .btn,\n.input-group-btn:not(:first-child) > .btn-group > .btn,\n.input-group-btn:not(:first-child) > .dropdown-toggle,\n.input-group-btn:not(:last-child) > .btn:not(:first-child),\n.input-group-btn:not(:last-child) > .btn-group:not(:first-child) > .btn {\n border-top-left-radius: 0;\n border-bottom-left-radius: 0;\n}\n\n.form-control + .input-group-addon:not(:first-child) {\n border-left: 0;\n}\n\n.input-group-btn {\n position: relative;\n font-size: 0;\n white-space: nowrap;\n}\n\n.input-group-btn > .btn {\n position: relative;\n}\n\n.input-group-btn > .btn + .btn {\n margin-left: -1px;\n}\n\n.input-group-btn > .btn:focus, .input-group-btn > .btn:active, .input-group-btn > .btn:hover {\n z-index: 3;\n}\n\n.input-group-btn:not(:last-child) > .btn,\n.input-group-btn:not(:last-child) > .btn-group {\n margin-right: -1px;\n}\n\n.input-group-btn:not(:first-child) > .btn,\n.input-group-btn:not(:first-child) > .btn-group {\n z-index: 2;\n margin-left: -1px;\n}\n\n.input-group-btn:not(:first-child) > .btn:focus, .input-group-btn:not(:first-child) > .btn:active, .input-group-btn:not(:first-child) > .btn:hover,\n.input-group-btn:not(:first-child) > .btn-group:focus,\n.input-group-btn:not(:first-child) > .btn-group:active,\n.input-group-btn:not(:first-child) > .btn-group:hover {\n z-index: 3;\n}\n\n.custom-control {\n position: relative;\n display: -ms-inline-flexbox;\n display: inline-flex;\n min-height: 1.5rem;\n padding-left: 1.5rem;\n margin-right: 1rem;\n}\n\n.custom-control-input {\n position: absolute;\n z-index: -1;\n opacity: 0;\n}\n\n.custom-control-input:checked ~ .custom-control-indicator {\n color: #fff;\n background-color: #007bff;\n}\n\n.custom-control-input:focus ~ .custom-control-indicator {\n box-shadow: 0 0 0 1px #fff, 0 0 0 3px #007bff;\n}\n\n.custom-control-input:active ~ .custom-control-indicator {\n color: #fff;\n background-color: #b3d7ff;\n}\n\n.custom-control-input:disabled ~ .custom-control-indicator {\n background-color: #e9ecef;\n}\n\n.custom-control-input:disabled ~ .custom-control-description {\n color: #868e96;\n}\n\n.custom-control-indicator {\n position: absolute;\n top: 0.25rem;\n left: 0;\n display: block;\n width: 1rem;\n height: 1rem;\n pointer-events: none;\n -webkit-user-select: none;\n -moz-user-select: none;\n -ms-user-select: none;\n user-select: none;\n background-color: #ddd;\n background-repeat: no-repeat;\n background-position: center center;\n background-size: 50% 50%;\n}\n\n.custom-checkbox .custom-control-indicator {\n border-radius: 0.25rem;\n}\n\n.custom-checkbox .custom-control-input:checked ~ .custom-control-indicator {\n background-image: url(\"data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3E%3Cpath fill='%23fff' d='M6.564.75l-3.59 3.612-1.538-1.55L0 4.26 2.974 7.25 8 2.193z'/%3E%3C/svg%3E\");\n}\n\n.custom-checkbox .custom-control-input:indeterminate ~ .custom-control-indicator {\n background-color: #007bff;\n background-image: url(\"data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 4'%3E%3Cpath stroke='%23fff' d='M0 2h4'/%3E%3C/svg%3E\");\n}\n\n.custom-radio .custom-control-indicator {\n border-radius: 50%;\n}\n\n.custom-radio .custom-control-input:checked ~ .custom-control-indicator {\n background-image: url(\"data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3E%3Ccircle r='3' fill='%23fff'/%3E%3C/svg%3E\");\n}\n\n.custom-controls-stacked {\n display: -ms-flexbox;\n display: flex;\n -ms-flex-direction: column;\n flex-direction: column;\n}\n\n.custom-controls-stacked .custom-control {\n margin-bottom: 0.25rem;\n}\n\n.custom-controls-stacked .custom-control + .custom-control {\n margin-left: 0;\n}\n\n.custom-select {\n display: inline-block;\n max-width: 100%;\n height: calc(2.25rem + 2px);\n padding: 0.375rem 1.75rem 0.375rem 0.75rem;\n line-height: 1.25;\n color: #495057;\n vertical-align: middle;\n background: #fff url(\"data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 5'%3E%3Cpath fill='%23333' d='M2 0L0 2h4zm0 5L0 3h4z'/%3E%3C/svg%3E\") no-repeat right 0.75rem center;\n background-size: 8px 10px;\n border: 1px solid rgba(0, 0, 0, 0.15);\n border-radius: 0.25rem;\n -webkit-appearance: none;\n -moz-appearance: none;\n appearance: none;\n}\n\n.custom-select:focus {\n border-color: #80bdff;\n outline: none;\n}\n\n.custom-select:focus::-ms-value {\n color: #495057;\n background-color: #fff;\n}\n\n.custom-select:disabled {\n color: #868e96;\n background-color: #e9ecef;\n}\n\n.custom-select::-ms-expand {\n opacity: 0;\n}\n\n.custom-select-sm {\n height: calc(1.8125rem + 2px);\n padding-top: 0.375rem;\n padding-bottom: 0.375rem;\n font-size: 75%;\n}\n\n.custom-file {\n position: relative;\n display: inline-block;\n max-width: 100%;\n height: 2.5rem;\n margin-bottom: 0;\n}\n\n.custom-file-input {\n min-width: 14rem;\n max-width: 100%;\n height: 2.5rem;\n margin: 0;\n opacity: 0;\n}\n\n.custom-file-control {\n position: absolute;\n top: 0;\n right: 0;\n left: 0;\n z-index: 5;\n height: 2.5rem;\n padding: 0.5rem 1rem;\n line-height: 1.5;\n color: #495057;\n pointer-events: none;\n -webkit-user-select: none;\n -moz-user-select: none;\n -ms-user-select: none;\n user-select: none;\n background-color: #fff;\n border: 1px solid rgba(0, 0, 0, 0.15);\n border-radius: 0.25rem;\n}\n\n.custom-file-control:lang(en):empty::after {\n content: \"Choose file...\";\n}\n\n.custom-file-control::before {\n position: absolute;\n top: -1px;\n right: -1px;\n bottom: -1px;\n z-index: 6;\n display: block;\n height: 2.5rem;\n padding: 0.5rem 1rem;\n line-height: 1.5;\n color: #495057;\n background-color: #e9ecef;\n border: 1px solid rgba(0, 0, 0, 0.15);\n border-radius: 0 0.25rem 0.25rem 0;\n}\n\n.custom-file-control:lang(en)::before {\n content: \"Browse\";\n}\n\n.nav {\n display: -ms-flexbox;\n display: flex;\n -ms-flex-wrap: wrap;\n flex-wrap: wrap;\n padding-left: 0;\n margin-bottom: 0;\n list-style: none;\n}\n\n.nav-link {\n display: block;\n padding: 0.5rem 1rem;\n}\n\n.nav-link:focus, .nav-link:hover {\n text-decoration: none;\n}\n\n.nav-link.disabled {\n color: #868e96;\n}\n\n.nav-tabs {\n border-bottom: 1px solid #ddd;\n}\n\n.nav-tabs .nav-item {\n margin-bottom: -1px;\n}\n\n.nav-tabs .nav-link {\n border: 1px solid transparent;\n border-top-left-radius: 0.25rem;\n border-top-right-radius: 0.25rem;\n}\n\n.nav-tabs .nav-link:focus, .nav-tabs .nav-link:hover {\n border-color: #e9ecef #e9ecef #ddd;\n}\n\n.nav-tabs .nav-link.disabled {\n color: #868e96;\n background-color: transparent;\n border-color: transparent;\n}\n\n.nav-tabs .nav-link.active,\n.nav-tabs .nav-item.show .nav-link {\n color: #495057;\n background-color: #fff;\n border-color: #ddd #ddd #fff;\n}\n\n.nav-tabs .dropdown-menu {\n margin-top: -1px;\n border-top-left-radius: 0;\n border-top-right-radius: 0;\n}\n\n.nav-pills .nav-link {\n border-radius: 0.25rem;\n}\n\n.nav-pills .nav-link.active,\n.show > .nav-pills .nav-link {\n color: #fff;\n background-color: #007bff;\n}\n\n.nav-fill .nav-item {\n -ms-flex: 1 1 auto;\n flex: 1 1 auto;\n text-align: center;\n}\n\n.nav-justified .nav-item {\n -ms-flex-preferred-size: 0;\n flex-basis: 0;\n -ms-flex-positive: 1;\n flex-grow: 1;\n text-align: center;\n}\n\n.tab-content > .tab-pane {\n display: none;\n}\n\n.tab-content > .active {\n display: block;\n}\n\n.navbar {\n position: relative;\n display: -ms-flexbox;\n display: flex;\n -ms-flex-wrap: wrap;\n flex-wrap: wrap;\n -ms-flex-align: center;\n align-items: center;\n -ms-flex-pack: justify;\n justify-content: space-between;\n padding: 0.5rem 1rem;\n}\n\n.navbar > .container,\n.navbar > .container-fluid {\n display: -ms-flexbox;\n display: flex;\n -ms-flex-wrap: wrap;\n flex-wrap: wrap;\n -ms-flex-align: center;\n align-items: center;\n -ms-flex-pack: justify;\n justify-content: space-between;\n}\n\n.navbar-brand {\n display: inline-block;\n padding-top: 0.3125rem;\n padding-bottom: 0.3125rem;\n margin-right: 1rem;\n font-size: 1.25rem;\n line-height: inherit;\n white-space: nowrap;\n}\n\n.navbar-brand:focus, .navbar-brand:hover {\n text-decoration: none;\n}\n\n.navbar-nav {\n display: -ms-flexbox;\n display: flex;\n -ms-flex-direction: column;\n flex-direction: column;\n padding-left: 0;\n margin-bottom: 0;\n list-style: none;\n}\n\n.navbar-nav .nav-link {\n padding-right: 0;\n padding-left: 0;\n}\n\n.navbar-nav .dropdown-menu {\n position: static;\n float: none;\n}\n\n.navbar-text {\n display: inline-block;\n padding-top: 0.5rem;\n padding-bottom: 0.5rem;\n}\n\n.navbar-collapse {\n -ms-flex-preferred-size: 100%;\n flex-basis: 100%;\n -ms-flex-align: center;\n align-items: center;\n}\n\n.navbar-toggler {\n padding: 0.25rem 0.75rem;\n font-size: 1.25rem;\n line-height: 1;\n background: transparent;\n border: 1px solid transparent;\n border-radius: 0.25rem;\n}\n\n.navbar-toggler:focus, .navbar-toggler:hover {\n text-decoration: none;\n}\n\n.navbar-toggler-icon {\n display: inline-block;\n width: 1.5em;\n height: 1.5em;\n vertical-align: middle;\n content: \"\";\n background: no-repeat center center;\n background-size: 100% 100%;\n}\n\n@media (max-width: 575px) {\n .navbar-expand-sm > .container,\n .navbar-expand-sm > .container-fluid {\n padding-right: 0;\n padding-left: 0;\n }\n}\n\n@media (min-width: 576px) {\n .navbar-expand-sm {\n -ms-flex-direction: row;\n flex-direction: row;\n -ms-flex-wrap: nowrap;\n flex-wrap: nowrap;\n -ms-flex-pack: start;\n justify-content: flex-start;\n }\n .navbar-expand-sm .navbar-nav {\n -ms-flex-direction: row;\n flex-direction: row;\n }\n .navbar-expand-sm .navbar-nav .dropdown-menu {\n position: absolute;\n }\n .navbar-expand-sm .navbar-nav .dropdown-menu-right {\n right: 0;\n left: auto;\n }\n .navbar-expand-sm .navbar-nav .nav-link {\n padding-right: .5rem;\n padding-left: .5rem;\n }\n .navbar-expand-sm > .container,\n .navbar-expand-sm > .container-fluid {\n -ms-flex-wrap: nowrap;\n flex-wrap: nowrap;\n }\n .navbar-expand-sm .navbar-collapse {\n display: -ms-flexbox !important;\n display: flex !important;\n }\n .navbar-expand-sm .navbar-toggler {\n display: none;\n }\n}\n\n@media (max-width: 767px) {\n .navbar-expand-md > .container,\n .navbar-expand-md > .container-fluid {\n padding-right: 0;\n padding-left: 0;\n }\n}\n\n@media (min-width: 768px) {\n .navbar-expand-md {\n -ms-flex-direction: row;\n flex-direction: row;\n -ms-flex-wrap: nowrap;\n flex-wrap: nowrap;\n -ms-flex-pack: start;\n justify-content: flex-start;\n }\n .navbar-expand-md .navbar-nav {\n -ms-flex-direction: row;\n flex-direction: row;\n }\n .navbar-expand-md .navbar-nav .dropdown-menu {\n position: absolute;\n }\n .navbar-expand-md .navbar-nav .dropdown-menu-right {\n right: 0;\n left: auto;\n }\n .navbar-expand-md .navbar-nav .nav-link {\n padding-right: .5rem;\n padding-left: .5rem;\n }\n .navbar-expand-md > .container,\n .navbar-expand-md > .container-fluid {\n -ms-flex-wrap: nowrap;\n flex-wrap: nowrap;\n }\n .navbar-expand-md .navbar-collapse {\n display: -ms-flexbox !important;\n display: flex !important;\n }\n .navbar-expand-md .navbar-toggler {\n display: none;\n }\n}\n\n@media (max-width: 991px) {\n .navbar-expand-lg > .container,\n .navbar-expand-lg > .container-fluid {\n padding-right: 0;\n padding-left: 0;\n }\n}\n\n@media (min-width: 992px) {\n .navbar-expand-lg {\n -ms-flex-direction: row;\n flex-direction: row;\n -ms-flex-wrap: nowrap;\n flex-wrap: nowrap;\n -ms-flex-pack: start;\n justify-content: flex-start;\n }\n .navbar-expand-lg .navbar-nav {\n -ms-flex-direction: row;\n flex-direction: row;\n }\n .navbar-expand-lg .navbar-nav .dropdown-menu {\n position: absolute;\n }\n .navbar-expand-lg .navbar-nav .dropdown-menu-right {\n right: 0;\n left: auto;\n }\n .navbar-expand-lg .navbar-nav .nav-link {\n padding-right: .5rem;\n padding-left: .5rem;\n }\n .navbar-expand-lg > .container,\n .navbar-expand-lg > .container-fluid {\n -ms-flex-wrap: nowrap;\n flex-wrap: nowrap;\n }\n .navbar-expand-lg .navbar-collapse {\n display: -ms-flexbox !important;\n display: flex !important;\n }\n .navbar-expand-lg .navbar-toggler {\n display: none;\n }\n}\n\n@media (max-width: 1199px) {\n .navbar-expand-xl > .container,\n .navbar-expand-xl > .container-fluid {\n padding-right: 0;\n padding-left: 0;\n }\n}\n\n@media (min-width: 1200px) {\n .navbar-expand-xl {\n -ms-flex-direction: row;\n flex-direction: row;\n -ms-flex-wrap: nowrap;\n flex-wrap: nowrap;\n -ms-flex-pack: start;\n justify-content: flex-start;\n }\n .navbar-expand-xl .navbar-nav {\n -ms-flex-direction: row;\n flex-direction: row;\n }\n .navbar-expand-xl .navbar-nav .dropdown-menu {\n position: absolute;\n }\n .navbar-expand-xl .navbar-nav .dropdown-menu-right {\n right: 0;\n left: auto;\n }\n .navbar-expand-xl .navbar-nav .nav-link {\n padding-right: .5rem;\n padding-left: .5rem;\n }\n .navbar-expand-xl > .container,\n .navbar-expand-xl > .container-fluid {\n -ms-flex-wrap: nowrap;\n flex-wrap: nowrap;\n }\n .navbar-expand-xl .navbar-collapse {\n display: -ms-flexbox !important;\n display: flex !important;\n }\n .navbar-expand-xl .navbar-toggler {\n display: none;\n }\n}\n\n.navbar-expand {\n -ms-flex-direction: row;\n flex-direction: row;\n -ms-flex-wrap: nowrap;\n flex-wrap: nowrap;\n -ms-flex-pack: start;\n justify-content: flex-start;\n}\n\n.navbar-expand > .container,\n.navbar-expand > .container-fluid {\n padding-right: 0;\n padding-left: 0;\n}\n\n.navbar-expand .navbar-nav {\n -ms-flex-direction: row;\n flex-direction: row;\n}\n\n.navbar-expand .navbar-nav .dropdown-menu {\n position: absolute;\n}\n\n.navbar-expand .navbar-nav .dropdown-menu-right {\n right: 0;\n left: auto;\n}\n\n.navbar-expand .navbar-nav .nav-link {\n padding-right: .5rem;\n padding-left: .5rem;\n}\n\n.navbar-expand > .container,\n.navbar-expand > .container-fluid {\n -ms-flex-wrap: nowrap;\n flex-wrap: nowrap;\n}\n\n.navbar-expand .navbar-collapse {\n display: -ms-flexbox !important;\n display: flex !important;\n}\n\n.navbar-expand .navbar-toggler {\n display: none;\n}\n\n.navbar-light .navbar-brand {\n color: rgba(0, 0, 0, 0.9);\n}\n\n.navbar-light .navbar-brand:focus, .navbar-light .navbar-brand:hover {\n color: rgba(0, 0, 0, 0.9);\n}\n\n.navbar-light .navbar-nav .nav-link {\n color: rgba(0, 0, 0, 0.5);\n}\n\n.navbar-light .navbar-nav .nav-link:focus, .navbar-light .navbar-nav .nav-link:hover {\n color: rgba(0, 0, 0, 0.7);\n}\n\n.navbar-light .navbar-nav .nav-link.disabled {\n color: rgba(0, 0, 0, 0.3);\n}\n\n.navbar-light .navbar-nav .show > .nav-link,\n.navbar-light .navbar-nav .active > .nav-link,\n.navbar-light .navbar-nav .nav-link.show,\n.navbar-light .navbar-nav .nav-link.active {\n color: rgba(0, 0, 0, 0.9);\n}\n\n.navbar-light .navbar-toggler {\n color: rgba(0, 0, 0, 0.5);\n border-color: rgba(0, 0, 0, 0.1);\n}\n\n.navbar-light .navbar-toggler-icon {\n background-image: url(\"data:image/svg+xml;charset=utf8,%3Csvg viewBox='0 0 30 30' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath stroke='rgba(0, 0, 0, 0.5)' stroke-width='2' stroke-linecap='round' stroke-miterlimit='10' d='M4 7h22M4 15h22M4 23h22'/%3E%3C/svg%3E\");\n}\n\n.navbar-light .navbar-text {\n color: rgba(0, 0, 0, 0.5);\n}\n\n.navbar-dark .navbar-brand {\n color: white;\n}\n\n.navbar-dark .navbar-brand:focus, .navbar-dark .navbar-brand:hover {\n color: white;\n}\n\n.navbar-dark .navbar-nav .nav-link {\n color: rgba(255, 255, 255, 0.5);\n}\n\n.navbar-dark .navbar-nav .nav-link:focus, .navbar-dark .navbar-nav .nav-link:hover {\n color: rgba(255, 255, 255, 0.75);\n}\n\n.navbar-dark .navbar-nav .nav-link.disabled {\n color: rgba(255, 255, 255, 0.25);\n}\n\n.navbar-dark .navbar-nav .show > .nav-link,\n.navbar-dark .navbar-nav .active > .nav-link,\n.navbar-dark .navbar-nav .nav-link.show,\n.navbar-dark .navbar-nav .nav-link.active {\n color: white;\n}\n\n.navbar-dark .navbar-toggler {\n color: rgba(255, 255, 255, 0.5);\n border-color: rgba(255, 255, 255, 0.1);\n}\n\n.navbar-dark .navbar-toggler-icon {\n background-image: url(\"data:image/svg+xml;charset=utf8,%3Csvg viewBox='0 0 30 30' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath stroke='rgba(255, 255, 255, 0.5)' stroke-width='2' stroke-linecap='round' stroke-miterlimit='10' d='M4 7h22M4 15h22M4 23h22'/%3E%3C/svg%3E\");\n}\n\n.navbar-dark .navbar-text {\n color: rgba(255, 255, 255, 0.5);\n}\n\n.card {\n position: relative;\n display: -ms-flexbox;\n display: flex;\n -ms-flex-direction: column;\n flex-direction: column;\n min-width: 0;\n word-wrap: break-word;\n background-color: #fff;\n background-clip: border-box;\n border: 1px solid rgba(0, 0, 0, 0.125);\n border-radius: 0.25rem;\n}\n\n.card-body {\n -ms-flex: 1 1 auto;\n flex: 1 1 auto;\n padding: 1.25rem;\n}\n\n.card-title {\n margin-bottom: 0.75rem;\n}\n\n.card-subtitle {\n margin-top: -0.375rem;\n margin-bottom: 0;\n}\n\n.card-text:last-child {\n margin-bottom: 0;\n}\n\n.card-link:hover {\n text-decoration: none;\n}\n\n.card-link + .card-link {\n margin-left: 1.25rem;\n}\n\n.card > .list-group:first-child .list-group-item:first-child {\n border-top-left-radius: 0.25rem;\n border-top-right-radius: 0.25rem;\n}\n\n.card > .list-group:last-child .list-group-item:last-child {\n border-bottom-right-radius: 0.25rem;\n border-bottom-left-radius: 0.25rem;\n}\n\n.card-header {\n padding: 0.75rem 1.25rem;\n margin-bottom: 0;\n background-color: rgba(0, 0, 0, 0.03);\n border-bottom: 1px solid rgba(0, 0, 0, 0.125);\n}\n\n.card-header:first-child {\n border-radius: calc(0.25rem - 1px) calc(0.25rem - 1px) 0 0;\n}\n\n.card-footer {\n padding: 0.75rem 1.25rem;\n background-color: rgba(0, 0, 0, 0.03);\n border-top: 1px solid rgba(0, 0, 0, 0.125);\n}\n\n.card-footer:last-child {\n border-radius: 0 0 calc(0.25rem - 1px) calc(0.25rem - 1px);\n}\n\n.card-header-tabs {\n margin-right: -0.625rem;\n margin-bottom: -0.75rem;\n margin-left: -0.625rem;\n border-bottom: 0;\n}\n\n.card-header-pills {\n margin-right: -0.625rem;\n margin-left: -0.625rem;\n}\n\n.card-img-overlay {\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n padding: 1.25rem;\n}\n\n.card-img {\n width: 100%;\n border-radius: calc(0.25rem - 1px);\n}\n\n.card-img-top {\n width: 100%;\n border-top-left-radius: calc(0.25rem - 1px);\n border-top-right-radius: calc(0.25rem - 1px);\n}\n\n.card-img-bottom {\n width: 100%;\n border-bottom-right-radius: calc(0.25rem - 1px);\n border-bottom-left-radius: calc(0.25rem - 1px);\n}\n\n@media (min-width: 576px) {\n .card-deck {\n display: -ms-flexbox;\n display: flex;\n -ms-flex-flow: row wrap;\n flex-flow: row wrap;\n margin-right: -15px;\n margin-left: -15px;\n }\n .card-deck .card {\n display: -ms-flexbox;\n display: flex;\n -ms-flex: 1 0 0%;\n flex: 1 0 0%;\n -ms-flex-direction: column;\n flex-direction: column;\n margin-right: 15px;\n margin-left: 15px;\n }\n}\n\n@media (min-width: 576px) {\n .card-group {\n display: -ms-flexbox;\n display: flex;\n -ms-flex-flow: row wrap;\n flex-flow: row wrap;\n }\n .card-group .card {\n -ms-flex: 1 0 0%;\n flex: 1 0 0%;\n }\n .card-group .card + .card {\n margin-left: 0;\n border-left: 0;\n }\n .card-group .card:first-child {\n border-top-right-radius: 0;\n border-bottom-right-radius: 0;\n }\n .card-group .card:first-child .card-img-top {\n border-top-right-radius: 0;\n }\n .card-group .card:first-child .card-img-bottom {\n border-bottom-right-radius: 0;\n }\n .card-group .card:last-child {\n border-top-left-radius: 0;\n border-bottom-left-radius: 0;\n }\n .card-group .card:last-child .card-img-top {\n border-top-left-radius: 0;\n }\n .card-group .card:last-child .card-img-bottom {\n border-bottom-left-radius: 0;\n }\n .card-group .card:not(:first-child):not(:last-child) {\n border-radius: 0;\n }\n .card-group .card:not(:first-child):not(:last-child) .card-img-top,\n .card-group .card:not(:first-child):not(:last-child) .card-img-bottom {\n border-radius: 0;\n }\n}\n\n.card-columns .card {\n margin-bottom: 0.75rem;\n}\n\n@media (min-width: 576px) {\n .card-columns {\n -webkit-column-count: 3;\n column-count: 3;\n -webkit-column-gap: 1.25rem;\n column-gap: 1.25rem;\n }\n .card-columns .card {\n display: inline-block;\n width: 100%;\n }\n}\n\n.breadcrumb {\n padding: 0.75rem 1rem;\n margin-bottom: 1rem;\n list-style: none;\n background-color: #e9ecef;\n border-radius: 0.25rem;\n}\n\n.breadcrumb::after {\n display: block;\n clear: both;\n content: \"\";\n}\n\n.breadcrumb-item {\n float: left;\n}\n\n.breadcrumb-item + .breadcrumb-item::before {\n display: inline-block;\n padding-right: 0.5rem;\n padding-left: 0.5rem;\n color: #868e96;\n content: \"/\";\n}\n\n.breadcrumb-item + .breadcrumb-item:hover::before {\n text-decoration: underline;\n}\n\n.breadcrumb-item + .breadcrumb-item:hover::before {\n text-decoration: none;\n}\n\n.breadcrumb-item.active {\n color: #868e96;\n}\n\n.pagination {\n display: -ms-flexbox;\n display: flex;\n padding-left: 0;\n list-style: none;\n border-radius: 0.25rem;\n}\n\n.page-item:first-child .page-link {\n margin-left: 0;\n border-top-left-radius: 0.25rem;\n border-bottom-left-radius: 0.25rem;\n}\n\n.page-item:last-child .page-link {\n border-top-right-radius: 0.25rem;\n border-bottom-right-radius: 0.25rem;\n}\n\n.page-item.active .page-link {\n z-index: 2;\n color: #fff;\n background-color: #007bff;\n border-color: #007bff;\n}\n\n.page-item.disabled .page-link {\n color: #868e96;\n pointer-events: none;\n background-color: #fff;\n border-color: #ddd;\n}\n\n.page-link {\n position: relative;\n display: block;\n padding: 0.5rem 0.75rem;\n margin-left: -1px;\n line-height: 1.25;\n color: #007bff;\n background-color: #fff;\n border: 1px solid #ddd;\n}\n\n.page-link:focus, .page-link:hover {\n color: #0056b3;\n text-decoration: none;\n background-color: #e9ecef;\n border-color: #ddd;\n}\n\n.pagination-lg .page-link {\n padding: 0.75rem 1.5rem;\n font-size: 1.25rem;\n line-height: 1.5;\n}\n\n.pagination-lg .page-item:first-child .page-link {\n border-top-left-radius: 0.3rem;\n border-bottom-left-radius: 0.3rem;\n}\n\n.pagination-lg .page-item:last-child .page-link {\n border-top-right-radius: 0.3rem;\n border-bottom-right-radius: 0.3rem;\n}\n\n.pagination-sm .page-link {\n padding: 0.25rem 0.5rem;\n font-size: 0.875rem;\n line-height: 1.5;\n}\n\n.pagination-sm .page-item:first-child .page-link {\n border-top-left-radius: 0.2rem;\n border-bottom-left-radius: 0.2rem;\n}\n\n.pagination-sm .page-item:last-child .page-link {\n border-top-right-radius: 0.2rem;\n border-bottom-right-radius: 0.2rem;\n}\n\n.badge {\n display: inline-block;\n padding: 0.25em 0.4em;\n font-size: 75%;\n font-weight: bold;\n line-height: 1;\n color: #fff;\n text-align: center;\n white-space: nowrap;\n vertical-align: baseline;\n border-radius: 0.25rem;\n}\n\n.badge:empty {\n display: none;\n}\n\n.btn .badge {\n position: relative;\n top: -1px;\n}\n\n.badge-pill {\n padding-right: 0.6em;\n padding-left: 0.6em;\n border-radius: 10rem;\n}\n\n.badge-primary {\n color: #fff;\n background-color: #007bff;\n}\n\n.badge-primary[href]:focus, .badge-primary[href]:hover {\n color: #fff;\n text-decoration: none;\n background-color: #0062cc;\n}\n\n.badge-secondary {\n color: #fff;\n background-color: #868e96;\n}\n\n.badge-secondary[href]:focus, .badge-secondary[href]:hover {\n color: #fff;\n text-decoration: none;\n background-color: #6c757d;\n}\n\n.badge-success {\n color: #fff;\n background-color: #28a745;\n}\n\n.badge-success[href]:focus, .badge-success[href]:hover {\n color: #fff;\n text-decoration: none;\n background-color: #1e7e34;\n}\n\n.badge-info {\n color: #fff;\n background-color: #17a2b8;\n}\n\n.badge-info[href]:focus, .badge-info[href]:hover {\n color: #fff;\n text-decoration: none;\n background-color: #117a8b;\n}\n\n.badge-warning {\n color: #111;\n background-color: #ffc107;\n}\n\n.badge-warning[href]:focus, .badge-warning[href]:hover {\n color: #111;\n text-decoration: none;\n background-color: #d39e00;\n}\n\n.badge-danger {\n color: #fff;\n background-color: #dc3545;\n}\n\n.badge-danger[href]:focus, .badge-danger[href]:hover {\n color: #fff;\n text-decoration: none;\n background-color: #bd2130;\n}\n\n.badge-light {\n color: #111;\n background-color: #f8f9fa;\n}\n\n.badge-light[href]:focus, .badge-light[href]:hover {\n color: #111;\n text-decoration: none;\n background-color: #dae0e5;\n}\n\n.badge-dark {\n color: #fff;\n background-color: #343a40;\n}\n\n.badge-dark[href]:focus, .badge-dark[href]:hover {\n color: #fff;\n text-decoration: none;\n background-color: #1d2124;\n}\n\n.jumbotron {\n padding: 2rem 1rem;\n margin-bottom: 2rem;\n background-color: #e9ecef;\n border-radius: 0.3rem;\n}\n\n@media (min-width: 576px) {\n .jumbotron {\n padding: 4rem 2rem;\n }\n}\n\n.jumbotron-fluid {\n padding-right: 0;\n padding-left: 0;\n border-radius: 0;\n}\n\n.alert {\n padding: 0.75rem 1.25rem;\n margin-bottom: 1rem;\n border: 1px solid transparent;\n border-radius: 0.25rem;\n}\n\n.alert-heading {\n color: inherit;\n}\n\n.alert-link {\n font-weight: bold;\n}\n\n.alert-dismissible .close {\n position: relative;\n top: -0.75rem;\n right: -1.25rem;\n padding: 0.75rem 1.25rem;\n color: inherit;\n}\n\n.alert-primary {\n color: #004085;\n background-color: #cce5ff;\n border-color: #b8daff;\n}\n\n.alert-primary hr {\n border-top-color: #9fcdff;\n}\n\n.alert-primary .alert-link {\n color: #002752;\n}\n\n.alert-secondary {\n color: #464a4e;\n background-color: #e7e8ea;\n border-color: #dddfe2;\n}\n\n.alert-secondary hr {\n border-top-color: #cfd2d6;\n}\n\n.alert-secondary .alert-link {\n color: #2e3133;\n}\n\n.alert-success {\n color: #155724;\n background-color: #d4edda;\n border-color: #c3e6cb;\n}\n\n.alert-success hr {\n border-top-color: #b1dfbb;\n}\n\n.alert-success .alert-link {\n color: #0b2e13;\n}\n\n.alert-info {\n color: #0c5460;\n background-color: #d1ecf1;\n border-color: #bee5eb;\n}\n\n.alert-info hr {\n border-top-color: #abdde5;\n}\n\n.alert-info .alert-link {\n color: #062c33;\n}\n\n.alert-warning {\n color: #856404;\n background-color: #fff3cd;\n border-color: #ffeeba;\n}\n\n.alert-warning hr {\n border-top-color: #ffe8a1;\n}\n\n.alert-warning .alert-link {\n color: #533f03;\n}\n\n.alert-danger {\n color: #721c24;\n background-color: #f8d7da;\n border-color: #f5c6cb;\n}\n\n.alert-danger hr {\n border-top-color: #f1b0b7;\n}\n\n.alert-danger .alert-link {\n color: #491217;\n}\n\n.alert-light {\n color: #818182;\n background-color: #fefefe;\n border-color: #fdfdfe;\n}\n\n.alert-light hr {\n border-top-color: #ececf6;\n}\n\n.alert-light .alert-link {\n color: #686868;\n}\n\n.alert-dark {\n color: #1b1e21;\n background-color: #d6d8d9;\n border-color: #c6c8ca;\n}\n\n.alert-dark hr {\n border-top-color: #b9bbbe;\n}\n\n.alert-dark .alert-link {\n color: #040505;\n}\n\n@-webkit-keyframes progress-bar-stripes {\n from {\n background-position: 1rem 0;\n }\n to {\n background-position: 0 0;\n }\n}\n\n@keyframes progress-bar-stripes {\n from {\n background-position: 1rem 0;\n }\n to {\n background-position: 0 0;\n }\n}\n\n.progress {\n display: -ms-flexbox;\n display: flex;\n overflow: hidden;\n font-size: 0.75rem;\n line-height: 1rem;\n text-align: center;\n background-color: #e9ecef;\n border-radius: 0.25rem;\n}\n\n.progress-bar {\n height: 1rem;\n line-height: 1rem;\n color: #fff;\n background-color: #007bff;\n transition: width 0.6s ease;\n}\n\n.progress-bar-striped {\n 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);\n background-size: 1rem 1rem;\n}\n\n.progress-bar-animated {\n -webkit-animation: progress-bar-stripes 1s linear infinite;\n animation: progress-bar-stripes 1s linear infinite;\n}\n\n.media {\n display: -ms-flexbox;\n display: flex;\n -ms-flex-align: start;\n align-items: flex-start;\n}\n\n.media-body {\n -ms-flex: 1;\n flex: 1;\n}\n\n.list-group {\n display: -ms-flexbox;\n display: flex;\n -ms-flex-direction: column;\n flex-direction: column;\n padding-left: 0;\n margin-bottom: 0;\n}\n\n.list-group-item-action {\n width: 100%;\n color: #495057;\n text-align: inherit;\n}\n\n.list-group-item-action:focus, .list-group-item-action:hover {\n color: #495057;\n text-decoration: none;\n background-color: #f8f9fa;\n}\n\n.list-group-item-action:active {\n color: #212529;\n background-color: #e9ecef;\n}\n\n.list-group-item {\n position: relative;\n display: block;\n padding: 0.75rem 1.25rem;\n margin-bottom: -1px;\n background-color: #fff;\n border: 1px solid rgba(0, 0, 0, 0.125);\n}\n\n.list-group-item:first-child {\n border-top-left-radius: 0.25rem;\n border-top-right-radius: 0.25rem;\n}\n\n.list-group-item:last-child {\n margin-bottom: 0;\n border-bottom-right-radius: 0.25rem;\n border-bottom-left-radius: 0.25rem;\n}\n\n.list-group-item:focus, .list-group-item:hover {\n text-decoration: none;\n}\n\n.list-group-item.disabled, .list-group-item:disabled {\n color: #868e96;\n background-color: #fff;\n}\n\n.list-group-item.active {\n z-index: 2;\n color: #fff;\n background-color: #007bff;\n border-color: #007bff;\n}\n\n.list-group-flush .list-group-item {\n border-right: 0;\n border-left: 0;\n border-radius: 0;\n}\n\n.list-group-flush:first-child .list-group-item:first-child {\n border-top: 0;\n}\n\n.list-group-flush:last-child .list-group-item:last-child {\n border-bottom: 0;\n}\n\n.list-group-item-primary {\n color: #004085;\n background-color: #b8daff;\n}\n\na.list-group-item-primary,\nbutton.list-group-item-primary {\n color: #004085;\n}\n\na.list-group-item-primary:focus, a.list-group-item-primary:hover,\nbutton.list-group-item-primary:focus,\nbutton.list-group-item-primary:hover {\n color: #004085;\n background-color: #9fcdff;\n}\n\na.list-group-item-primary.active,\nbutton.list-group-item-primary.active {\n color: #fff;\n background-color: #004085;\n border-color: #004085;\n}\n\n.list-group-item-secondary {\n color: #464a4e;\n background-color: #dddfe2;\n}\n\na.list-group-item-secondary,\nbutton.list-group-item-secondary {\n color: #464a4e;\n}\n\na.list-group-item-secondary:focus, a.list-group-item-secondary:hover,\nbutton.list-group-item-secondary:focus,\nbutton.list-group-item-secondary:hover {\n color: #464a4e;\n background-color: #cfd2d6;\n}\n\na.list-group-item-secondary.active,\nbutton.list-group-item-secondary.active {\n color: #fff;\n background-color: #464a4e;\n border-color: #464a4e;\n}\n\n.list-group-item-success {\n color: #155724;\n background-color: #c3e6cb;\n}\n\na.list-group-item-success,\nbutton.list-group-item-success {\n color: #155724;\n}\n\na.list-group-item-success:focus, a.list-group-item-success:hover,\nbutton.list-group-item-success:focus,\nbutton.list-group-item-success:hover {\n color: #155724;\n background-color: #b1dfbb;\n}\n\na.list-group-item-success.active,\nbutton.list-group-item-success.active {\n color: #fff;\n background-color: #155724;\n border-color: #155724;\n}\n\n.list-group-item-info {\n color: #0c5460;\n background-color: #bee5eb;\n}\n\na.list-group-item-info,\nbutton.list-group-item-info {\n color: #0c5460;\n}\n\na.list-group-item-info:focus, a.list-group-item-info:hover,\nbutton.list-group-item-info:focus,\nbutton.list-group-item-info:hover {\n color: #0c5460;\n background-color: #abdde5;\n}\n\na.list-group-item-info.active,\nbutton.list-group-item-info.active {\n color: #fff;\n background-color: #0c5460;\n border-color: #0c5460;\n}\n\n.list-group-item-warning {\n color: #856404;\n background-color: #ffeeba;\n}\n\na.list-group-item-warning,\nbutton.list-group-item-warning {\n color: #856404;\n}\n\na.list-group-item-warning:focus, a.list-group-item-warning:hover,\nbutton.list-group-item-warning:focus,\nbutton.list-group-item-warning:hover {\n color: #856404;\n background-color: #ffe8a1;\n}\n\na.list-group-item-warning.active,\nbutton.list-group-item-warning.active {\n color: #fff;\n background-color: #856404;\n border-color: #856404;\n}\n\n.list-group-item-danger {\n color: #721c24;\n background-color: #f5c6cb;\n}\n\na.list-group-item-danger,\nbutton.list-group-item-danger {\n color: #721c24;\n}\n\na.list-group-item-danger:focus, a.list-group-item-danger:hover,\nbutton.list-group-item-danger:focus,\nbutton.list-group-item-danger:hover {\n color: #721c24;\n background-color: #f1b0b7;\n}\n\na.list-group-item-danger.active,\nbutton.list-group-item-danger.active {\n color: #fff;\n background-color: #721c24;\n border-color: #721c24;\n}\n\n.list-group-item-light {\n color: #818182;\n background-color: #fdfdfe;\n}\n\na.list-group-item-light,\nbutton.list-group-item-light {\n color: #818182;\n}\n\na.list-group-item-light:focus, a.list-group-item-light:hover,\nbutton.list-group-item-light:focus,\nbutton.list-group-item-light:hover {\n color: #818182;\n background-color: #ececf6;\n}\n\na.list-group-item-light.active,\nbutton.list-group-item-light.active {\n color: #fff;\n background-color: #818182;\n border-color: #818182;\n}\n\n.list-group-item-dark {\n color: #1b1e21;\n background-color: #c6c8ca;\n}\n\na.list-group-item-dark,\nbutton.list-group-item-dark {\n color: #1b1e21;\n}\n\na.list-group-item-dark:focus, a.list-group-item-dark:hover,\nbutton.list-group-item-dark:focus,\nbutton.list-group-item-dark:hover {\n color: #1b1e21;\n background-color: #b9bbbe;\n}\n\na.list-group-item-dark.active,\nbutton.list-group-item-dark.active {\n color: #fff;\n background-color: #1b1e21;\n border-color: #1b1e21;\n}\n\n.close {\n float: right;\n font-size: 1.5rem;\n font-weight: bold;\n line-height: 1;\n color: #000;\n text-shadow: 0 1px 0 #fff;\n opacity: .5;\n}\n\n.close:focus, .close:hover {\n color: #000;\n text-decoration: none;\n opacity: .75;\n}\n\nbutton.close {\n padding: 0;\n background: transparent;\n border: 0;\n -webkit-appearance: none;\n}\n\n.modal-open {\n overflow: hidden;\n}\n\n.modal {\n position: fixed;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: 1050;\n display: none;\n overflow: hidden;\n outline: 0;\n}\n\n.modal.fade .modal-dialog {\n transition: -webkit-transform 0.3s ease-out;\n transition: transform 0.3s ease-out;\n transition: transform 0.3s ease-out, -webkit-transform 0.3s ease-out;\n -webkit-transform: translate(0, -25%);\n transform: translate(0, -25%);\n}\n\n.modal.show .modal-dialog {\n -webkit-transform: translate(0, 0);\n transform: translate(0, 0);\n}\n\n.modal-open .modal {\n overflow-x: hidden;\n overflow-y: auto;\n}\n\n.modal-dialog {\n position: relative;\n width: auto;\n margin: 10px;\n}\n\n.modal-content {\n position: relative;\n display: -ms-flexbox;\n display: flex;\n -ms-flex-direction: column;\n flex-direction: column;\n background-color: #fff;\n background-clip: padding-box;\n border: 1px solid rgba(0, 0, 0, 0.2);\n border-radius: 0.3rem;\n outline: 0;\n}\n\n.modal-backdrop {\n position: fixed;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: 1040;\n background-color: #000;\n}\n\n.modal-backdrop.fade {\n opacity: 0;\n}\n\n.modal-backdrop.show {\n opacity: 0.5;\n}\n\n.modal-header {\n display: -ms-flexbox;\n display: flex;\n -ms-flex-align: center;\n align-items: center;\n -ms-flex-pack: justify;\n justify-content: space-between;\n padding: 15px;\n border-bottom: 1px solid #e9ecef;\n}\n\n.modal-title {\n margin-bottom: 0;\n line-height: 1.5;\n}\n\n.modal-body {\n position: relative;\n -ms-flex: 1 1 auto;\n flex: 1 1 auto;\n padding: 15px;\n}\n\n.modal-footer {\n display: -ms-flexbox;\n display: flex;\n -ms-flex-align: center;\n align-items: center;\n -ms-flex-pack: end;\n justify-content: flex-end;\n padding: 15px;\n border-top: 1px solid #e9ecef;\n}\n\n.modal-footer > :not(:first-child) {\n margin-left: .25rem;\n}\n\n.modal-footer > :not(:last-child) {\n margin-right: .25rem;\n}\n\n.modal-scrollbar-measure {\n position: absolute;\n top: -9999px;\n width: 50px;\n height: 50px;\n overflow: scroll;\n}\n\n@media (min-width: 576px) {\n .modal-dialog {\n max-width: 500px;\n margin: 30px auto;\n }\n .modal-sm {\n max-width: 300px;\n }\n}\n\n@media (min-width: 992px) {\n .modal-lg {\n max-width: 800px;\n }\n}\n\n.tooltip {\n position: absolute;\n z-index: 1070;\n display: block;\n margin: 0;\n font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, \"Helvetica Neue\", Arial, sans-serif;\n font-style: normal;\n font-weight: normal;\n line-height: 1.5;\n text-align: left;\n text-align: start;\n text-decoration: none;\n text-shadow: none;\n text-transform: none;\n letter-spacing: normal;\n word-break: normal;\n word-spacing: normal;\n white-space: normal;\n line-break: auto;\n font-size: 0.875rem;\n word-wrap: break-word;\n opacity: 0;\n}\n\n.tooltip.show {\n opacity: 0.9;\n}\n\n.tooltip .arrow {\n position: absolute;\n display: block;\n width: 5px;\n height: 5px;\n}\n\n.tooltip.bs-tooltip-top, .tooltip.bs-tooltip-auto[x-placement^=\"top\"] {\n padding: 5px 0;\n}\n\n.tooltip.bs-tooltip-top .arrow, .tooltip.bs-tooltip-auto[x-placement^=\"top\"] .arrow {\n bottom: 0;\n}\n\n.tooltip.bs-tooltip-top .arrow::before, .tooltip.bs-tooltip-auto[x-placement^=\"top\"] .arrow::before {\n margin-left: -3px;\n content: \"\";\n border-width: 5px 5px 0;\n border-top-color: #000;\n}\n\n.tooltip.bs-tooltip-right, .tooltip.bs-tooltip-auto[x-placement^=\"right\"] {\n padding: 0 5px;\n}\n\n.tooltip.bs-tooltip-right .arrow, .tooltip.bs-tooltip-auto[x-placement^=\"right\"] .arrow {\n left: 0;\n}\n\n.tooltip.bs-tooltip-right .arrow::before, .tooltip.bs-tooltip-auto[x-placement^=\"right\"] .arrow::before {\n margin-top: -3px;\n content: \"\";\n border-width: 5px 5px 5px 0;\n border-right-color: #000;\n}\n\n.tooltip.bs-tooltip-bottom, .tooltip.bs-tooltip-auto[x-placement^=\"bottom\"] {\n padding: 5px 0;\n}\n\n.tooltip.bs-tooltip-bottom .arrow, .tooltip.bs-tooltip-auto[x-placement^=\"bottom\"] .arrow {\n top: 0;\n}\n\n.tooltip.bs-tooltip-bottom .arrow::before, .tooltip.bs-tooltip-auto[x-placement^=\"bottom\"] .arrow::before {\n margin-left: -3px;\n content: \"\";\n border-width: 0 5px 5px;\n border-bottom-color: #000;\n}\n\n.tooltip.bs-tooltip-left, .tooltip.bs-tooltip-auto[x-placement^=\"left\"] {\n padding: 0 5px;\n}\n\n.tooltip.bs-tooltip-left .arrow, .tooltip.bs-tooltip-auto[x-placement^=\"left\"] .arrow {\n right: 0;\n}\n\n.tooltip.bs-tooltip-left .arrow::before, .tooltip.bs-tooltip-auto[x-placement^=\"left\"] .arrow::before {\n right: 0;\n margin-top: -3px;\n content: \"\";\n border-width: 5px 0 5px 5px;\n border-left-color: #000;\n}\n\n.tooltip .arrow::before {\n position: absolute;\n border-color: transparent;\n border-style: solid;\n}\n\n.tooltip-inner {\n max-width: 200px;\n padding: 3px 8px;\n color: #fff;\n text-align: center;\n background-color: #000;\n border-radius: 0.25rem;\n}\n\n.popover {\n position: absolute;\n top: 0;\n left: 0;\n z-index: 1060;\n display: block;\n max-width: 276px;\n padding: 1px;\n font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, \"Helvetica Neue\", Arial, sans-serif;\n font-style: normal;\n font-weight: normal;\n line-height: 1.5;\n text-align: left;\n text-align: start;\n text-decoration: none;\n text-shadow: none;\n text-transform: none;\n letter-spacing: normal;\n word-break: normal;\n word-spacing: normal;\n white-space: normal;\n line-break: auto;\n font-size: 0.875rem;\n word-wrap: break-word;\n background-color: #fff;\n background-clip: padding-box;\n border: 1px solid rgba(0, 0, 0, 0.2);\n border-radius: 0.3rem;\n}\n\n.popover .arrow {\n position: absolute;\n display: block;\n width: 10px;\n height: 5px;\n}\n\n.popover .arrow::before,\n.popover .arrow::after {\n position: absolute;\n display: block;\n border-color: transparent;\n border-style: solid;\n}\n\n.popover .arrow::before {\n content: \"\";\n border-width: 11px;\n}\n\n.popover .arrow::after {\n content: \"\";\n border-width: 11px;\n}\n\n.popover.bs-popover-top, .popover.bs-popover-auto[x-placement^=\"top\"] {\n margin-bottom: 10px;\n}\n\n.popover.bs-popover-top .arrow, .popover.bs-popover-auto[x-placement^=\"top\"] .arrow {\n bottom: 0;\n}\n\n.popover.bs-popover-top .arrow::before, .popover.bs-popover-auto[x-placement^=\"top\"] .arrow::before,\n.popover.bs-popover-top .arrow::after, .popover.bs-popover-auto[x-placement^=\"top\"] .arrow::after {\n border-bottom-width: 0;\n}\n\n.popover.bs-popover-top .arrow::before, .popover.bs-popover-auto[x-placement^=\"top\"] .arrow::before {\n bottom: -11px;\n margin-left: -6px;\n border-top-color: rgba(0, 0, 0, 0.25);\n}\n\n.popover.bs-popover-top .arrow::after, .popover.bs-popover-auto[x-placement^=\"top\"] .arrow::after {\n bottom: -10px;\n margin-left: -6px;\n border-top-color: #fff;\n}\n\n.popover.bs-popover-right, .popover.bs-popover-auto[x-placement^=\"right\"] {\n margin-left: 10px;\n}\n\n.popover.bs-popover-right .arrow, .popover.bs-popover-auto[x-placement^=\"right\"] .arrow {\n left: 0;\n}\n\n.popover.bs-popover-right .arrow::before, .popover.bs-popover-auto[x-placement^=\"right\"] .arrow::before,\n.popover.bs-popover-right .arrow::after, .popover.bs-popover-auto[x-placement^=\"right\"] .arrow::after {\n margin-top: -8px;\n border-left-width: 0;\n}\n\n.popover.bs-popover-right .arrow::before, .popover.bs-popover-auto[x-placement^=\"right\"] .arrow::before {\n left: -11px;\n border-right-color: rgba(0, 0, 0, 0.25);\n}\n\n.popover.bs-popover-right .arrow::after, .popover.bs-popover-auto[x-placement^=\"right\"] .arrow::after {\n left: -10px;\n border-right-color: #fff;\n}\n\n.popover.bs-popover-bottom, .popover.bs-popover-auto[x-placement^=\"bottom\"] {\n margin-top: 10px;\n}\n\n.popover.bs-popover-bottom .arrow, .popover.bs-popover-auto[x-placement^=\"bottom\"] .arrow {\n top: 0;\n}\n\n.popover.bs-popover-bottom .arrow::before, .popover.bs-popover-auto[x-placement^=\"bottom\"] .arrow::before,\n.popover.bs-popover-bottom .arrow::after, .popover.bs-popover-auto[x-placement^=\"bottom\"] .arrow::after {\n margin-left: -7px;\n border-top-width: 0;\n}\n\n.popover.bs-popover-bottom .arrow::before, .popover.bs-popover-auto[x-placement^=\"bottom\"] .arrow::before {\n top: -11px;\n border-bottom-color: rgba(0, 0, 0, 0.25);\n}\n\n.popover.bs-popover-bottom .arrow::after, .popover.bs-popover-auto[x-placement^=\"bottom\"] .arrow::after {\n top: -10px;\n border-bottom-color: #fff;\n}\n\n.popover.bs-popover-bottom .popover-header::before, .popover.bs-popover-auto[x-placement^=\"bottom\"] .popover-header::before {\n position: absolute;\n top: 0;\n left: 50%;\n display: block;\n width: 20px;\n margin-left: -10px;\n content: \"\";\n border-bottom: 1px solid #f7f7f7;\n}\n\n.popover.bs-popover-left, .popover.bs-popover-auto[x-placement^=\"left\"] {\n margin-right: 10px;\n}\n\n.popover.bs-popover-left .arrow, .popover.bs-popover-auto[x-placement^=\"left\"] .arrow {\n right: 0;\n}\n\n.popover.bs-popover-left .arrow::before, .popover.bs-popover-auto[x-placement^=\"left\"] .arrow::before,\n.popover.bs-popover-left .arrow::after, .popover.bs-popover-auto[x-placement^=\"left\"] .arrow::after {\n margin-top: -8px;\n border-right-width: 0;\n}\n\n.popover.bs-popover-left .arrow::before, .popover.bs-popover-auto[x-placement^=\"left\"] .arrow::before {\n right: -11px;\n border-left-color: rgba(0, 0, 0, 0.25);\n}\n\n.popover.bs-popover-left .arrow::after, .popover.bs-popover-auto[x-placement^=\"left\"] .arrow::after {\n right: -10px;\n border-left-color: #fff;\n}\n\n.popover-header {\n padding: 8px 14px;\n margin-bottom: 0;\n font-size: 1rem;\n color: inherit;\n background-color: #f7f7f7;\n border-bottom: 1px solid #ebebeb;\n border-top-left-radius: calc(0.3rem - 1px);\n border-top-right-radius: calc(0.3rem - 1px);\n}\n\n.popover-header:empty {\n display: none;\n}\n\n.popover-body {\n padding: 9px 14px;\n color: #212529;\n}\n\n.carousel {\n position: relative;\n}\n\n.carousel-inner {\n position: relative;\n width: 100%;\n overflow: hidden;\n}\n\n.carousel-item {\n position: relative;\n display: none;\n -ms-flex-align: center;\n align-items: center;\n width: 100%;\n transition: -webkit-transform 0.6s ease;\n transition: transform 0.6s ease;\n transition: transform 0.6s ease, -webkit-transform 0.6s ease;\n -webkit-backface-visibility: hidden;\n backface-visibility: hidden;\n -webkit-perspective: 1000px;\n perspective: 1000px;\n}\n\n.carousel-item.active,\n.carousel-item-next,\n.carousel-item-prev {\n display: block;\n}\n\n.carousel-item-next,\n.carousel-item-prev {\n position: absolute;\n top: 0;\n}\n\n.carousel-item-next.carousel-item-left,\n.carousel-item-prev.carousel-item-right {\n -webkit-transform: translateX(0);\n transform: translateX(0);\n}\n\n@supports ((-webkit-transform-style: preserve-3d) or (transform-style: preserve-3d)) {\n .carousel-item-next.carousel-item-left,\n .carousel-item-prev.carousel-item-right {\n -webkit-transform: translate3d(0, 0, 0);\n transform: translate3d(0, 0, 0);\n }\n}\n\n.carousel-item-next,\n.active.carousel-item-right {\n -webkit-transform: translateX(100%);\n transform: translateX(100%);\n}\n\n@supports ((-webkit-transform-style: preserve-3d) or (transform-style: preserve-3d)) {\n .carousel-item-next,\n .active.carousel-item-right {\n -webkit-transform: translate3d(100%, 0, 0);\n transform: translate3d(100%, 0, 0);\n }\n}\n\n.carousel-item-prev,\n.active.carousel-item-left {\n -webkit-transform: translateX(-100%);\n transform: translateX(-100%);\n}\n\n@supports ((-webkit-transform-style: preserve-3d) or (transform-style: preserve-3d)) {\n .carousel-item-prev,\n .active.carousel-item-left {\n -webkit-transform: translate3d(-100%, 0, 0);\n transform: translate3d(-100%, 0, 0);\n }\n}\n\n.carousel-control-prev,\n.carousel-control-next {\n position: absolute;\n top: 0;\n bottom: 0;\n display: -ms-flexbox;\n display: flex;\n -ms-flex-align: center;\n align-items: center;\n -ms-flex-pack: center;\n justify-content: center;\n width: 15%;\n color: #fff;\n text-align: center;\n opacity: 0.5;\n}\n\n.carousel-control-prev:focus, .carousel-control-prev:hover,\n.carousel-control-next:focus,\n.carousel-control-next:hover {\n color: #fff;\n text-decoration: none;\n outline: 0;\n opacity: .9;\n}\n\n.carousel-control-prev {\n left: 0;\n}\n\n.carousel-control-next {\n right: 0;\n}\n\n.carousel-control-prev-icon,\n.carousel-control-next-icon {\n display: inline-block;\n width: 20px;\n height: 20px;\n background: transparent no-repeat center center;\n background-size: 100% 100%;\n}\n\n.carousel-control-prev-icon {\n background-image: url(\"data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' viewBox='0 0 8 8'%3E%3Cpath d='M4 0l-4 4 4 4 1.5-1.5-2.5-2.5 2.5-2.5-1.5-1.5z'/%3E%3C/svg%3E\");\n}\n\n.carousel-control-next-icon {\n background-image: url(\"data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' viewBox='0 0 8 8'%3E%3Cpath d='M1.5 0l-1.5 1.5 2.5 2.5-2.5 2.5 1.5 1.5 4-4-4-4z'/%3E%3C/svg%3E\");\n}\n\n.carousel-indicators {\n position: absolute;\n right: 0;\n bottom: 10px;\n left: 0;\n z-index: 15;\n display: -ms-flexbox;\n display: flex;\n -ms-flex-pack: center;\n justify-content: center;\n padding-left: 0;\n margin-right: 15%;\n margin-left: 15%;\n list-style: none;\n}\n\n.carousel-indicators li {\n position: relative;\n -ms-flex: 0 1 auto;\n flex: 0 1 auto;\n width: 30px;\n height: 3px;\n margin-right: 3px;\n margin-left: 3px;\n text-indent: -999px;\n background-color: rgba(255, 255, 255, 0.5);\n}\n\n.carousel-indicators li::before {\n position: absolute;\n top: -10px;\n left: 0;\n display: inline-block;\n width: 100%;\n height: 10px;\n content: \"\";\n}\n\n.carousel-indicators li::after {\n position: absolute;\n bottom: -10px;\n left: 0;\n display: inline-block;\n width: 100%;\n height: 10px;\n content: \"\";\n}\n\n.carousel-indicators .active {\n background-color: #fff;\n}\n\n.carousel-caption {\n position: absolute;\n right: 15%;\n bottom: 20px;\n left: 15%;\n z-index: 10;\n padding-top: 20px;\n padding-bottom: 20px;\n color: #fff;\n text-align: center;\n}\n\n.align-baseline {\n vertical-align: baseline !important;\n}\n\n.align-top {\n vertical-align: top !important;\n}\n\n.align-middle {\n vertical-align: middle !important;\n}\n\n.align-bottom {\n vertical-align: bottom !important;\n}\n\n.align-text-bottom {\n vertical-align: text-bottom !important;\n}\n\n.align-text-top {\n vertical-align: text-top !important;\n}\n\n.bg-primary {\n background-color: #007bff !important;\n}\n\na.bg-primary:focus, a.bg-primary:hover {\n background-color: #0062cc !important;\n}\n\n.bg-secondary {\n background-color: #868e96 !important;\n}\n\na.bg-secondary:focus, a.bg-secondary:hover {\n background-color: #6c757d !important;\n}\n\n.bg-success {\n background-color: #28a745 !important;\n}\n\na.bg-success:focus, a.bg-success:hover {\n background-color: #1e7e34 !important;\n}\n\n.bg-info {\n background-color: #17a2b8 !important;\n}\n\na.bg-info:focus, a.bg-info:hover {\n background-color: #117a8b !important;\n}\n\n.bg-warning {\n background-color: #ffc107 !important;\n}\n\na.bg-warning:focus, a.bg-warning:hover {\n background-color: #d39e00 !important;\n}\n\n.bg-danger {\n background-color: #dc3545 !important;\n}\n\na.bg-danger:focus, a.bg-danger:hover {\n background-color: #bd2130 !important;\n}\n\n.bg-light {\n background-color: #f8f9fa !important;\n}\n\na.bg-light:focus, a.bg-light:hover {\n background-color: #dae0e5 !important;\n}\n\n.bg-dark {\n background-color: #343a40 !important;\n}\n\na.bg-dark:focus, a.bg-dark:hover {\n background-color: #1d2124 !important;\n}\n\n.bg-white {\n background-color: #fff !important;\n}\n\n.bg-transparent {\n background-color: transparent !important;\n}\n\n.border {\n border: 1px solid #e9ecef !important;\n}\n\n.border-0 {\n border: 0 !important;\n}\n\n.border-top-0 {\n border-top: 0 !important;\n}\n\n.border-right-0 {\n border-right: 0 !important;\n}\n\n.border-bottom-0 {\n border-bottom: 0 !important;\n}\n\n.border-left-0 {\n border-left: 0 !important;\n}\n\n.border-primary {\n border-color: #007bff !important;\n}\n\n.border-secondary {\n border-color: #868e96 !important;\n}\n\n.border-success {\n border-color: #28a745 !important;\n}\n\n.border-info {\n border-color: #17a2b8 !important;\n}\n\n.border-warning {\n border-color: #ffc107 !important;\n}\n\n.border-danger {\n border-color: #dc3545 !important;\n}\n\n.border-light {\n border-color: #f8f9fa !important;\n}\n\n.border-dark {\n border-color: #343a40 !important;\n}\n\n.border-white {\n border-color: #fff !important;\n}\n\n.rounded {\n border-radius: 0.25rem !important;\n}\n\n.rounded-top {\n border-top-left-radius: 0.25rem !important;\n border-top-right-radius: 0.25rem !important;\n}\n\n.rounded-right {\n border-top-right-radius: 0.25rem !important;\n border-bottom-right-radius: 0.25rem !important;\n}\n\n.rounded-bottom {\n border-bottom-right-radius: 0.25rem !important;\n border-bottom-left-radius: 0.25rem !important;\n}\n\n.rounded-left {\n border-top-left-radius: 0.25rem !important;\n border-bottom-left-radius: 0.25rem !important;\n}\n\n.rounded-circle {\n border-radius: 50%;\n}\n\n.rounded-0 {\n border-radius: 0;\n}\n\n.clearfix::after {\n display: block;\n clear: both;\n content: \"\";\n}\n\n.d-none {\n display: none !important;\n}\n\n.d-inline {\n display: inline !important;\n}\n\n.d-inline-block {\n display: inline-block !important;\n}\n\n.d-block {\n display: block !important;\n}\n\n.d-table {\n display: table !important;\n}\n\n.d-table-cell {\n display: table-cell !important;\n}\n\n.d-flex {\n display: -ms-flexbox !important;\n display: flex !important;\n}\n\n.d-inline-flex {\n display: -ms-inline-flexbox !important;\n display: inline-flex !important;\n}\n\n@media (min-width: 576px) {\n .d-sm-none {\n display: none !important;\n }\n .d-sm-inline {\n display: inline !important;\n }\n .d-sm-inline-block {\n display: inline-block !important;\n }\n .d-sm-block {\n display: block !important;\n }\n .d-sm-table {\n display: table !important;\n }\n .d-sm-table-cell {\n display: table-cell !important;\n }\n .d-sm-flex {\n display: -ms-flexbox !important;\n display: flex !important;\n }\n .d-sm-inline-flex {\n display: -ms-inline-flexbox !important;\n display: inline-flex !important;\n }\n}\n\n@media (min-width: 768px) {\n .d-md-none {\n display: none !important;\n }\n .d-md-inline {\n display: inline !important;\n }\n .d-md-inline-block {\n display: inline-block !important;\n }\n .d-md-block {\n display: block !important;\n }\n .d-md-table {\n display: table !important;\n }\n .d-md-table-cell {\n display: table-cell !important;\n }\n .d-md-flex {\n display: -ms-flexbox !important;\n display: flex !important;\n }\n .d-md-inline-flex {\n display: -ms-inline-flexbox !important;\n display: inline-flex !important;\n }\n}\n\n@media (min-width: 992px) {\n .d-lg-none {\n display: none !important;\n }\n .d-lg-inline {\n display: inline !important;\n }\n .d-lg-inline-block {\n display: inline-block !important;\n }\n .d-lg-block {\n display: block !important;\n }\n .d-lg-table {\n display: table !important;\n }\n .d-lg-table-cell {\n display: table-cell !important;\n }\n .d-lg-flex {\n display: -ms-flexbox !important;\n display: flex !important;\n }\n .d-lg-inline-flex {\n display: -ms-inline-flexbox !important;\n display: inline-flex !important;\n }\n}\n\n@media (min-width: 1200px) {\n .d-xl-none {\n display: none !important;\n }\n .d-xl-inline {\n display: inline !important;\n }\n .d-xl-inline-block {\n display: inline-block !important;\n }\n .d-xl-block {\n display: block !important;\n }\n .d-xl-table {\n display: table !important;\n }\n .d-xl-table-cell {\n display: table-cell !important;\n }\n .d-xl-flex {\n display: -ms-flexbox !important;\n display: flex !important;\n }\n .d-xl-inline-flex {\n display: -ms-inline-flexbox !important;\n display: inline-flex !important;\n }\n}\n\n.d-print-block {\n display: none !important;\n}\n\n@media print {\n .d-print-block {\n display: block !important;\n }\n}\n\n.d-print-inline {\n display: none !important;\n}\n\n@media print {\n .d-print-inline {\n display: inline !important;\n }\n}\n\n.d-print-inline-block {\n display: none !important;\n}\n\n@media print {\n .d-print-inline-block {\n display: inline-block !important;\n }\n}\n\n@media print {\n .d-print-none {\n display: none !important;\n }\n}\n\n.embed-responsive {\n position: relative;\n display: block;\n width: 100%;\n padding: 0;\n overflow: hidden;\n}\n\n.embed-responsive::before {\n display: block;\n content: \"\";\n}\n\n.embed-responsive .embed-responsive-item,\n.embed-responsive iframe,\n.embed-responsive embed,\n.embed-responsive object,\n.embed-responsive video {\n position: absolute;\n top: 0;\n bottom: 0;\n left: 0;\n width: 100%;\n height: 100%;\n border: 0;\n}\n\n.embed-responsive-21by9::before {\n padding-top: 42.857143%;\n}\n\n.embed-responsive-16by9::before {\n padding-top: 56.25%;\n}\n\n.embed-responsive-4by3::before {\n padding-top: 75%;\n}\n\n.embed-responsive-1by1::before {\n padding-top: 100%;\n}\n\n.flex-row {\n -ms-flex-direction: row !important;\n flex-direction: row !important;\n}\n\n.flex-column {\n -ms-flex-direction: column !important;\n flex-direction: column !important;\n}\n\n.flex-row-reverse {\n -ms-flex-direction: row-reverse !important;\n flex-direction: row-reverse !important;\n}\n\n.flex-column-reverse {\n -ms-flex-direction: column-reverse !important;\n flex-direction: column-reverse !important;\n}\n\n.flex-wrap {\n -ms-flex-wrap: wrap !important;\n flex-wrap: wrap !important;\n}\n\n.flex-nowrap {\n -ms-flex-wrap: nowrap !important;\n flex-wrap: nowrap !important;\n}\n\n.flex-wrap-reverse {\n -ms-flex-wrap: wrap-reverse !important;\n flex-wrap: wrap-reverse !important;\n}\n\n.justify-content-start {\n -ms-flex-pack: start !important;\n justify-content: flex-start !important;\n}\n\n.justify-content-end {\n -ms-flex-pack: end !important;\n justify-content: flex-end !important;\n}\n\n.justify-content-center {\n -ms-flex-pack: center !important;\n justify-content: center !important;\n}\n\n.justify-content-between {\n -ms-flex-pack: justify !important;\n justify-content: space-between !important;\n}\n\n.justify-content-around {\n -ms-flex-pack: distribute !important;\n justify-content: space-around !important;\n}\n\n.align-items-start {\n -ms-flex-align: start !important;\n align-items: flex-start !important;\n}\n\n.align-items-end {\n -ms-flex-align: end !important;\n align-items: flex-end !important;\n}\n\n.align-items-center {\n -ms-flex-align: center !important;\n align-items: center !important;\n}\n\n.align-items-baseline {\n -ms-flex-align: baseline !important;\n align-items: baseline !important;\n}\n\n.align-items-stretch {\n -ms-flex-align: stretch !important;\n align-items: stretch !important;\n}\n\n.align-content-start {\n -ms-flex-line-pack: start !important;\n align-content: flex-start !important;\n}\n\n.align-content-end {\n -ms-flex-line-pack: end !important;\n align-content: flex-end !important;\n}\n\n.align-content-center {\n -ms-flex-line-pack: center !important;\n align-content: center !important;\n}\n\n.align-content-between {\n -ms-flex-line-pack: justify !important;\n align-content: space-between !important;\n}\n\n.align-content-around {\n -ms-flex-line-pack: distribute !important;\n align-content: space-around !important;\n}\n\n.align-content-stretch {\n -ms-flex-line-pack: stretch !important;\n align-content: stretch !important;\n}\n\n.align-self-auto {\n -ms-flex-item-align: auto !important;\n align-self: auto !important;\n}\n\n.align-self-start {\n -ms-flex-item-align: start !important;\n align-self: flex-start !important;\n}\n\n.align-self-end {\n -ms-flex-item-align: end !important;\n align-self: flex-end !important;\n}\n\n.align-self-center {\n -ms-flex-item-align: center !important;\n align-self: center !important;\n}\n\n.align-self-baseline {\n -ms-flex-item-align: baseline !important;\n align-self: baseline !important;\n}\n\n.align-self-stretch {\n -ms-flex-item-align: stretch !important;\n align-self: stretch !important;\n}\n\n@media (min-width: 576px) {\n .flex-sm-row {\n -ms-flex-direction: row !important;\n flex-direction: row !important;\n }\n .flex-sm-column {\n -ms-flex-direction: column !important;\n flex-direction: column !important;\n }\n .flex-sm-row-reverse {\n -ms-flex-direction: row-reverse !important;\n flex-direction: row-reverse !important;\n }\n .flex-sm-column-reverse {\n -ms-flex-direction: column-reverse !important;\n flex-direction: column-reverse !important;\n }\n .flex-sm-wrap {\n -ms-flex-wrap: wrap !important;\n flex-wrap: wrap !important;\n }\n .flex-sm-nowrap {\n -ms-flex-wrap: nowrap !important;\n flex-wrap: nowrap !important;\n }\n .flex-sm-wrap-reverse {\n -ms-flex-wrap: wrap-reverse !important;\n flex-wrap: wrap-reverse !important;\n }\n .justify-content-sm-start {\n -ms-flex-pack: start !important;\n justify-content: flex-start !important;\n }\n .justify-content-sm-end {\n -ms-flex-pack: end !important;\n justify-content: flex-end !important;\n }\n .justify-content-sm-center {\n -ms-flex-pack: center !important;\n justify-content: center !important;\n }\n .justify-content-sm-between {\n -ms-flex-pack: justify !important;\n justify-content: space-between !important;\n }\n .justify-content-sm-around {\n -ms-flex-pack: distribute !important;\n justify-content: space-around !important;\n }\n .align-items-sm-start {\n -ms-flex-align: start !important;\n align-items: flex-start !important;\n }\n .align-items-sm-end {\n -ms-flex-align: end !important;\n align-items: flex-end !important;\n }\n .align-items-sm-center {\n -ms-flex-align: center !important;\n align-items: center !important;\n }\n .align-items-sm-baseline {\n -ms-flex-align: baseline !important;\n align-items: baseline !important;\n }\n .align-items-sm-stretch {\n -ms-flex-align: stretch !important;\n align-items: stretch !important;\n }\n .align-content-sm-start {\n -ms-flex-line-pack: start !important;\n align-content: flex-start !important;\n }\n .align-content-sm-end {\n -ms-flex-line-pack: end !important;\n align-content: flex-end !important;\n }\n .align-content-sm-center {\n -ms-flex-line-pack: center !important;\n align-content: center !important;\n }\n .align-content-sm-between {\n -ms-flex-line-pack: justify !important;\n align-content: space-between !important;\n }\n .align-content-sm-around {\n -ms-flex-line-pack: distribute !important;\n align-content: space-around !important;\n }\n .align-content-sm-stretch {\n -ms-flex-line-pack: stretch !important;\n align-content: stretch !important;\n }\n .align-self-sm-auto {\n -ms-flex-item-align: auto !important;\n align-self: auto !important;\n }\n .align-self-sm-start {\n -ms-flex-item-align: start !important;\n align-self: flex-start !important;\n }\n .align-self-sm-end {\n -ms-flex-item-align: end !important;\n align-self: flex-end !important;\n }\n .align-self-sm-center {\n -ms-flex-item-align: center !important;\n align-self: center !important;\n }\n .align-self-sm-baseline {\n -ms-flex-item-align: baseline !important;\n align-self: baseline !important;\n }\n .align-self-sm-stretch {\n -ms-flex-item-align: stretch !important;\n align-self: stretch !important;\n }\n}\n\n@media (min-width: 768px) {\n .flex-md-row {\n -ms-flex-direction: row !important;\n flex-direction: row !important;\n }\n .flex-md-column {\n -ms-flex-direction: column !important;\n flex-direction: column !important;\n }\n .flex-md-row-reverse {\n -ms-flex-direction: row-reverse !important;\n flex-direction: row-reverse !important;\n }\n .flex-md-column-reverse {\n -ms-flex-direction: column-reverse !important;\n flex-direction: column-reverse !important;\n }\n .flex-md-wrap {\n -ms-flex-wrap: wrap !important;\n flex-wrap: wrap !important;\n }\n .flex-md-nowrap {\n -ms-flex-wrap: nowrap !important;\n flex-wrap: nowrap !important;\n }\n .flex-md-wrap-reverse {\n -ms-flex-wrap: wrap-reverse !important;\n flex-wrap: wrap-reverse !important;\n }\n .justify-content-md-start {\n -ms-flex-pack: start !important;\n justify-content: flex-start !important;\n }\n .justify-content-md-end {\n -ms-flex-pack: end !important;\n justify-content: flex-end !important;\n }\n .justify-content-md-center {\n -ms-flex-pack: center !important;\n justify-content: center !important;\n }\n .justify-content-md-between {\n -ms-flex-pack: justify !important;\n justify-content: space-between !important;\n }\n .justify-content-md-around {\n -ms-flex-pack: distribute !important;\n justify-content: space-around !important;\n }\n .align-items-md-start {\n -ms-flex-align: start !important;\n align-items: flex-start !important;\n }\n .align-items-md-end {\n -ms-flex-align: end !important;\n align-items: flex-end !important;\n }\n .align-items-md-center {\n -ms-flex-align: center !important;\n align-items: center !important;\n }\n .align-items-md-baseline {\n -ms-flex-align: baseline !important;\n align-items: baseline !important;\n }\n .align-items-md-stretch {\n -ms-flex-align: stretch !important;\n align-items: stretch !important;\n }\n .align-content-md-start {\n -ms-flex-line-pack: start !important;\n align-content: flex-start !important;\n }\n .align-content-md-end {\n -ms-flex-line-pack: end !important;\n align-content: flex-end !important;\n }\n .align-content-md-center {\n -ms-flex-line-pack: center !important;\n align-content: center !important;\n }\n .align-content-md-between {\n -ms-flex-line-pack: justify !important;\n align-content: space-between !important;\n }\n .align-content-md-around {\n -ms-flex-line-pack: distribute !important;\n align-content: space-around !important;\n }\n .align-content-md-stretch {\n -ms-flex-line-pack: stretch !important;\n align-content: stretch !important;\n }\n .align-self-md-auto {\n -ms-flex-item-align: auto !important;\n align-self: auto !important;\n }\n .align-self-md-start {\n -ms-flex-item-align: start !important;\n align-self: flex-start !important;\n }\n .align-self-md-end {\n -ms-flex-item-align: end !important;\n align-self: flex-end !important;\n }\n .align-self-md-center {\n -ms-flex-item-align: center !important;\n align-self: center !important;\n }\n .align-self-md-baseline {\n -ms-flex-item-align: baseline !important;\n align-self: baseline !important;\n }\n .align-self-md-stretch {\n -ms-flex-item-align: stretch !important;\n align-self: stretch !important;\n }\n}\n\n@media (min-width: 992px) {\n .flex-lg-row {\n -ms-flex-direction: row !important;\n flex-direction: row !important;\n }\n .flex-lg-column {\n -ms-flex-direction: column !important;\n flex-direction: column !important;\n }\n .flex-lg-row-reverse {\n -ms-flex-direction: row-reverse !important;\n flex-direction: row-reverse !important;\n }\n .flex-lg-column-reverse {\n -ms-flex-direction: column-reverse !important;\n flex-direction: column-reverse !important;\n }\n .flex-lg-wrap {\n -ms-flex-wrap: wrap !important;\n flex-wrap: wrap !important;\n }\n .flex-lg-nowrap {\n -ms-flex-wrap: nowrap !important;\n flex-wrap: nowrap !important;\n }\n .flex-lg-wrap-reverse {\n -ms-flex-wrap: wrap-reverse !important;\n flex-wrap: wrap-reverse !important;\n }\n .justify-content-lg-start {\n -ms-flex-pack: start !important;\n justify-content: flex-start !important;\n }\n .justify-content-lg-end {\n -ms-flex-pack: end !important;\n justify-content: flex-end !important;\n }\n .justify-content-lg-center {\n -ms-flex-pack: center !important;\n justify-content: center !important;\n }\n .justify-content-lg-between {\n -ms-flex-pack: justify !important;\n justify-content: space-between !important;\n }\n .justify-content-lg-around {\n -ms-flex-pack: distribute !important;\n justify-content: space-around !important;\n }\n .align-items-lg-start {\n -ms-flex-align: start !important;\n align-items: flex-start !important;\n }\n .align-items-lg-end {\n -ms-flex-align: end !important;\n align-items: flex-end !important;\n }\n .align-items-lg-center {\n -ms-flex-align: center !important;\n align-items: center !important;\n }\n .align-items-lg-baseline {\n -ms-flex-align: baseline !important;\n align-items: baseline !important;\n }\n .align-items-lg-stretch {\n -ms-flex-align: stretch !important;\n align-items: stretch !important;\n }\n .align-content-lg-start {\n -ms-flex-line-pack: start !important;\n align-content: flex-start !important;\n }\n .align-content-lg-end {\n -ms-flex-line-pack: end !important;\n align-content: flex-end !important;\n }\n .align-content-lg-center {\n -ms-flex-line-pack: center !important;\n align-content: center !important;\n }\n .align-content-lg-between {\n -ms-flex-line-pack: justify !important;\n align-content: space-between !important;\n }\n .align-content-lg-around {\n -ms-flex-line-pack: distribute !important;\n align-content: space-around !important;\n }\n .align-content-lg-stretch {\n -ms-flex-line-pack: stretch !important;\n align-content: stretch !important;\n }\n .align-self-lg-auto {\n -ms-flex-item-align: auto !important;\n align-self: auto !important;\n }\n .align-self-lg-start {\n -ms-flex-item-align: start !important;\n align-self: flex-start !important;\n }\n .align-self-lg-end {\n -ms-flex-item-align: end !important;\n align-self: flex-end !important;\n }\n .align-self-lg-center {\n -ms-flex-item-align: center !important;\n align-self: center !important;\n }\n .align-self-lg-baseline {\n -ms-flex-item-align: baseline !important;\n align-self: baseline !important;\n }\n .align-self-lg-stretch {\n -ms-flex-item-align: stretch !important;\n align-self: stretch !important;\n }\n}\n\n@media (min-width: 1200px) {\n .flex-xl-row {\n -ms-flex-direction: row !important;\n flex-direction: row !important;\n }\n .flex-xl-column {\n -ms-flex-direction: column !important;\n flex-direction: column !important;\n }\n .flex-xl-row-reverse {\n -ms-flex-direction: row-reverse !important;\n flex-direction: row-reverse !important;\n }\n .flex-xl-column-reverse {\n -ms-flex-direction: column-reverse !important;\n flex-direction: column-reverse !important;\n }\n .flex-xl-wrap {\n -ms-flex-wrap: wrap !important;\n flex-wrap: wrap !important;\n }\n .flex-xl-nowrap {\n -ms-flex-wrap: nowrap !important;\n flex-wrap: nowrap !important;\n }\n .flex-xl-wrap-reverse {\n -ms-flex-wrap: wrap-reverse !important;\n flex-wrap: wrap-reverse !important;\n }\n .justify-content-xl-start {\n -ms-flex-pack: start !important;\n justify-content: flex-start !important;\n }\n .justify-content-xl-end {\n -ms-flex-pack: end !important;\n justify-content: flex-end !important;\n }\n .justify-content-xl-center {\n -ms-flex-pack: center !important;\n justify-content: center !important;\n }\n .justify-content-xl-between {\n -ms-flex-pack: justify !important;\n justify-content: space-between !important;\n }\n .justify-content-xl-around {\n -ms-flex-pack: distribute !important;\n justify-content: space-around !important;\n }\n .align-items-xl-start {\n -ms-flex-align: start !important;\n align-items: flex-start !important;\n }\n .align-items-xl-end {\n -ms-flex-align: end !important;\n align-items: flex-end !important;\n }\n .align-items-xl-center {\n -ms-flex-align: center !important;\n align-items: center !important;\n }\n .align-items-xl-baseline {\n -ms-flex-align: baseline !important;\n align-items: baseline !important;\n }\n .align-items-xl-stretch {\n -ms-flex-align: stretch !important;\n align-items: stretch !important;\n }\n .align-content-xl-start {\n -ms-flex-line-pack: start !important;\n align-content: flex-start !important;\n }\n .align-content-xl-end {\n -ms-flex-line-pack: end !important;\n align-content: flex-end !important;\n }\n .align-content-xl-center {\n -ms-flex-line-pack: center !important;\n align-content: center !important;\n }\n .align-content-xl-between {\n -ms-flex-line-pack: justify !important;\n align-content: space-between !important;\n }\n .align-content-xl-around {\n -ms-flex-line-pack: distribute !important;\n align-content: space-around !important;\n }\n .align-content-xl-stretch {\n -ms-flex-line-pack: stretch !important;\n align-content: stretch !important;\n }\n .align-self-xl-auto {\n -ms-flex-item-align: auto !important;\n align-self: auto !important;\n }\n .align-self-xl-start {\n -ms-flex-item-align: start !important;\n align-self: flex-start !important;\n }\n .align-self-xl-end {\n -ms-flex-item-align: end !important;\n align-self: flex-end !important;\n }\n .align-self-xl-center {\n -ms-flex-item-align: center !important;\n align-self: center !important;\n }\n .align-self-xl-baseline {\n -ms-flex-item-align: baseline !important;\n align-self: baseline !important;\n }\n .align-self-xl-stretch {\n -ms-flex-item-align: stretch !important;\n align-self: stretch !important;\n }\n}\n\n.float-left {\n float: left !important;\n}\n\n.float-right {\n float: right !important;\n}\n\n.float-none {\n float: none !important;\n}\n\n@media (min-width: 576px) {\n .float-sm-left {\n float: left !important;\n }\n .float-sm-right {\n float: right !important;\n }\n .float-sm-none {\n float: none !important;\n }\n}\n\n@media (min-width: 768px) {\n .float-md-left {\n float: left !important;\n }\n .float-md-right {\n float: right !important;\n }\n .float-md-none {\n float: none !important;\n }\n}\n\n@media (min-width: 992px) {\n .float-lg-left {\n float: left !important;\n }\n .float-lg-right {\n float: right !important;\n }\n .float-lg-none {\n float: none !important;\n }\n}\n\n@media (min-width: 1200px) {\n .float-xl-left {\n float: left !important;\n }\n .float-xl-right {\n float: right !important;\n }\n .float-xl-none {\n float: none !important;\n }\n}\n\n.fixed-top {\n position: fixed;\n top: 0;\n right: 0;\n left: 0;\n z-index: 1030;\n}\n\n.fixed-bottom {\n position: fixed;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: 1030;\n}\n\n@supports ((position: -webkit-sticky) or (position: sticky)) {\n .sticky-top {\n position: -webkit-sticky;\n position: sticky;\n top: 0;\n z-index: 1020;\n }\n}\n\n.sr-only {\n position: absolute;\n width: 1px;\n height: 1px;\n padding: 0;\n overflow: hidden;\n clip: rect(0, 0, 0, 0);\n white-space: nowrap;\n -webkit-clip-path: inset(50%);\n clip-path: inset(50%);\n border: 0;\n}\n\n.sr-only-focusable:active, .sr-only-focusable:focus {\n position: static;\n width: auto;\n height: auto;\n overflow: visible;\n clip: auto;\n white-space: normal;\n -webkit-clip-path: none;\n clip-path: none;\n}\n\n.w-25 {\n width: 25% !important;\n}\n\n.w-50 {\n width: 50% !important;\n}\n\n.w-75 {\n width: 75% !important;\n}\n\n.w-100 {\n width: 100% !important;\n}\n\n.h-25 {\n height: 25% !important;\n}\n\n.h-50 {\n height: 50% !important;\n}\n\n.h-75 {\n height: 75% !important;\n}\n\n.h-100 {\n height: 100% !important;\n}\n\n.mw-100 {\n max-width: 100% !important;\n}\n\n.mh-100 {\n max-height: 100% !important;\n}\n\n.m-0 {\n margin: 0 !important;\n}\n\n.mt-0 {\n margin-top: 0 !important;\n}\n\n.mr-0 {\n margin-right: 0 !important;\n}\n\n.mb-0 {\n margin-bottom: 0 !important;\n}\n\n.ml-0 {\n margin-left: 0 !important;\n}\n\n.mx-0 {\n margin-right: 0 !important;\n margin-left: 0 !important;\n}\n\n.my-0 {\n margin-top: 0 !important;\n margin-bottom: 0 !important;\n}\n\n.m-1 {\n margin: 0.25rem !important;\n}\n\n.mt-1 {\n margin-top: 0.25rem !important;\n}\n\n.mr-1 {\n margin-right: 0.25rem !important;\n}\n\n.mb-1 {\n margin-bottom: 0.25rem !important;\n}\n\n.ml-1 {\n margin-left: 0.25rem !important;\n}\n\n.mx-1 {\n margin-right: 0.25rem !important;\n margin-left: 0.25rem !important;\n}\n\n.my-1 {\n margin-top: 0.25rem !important;\n margin-bottom: 0.25rem !important;\n}\n\n.m-2 {\n margin: 0.5rem !important;\n}\n\n.mt-2 {\n margin-top: 0.5rem !important;\n}\n\n.mr-2 {\n margin-right: 0.5rem !important;\n}\n\n.mb-2 {\n margin-bottom: 0.5rem !important;\n}\n\n.ml-2 {\n margin-left: 0.5rem !important;\n}\n\n.mx-2 {\n margin-right: 0.5rem !important;\n margin-left: 0.5rem !important;\n}\n\n.my-2 {\n margin-top: 0.5rem !important;\n margin-bottom: 0.5rem !important;\n}\n\n.m-3 {\n margin: 1rem !important;\n}\n\n.mt-3 {\n margin-top: 1rem !important;\n}\n\n.mr-3 {\n margin-right: 1rem !important;\n}\n\n.mb-3 {\n margin-bottom: 1rem !important;\n}\n\n.ml-3 {\n margin-left: 1rem !important;\n}\n\n.mx-3 {\n margin-right: 1rem !important;\n margin-left: 1rem !important;\n}\n\n.my-3 {\n margin-top: 1rem !important;\n margin-bottom: 1rem !important;\n}\n\n.m-4 {\n margin: 1.5rem !important;\n}\n\n.mt-4 {\n margin-top: 1.5rem !important;\n}\n\n.mr-4 {\n margin-right: 1.5rem !important;\n}\n\n.mb-4 {\n margin-bottom: 1.5rem !important;\n}\n\n.ml-4 {\n margin-left: 1.5rem !important;\n}\n\n.mx-4 {\n margin-right: 1.5rem !important;\n margin-left: 1.5rem !important;\n}\n\n.my-4 {\n margin-top: 1.5rem !important;\n margin-bottom: 1.5rem !important;\n}\n\n.m-5 {\n margin: 3rem !important;\n}\n\n.mt-5 {\n margin-top: 3rem !important;\n}\n\n.mr-5 {\n margin-right: 3rem !important;\n}\n\n.mb-5 {\n margin-bottom: 3rem !important;\n}\n\n.ml-5 {\n margin-left: 3rem !important;\n}\n\n.mx-5 {\n margin-right: 3rem !important;\n margin-left: 3rem !important;\n}\n\n.my-5 {\n margin-top: 3rem !important;\n margin-bottom: 3rem !important;\n}\n\n.p-0 {\n padding: 0 !important;\n}\n\n.pt-0 {\n padding-top: 0 !important;\n}\n\n.pr-0 {\n padding-right: 0 !important;\n}\n\n.pb-0 {\n padding-bottom: 0 !important;\n}\n\n.pl-0 {\n padding-left: 0 !important;\n}\n\n.px-0 {\n padding-right: 0 !important;\n padding-left: 0 !important;\n}\n\n.py-0 {\n padding-top: 0 !important;\n padding-bottom: 0 !important;\n}\n\n.p-1 {\n padding: 0.25rem !important;\n}\n\n.pt-1 {\n padding-top: 0.25rem !important;\n}\n\n.pr-1 {\n padding-right: 0.25rem !important;\n}\n\n.pb-1 {\n padding-bottom: 0.25rem !important;\n}\n\n.pl-1 {\n padding-left: 0.25rem !important;\n}\n\n.px-1 {\n padding-right: 0.25rem !important;\n padding-left: 0.25rem !important;\n}\n\n.py-1 {\n padding-top: 0.25rem !important;\n padding-bottom: 0.25rem !important;\n}\n\n.p-2 {\n padding: 0.5rem !important;\n}\n\n.pt-2 {\n padding-top: 0.5rem !important;\n}\n\n.pr-2 {\n padding-right: 0.5rem !important;\n}\n\n.pb-2 {\n padding-bottom: 0.5rem !important;\n}\n\n.pl-2 {\n padding-left: 0.5rem !important;\n}\n\n.px-2 {\n padding-right: 0.5rem !important;\n padding-left: 0.5rem !important;\n}\n\n.py-2 {\n padding-top: 0.5rem !important;\n padding-bottom: 0.5rem !important;\n}\n\n.p-3 {\n padding: 1rem !important;\n}\n\n.pt-3 {\n padding-top: 1rem !important;\n}\n\n.pr-3 {\n padding-right: 1rem !important;\n}\n\n.pb-3 {\n padding-bottom: 1rem !important;\n}\n\n.pl-3 {\n padding-left: 1rem !important;\n}\n\n.px-3 {\n padding-right: 1rem !important;\n padding-left: 1rem !important;\n}\n\n.py-3 {\n padding-top: 1rem !important;\n padding-bottom: 1rem !important;\n}\n\n.p-4 {\n padding: 1.5rem !important;\n}\n\n.pt-4 {\n padding-top: 1.5rem !important;\n}\n\n.pr-4 {\n padding-right: 1.5rem !important;\n}\n\n.pb-4 {\n padding-bottom: 1.5rem !important;\n}\n\n.pl-4 {\n padding-left: 1.5rem !important;\n}\n\n.px-4 {\n padding-right: 1.5rem !important;\n padding-left: 1.5rem !important;\n}\n\n.py-4 {\n padding-top: 1.5rem !important;\n padding-bottom: 1.5rem !important;\n}\n\n.p-5 {\n padding: 3rem !important;\n}\n\n.pt-5 {\n padding-top: 3rem !important;\n}\n\n.pr-5 {\n padding-right: 3rem !important;\n}\n\n.pb-5 {\n padding-bottom: 3rem !important;\n}\n\n.pl-5 {\n padding-left: 3rem !important;\n}\n\n.px-5 {\n padding-right: 3rem !important;\n padding-left: 3rem !important;\n}\n\n.py-5 {\n padding-top: 3rem !important;\n padding-bottom: 3rem !important;\n}\n\n.m-auto {\n margin: auto !important;\n}\n\n.mt-auto {\n margin-top: auto !important;\n}\n\n.mr-auto {\n margin-right: auto !important;\n}\n\n.mb-auto {\n margin-bottom: auto !important;\n}\n\n.ml-auto {\n margin-left: auto !important;\n}\n\n.mx-auto {\n margin-right: auto !important;\n margin-left: auto !important;\n}\n\n.my-auto {\n margin-top: auto !important;\n margin-bottom: auto !important;\n}\n\n@media (min-width: 576px) {\n .m-sm-0 {\n margin: 0 !important;\n }\n .mt-sm-0 {\n margin-top: 0 !important;\n }\n .mr-sm-0 {\n margin-right: 0 !important;\n }\n .mb-sm-0 {\n margin-bottom: 0 !important;\n }\n .ml-sm-0 {\n margin-left: 0 !important;\n }\n .mx-sm-0 {\n margin-right: 0 !important;\n margin-left: 0 !important;\n }\n .my-sm-0 {\n margin-top: 0 !important;\n margin-bottom: 0 !important;\n }\n .m-sm-1 {\n margin: 0.25rem !important;\n }\n .mt-sm-1 {\n margin-top: 0.25rem !important;\n }\n .mr-sm-1 {\n margin-right: 0.25rem !important;\n }\n .mb-sm-1 {\n margin-bottom: 0.25rem !important;\n }\n .ml-sm-1 {\n margin-left: 0.25rem !important;\n }\n .mx-sm-1 {\n margin-right: 0.25rem !important;\n margin-left: 0.25rem !important;\n }\n .my-sm-1 {\n margin-top: 0.25rem !important;\n margin-bottom: 0.25rem !important;\n }\n .m-sm-2 {\n margin: 0.5rem !important;\n }\n .mt-sm-2 {\n margin-top: 0.5rem !important;\n }\n .mr-sm-2 {\n margin-right: 0.5rem !important;\n }\n .mb-sm-2 {\n margin-bottom: 0.5rem !important;\n }\n .ml-sm-2 {\n margin-left: 0.5rem !important;\n }\n .mx-sm-2 {\n margin-right: 0.5rem !important;\n margin-left: 0.5rem !important;\n }\n .my-sm-2 {\n margin-top: 0.5rem !important;\n margin-bottom: 0.5rem !important;\n }\n .m-sm-3 {\n margin: 1rem !important;\n }\n .mt-sm-3 {\n margin-top: 1rem !important;\n }\n .mr-sm-3 {\n margin-right: 1rem !important;\n }\n .mb-sm-3 {\n margin-bottom: 1rem !important;\n }\n .ml-sm-3 {\n margin-left: 1rem !important;\n }\n .mx-sm-3 {\n margin-right: 1rem !important;\n margin-left: 1rem !important;\n }\n .my-sm-3 {\n margin-top: 1rem !important;\n margin-bottom: 1rem !important;\n }\n .m-sm-4 {\n margin: 1.5rem !important;\n }\n .mt-sm-4 {\n margin-top: 1.5rem !important;\n }\n .mr-sm-4 {\n margin-right: 1.5rem !important;\n }\n .mb-sm-4 {\n margin-bottom: 1.5rem !important;\n }\n .ml-sm-4 {\n margin-left: 1.5rem !important;\n }\n .mx-sm-4 {\n margin-right: 1.5rem !important;\n margin-left: 1.5rem !important;\n }\n .my-sm-4 {\n margin-top: 1.5rem !important;\n margin-bottom: 1.5rem !important;\n }\n .m-sm-5 {\n margin: 3rem !important;\n }\n .mt-sm-5 {\n margin-top: 3rem !important;\n }\n .mr-sm-5 {\n margin-right: 3rem !important;\n }\n .mb-sm-5 {\n margin-bottom: 3rem !important;\n }\n .ml-sm-5 {\n margin-left: 3rem !important;\n }\n .mx-sm-5 {\n margin-right: 3rem !important;\n margin-left: 3rem !important;\n }\n .my-sm-5 {\n margin-top: 3rem !important;\n margin-bottom: 3rem !important;\n }\n .p-sm-0 {\n padding: 0 !important;\n }\n .pt-sm-0 {\n padding-top: 0 !important;\n }\n .pr-sm-0 {\n padding-right: 0 !important;\n }\n .pb-sm-0 {\n padding-bottom: 0 !important;\n }\n .pl-sm-0 {\n padding-left: 0 !important;\n }\n .px-sm-0 {\n padding-right: 0 !important;\n padding-left: 0 !important;\n }\n .py-sm-0 {\n padding-top: 0 !important;\n padding-bottom: 0 !important;\n }\n .p-sm-1 {\n padding: 0.25rem !important;\n }\n .pt-sm-1 {\n padding-top: 0.25rem !important;\n }\n .pr-sm-1 {\n padding-right: 0.25rem !important;\n }\n .pb-sm-1 {\n padding-bottom: 0.25rem !important;\n }\n .pl-sm-1 {\n padding-left: 0.25rem !important;\n }\n .px-sm-1 {\n padding-right: 0.25rem !important;\n padding-left: 0.25rem !important;\n }\n .py-sm-1 {\n padding-top: 0.25rem !important;\n padding-bottom: 0.25rem !important;\n }\n .p-sm-2 {\n padding: 0.5rem !important;\n }\n .pt-sm-2 {\n padding-top: 0.5rem !important;\n }\n .pr-sm-2 {\n padding-right: 0.5rem !important;\n }\n .pb-sm-2 {\n padding-bottom: 0.5rem !important;\n }\n .pl-sm-2 {\n padding-left: 0.5rem !important;\n }\n .px-sm-2 {\n padding-right: 0.5rem !important;\n padding-left: 0.5rem !important;\n }\n .py-sm-2 {\n padding-top: 0.5rem !important;\n padding-bottom: 0.5rem !important;\n }\n .p-sm-3 {\n padding: 1rem !important;\n }\n .pt-sm-3 {\n padding-top: 1rem !important;\n }\n .pr-sm-3 {\n padding-right: 1rem !important;\n }\n .pb-sm-3 {\n padding-bottom: 1rem !important;\n }\n .pl-sm-3 {\n padding-left: 1rem !important;\n }\n .px-sm-3 {\n padding-right: 1rem !important;\n padding-left: 1rem !important;\n }\n .py-sm-3 {\n padding-top: 1rem !important;\n padding-bottom: 1rem !important;\n }\n .p-sm-4 {\n padding: 1.5rem !important;\n }\n .pt-sm-4 {\n padding-top: 1.5rem !important;\n }\n .pr-sm-4 {\n padding-right: 1.5rem !important;\n }\n .pb-sm-4 {\n padding-bottom: 1.5rem !important;\n }\n .pl-sm-4 {\n padding-left: 1.5rem !important;\n }\n .px-sm-4 {\n padding-right: 1.5rem !important;\n padding-left: 1.5rem !important;\n }\n .py-sm-4 {\n padding-top: 1.5rem !important;\n padding-bottom: 1.5rem !important;\n }\n .p-sm-5 {\n padding: 3rem !important;\n }\n .pt-sm-5 {\n padding-top: 3rem !important;\n }\n .pr-sm-5 {\n padding-right: 3rem !important;\n }\n .pb-sm-5 {\n padding-bottom: 3rem !important;\n }\n .pl-sm-5 {\n padding-left: 3rem !important;\n }\n .px-sm-5 {\n padding-right: 3rem !important;\n padding-left: 3rem !important;\n }\n .py-sm-5 {\n padding-top: 3rem !important;\n padding-bottom: 3rem !important;\n }\n .m-sm-auto {\n margin: auto !important;\n }\n .mt-sm-auto {\n margin-top: auto !important;\n }\n .mr-sm-auto {\n margin-right: auto !important;\n }\n .mb-sm-auto {\n margin-bottom: auto !important;\n }\n .ml-sm-auto {\n margin-left: auto !important;\n }\n .mx-sm-auto {\n margin-right: auto !important;\n margin-left: auto !important;\n }\n .my-sm-auto {\n margin-top: auto !important;\n margin-bottom: auto !important;\n }\n}\n\n@media (min-width: 768px) {\n .m-md-0 {\n margin: 0 !important;\n }\n .mt-md-0 {\n margin-top: 0 !important;\n }\n .mr-md-0 {\n margin-right: 0 !important;\n }\n .mb-md-0 {\n margin-bottom: 0 !important;\n }\n .ml-md-0 {\n margin-left: 0 !important;\n }\n .mx-md-0 {\n margin-right: 0 !important;\n margin-left: 0 !important;\n }\n .my-md-0 {\n margin-top: 0 !important;\n margin-bottom: 0 !important;\n }\n .m-md-1 {\n margin: 0.25rem !important;\n }\n .mt-md-1 {\n margin-top: 0.25rem !important;\n }\n .mr-md-1 {\n margin-right: 0.25rem !important;\n }\n .mb-md-1 {\n margin-bottom: 0.25rem !important;\n }\n .ml-md-1 {\n margin-left: 0.25rem !important;\n }\n .mx-md-1 {\n margin-right: 0.25rem !important;\n margin-left: 0.25rem !important;\n }\n .my-md-1 {\n margin-top: 0.25rem !important;\n margin-bottom: 0.25rem !important;\n }\n .m-md-2 {\n margin: 0.5rem !important;\n }\n .mt-md-2 {\n margin-top: 0.5rem !important;\n }\n .mr-md-2 {\n margin-right: 0.5rem !important;\n }\n .mb-md-2 {\n margin-bottom: 0.5rem !important;\n }\n .ml-md-2 {\n margin-left: 0.5rem !important;\n }\n .mx-md-2 {\n margin-right: 0.5rem !important;\n margin-left: 0.5rem !important;\n }\n .my-md-2 {\n margin-top: 0.5rem !important;\n margin-bottom: 0.5rem !important;\n }\n .m-md-3 {\n margin: 1rem !important;\n }\n .mt-md-3 {\n margin-top: 1rem !important;\n }\n .mr-md-3 {\n margin-right: 1rem !important;\n }\n .mb-md-3 {\n margin-bottom: 1rem !important;\n }\n .ml-md-3 {\n margin-left: 1rem !important;\n }\n .mx-md-3 {\n margin-right: 1rem !important;\n margin-left: 1rem !important;\n }\n .my-md-3 {\n margin-top: 1rem !important;\n margin-bottom: 1rem !important;\n }\n .m-md-4 {\n margin: 1.5rem !important;\n }\n .mt-md-4 {\n margin-top: 1.5rem !important;\n }\n .mr-md-4 {\n margin-right: 1.5rem !important;\n }\n .mb-md-4 {\n margin-bottom: 1.5rem !important;\n }\n .ml-md-4 {\n margin-left: 1.5rem !important;\n }\n .mx-md-4 {\n margin-right: 1.5rem !important;\n margin-left: 1.5rem !important;\n }\n .my-md-4 {\n margin-top: 1.5rem !important;\n margin-bottom: 1.5rem !important;\n }\n .m-md-5 {\n margin: 3rem !important;\n }\n .mt-md-5 {\n margin-top: 3rem !important;\n }\n .mr-md-5 {\n margin-right: 3rem !important;\n }\n .mb-md-5 {\n margin-bottom: 3rem !important;\n }\n .ml-md-5 {\n margin-left: 3rem !important;\n }\n .mx-md-5 {\n margin-right: 3rem !important;\n margin-left: 3rem !important;\n }\n .my-md-5 {\n margin-top: 3rem !important;\n margin-bottom: 3rem !important;\n }\n .p-md-0 {\n padding: 0 !important;\n }\n .pt-md-0 {\n padding-top: 0 !important;\n }\n .pr-md-0 {\n padding-right: 0 !important;\n }\n .pb-md-0 {\n padding-bottom: 0 !important;\n }\n .pl-md-0 {\n padding-left: 0 !important;\n }\n .px-md-0 {\n padding-right: 0 !important;\n padding-left: 0 !important;\n }\n .py-md-0 {\n padding-top: 0 !important;\n padding-bottom: 0 !important;\n }\n .p-md-1 {\n padding: 0.25rem !important;\n }\n .pt-md-1 {\n padding-top: 0.25rem !important;\n }\n .pr-md-1 {\n padding-right: 0.25rem !important;\n }\n .pb-md-1 {\n padding-bottom: 0.25rem !important;\n }\n .pl-md-1 {\n padding-left: 0.25rem !important;\n }\n .px-md-1 {\n padding-right: 0.25rem !important;\n padding-left: 0.25rem !important;\n }\n .py-md-1 {\n padding-top: 0.25rem !important;\n padding-bottom: 0.25rem !important;\n }\n .p-md-2 {\n padding: 0.5rem !important;\n }\n .pt-md-2 {\n padding-top: 0.5rem !important;\n }\n .pr-md-2 {\n padding-right: 0.5rem !important;\n }\n .pb-md-2 {\n padding-bottom: 0.5rem !important;\n }\n .pl-md-2 {\n padding-left: 0.5rem !important;\n }\n .px-md-2 {\n padding-right: 0.5rem !important;\n padding-left: 0.5rem !important;\n }\n .py-md-2 {\n padding-top: 0.5rem !important;\n padding-bottom: 0.5rem !important;\n }\n .p-md-3 {\n padding: 1rem !important;\n }\n .pt-md-3 {\n padding-top: 1rem !important;\n }\n .pr-md-3 {\n padding-right: 1rem !important;\n }\n .pb-md-3 {\n padding-bottom: 1rem !important;\n }\n .pl-md-3 {\n padding-left: 1rem !important;\n }\n .px-md-3 {\n padding-right: 1rem !important;\n padding-left: 1rem !important;\n }\n .py-md-3 {\n padding-top: 1rem !important;\n padding-bottom: 1rem !important;\n }\n .p-md-4 {\n padding: 1.5rem !important;\n }\n .pt-md-4 {\n padding-top: 1.5rem !important;\n }\n .pr-md-4 {\n padding-right: 1.5rem !important;\n }\n .pb-md-4 {\n padding-bottom: 1.5rem !important;\n }\n .pl-md-4 {\n padding-left: 1.5rem !important;\n }\n .px-md-4 {\n padding-right: 1.5rem !important;\n padding-left: 1.5rem !important;\n }\n .py-md-4 {\n padding-top: 1.5rem !important;\n padding-bottom: 1.5rem !important;\n }\n .p-md-5 {\n padding: 3rem !important;\n }\n .pt-md-5 {\n padding-top: 3rem !important;\n }\n .pr-md-5 {\n padding-right: 3rem !important;\n }\n .pb-md-5 {\n padding-bottom: 3rem !important;\n }\n .pl-md-5 {\n padding-left: 3rem !important;\n }\n .px-md-5 {\n padding-right: 3rem !important;\n padding-left: 3rem !important;\n }\n .py-md-5 {\n padding-top: 3rem !important;\n padding-bottom: 3rem !important;\n }\n .m-md-auto {\n margin: auto !important;\n }\n .mt-md-auto {\n margin-top: auto !important;\n }\n .mr-md-auto {\n margin-right: auto !important;\n }\n .mb-md-auto {\n margin-bottom: auto !important;\n }\n .ml-md-auto {\n margin-left: auto !important;\n }\n .mx-md-auto {\n margin-right: auto !important;\n margin-left: auto !important;\n }\n .my-md-auto {\n margin-top: auto !important;\n margin-bottom: auto !important;\n }\n}\n\n@media (min-width: 992px) {\n .m-lg-0 {\n margin: 0 !important;\n }\n .mt-lg-0 {\n margin-top: 0 !important;\n }\n .mr-lg-0 {\n margin-right: 0 !important;\n }\n .mb-lg-0 {\n margin-bottom: 0 !important;\n }\n .ml-lg-0 {\n margin-left: 0 !important;\n }\n .mx-lg-0 {\n margin-right: 0 !important;\n margin-left: 0 !important;\n }\n .my-lg-0 {\n margin-top: 0 !important;\n margin-bottom: 0 !important;\n }\n .m-lg-1 {\n margin: 0.25rem !important;\n }\n .mt-lg-1 {\n margin-top: 0.25rem !important;\n }\n .mr-lg-1 {\n margin-right: 0.25rem !important;\n }\n .mb-lg-1 {\n margin-bottom: 0.25rem !important;\n }\n .ml-lg-1 {\n margin-left: 0.25rem !important;\n }\n .mx-lg-1 {\n margin-right: 0.25rem !important;\n margin-left: 0.25rem !important;\n }\n .my-lg-1 {\n margin-top: 0.25rem !important;\n margin-bottom: 0.25rem !important;\n }\n .m-lg-2 {\n margin: 0.5rem !important;\n }\n .mt-lg-2 {\n margin-top: 0.5rem !important;\n }\n .mr-lg-2 {\n margin-right: 0.5rem !important;\n }\n .mb-lg-2 {\n margin-bottom: 0.5rem !important;\n }\n .ml-lg-2 {\n margin-left: 0.5rem !important;\n }\n .mx-lg-2 {\n margin-right: 0.5rem !important;\n margin-left: 0.5rem !important;\n }\n .my-lg-2 {\n margin-top: 0.5rem !important;\n margin-bottom: 0.5rem !important;\n }\n .m-lg-3 {\n margin: 1rem !important;\n }\n .mt-lg-3 {\n margin-top: 1rem !important;\n }\n .mr-lg-3 {\n margin-right: 1rem !important;\n }\n .mb-lg-3 {\n margin-bottom: 1rem !important;\n }\n .ml-lg-3 {\n margin-left: 1rem !important;\n }\n .mx-lg-3 {\n margin-right: 1rem !important;\n margin-left: 1rem !important;\n }\n .my-lg-3 {\n margin-top: 1rem !important;\n margin-bottom: 1rem !important;\n }\n .m-lg-4 {\n margin: 1.5rem !important;\n }\n .mt-lg-4 {\n margin-top: 1.5rem !important;\n }\n .mr-lg-4 {\n margin-right: 1.5rem !important;\n }\n .mb-lg-4 {\n margin-bottom: 1.5rem !important;\n }\n .ml-lg-4 {\n margin-left: 1.5rem !important;\n }\n .mx-lg-4 {\n margin-right: 1.5rem !important;\n margin-left: 1.5rem !important;\n }\n .my-lg-4 {\n margin-top: 1.5rem !important;\n margin-bottom: 1.5rem !important;\n }\n .m-lg-5 {\n margin: 3rem !important;\n }\n .mt-lg-5 {\n margin-top: 3rem !important;\n }\n .mr-lg-5 {\n margin-right: 3rem !important;\n }\n .mb-lg-5 {\n margin-bottom: 3rem !important;\n }\n .ml-lg-5 {\n margin-left: 3rem !important;\n }\n .mx-lg-5 {\n margin-right: 3rem !important;\n margin-left: 3rem !important;\n }\n .my-lg-5 {\n margin-top: 3rem !important;\n margin-bottom: 3rem !important;\n }\n .p-lg-0 {\n padding: 0 !important;\n }\n .pt-lg-0 {\n padding-top: 0 !important;\n }\n .pr-lg-0 {\n padding-right: 0 !important;\n }\n .pb-lg-0 {\n padding-bottom: 0 !important;\n }\n .pl-lg-0 {\n padding-left: 0 !important;\n }\n .px-lg-0 {\n padding-right: 0 !important;\n padding-left: 0 !important;\n }\n .py-lg-0 {\n padding-top: 0 !important;\n padding-bottom: 0 !important;\n }\n .p-lg-1 {\n padding: 0.25rem !important;\n }\n .pt-lg-1 {\n padding-top: 0.25rem !important;\n }\n .pr-lg-1 {\n padding-right: 0.25rem !important;\n }\n .pb-lg-1 {\n padding-bottom: 0.25rem !important;\n }\n .pl-lg-1 {\n padding-left: 0.25rem !important;\n }\n .px-lg-1 {\n padding-right: 0.25rem !important;\n padding-left: 0.25rem !important;\n }\n .py-lg-1 {\n padding-top: 0.25rem !important;\n padding-bottom: 0.25rem !important;\n }\n .p-lg-2 {\n padding: 0.5rem !important;\n }\n .pt-lg-2 {\n padding-top: 0.5rem !important;\n }\n .pr-lg-2 {\n padding-right: 0.5rem !important;\n }\n .pb-lg-2 {\n padding-bottom: 0.5rem !important;\n }\n .pl-lg-2 {\n padding-left: 0.5rem !important;\n }\n .px-lg-2 {\n padding-right: 0.5rem !important;\n padding-left: 0.5rem !important;\n }\n .py-lg-2 {\n padding-top: 0.5rem !important;\n padding-bottom: 0.5rem !important;\n }\n .p-lg-3 {\n padding: 1rem !important;\n }\n .pt-lg-3 {\n padding-top: 1rem !important;\n }\n .pr-lg-3 {\n padding-right: 1rem !important;\n }\n .pb-lg-3 {\n padding-bottom: 1rem !important;\n }\n .pl-lg-3 {\n padding-left: 1rem !important;\n }\n .px-lg-3 {\n padding-right: 1rem !important;\n padding-left: 1rem !important;\n }\n .py-lg-3 {\n padding-top: 1rem !important;\n padding-bottom: 1rem !important;\n }\n .p-lg-4 {\n padding: 1.5rem !important;\n }\n .pt-lg-4 {\n padding-top: 1.5rem !important;\n }\n .pr-lg-4 {\n padding-right: 1.5rem !important;\n }\n .pb-lg-4 {\n padding-bottom: 1.5rem !important;\n }\n .pl-lg-4 {\n padding-left: 1.5rem !important;\n }\n .px-lg-4 {\n padding-right: 1.5rem !important;\n padding-left: 1.5rem !important;\n }\n .py-lg-4 {\n padding-top: 1.5rem !important;\n padding-bottom: 1.5rem !important;\n }\n .p-lg-5 {\n padding: 3rem !important;\n }\n .pt-lg-5 {\n padding-top: 3rem !important;\n }\n .pr-lg-5 {\n padding-right: 3rem !important;\n }\n .pb-lg-5 {\n padding-bottom: 3rem !important;\n }\n .pl-lg-5 {\n padding-left: 3rem !important;\n }\n .px-lg-5 {\n padding-right: 3rem !important;\n padding-left: 3rem !important;\n }\n .py-lg-5 {\n padding-top: 3rem !important;\n padding-bottom: 3rem !important;\n }\n .m-lg-auto {\n margin: auto !important;\n }\n .mt-lg-auto {\n margin-top: auto !important;\n }\n .mr-lg-auto {\n margin-right: auto !important;\n }\n .mb-lg-auto {\n margin-bottom: auto !important;\n }\n .ml-lg-auto {\n margin-left: auto !important;\n }\n .mx-lg-auto {\n margin-right: auto !important;\n margin-left: auto !important;\n }\n .my-lg-auto {\n margin-top: auto !important;\n margin-bottom: auto !important;\n }\n}\n\n@media (min-width: 1200px) {\n .m-xl-0 {\n margin: 0 !important;\n }\n .mt-xl-0 {\n margin-top: 0 !important;\n }\n .mr-xl-0 {\n margin-right: 0 !important;\n }\n .mb-xl-0 {\n margin-bottom: 0 !important;\n }\n .ml-xl-0 {\n margin-left: 0 !important;\n }\n .mx-xl-0 {\n margin-right: 0 !important;\n margin-left: 0 !important;\n }\n .my-xl-0 {\n margin-top: 0 !important;\n margin-bottom: 0 !important;\n }\n .m-xl-1 {\n margin: 0.25rem !important;\n }\n .mt-xl-1 {\n margin-top: 0.25rem !important;\n }\n .mr-xl-1 {\n margin-right: 0.25rem !important;\n }\n .mb-xl-1 {\n margin-bottom: 0.25rem !important;\n }\n .ml-xl-1 {\n margin-left: 0.25rem !important;\n }\n .mx-xl-1 {\n margin-right: 0.25rem !important;\n margin-left: 0.25rem !important;\n }\n .my-xl-1 {\n margin-top: 0.25rem !important;\n margin-bottom: 0.25rem !important;\n }\n .m-xl-2 {\n margin: 0.5rem !important;\n }\n .mt-xl-2 {\n margin-top: 0.5rem !important;\n }\n .mr-xl-2 {\n margin-right: 0.5rem !important;\n }\n .mb-xl-2 {\n margin-bottom: 0.5rem !important;\n }\n .ml-xl-2 {\n margin-left: 0.5rem !important;\n }\n .mx-xl-2 {\n margin-right: 0.5rem !important;\n margin-left: 0.5rem !important;\n }\n .my-xl-2 {\n margin-top: 0.5rem !important;\n margin-bottom: 0.5rem !important;\n }\n .m-xl-3 {\n margin: 1rem !important;\n }\n .mt-xl-3 {\n margin-top: 1rem !important;\n }\n .mr-xl-3 {\n margin-right: 1rem !important;\n }\n .mb-xl-3 {\n margin-bottom: 1rem !important;\n }\n .ml-xl-3 {\n margin-left: 1rem !important;\n }\n .mx-xl-3 {\n margin-right: 1rem !important;\n margin-left: 1rem !important;\n }\n .my-xl-3 {\n margin-top: 1rem !important;\n margin-bottom: 1rem !important;\n }\n .m-xl-4 {\n margin: 1.5rem !important;\n }\n .mt-xl-4 {\n margin-top: 1.5rem !important;\n }\n .mr-xl-4 {\n margin-right: 1.5rem !important;\n }\n .mb-xl-4 {\n margin-bottom: 1.5rem !important;\n }\n .ml-xl-4 {\n margin-left: 1.5rem !important;\n }\n .mx-xl-4 {\n margin-right: 1.5rem !important;\n margin-left: 1.5rem !important;\n }\n .my-xl-4 {\n margin-top: 1.5rem !important;\n margin-bottom: 1.5rem !important;\n }\n .m-xl-5 {\n margin: 3rem !important;\n }\n .mt-xl-5 {\n margin-top: 3rem !important;\n }\n .mr-xl-5 {\n margin-right: 3rem !important;\n }\n .mb-xl-5 {\n margin-bottom: 3rem !important;\n }\n .ml-xl-5 {\n margin-left: 3rem !important;\n }\n .mx-xl-5 {\n margin-right: 3rem !important;\n margin-left: 3rem !important;\n }\n .my-xl-5 {\n margin-top: 3rem !important;\n margin-bottom: 3rem !important;\n }\n .p-xl-0 {\n padding: 0 !important;\n }\n .pt-xl-0 {\n padding-top: 0 !important;\n }\n .pr-xl-0 {\n padding-right: 0 !important;\n }\n .pb-xl-0 {\n padding-bottom: 0 !important;\n }\n .pl-xl-0 {\n padding-left: 0 !important;\n }\n .px-xl-0 {\n padding-right: 0 !important;\n padding-left: 0 !important;\n }\n .py-xl-0 {\n padding-top: 0 !important;\n padding-bottom: 0 !important;\n }\n .p-xl-1 {\n padding: 0.25rem !important;\n }\n .pt-xl-1 {\n padding-top: 0.25rem !important;\n }\n .pr-xl-1 {\n padding-right: 0.25rem !important;\n }\n .pb-xl-1 {\n padding-bottom: 0.25rem !important;\n }\n .pl-xl-1 {\n padding-left: 0.25rem !important;\n }\n .px-xl-1 {\n padding-right: 0.25rem !important;\n padding-left: 0.25rem !important;\n }\n .py-xl-1 {\n padding-top: 0.25rem !important;\n padding-bottom: 0.25rem !important;\n }\n .p-xl-2 {\n padding: 0.5rem !important;\n }\n .pt-xl-2 {\n padding-top: 0.5rem !important;\n }\n .pr-xl-2 {\n padding-right: 0.5rem !important;\n }\n .pb-xl-2 {\n padding-bottom: 0.5rem !important;\n }\n .pl-xl-2 {\n padding-left: 0.5rem !important;\n }\n .px-xl-2 {\n padding-right: 0.5rem !important;\n padding-left: 0.5rem !important;\n }\n .py-xl-2 {\n padding-top: 0.5rem !important;\n padding-bottom: 0.5rem !important;\n }\n .p-xl-3 {\n padding: 1rem !important;\n }\n .pt-xl-3 {\n padding-top: 1rem !important;\n }\n .pr-xl-3 {\n padding-right: 1rem !important;\n }\n .pb-xl-3 {\n padding-bottom: 1rem !important;\n }\n .pl-xl-3 {\n padding-left: 1rem !important;\n }\n .px-xl-3 {\n padding-right: 1rem !important;\n padding-left: 1rem !important;\n }\n .py-xl-3 {\n padding-top: 1rem !important;\n padding-bottom: 1rem !important;\n }\n .p-xl-4 {\n padding: 1.5rem !important;\n }\n .pt-xl-4 {\n padding-top: 1.5rem !important;\n }\n .pr-xl-4 {\n padding-right: 1.5rem !important;\n }\n .pb-xl-4 {\n padding-bottom: 1.5rem !important;\n }\n .pl-xl-4 {\n padding-left: 1.5rem !important;\n }\n .px-xl-4 {\n padding-right: 1.5rem !important;\n padding-left: 1.5rem !important;\n }\n .py-xl-4 {\n padding-top: 1.5rem !important;\n padding-bottom: 1.5rem !important;\n }\n .p-xl-5 {\n padding: 3rem !important;\n }\n .pt-xl-5 {\n padding-top: 3rem !important;\n }\n .pr-xl-5 {\n padding-right: 3rem !important;\n }\n .pb-xl-5 {\n padding-bottom: 3rem !important;\n }\n .pl-xl-5 {\n padding-left: 3rem !important;\n }\n .px-xl-5 {\n padding-right: 3rem !important;\n padding-left: 3rem !important;\n }\n .py-xl-5 {\n padding-top: 3rem !important;\n padding-bottom: 3rem !important;\n }\n .m-xl-auto {\n margin: auto !important;\n }\n .mt-xl-auto {\n margin-top: auto !important;\n }\n .mr-xl-auto {\n margin-right: auto !important;\n }\n .mb-xl-auto {\n margin-bottom: auto !important;\n }\n .ml-xl-auto {\n margin-left: auto !important;\n }\n .mx-xl-auto {\n margin-right: auto !important;\n margin-left: auto !important;\n }\n .my-xl-auto {\n margin-top: auto !important;\n margin-bottom: auto !important;\n }\n}\n\n.text-justify {\n text-align: justify !important;\n}\n\n.text-nowrap {\n white-space: nowrap !important;\n}\n\n.text-truncate {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.text-left {\n text-align: left !important;\n}\n\n.text-right {\n text-align: right !important;\n}\n\n.text-center {\n text-align: center !important;\n}\n\n@media (min-width: 576px) {\n .text-sm-left {\n text-align: left !important;\n }\n .text-sm-right {\n text-align: right !important;\n }\n .text-sm-center {\n text-align: center !important;\n }\n}\n\n@media (min-width: 768px) {\n .text-md-left {\n text-align: left !important;\n }\n .text-md-right {\n text-align: right !important;\n }\n .text-md-center {\n text-align: center !important;\n }\n}\n\n@media (min-width: 992px) {\n .text-lg-left {\n text-align: left !important;\n }\n .text-lg-right {\n text-align: right !important;\n }\n .text-lg-center {\n text-align: center !important;\n }\n}\n\n@media (min-width: 1200px) {\n .text-xl-left {\n text-align: left !important;\n }\n .text-xl-right {\n text-align: right !important;\n }\n .text-xl-center {\n text-align: center !important;\n }\n}\n\n.text-lowercase {\n text-transform: lowercase !important;\n}\n\n.text-uppercase {\n text-transform: uppercase !important;\n}\n\n.text-capitalize {\n text-transform: capitalize !important;\n}\n\n.font-weight-normal {\n font-weight: normal;\n}\n\n.font-weight-bold {\n font-weight: bold;\n}\n\n.font-italic {\n font-style: italic;\n}\n\n.text-white {\n color: #fff !important;\n}\n\n.text-primary {\n color: #007bff !important;\n}\n\na.text-primary:focus, a.text-primary:hover {\n color: #0062cc !important;\n}\n\n.text-secondary {\n color: #868e96 !important;\n}\n\na.text-secondary:focus, a.text-secondary:hover {\n color: #6c757d !important;\n}\n\n.text-success {\n color: #28a745 !important;\n}\n\na.text-success:focus, a.text-success:hover {\n color: #1e7e34 !important;\n}\n\n.text-info {\n color: #17a2b8 !important;\n}\n\na.text-info:focus, a.text-info:hover {\n color: #117a8b !important;\n}\n\n.text-warning {\n color: #ffc107 !important;\n}\n\na.text-warning:focus, a.text-warning:hover {\n color: #d39e00 !important;\n}\n\n.text-danger {\n color: #dc3545 !important;\n}\n\na.text-danger:focus, a.text-danger:hover {\n color: #bd2130 !important;\n}\n\n.text-light {\n color: #f8f9fa !important;\n}\n\na.text-light:focus, a.text-light:hover {\n color: #dae0e5 !important;\n}\n\n.text-dark {\n color: #343a40 !important;\n}\n\na.text-dark:focus, a.text-dark:hover {\n color: #1d2124 !important;\n}\n\n.text-muted {\n color: #868e96 !important;\n}\n\n.text-hide {\n font: 0/0 a;\n color: transparent;\n text-shadow: none;\n background-color: transparent;\n border: 0;\n}\n\n.visible {\n visibility: visible !important;\n}\n\n.invisible {\n visibility: hidden !important;\n}\n/*# sourceMappingURL=bootstrap.css.map */","// scss-lint:disable QualifyingElement, DuplicateProperty, VendorPrefix\n\n// Reboot\n//\n// Normalization of HTML elements, manually forked from Normalize.css to remove\n// styles targeting irrelevant browsers while applying new styles.\n//\n// Normalize is licensed MIT. https://github.com/necolas/normalize.css\n\n\n// Document\n//\n// 1. Change from `box-sizing: content-box` so that `width` is not affected by `padding` or `border`.\n// 2. Change the default font family in all browsers.\n// 3. Correct the line height in all browsers.\n// 4. Prevent adjustments of font size after orientation changes in IE on Windows Phone and in iOS.\n// 5. Setting @viewport causes scrollbars to overlap content in IE11 and Edge, so\n// we force a non-overlapping, non-auto-hiding scrollbar to counteract.\n// 6. Change the default tap highlight to be completely transparent in iOS.\n\nhtml {\n box-sizing: border-box; // 1\n font-family: sans-serif; // 2\n line-height: 1.15; // 3\n -webkit-text-size-adjust: 100%; // 4\n -ms-text-size-adjust: 100%; // 4\n -ms-overflow-style: scrollbar; // 5\n -webkit-tap-highlight-color: rgba(0,0,0,0); // 6\n}\n\n*,\n*::before,\n*::after {\n box-sizing: inherit; // 1\n}\n\n// IE10+ doesn't honor `<meta name=\"viewport\">` in some cases.\n@at-root {\n @-ms-viewport { width: device-width; }\n}\n\n// Shim for \"new\" HTML5 structural elements to display correctly (IE10, older browsers)\narticle, aside, dialog, figcaption, figure, footer, header, hgroup, main, nav, section {\n display: block;\n}\n\n// Body\n//\n// 1. Remove the margin in all browsers.\n// 2. As a best practice, apply a default `background-color`.\n\nbody {\n margin: 0; // 1\n font-family: $font-family-base;\n font-size: $font-size-base;\n font-weight: $font-weight-base;\n line-height: $line-height-base;\n color: $body-color;\n background-color: $body-bg; // 2\n}\n\n// Suppress the focus outline on elements that cannot be accessed via keyboard.\n// This prevents an unwanted focus outline from appearing around elements that\n// might still respond to pointer events.\n//\n// Credit: https://github.com/suitcss/base\n[tabindex=\"-1\"]:focus {\n outline: none !important;\n}\n\n\n// Content grouping\n//\n// 1. Add the correct box sizing in Firefox.\n// 2. Show the overflow in Edge and IE.\n\nhr {\n box-sizing: content-box; // 1\n height: 0; // 1\n overflow: visible; // 2\n}\n\n\n//\n// Typography\n//\n\n// Remove top margins from headings\n//\n// By default, `<h1>`-`<h6>` all receive top and bottom margins. We nuke the top\n// margin for easier control within type scales as it avoids margin collapsing.\nh1, h2, h3, h4, h5, h6 {\n margin-top: 0;\n margin-bottom: .5rem;\n}\n\n// Reset margins on paragraphs\n//\n// Similarly, the top margin on `<p>`s get reset. However, we also reset the\n// bottom margin to use `rem` units instead of `em`.\np {\n margin-top: 0;\n margin-bottom: 1rem;\n}\n\n// Abbreviations\n//\n// 1. Remove the bottom border in Firefox 39-.\n// 2. Add the correct text decoration in Chrome, Edge, IE, Opera, and Safari.\n// 3. Add explicit cursor to indicate changed behavior.\n// 4. Duplicate behavior to the data-* attribute for our tooltip plugin\n\nabbr[title],\nabbr[data-original-title] { // 4\n text-decoration: underline; // 2\n text-decoration: underline dotted; // 2\n cursor: help; // 3\n border-bottom: 0; // 1\n}\n\naddress {\n margin-bottom: 1rem;\n font-style: normal;\n line-height: inherit;\n}\n\nol,\nul,\ndl {\n margin-top: 0;\n margin-bottom: 1rem;\n}\n\nol ol,\nul ul,\nol ul,\nul ol {\n margin-bottom: 0;\n}\n\ndt {\n font-weight: $dt-font-weight;\n}\n\ndd {\n margin-bottom: .5rem;\n margin-left: 0; // Undo browser default\n}\n\nblockquote {\n margin: 0 0 1rem;\n}\n\ndfn {\n font-style: italic; // Add the correct font style in Android 4.3-\n}\n\nb,\nstrong {\n font-weight: bolder; // Add the correct font weight in Chrome, Edge, and Safari\n}\n\nsmall {\n font-size: 80%; // Add the correct font size in all browsers\n}\n\n//\n// Prevent `sub` and `sup` elements from affecting the line height in\n// all browsers.\n//\n\nsub,\nsup {\n position: relative;\n font-size: 75%;\n line-height: 0;\n vertical-align: baseline;\n}\n\nsub { bottom: -.25em; }\nsup { top: -.5em; }\n\n\n//\n// Links\n//\n\na {\n color: $link-color;\n text-decoration: $link-decoration;\n background-color: transparent; // Remove the gray background on active links in IE 10.\n -webkit-text-decoration-skip: objects; // Remove gaps in links underline in iOS 8+ and Safari 8+.\n\n @include hover {\n color: $link-hover-color;\n text-decoration: $link-hover-decoration;\n }\n}\n\n// And undo these styles for placeholder links/named anchors (without href)\n// which have not been made explicitly keyboard-focusable (without tabindex).\n// It would be more straightforward to just use a[href] in previous block, but that\n// causes specificity issues in many other styles that are too complex to fix.\n// See https://github.com/twbs/bootstrap/issues/19402\n\na:not([href]):not([tabindex]) {\n color: inherit;\n text-decoration: none;\n\n @include hover-focus {\n color: inherit;\n text-decoration: none;\n }\n\n &:focus {\n outline: 0;\n }\n}\n\n\n//\n// Code\n//\n\npre,\ncode,\nkbd,\nsamp {\n font-family: monospace, monospace; // Correct the inheritance and scaling of font size in all browsers.\n font-size: 1em; // Correct the odd `em` font sizing in all browsers.\n}\n\npre {\n // Remove browser default top margin\n margin-top: 0;\n // Reset browser default of `1em` to use `rem`s\n margin-bottom: 1rem;\n // Don't allow content to break outside\n overflow: auto;\n}\n\n\n//\n// Figures\n//\n\nfigure {\n // Apply a consistent margin strategy (matches our type styles).\n margin: 0 0 1rem;\n}\n\n\n//\n// Images and content\n//\n\nimg {\n vertical-align: middle;\n border-style: none; // Remove the border on images inside links in IE 10-.\n}\n\nsvg:not(:root) {\n overflow: hidden; // Hide the overflow in IE\n}\n\n\n// Avoid 300ms click delay on touch devices that support the `touch-action` CSS property.\n//\n// In particular, unlike most other browsers, IE11+Edge on Windows 10 on touch devices and IE Mobile 10-11\n// DON'T remove the click delay when `<meta name=\"viewport\" content=\"width=device-width\">` is present.\n// However, they DO support removing the click delay via `touch-action: manipulation`.\n// See:\n// * https://v4-alpha.getbootstrap.com/content/reboot/#click-delay-optimization-for-touch\n// * http://caniuse.com/#feat=css-touch-action\n// * https://patrickhlauke.github.io/touch/tests/results/#suppressing-300ms-delay\n\na,\narea,\nbutton,\n[role=\"button\"],\ninput,\nlabel,\nselect,\nsummary,\ntextarea {\n touch-action: manipulation;\n}\n\n\n//\n// Tables\n//\n\ntable {\n border-collapse: collapse; // Prevent double borders\n}\n\ncaption {\n padding-top: $table-cell-padding;\n padding-bottom: $table-cell-padding;\n color: $text-muted;\n text-align: left;\n caption-side: bottom;\n}\n\nth {\n // Matches default `<td>` alignment\n text-align: left;\n}\n\n\n//\n// Forms\n//\n\nlabel {\n // Allow labels to use `margin` for spacing.\n display: inline-block;\n margin-bottom: .5rem;\n}\n\n// Work around a Firefox/IE bug where the transparent `button` background\n// results in a loss of the default `button` focus styles.\n//\n// Credit: https://github.com/suitcss/base/\nbutton:focus {\n outline: 1px dotted;\n outline: 5px auto -webkit-focus-ring-color;\n}\n\ninput,\nbutton,\nselect,\noptgroup,\ntextarea {\n margin: 0; // Remove the margin in Firefox and Safari\n font-family: inherit;\n font-size: inherit;\n line-height: inherit;\n}\n\nbutton,\ninput {\n overflow: visible; // Show the overflow in Edge\n}\n\nbutton,\nselect {\n text-transform: none; // Remove the inheritance of text transform in Firefox\n}\n\n// 1. Prevent a WebKit bug where (2) destroys native `audio` and `video`\n// controls in Android 4.\n// 2. Correct the inability to style clickable types in iOS and Safari.\nbutton,\nhtml [type=\"button\"], // 1\n[type=\"reset\"],\n[type=\"submit\"] {\n -webkit-appearance: button; // 2\n}\n\n// Remove inner border and padding from Firefox, but don't restore the outline like Normalize.\nbutton::-moz-focus-inner,\n[type=\"button\"]::-moz-focus-inner,\n[type=\"reset\"]::-moz-focus-inner,\n[type=\"submit\"]::-moz-focus-inner {\n padding: 0;\n border-style: none;\n}\n\ninput[type=\"radio\"],\ninput[type=\"checkbox\"] {\n box-sizing: border-box; // 1. Add the correct box sizing in IE 10-\n padding: 0; // 2. Remove the padding in IE 10-\n}\n\n\ninput[type=\"date\"],\ninput[type=\"time\"],\ninput[type=\"datetime-local\"],\ninput[type=\"month\"] {\n // Remove the default appearance of temporal inputs to avoid a Mobile Safari\n // bug where setting a custom line-height prevents text from being vertically\n // centered within the input.\n // See https://bugs.webkit.org/show_bug.cgi?id=139848\n // and https://github.com/twbs/bootstrap/issues/11266\n -webkit-appearance: listbox;\n}\n\ntextarea {\n overflow: auto; // Remove the default vertical scrollbar in IE.\n // Textareas should really only resize vertically so they don't break their (horizontal) containers.\n resize: vertical;\n}\n\nfieldset {\n // Browsers set a default `min-width: min-content;` on fieldsets,\n // unlike e.g. `<div>`s, which have `min-width: 0;` by default.\n // So we reset that to ensure fieldsets behave more like a standard block element.\n // See https://github.com/twbs/bootstrap/issues/12359\n // and https://html.spec.whatwg.org/multipage/#the-fieldset-and-legend-elements\n min-width: 0;\n // Reset the default outline behavior of fieldsets so they don't affect page layout.\n padding: 0;\n margin: 0;\n border: 0;\n}\n\n// 1. Correct the text wrapping in Edge and IE.\n// 2. Correct the color inheritance from `fieldset` elements in IE.\nlegend {\n display: block;\n width: 100%;\n max-width: 100%; // 1\n padding: 0;\n margin-bottom: .5rem;\n font-size: 1.5rem;\n line-height: inherit;\n color: inherit; // 2\n white-space: normal; // 1\n}\n\nprogress {\n vertical-align: baseline; // Add the correct vertical alignment in Chrome, Firefox, and Opera.\n}\n\n// Correct the cursor style of increment and decrement buttons in Chrome.\n[type=\"number\"]::-webkit-inner-spin-button,\n[type=\"number\"]::-webkit-outer-spin-button {\n height: auto;\n}\n\n[type=\"search\"] {\n // This overrides the extra rounded corners on search inputs in iOS so that our\n // `.form-control` class can properly style them. Note that this cannot simply\n // be added to `.form-control` as it's not specific enough. For details, see\n // https://github.com/twbs/bootstrap/issues/11586.\n outline-offset: -2px; // 2. Correct the outline style in Safari.\n -webkit-appearance: none;\n}\n\n//\n// Remove the inner padding and cancel buttons in Chrome and Safari on macOS.\n//\n\n[type=\"search\"]::-webkit-search-cancel-button,\n[type=\"search\"]::-webkit-search-decoration {\n -webkit-appearance: none;\n}\n\n//\n// 1. Correct the inability to style clickable types in iOS and Safari.\n// 2. Change font properties to `inherit` in Safari.\n//\n\n::-webkit-file-upload-button {\n font: inherit; // 2\n -webkit-appearance: button; // 1\n}\n\n//\n// Correct element displays\n//\n\noutput {\n display: inline-block;\n}\n\nsummary {\n display: list-item; // Add the correct display in all browsers\n}\n\ntemplate {\n display: none; // Add the correct display in IE\n}\n\n// Always hide an element with the `hidden` HTML attribute (from PureCSS).\n// Needed for proper display in IE 10-.\n[hidden] {\n display: none !important;\n}\n","/*!\n * Bootstrap v4.0.0-beta (https://getbootstrap.com)\n * Copyright 2011-2017 The Bootstrap Authors\n * Copyright 2011-2017 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n */\n@media print {\n *,\n *::before,\n *::after {\n text-shadow: none !important;\n box-shadow: none !important;\n }\n a,\n a:visited {\n text-decoration: underline;\n }\n abbr[title]::after {\n content: \" (\" attr(title) \")\";\n }\n pre {\n white-space: pre-wrap !important;\n }\n pre,\n blockquote {\n border: 1px solid #999;\n page-break-inside: avoid;\n }\n thead {\n display: table-header-group;\n }\n tr,\n img {\n page-break-inside: avoid;\n }\n p,\n h2,\n h3 {\n orphans: 3;\n widows: 3;\n }\n h2,\n h3 {\n page-break-after: avoid;\n }\n .navbar {\n display: none;\n }\n .badge {\n border: 1px solid #000;\n }\n .table {\n border-collapse: collapse !important;\n }\n .table td,\n .table th {\n background-color: #fff !important;\n }\n .table-bordered th,\n .table-bordered td {\n border: 1px solid #ddd !important;\n }\n}\n\nhtml {\n box-sizing: border-box;\n font-family: sans-serif;\n line-height: 1.15;\n -webkit-text-size-adjust: 100%;\n -ms-text-size-adjust: 100%;\n -ms-overflow-style: scrollbar;\n -webkit-tap-highlight-color: transparent;\n}\n\n*,\n*::before,\n*::after {\n box-sizing: inherit;\n}\n\n@-ms-viewport {\n width: device-width;\n}\n\narticle, aside, dialog, figcaption, figure, footer, header, hgroup, main, nav, section {\n display: block;\n}\n\nbody {\n margin: 0;\n font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, \"Helvetica Neue\", Arial, sans-serif;\n font-size: 1rem;\n font-weight: normal;\n line-height: 1.5;\n color: #212529;\n background-color: #fff;\n}\n\n[tabindex=\"-1\"]:focus {\n outline: none !important;\n}\n\nhr {\n box-sizing: content-box;\n height: 0;\n overflow: visible;\n}\n\nh1, h2, h3, h4, h5, h6 {\n margin-top: 0;\n margin-bottom: .5rem;\n}\n\np {\n margin-top: 0;\n margin-bottom: 1rem;\n}\n\nabbr[title],\nabbr[data-original-title] {\n text-decoration: underline;\n text-decoration: underline dotted;\n cursor: help;\n border-bottom: 0;\n}\n\naddress {\n margin-bottom: 1rem;\n font-style: normal;\n line-height: inherit;\n}\n\nol,\nul,\ndl {\n margin-top: 0;\n margin-bottom: 1rem;\n}\n\nol ol,\nul ul,\nol ul,\nul ol {\n margin-bottom: 0;\n}\n\ndt {\n font-weight: bold;\n}\n\ndd {\n margin-bottom: .5rem;\n margin-left: 0;\n}\n\nblockquote {\n margin: 0 0 1rem;\n}\n\ndfn {\n font-style: italic;\n}\n\nb,\nstrong {\n font-weight: bolder;\n}\n\nsmall {\n font-size: 80%;\n}\n\nsub,\nsup {\n position: relative;\n font-size: 75%;\n line-height: 0;\n vertical-align: baseline;\n}\n\nsub {\n bottom: -.25em;\n}\n\nsup {\n top: -.5em;\n}\n\na {\n color: #007bff;\n text-decoration: none;\n background-color: transparent;\n -webkit-text-decoration-skip: objects;\n}\n\na:hover {\n color: #0056b3;\n text-decoration: underline;\n}\n\na:not([href]):not([tabindex]) {\n color: inherit;\n text-decoration: none;\n}\n\na:not([href]):not([tabindex]):focus, a:not([href]):not([tabindex]):hover {\n color: inherit;\n text-decoration: none;\n}\n\na:not([href]):not([tabindex]):focus {\n outline: 0;\n}\n\npre,\ncode,\nkbd,\nsamp {\n font-family: monospace, monospace;\n font-size: 1em;\n}\n\npre {\n margin-top: 0;\n margin-bottom: 1rem;\n overflow: auto;\n}\n\nfigure {\n margin: 0 0 1rem;\n}\n\nimg {\n vertical-align: middle;\n border-style: none;\n}\n\nsvg:not(:root) {\n overflow: hidden;\n}\n\na,\narea,\nbutton,\n[role=\"button\"],\ninput,\nlabel,\nselect,\nsummary,\ntextarea {\n touch-action: manipulation;\n}\n\ntable {\n border-collapse: collapse;\n}\n\ncaption {\n padding-top: 0.75rem;\n padding-bottom: 0.75rem;\n color: #868e96;\n text-align: left;\n caption-side: bottom;\n}\n\nth {\n text-align: left;\n}\n\nlabel {\n display: inline-block;\n margin-bottom: .5rem;\n}\n\nbutton:focus {\n outline: 1px dotted;\n outline: 5px auto -webkit-focus-ring-color;\n}\n\ninput,\nbutton,\nselect,\noptgroup,\ntextarea {\n margin: 0;\n font-family: inherit;\n font-size: inherit;\n line-height: inherit;\n}\n\nbutton,\ninput {\n overflow: visible;\n}\n\nbutton,\nselect {\n text-transform: none;\n}\n\nbutton,\nhtml [type=\"button\"],\n[type=\"reset\"],\n[type=\"submit\"] {\n -webkit-appearance: button;\n}\n\nbutton::-moz-focus-inner,\n[type=\"button\"]::-moz-focus-inner,\n[type=\"reset\"]::-moz-focus-inner,\n[type=\"submit\"]::-moz-focus-inner {\n padding: 0;\n border-style: none;\n}\n\ninput[type=\"radio\"],\ninput[type=\"checkbox\"] {\n box-sizing: border-box;\n padding: 0;\n}\n\ninput[type=\"date\"],\ninput[type=\"time\"],\ninput[type=\"datetime-local\"],\ninput[type=\"month\"] {\n -webkit-appearance: listbox;\n}\n\ntextarea {\n overflow: auto;\n resize: vertical;\n}\n\nfieldset {\n min-width: 0;\n padding: 0;\n margin: 0;\n border: 0;\n}\n\nlegend {\n display: block;\n width: 100%;\n max-width: 100%;\n padding: 0;\n margin-bottom: .5rem;\n font-size: 1.5rem;\n line-height: inherit;\n color: inherit;\n white-space: normal;\n}\n\nprogress {\n vertical-align: baseline;\n}\n\n[type=\"number\"]::-webkit-inner-spin-button,\n[type=\"number\"]::-webkit-outer-spin-button {\n height: auto;\n}\n\n[type=\"search\"] {\n outline-offset: -2px;\n -webkit-appearance: none;\n}\n\n[type=\"search\"]::-webkit-search-cancel-button,\n[type=\"search\"]::-webkit-search-decoration {\n -webkit-appearance: none;\n}\n\n::-webkit-file-upload-button {\n font: inherit;\n -webkit-appearance: button;\n}\n\noutput {\n display: inline-block;\n}\n\nsummary {\n display: list-item;\n}\n\ntemplate {\n display: none;\n}\n\n[hidden] {\n display: none !important;\n}\n\nh1, h2, h3, h4, h5, h6,\n.h1, .h2, .h3, .h4, .h5, .h6 {\n margin-bottom: 0.5rem;\n font-family: inherit;\n font-weight: 500;\n line-height: 1.1;\n color: inherit;\n}\n\nh1, .h1 {\n font-size: 2.5rem;\n}\n\nh2, .h2 {\n font-size: 2rem;\n}\n\nh3, .h3 {\n font-size: 1.75rem;\n}\n\nh4, .h4 {\n font-size: 1.5rem;\n}\n\nh5, .h5 {\n font-size: 1.25rem;\n}\n\nh6, .h6 {\n font-size: 1rem;\n}\n\n.lead {\n font-size: 1.25rem;\n font-weight: 300;\n}\n\n.display-1 {\n font-size: 6rem;\n font-weight: 300;\n line-height: 1.1;\n}\n\n.display-2 {\n font-size: 5.5rem;\n font-weight: 300;\n line-height: 1.1;\n}\n\n.display-3 {\n font-size: 4.5rem;\n font-weight: 300;\n line-height: 1.1;\n}\n\n.display-4 {\n font-size: 3.5rem;\n font-weight: 300;\n line-height: 1.1;\n}\n\nhr {\n margin-top: 1rem;\n margin-bottom: 1rem;\n border: 0;\n border-top: 1px solid rgba(0, 0, 0, 0.1);\n}\n\nsmall,\n.small {\n font-size: 80%;\n font-weight: normal;\n}\n\nmark,\n.mark {\n padding: 0.2em;\n background-color: #fcf8e3;\n}\n\n.list-unstyled {\n padding-left: 0;\n list-style: none;\n}\n\n.list-inline {\n padding-left: 0;\n list-style: none;\n}\n\n.list-inline-item {\n display: inline-block;\n}\n\n.list-inline-item:not(:last-child) {\n margin-right: 5px;\n}\n\n.initialism {\n font-size: 90%;\n text-transform: uppercase;\n}\n\n.blockquote {\n margin-bottom: 1rem;\n font-size: 1.25rem;\n}\n\n.blockquote-footer {\n display: block;\n font-size: 80%;\n color: #868e96;\n}\n\n.blockquote-footer::before {\n content: \"\\2014 \\00A0\";\n}\n\n.img-fluid {\n max-width: 100%;\n height: auto;\n}\n\n.img-thumbnail {\n padding: 0.25rem;\n background-color: #fff;\n border: 1px solid #ddd;\n border-radius: 0.25rem;\n transition: all 0.2s ease-in-out;\n max-width: 100%;\n height: auto;\n}\n\n.figure {\n display: inline-block;\n}\n\n.figure-img {\n margin-bottom: 0.5rem;\n line-height: 1;\n}\n\n.figure-caption {\n font-size: 90%;\n color: #868e96;\n}\n\ncode,\nkbd,\npre,\nsamp {\n font-family: Menlo, Monaco, Consolas, \"Liberation Mono\", \"Courier New\", monospace;\n}\n\ncode {\n padding: 0.2rem 0.4rem;\n font-size: 90%;\n color: #bd4147;\n background-color: #f8f9fa;\n border-radius: 0.25rem;\n}\n\na > code {\n padding: 0;\n color: inherit;\n background-color: inherit;\n}\n\nkbd {\n padding: 0.2rem 0.4rem;\n font-size: 90%;\n color: #fff;\n background-color: #212529;\n border-radius: 0.2rem;\n}\n\nkbd kbd {\n padding: 0;\n font-size: 100%;\n font-weight: bold;\n}\n\npre {\n display: block;\n margin-top: 0;\n margin-bottom: 1rem;\n font-size: 90%;\n color: #212529;\n}\n\npre code {\n padding: 0;\n font-size: inherit;\n color: inherit;\n background-color: transparent;\n border-radius: 0;\n}\n\n.pre-scrollable {\n max-height: 340px;\n overflow-y: scroll;\n}\n\n.container {\n margin-right: auto;\n margin-left: auto;\n padding-right: 15px;\n padding-left: 15px;\n width: 100%;\n}\n\n@media (min-width: 576px) {\n .container {\n max-width: 540px;\n }\n}\n\n@media (min-width: 768px) {\n .container {\n max-width: 720px;\n }\n}\n\n@media (min-width: 992px) {\n .container {\n max-width: 960px;\n }\n}\n\n@media (min-width: 1200px) {\n .container {\n max-width: 1140px;\n }\n}\n\n.container-fluid {\n width: 100%;\n margin-right: auto;\n margin-left: auto;\n padding-right: 15px;\n padding-left: 15px;\n width: 100%;\n}\n\n.row {\n display: flex;\n flex-wrap: wrap;\n margin-right: -15px;\n margin-left: -15px;\n}\n\n.no-gutters {\n margin-right: 0;\n margin-left: 0;\n}\n\n.no-gutters > .col,\n.no-gutters > [class*=\"col-\"] {\n padding-right: 0;\n padding-left: 0;\n}\n\n.col-1, .col-2, .col-3, .col-4, .col-5, .col-6, .col-7, .col-8, .col-9, .col-10, .col-11, .col-12, .col,\n.col-auto, .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, .col-sm,\n.col-sm-auto, .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, .col-md,\n.col-md-auto, .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, .col-lg,\n.col-lg-auto, .col-xl-1, .col-xl-2, .col-xl-3, .col-xl-4, .col-xl-5, .col-xl-6, .col-xl-7, .col-xl-8, .col-xl-9, .col-xl-10, .col-xl-11, .col-xl-12, .col-xl,\n.col-xl-auto {\n position: relative;\n width: 100%;\n min-height: 1px;\n padding-right: 15px;\n padding-left: 15px;\n}\n\n.col {\n flex-basis: 0;\n flex-grow: 1;\n max-width: 100%;\n}\n\n.col-auto {\n flex: 0 0 auto;\n width: auto;\n max-width: none;\n}\n\n.col-1 {\n flex: 0 0 8.333333%;\n max-width: 8.333333%;\n}\n\n.col-2 {\n flex: 0 0 16.666667%;\n max-width: 16.666667%;\n}\n\n.col-3 {\n flex: 0 0 25%;\n max-width: 25%;\n}\n\n.col-4 {\n flex: 0 0 33.333333%;\n max-width: 33.333333%;\n}\n\n.col-5 {\n flex: 0 0 41.666667%;\n max-width: 41.666667%;\n}\n\n.col-6 {\n flex: 0 0 50%;\n max-width: 50%;\n}\n\n.col-7 {\n flex: 0 0 58.333333%;\n max-width: 58.333333%;\n}\n\n.col-8 {\n flex: 0 0 66.666667%;\n max-width: 66.666667%;\n}\n\n.col-9 {\n flex: 0 0 75%;\n max-width: 75%;\n}\n\n.col-10 {\n flex: 0 0 83.333333%;\n max-width: 83.333333%;\n}\n\n.col-11 {\n flex: 0 0 91.666667%;\n max-width: 91.666667%;\n}\n\n.col-12 {\n flex: 0 0 100%;\n max-width: 100%;\n}\n\n.order-1 {\n order: 1;\n}\n\n.order-2 {\n order: 2;\n}\n\n.order-3 {\n order: 3;\n}\n\n.order-4 {\n order: 4;\n}\n\n.order-5 {\n order: 5;\n}\n\n.order-6 {\n order: 6;\n}\n\n.order-7 {\n order: 7;\n}\n\n.order-8 {\n order: 8;\n}\n\n.order-9 {\n order: 9;\n}\n\n.order-10 {\n order: 10;\n}\n\n.order-11 {\n order: 11;\n}\n\n.order-12 {\n order: 12;\n}\n\n@media (min-width: 576px) {\n .col-sm {\n flex-basis: 0;\n flex-grow: 1;\n max-width: 100%;\n }\n .col-sm-auto {\n flex: 0 0 auto;\n width: auto;\n max-width: none;\n }\n .col-sm-1 {\n flex: 0 0 8.333333%;\n max-width: 8.333333%;\n }\n .col-sm-2 {\n flex: 0 0 16.666667%;\n max-width: 16.666667%;\n }\n .col-sm-3 {\n flex: 0 0 25%;\n max-width: 25%;\n }\n .col-sm-4 {\n flex: 0 0 33.333333%;\n max-width: 33.333333%;\n }\n .col-sm-5 {\n flex: 0 0 41.666667%;\n max-width: 41.666667%;\n }\n .col-sm-6 {\n flex: 0 0 50%;\n max-width: 50%;\n }\n .col-sm-7 {\n flex: 0 0 58.333333%;\n max-width: 58.333333%;\n }\n .col-sm-8 {\n flex: 0 0 66.666667%;\n max-width: 66.666667%;\n }\n .col-sm-9 {\n flex: 0 0 75%;\n max-width: 75%;\n }\n .col-sm-10 {\n flex: 0 0 83.333333%;\n max-width: 83.333333%;\n }\n .col-sm-11 {\n flex: 0 0 91.666667%;\n max-width: 91.666667%;\n }\n .col-sm-12 {\n flex: 0 0 100%;\n max-width: 100%;\n }\n .order-sm-1 {\n order: 1;\n }\n .order-sm-2 {\n order: 2;\n }\n .order-sm-3 {\n order: 3;\n }\n .order-sm-4 {\n order: 4;\n }\n .order-sm-5 {\n order: 5;\n }\n .order-sm-6 {\n order: 6;\n }\n .order-sm-7 {\n order: 7;\n }\n .order-sm-8 {\n order: 8;\n }\n .order-sm-9 {\n order: 9;\n }\n .order-sm-10 {\n order: 10;\n }\n .order-sm-11 {\n order: 11;\n }\n .order-sm-12 {\n order: 12;\n }\n}\n\n@media (min-width: 768px) {\n .col-md {\n flex-basis: 0;\n flex-grow: 1;\n max-width: 100%;\n }\n .col-md-auto {\n flex: 0 0 auto;\n width: auto;\n max-width: none;\n }\n .col-md-1 {\n flex: 0 0 8.333333%;\n max-width: 8.333333%;\n }\n .col-md-2 {\n flex: 0 0 16.666667%;\n max-width: 16.666667%;\n }\n .col-md-3 {\n flex: 0 0 25%;\n max-width: 25%;\n }\n .col-md-4 {\n flex: 0 0 33.333333%;\n max-width: 33.333333%;\n }\n .col-md-5 {\n flex: 0 0 41.666667%;\n max-width: 41.666667%;\n }\n .col-md-6 {\n flex: 0 0 50%;\n max-width: 50%;\n }\n .col-md-7 {\n flex: 0 0 58.333333%;\n max-width: 58.333333%;\n }\n .col-md-8 {\n flex: 0 0 66.666667%;\n max-width: 66.666667%;\n }\n .col-md-9 {\n flex: 0 0 75%;\n max-width: 75%;\n }\n .col-md-10 {\n flex: 0 0 83.333333%;\n max-width: 83.333333%;\n }\n .col-md-11 {\n flex: 0 0 91.666667%;\n max-width: 91.666667%;\n }\n .col-md-12 {\n flex: 0 0 100%;\n max-width: 100%;\n }\n .order-md-1 {\n order: 1;\n }\n .order-md-2 {\n order: 2;\n }\n .order-md-3 {\n order: 3;\n }\n .order-md-4 {\n order: 4;\n }\n .order-md-5 {\n order: 5;\n }\n .order-md-6 {\n order: 6;\n }\n .order-md-7 {\n order: 7;\n }\n .order-md-8 {\n order: 8;\n }\n .order-md-9 {\n order: 9;\n }\n .order-md-10 {\n order: 10;\n }\n .order-md-11 {\n order: 11;\n }\n .order-md-12 {\n order: 12;\n }\n}\n\n@media (min-width: 992px) {\n .col-lg {\n flex-basis: 0;\n flex-grow: 1;\n max-width: 100%;\n }\n .col-lg-auto {\n flex: 0 0 auto;\n width: auto;\n max-width: none;\n }\n .col-lg-1 {\n flex: 0 0 8.333333%;\n max-width: 8.333333%;\n }\n .col-lg-2 {\n flex: 0 0 16.666667%;\n max-width: 16.666667%;\n }\n .col-lg-3 {\n flex: 0 0 25%;\n max-width: 25%;\n }\n .col-lg-4 {\n flex: 0 0 33.333333%;\n max-width: 33.333333%;\n }\n .col-lg-5 {\n flex: 0 0 41.666667%;\n max-width: 41.666667%;\n }\n .col-lg-6 {\n flex: 0 0 50%;\n max-width: 50%;\n }\n .col-lg-7 {\n flex: 0 0 58.333333%;\n max-width: 58.333333%;\n }\n .col-lg-8 {\n flex: 0 0 66.666667%;\n max-width: 66.666667%;\n }\n .col-lg-9 {\n flex: 0 0 75%;\n max-width: 75%;\n }\n .col-lg-10 {\n flex: 0 0 83.333333%;\n max-width: 83.333333%;\n }\n .col-lg-11 {\n flex: 0 0 91.666667%;\n max-width: 91.666667%;\n }\n .col-lg-12 {\n flex: 0 0 100%;\n max-width: 100%;\n }\n .order-lg-1 {\n order: 1;\n }\n .order-lg-2 {\n order: 2;\n }\n .order-lg-3 {\n order: 3;\n }\n .order-lg-4 {\n order: 4;\n }\n .order-lg-5 {\n order: 5;\n }\n .order-lg-6 {\n order: 6;\n }\n .order-lg-7 {\n order: 7;\n }\n .order-lg-8 {\n order: 8;\n }\n .order-lg-9 {\n order: 9;\n }\n .order-lg-10 {\n order: 10;\n }\n .order-lg-11 {\n order: 11;\n }\n .order-lg-12 {\n order: 12;\n }\n}\n\n@media (min-width: 1200px) {\n .col-xl {\n flex-basis: 0;\n flex-grow: 1;\n max-width: 100%;\n }\n .col-xl-auto {\n flex: 0 0 auto;\n width: auto;\n max-width: none;\n }\n .col-xl-1 {\n flex: 0 0 8.333333%;\n max-width: 8.333333%;\n }\n .col-xl-2 {\n flex: 0 0 16.666667%;\n max-width: 16.666667%;\n }\n .col-xl-3 {\n flex: 0 0 25%;\n max-width: 25%;\n }\n .col-xl-4 {\n flex: 0 0 33.333333%;\n max-width: 33.333333%;\n }\n .col-xl-5 {\n flex: 0 0 41.666667%;\n max-width: 41.666667%;\n }\n .col-xl-6 {\n flex: 0 0 50%;\n max-width: 50%;\n }\n .col-xl-7 {\n flex: 0 0 58.333333%;\n max-width: 58.333333%;\n }\n .col-xl-8 {\n flex: 0 0 66.666667%;\n max-width: 66.666667%;\n }\n .col-xl-9 {\n flex: 0 0 75%;\n max-width: 75%;\n }\n .col-xl-10 {\n flex: 0 0 83.333333%;\n max-width: 83.333333%;\n }\n .col-xl-11 {\n flex: 0 0 91.666667%;\n max-width: 91.666667%;\n }\n .col-xl-12 {\n flex: 0 0 100%;\n max-width: 100%;\n }\n .order-xl-1 {\n order: 1;\n }\n .order-xl-2 {\n order: 2;\n }\n .order-xl-3 {\n order: 3;\n }\n .order-xl-4 {\n order: 4;\n }\n .order-xl-5 {\n order: 5;\n }\n .order-xl-6 {\n order: 6;\n }\n .order-xl-7 {\n order: 7;\n }\n .order-xl-8 {\n order: 8;\n }\n .order-xl-9 {\n order: 9;\n }\n .order-xl-10 {\n order: 10;\n }\n .order-xl-11 {\n order: 11;\n }\n .order-xl-12 {\n order: 12;\n }\n}\n\n.table {\n width: 100%;\n max-width: 100%;\n margin-bottom: 1rem;\n background-color: transparent;\n}\n\n.table th,\n.table td {\n padding: 0.75rem;\n vertical-align: top;\n border-top: 1px solid #e9ecef;\n}\n\n.table thead th {\n vertical-align: bottom;\n border-bottom: 2px solid #e9ecef;\n}\n\n.table tbody + tbody {\n border-top: 2px solid #e9ecef;\n}\n\n.table .table {\n background-color: #fff;\n}\n\n.table-sm th,\n.table-sm td {\n padding: 0.3rem;\n}\n\n.table-bordered {\n border: 1px solid #e9ecef;\n}\n\n.table-bordered th,\n.table-bordered td {\n border: 1px solid #e9ecef;\n}\n\n.table-bordered thead th,\n.table-bordered thead td {\n border-bottom-width: 2px;\n}\n\n.table-striped tbody tr:nth-of-type(odd) {\n background-color: rgba(0, 0, 0, 0.05);\n}\n\n.table-hover tbody tr:hover {\n background-color: rgba(0, 0, 0, 0.075);\n}\n\n.table-primary,\n.table-primary > th,\n.table-primary > td {\n background-color: #b8daff;\n}\n\n.table-hover .table-primary:hover {\n background-color: #9fcdff;\n}\n\n.table-hover .table-primary:hover > td,\n.table-hover .table-primary:hover > th {\n background-color: #9fcdff;\n}\n\n.table-secondary,\n.table-secondary > th,\n.table-secondary > td {\n background-color: #dddfe2;\n}\n\n.table-hover .table-secondary:hover {\n background-color: #cfd2d6;\n}\n\n.table-hover .table-secondary:hover > td,\n.table-hover .table-secondary:hover > th {\n background-color: #cfd2d6;\n}\n\n.table-success,\n.table-success > th,\n.table-success > td {\n background-color: #c3e6cb;\n}\n\n.table-hover .table-success:hover {\n background-color: #b1dfbb;\n}\n\n.table-hover .table-success:hover > td,\n.table-hover .table-success:hover > th {\n background-color: #b1dfbb;\n}\n\n.table-info,\n.table-info > th,\n.table-info > td {\n background-color: #bee5eb;\n}\n\n.table-hover .table-info:hover {\n background-color: #abdde5;\n}\n\n.table-hover .table-info:hover > td,\n.table-hover .table-info:hover > th {\n background-color: #abdde5;\n}\n\n.table-warning,\n.table-warning > th,\n.table-warning > td {\n background-color: #ffeeba;\n}\n\n.table-hover .table-warning:hover {\n background-color: #ffe8a1;\n}\n\n.table-hover .table-warning:hover > td,\n.table-hover .table-warning:hover > th {\n background-color: #ffe8a1;\n}\n\n.table-danger,\n.table-danger > th,\n.table-danger > td {\n background-color: #f5c6cb;\n}\n\n.table-hover .table-danger:hover {\n background-color: #f1b0b7;\n}\n\n.table-hover .table-danger:hover > td,\n.table-hover .table-danger:hover > th {\n background-color: #f1b0b7;\n}\n\n.table-light,\n.table-light > th,\n.table-light > td {\n background-color: #fdfdfe;\n}\n\n.table-hover .table-light:hover {\n background-color: #ececf6;\n}\n\n.table-hover .table-light:hover > td,\n.table-hover .table-light:hover > th {\n background-color: #ececf6;\n}\n\n.table-dark,\n.table-dark > th,\n.table-dark > td {\n background-color: #c6c8ca;\n}\n\n.table-hover .table-dark:hover {\n background-color: #b9bbbe;\n}\n\n.table-hover .table-dark:hover > td,\n.table-hover .table-dark:hover > th {\n background-color: #b9bbbe;\n}\n\n.table-active,\n.table-active > th,\n.table-active > td {\n background-color: rgba(0, 0, 0, 0.075);\n}\n\n.table-hover .table-active:hover {\n background-color: rgba(0, 0, 0, 0.075);\n}\n\n.table-hover .table-active:hover > td,\n.table-hover .table-active:hover > th {\n background-color: rgba(0, 0, 0, 0.075);\n}\n\n.thead-inverse th {\n color: #fff;\n background-color: #212529;\n}\n\n.thead-default th {\n color: #495057;\n background-color: #e9ecef;\n}\n\n.table-inverse {\n color: #fff;\n background-color: #212529;\n}\n\n.table-inverse th,\n.table-inverse td,\n.table-inverse thead th {\n border-color: #32383e;\n}\n\n.table-inverse.table-bordered {\n border: 0;\n}\n\n.table-inverse.table-striped tbody tr:nth-of-type(odd) {\n background-color: rgba(255, 255, 255, 0.05);\n}\n\n.table-inverse.table-hover tbody tr:hover {\n background-color: rgba(255, 255, 255, 0.075);\n}\n\n@media (max-width: 991px) {\n .table-responsive {\n display: block;\n width: 100%;\n overflow-x: auto;\n -ms-overflow-style: -ms-autohiding-scrollbar;\n }\n .table-responsive.table-bordered {\n border: 0;\n }\n}\n\n.form-control {\n display: block;\n width: 100%;\n padding: 0.5rem 0.75rem;\n font-size: 1rem;\n line-height: 1.25;\n color: #495057;\n background-color: #fff;\n background-image: none;\n background-clip: padding-box;\n border: 1px solid rgba(0, 0, 0, 0.15);\n border-radius: 0.25rem;\n transition: border-color ease-in-out 0.15s, box-shadow ease-in-out 0.15s;\n}\n\n.form-control::-ms-expand {\n background-color: transparent;\n border: 0;\n}\n\n.form-control:focus {\n color: #495057;\n background-color: #fff;\n border-color: #80bdff;\n outline: none;\n}\n\n.form-control::placeholder {\n color: #868e96;\n opacity: 1;\n}\n\n.form-control:disabled, .form-control[readonly] {\n background-color: #e9ecef;\n opacity: 1;\n}\n\nselect.form-control:not([size]):not([multiple]) {\n height: calc(2.25rem + 2px);\n}\n\nselect.form-control:focus::-ms-value {\n color: #495057;\n background-color: #fff;\n}\n\n.form-control-file,\n.form-control-range {\n display: block;\n}\n\n.col-form-label {\n padding-top: calc(0.5rem - 1px * 2);\n padding-bottom: calc(0.5rem - 1px * 2);\n margin-bottom: 0;\n}\n\n.col-form-label-lg {\n padding-top: calc(0.5rem - 1px * 2);\n padding-bottom: calc(0.5rem - 1px * 2);\n font-size: 1.25rem;\n}\n\n.col-form-label-sm {\n padding-top: calc(0.25rem - 1px * 2);\n padding-bottom: calc(0.25rem - 1px * 2);\n font-size: 0.875rem;\n}\n\n.col-form-legend {\n padding-top: 0.5rem;\n padding-bottom: 0.5rem;\n margin-bottom: 0;\n font-size: 1rem;\n}\n\n.form-control-plaintext {\n padding-top: 0.5rem;\n padding-bottom: 0.5rem;\n margin-bottom: 0;\n line-height: 1.25;\n border: solid transparent;\n border-width: 1px 0;\n}\n\n.form-control-plaintext.form-control-sm, .input-group-sm > .form-control-plaintext.form-control,\n.input-group-sm > .form-control-plaintext.input-group-addon,\n.input-group-sm > .input-group-btn > .form-control-plaintext.btn, .form-control-plaintext.form-control-lg, .input-group-lg > .form-control-plaintext.form-control,\n.input-group-lg > .form-control-plaintext.input-group-addon,\n.input-group-lg > .input-group-btn > .form-control-plaintext.btn {\n padding-right: 0;\n padding-left: 0;\n}\n\n.form-control-sm, .input-group-sm > .form-control,\n.input-group-sm > .input-group-addon,\n.input-group-sm > .input-group-btn > .btn {\n padding: 0.25rem 0.5rem;\n font-size: 0.875rem;\n line-height: 1.5;\n border-radius: 0.2rem;\n}\n\nselect.form-control-sm:not([size]):not([multiple]), .input-group-sm > select.form-control:not([size]):not([multiple]),\n.input-group-sm > select.input-group-addon:not([size]):not([multiple]),\n.input-group-sm > .input-group-btn > select.btn:not([size]):not([multiple]) {\n height: calc(1.8125rem + 2px);\n}\n\n.form-control-lg, .input-group-lg > .form-control,\n.input-group-lg > .input-group-addon,\n.input-group-lg > .input-group-btn > .btn {\n padding: 0.5rem 1rem;\n font-size: 1.25rem;\n line-height: 1.5;\n border-radius: 0.3rem;\n}\n\nselect.form-control-lg:not([size]):not([multiple]), .input-group-lg > select.form-control:not([size]):not([multiple]),\n.input-group-lg > select.input-group-addon:not([size]):not([multiple]),\n.input-group-lg > .input-group-btn > select.btn:not([size]):not([multiple]) {\n height: calc(2.3125rem + 2px);\n}\n\n.form-group {\n margin-bottom: 1rem;\n}\n\n.form-text {\n display: block;\n margin-top: 0.25rem;\n}\n\n.form-row {\n display: flex;\n flex-wrap: wrap;\n margin-right: -5px;\n margin-left: -5px;\n}\n\n.form-row > .col,\n.form-row > [class*=\"col-\"] {\n padding-right: 5px;\n padding-left: 5px;\n}\n\n.form-check {\n position: relative;\n display: block;\n margin-bottom: 0.5rem;\n}\n\n.form-check.disabled .form-check-label {\n color: #868e96;\n}\n\n.form-check-label {\n padding-left: 1.25rem;\n margin-bottom: 0;\n}\n\n.form-check-input {\n position: absolute;\n margin-top: 0.25rem;\n margin-left: -1.25rem;\n}\n\n.form-check-input:only-child {\n position: static;\n}\n\n.form-check-inline {\n display: inline-block;\n}\n\n.form-check-inline .form-check-label {\n vertical-align: middle;\n}\n\n.form-check-inline + .form-check-inline {\n margin-left: 0.75rem;\n}\n\n.invalid-feedback {\n display: none;\n margin-top: .25rem;\n font-size: .875rem;\n color: #dc3545;\n}\n\n.invalid-tooltip {\n position: absolute;\n top: 100%;\n z-index: 5;\n display: none;\n width: 250px;\n padding: .5rem;\n margin-top: .1rem;\n font-size: .875rem;\n line-height: 1;\n color: #fff;\n background-color: rgba(220, 53, 69, 0.8);\n border-radius: .2rem;\n}\n\n.was-validated .form-control:valid, .form-control.is-valid, .was-validated\n.custom-select:valid,\n.custom-select.is-valid {\n border-color: #28a745;\n}\n\n.was-validated .form-control:valid:focus, .form-control.is-valid:focus, .was-validated\n.custom-select:valid:focus,\n.custom-select.is-valid:focus {\n box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.25);\n}\n\n.was-validated .form-control:valid ~ .invalid-feedback,\n.was-validated .form-control:valid ~ .invalid-tooltip, .form-control.is-valid ~ .invalid-feedback,\n.form-control.is-valid ~ .invalid-tooltip, .was-validated\n.custom-select:valid ~ .invalid-feedback,\n.was-validated\n.custom-select:valid ~ .invalid-tooltip,\n.custom-select.is-valid ~ .invalid-feedback,\n.custom-select.is-valid ~ .invalid-tooltip {\n display: block;\n}\n\n.was-validated .form-check-input:valid + .form-check-label, .form-check-input.is-valid + .form-check-label {\n color: #28a745;\n}\n\n.was-validated .custom-control-input:valid ~ .custom-control-indicator, .custom-control-input.is-valid ~ .custom-control-indicator {\n background-color: rgba(40, 167, 69, 0.25);\n}\n\n.was-validated .custom-control-input:valid ~ .custom-control-description, .custom-control-input.is-valid ~ .custom-control-description {\n color: #28a745;\n}\n\n.was-validated .custom-file-input:valid ~ .custom-file-control, .custom-file-input.is-valid ~ .custom-file-control {\n border-color: #28a745;\n}\n\n.was-validated .custom-file-input:valid ~ .custom-file-control::before, .custom-file-input.is-valid ~ .custom-file-control::before {\n border-color: inherit;\n}\n\n.was-validated .custom-file-input:valid:focus, .custom-file-input.is-valid:focus {\n box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.25);\n}\n\n.was-validated .form-control:invalid, .form-control.is-invalid, .was-validated\n.custom-select:invalid,\n.custom-select.is-invalid {\n border-color: #dc3545;\n}\n\n.was-validated .form-control:invalid:focus, .form-control.is-invalid:focus, .was-validated\n.custom-select:invalid:focus,\n.custom-select.is-invalid:focus {\n box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.25);\n}\n\n.was-validated .form-control:invalid ~ .invalid-feedback,\n.was-validated .form-control:invalid ~ .invalid-tooltip, .form-control.is-invalid ~ .invalid-feedback,\n.form-control.is-invalid ~ .invalid-tooltip, .was-validated\n.custom-select:invalid ~ .invalid-feedback,\n.was-validated\n.custom-select:invalid ~ .invalid-tooltip,\n.custom-select.is-invalid ~ .invalid-feedback,\n.custom-select.is-invalid ~ .invalid-tooltip {\n display: block;\n}\n\n.was-validated .form-check-input:invalid + .form-check-label, .form-check-input.is-invalid + .form-check-label {\n color: #dc3545;\n}\n\n.was-validated .custom-control-input:invalid ~ .custom-control-indicator, .custom-control-input.is-invalid ~ .custom-control-indicator {\n background-color: rgba(220, 53, 69, 0.25);\n}\n\n.was-validated .custom-control-input:invalid ~ .custom-control-description, .custom-control-input.is-invalid ~ .custom-control-description {\n color: #dc3545;\n}\n\n.was-validated .custom-file-input:invalid ~ .custom-file-control, .custom-file-input.is-invalid ~ .custom-file-control {\n border-color: #dc3545;\n}\n\n.was-validated .custom-file-input:invalid ~ .custom-file-control::before, .custom-file-input.is-invalid ~ .custom-file-control::before {\n border-color: inherit;\n}\n\n.was-validated .custom-file-input:invalid:focus, .custom-file-input.is-invalid:focus {\n box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.25);\n}\n\n.form-inline {\n display: flex;\n flex-flow: row wrap;\n align-items: center;\n}\n\n.form-inline .form-check {\n width: 100%;\n}\n\n@media (min-width: 576px) {\n .form-inline label {\n display: flex;\n align-items: center;\n justify-content: center;\n margin-bottom: 0;\n }\n .form-inline .form-group {\n display: flex;\n flex: 0 0 auto;\n flex-flow: row wrap;\n align-items: center;\n margin-bottom: 0;\n }\n .form-inline .form-control {\n display: inline-block;\n width: auto;\n vertical-align: middle;\n }\n .form-inline .form-control-plaintext {\n display: inline-block;\n }\n .form-inline .input-group {\n width: auto;\n }\n .form-inline .form-control-label {\n margin-bottom: 0;\n vertical-align: middle;\n }\n .form-inline .form-check {\n display: flex;\n align-items: center;\n justify-content: center;\n width: auto;\n margin-top: 0;\n margin-bottom: 0;\n }\n .form-inline .form-check-label {\n padding-left: 0;\n }\n .form-inline .form-check-input {\n position: relative;\n margin-top: 0;\n margin-right: 0.25rem;\n margin-left: 0;\n }\n .form-inline .custom-control {\n display: flex;\n align-items: center;\n justify-content: center;\n padding-left: 0;\n }\n .form-inline .custom-control-indicator {\n position: static;\n display: inline-block;\n margin-right: 0.25rem;\n vertical-align: text-bottom;\n }\n .form-inline .has-feedback .form-control-feedback {\n top: 0;\n }\n}\n\n.btn {\n display: inline-block;\n font-weight: normal;\n text-align: center;\n white-space: nowrap;\n vertical-align: middle;\n user-select: none;\n border: 1px solid transparent;\n padding: 0.5rem 0.75rem;\n font-size: 1rem;\n line-height: 1.25;\n border-radius: 0.25rem;\n transition: all 0.15s ease-in-out;\n}\n\n.btn:focus, .btn:hover {\n text-decoration: none;\n}\n\n.btn:focus, .btn.focus {\n outline: 0;\n box-shadow: 0 0 0 3px rgba(0, 123, 255, 0.25);\n}\n\n.btn.disabled, .btn:disabled {\n opacity: .65;\n}\n\n.btn:active, .btn.active {\n background-image: none;\n}\n\na.btn.disabled,\nfieldset[disabled] a.btn {\n pointer-events: none;\n}\n\n.btn-primary {\n color: #fff;\n background-color: #007bff;\n border-color: #007bff;\n}\n\n.btn-primary:hover {\n color: #fff;\n background-color: #0069d9;\n border-color: #0062cc;\n}\n\n.btn-primary:focus, .btn-primary.focus {\n box-shadow: 0 0 0 3px rgba(0, 123, 255, 0.5);\n}\n\n.btn-primary.disabled, .btn-primary:disabled {\n background-color: #007bff;\n border-color: #007bff;\n}\n\n.btn-primary:active, .btn-primary.active,\n.show > .btn-primary.dropdown-toggle {\n background-color: #0069d9;\n background-image: none;\n border-color: #0062cc;\n}\n\n.btn-secondary {\n color: #fff;\n background-color: #868e96;\n border-color: #868e96;\n}\n\n.btn-secondary:hover {\n color: #fff;\n background-color: #727b84;\n border-color: #6c757d;\n}\n\n.btn-secondary:focus, .btn-secondary.focus {\n box-shadow: 0 0 0 3px rgba(134, 142, 150, 0.5);\n}\n\n.btn-secondary.disabled, .btn-secondary:disabled {\n background-color: #868e96;\n border-color: #868e96;\n}\n\n.btn-secondary:active, .btn-secondary.active,\n.show > .btn-secondary.dropdown-toggle {\n background-color: #727b84;\n background-image: none;\n border-color: #6c757d;\n}\n\n.btn-success {\n color: #fff;\n background-color: #28a745;\n border-color: #28a745;\n}\n\n.btn-success:hover {\n color: #fff;\n background-color: #218838;\n border-color: #1e7e34;\n}\n\n.btn-success:focus, .btn-success.focus {\n box-shadow: 0 0 0 3px rgba(40, 167, 69, 0.5);\n}\n\n.btn-success.disabled, .btn-success:disabled {\n background-color: #28a745;\n border-color: #28a745;\n}\n\n.btn-success:active, .btn-success.active,\n.show > .btn-success.dropdown-toggle {\n background-color: #218838;\n background-image: none;\n border-color: #1e7e34;\n}\n\n.btn-info {\n color: #fff;\n background-color: #17a2b8;\n border-color: #17a2b8;\n}\n\n.btn-info:hover {\n color: #fff;\n background-color: #138496;\n border-color: #117a8b;\n}\n\n.btn-info:focus, .btn-info.focus {\n box-shadow: 0 0 0 3px rgba(23, 162, 184, 0.5);\n}\n\n.btn-info.disabled, .btn-info:disabled {\n background-color: #17a2b8;\n border-color: #17a2b8;\n}\n\n.btn-info:active, .btn-info.active,\n.show > .btn-info.dropdown-toggle {\n background-color: #138496;\n background-image: none;\n border-color: #117a8b;\n}\n\n.btn-warning {\n color: #111;\n background-color: #ffc107;\n border-color: #ffc107;\n}\n\n.btn-warning:hover {\n color: #111;\n background-color: #e0a800;\n border-color: #d39e00;\n}\n\n.btn-warning:focus, .btn-warning.focus {\n box-shadow: 0 0 0 3px rgba(255, 193, 7, 0.5);\n}\n\n.btn-warning.disabled, .btn-warning:disabled {\n background-color: #ffc107;\n border-color: #ffc107;\n}\n\n.btn-warning:active, .btn-warning.active,\n.show > .btn-warning.dropdown-toggle {\n background-color: #e0a800;\n background-image: none;\n border-color: #d39e00;\n}\n\n.btn-danger {\n color: #fff;\n background-color: #dc3545;\n border-color: #dc3545;\n}\n\n.btn-danger:hover {\n color: #fff;\n background-color: #c82333;\n border-color: #bd2130;\n}\n\n.btn-danger:focus, .btn-danger.focus {\n box-shadow: 0 0 0 3px rgba(220, 53, 69, 0.5);\n}\n\n.btn-danger.disabled, .btn-danger:disabled {\n background-color: #dc3545;\n border-color: #dc3545;\n}\n\n.btn-danger:active, .btn-danger.active,\n.show > .btn-danger.dropdown-toggle {\n background-color: #c82333;\n background-image: none;\n border-color: #bd2130;\n}\n\n.btn-light {\n color: #111;\n background-color: #f8f9fa;\n border-color: #f8f9fa;\n}\n\n.btn-light:hover {\n color: #111;\n background-color: #e2e6ea;\n border-color: #dae0e5;\n}\n\n.btn-light:focus, .btn-light.focus {\n box-shadow: 0 0 0 3px rgba(248, 249, 250, 0.5);\n}\n\n.btn-light.disabled, .btn-light:disabled {\n background-color: #f8f9fa;\n border-color: #f8f9fa;\n}\n\n.btn-light:active, .btn-light.active,\n.show > .btn-light.dropdown-toggle {\n background-color: #e2e6ea;\n background-image: none;\n border-color: #dae0e5;\n}\n\n.btn-dark {\n color: #fff;\n background-color: #343a40;\n border-color: #343a40;\n}\n\n.btn-dark:hover {\n color: #fff;\n background-color: #23272b;\n border-color: #1d2124;\n}\n\n.btn-dark:focus, .btn-dark.focus {\n box-shadow: 0 0 0 3px rgba(52, 58, 64, 0.5);\n}\n\n.btn-dark.disabled, .btn-dark:disabled {\n background-color: #343a40;\n border-color: #343a40;\n}\n\n.btn-dark:active, .btn-dark.active,\n.show > .btn-dark.dropdown-toggle {\n background-color: #23272b;\n background-image: none;\n border-color: #1d2124;\n}\n\n.btn-outline-primary {\n color: #007bff;\n background-color: transparent;\n background-image: none;\n border-color: #007bff;\n}\n\n.btn-outline-primary:hover {\n color: #fff;\n background-color: #007bff;\n border-color: #007bff;\n}\n\n.btn-outline-primary:focus, .btn-outline-primary.focus {\n box-shadow: 0 0 0 3px rgba(0, 123, 255, 0.5);\n}\n\n.btn-outline-primary.disabled, .btn-outline-primary:disabled {\n color: #007bff;\n background-color: transparent;\n}\n\n.btn-outline-primary:active, .btn-outline-primary.active,\n.show > .btn-outline-primary.dropdown-toggle {\n color: #fff;\n background-color: #007bff;\n border-color: #007bff;\n}\n\n.btn-outline-secondary {\n color: #868e96;\n background-color: transparent;\n background-image: none;\n border-color: #868e96;\n}\n\n.btn-outline-secondary:hover {\n color: #fff;\n background-color: #868e96;\n border-color: #868e96;\n}\n\n.btn-outline-secondary:focus, .btn-outline-secondary.focus {\n box-shadow: 0 0 0 3px rgba(134, 142, 150, 0.5);\n}\n\n.btn-outline-secondary.disabled, .btn-outline-secondary:disabled {\n color: #868e96;\n background-color: transparent;\n}\n\n.btn-outline-secondary:active, .btn-outline-secondary.active,\n.show > .btn-outline-secondary.dropdown-toggle {\n color: #fff;\n background-color: #868e96;\n border-color: #868e96;\n}\n\n.btn-outline-success {\n color: #28a745;\n background-color: transparent;\n background-image: none;\n border-color: #28a745;\n}\n\n.btn-outline-success:hover {\n color: #fff;\n background-color: #28a745;\n border-color: #28a745;\n}\n\n.btn-outline-success:focus, .btn-outline-success.focus {\n box-shadow: 0 0 0 3px rgba(40, 167, 69, 0.5);\n}\n\n.btn-outline-success.disabled, .btn-outline-success:disabled {\n color: #28a745;\n background-color: transparent;\n}\n\n.btn-outline-success:active, .btn-outline-success.active,\n.show > .btn-outline-success.dropdown-toggle {\n color: #fff;\n background-color: #28a745;\n border-color: #28a745;\n}\n\n.btn-outline-info {\n color: #17a2b8;\n background-color: transparent;\n background-image: none;\n border-color: #17a2b8;\n}\n\n.btn-outline-info:hover {\n color: #fff;\n background-color: #17a2b8;\n border-color: #17a2b8;\n}\n\n.btn-outline-info:focus, .btn-outline-info.focus {\n box-shadow: 0 0 0 3px rgba(23, 162, 184, 0.5);\n}\n\n.btn-outline-info.disabled, .btn-outline-info:disabled {\n color: #17a2b8;\n background-color: transparent;\n}\n\n.btn-outline-info:active, .btn-outline-info.active,\n.show > .btn-outline-info.dropdown-toggle {\n color: #fff;\n background-color: #17a2b8;\n border-color: #17a2b8;\n}\n\n.btn-outline-warning {\n color: #ffc107;\n background-color: transparent;\n background-image: none;\n border-color: #ffc107;\n}\n\n.btn-outline-warning:hover {\n color: #fff;\n background-color: #ffc107;\n border-color: #ffc107;\n}\n\n.btn-outline-warning:focus, .btn-outline-warning.focus {\n box-shadow: 0 0 0 3px rgba(255, 193, 7, 0.5);\n}\n\n.btn-outline-warning.disabled, .btn-outline-warning:disabled {\n color: #ffc107;\n background-color: transparent;\n}\n\n.btn-outline-warning:active, .btn-outline-warning.active,\n.show > .btn-outline-warning.dropdown-toggle {\n color: #fff;\n background-color: #ffc107;\n border-color: #ffc107;\n}\n\n.btn-outline-danger {\n color: #dc3545;\n background-color: transparent;\n background-image: none;\n border-color: #dc3545;\n}\n\n.btn-outline-danger:hover {\n color: #fff;\n background-color: #dc3545;\n border-color: #dc3545;\n}\n\n.btn-outline-danger:focus, .btn-outline-danger.focus {\n box-shadow: 0 0 0 3px rgba(220, 53, 69, 0.5);\n}\n\n.btn-outline-danger.disabled, .btn-outline-danger:disabled {\n color: #dc3545;\n background-color: transparent;\n}\n\n.btn-outline-danger:active, .btn-outline-danger.active,\n.show > .btn-outline-danger.dropdown-toggle {\n color: #fff;\n background-color: #dc3545;\n border-color: #dc3545;\n}\n\n.btn-outline-light {\n color: #f8f9fa;\n background-color: transparent;\n background-image: none;\n border-color: #f8f9fa;\n}\n\n.btn-outline-light:hover {\n color: #fff;\n background-color: #f8f9fa;\n border-color: #f8f9fa;\n}\n\n.btn-outline-light:focus, .btn-outline-light.focus {\n box-shadow: 0 0 0 3px rgba(248, 249, 250, 0.5);\n}\n\n.btn-outline-light.disabled, .btn-outline-light:disabled {\n color: #f8f9fa;\n background-color: transparent;\n}\n\n.btn-outline-light:active, .btn-outline-light.active,\n.show > .btn-outline-light.dropdown-toggle {\n color: #fff;\n background-color: #f8f9fa;\n border-color: #f8f9fa;\n}\n\n.btn-outline-dark {\n color: #343a40;\n background-color: transparent;\n background-image: none;\n border-color: #343a40;\n}\n\n.btn-outline-dark:hover {\n color: #fff;\n background-color: #343a40;\n border-color: #343a40;\n}\n\n.btn-outline-dark:focus, .btn-outline-dark.focus {\n box-shadow: 0 0 0 3px rgba(52, 58, 64, 0.5);\n}\n\n.btn-outline-dark.disabled, .btn-outline-dark:disabled {\n color: #343a40;\n background-color: transparent;\n}\n\n.btn-outline-dark:active, .btn-outline-dark.active,\n.show > .btn-outline-dark.dropdown-toggle {\n color: #fff;\n background-color: #343a40;\n border-color: #343a40;\n}\n\n.btn-link {\n font-weight: normal;\n color: #007bff;\n border-radius: 0;\n}\n\n.btn-link, .btn-link:active, .btn-link.active, .btn-link:disabled {\n background-color: transparent;\n}\n\n.btn-link, .btn-link:focus, .btn-link:active {\n border-color: transparent;\n box-shadow: none;\n}\n\n.btn-link:hover {\n border-color: transparent;\n}\n\n.btn-link:focus, .btn-link:hover {\n color: #0056b3;\n text-decoration: underline;\n background-color: transparent;\n}\n\n.btn-link:disabled {\n color: #868e96;\n}\n\n.btn-link:disabled:focus, .btn-link:disabled:hover {\n text-decoration: none;\n}\n\n.btn-lg, .btn-group-lg > .btn {\n padding: 0.5rem 1rem;\n font-size: 1.25rem;\n line-height: 1.5;\n border-radius: 0.3rem;\n}\n\n.btn-sm, .btn-group-sm > .btn {\n padding: 0.25rem 0.5rem;\n font-size: 0.875rem;\n line-height: 1.5;\n border-radius: 0.2rem;\n}\n\n.btn-block {\n display: block;\n width: 100%;\n}\n\n.btn-block + .btn-block {\n margin-top: 0.5rem;\n}\n\ninput[type=\"submit\"].btn-block,\ninput[type=\"reset\"].btn-block,\ninput[type=\"button\"].btn-block {\n width: 100%;\n}\n\n.fade {\n opacity: 0;\n transition: opacity 0.15s linear;\n}\n\n.fade.show {\n opacity: 1;\n}\n\n.collapse {\n display: none;\n}\n\n.collapse.show {\n display: block;\n}\n\ntr.collapse.show {\n display: table-row;\n}\n\ntbody.collapse.show {\n display: table-row-group;\n}\n\n.collapsing {\n position: relative;\n height: 0;\n overflow: hidden;\n transition: height 0.35s ease;\n}\n\n.dropup,\n.dropdown {\n position: relative;\n}\n\n.dropdown-toggle::after {\n display: inline-block;\n width: 0;\n height: 0;\n margin-left: 0.255em;\n vertical-align: 0.255em;\n content: \"\";\n border-top: 0.3em solid;\n border-right: 0.3em solid transparent;\n border-left: 0.3em solid transparent;\n}\n\n.dropdown-toggle:empty::after {\n margin-left: 0;\n}\n\n.dropup .dropdown-menu {\n margin-top: 0;\n margin-bottom: 0.125rem;\n}\n\n.dropup .dropdown-toggle::after {\n border-top: 0;\n border-bottom: 0.3em solid;\n}\n\n.dropdown-menu {\n position: absolute;\n top: 100%;\n left: 0;\n z-index: 1000;\n display: none;\n float: left;\n min-width: 10rem;\n padding: 0.5rem 0;\n margin: 0.125rem 0 0;\n font-size: 1rem;\n color: #212529;\n text-align: left;\n list-style: none;\n background-color: #fff;\n background-clip: padding-box;\n border: 1px solid rgba(0, 0, 0, 0.15);\n border-radius: 0.25rem;\n}\n\n.dropdown-divider {\n height: 0;\n margin: 0.5rem 0;\n overflow: hidden;\n border-top: 1px solid #e9ecef;\n}\n\n.dropdown-item {\n display: block;\n width: 100%;\n padding: 0.25rem 1.5rem;\n clear: both;\n font-weight: normal;\n color: #212529;\n text-align: inherit;\n white-space: nowrap;\n background: none;\n border: 0;\n}\n\n.dropdown-item:focus, .dropdown-item:hover {\n color: #16181b;\n text-decoration: none;\n background-color: #f8f9fa;\n}\n\n.dropdown-item.active, .dropdown-item:active {\n color: #fff;\n text-decoration: none;\n background-color: #007bff;\n}\n\n.dropdown-item.disabled, .dropdown-item:disabled {\n color: #868e96;\n background-color: transparent;\n}\n\n.show > a {\n outline: 0;\n}\n\n.dropdown-menu.show {\n display: block;\n}\n\n.dropdown-header {\n display: block;\n padding: 0.5rem 1.5rem;\n margin-bottom: 0;\n font-size: 0.875rem;\n color: #868e96;\n white-space: nowrap;\n}\n\n.btn-group,\n.btn-group-vertical {\n position: relative;\n display: inline-flex;\n vertical-align: middle;\n}\n\n.btn-group > .btn,\n.btn-group-vertical > .btn {\n position: relative;\n flex: 0 1 auto;\n margin-bottom: 0;\n}\n\n.btn-group > .btn:hover,\n.btn-group-vertical > .btn:hover {\n z-index: 2;\n}\n\n.btn-group > .btn:focus, .btn-group > .btn:active, .btn-group > .btn.active,\n.btn-group-vertical > .btn:focus,\n.btn-group-vertical > .btn:active,\n.btn-group-vertical > .btn.active {\n z-index: 2;\n}\n\n.btn-group .btn + .btn,\n.btn-group .btn + .btn-group,\n.btn-group .btn-group + .btn,\n.btn-group .btn-group + .btn-group,\n.btn-group-vertical .btn + .btn,\n.btn-group-vertical .btn + .btn-group,\n.btn-group-vertical .btn-group + .btn,\n.btn-group-vertical .btn-group + .btn-group {\n margin-left: -1px;\n}\n\n.btn-toolbar {\n display: flex;\n flex-wrap: wrap;\n justify-content: flex-start;\n}\n\n.btn-toolbar .input-group {\n width: auto;\n}\n\n.btn-group > .btn:not(:first-child):not(:last-child):not(.dropdown-toggle) {\n border-radius: 0;\n}\n\n.btn-group > .btn:first-child {\n margin-left: 0;\n}\n\n.btn-group > .btn:first-child:not(:last-child):not(.dropdown-toggle) {\n border-top-right-radius: 0;\n border-bottom-right-radius: 0;\n}\n\n.btn-group > .btn:last-child:not(:first-child),\n.btn-group > .dropdown-toggle:not(:first-child) {\n border-top-left-radius: 0;\n border-bottom-left-radius: 0;\n}\n\n.btn-group > .btn-group {\n float: left;\n}\n\n.btn-group > .btn-group:not(:first-child):not(:last-child) > .btn {\n border-radius: 0;\n}\n\n.btn-group > .btn-group:first-child:not(:last-child) > .btn:last-child,\n.btn-group > .btn-group:first-child:not(:last-child) > .dropdown-toggle {\n border-top-right-radius: 0;\n border-bottom-right-radius: 0;\n}\n\n.btn-group > .btn-group:last-child:not(:first-child) > .btn:first-child {\n border-top-left-radius: 0;\n border-bottom-left-radius: 0;\n}\n\n.btn + .dropdown-toggle-split {\n padding-right: 0.5625rem;\n padding-left: 0.5625rem;\n}\n\n.btn + .dropdown-toggle-split::after {\n margin-left: 0;\n}\n\n.btn-sm + .dropdown-toggle-split, .btn-group-sm > .btn + .dropdown-toggle-split {\n padding-right: 0.375rem;\n padding-left: 0.375rem;\n}\n\n.btn-lg + .dropdown-toggle-split, .btn-group-lg > .btn + .dropdown-toggle-split {\n padding-right: 0.75rem;\n padding-left: 0.75rem;\n}\n\n.btn-group-vertical {\n display: inline-flex;\n flex-direction: column;\n align-items: flex-start;\n justify-content: center;\n}\n\n.btn-group-vertical .btn,\n.btn-group-vertical .btn-group {\n width: 100%;\n}\n\n.btn-group-vertical > .btn + .btn,\n.btn-group-vertical > .btn + .btn-group,\n.btn-group-vertical > .btn-group + .btn,\n.btn-group-vertical > .btn-group + .btn-group {\n margin-top: -1px;\n margin-left: 0;\n}\n\n.btn-group-vertical > .btn:not(:first-child):not(:last-child) {\n border-radius: 0;\n}\n\n.btn-group-vertical > .btn:first-child:not(:last-child) {\n border-bottom-right-radius: 0;\n border-bottom-left-radius: 0;\n}\n\n.btn-group-vertical > .btn:last-child:not(:first-child) {\n border-top-left-radius: 0;\n border-top-right-radius: 0;\n}\n\n.btn-group-vertical > .btn-group:not(:first-child):not(:last-child) > .btn {\n border-radius: 0;\n}\n\n.btn-group-vertical > .btn-group:first-child:not(:last-child) > .btn:last-child,\n.btn-group-vertical > .btn-group:first-child:not(:last-child) > .dropdown-toggle {\n border-bottom-right-radius: 0;\n border-bottom-left-radius: 0;\n}\n\n.btn-group-vertical > .btn-group:last-child:not(:first-child) > .btn:first-child {\n border-top-left-radius: 0;\n border-top-right-radius: 0;\n}\n\n[data-toggle=\"buttons\"] > .btn input[type=\"radio\"],\n[data-toggle=\"buttons\"] > .btn input[type=\"checkbox\"],\n[data-toggle=\"buttons\"] > .btn-group > .btn input[type=\"radio\"],\n[data-toggle=\"buttons\"] > .btn-group > .btn input[type=\"checkbox\"] {\n position: absolute;\n clip: rect(0, 0, 0, 0);\n pointer-events: none;\n}\n\n.input-group {\n position: relative;\n display: flex;\n width: 100%;\n}\n\n.input-group .form-control {\n position: relative;\n z-index: 2;\n flex: 1 1 auto;\n width: 1%;\n margin-bottom: 0;\n}\n\n.input-group .form-control:focus, .input-group .form-control:active, .input-group .form-control:hover {\n z-index: 3;\n}\n\n.input-group-addon,\n.input-group-btn,\n.input-group .form-control {\n display: flex;\n align-items: center;\n}\n\n.input-group-addon:not(:first-child):not(:last-child),\n.input-group-btn:not(:first-child):not(:last-child),\n.input-group .form-control:not(:first-child):not(:last-child) {\n border-radius: 0;\n}\n\n.input-group-addon,\n.input-group-btn {\n white-space: nowrap;\n vertical-align: middle;\n}\n\n.input-group-addon {\n padding: 0.5rem 0.75rem;\n margin-bottom: 0;\n font-size: 1rem;\n font-weight: normal;\n line-height: 1.25;\n color: #495057;\n text-align: center;\n background-color: #e9ecef;\n border: 1px solid rgba(0, 0, 0, 0.15);\n border-radius: 0.25rem;\n}\n\n.input-group-addon.form-control-sm,\n.input-group-sm > .input-group-addon,\n.input-group-sm > .input-group-btn > .input-group-addon.btn {\n padding: 0.25rem 0.5rem;\n font-size: 0.875rem;\n border-radius: 0.2rem;\n}\n\n.input-group-addon.form-control-lg,\n.input-group-lg > .input-group-addon,\n.input-group-lg > .input-group-btn > .input-group-addon.btn {\n padding: 0.5rem 1rem;\n font-size: 1.25rem;\n border-radius: 0.3rem;\n}\n\n.input-group-addon input[type=\"radio\"],\n.input-group-addon input[type=\"checkbox\"] {\n margin-top: 0;\n}\n\n.input-group .form-control:not(:last-child),\n.input-group-addon:not(:last-child),\n.input-group-btn:not(:last-child) > .btn,\n.input-group-btn:not(:last-child) > .btn-group > .btn,\n.input-group-btn:not(:last-child) > .dropdown-toggle,\n.input-group-btn:not(:first-child) > .btn:not(:last-child):not(.dropdown-toggle),\n.input-group-btn:not(:first-child) > .btn-group:not(:last-child) > .btn {\n border-top-right-radius: 0;\n border-bottom-right-radius: 0;\n}\n\n.input-group-addon:not(:last-child) {\n border-right: 0;\n}\n\n.input-group .form-control:not(:first-child),\n.input-group-addon:not(:first-child),\n.input-group-btn:not(:first-child) > .btn,\n.input-group-btn:not(:first-child) > .btn-group > .btn,\n.input-group-btn:not(:first-child) > .dropdown-toggle,\n.input-group-btn:not(:last-child) > .btn:not(:first-child),\n.input-group-btn:not(:last-child) > .btn-group:not(:first-child) > .btn {\n border-top-left-radius: 0;\n border-bottom-left-radius: 0;\n}\n\n.form-control + .input-group-addon:not(:first-child) {\n border-left: 0;\n}\n\n.input-group-btn {\n position: relative;\n font-size: 0;\n white-space: nowrap;\n}\n\n.input-group-btn > .btn {\n position: relative;\n}\n\n.input-group-btn > .btn + .btn {\n margin-left: -1px;\n}\n\n.input-group-btn > .btn:focus, .input-group-btn > .btn:active, .input-group-btn > .btn:hover {\n z-index: 3;\n}\n\n.input-group-btn:not(:last-child) > .btn,\n.input-group-btn:not(:last-child) > .btn-group {\n margin-right: -1px;\n}\n\n.input-group-btn:not(:first-child) > .btn,\n.input-group-btn:not(:first-child) > .btn-group {\n z-index: 2;\n margin-left: -1px;\n}\n\n.input-group-btn:not(:first-child) > .btn:focus, .input-group-btn:not(:first-child) > .btn:active, .input-group-btn:not(:first-child) > .btn:hover,\n.input-group-btn:not(:first-child) > .btn-group:focus,\n.input-group-btn:not(:first-child) > .btn-group:active,\n.input-group-btn:not(:first-child) > .btn-group:hover {\n z-index: 3;\n}\n\n.custom-control {\n position: relative;\n display: inline-flex;\n min-height: 1.5rem;\n padding-left: 1.5rem;\n margin-right: 1rem;\n}\n\n.custom-control-input {\n position: absolute;\n z-index: -1;\n opacity: 0;\n}\n\n.custom-control-input:checked ~ .custom-control-indicator {\n color: #fff;\n background-color: #007bff;\n}\n\n.custom-control-input:focus ~ .custom-control-indicator {\n box-shadow: 0 0 0 1px #fff, 0 0 0 3px #007bff;\n}\n\n.custom-control-input:active ~ .custom-control-indicator {\n color: #fff;\n background-color: #b3d7ff;\n}\n\n.custom-control-input:disabled ~ .custom-control-indicator {\n background-color: #e9ecef;\n}\n\n.custom-control-input:disabled ~ .custom-control-description {\n color: #868e96;\n}\n\n.custom-control-indicator {\n position: absolute;\n top: 0.25rem;\n left: 0;\n display: block;\n width: 1rem;\n height: 1rem;\n pointer-events: none;\n user-select: none;\n background-color: #ddd;\n background-repeat: no-repeat;\n background-position: center center;\n background-size: 50% 50%;\n}\n\n.custom-checkbox .custom-control-indicator {\n border-radius: 0.25rem;\n}\n\n.custom-checkbox .custom-control-input:checked ~ .custom-control-indicator {\n background-image: url(\"data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3E%3Cpath fill='%23fff' d='M6.564.75l-3.59 3.612-1.538-1.55L0 4.26 2.974 7.25 8 2.193z'/%3E%3C/svg%3E\");\n}\n\n.custom-checkbox .custom-control-input:indeterminate ~ .custom-control-indicator {\n background-color: #007bff;\n background-image: url(\"data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 4'%3E%3Cpath stroke='%23fff' d='M0 2h4'/%3E%3C/svg%3E\");\n}\n\n.custom-radio .custom-control-indicator {\n border-radius: 50%;\n}\n\n.custom-radio .custom-control-input:checked ~ .custom-control-indicator {\n background-image: url(\"data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3E%3Ccircle r='3' fill='%23fff'/%3E%3C/svg%3E\");\n}\n\n.custom-controls-stacked {\n display: flex;\n flex-direction: column;\n}\n\n.custom-controls-stacked .custom-control {\n margin-bottom: 0.25rem;\n}\n\n.custom-controls-stacked .custom-control + .custom-control {\n margin-left: 0;\n}\n\n.custom-select {\n display: inline-block;\n max-width: 100%;\n height: calc(2.25rem + 2px);\n padding: 0.375rem 1.75rem 0.375rem 0.75rem;\n line-height: 1.25;\n color: #495057;\n vertical-align: middle;\n background: #fff url(\"data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 5'%3E%3Cpath fill='%23333' d='M2 0L0 2h4zm0 5L0 3h4z'/%3E%3C/svg%3E\") no-repeat right 0.75rem center;\n background-size: 8px 10px;\n border: 1px solid rgba(0, 0, 0, 0.15);\n border-radius: 0.25rem;\n appearance: none;\n}\n\n.custom-select:focus {\n border-color: #80bdff;\n outline: none;\n}\n\n.custom-select:focus::-ms-value {\n color: #495057;\n background-color: #fff;\n}\n\n.custom-select:disabled {\n color: #868e96;\n background-color: #e9ecef;\n}\n\n.custom-select::-ms-expand {\n opacity: 0;\n}\n\n.custom-select-sm {\n height: calc(1.8125rem + 2px);\n padding-top: 0.375rem;\n padding-bottom: 0.375rem;\n font-size: 75%;\n}\n\n.custom-file {\n position: relative;\n display: inline-block;\n max-width: 100%;\n height: 2.5rem;\n margin-bottom: 0;\n}\n\n.custom-file-input {\n min-width: 14rem;\n max-width: 100%;\n height: 2.5rem;\n margin: 0;\n opacity: 0;\n}\n\n.custom-file-control {\n position: absolute;\n top: 0;\n right: 0;\n left: 0;\n z-index: 5;\n height: 2.5rem;\n padding: 0.5rem 1rem;\n line-height: 1.5;\n color: #495057;\n pointer-events: none;\n user-select: none;\n background-color: #fff;\n border: 1px solid rgba(0, 0, 0, 0.15);\n border-radius: 0.25rem;\n}\n\n.custom-file-control:lang(en):empty::after {\n content: \"Choose file...\";\n}\n\n.custom-file-control::before {\n position: absolute;\n top: -1px;\n right: -1px;\n bottom: -1px;\n z-index: 6;\n display: block;\n height: 2.5rem;\n padding: 0.5rem 1rem;\n line-height: 1.5;\n color: #495057;\n background-color: #e9ecef;\n border: 1px solid rgba(0, 0, 0, 0.15);\n border-radius: 0 0.25rem 0.25rem 0;\n}\n\n.custom-file-control:lang(en)::before {\n content: \"Browse\";\n}\n\n.nav {\n display: flex;\n flex-wrap: wrap;\n padding-left: 0;\n margin-bottom: 0;\n list-style: none;\n}\n\n.nav-link {\n display: block;\n padding: 0.5rem 1rem;\n}\n\n.nav-link:focus, .nav-link:hover {\n text-decoration: none;\n}\n\n.nav-link.disabled {\n color: #868e96;\n}\n\n.nav-tabs {\n border-bottom: 1px solid #ddd;\n}\n\n.nav-tabs .nav-item {\n margin-bottom: -1px;\n}\n\n.nav-tabs .nav-link {\n border: 1px solid transparent;\n border-top-left-radius: 0.25rem;\n border-top-right-radius: 0.25rem;\n}\n\n.nav-tabs .nav-link:focus, .nav-tabs .nav-link:hover {\n border-color: #e9ecef #e9ecef #ddd;\n}\n\n.nav-tabs .nav-link.disabled {\n color: #868e96;\n background-color: transparent;\n border-color: transparent;\n}\n\n.nav-tabs .nav-link.active,\n.nav-tabs .nav-item.show .nav-link {\n color: #495057;\n background-color: #fff;\n border-color: #ddd #ddd #fff;\n}\n\n.nav-tabs .dropdown-menu {\n margin-top: -1px;\n border-top-left-radius: 0;\n border-top-right-radius: 0;\n}\n\n.nav-pills .nav-link {\n border-radius: 0.25rem;\n}\n\n.nav-pills .nav-link.active,\n.show > .nav-pills .nav-link {\n color: #fff;\n background-color: #007bff;\n}\n\n.nav-fill .nav-item {\n flex: 1 1 auto;\n text-align: center;\n}\n\n.nav-justified .nav-item {\n flex-basis: 0;\n flex-grow: 1;\n text-align: center;\n}\n\n.tab-content > .tab-pane {\n display: none;\n}\n\n.tab-content > .active {\n display: block;\n}\n\n.navbar {\n position: relative;\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n justify-content: space-between;\n padding: 0.5rem 1rem;\n}\n\n.navbar > .container,\n.navbar > .container-fluid {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n justify-content: space-between;\n}\n\n.navbar-brand {\n display: inline-block;\n padding-top: 0.3125rem;\n padding-bottom: 0.3125rem;\n margin-right: 1rem;\n font-size: 1.25rem;\n line-height: inherit;\n white-space: nowrap;\n}\n\n.navbar-brand:focus, .navbar-brand:hover {\n text-decoration: none;\n}\n\n.navbar-nav {\n display: flex;\n flex-direction: column;\n padding-left: 0;\n margin-bottom: 0;\n list-style: none;\n}\n\n.navbar-nav .nav-link {\n padding-right: 0;\n padding-left: 0;\n}\n\n.navbar-nav .dropdown-menu {\n position: static;\n float: none;\n}\n\n.navbar-text {\n display: inline-block;\n padding-top: 0.5rem;\n padding-bottom: 0.5rem;\n}\n\n.navbar-collapse {\n flex-basis: 100%;\n align-items: center;\n}\n\n.navbar-toggler {\n padding: 0.25rem 0.75rem;\n font-size: 1.25rem;\n line-height: 1;\n background: transparent;\n border: 1px solid transparent;\n border-radius: 0.25rem;\n}\n\n.navbar-toggler:focus, .navbar-toggler:hover {\n text-decoration: none;\n}\n\n.navbar-toggler-icon {\n display: inline-block;\n width: 1.5em;\n height: 1.5em;\n vertical-align: middle;\n content: \"\";\n background: no-repeat center center;\n background-size: 100% 100%;\n}\n\n@media (max-width: 575px) {\n .navbar-expand-sm > .container,\n .navbar-expand-sm > .container-fluid {\n padding-right: 0;\n padding-left: 0;\n }\n}\n\n@media (min-width: 576px) {\n .navbar-expand-sm {\n flex-direction: row;\n flex-wrap: nowrap;\n justify-content: flex-start;\n }\n .navbar-expand-sm .navbar-nav {\n flex-direction: row;\n }\n .navbar-expand-sm .navbar-nav .dropdown-menu {\n position: absolute;\n }\n .navbar-expand-sm .navbar-nav .dropdown-menu-right {\n right: 0;\n left: auto;\n }\n .navbar-expand-sm .navbar-nav .nav-link {\n padding-right: .5rem;\n padding-left: .5rem;\n }\n .navbar-expand-sm > .container,\n .navbar-expand-sm > .container-fluid {\n flex-wrap: nowrap;\n }\n .navbar-expand-sm .navbar-collapse {\n display: flex !important;\n }\n .navbar-expand-sm .navbar-toggler {\n display: none;\n }\n}\n\n@media (max-width: 767px) {\n .navbar-expand-md > .container,\n .navbar-expand-md > .container-fluid {\n padding-right: 0;\n padding-left: 0;\n }\n}\n\n@media (min-width: 768px) {\n .navbar-expand-md {\n flex-direction: row;\n flex-wrap: nowrap;\n justify-content: flex-start;\n }\n .navbar-expand-md .navbar-nav {\n flex-direction: row;\n }\n .navbar-expand-md .navbar-nav .dropdown-menu {\n position: absolute;\n }\n .navbar-expand-md .navbar-nav .dropdown-menu-right {\n right: 0;\n left: auto;\n }\n .navbar-expand-md .navbar-nav .nav-link {\n padding-right: .5rem;\n padding-left: .5rem;\n }\n .navbar-expand-md > .container,\n .navbar-expand-md > .container-fluid {\n flex-wrap: nowrap;\n }\n .navbar-expand-md .navbar-collapse {\n display: flex !important;\n }\n .navbar-expand-md .navbar-toggler {\n display: none;\n }\n}\n\n@media (max-width: 991px) {\n .navbar-expand-lg > .container,\n .navbar-expand-lg > .container-fluid {\n padding-right: 0;\n padding-left: 0;\n }\n}\n\n@media (min-width: 992px) {\n .navbar-expand-lg {\n flex-direction: row;\n flex-wrap: nowrap;\n justify-content: flex-start;\n }\n .navbar-expand-lg .navbar-nav {\n flex-direction: row;\n }\n .navbar-expand-lg .navbar-nav .dropdown-menu {\n position: absolute;\n }\n .navbar-expand-lg .navbar-nav .dropdown-menu-right {\n right: 0;\n left: auto;\n }\n .navbar-expand-lg .navbar-nav .nav-link {\n padding-right: .5rem;\n padding-left: .5rem;\n }\n .navbar-expand-lg > .container,\n .navbar-expand-lg > .container-fluid {\n flex-wrap: nowrap;\n }\n .navbar-expand-lg .navbar-collapse {\n display: flex !important;\n }\n .navbar-expand-lg .navbar-toggler {\n display: none;\n }\n}\n\n@media (max-width: 1199px) {\n .navbar-expand-xl > .container,\n .navbar-expand-xl > .container-fluid {\n padding-right: 0;\n padding-left: 0;\n }\n}\n\n@media (min-width: 1200px) {\n .navbar-expand-xl {\n flex-direction: row;\n flex-wrap: nowrap;\n justify-content: flex-start;\n }\n .navbar-expand-xl .navbar-nav {\n flex-direction: row;\n }\n .navbar-expand-xl .navbar-nav .dropdown-menu {\n position: absolute;\n }\n .navbar-expand-xl .navbar-nav .dropdown-menu-right {\n right: 0;\n left: auto;\n }\n .navbar-expand-xl .navbar-nav .nav-link {\n padding-right: .5rem;\n padding-left: .5rem;\n }\n .navbar-expand-xl > .container,\n .navbar-expand-xl > .container-fluid {\n flex-wrap: nowrap;\n }\n .navbar-expand-xl .navbar-collapse {\n display: flex !important;\n }\n .navbar-expand-xl .navbar-toggler {\n display: none;\n }\n}\n\n.navbar-expand {\n flex-direction: row;\n flex-wrap: nowrap;\n justify-content: flex-start;\n}\n\n.navbar-expand > .container,\n.navbar-expand > .container-fluid {\n padding-right: 0;\n padding-left: 0;\n}\n\n.navbar-expand .navbar-nav {\n flex-direction: row;\n}\n\n.navbar-expand .navbar-nav .dropdown-menu {\n position: absolute;\n}\n\n.navbar-expand .navbar-nav .dropdown-menu-right {\n right: 0;\n left: auto;\n}\n\n.navbar-expand .navbar-nav .nav-link {\n padding-right: .5rem;\n padding-left: .5rem;\n}\n\n.navbar-expand > .container,\n.navbar-expand > .container-fluid {\n flex-wrap: nowrap;\n}\n\n.navbar-expand .navbar-collapse {\n display: flex !important;\n}\n\n.navbar-expand .navbar-toggler {\n display: none;\n}\n\n.navbar-light .navbar-brand {\n color: rgba(0, 0, 0, 0.9);\n}\n\n.navbar-light .navbar-brand:focus, .navbar-light .navbar-brand:hover {\n color: rgba(0, 0, 0, 0.9);\n}\n\n.navbar-light .navbar-nav .nav-link {\n color: rgba(0, 0, 0, 0.5);\n}\n\n.navbar-light .navbar-nav .nav-link:focus, .navbar-light .navbar-nav .nav-link:hover {\n color: rgba(0, 0, 0, 0.7);\n}\n\n.navbar-light .navbar-nav .nav-link.disabled {\n color: rgba(0, 0, 0, 0.3);\n}\n\n.navbar-light .navbar-nav .show > .nav-link,\n.navbar-light .navbar-nav .active > .nav-link,\n.navbar-light .navbar-nav .nav-link.show,\n.navbar-light .navbar-nav .nav-link.active {\n color: rgba(0, 0, 0, 0.9);\n}\n\n.navbar-light .navbar-toggler {\n color: rgba(0, 0, 0, 0.5);\n border-color: rgba(0, 0, 0, 0.1);\n}\n\n.navbar-light .navbar-toggler-icon {\n background-image: url(\"data:image/svg+xml;charset=utf8,%3Csvg viewBox='0 0 30 30' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath stroke='rgba(0, 0, 0, 0.5)' stroke-width='2' stroke-linecap='round' stroke-miterlimit='10' d='M4 7h22M4 15h22M4 23h22'/%3E%3C/svg%3E\");\n}\n\n.navbar-light .navbar-text {\n color: rgba(0, 0, 0, 0.5);\n}\n\n.navbar-dark .navbar-brand {\n color: white;\n}\n\n.navbar-dark .navbar-brand:focus, .navbar-dark .navbar-brand:hover {\n color: white;\n}\n\n.navbar-dark .navbar-nav .nav-link {\n color: rgba(255, 255, 255, 0.5);\n}\n\n.navbar-dark .navbar-nav .nav-link:focus, .navbar-dark .navbar-nav .nav-link:hover {\n color: rgba(255, 255, 255, 0.75);\n}\n\n.navbar-dark .navbar-nav .nav-link.disabled {\n color: rgba(255, 255, 255, 0.25);\n}\n\n.navbar-dark .navbar-nav .show > .nav-link,\n.navbar-dark .navbar-nav .active > .nav-link,\n.navbar-dark .navbar-nav .nav-link.show,\n.navbar-dark .navbar-nav .nav-link.active {\n color: white;\n}\n\n.navbar-dark .navbar-toggler {\n color: rgba(255, 255, 255, 0.5);\n border-color: rgba(255, 255, 255, 0.1);\n}\n\n.navbar-dark .navbar-toggler-icon {\n background-image: url(\"data:image/svg+xml;charset=utf8,%3Csvg viewBox='0 0 30 30' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath stroke='rgba(255, 255, 255, 0.5)' stroke-width='2' stroke-linecap='round' stroke-miterlimit='10' d='M4 7h22M4 15h22M4 23h22'/%3E%3C/svg%3E\");\n}\n\n.navbar-dark .navbar-text {\n color: rgba(255, 255, 255, 0.5);\n}\n\n.card {\n position: relative;\n display: flex;\n flex-direction: column;\n min-width: 0;\n word-wrap: break-word;\n background-color: #fff;\n background-clip: border-box;\n border: 1px solid rgba(0, 0, 0, 0.125);\n border-radius: 0.25rem;\n}\n\n.card-body {\n flex: 1 1 auto;\n padding: 1.25rem;\n}\n\n.card-title {\n margin-bottom: 0.75rem;\n}\n\n.card-subtitle {\n margin-top: -0.375rem;\n margin-bottom: 0;\n}\n\n.card-text:last-child {\n margin-bottom: 0;\n}\n\n.card-link:hover {\n text-decoration: none;\n}\n\n.card-link + .card-link {\n margin-left: 1.25rem;\n}\n\n.card > .list-group:first-child .list-group-item:first-child {\n border-top-left-radius: 0.25rem;\n border-top-right-radius: 0.25rem;\n}\n\n.card > .list-group:last-child .list-group-item:last-child {\n border-bottom-right-radius: 0.25rem;\n border-bottom-left-radius: 0.25rem;\n}\n\n.card-header {\n padding: 0.75rem 1.25rem;\n margin-bottom: 0;\n background-color: rgba(0, 0, 0, 0.03);\n border-bottom: 1px solid rgba(0, 0, 0, 0.125);\n}\n\n.card-header:first-child {\n border-radius: calc(0.25rem - 1px) calc(0.25rem - 1px) 0 0;\n}\n\n.card-footer {\n padding: 0.75rem 1.25rem;\n background-color: rgba(0, 0, 0, 0.03);\n border-top: 1px solid rgba(0, 0, 0, 0.125);\n}\n\n.card-footer:last-child {\n border-radius: 0 0 calc(0.25rem - 1px) calc(0.25rem - 1px);\n}\n\n.card-header-tabs {\n margin-right: -0.625rem;\n margin-bottom: -0.75rem;\n margin-left: -0.625rem;\n border-bottom: 0;\n}\n\n.card-header-pills {\n margin-right: -0.625rem;\n margin-left: -0.625rem;\n}\n\n.card-img-overlay {\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n padding: 1.25rem;\n}\n\n.card-img {\n width: 100%;\n border-radius: calc(0.25rem - 1px);\n}\n\n.card-img-top {\n width: 100%;\n border-top-left-radius: calc(0.25rem - 1px);\n border-top-right-radius: calc(0.25rem - 1px);\n}\n\n.card-img-bottom {\n width: 100%;\n border-bottom-right-radius: calc(0.25rem - 1px);\n border-bottom-left-radius: calc(0.25rem - 1px);\n}\n\n@media (min-width: 576px) {\n .card-deck {\n display: flex;\n flex-flow: row wrap;\n margin-right: -15px;\n margin-left: -15px;\n }\n .card-deck .card {\n display: flex;\n flex: 1 0 0%;\n flex-direction: column;\n margin-right: 15px;\n margin-left: 15px;\n }\n}\n\n@media (min-width: 576px) {\n .card-group {\n display: flex;\n flex-flow: row wrap;\n }\n .card-group .card {\n flex: 1 0 0%;\n }\n .card-group .card + .card {\n margin-left: 0;\n border-left: 0;\n }\n .card-group .card:first-child {\n border-top-right-radius: 0;\n border-bottom-right-radius: 0;\n }\n .card-group .card:first-child .card-img-top {\n border-top-right-radius: 0;\n }\n .card-group .card:first-child .card-img-bottom {\n border-bottom-right-radius: 0;\n }\n .card-group .card:last-child {\n border-top-left-radius: 0;\n border-bottom-left-radius: 0;\n }\n .card-group .card:last-child .card-img-top {\n border-top-left-radius: 0;\n }\n .card-group .card:last-child .card-img-bottom {\n border-bottom-left-radius: 0;\n }\n .card-group .card:not(:first-child):not(:last-child) {\n border-radius: 0;\n }\n .card-group .card:not(:first-child):not(:last-child) .card-img-top,\n .card-group .card:not(:first-child):not(:last-child) .card-img-bottom {\n border-radius: 0;\n }\n}\n\n.card-columns .card {\n margin-bottom: 0.75rem;\n}\n\n@media (min-width: 576px) {\n .card-columns {\n column-count: 3;\n column-gap: 1.25rem;\n }\n .card-columns .card {\n display: inline-block;\n width: 100%;\n }\n}\n\n.breadcrumb {\n padding: 0.75rem 1rem;\n margin-bottom: 1rem;\n list-style: none;\n background-color: #e9ecef;\n border-radius: 0.25rem;\n}\n\n.breadcrumb::after {\n display: block;\n clear: both;\n content: \"\";\n}\n\n.breadcrumb-item {\n float: left;\n}\n\n.breadcrumb-item + .breadcrumb-item::before {\n display: inline-block;\n padding-right: 0.5rem;\n padding-left: 0.5rem;\n color: #868e96;\n content: \"/\";\n}\n\n.breadcrumb-item + .breadcrumb-item:hover::before {\n text-decoration: underline;\n}\n\n.breadcrumb-item + .breadcrumb-item:hover::before {\n text-decoration: none;\n}\n\n.breadcrumb-item.active {\n color: #868e96;\n}\n\n.pagination {\n display: flex;\n padding-left: 0;\n list-style: none;\n border-radius: 0.25rem;\n}\n\n.page-item:first-child .page-link {\n margin-left: 0;\n border-top-left-radius: 0.25rem;\n border-bottom-left-radius: 0.25rem;\n}\n\n.page-item:last-child .page-link {\n border-top-right-radius: 0.25rem;\n border-bottom-right-radius: 0.25rem;\n}\n\n.page-item.active .page-link {\n z-index: 2;\n color: #fff;\n background-color: #007bff;\n border-color: #007bff;\n}\n\n.page-item.disabled .page-link {\n color: #868e96;\n pointer-events: none;\n background-color: #fff;\n border-color: #ddd;\n}\n\n.page-link {\n position: relative;\n display: block;\n padding: 0.5rem 0.75rem;\n margin-left: -1px;\n line-height: 1.25;\n color: #007bff;\n background-color: #fff;\n border: 1px solid #ddd;\n}\n\n.page-link:focus, .page-link:hover {\n color: #0056b3;\n text-decoration: none;\n background-color: #e9ecef;\n border-color: #ddd;\n}\n\n.pagination-lg .page-link {\n padding: 0.75rem 1.5rem;\n font-size: 1.25rem;\n line-height: 1.5;\n}\n\n.pagination-lg .page-item:first-child .page-link {\n border-top-left-radius: 0.3rem;\n border-bottom-left-radius: 0.3rem;\n}\n\n.pagination-lg .page-item:last-child .page-link {\n border-top-right-radius: 0.3rem;\n border-bottom-right-radius: 0.3rem;\n}\n\n.pagination-sm .page-link {\n padding: 0.25rem 0.5rem;\n font-size: 0.875rem;\n line-height: 1.5;\n}\n\n.pagination-sm .page-item:first-child .page-link {\n border-top-left-radius: 0.2rem;\n border-bottom-left-radius: 0.2rem;\n}\n\n.pagination-sm .page-item:last-child .page-link {\n border-top-right-radius: 0.2rem;\n border-bottom-right-radius: 0.2rem;\n}\n\n.badge {\n display: inline-block;\n padding: 0.25em 0.4em;\n font-size: 75%;\n font-weight: bold;\n line-height: 1;\n color: #fff;\n text-align: center;\n white-space: nowrap;\n vertical-align: baseline;\n border-radius: 0.25rem;\n}\n\n.badge:empty {\n display: none;\n}\n\n.btn .badge {\n position: relative;\n top: -1px;\n}\n\n.badge-pill {\n padding-right: 0.6em;\n padding-left: 0.6em;\n border-radius: 10rem;\n}\n\n.badge-primary {\n color: #fff;\n background-color: #007bff;\n}\n\n.badge-primary[href]:focus, .badge-primary[href]:hover {\n color: #fff;\n text-decoration: none;\n background-color: #0062cc;\n}\n\n.badge-secondary {\n color: #fff;\n background-color: #868e96;\n}\n\n.badge-secondary[href]:focus, .badge-secondary[href]:hover {\n color: #fff;\n text-decoration: none;\n background-color: #6c757d;\n}\n\n.badge-success {\n color: #fff;\n background-color: #28a745;\n}\n\n.badge-success[href]:focus, .badge-success[href]:hover {\n color: #fff;\n text-decoration: none;\n background-color: #1e7e34;\n}\n\n.badge-info {\n color: #fff;\n background-color: #17a2b8;\n}\n\n.badge-info[href]:focus, .badge-info[href]:hover {\n color: #fff;\n text-decoration: none;\n background-color: #117a8b;\n}\n\n.badge-warning {\n color: #111;\n background-color: #ffc107;\n}\n\n.badge-warning[href]:focus, .badge-warning[href]:hover {\n color: #111;\n text-decoration: none;\n background-color: #d39e00;\n}\n\n.badge-danger {\n color: #fff;\n background-color: #dc3545;\n}\n\n.badge-danger[href]:focus, .badge-danger[href]:hover {\n color: #fff;\n text-decoration: none;\n background-color: #bd2130;\n}\n\n.badge-light {\n color: #111;\n background-color: #f8f9fa;\n}\n\n.badge-light[href]:focus, .badge-light[href]:hover {\n color: #111;\n text-decoration: none;\n background-color: #dae0e5;\n}\n\n.badge-dark {\n color: #fff;\n background-color: #343a40;\n}\n\n.badge-dark[href]:focus, .badge-dark[href]:hover {\n color: #fff;\n text-decoration: none;\n background-color: #1d2124;\n}\n\n.jumbotron {\n padding: 2rem 1rem;\n margin-bottom: 2rem;\n background-color: #e9ecef;\n border-radius: 0.3rem;\n}\n\n@media (min-width: 576px) {\n .jumbotron {\n padding: 4rem 2rem;\n }\n}\n\n.jumbotron-fluid {\n padding-right: 0;\n padding-left: 0;\n border-radius: 0;\n}\n\n.alert {\n padding: 0.75rem 1.25rem;\n margin-bottom: 1rem;\n border: 1px solid transparent;\n border-radius: 0.25rem;\n}\n\n.alert-heading {\n color: inherit;\n}\n\n.alert-link {\n font-weight: bold;\n}\n\n.alert-dismissible .close {\n position: relative;\n top: -0.75rem;\n right: -1.25rem;\n padding: 0.75rem 1.25rem;\n color: inherit;\n}\n\n.alert-primary {\n color: #004085;\n background-color: #cce5ff;\n border-color: #b8daff;\n}\n\n.alert-primary hr {\n border-top-color: #9fcdff;\n}\n\n.alert-primary .alert-link {\n color: #002752;\n}\n\n.alert-secondary {\n color: #464a4e;\n background-color: #e7e8ea;\n border-color: #dddfe2;\n}\n\n.alert-secondary hr {\n border-top-color: #cfd2d6;\n}\n\n.alert-secondary .alert-link {\n color: #2e3133;\n}\n\n.alert-success {\n color: #155724;\n background-color: #d4edda;\n border-color: #c3e6cb;\n}\n\n.alert-success hr {\n border-top-color: #b1dfbb;\n}\n\n.alert-success .alert-link {\n color: #0b2e13;\n}\n\n.alert-info {\n color: #0c5460;\n background-color: #d1ecf1;\n border-color: #bee5eb;\n}\n\n.alert-info hr {\n border-top-color: #abdde5;\n}\n\n.alert-info .alert-link {\n color: #062c33;\n}\n\n.alert-warning {\n color: #856404;\n background-color: #fff3cd;\n border-color: #ffeeba;\n}\n\n.alert-warning hr {\n border-top-color: #ffe8a1;\n}\n\n.alert-warning .alert-link {\n color: #533f03;\n}\n\n.alert-danger {\n color: #721c24;\n background-color: #f8d7da;\n border-color: #f5c6cb;\n}\n\n.alert-danger hr {\n border-top-color: #f1b0b7;\n}\n\n.alert-danger .alert-link {\n color: #491217;\n}\n\n.alert-light {\n color: #818182;\n background-color: #fefefe;\n border-color: #fdfdfe;\n}\n\n.alert-light hr {\n border-top-color: #ececf6;\n}\n\n.alert-light .alert-link {\n color: #686868;\n}\n\n.alert-dark {\n color: #1b1e21;\n background-color: #d6d8d9;\n border-color: #c6c8ca;\n}\n\n.alert-dark hr {\n border-top-color: #b9bbbe;\n}\n\n.alert-dark .alert-link {\n color: #040505;\n}\n\n@keyframes progress-bar-stripes {\n from {\n background-position: 1rem 0;\n }\n to {\n background-position: 0 0;\n }\n}\n\n.progress {\n display: flex;\n overflow: hidden;\n font-size: 0.75rem;\n line-height: 1rem;\n text-align: center;\n background-color: #e9ecef;\n border-radius: 0.25rem;\n}\n\n.progress-bar {\n height: 1rem;\n line-height: 1rem;\n color: #fff;\n background-color: #007bff;\n transition: width 0.6s ease;\n}\n\n.progress-bar-striped {\n 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);\n background-size: 1rem 1rem;\n}\n\n.progress-bar-animated {\n animation: progress-bar-stripes 1s linear infinite;\n}\n\n.media {\n display: flex;\n align-items: flex-start;\n}\n\n.media-body {\n flex: 1;\n}\n\n.list-group {\n display: flex;\n flex-direction: column;\n padding-left: 0;\n margin-bottom: 0;\n}\n\n.list-group-item-action {\n width: 100%;\n color: #495057;\n text-align: inherit;\n}\n\n.list-group-item-action:focus, .list-group-item-action:hover {\n color: #495057;\n text-decoration: none;\n background-color: #f8f9fa;\n}\n\n.list-group-item-action:active {\n color: #212529;\n background-color: #e9ecef;\n}\n\n.list-group-item {\n position: relative;\n display: block;\n padding: 0.75rem 1.25rem;\n margin-bottom: -1px;\n background-color: #fff;\n border: 1px solid rgba(0, 0, 0, 0.125);\n}\n\n.list-group-item:first-child {\n border-top-left-radius: 0.25rem;\n border-top-right-radius: 0.25rem;\n}\n\n.list-group-item:last-child {\n margin-bottom: 0;\n border-bottom-right-radius: 0.25rem;\n border-bottom-left-radius: 0.25rem;\n}\n\n.list-group-item:focus, .list-group-item:hover {\n text-decoration: none;\n}\n\n.list-group-item.disabled, .list-group-item:disabled {\n color: #868e96;\n background-color: #fff;\n}\n\n.list-group-item.active {\n z-index: 2;\n color: #fff;\n background-color: #007bff;\n border-color: #007bff;\n}\n\n.list-group-flush .list-group-item {\n border-right: 0;\n border-left: 0;\n border-radius: 0;\n}\n\n.list-group-flush:first-child .list-group-item:first-child {\n border-top: 0;\n}\n\n.list-group-flush:last-child .list-group-item:last-child {\n border-bottom: 0;\n}\n\n.list-group-item-primary {\n color: #004085;\n background-color: #b8daff;\n}\n\na.list-group-item-primary,\nbutton.list-group-item-primary {\n color: #004085;\n}\n\na.list-group-item-primary:focus, a.list-group-item-primary:hover,\nbutton.list-group-item-primary:focus,\nbutton.list-group-item-primary:hover {\n color: #004085;\n background-color: #9fcdff;\n}\n\na.list-group-item-primary.active,\nbutton.list-group-item-primary.active {\n color: #fff;\n background-color: #004085;\n border-color: #004085;\n}\n\n.list-group-item-secondary {\n color: #464a4e;\n background-color: #dddfe2;\n}\n\na.list-group-item-secondary,\nbutton.list-group-item-secondary {\n color: #464a4e;\n}\n\na.list-group-item-secondary:focus, a.list-group-item-secondary:hover,\nbutton.list-group-item-secondary:focus,\nbutton.list-group-item-secondary:hover {\n color: #464a4e;\n background-color: #cfd2d6;\n}\n\na.list-group-item-secondary.active,\nbutton.list-group-item-secondary.active {\n color: #fff;\n background-color: #464a4e;\n border-color: #464a4e;\n}\n\n.list-group-item-success {\n color: #155724;\n background-color: #c3e6cb;\n}\n\na.list-group-item-success,\nbutton.list-group-item-success {\n color: #155724;\n}\n\na.list-group-item-success:focus, a.list-group-item-success:hover,\nbutton.list-group-item-success:focus,\nbutton.list-group-item-success:hover {\n color: #155724;\n background-color: #b1dfbb;\n}\n\na.list-group-item-success.active,\nbutton.list-group-item-success.active {\n color: #fff;\n background-color: #155724;\n border-color: #155724;\n}\n\n.list-group-item-info {\n color: #0c5460;\n background-color: #bee5eb;\n}\n\na.list-group-item-info,\nbutton.list-group-item-info {\n color: #0c5460;\n}\n\na.list-group-item-info:focus, a.list-group-item-info:hover,\nbutton.list-group-item-info:focus,\nbutton.list-group-item-info:hover {\n color: #0c5460;\n background-color: #abdde5;\n}\n\na.list-group-item-info.active,\nbutton.list-group-item-info.active {\n color: #fff;\n background-color: #0c5460;\n border-color: #0c5460;\n}\n\n.list-group-item-warning {\n color: #856404;\n background-color: #ffeeba;\n}\n\na.list-group-item-warning,\nbutton.list-group-item-warning {\n color: #856404;\n}\n\na.list-group-item-warning:focus, a.list-group-item-warning:hover,\nbutton.list-group-item-warning:focus,\nbutton.list-group-item-warning:hover {\n color: #856404;\n background-color: #ffe8a1;\n}\n\na.list-group-item-warning.active,\nbutton.list-group-item-warning.active {\n color: #fff;\n background-color: #856404;\n border-color: #856404;\n}\n\n.list-group-item-danger {\n color: #721c24;\n background-color: #f5c6cb;\n}\n\na.list-group-item-danger,\nbutton.list-group-item-danger {\n color: #721c24;\n}\n\na.list-group-item-danger:focus, a.list-group-item-danger:hover,\nbutton.list-group-item-danger:focus,\nbutton.list-group-item-danger:hover {\n color: #721c24;\n background-color: #f1b0b7;\n}\n\na.list-group-item-danger.active,\nbutton.list-group-item-danger.active {\n color: #fff;\n background-color: #721c24;\n border-color: #721c24;\n}\n\n.list-group-item-light {\n color: #818182;\n background-color: #fdfdfe;\n}\n\na.list-group-item-light,\nbutton.list-group-item-light {\n color: #818182;\n}\n\na.list-group-item-light:focus, a.list-group-item-light:hover,\nbutton.list-group-item-light:focus,\nbutton.list-group-item-light:hover {\n color: #818182;\n background-color: #ececf6;\n}\n\na.list-group-item-light.active,\nbutton.list-group-item-light.active {\n color: #fff;\n background-color: #818182;\n border-color: #818182;\n}\n\n.list-group-item-dark {\n color: #1b1e21;\n background-color: #c6c8ca;\n}\n\na.list-group-item-dark,\nbutton.list-group-item-dark {\n color: #1b1e21;\n}\n\na.list-group-item-dark:focus, a.list-group-item-dark:hover,\nbutton.list-group-item-dark:focus,\nbutton.list-group-item-dark:hover {\n color: #1b1e21;\n background-color: #b9bbbe;\n}\n\na.list-group-item-dark.active,\nbutton.list-group-item-dark.active {\n color: #fff;\n background-color: #1b1e21;\n border-color: #1b1e21;\n}\n\n.close {\n float: right;\n font-size: 1.5rem;\n font-weight: bold;\n line-height: 1;\n color: #000;\n text-shadow: 0 1px 0 #fff;\n opacity: .5;\n}\n\n.close:focus, .close:hover {\n color: #000;\n text-decoration: none;\n opacity: .75;\n}\n\nbutton.close {\n padding: 0;\n background: transparent;\n border: 0;\n -webkit-appearance: none;\n}\n\n.modal-open {\n overflow: hidden;\n}\n\n.modal {\n position: fixed;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: 1050;\n display: none;\n overflow: hidden;\n outline: 0;\n}\n\n.modal.fade .modal-dialog {\n transition: transform 0.3s ease-out;\n transform: translate(0, -25%);\n}\n\n.modal.show .modal-dialog {\n transform: translate(0, 0);\n}\n\n.modal-open .modal {\n overflow-x: hidden;\n overflow-y: auto;\n}\n\n.modal-dialog {\n position: relative;\n width: auto;\n margin: 10px;\n}\n\n.modal-content {\n position: relative;\n display: flex;\n flex-direction: column;\n background-color: #fff;\n background-clip: padding-box;\n border: 1px solid rgba(0, 0, 0, 0.2);\n border-radius: 0.3rem;\n outline: 0;\n}\n\n.modal-backdrop {\n position: fixed;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: 1040;\n background-color: #000;\n}\n\n.modal-backdrop.fade {\n opacity: 0;\n}\n\n.modal-backdrop.show {\n opacity: 0.5;\n}\n\n.modal-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 15px;\n border-bottom: 1px solid #e9ecef;\n}\n\n.modal-title {\n margin-bottom: 0;\n line-height: 1.5;\n}\n\n.modal-body {\n position: relative;\n flex: 1 1 auto;\n padding: 15px;\n}\n\n.modal-footer {\n display: flex;\n align-items: center;\n justify-content: flex-end;\n padding: 15px;\n border-top: 1px solid #e9ecef;\n}\n\n.modal-footer > :not(:first-child) {\n margin-left: .25rem;\n}\n\n.modal-footer > :not(:last-child) {\n margin-right: .25rem;\n}\n\n.modal-scrollbar-measure {\n position: absolute;\n top: -9999px;\n width: 50px;\n height: 50px;\n overflow: scroll;\n}\n\n@media (min-width: 576px) {\n .modal-dialog {\n max-width: 500px;\n margin: 30px auto;\n }\n .modal-sm {\n max-width: 300px;\n }\n}\n\n@media (min-width: 992px) {\n .modal-lg {\n max-width: 800px;\n }\n}\n\n.tooltip {\n position: absolute;\n z-index: 1070;\n display: block;\n margin: 0;\n font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, \"Helvetica Neue\", Arial, sans-serif;\n font-style: normal;\n font-weight: normal;\n line-height: 1.5;\n text-align: left;\n text-align: start;\n text-decoration: none;\n text-shadow: none;\n text-transform: none;\n letter-spacing: normal;\n word-break: normal;\n word-spacing: normal;\n white-space: normal;\n line-break: auto;\n font-size: 0.875rem;\n word-wrap: break-word;\n opacity: 0;\n}\n\n.tooltip.show {\n opacity: 0.9;\n}\n\n.tooltip .arrow {\n position: absolute;\n display: block;\n width: 5px;\n height: 5px;\n}\n\n.tooltip.bs-tooltip-top, .tooltip.bs-tooltip-auto[x-placement^=\"top\"] {\n padding: 5px 0;\n}\n\n.tooltip.bs-tooltip-top .arrow, .tooltip.bs-tooltip-auto[x-placement^=\"top\"] .arrow {\n bottom: 0;\n}\n\n.tooltip.bs-tooltip-top .arrow::before, .tooltip.bs-tooltip-auto[x-placement^=\"top\"] .arrow::before {\n margin-left: -3px;\n content: \"\";\n border-width: 5px 5px 0;\n border-top-color: #000;\n}\n\n.tooltip.bs-tooltip-right, .tooltip.bs-tooltip-auto[x-placement^=\"right\"] {\n padding: 0 5px;\n}\n\n.tooltip.bs-tooltip-right .arrow, .tooltip.bs-tooltip-auto[x-placement^=\"right\"] .arrow {\n left: 0;\n}\n\n.tooltip.bs-tooltip-right .arrow::before, .tooltip.bs-tooltip-auto[x-placement^=\"right\"] .arrow::before {\n margin-top: -3px;\n content: \"\";\n border-width: 5px 5px 5px 0;\n border-right-color: #000;\n}\n\n.tooltip.bs-tooltip-bottom, .tooltip.bs-tooltip-auto[x-placement^=\"bottom\"] {\n padding: 5px 0;\n}\n\n.tooltip.bs-tooltip-bottom .arrow, .tooltip.bs-tooltip-auto[x-placement^=\"bottom\"] .arrow {\n top: 0;\n}\n\n.tooltip.bs-tooltip-bottom .arrow::before, .tooltip.bs-tooltip-auto[x-placement^=\"bottom\"] .arrow::before {\n margin-left: -3px;\n content: \"\";\n border-width: 0 5px 5px;\n border-bottom-color: #000;\n}\n\n.tooltip.bs-tooltip-left, .tooltip.bs-tooltip-auto[x-placement^=\"left\"] {\n padding: 0 5px;\n}\n\n.tooltip.bs-tooltip-left .arrow, .tooltip.bs-tooltip-auto[x-placement^=\"left\"] .arrow {\n right: 0;\n}\n\n.tooltip.bs-tooltip-left .arrow::before, .tooltip.bs-tooltip-auto[x-placement^=\"left\"] .arrow::before {\n right: 0;\n margin-top: -3px;\n content: \"\";\n border-width: 5px 0 5px 5px;\n border-left-color: #000;\n}\n\n.tooltip .arrow::before {\n position: absolute;\n border-color: transparent;\n border-style: solid;\n}\n\n.tooltip-inner {\n max-width: 200px;\n padding: 3px 8px;\n color: #fff;\n text-align: center;\n background-color: #000;\n border-radius: 0.25rem;\n}\n\n.popover {\n position: absolute;\n top: 0;\n left: 0;\n z-index: 1060;\n display: block;\n max-width: 276px;\n padding: 1px;\n font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, \"Helvetica Neue\", Arial, sans-serif;\n font-style: normal;\n font-weight: normal;\n line-height: 1.5;\n text-align: left;\n text-align: start;\n text-decoration: none;\n text-shadow: none;\n text-transform: none;\n letter-spacing: normal;\n word-break: normal;\n word-spacing: normal;\n white-space: normal;\n line-break: auto;\n font-size: 0.875rem;\n word-wrap: break-word;\n background-color: #fff;\n background-clip: padding-box;\n border: 1px solid rgba(0, 0, 0, 0.2);\n border-radius: 0.3rem;\n}\n\n.popover .arrow {\n position: absolute;\n display: block;\n width: 10px;\n height: 5px;\n}\n\n.popover .arrow::before,\n.popover .arrow::after {\n position: absolute;\n display: block;\n border-color: transparent;\n border-style: solid;\n}\n\n.popover .arrow::before {\n content: \"\";\n border-width: 11px;\n}\n\n.popover .arrow::after {\n content: \"\";\n border-width: 11px;\n}\n\n.popover.bs-popover-top, .popover.bs-popover-auto[x-placement^=\"top\"] {\n margin-bottom: 10px;\n}\n\n.popover.bs-popover-top .arrow, .popover.bs-popover-auto[x-placement^=\"top\"] .arrow {\n bottom: 0;\n}\n\n.popover.bs-popover-top .arrow::before, .popover.bs-popover-auto[x-placement^=\"top\"] .arrow::before,\n.popover.bs-popover-top .arrow::after, .popover.bs-popover-auto[x-placement^=\"top\"] .arrow::after {\n border-bottom-width: 0;\n}\n\n.popover.bs-popover-top .arrow::before, .popover.bs-popover-auto[x-placement^=\"top\"] .arrow::before {\n bottom: -11px;\n margin-left: -6px;\n border-top-color: rgba(0, 0, 0, 0.25);\n}\n\n.popover.bs-popover-top .arrow::after, .popover.bs-popover-auto[x-placement^=\"top\"] .arrow::after {\n bottom: -10px;\n margin-left: -6px;\n border-top-color: #fff;\n}\n\n.popover.bs-popover-right, .popover.bs-popover-auto[x-placement^=\"right\"] {\n margin-left: 10px;\n}\n\n.popover.bs-popover-right .arrow, .popover.bs-popover-auto[x-placement^=\"right\"] .arrow {\n left: 0;\n}\n\n.popover.bs-popover-right .arrow::before, .popover.bs-popover-auto[x-placement^=\"right\"] .arrow::before,\n.popover.bs-popover-right .arrow::after, .popover.bs-popover-auto[x-placement^=\"right\"] .arrow::after {\n margin-top: -8px;\n border-left-width: 0;\n}\n\n.popover.bs-popover-right .arrow::before, .popover.bs-popover-auto[x-placement^=\"right\"] .arrow::before {\n left: -11px;\n border-right-color: rgba(0, 0, 0, 0.25);\n}\n\n.popover.bs-popover-right .arrow::after, .popover.bs-popover-auto[x-placement^=\"right\"] .arrow::after {\n left: -10px;\n border-right-color: #fff;\n}\n\n.popover.bs-popover-bottom, .popover.bs-popover-auto[x-placement^=\"bottom\"] {\n margin-top: 10px;\n}\n\n.popover.bs-popover-bottom .arrow, .popover.bs-popover-auto[x-placement^=\"bottom\"] .arrow {\n top: 0;\n}\n\n.popover.bs-popover-bottom .arrow::before, .popover.bs-popover-auto[x-placement^=\"bottom\"] .arrow::before,\n.popover.bs-popover-bottom .arrow::after, .popover.bs-popover-auto[x-placement^=\"bottom\"] .arrow::after {\n margin-left: -7px;\n border-top-width: 0;\n}\n\n.popover.bs-popover-bottom .arrow::before, .popover.bs-popover-auto[x-placement^=\"bottom\"] .arrow::before {\n top: -11px;\n border-bottom-color: rgba(0, 0, 0, 0.25);\n}\n\n.popover.bs-popover-bottom .arrow::after, .popover.bs-popover-auto[x-placement^=\"bottom\"] .arrow::after {\n top: -10px;\n border-bottom-color: #fff;\n}\n\n.popover.bs-popover-bottom .popover-header::before, .popover.bs-popover-auto[x-placement^=\"bottom\"] .popover-header::before {\n position: absolute;\n top: 0;\n left: 50%;\n display: block;\n width: 20px;\n margin-left: -10px;\n content: \"\";\n border-bottom: 1px solid #f7f7f7;\n}\n\n.popover.bs-popover-left, .popover.bs-popover-auto[x-placement^=\"left\"] {\n margin-right: 10px;\n}\n\n.popover.bs-popover-left .arrow, .popover.bs-popover-auto[x-placement^=\"left\"] .arrow {\n right: 0;\n}\n\n.popover.bs-popover-left .arrow::before, .popover.bs-popover-auto[x-placement^=\"left\"] .arrow::before,\n.popover.bs-popover-left .arrow::after, .popover.bs-popover-auto[x-placement^=\"left\"] .arrow::after {\n margin-top: -8px;\n border-right-width: 0;\n}\n\n.popover.bs-popover-left .arrow::before, .popover.bs-popover-auto[x-placement^=\"left\"] .arrow::before {\n right: -11px;\n border-left-color: rgba(0, 0, 0, 0.25);\n}\n\n.popover.bs-popover-left .arrow::after, .popover.bs-popover-auto[x-placement^=\"left\"] .arrow::after {\n right: -10px;\n border-left-color: #fff;\n}\n\n.popover-header {\n padding: 8px 14px;\n margin-bottom: 0;\n font-size: 1rem;\n color: inherit;\n background-color: #f7f7f7;\n border-bottom: 1px solid #ebebeb;\n border-top-left-radius: calc(0.3rem - 1px);\n border-top-right-radius: calc(0.3rem - 1px);\n}\n\n.popover-header:empty {\n display: none;\n}\n\n.popover-body {\n padding: 9px 14px;\n color: #212529;\n}\n\n.carousel {\n position: relative;\n}\n\n.carousel-inner {\n position: relative;\n width: 100%;\n overflow: hidden;\n}\n\n.carousel-item {\n position: relative;\n display: none;\n align-items: center;\n width: 100%;\n transition: transform 0.6s ease;\n backface-visibility: hidden;\n perspective: 1000px;\n}\n\n.carousel-item.active,\n.carousel-item-next,\n.carousel-item-prev {\n display: block;\n}\n\n.carousel-item-next,\n.carousel-item-prev {\n position: absolute;\n top: 0;\n}\n\n.carousel-item-next.carousel-item-left,\n.carousel-item-prev.carousel-item-right {\n transform: translateX(0);\n}\n\n@supports (transform-style: preserve-3d) {\n .carousel-item-next.carousel-item-left,\n .carousel-item-prev.carousel-item-right {\n transform: translate3d(0, 0, 0);\n }\n}\n\n.carousel-item-next,\n.active.carousel-item-right {\n transform: translateX(100%);\n}\n\n@supports (transform-style: preserve-3d) {\n .carousel-item-next,\n .active.carousel-item-right {\n transform: translate3d(100%, 0, 0);\n }\n}\n\n.carousel-item-prev,\n.active.carousel-item-left {\n transform: translateX(-100%);\n}\n\n@supports (transform-style: preserve-3d) {\n .carousel-item-prev,\n .active.carousel-item-left {\n transform: translate3d(-100%, 0, 0);\n }\n}\n\n.carousel-control-prev,\n.carousel-control-next {\n position: absolute;\n top: 0;\n bottom: 0;\n display: flex;\n align-items: center;\n justify-content: center;\n width: 15%;\n color: #fff;\n text-align: center;\n opacity: 0.5;\n}\n\n.carousel-control-prev:focus, .carousel-control-prev:hover,\n.carousel-control-next:focus,\n.carousel-control-next:hover {\n color: #fff;\n text-decoration: none;\n outline: 0;\n opacity: .9;\n}\n\n.carousel-control-prev {\n left: 0;\n}\n\n.carousel-control-next {\n right: 0;\n}\n\n.carousel-control-prev-icon,\n.carousel-control-next-icon {\n display: inline-block;\n width: 20px;\n height: 20px;\n background: transparent no-repeat center center;\n background-size: 100% 100%;\n}\n\n.carousel-control-prev-icon {\n background-image: url(\"data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' viewBox='0 0 8 8'%3E%3Cpath d='M4 0l-4 4 4 4 1.5-1.5-2.5-2.5 2.5-2.5-1.5-1.5z'/%3E%3C/svg%3E\");\n}\n\n.carousel-control-next-icon {\n background-image: url(\"data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' viewBox='0 0 8 8'%3E%3Cpath d='M1.5 0l-1.5 1.5 2.5 2.5-2.5 2.5 1.5 1.5 4-4-4-4z'/%3E%3C/svg%3E\");\n}\n\n.carousel-indicators {\n position: absolute;\n right: 0;\n bottom: 10px;\n left: 0;\n z-index: 15;\n display: flex;\n justify-content: center;\n padding-left: 0;\n margin-right: 15%;\n margin-left: 15%;\n list-style: none;\n}\n\n.carousel-indicators li {\n position: relative;\n flex: 0 1 auto;\n width: 30px;\n height: 3px;\n margin-right: 3px;\n margin-left: 3px;\n text-indent: -999px;\n background-color: rgba(255, 255, 255, 0.5);\n}\n\n.carousel-indicators li::before {\n position: absolute;\n top: -10px;\n left: 0;\n display: inline-block;\n width: 100%;\n height: 10px;\n content: \"\";\n}\n\n.carousel-indicators li::after {\n position: absolute;\n bottom: -10px;\n left: 0;\n display: inline-block;\n width: 100%;\n height: 10px;\n content: \"\";\n}\n\n.carousel-indicators .active {\n background-color: #fff;\n}\n\n.carousel-caption {\n position: absolute;\n right: 15%;\n bottom: 20px;\n left: 15%;\n z-index: 10;\n padding-top: 20px;\n padding-bottom: 20px;\n color: #fff;\n text-align: center;\n}\n\n.align-baseline {\n vertical-align: baseline !important;\n}\n\n.align-top {\n vertical-align: top !important;\n}\n\n.align-middle {\n vertical-align: middle !important;\n}\n\n.align-bottom {\n vertical-align: bottom !important;\n}\n\n.align-text-bottom {\n vertical-align: text-bottom !important;\n}\n\n.align-text-top {\n vertical-align: text-top !important;\n}\n\n.bg-primary {\n background-color: #007bff !important;\n}\n\na.bg-primary:focus, a.bg-primary:hover {\n background-color: #0062cc !important;\n}\n\n.bg-secondary {\n background-color: #868e96 !important;\n}\n\na.bg-secondary:focus, a.bg-secondary:hover {\n background-color: #6c757d !important;\n}\n\n.bg-success {\n background-color: #28a745 !important;\n}\n\na.bg-success:focus, a.bg-success:hover {\n background-color: #1e7e34 !important;\n}\n\n.bg-info {\n background-color: #17a2b8 !important;\n}\n\na.bg-info:focus, a.bg-info:hover {\n background-color: #117a8b !important;\n}\n\n.bg-warning {\n background-color: #ffc107 !important;\n}\n\na.bg-warning:focus, a.bg-warning:hover {\n background-color: #d39e00 !important;\n}\n\n.bg-danger {\n background-color: #dc3545 !important;\n}\n\na.bg-danger:focus, a.bg-danger:hover {\n background-color: #bd2130 !important;\n}\n\n.bg-light {\n background-color: #f8f9fa !important;\n}\n\na.bg-light:focus, a.bg-light:hover {\n background-color: #dae0e5 !important;\n}\n\n.bg-dark {\n background-color: #343a40 !important;\n}\n\na.bg-dark:focus, a.bg-dark:hover {\n background-color: #1d2124 !important;\n}\n\n.bg-white {\n background-color: #fff !important;\n}\n\n.bg-transparent {\n background-color: transparent !important;\n}\n\n.border {\n border: 1px solid #e9ecef !important;\n}\n\n.border-0 {\n border: 0 !important;\n}\n\n.border-top-0 {\n border-top: 0 !important;\n}\n\n.border-right-0 {\n border-right: 0 !important;\n}\n\n.border-bottom-0 {\n border-bottom: 0 !important;\n}\n\n.border-left-0 {\n border-left: 0 !important;\n}\n\n.border-primary {\n border-color: #007bff !important;\n}\n\n.border-secondary {\n border-color: #868e96 !important;\n}\n\n.border-success {\n border-color: #28a745 !important;\n}\n\n.border-info {\n border-color: #17a2b8 !important;\n}\n\n.border-warning {\n border-color: #ffc107 !important;\n}\n\n.border-danger {\n border-color: #dc3545 !important;\n}\n\n.border-light {\n border-color: #f8f9fa !important;\n}\n\n.border-dark {\n border-color: #343a40 !important;\n}\n\n.border-white {\n border-color: #fff !important;\n}\n\n.rounded {\n border-radius: 0.25rem !important;\n}\n\n.rounded-top {\n border-top-left-radius: 0.25rem !important;\n border-top-right-radius: 0.25rem !important;\n}\n\n.rounded-right {\n border-top-right-radius: 0.25rem !important;\n border-bottom-right-radius: 0.25rem !important;\n}\n\n.rounded-bottom {\n border-bottom-right-radius: 0.25rem !important;\n border-bottom-left-radius: 0.25rem !important;\n}\n\n.rounded-left {\n border-top-left-radius: 0.25rem !important;\n border-bottom-left-radius: 0.25rem !important;\n}\n\n.rounded-circle {\n border-radius: 50%;\n}\n\n.rounded-0 {\n border-radius: 0;\n}\n\n.clearfix::after {\n display: block;\n clear: both;\n content: \"\";\n}\n\n.d-none {\n display: none !important;\n}\n\n.d-inline {\n display: inline !important;\n}\n\n.d-inline-block {\n display: inline-block !important;\n}\n\n.d-block {\n display: block !important;\n}\n\n.d-table {\n display: table !important;\n}\n\n.d-table-cell {\n display: table-cell !important;\n}\n\n.d-flex {\n display: flex !important;\n}\n\n.d-inline-flex {\n display: inline-flex !important;\n}\n\n@media (min-width: 576px) {\n .d-sm-none {\n display: none !important;\n }\n .d-sm-inline {\n display: inline !important;\n }\n .d-sm-inline-block {\n display: inline-block !important;\n }\n .d-sm-block {\n display: block !important;\n }\n .d-sm-table {\n display: table !important;\n }\n .d-sm-table-cell {\n display: table-cell !important;\n }\n .d-sm-flex {\n display: flex !important;\n }\n .d-sm-inline-flex {\n display: inline-flex !important;\n }\n}\n\n@media (min-width: 768px) {\n .d-md-none {\n display: none !important;\n }\n .d-md-inline {\n display: inline !important;\n }\n .d-md-inline-block {\n display: inline-block !important;\n }\n .d-md-block {\n display: block !important;\n }\n .d-md-table {\n display: table !important;\n }\n .d-md-table-cell {\n display: table-cell !important;\n }\n .d-md-flex {\n display: flex !important;\n }\n .d-md-inline-flex {\n display: inline-flex !important;\n }\n}\n\n@media (min-width: 992px) {\n .d-lg-none {\n display: none !important;\n }\n .d-lg-inline {\n display: inline !important;\n }\n .d-lg-inline-block {\n display: inline-block !important;\n }\n .d-lg-block {\n display: block !important;\n }\n .d-lg-table {\n display: table !important;\n }\n .d-lg-table-cell {\n display: table-cell !important;\n }\n .d-lg-flex {\n display: flex !important;\n }\n .d-lg-inline-flex {\n display: inline-flex !important;\n }\n}\n\n@media (min-width: 1200px) {\n .d-xl-none {\n display: none !important;\n }\n .d-xl-inline {\n display: inline !important;\n }\n .d-xl-inline-block {\n display: inline-block !important;\n }\n .d-xl-block {\n display: block !important;\n }\n .d-xl-table {\n display: table !important;\n }\n .d-xl-table-cell {\n display: table-cell !important;\n }\n .d-xl-flex {\n display: flex !important;\n }\n .d-xl-inline-flex {\n display: inline-flex !important;\n }\n}\n\n.d-print-block {\n display: none !important;\n}\n\n@media print {\n .d-print-block {\n display: block !important;\n }\n}\n\n.d-print-inline {\n display: none !important;\n}\n\n@media print {\n .d-print-inline {\n display: inline !important;\n }\n}\n\n.d-print-inline-block {\n display: none !important;\n}\n\n@media print {\n .d-print-inline-block {\n display: inline-block !important;\n }\n}\n\n@media print {\n .d-print-none {\n display: none !important;\n }\n}\n\n.embed-responsive {\n position: relative;\n display: block;\n width: 100%;\n padding: 0;\n overflow: hidden;\n}\n\n.embed-responsive::before {\n display: block;\n content: \"\";\n}\n\n.embed-responsive .embed-responsive-item,\n.embed-responsive iframe,\n.embed-responsive embed,\n.embed-responsive object,\n.embed-responsive video {\n position: absolute;\n top: 0;\n bottom: 0;\n left: 0;\n width: 100%;\n height: 100%;\n border: 0;\n}\n\n.embed-responsive-21by9::before {\n padding-top: 42.857143%;\n}\n\n.embed-responsive-16by9::before {\n padding-top: 56.25%;\n}\n\n.embed-responsive-4by3::before {\n padding-top: 75%;\n}\n\n.embed-responsive-1by1::before {\n padding-top: 100%;\n}\n\n.flex-row {\n flex-direction: row !important;\n}\n\n.flex-column {\n flex-direction: column !important;\n}\n\n.flex-row-reverse {\n flex-direction: row-reverse !important;\n}\n\n.flex-column-reverse {\n flex-direction: column-reverse !important;\n}\n\n.flex-wrap {\n flex-wrap: wrap !important;\n}\n\n.flex-nowrap {\n flex-wrap: nowrap !important;\n}\n\n.flex-wrap-reverse {\n flex-wrap: wrap-reverse !important;\n}\n\n.justify-content-start {\n justify-content: flex-start !important;\n}\n\n.justify-content-end {\n justify-content: flex-end !important;\n}\n\n.justify-content-center {\n justify-content: center !important;\n}\n\n.justify-content-between {\n justify-content: space-between !important;\n}\n\n.justify-content-around {\n justify-content: space-around !important;\n}\n\n.align-items-start {\n align-items: flex-start !important;\n}\n\n.align-items-end {\n align-items: flex-end !important;\n}\n\n.align-items-center {\n align-items: center !important;\n}\n\n.align-items-baseline {\n align-items: baseline !important;\n}\n\n.align-items-stretch {\n align-items: stretch !important;\n}\n\n.align-content-start {\n align-content: flex-start !important;\n}\n\n.align-content-end {\n align-content: flex-end !important;\n}\n\n.align-content-center {\n align-content: center !important;\n}\n\n.align-content-between {\n align-content: space-between !important;\n}\n\n.align-content-around {\n align-content: space-around !important;\n}\n\n.align-content-stretch {\n align-content: stretch !important;\n}\n\n.align-self-auto {\n align-self: auto !important;\n}\n\n.align-self-start {\n align-self: flex-start !important;\n}\n\n.align-self-end {\n align-self: flex-end !important;\n}\n\n.align-self-center {\n align-self: center !important;\n}\n\n.align-self-baseline {\n align-self: baseline !important;\n}\n\n.align-self-stretch {\n align-self: stretch !important;\n}\n\n@media (min-width: 576px) {\n .flex-sm-row {\n flex-direction: row !important;\n }\n .flex-sm-column {\n flex-direction: column !important;\n }\n .flex-sm-row-reverse {\n flex-direction: row-reverse !important;\n }\n .flex-sm-column-reverse {\n flex-direction: column-reverse !important;\n }\n .flex-sm-wrap {\n flex-wrap: wrap !important;\n }\n .flex-sm-nowrap {\n flex-wrap: nowrap !important;\n }\n .flex-sm-wrap-reverse {\n flex-wrap: wrap-reverse !important;\n }\n .justify-content-sm-start {\n justify-content: flex-start !important;\n }\n .justify-content-sm-end {\n justify-content: flex-end !important;\n }\n .justify-content-sm-center {\n justify-content: center !important;\n }\n .justify-content-sm-between {\n justify-content: space-between !important;\n }\n .justify-content-sm-around {\n justify-content: space-around !important;\n }\n .align-items-sm-start {\n align-items: flex-start !important;\n }\n .align-items-sm-end {\n align-items: flex-end !important;\n }\n .align-items-sm-center {\n align-items: center !important;\n }\n .align-items-sm-baseline {\n align-items: baseline !important;\n }\n .align-items-sm-stretch {\n align-items: stretch !important;\n }\n .align-content-sm-start {\n align-content: flex-start !important;\n }\n .align-content-sm-end {\n align-content: flex-end !important;\n }\n .align-content-sm-center {\n align-content: center !important;\n }\n .align-content-sm-between {\n align-content: space-between !important;\n }\n .align-content-sm-around {\n align-content: space-around !important;\n }\n .align-content-sm-stretch {\n align-content: stretch !important;\n }\n .align-self-sm-auto {\n align-self: auto !important;\n }\n .align-self-sm-start {\n align-self: flex-start !important;\n }\n .align-self-sm-end {\n align-self: flex-end !important;\n }\n .align-self-sm-center {\n align-self: center !important;\n }\n .align-self-sm-baseline {\n align-self: baseline !important;\n }\n .align-self-sm-stretch {\n align-self: stretch !important;\n }\n}\n\n@media (min-width: 768px) {\n .flex-md-row {\n flex-direction: row !important;\n }\n .flex-md-column {\n flex-direction: column !important;\n }\n .flex-md-row-reverse {\n flex-direction: row-reverse !important;\n }\n .flex-md-column-reverse {\n flex-direction: column-reverse !important;\n }\n .flex-md-wrap {\n flex-wrap: wrap !important;\n }\n .flex-md-nowrap {\n flex-wrap: nowrap !important;\n }\n .flex-md-wrap-reverse {\n flex-wrap: wrap-reverse !important;\n }\n .justify-content-md-start {\n justify-content: flex-start !important;\n }\n .justify-content-md-end {\n justify-content: flex-end !important;\n }\n .justify-content-md-center {\n justify-content: center !important;\n }\n .justify-content-md-between {\n justify-content: space-between !important;\n }\n .justify-content-md-around {\n justify-content: space-around !important;\n }\n .align-items-md-start {\n align-items: flex-start !important;\n }\n .align-items-md-end {\n align-items: flex-end !important;\n }\n .align-items-md-center {\n align-items: center !important;\n }\n .align-items-md-baseline {\n align-items: baseline !important;\n }\n .align-items-md-stretch {\n align-items: stretch !important;\n }\n .align-content-md-start {\n align-content: flex-start !important;\n }\n .align-content-md-end {\n align-content: flex-end !important;\n }\n .align-content-md-center {\n align-content: center !important;\n }\n .align-content-md-between {\n align-content: space-between !important;\n }\n .align-content-md-around {\n align-content: space-around !important;\n }\n .align-content-md-stretch {\n align-content: stretch !important;\n }\n .align-self-md-auto {\n align-self: auto !important;\n }\n .align-self-md-start {\n align-self: flex-start !important;\n }\n .align-self-md-end {\n align-self: flex-end !important;\n }\n .align-self-md-center {\n align-self: center !important;\n }\n .align-self-md-baseline {\n align-self: baseline !important;\n }\n .align-self-md-stretch {\n align-self: stretch !important;\n }\n}\n\n@media (min-width: 992px) {\n .flex-lg-row {\n flex-direction: row !important;\n }\n .flex-lg-column {\n flex-direction: column !important;\n }\n .flex-lg-row-reverse {\n flex-direction: row-reverse !important;\n }\n .flex-lg-column-reverse {\n flex-direction: column-reverse !important;\n }\n .flex-lg-wrap {\n flex-wrap: wrap !important;\n }\n .flex-lg-nowrap {\n flex-wrap: nowrap !important;\n }\n .flex-lg-wrap-reverse {\n flex-wrap: wrap-reverse !important;\n }\n .justify-content-lg-start {\n justify-content: flex-start !important;\n }\n .justify-content-lg-end {\n justify-content: flex-end !important;\n }\n .justify-content-lg-center {\n justify-content: center !important;\n }\n .justify-content-lg-between {\n justify-content: space-between !important;\n }\n .justify-content-lg-around {\n justify-content: space-around !important;\n }\n .align-items-lg-start {\n align-items: flex-start !important;\n }\n .align-items-lg-end {\n align-items: flex-end !important;\n }\n .align-items-lg-center {\n align-items: center !important;\n }\n .align-items-lg-baseline {\n align-items: baseline !important;\n }\n .align-items-lg-stretch {\n align-items: stretch !important;\n }\n .align-content-lg-start {\n align-content: flex-start !important;\n }\n .align-content-lg-end {\n align-content: flex-end !important;\n }\n .align-content-lg-center {\n align-content: center !important;\n }\n .align-content-lg-between {\n align-content: space-between !important;\n }\n .align-content-lg-around {\n align-content: space-around !important;\n }\n .align-content-lg-stretch {\n align-content: stretch !important;\n }\n .align-self-lg-auto {\n align-self: auto !important;\n }\n .align-self-lg-start {\n align-self: flex-start !important;\n }\n .align-self-lg-end {\n align-self: flex-end !important;\n }\n .align-self-lg-center {\n align-self: center !important;\n }\n .align-self-lg-baseline {\n align-self: baseline !important;\n }\n .align-self-lg-stretch {\n align-self: stretch !important;\n }\n}\n\n@media (min-width: 1200px) {\n .flex-xl-row {\n flex-direction: row !important;\n }\n .flex-xl-column {\n flex-direction: column !important;\n }\n .flex-xl-row-reverse {\n flex-direction: row-reverse !important;\n }\n .flex-xl-column-reverse {\n flex-direction: column-reverse !important;\n }\n .flex-xl-wrap {\n flex-wrap: wrap !important;\n }\n .flex-xl-nowrap {\n flex-wrap: nowrap !important;\n }\n .flex-xl-wrap-reverse {\n flex-wrap: wrap-reverse !important;\n }\n .justify-content-xl-start {\n justify-content: flex-start !important;\n }\n .justify-content-xl-end {\n justify-content: flex-end !important;\n }\n .justify-content-xl-center {\n justify-content: center !important;\n }\n .justify-content-xl-between {\n justify-content: space-between !important;\n }\n .justify-content-xl-around {\n justify-content: space-around !important;\n }\n .align-items-xl-start {\n align-items: flex-start !important;\n }\n .align-items-xl-end {\n align-items: flex-end !important;\n }\n .align-items-xl-center {\n align-items: center !important;\n }\n .align-items-xl-baseline {\n align-items: baseline !important;\n }\n .align-items-xl-stretch {\n align-items: stretch !important;\n }\n .align-content-xl-start {\n align-content: flex-start !important;\n }\n .align-content-xl-end {\n align-content: flex-end !important;\n }\n .align-content-xl-center {\n align-content: center !important;\n }\n .align-content-xl-between {\n align-content: space-between !important;\n }\n .align-content-xl-around {\n align-content: space-around !important;\n }\n .align-content-xl-stretch {\n align-content: stretch !important;\n }\n .align-self-xl-auto {\n align-self: auto !important;\n }\n .align-self-xl-start {\n align-self: flex-start !important;\n }\n .align-self-xl-end {\n align-self: flex-end !important;\n }\n .align-self-xl-center {\n align-self: center !important;\n }\n .align-self-xl-baseline {\n align-self: baseline !important;\n }\n .align-self-xl-stretch {\n align-self: stretch !important;\n }\n}\n\n.float-left {\n float: left !important;\n}\n\n.float-right {\n float: right !important;\n}\n\n.float-none {\n float: none !important;\n}\n\n@media (min-width: 576px) {\n .float-sm-left {\n float: left !important;\n }\n .float-sm-right {\n float: right !important;\n }\n .float-sm-none {\n float: none !important;\n }\n}\n\n@media (min-width: 768px) {\n .float-md-left {\n float: left !important;\n }\n .float-md-right {\n float: right !important;\n }\n .float-md-none {\n float: none !important;\n }\n}\n\n@media (min-width: 992px) {\n .float-lg-left {\n float: left !important;\n }\n .float-lg-right {\n float: right !important;\n }\n .float-lg-none {\n float: none !important;\n }\n}\n\n@media (min-width: 1200px) {\n .float-xl-left {\n float: left !important;\n }\n .float-xl-right {\n float: right !important;\n }\n .float-xl-none {\n float: none !important;\n }\n}\n\n.fixed-top {\n position: fixed;\n top: 0;\n right: 0;\n left: 0;\n z-index: 1030;\n}\n\n.fixed-bottom {\n position: fixed;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: 1030;\n}\n\n@supports (position: sticky) {\n .sticky-top {\n position: sticky;\n top: 0;\n z-index: 1020;\n }\n}\n\n.sr-only {\n position: absolute;\n width: 1px;\n height: 1px;\n padding: 0;\n overflow: hidden;\n clip: rect(0, 0, 0, 0);\n white-space: nowrap;\n clip-path: inset(50%);\n border: 0;\n}\n\n.sr-only-focusable:active, .sr-only-focusable:focus {\n position: static;\n width: auto;\n height: auto;\n overflow: visible;\n clip: auto;\n white-space: normal;\n clip-path: none;\n}\n\n.w-25 {\n width: 25% !important;\n}\n\n.w-50 {\n width: 50% !important;\n}\n\n.w-75 {\n width: 75% !important;\n}\n\n.w-100 {\n width: 100% !important;\n}\n\n.h-25 {\n height: 25% !important;\n}\n\n.h-50 {\n height: 50% !important;\n}\n\n.h-75 {\n height: 75% !important;\n}\n\n.h-100 {\n height: 100% !important;\n}\n\n.mw-100 {\n max-width: 100% !important;\n}\n\n.mh-100 {\n max-height: 100% !important;\n}\n\n.m-0 {\n margin: 0 !important;\n}\n\n.mt-0 {\n margin-top: 0 !important;\n}\n\n.mr-0 {\n margin-right: 0 !important;\n}\n\n.mb-0 {\n margin-bottom: 0 !important;\n}\n\n.ml-0 {\n margin-left: 0 !important;\n}\n\n.mx-0 {\n margin-right: 0 !important;\n margin-left: 0 !important;\n}\n\n.my-0 {\n margin-top: 0 !important;\n margin-bottom: 0 !important;\n}\n\n.m-1 {\n margin: 0.25rem !important;\n}\n\n.mt-1 {\n margin-top: 0.25rem !important;\n}\n\n.mr-1 {\n margin-right: 0.25rem !important;\n}\n\n.mb-1 {\n margin-bottom: 0.25rem !important;\n}\n\n.ml-1 {\n margin-left: 0.25rem !important;\n}\n\n.mx-1 {\n margin-right: 0.25rem !important;\n margin-left: 0.25rem !important;\n}\n\n.my-1 {\n margin-top: 0.25rem !important;\n margin-bottom: 0.25rem !important;\n}\n\n.m-2 {\n margin: 0.5rem !important;\n}\n\n.mt-2 {\n margin-top: 0.5rem !important;\n}\n\n.mr-2 {\n margin-right: 0.5rem !important;\n}\n\n.mb-2 {\n margin-bottom: 0.5rem !important;\n}\n\n.ml-2 {\n margin-left: 0.5rem !important;\n}\n\n.mx-2 {\n margin-right: 0.5rem !important;\n margin-left: 0.5rem !important;\n}\n\n.my-2 {\n margin-top: 0.5rem !important;\n margin-bottom: 0.5rem !important;\n}\n\n.m-3 {\n margin: 1rem !important;\n}\n\n.mt-3 {\n margin-top: 1rem !important;\n}\n\n.mr-3 {\n margin-right: 1rem !important;\n}\n\n.mb-3 {\n margin-bottom: 1rem !important;\n}\n\n.ml-3 {\n margin-left: 1rem !important;\n}\n\n.mx-3 {\n margin-right: 1rem !important;\n margin-left: 1rem !important;\n}\n\n.my-3 {\n margin-top: 1rem !important;\n margin-bottom: 1rem !important;\n}\n\n.m-4 {\n margin: 1.5rem !important;\n}\n\n.mt-4 {\n margin-top: 1.5rem !important;\n}\n\n.mr-4 {\n margin-right: 1.5rem !important;\n}\n\n.mb-4 {\n margin-bottom: 1.5rem !important;\n}\n\n.ml-4 {\n margin-left: 1.5rem !important;\n}\n\n.mx-4 {\n margin-right: 1.5rem !important;\n margin-left: 1.5rem !important;\n}\n\n.my-4 {\n margin-top: 1.5rem !important;\n margin-bottom: 1.5rem !important;\n}\n\n.m-5 {\n margin: 3rem !important;\n}\n\n.mt-5 {\n margin-top: 3rem !important;\n}\n\n.mr-5 {\n margin-right: 3rem !important;\n}\n\n.mb-5 {\n margin-bottom: 3rem !important;\n}\n\n.ml-5 {\n margin-left: 3rem !important;\n}\n\n.mx-5 {\n margin-right: 3rem !important;\n margin-left: 3rem !important;\n}\n\n.my-5 {\n margin-top: 3rem !important;\n margin-bottom: 3rem !important;\n}\n\n.p-0 {\n padding: 0 !important;\n}\n\n.pt-0 {\n padding-top: 0 !important;\n}\n\n.pr-0 {\n padding-right: 0 !important;\n}\n\n.pb-0 {\n padding-bottom: 0 !important;\n}\n\n.pl-0 {\n padding-left: 0 !important;\n}\n\n.px-0 {\n padding-right: 0 !important;\n padding-left: 0 !important;\n}\n\n.py-0 {\n padding-top: 0 !important;\n padding-bottom: 0 !important;\n}\n\n.p-1 {\n padding: 0.25rem !important;\n}\n\n.pt-1 {\n padding-top: 0.25rem !important;\n}\n\n.pr-1 {\n padding-right: 0.25rem !important;\n}\n\n.pb-1 {\n padding-bottom: 0.25rem !important;\n}\n\n.pl-1 {\n padding-left: 0.25rem !important;\n}\n\n.px-1 {\n padding-right: 0.25rem !important;\n padding-left: 0.25rem !important;\n}\n\n.py-1 {\n padding-top: 0.25rem !important;\n padding-bottom: 0.25rem !important;\n}\n\n.p-2 {\n padding: 0.5rem !important;\n}\n\n.pt-2 {\n padding-top: 0.5rem !important;\n}\n\n.pr-2 {\n padding-right: 0.5rem !important;\n}\n\n.pb-2 {\n padding-bottom: 0.5rem !important;\n}\n\n.pl-2 {\n padding-left: 0.5rem !important;\n}\n\n.px-2 {\n padding-right: 0.5rem !important;\n padding-left: 0.5rem !important;\n}\n\n.py-2 {\n padding-top: 0.5rem !important;\n padding-bottom: 0.5rem !important;\n}\n\n.p-3 {\n padding: 1rem !important;\n}\n\n.pt-3 {\n padding-top: 1rem !important;\n}\n\n.pr-3 {\n padding-right: 1rem !important;\n}\n\n.pb-3 {\n padding-bottom: 1rem !important;\n}\n\n.pl-3 {\n padding-left: 1rem !important;\n}\n\n.px-3 {\n padding-right: 1rem !important;\n padding-left: 1rem !important;\n}\n\n.py-3 {\n padding-top: 1rem !important;\n padding-bottom: 1rem !important;\n}\n\n.p-4 {\n padding: 1.5rem !important;\n}\n\n.pt-4 {\n padding-top: 1.5rem !important;\n}\n\n.pr-4 {\n padding-right: 1.5rem !important;\n}\n\n.pb-4 {\n padding-bottom: 1.5rem !important;\n}\n\n.pl-4 {\n padding-left: 1.5rem !important;\n}\n\n.px-4 {\n padding-right: 1.5rem !important;\n padding-left: 1.5rem !important;\n}\n\n.py-4 {\n padding-top: 1.5rem !important;\n padding-bottom: 1.5rem !important;\n}\n\n.p-5 {\n padding: 3rem !important;\n}\n\n.pt-5 {\n padding-top: 3rem !important;\n}\n\n.pr-5 {\n padding-right: 3rem !important;\n}\n\n.pb-5 {\n padding-bottom: 3rem !important;\n}\n\n.pl-5 {\n padding-left: 3rem !important;\n}\n\n.px-5 {\n padding-right: 3rem !important;\n padding-left: 3rem !important;\n}\n\n.py-5 {\n padding-top: 3rem !important;\n padding-bottom: 3rem !important;\n}\n\n.m-auto {\n margin: auto !important;\n}\n\n.mt-auto {\n margin-top: auto !important;\n}\n\n.mr-auto {\n margin-right: auto !important;\n}\n\n.mb-auto {\n margin-bottom: auto !important;\n}\n\n.ml-auto {\n margin-left: auto !important;\n}\n\n.mx-auto {\n margin-right: auto !important;\n margin-left: auto !important;\n}\n\n.my-auto {\n margin-top: auto !important;\n margin-bottom: auto !important;\n}\n\n@media (min-width: 576px) {\n .m-sm-0 {\n margin: 0 !important;\n }\n .mt-sm-0 {\n margin-top: 0 !important;\n }\n .mr-sm-0 {\n margin-right: 0 !important;\n }\n .mb-sm-0 {\n margin-bottom: 0 !important;\n }\n .ml-sm-0 {\n margin-left: 0 !important;\n }\n .mx-sm-0 {\n margin-right: 0 !important;\n margin-left: 0 !important;\n }\n .my-sm-0 {\n margin-top: 0 !important;\n margin-bottom: 0 !important;\n }\n .m-sm-1 {\n margin: 0.25rem !important;\n }\n .mt-sm-1 {\n margin-top: 0.25rem !important;\n }\n .mr-sm-1 {\n margin-right: 0.25rem !important;\n }\n .mb-sm-1 {\n margin-bottom: 0.25rem !important;\n }\n .ml-sm-1 {\n margin-left: 0.25rem !important;\n }\n .mx-sm-1 {\n margin-right: 0.25rem !important;\n margin-left: 0.25rem !important;\n }\n .my-sm-1 {\n margin-top: 0.25rem !important;\n margin-bottom: 0.25rem !important;\n }\n .m-sm-2 {\n margin: 0.5rem !important;\n }\n .mt-sm-2 {\n margin-top: 0.5rem !important;\n }\n .mr-sm-2 {\n margin-right: 0.5rem !important;\n }\n .mb-sm-2 {\n margin-bottom: 0.5rem !important;\n }\n .ml-sm-2 {\n margin-left: 0.5rem !important;\n }\n .mx-sm-2 {\n margin-right: 0.5rem !important;\n margin-left: 0.5rem !important;\n }\n .my-sm-2 {\n margin-top: 0.5rem !important;\n margin-bottom: 0.5rem !important;\n }\n .m-sm-3 {\n margin: 1rem !important;\n }\n .mt-sm-3 {\n margin-top: 1rem !important;\n }\n .mr-sm-3 {\n margin-right: 1rem !important;\n }\n .mb-sm-3 {\n margin-bottom: 1rem !important;\n }\n .ml-sm-3 {\n margin-left: 1rem !important;\n }\n .mx-sm-3 {\n margin-right: 1rem !important;\n margin-left: 1rem !important;\n }\n .my-sm-3 {\n margin-top: 1rem !important;\n margin-bottom: 1rem !important;\n }\n .m-sm-4 {\n margin: 1.5rem !important;\n }\n .mt-sm-4 {\n margin-top: 1.5rem !important;\n }\n .mr-sm-4 {\n margin-right: 1.5rem !important;\n }\n .mb-sm-4 {\n margin-bottom: 1.5rem !important;\n }\n .ml-sm-4 {\n margin-left: 1.5rem !important;\n }\n .mx-sm-4 {\n margin-right: 1.5rem !important;\n margin-left: 1.5rem !important;\n }\n .my-sm-4 {\n margin-top: 1.5rem !important;\n margin-bottom: 1.5rem !important;\n }\n .m-sm-5 {\n margin: 3rem !important;\n }\n .mt-sm-5 {\n margin-top: 3rem !important;\n }\n .mr-sm-5 {\n margin-right: 3rem !important;\n }\n .mb-sm-5 {\n margin-bottom: 3rem !important;\n }\n .ml-sm-5 {\n margin-left: 3rem !important;\n }\n .mx-sm-5 {\n margin-right: 3rem !important;\n margin-left: 3rem !important;\n }\n .my-sm-5 {\n margin-top: 3rem !important;\n margin-bottom: 3rem !important;\n }\n .p-sm-0 {\n padding: 0 !important;\n }\n .pt-sm-0 {\n padding-top: 0 !important;\n }\n .pr-sm-0 {\n padding-right: 0 !important;\n }\n .pb-sm-0 {\n padding-bottom: 0 !important;\n }\n .pl-sm-0 {\n padding-left: 0 !important;\n }\n .px-sm-0 {\n padding-right: 0 !important;\n padding-left: 0 !important;\n }\n .py-sm-0 {\n padding-top: 0 !important;\n padding-bottom: 0 !important;\n }\n .p-sm-1 {\n padding: 0.25rem !important;\n }\n .pt-sm-1 {\n padding-top: 0.25rem !important;\n }\n .pr-sm-1 {\n padding-right: 0.25rem !important;\n }\n .pb-sm-1 {\n padding-bottom: 0.25rem !important;\n }\n .pl-sm-1 {\n padding-left: 0.25rem !important;\n }\n .px-sm-1 {\n padding-right: 0.25rem !important;\n padding-left: 0.25rem !important;\n }\n .py-sm-1 {\n padding-top: 0.25rem !important;\n padding-bottom: 0.25rem !important;\n }\n .p-sm-2 {\n padding: 0.5rem !important;\n }\n .pt-sm-2 {\n padding-top: 0.5rem !important;\n }\n .pr-sm-2 {\n padding-right: 0.5rem !important;\n }\n .pb-sm-2 {\n padding-bottom: 0.5rem !important;\n }\n .pl-sm-2 {\n padding-left: 0.5rem !important;\n }\n .px-sm-2 {\n padding-right: 0.5rem !important;\n padding-left: 0.5rem !important;\n }\n .py-sm-2 {\n padding-top: 0.5rem !important;\n padding-bottom: 0.5rem !important;\n }\n .p-sm-3 {\n padding: 1rem !important;\n }\n .pt-sm-3 {\n padding-top: 1rem !important;\n }\n .pr-sm-3 {\n padding-right: 1rem !important;\n }\n .pb-sm-3 {\n padding-bottom: 1rem !important;\n }\n .pl-sm-3 {\n padding-left: 1rem !important;\n }\n .px-sm-3 {\n padding-right: 1rem !important;\n padding-left: 1rem !important;\n }\n .py-sm-3 {\n padding-top: 1rem !important;\n padding-bottom: 1rem !important;\n }\n .p-sm-4 {\n padding: 1.5rem !important;\n }\n .pt-sm-4 {\n padding-top: 1.5rem !important;\n }\n .pr-sm-4 {\n padding-right: 1.5rem !important;\n }\n .pb-sm-4 {\n padding-bottom: 1.5rem !important;\n }\n .pl-sm-4 {\n padding-left: 1.5rem !important;\n }\n .px-sm-4 {\n padding-right: 1.5rem !important;\n padding-left: 1.5rem !important;\n }\n .py-sm-4 {\n padding-top: 1.5rem !important;\n padding-bottom: 1.5rem !important;\n }\n .p-sm-5 {\n padding: 3rem !important;\n }\n .pt-sm-5 {\n padding-top: 3rem !important;\n }\n .pr-sm-5 {\n padding-right: 3rem !important;\n }\n .pb-sm-5 {\n padding-bottom: 3rem !important;\n }\n .pl-sm-5 {\n padding-left: 3rem !important;\n }\n .px-sm-5 {\n padding-right: 3rem !important;\n padding-left: 3rem !important;\n }\n .py-sm-5 {\n padding-top: 3rem !important;\n padding-bottom: 3rem !important;\n }\n .m-sm-auto {\n margin: auto !important;\n }\n .mt-sm-auto {\n margin-top: auto !important;\n }\n .mr-sm-auto {\n margin-right: auto !important;\n }\n .mb-sm-auto {\n margin-bottom: auto !important;\n }\n .ml-sm-auto {\n margin-left: auto !important;\n }\n .mx-sm-auto {\n margin-right: auto !important;\n margin-left: auto !important;\n }\n .my-sm-auto {\n margin-top: auto !important;\n margin-bottom: auto !important;\n }\n}\n\n@media (min-width: 768px) {\n .m-md-0 {\n margin: 0 !important;\n }\n .mt-md-0 {\n margin-top: 0 !important;\n }\n .mr-md-0 {\n margin-right: 0 !important;\n }\n .mb-md-0 {\n margin-bottom: 0 !important;\n }\n .ml-md-0 {\n margin-left: 0 !important;\n }\n .mx-md-0 {\n margin-right: 0 !important;\n margin-left: 0 !important;\n }\n .my-md-0 {\n margin-top: 0 !important;\n margin-bottom: 0 !important;\n }\n .m-md-1 {\n margin: 0.25rem !important;\n }\n .mt-md-1 {\n margin-top: 0.25rem !important;\n }\n .mr-md-1 {\n margin-right: 0.25rem !important;\n }\n .mb-md-1 {\n margin-bottom: 0.25rem !important;\n }\n .ml-md-1 {\n margin-left: 0.25rem !important;\n }\n .mx-md-1 {\n margin-right: 0.25rem !important;\n margin-left: 0.25rem !important;\n }\n .my-md-1 {\n margin-top: 0.25rem !important;\n margin-bottom: 0.25rem !important;\n }\n .m-md-2 {\n margin: 0.5rem !important;\n }\n .mt-md-2 {\n margin-top: 0.5rem !important;\n }\n .mr-md-2 {\n margin-right: 0.5rem !important;\n }\n .mb-md-2 {\n margin-bottom: 0.5rem !important;\n }\n .ml-md-2 {\n margin-left: 0.5rem !important;\n }\n .mx-md-2 {\n margin-right: 0.5rem !important;\n margin-left: 0.5rem !important;\n }\n .my-md-2 {\n margin-top: 0.5rem !important;\n margin-bottom: 0.5rem !important;\n }\n .m-md-3 {\n margin: 1rem !important;\n }\n .mt-md-3 {\n margin-top: 1rem !important;\n }\n .mr-md-3 {\n margin-right: 1rem !important;\n }\n .mb-md-3 {\n margin-bottom: 1rem !important;\n }\n .ml-md-3 {\n margin-left: 1rem !important;\n }\n .mx-md-3 {\n margin-right: 1rem !important;\n margin-left: 1rem !important;\n }\n .my-md-3 {\n margin-top: 1rem !important;\n margin-bottom: 1rem !important;\n }\n .m-md-4 {\n margin: 1.5rem !important;\n }\n .mt-md-4 {\n margin-top: 1.5rem !important;\n }\n .mr-md-4 {\n margin-right: 1.5rem !important;\n }\n .mb-md-4 {\n margin-bottom: 1.5rem !important;\n }\n .ml-md-4 {\n margin-left: 1.5rem !important;\n }\n .mx-md-4 {\n margin-right: 1.5rem !important;\n margin-left: 1.5rem !important;\n }\n .my-md-4 {\n margin-top: 1.5rem !important;\n margin-bottom: 1.5rem !important;\n }\n .m-md-5 {\n margin: 3rem !important;\n }\n .mt-md-5 {\n margin-top: 3rem !important;\n }\n .mr-md-5 {\n margin-right: 3rem !important;\n }\n .mb-md-5 {\n margin-bottom: 3rem !important;\n }\n .ml-md-5 {\n margin-left: 3rem !important;\n }\n .mx-md-5 {\n margin-right: 3rem !important;\n margin-left: 3rem !important;\n }\n .my-md-5 {\n margin-top: 3rem !important;\n margin-bottom: 3rem !important;\n }\n .p-md-0 {\n padding: 0 !important;\n }\n .pt-md-0 {\n padding-top: 0 !important;\n }\n .pr-md-0 {\n padding-right: 0 !important;\n }\n .pb-md-0 {\n padding-bottom: 0 !important;\n }\n .pl-md-0 {\n padding-left: 0 !important;\n }\n .px-md-0 {\n padding-right: 0 !important;\n padding-left: 0 !important;\n }\n .py-md-0 {\n padding-top: 0 !important;\n padding-bottom: 0 !important;\n }\n .p-md-1 {\n padding: 0.25rem !important;\n }\n .pt-md-1 {\n padding-top: 0.25rem !important;\n }\n .pr-md-1 {\n padding-right: 0.25rem !important;\n }\n .pb-md-1 {\n padding-bottom: 0.25rem !important;\n }\n .pl-md-1 {\n padding-left: 0.25rem !important;\n }\n .px-md-1 {\n padding-right: 0.25rem !important;\n padding-left: 0.25rem !important;\n }\n .py-md-1 {\n padding-top: 0.25rem !important;\n padding-bottom: 0.25rem !important;\n }\n .p-md-2 {\n padding: 0.5rem !important;\n }\n .pt-md-2 {\n padding-top: 0.5rem !important;\n }\n .pr-md-2 {\n padding-right: 0.5rem !important;\n }\n .pb-md-2 {\n padding-bottom: 0.5rem !important;\n }\n .pl-md-2 {\n padding-left: 0.5rem !important;\n }\n .px-md-2 {\n padding-right: 0.5rem !important;\n padding-left: 0.5rem !important;\n }\n .py-md-2 {\n padding-top: 0.5rem !important;\n padding-bottom: 0.5rem !important;\n }\n .p-md-3 {\n padding: 1rem !important;\n }\n .pt-md-3 {\n padding-top: 1rem !important;\n }\n .pr-md-3 {\n padding-right: 1rem !important;\n }\n .pb-md-3 {\n padding-bottom: 1rem !important;\n }\n .pl-md-3 {\n padding-left: 1rem !important;\n }\n .px-md-3 {\n padding-right: 1rem !important;\n padding-left: 1rem !important;\n }\n .py-md-3 {\n padding-top: 1rem !important;\n padding-bottom: 1rem !important;\n }\n .p-md-4 {\n padding: 1.5rem !important;\n }\n .pt-md-4 {\n padding-top: 1.5rem !important;\n }\n .pr-md-4 {\n padding-right: 1.5rem !important;\n }\n .pb-md-4 {\n padding-bottom: 1.5rem !important;\n }\n .pl-md-4 {\n padding-left: 1.5rem !important;\n }\n .px-md-4 {\n padding-right: 1.5rem !important;\n padding-left: 1.5rem !important;\n }\n .py-md-4 {\n padding-top: 1.5rem !important;\n padding-bottom: 1.5rem !important;\n }\n .p-md-5 {\n padding: 3rem !important;\n }\n .pt-md-5 {\n padding-top: 3rem !important;\n }\n .pr-md-5 {\n padding-right: 3rem !important;\n }\n .pb-md-5 {\n padding-bottom: 3rem !important;\n }\n .pl-md-5 {\n padding-left: 3rem !important;\n }\n .px-md-5 {\n padding-right: 3rem !important;\n padding-left: 3rem !important;\n }\n .py-md-5 {\n padding-top: 3rem !important;\n padding-bottom: 3rem !important;\n }\n .m-md-auto {\n margin: auto !important;\n }\n .mt-md-auto {\n margin-top: auto !important;\n }\n .mr-md-auto {\n margin-right: auto !important;\n }\n .mb-md-auto {\n margin-bottom: auto !important;\n }\n .ml-md-auto {\n margin-left: auto !important;\n }\n .mx-md-auto {\n margin-right: auto !important;\n margin-left: auto !important;\n }\n .my-md-auto {\n margin-top: auto !important;\n margin-bottom: auto !important;\n }\n}\n\n@media (min-width: 992px) {\n .m-lg-0 {\n margin: 0 !important;\n }\n .mt-lg-0 {\n margin-top: 0 !important;\n }\n .mr-lg-0 {\n margin-right: 0 !important;\n }\n .mb-lg-0 {\n margin-bottom: 0 !important;\n }\n .ml-lg-0 {\n margin-left: 0 !important;\n }\n .mx-lg-0 {\n margin-right: 0 !important;\n margin-left: 0 !important;\n }\n .my-lg-0 {\n margin-top: 0 !important;\n margin-bottom: 0 !important;\n }\n .m-lg-1 {\n margin: 0.25rem !important;\n }\n .mt-lg-1 {\n margin-top: 0.25rem !important;\n }\n .mr-lg-1 {\n margin-right: 0.25rem !important;\n }\n .mb-lg-1 {\n margin-bottom: 0.25rem !important;\n }\n .ml-lg-1 {\n margin-left: 0.25rem !important;\n }\n .mx-lg-1 {\n margin-right: 0.25rem !important;\n margin-left: 0.25rem !important;\n }\n .my-lg-1 {\n margin-top: 0.25rem !important;\n margin-bottom: 0.25rem !important;\n }\n .m-lg-2 {\n margin: 0.5rem !important;\n }\n .mt-lg-2 {\n margin-top: 0.5rem !important;\n }\n .mr-lg-2 {\n margin-right: 0.5rem !important;\n }\n .mb-lg-2 {\n margin-bottom: 0.5rem !important;\n }\n .ml-lg-2 {\n margin-left: 0.5rem !important;\n }\n .mx-lg-2 {\n margin-right: 0.5rem !important;\n margin-left: 0.5rem !important;\n }\n .my-lg-2 {\n margin-top: 0.5rem !important;\n margin-bottom: 0.5rem !important;\n }\n .m-lg-3 {\n margin: 1rem !important;\n }\n .mt-lg-3 {\n margin-top: 1rem !important;\n }\n .mr-lg-3 {\n margin-right: 1rem !important;\n }\n .mb-lg-3 {\n margin-bottom: 1rem !important;\n }\n .ml-lg-3 {\n margin-left: 1rem !important;\n }\n .mx-lg-3 {\n margin-right: 1rem !important;\n margin-left: 1rem !important;\n }\n .my-lg-3 {\n margin-top: 1rem !important;\n margin-bottom: 1rem !important;\n }\n .m-lg-4 {\n margin: 1.5rem !important;\n }\n .mt-lg-4 {\n margin-top: 1.5rem !important;\n }\n .mr-lg-4 {\n margin-right: 1.5rem !important;\n }\n .mb-lg-4 {\n margin-bottom: 1.5rem !important;\n }\n .ml-lg-4 {\n margin-left: 1.5rem !important;\n }\n .mx-lg-4 {\n margin-right: 1.5rem !important;\n margin-left: 1.5rem !important;\n }\n .my-lg-4 {\n margin-top: 1.5rem !important;\n margin-bottom: 1.5rem !important;\n }\n .m-lg-5 {\n margin: 3rem !important;\n }\n .mt-lg-5 {\n margin-top: 3rem !important;\n }\n .mr-lg-5 {\n margin-right: 3rem !important;\n }\n .mb-lg-5 {\n margin-bottom: 3rem !important;\n }\n .ml-lg-5 {\n margin-left: 3rem !important;\n }\n .mx-lg-5 {\n margin-right: 3rem !important;\n margin-left: 3rem !important;\n }\n .my-lg-5 {\n margin-top: 3rem !important;\n margin-bottom: 3rem !important;\n }\n .p-lg-0 {\n padding: 0 !important;\n }\n .pt-lg-0 {\n padding-top: 0 !important;\n }\n .pr-lg-0 {\n padding-right: 0 !important;\n }\n .pb-lg-0 {\n padding-bottom: 0 !important;\n }\n .pl-lg-0 {\n padding-left: 0 !important;\n }\n .px-lg-0 {\n padding-right: 0 !important;\n padding-left: 0 !important;\n }\n .py-lg-0 {\n padding-top: 0 !important;\n padding-bottom: 0 !important;\n }\n .p-lg-1 {\n padding: 0.25rem !important;\n }\n .pt-lg-1 {\n padding-top: 0.25rem !important;\n }\n .pr-lg-1 {\n padding-right: 0.25rem !important;\n }\n .pb-lg-1 {\n padding-bottom: 0.25rem !important;\n }\n .pl-lg-1 {\n padding-left: 0.25rem !important;\n }\n .px-lg-1 {\n padding-right: 0.25rem !important;\n padding-left: 0.25rem !important;\n }\n .py-lg-1 {\n padding-top: 0.25rem !important;\n padding-bottom: 0.25rem !important;\n }\n .p-lg-2 {\n padding: 0.5rem !important;\n }\n .pt-lg-2 {\n padding-top: 0.5rem !important;\n }\n .pr-lg-2 {\n padding-right: 0.5rem !important;\n }\n .pb-lg-2 {\n padding-bottom: 0.5rem !important;\n }\n .pl-lg-2 {\n padding-left: 0.5rem !important;\n }\n .px-lg-2 {\n padding-right: 0.5rem !important;\n padding-left: 0.5rem !important;\n }\n .py-lg-2 {\n padding-top: 0.5rem !important;\n padding-bottom: 0.5rem !important;\n }\n .p-lg-3 {\n padding: 1rem !important;\n }\n .pt-lg-3 {\n padding-top: 1rem !important;\n }\n .pr-lg-3 {\n padding-right: 1rem !important;\n }\n .pb-lg-3 {\n padding-bottom: 1rem !important;\n }\n .pl-lg-3 {\n padding-left: 1rem !important;\n }\n .px-lg-3 {\n padding-right: 1rem !important;\n padding-left: 1rem !important;\n }\n .py-lg-3 {\n padding-top: 1rem !important;\n padding-bottom: 1rem !important;\n }\n .p-lg-4 {\n padding: 1.5rem !important;\n }\n .pt-lg-4 {\n padding-top: 1.5rem !important;\n }\n .pr-lg-4 {\n padding-right: 1.5rem !important;\n }\n .pb-lg-4 {\n padding-bottom: 1.5rem !important;\n }\n .pl-lg-4 {\n padding-left: 1.5rem !important;\n }\n .px-lg-4 {\n padding-right: 1.5rem !important;\n padding-left: 1.5rem !important;\n }\n .py-lg-4 {\n padding-top: 1.5rem !important;\n padding-bottom: 1.5rem !important;\n }\n .p-lg-5 {\n padding: 3rem !important;\n }\n .pt-lg-5 {\n padding-top: 3rem !important;\n }\n .pr-lg-5 {\n padding-right: 3rem !important;\n }\n .pb-lg-5 {\n padding-bottom: 3rem !important;\n }\n .pl-lg-5 {\n padding-left: 3rem !important;\n }\n .px-lg-5 {\n padding-right: 3rem !important;\n padding-left: 3rem !important;\n }\n .py-lg-5 {\n padding-top: 3rem !important;\n padding-bottom: 3rem !important;\n }\n .m-lg-auto {\n margin: auto !important;\n }\n .mt-lg-auto {\n margin-top: auto !important;\n }\n .mr-lg-auto {\n margin-right: auto !important;\n }\n .mb-lg-auto {\n margin-bottom: auto !important;\n }\n .ml-lg-auto {\n margin-left: auto !important;\n }\n .mx-lg-auto {\n margin-right: auto !important;\n margin-left: auto !important;\n }\n .my-lg-auto {\n margin-top: auto !important;\n margin-bottom: auto !important;\n }\n}\n\n@media (min-width: 1200px) {\n .m-xl-0 {\n margin: 0 !important;\n }\n .mt-xl-0 {\n margin-top: 0 !important;\n }\n .mr-xl-0 {\n margin-right: 0 !important;\n }\n .mb-xl-0 {\n margin-bottom: 0 !important;\n }\n .ml-xl-0 {\n margin-left: 0 !important;\n }\n .mx-xl-0 {\n margin-right: 0 !important;\n margin-left: 0 !important;\n }\n .my-xl-0 {\n margin-top: 0 !important;\n margin-bottom: 0 !important;\n }\n .m-xl-1 {\n margin: 0.25rem !important;\n }\n .mt-xl-1 {\n margin-top: 0.25rem !important;\n }\n .mr-xl-1 {\n margin-right: 0.25rem !important;\n }\n .mb-xl-1 {\n margin-bottom: 0.25rem !important;\n }\n .ml-xl-1 {\n margin-left: 0.25rem !important;\n }\n .mx-xl-1 {\n margin-right: 0.25rem !important;\n margin-left: 0.25rem !important;\n }\n .my-xl-1 {\n margin-top: 0.25rem !important;\n margin-bottom: 0.25rem !important;\n }\n .m-xl-2 {\n margin: 0.5rem !important;\n }\n .mt-xl-2 {\n margin-top: 0.5rem !important;\n }\n .mr-xl-2 {\n margin-right: 0.5rem !important;\n }\n .mb-xl-2 {\n margin-bottom: 0.5rem !important;\n }\n .ml-xl-2 {\n margin-left: 0.5rem !important;\n }\n .mx-xl-2 {\n margin-right: 0.5rem !important;\n margin-left: 0.5rem !important;\n }\n .my-xl-2 {\n margin-top: 0.5rem !important;\n margin-bottom: 0.5rem !important;\n }\n .m-xl-3 {\n margin: 1rem !important;\n }\n .mt-xl-3 {\n margin-top: 1rem !important;\n }\n .mr-xl-3 {\n margin-right: 1rem !important;\n }\n .mb-xl-3 {\n margin-bottom: 1rem !important;\n }\n .ml-xl-3 {\n margin-left: 1rem !important;\n }\n .mx-xl-3 {\n margin-right: 1rem !important;\n margin-left: 1rem !important;\n }\n .my-xl-3 {\n margin-top: 1rem !important;\n margin-bottom: 1rem !important;\n }\n .m-xl-4 {\n margin: 1.5rem !important;\n }\n .mt-xl-4 {\n margin-top: 1.5rem !important;\n }\n .mr-xl-4 {\n margin-right: 1.5rem !important;\n }\n .mb-xl-4 {\n margin-bottom: 1.5rem !important;\n }\n .ml-xl-4 {\n margin-left: 1.5rem !important;\n }\n .mx-xl-4 {\n margin-right: 1.5rem !important;\n margin-left: 1.5rem !important;\n }\n .my-xl-4 {\n margin-top: 1.5rem !important;\n margin-bottom: 1.5rem !important;\n }\n .m-xl-5 {\n margin: 3rem !important;\n }\n .mt-xl-5 {\n margin-top: 3rem !important;\n }\n .mr-xl-5 {\n margin-right: 3rem !important;\n }\n .mb-xl-5 {\n margin-bottom: 3rem !important;\n }\n .ml-xl-5 {\n margin-left: 3rem !important;\n }\n .mx-xl-5 {\n margin-right: 3rem !important;\n margin-left: 3rem !important;\n }\n .my-xl-5 {\n margin-top: 3rem !important;\n margin-bottom: 3rem !important;\n }\n .p-xl-0 {\n padding: 0 !important;\n }\n .pt-xl-0 {\n padding-top: 0 !important;\n }\n .pr-xl-0 {\n padding-right: 0 !important;\n }\n .pb-xl-0 {\n padding-bottom: 0 !important;\n }\n .pl-xl-0 {\n padding-left: 0 !important;\n }\n .px-xl-0 {\n padding-right: 0 !important;\n padding-left: 0 !important;\n }\n .py-xl-0 {\n padding-top: 0 !important;\n padding-bottom: 0 !important;\n }\n .p-xl-1 {\n padding: 0.25rem !important;\n }\n .pt-xl-1 {\n padding-top: 0.25rem !important;\n }\n .pr-xl-1 {\n padding-right: 0.25rem !important;\n }\n .pb-xl-1 {\n padding-bottom: 0.25rem !important;\n }\n .pl-xl-1 {\n padding-left: 0.25rem !important;\n }\n .px-xl-1 {\n padding-right: 0.25rem !important;\n padding-left: 0.25rem !important;\n }\n .py-xl-1 {\n padding-top: 0.25rem !important;\n padding-bottom: 0.25rem !important;\n }\n .p-xl-2 {\n padding: 0.5rem !important;\n }\n .pt-xl-2 {\n padding-top: 0.5rem !important;\n }\n .pr-xl-2 {\n padding-right: 0.5rem !important;\n }\n .pb-xl-2 {\n padding-bottom: 0.5rem !important;\n }\n .pl-xl-2 {\n padding-left: 0.5rem !important;\n }\n .px-xl-2 {\n padding-right: 0.5rem !important;\n padding-left: 0.5rem !important;\n }\n .py-xl-2 {\n padding-top: 0.5rem !important;\n padding-bottom: 0.5rem !important;\n }\n .p-xl-3 {\n padding: 1rem !important;\n }\n .pt-xl-3 {\n padding-top: 1rem !important;\n }\n .pr-xl-3 {\n padding-right: 1rem !important;\n }\n .pb-xl-3 {\n padding-bottom: 1rem !important;\n }\n .pl-xl-3 {\n padding-left: 1rem !important;\n }\n .px-xl-3 {\n padding-right: 1rem !important;\n padding-left: 1rem !important;\n }\n .py-xl-3 {\n padding-top: 1rem !important;\n padding-bottom: 1rem !important;\n }\n .p-xl-4 {\n padding: 1.5rem !important;\n }\n .pt-xl-4 {\n padding-top: 1.5rem !important;\n }\n .pr-xl-4 {\n padding-right: 1.5rem !important;\n }\n .pb-xl-4 {\n padding-bottom: 1.5rem !important;\n }\n .pl-xl-4 {\n padding-left: 1.5rem !important;\n }\n .px-xl-4 {\n padding-right: 1.5rem !important;\n padding-left: 1.5rem !important;\n }\n .py-xl-4 {\n padding-top: 1.5rem !important;\n padding-bottom: 1.5rem !important;\n }\n .p-xl-5 {\n padding: 3rem !important;\n }\n .pt-xl-5 {\n padding-top: 3rem !important;\n }\n .pr-xl-5 {\n padding-right: 3rem !important;\n }\n .pb-xl-5 {\n padding-bottom: 3rem !important;\n }\n .pl-xl-5 {\n padding-left: 3rem !important;\n }\n .px-xl-5 {\n padding-right: 3rem !important;\n padding-left: 3rem !important;\n }\n .py-xl-5 {\n padding-top: 3rem !important;\n padding-bottom: 3rem !important;\n }\n .m-xl-auto {\n margin: auto !important;\n }\n .mt-xl-auto {\n margin-top: auto !important;\n }\n .mr-xl-auto {\n margin-right: auto !important;\n }\n .mb-xl-auto {\n margin-bottom: auto !important;\n }\n .ml-xl-auto {\n margin-left: auto !important;\n }\n .mx-xl-auto {\n margin-right: auto !important;\n margin-left: auto !important;\n }\n .my-xl-auto {\n margin-top: auto !important;\n margin-bottom: auto !important;\n }\n}\n\n.text-justify {\n text-align: justify !important;\n}\n\n.text-nowrap {\n white-space: nowrap !important;\n}\n\n.text-truncate {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.text-left {\n text-align: left !important;\n}\n\n.text-right {\n text-align: right !important;\n}\n\n.text-center {\n text-align: center !important;\n}\n\n@media (min-width: 576px) {\n .text-sm-left {\n text-align: left !important;\n }\n .text-sm-right {\n text-align: right !important;\n }\n .text-sm-center {\n text-align: center !important;\n }\n}\n\n@media (min-width: 768px) {\n .text-md-left {\n text-align: left !important;\n }\n .text-md-right {\n text-align: right !important;\n }\n .text-md-center {\n text-align: center !important;\n }\n}\n\n@media (min-width: 992px) {\n .text-lg-left {\n text-align: left !important;\n }\n .text-lg-right {\n text-align: right !important;\n }\n .text-lg-center {\n text-align: center !important;\n }\n}\n\n@media (min-width: 1200px) {\n .text-xl-left {\n text-align: left !important;\n }\n .text-xl-right {\n text-align: right !important;\n }\n .text-xl-center {\n text-align: center !important;\n }\n}\n\n.text-lowercase {\n text-transform: lowercase !important;\n}\n\n.text-uppercase {\n text-transform: uppercase !important;\n}\n\n.text-capitalize {\n text-transform: capitalize !important;\n}\n\n.font-weight-normal {\n font-weight: normal;\n}\n\n.font-weight-bold {\n font-weight: bold;\n}\n\n.font-italic {\n font-style: italic;\n}\n\n.text-white {\n color: #fff !important;\n}\n\n.text-primary {\n color: #007bff !important;\n}\n\na.text-primary:focus, a.text-primary:hover {\n color: #0062cc !important;\n}\n\n.text-secondary {\n color: #868e96 !important;\n}\n\na.text-secondary:focus, a.text-secondary:hover {\n color: #6c757d !important;\n}\n\n.text-success {\n color: #28a745 !important;\n}\n\na.text-success:focus, a.text-success:hover {\n color: #1e7e34 !important;\n}\n\n.text-info {\n color: #17a2b8 !important;\n}\n\na.text-info:focus, a.text-info:hover {\n color: #117a8b !important;\n}\n\n.text-warning {\n color: #ffc107 !important;\n}\n\na.text-warning:focus, a.text-warning:hover {\n color: #d39e00 !important;\n}\n\n.text-danger {\n color: #dc3545 !important;\n}\n\na.text-danger:focus, a.text-danger:hover {\n color: #bd2130 !important;\n}\n\n.text-light {\n color: #f8f9fa !important;\n}\n\na.text-light:focus, a.text-light:hover {\n color: #dae0e5 !important;\n}\n\n.text-dark {\n color: #343a40 !important;\n}\n\na.text-dark:focus, a.text-dark:hover {\n color: #1d2124 !important;\n}\n\n.text-muted {\n color: #868e96 !important;\n}\n\n.text-hide {\n font: 0/0 a;\n color: transparent;\n text-shadow: none;\n background-color: transparent;\n border: 0;\n}\n\n.visible {\n visibility: visible !important;\n}\n\n.invisible {\n visibility: hidden !important;\n}\n\n/*# sourceMappingURL=bootstrap.css.map */","@mixin hover {\n // TODO: re-enable along with mq4-hover-shim\n// @if $enable-hover-media-query {\n// // See Media Queries Level 4: https://drafts.csswg.org/mediaqueries/#hover\n// // Currently shimmed by https://github.com/twbs/mq4-hover-shim\n// @media (hover: hover) {\n// &:hover { @content }\n// }\n// }\n// @else {\n// scss-lint:disable Indentation\n &:hover { @content }\n// scss-lint:enable Indentation\n// }\n}\n\n\n@mixin hover-focus {\n @if $enable-hover-media-query {\n &:focus { @content }\n @include hover { @content }\n } @else {\n &:focus,\n &:hover {\n @content\n }\n }\n}\n\n@mixin plain-hover-focus {\n @if $enable-hover-media-query {\n &,\n &:focus {\n @content\n }\n @include hover { @content }\n } @else {\n &,\n &:focus,\n &:hover {\n @content\n }\n }\n}\n\n@mixin hover-focus-active {\n @if $enable-hover-media-query {\n &:focus,\n &:active {\n @content\n }\n @include hover { @content }\n } @else {\n &:focus,\n &:active,\n &:hover {\n @content\n }\n }\n}\n","//\n// Headings\n//\n\nh1, h2, h3, h4, h5, h6,\n.h1, .h2, .h3, .h4, .h5, .h6 {\n margin-bottom: $headings-margin-bottom;\n font-family: $headings-font-family;\n font-weight: $headings-font-weight;\n line-height: $headings-line-height;\n color: $headings-color;\n}\n\nh1, .h1 { font-size: $h1-font-size; }\nh2, .h2 { font-size: $h2-font-size; }\nh3, .h3 { font-size: $h3-font-size; }\nh4, .h4 { font-size: $h4-font-size; }\nh5, .h5 { font-size: $h5-font-size; }\nh6, .h6 { font-size: $h6-font-size; }\n\n.lead {\n font-size: $lead-font-size;\n font-weight: $lead-font-weight;\n}\n\n// Type display classes\n.display-1 {\n font-size: $display1-size;\n font-weight: $display1-weight;\n line-height: $display-line-height;\n}\n.display-2 {\n font-size: $display2-size;\n font-weight: $display2-weight;\n line-height: $display-line-height;\n}\n.display-3 {\n font-size: $display3-size;\n font-weight: $display3-weight;\n line-height: $display-line-height;\n}\n.display-4 {\n font-size: $display4-size;\n font-weight: $display4-weight;\n line-height: $display-line-height;\n}\n\n\n//\n// Horizontal rules\n//\n\nhr {\n margin-top: 1rem;\n margin-bottom: 1rem;\n border: 0;\n border-top: $hr-border-width solid $hr-border-color;\n}\n\n\n//\n// Emphasis\n//\n\nsmall,\n.small {\n font-size: $small-font-size;\n font-weight: $font-weight-normal;\n}\n\nmark,\n.mark {\n padding: $mark-padding;\n background-color: $mark-bg;\n}\n\n\n//\n// Lists\n//\n\n.list-unstyled {\n @include list-unstyled;\n}\n\n// Inline turns list items into inline-block\n.list-inline {\n @include list-unstyled;\n}\n.list-inline-item {\n display: inline-block;\n\n &:not(:last-child) {\n margin-right: $list-inline-padding;\n }\n}\n\n\n//\n// Misc\n//\n\n// Builds on `abbr`\n.initialism {\n font-size: 90%;\n text-transform: uppercase;\n}\n\n// Blockquotes\n.blockquote {\n margin-bottom: $spacer;\n font-size: $blockquote-font-size;\n}\n\n.blockquote-footer {\n display: block;\n font-size: 80%; // back to default font-size\n color: $blockquote-small-color;\n\n &::before {\n content: \"\\2014 \\00A0\"; // em dash, nbsp\n }\n}\n","// Lists\n\n// Unstyled keeps list items block level, just removes default browser padding and list-style\n@mixin list-unstyled {\n padding-left: 0;\n list-style: none;\n}\n","// Responsive images (ensure images don't scale beyond their parents)\n//\n// This is purposefully opt-in via an explicit class rather than being the default for all `<img>`s.\n// We previously tried the \"images are responsive by default\" approach in Bootstrap v2,\n// and abandoned it in Bootstrap v3 because it breaks lots of third-party widgets (including Google Maps)\n// which weren't expecting the images within themselves to be involuntarily resized.\n// See also https://github.com/twbs/bootstrap/issues/18178\n.img-fluid {\n @include img-fluid;\n}\n\n\n// Image thumbnails\n.img-thumbnail {\n padding: $thumbnail-padding;\n background-color: $thumbnail-bg;\n border: $thumbnail-border-width solid $thumbnail-border-color;\n @include border-radius($thumbnail-border-radius);\n @include transition($thumbnail-transition);\n @include box-shadow($thumbnail-box-shadow);\n\n // Keep them at most 100% wide\n @include img-fluid;\n}\n\n//\n// Figures\n//\n\n.figure {\n // Ensures the caption's text aligns with the image.\n display: inline-block;\n}\n\n.figure-img {\n margin-bottom: ($spacer / 2);\n line-height: 1;\n}\n\n.figure-caption {\n font-size: $figure-caption-font-size;\n color: $figure-caption-color;\n}\n","// Image Mixins\n// - Responsive image\n// - Retina image\n\n\n// Responsive image\n//\n// Keep images from scaling beyond the width of their parents.\n\n@mixin img-fluid {\n // Part 1: Set a maximum relative to the parent\n max-width: 100%;\n // Part 2: Override the height to auto, otherwise images will be stretched\n // when setting a width and height attribute on the img element.\n height: auto;\n}\n\n\n// Retina image\n//\n// Short retina mixin for setting background-image and -size.\n\n@mixin img-retina($file-1x, $file-2x, $width-1x, $height-1x) {\n background-image: url($file-1x);\n\n // Autoprefixer takes care of adding -webkit-min-device-pixel-ratio and -o-min-device-pixel-ratio,\n // but doesn't convert dppx=>dpi.\n // There's no such thing as unprefixed min-device-pixel-ratio since it's nonstandard.\n // Compatibility info: http://caniuse.com/#feat=css-media-resolution\n @media\n only screen and (min-resolution: 192dpi), // IE9-11 don't support dppx\n only screen and (min-resolution: 2dppx) { // Standardized\n background-image: url($file-2x);\n background-size: $width-1x $height-1x;\n }\n}\n","// Single side border-radius\n\n@mixin border-radius($radius: $border-radius) {\n @if $enable-rounded {\n border-radius: $radius;\n }\n}\n\n@mixin border-top-radius($radius) {\n @if $enable-rounded {\n border-top-left-radius: $radius;\n border-top-right-radius: $radius;\n }\n}\n\n@mixin border-right-radius($radius) {\n @if $enable-rounded {\n border-top-right-radius: $radius;\n border-bottom-right-radius: $radius;\n }\n}\n\n@mixin border-bottom-radius($radius) {\n @if $enable-rounded {\n border-bottom-right-radius: $radius;\n border-bottom-left-radius: $radius;\n }\n}\n\n@mixin border-left-radius($radius) {\n @if $enable-rounded {\n border-top-left-radius: $radius;\n border-bottom-left-radius: $radius;\n }\n}\n","@mixin transition($transition...) {\n @if $enable-transitions {\n @if length($transition) == 0 {\n transition: $transition-base;\n } @else {\n transition: $transition;\n }\n }\n}\n","// Inline and block code styles\ncode,\nkbd,\npre,\nsamp {\n font-family: $font-family-monospace;\n}\n\n// Inline code\ncode {\n padding: $code-padding-y $code-padding-x;\n font-size: $code-font-size;\n color: $code-color;\n background-color: $code-bg;\n @include border-radius($border-radius);\n\n // Streamline the style when inside anchors to avoid broken underline and more\n a > & {\n padding: 0;\n color: inherit;\n background-color: inherit;\n }\n}\n\n// User input typically entered via keyboard\nkbd {\n padding: $code-padding-y $code-padding-x;\n font-size: $code-font-size;\n color: $kbd-color;\n background-color: $kbd-bg;\n @include border-radius($border-radius-sm);\n @include box-shadow($kbd-box-shadow);\n\n kbd {\n padding: 0;\n font-size: 100%;\n font-weight: $nested-kbd-font-weight;\n @include box-shadow(none);\n }\n}\n\n// Blocks of code\npre {\n display: block;\n margin-top: 0;\n margin-bottom: 1rem;\n font-size: $code-font-size;\n color: $pre-color;\n\n // Account for some code outputs that place code tags in pre tags\n code {\n padding: 0;\n font-size: inherit;\n color: inherit;\n background-color: transparent;\n border-radius: 0;\n }\n}\n\n// Enable scrollable blocks of code\n.pre-scrollable {\n max-height: $pre-scrollable-max-height;\n overflow-y: scroll;\n}\n","// Container widths\n//\n// Set the container width, and override it for fixed navbars in media queries.\n\n@if $enable-grid-classes {\n .container {\n @include make-container();\n @include make-container-max-widths();\n }\n}\n\n// Fluid container\n//\n// Utilizes the mixin meant for fixed width containers, but with 100% width for\n// fluid, full width layouts.\n\n@if $enable-grid-classes {\n .container-fluid {\n width: 100%;\n @include make-container();\n }\n}\n\n// Row\n//\n// Rows contain and clear the floats of your columns.\n\n@if $enable-grid-classes {\n .row {\n @include make-row();\n }\n\n // Remove the negative margin from default .row, then the horizontal padding\n // from all immediate children columns (to prevent runaway style inheritance).\n .no-gutters {\n margin-right: 0;\n margin-left: 0;\n\n > .col,\n > [class*=\"col-\"] {\n padding-right: 0;\n padding-left: 0;\n }\n }\n}\n\n// Columns\n//\n// Common styles for small and large grid columns\n\n@if $enable-grid-classes {\n @include make-grid-columns();\n}\n","/// Grid system\n//\n// Generate semantic grid columns with these mixins.\n\n@mixin make-container() {\n margin-right: auto;\n margin-left: auto;\n padding-right: ($grid-gutter-width / 2);\n padding-left: ($grid-gutter-width / 2);\n width: 100%;\n}\n\n\n// For each breakpoint, define the maximum width of the container in a media query\n@mixin make-container-max-widths($max-widths: $container-max-widths, $breakpoints: $grid-breakpoints) {\n @each $breakpoint, $container-max-width in $max-widths {\n @include media-breakpoint-up($breakpoint, $breakpoints) {\n max-width: $container-max-width;\n }\n }\n}\n\n@mixin make-row() {\n display: flex;\n flex-wrap: wrap;\n margin-right: ($grid-gutter-width / -2);\n margin-left: ($grid-gutter-width / -2);\n}\n\n@mixin make-col-ready() {\n position: relative;\n // Prevent columns from becoming too narrow when at smaller grid tiers by\n // always setting `width: 100%;`. This works because we use `flex` values\n // later on to override this initial width.\n width: 100%;\n min-height: 1px; // Prevent collapsing\n padding-right: ($grid-gutter-width / 2);\n padding-left: ($grid-gutter-width / 2);\n}\n\n@mixin make-col($size, $columns: $grid-columns) {\n flex: 0 0 percentage($size / $columns);\n // Add a `max-width` to ensure content within each column does not blow out\n // the width of the column. Applies to IE10+ and Firefox. Chrome and Safari\n // do not appear to require this.\n max-width: percentage($size / $columns);\n}\n","// Breakpoint viewport sizes and media queries.\n//\n// Breakpoints are defined as a map of (name: minimum width), order from small to large:\n//\n// (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px)\n//\n// The map defined in the `$grid-breakpoints` global variable is used as the `$breakpoints` argument by default.\n\n// Name of the next breakpoint, or null for the last breakpoint.\n//\n// >> breakpoint-next(sm)\n// md\n// >> breakpoint-next(sm, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px))\n// md\n// >> breakpoint-next(sm, $breakpoint-names: (xs sm md lg xl))\n// md\n@function breakpoint-next($name, $breakpoints: $grid-breakpoints, $breakpoint-names: map-keys($breakpoints)) {\n $n: index($breakpoint-names, $name);\n @return if($n < length($breakpoint-names), nth($breakpoint-names, $n + 1), null);\n}\n\n// Minimum breakpoint width. Null for the smallest (first) breakpoint.\n//\n// >> breakpoint-min(sm, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px))\n// 576px\n@function breakpoint-min($name, $breakpoints: $grid-breakpoints) {\n $min: map-get($breakpoints, $name);\n @return if($min != 0, $min, null);\n}\n\n// Maximum breakpoint width. Null for the largest (last) breakpoint.\n// The maximum value is calculated as the minimum of the next one less 0.1.\n//\n// >> breakpoint-max(sm, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px))\n// 767px\n@function breakpoint-max($name, $breakpoints: $grid-breakpoints) {\n $next: breakpoint-next($name, $breakpoints);\n @return if($next, breakpoint-min($next, $breakpoints) - 1px, null);\n}\n\n// Returns a blank string if smallest breakpoint, otherwise returns the name with a dash infront.\n// Useful for making responsive utilities.\n//\n// >> breakpoint-infix(xs, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px))\n// \"\" (Returns a blank string)\n// >> breakpoint-infix(sm, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px))\n// \"-sm\"\n@function breakpoint-infix($name, $breakpoints: $grid-breakpoints) {\n @return if(breakpoint-min($name, $breakpoints) == null, \"\", \"-#{$name}\");\n}\n\n// Media of at least the minimum breakpoint width. No query for the smallest breakpoint.\n// Makes the @content apply to the given breakpoint and wider.\n@mixin media-breakpoint-up($name, $breakpoints: $grid-breakpoints) {\n $min: breakpoint-min($name, $breakpoints);\n @if $min {\n @media (min-width: $min) {\n @content;\n }\n } @else {\n @content;\n }\n}\n\n// Media of at most the maximum breakpoint width. No query for the largest breakpoint.\n// Makes the @content apply to the given breakpoint and narrower.\n@mixin media-breakpoint-down($name, $breakpoints: $grid-breakpoints) {\n $max: breakpoint-max($name, $breakpoints);\n @if $max {\n @media (max-width: $max) {\n @content;\n }\n } @else {\n @content;\n }\n}\n\n// Media that spans multiple breakpoint widths.\n// Makes the @content apply between the min and max breakpoints\n@mixin media-breakpoint-between($lower, $upper, $breakpoints: $grid-breakpoints) {\n $min: breakpoint-min($lower, $breakpoints);\n $max: breakpoint-max($upper, $breakpoints);\n\n @media (min-width: $min) and (max-width: $max) {\n @content;\n }\n}\n\n// Media between the breakpoint's minimum and maximum widths.\n// No minimum for the smallest breakpoint, and no maximum for the largest one.\n// Makes the @content apply only to the given breakpoint, not viewports any wider or narrower.\n@mixin media-breakpoint-only($name, $breakpoints: $grid-breakpoints) {\n $min: breakpoint-min($name, $breakpoints);\n $max: breakpoint-max($name, $breakpoints);\n\n @if $min != null and $max != null {\n @media (min-width: $min) and (max-width: $max) {\n @content;\n }\n } @else if $max == null {\n @include media-breakpoint-up($name)\n } @else if $min == null {\n @include media-breakpoint-down($name)\n }\n}\n","// Framework grid generation\n//\n// Used only by Bootstrap to generate the correct number of grid classes given\n// any value of `$grid-columns`.\n\n@mixin make-grid-columns($columns: $grid-columns, $gutter: $grid-gutter-width, $breakpoints: $grid-breakpoints) {\n // Common properties for all breakpoints\n %grid-column {\n position: relative;\n width: 100%;\n min-height: 1px; // Prevent columns from collapsing when empty\n padding-right: ($gutter / 2);\n padding-left: ($gutter / 2);\n }\n\n @each $breakpoint in map-keys($breakpoints) {\n $infix: breakpoint-infix($breakpoint, $breakpoints);\n\n // Allow columns to stretch full width below their breakpoints\n @for $i from 1 through $columns {\n .col#{$infix}-#{$i} {\n @extend %grid-column;\n }\n }\n .col#{$infix},\n .col#{$infix}-auto {\n @extend %grid-column;\n }\n\n @include media-breakpoint-up($breakpoint, $breakpoints) {\n // Provide basic `.col-{bp}` classes for equal-width flexbox columns\n .col#{$infix} {\n flex-basis: 0;\n flex-grow: 1;\n max-width: 100%;\n }\n .col#{$infix}-auto {\n flex: 0 0 auto;\n width: auto;\n max-width: none; // Reset earlier grid tiers\n }\n\n @for $i from 1 through $columns {\n .col#{$infix}-#{$i} {\n @include make-col($i, $columns);\n }\n }\n\n @for $i from 1 through $columns {\n .order#{$infix}-#{$i} {\n order: $i;\n }\n }\n }\n }\n}\n","//\n// Basic Bootstrap table\n//\n\n.table {\n width: 100%;\n max-width: 100%;\n margin-bottom: $spacer;\n background-color: $table-bg; // Reset for nesting within parents with `background-color`.\n\n th,\n td {\n padding: $table-cell-padding;\n vertical-align: top;\n border-top: $table-border-width solid $table-border-color;\n }\n\n thead th {\n vertical-align: bottom;\n border-bottom: (2 * $table-border-width) solid $table-border-color;\n }\n\n tbody + tbody {\n border-top: (2 * $table-border-width) solid $table-border-color;\n }\n\n .table {\n background-color: $body-bg;\n }\n}\n\n\n//\n// Condensed table w/ half padding\n//\n\n.table-sm {\n th,\n td {\n padding: $table-cell-padding-sm;\n }\n}\n\n\n// Bordered version\n//\n// Add borders all around the table and between all the columns.\n\n.table-bordered {\n border: $table-border-width solid $table-border-color;\n\n th,\n td {\n border: $table-border-width solid $table-border-color;\n }\n\n thead {\n th,\n td {\n border-bottom-width: (2 * $table-border-width);\n }\n }\n}\n\n\n// Zebra-striping\n//\n// Default zebra-stripe styles (alternating gray and transparent backgrounds)\n\n.table-striped {\n tbody tr:nth-of-type(odd) {\n background-color: $table-accent-bg;\n }\n}\n\n\n// Hover effect\n//\n// Placed here since it has to come after the potential zebra striping\n\n.table-hover {\n tbody tr {\n @include hover {\n background-color: $table-hover-bg;\n }\n }\n}\n\n\n// Table backgrounds\n//\n// Exact selectors below required to override `.table-striped` and prevent\n// inheritance to nested tables.\n\n@each $color, $value in $theme-colors {\n @include table-row-variant($color, theme-color-level($color, -9));\n}\n\n@include table-row-variant(active, $table-active-bg);\n\n\n// Inverse styles\n//\n// Same table markup, but inverted color scheme: dark background and light text.\n\n.thead-inverse {\n th {\n color: $table-inverse-color;\n background-color: $table-inverse-bg;\n }\n}\n\n.thead-default {\n th {\n color: $table-head-color;\n background-color: $table-head-bg;\n }\n}\n\n.table-inverse {\n color: $table-inverse-color;\n background-color: $table-inverse-bg;\n\n th,\n td,\n thead th {\n border-color: $table-inverse-border-color;\n }\n\n &.table-bordered {\n border: 0;\n }\n\n &.table-striped {\n tbody tr:nth-of-type(odd) {\n background-color: $table-inverse-accent-bg;\n }\n }\n\n &.table-hover {\n tbody tr {\n @include hover {\n background-color: $table-inverse-hover-bg;\n }\n }\n }\n}\n\n\n// Responsive tables\n//\n// Add `.table-responsive` to `.table`s and we'll make them mobile friendly by\n// enabling horizontal scrolling. Only applies <768px. Everything above that\n// will display normally.\n\n.table-responsive {\n @include media-breakpoint-down(md) {\n display: block;\n width: 100%;\n overflow-x: auto;\n -ms-overflow-style: -ms-autohiding-scrollbar; // See https://github.com/twbs/bootstrap/pull/10057\n\n // Prevent double border on horizontal scroll due to use of `display: block;`\n &.table-bordered {\n border: 0;\n }\n }\n}\n","// Tables\n\n@mixin table-row-variant($state, $background) {\n // Exact selectors below required to override `.table-striped` and prevent\n // inheritance to nested tables.\n .table-#{$state} {\n &,\n > th,\n > td {\n background-color: $background;\n }\n }\n\n // Hover states for `.table-hover`\n // Note: this is not available for cells or rows within `thead` or `tfoot`.\n .table-hover {\n $hover-background: darken($background, 5%);\n\n .table-#{$state} {\n @include hover {\n background-color: $hover-background;\n\n > td,\n > th {\n background-color: $hover-background;\n }\n }\n }\n }\n}\n","// scss-lint:disable QualifyingElement, VendorPrefix\n\n//\n// Textual form controls\n//\n\n.form-control {\n display: block;\n width: 100%;\n // // Make inputs at least the height of their button counterpart (base line-height + padding + border)\n // height: $input-height;\n padding: $input-btn-padding-y $input-btn-padding-x;\n font-size: $font-size-base;\n line-height: $input-btn-line-height;\n color: $input-color;\n background-color: $input-bg;\n // Reset unusual Firefox-on-Android default style; see https://github.com/necolas/normalize.css/issues/214.\n background-image: none;\n background-clip: padding-box;\n border: $input-btn-border-width solid $input-border-color;\n\n // Note: This has no effect on <select>s in some browsers, due to the limited stylability of `<select>`s in CSS.\n @if $enable-rounded {\n // Manually use the if/else instead of the mixin to account for iOS override\n border-radius: $input-border-radius;\n } @else {\n // Otherwise undo the iOS default\n border-radius: 0;\n }\n\n @include box-shadow($input-box-shadow);\n @include transition($input-transition);\n\n // Unstyle the caret on `<select>`s in IE10+.\n &::-ms-expand {\n background-color: transparent;\n border: 0;\n }\n\n // Customize the `:focus` state to imitate native WebKit styles.\n @include form-control-focus();\n\n // Placeholder\n &::placeholder {\n color: $input-placeholder-color;\n // Override Firefox's unusual default opacity; see https://github.com/twbs/bootstrap/pull/11526.\n opacity: 1;\n }\n\n // Disabled and read-only inputs\n //\n // HTML5 says that controls under a fieldset > legend:first-child won't be\n // disabled if the fieldset is disabled. Due to implementation difficulty, we\n // don't honor that edge case; we style them as disabled anyway.\n &:disabled,\n &[readonly] {\n background-color: $input-disabled-bg;\n // iOS fix for unreadable disabled content; see https://github.com/twbs/bootstrap/issues/11655.\n opacity: 1;\n }\n}\n\nselect.form-control {\n &:not([size]):not([multiple]) {\n height: $input-height;\n }\n\n &:focus::-ms-value {\n // Suppress the nested default white text on blue background highlight given to\n // the selected option text when the (still closed) <select> receives focus\n // in IE and (under certain conditions) Edge, as it looks bad and cannot be made to\n // match the appearance of the native widget.\n // See https://github.com/twbs/bootstrap/issues/19398.\n color: $input-color;\n background-color: $input-bg;\n }\n}\n\n// Make file inputs better match text inputs by forcing them to new lines.\n.form-control-file,\n.form-control-range {\n display: block;\n}\n\n\n//\n// Labels\n//\n\n// For use with horizontal and inline forms, when you need the label text to\n// align with the form controls.\n.col-form-label {\n padding-top: calc(#{$input-btn-padding-y} - #{$input-btn-border-width} * 2);\n padding-bottom: calc(#{$input-btn-padding-y} - #{$input-btn-border-width} * 2);\n margin-bottom: 0; // Override the `<label>` default\n}\n\n.col-form-label-lg {\n padding-top: calc(#{$input-btn-padding-y-lg} - #{$input-btn-border-width} * 2);\n padding-bottom: calc(#{$input-btn-padding-y-lg} - #{$input-btn-border-width} * 2);\n font-size: $font-size-lg;\n}\n\n.col-form-label-sm {\n padding-top: calc(#{$input-btn-padding-y-sm} - #{$input-btn-border-width} * 2);\n padding-bottom: calc(#{$input-btn-padding-y-sm} - #{$input-btn-border-width} * 2);\n font-size: $font-size-sm;\n}\n\n\n//\n// Legends\n//\n\n// For use with horizontal and inline forms, when you need the legend text to\n// be the same size as regular labels, and to align with the form controls.\n.col-form-legend {\n padding-top: $input-btn-padding-y;\n padding-bottom: $input-btn-padding-y;\n margin-bottom: 0;\n font-size: $font-size-base;\n}\n\n\n// Readonly controls as plain text\n//\n// Apply class to a readonly input to make it appear like regular plain\n// text (without any border, background color, focus indicator)\n\n.form-control-plaintext {\n padding-top: $input-btn-padding-y;\n padding-bottom: $input-btn-padding-y;\n margin-bottom: 0; // match inputs if this class comes on inputs with default margins\n line-height: $input-btn-line-height;\n border: solid transparent;\n border-width: $input-btn-border-width 0;\n\n &.form-control-sm,\n &.form-control-lg {\n padding-right: 0;\n padding-left: 0;\n }\n}\n\n\n// Form control sizing\n//\n// Build on `.form-control` with modifier classes to decrease or increase the\n// height and font-size of form controls.\n//\n// The `.form-group-* form-control` variations are sadly duplicated to avoid the\n// issue documented in https://github.com/twbs/bootstrap/issues/15074.\n\n.form-control-sm {\n padding: $input-btn-padding-y-sm $input-btn-padding-x-sm;\n font-size: $font-size-sm;\n line-height: $input-btn-line-height-sm;\n @include border-radius($input-border-radius-sm);\n}\n\nselect.form-control-sm {\n &:not([size]):not([multiple]) {\n height: $input-height-sm;\n }\n}\n\n.form-control-lg {\n padding: $input-btn-padding-y-lg $input-btn-padding-x-lg;\n font-size: $font-size-lg;\n line-height: $input-btn-line-height-lg;\n @include border-radius($input-border-radius-lg);\n}\n\nselect.form-control-lg {\n &:not([size]):not([multiple]) {\n height: $input-height-lg;\n }\n}\n\n\n// Form groups\n//\n// Designed to help with the organization and spacing of vertical forms. For\n// horizontal forms, use the predefined grid classes.\n\n.form-group {\n margin-bottom: $form-group-margin-bottom;\n}\n\n.form-text {\n display: block;\n margin-top: $form-text-margin-top;\n}\n\n\n// Form grid\n//\n// Special replacement for our grid system's `.row` for tighter form layouts.\n\n.form-row {\n display: flex;\n flex-wrap: wrap;\n margin-right: -5px;\n margin-left: -5px;\n\n > .col,\n > [class*=\"col-\"] {\n padding-right: 5px;\n padding-left: 5px;\n }\n}\n\n\n// Checkboxes and radios\n//\n// Indent the labels to position radios/checkboxes as hanging controls.\n\n.form-check {\n position: relative;\n display: block;\n margin-bottom: $form-check-margin-bottom;\n\n &.disabled {\n .form-check-label {\n color: $text-muted;\n }\n }\n}\n\n.form-check-label {\n padding-left: $form-check-input-gutter;\n margin-bottom: 0; // Override default `<label>` bottom margin\n}\n\n.form-check-input {\n position: absolute;\n margin-top: $form-check-input-margin-y;\n margin-left: -$form-check-input-gutter;\n\n &:only-child {\n position: static;\n }\n}\n\n// Radios and checkboxes on same line\n.form-check-inline {\n display: inline-block;\n\n .form-check-label {\n vertical-align: middle;\n }\n\n + .form-check-inline {\n margin-left: $form-check-inline-margin-x;\n }\n}\n\n\n// Form validation\n//\n// Provide feedback to users when form field values are valid or invalid. Works\n// primarily for client-side validation via scoped `:invalid` and `:valid`\n// pseudo-classes but also includes `.is-invalid` and `.is-valid` classes for\n// server side validation.\n\n.invalid-feedback {\n display: none;\n margin-top: .25rem;\n font-size: .875rem;\n color: $form-feedback-invalid-color;\n}\n\n.invalid-tooltip {\n position: absolute;\n top: 100%;\n z-index: 5;\n display: none;\n width: 250px;\n padding: .5rem;\n margin-top: .1rem;\n font-size: .875rem;\n line-height: 1;\n color: #fff;\n background-color: rgba($form-feedback-invalid-color,.8);\n border-radius: .2rem;\n}\n\n@include form-validation-state(\"valid\", $form-feedback-valid-color);\n@include form-validation-state(\"invalid\", $form-feedback-invalid-color);\n\n// Inline forms\n//\n// Make forms appear inline(-block) by adding the `.form-inline` class. Inline\n// forms begin stacked on extra small (mobile) devices and then go inline when\n// viewports reach <768px.\n//\n// Requires wrapping inputs and labels with `.form-group` for proper display of\n// default HTML form controls and our custom form controls (e.g., input groups).\n\n.form-inline {\n display: flex;\n flex-flow: row wrap;\n align-items: center; // Prevent shorter elements from growing to same height as others (e.g., small buttons growing to normal sized button height)\n\n // Because we use flex, the initial sizing of checkboxes is collapsed and\n // doesn't occupy the full-width (which is what we want for xs grid tier),\n // so we force that here.\n .form-check {\n width: 100%;\n }\n\n // Kick in the inline\n @include media-breakpoint-up(sm) {\n label {\n display: flex;\n align-items: center;\n justify-content: center;\n margin-bottom: 0;\n }\n\n // Inline-block all the things for \"inline\"\n .form-group {\n display: flex;\n flex: 0 0 auto;\n flex-flow: row wrap;\n align-items: center;\n margin-bottom: 0;\n }\n\n // Allow folks to *not* use `.form-group`\n .form-control {\n display: inline-block;\n width: auto; // Prevent labels from stacking above inputs in `.form-group`\n vertical-align: middle;\n }\n\n // Make static controls behave like regular ones\n .form-control-plaintext {\n display: inline-block;\n }\n\n .input-group {\n width: auto;\n }\n\n .form-control-label {\n margin-bottom: 0;\n vertical-align: middle;\n }\n\n // Remove default margin on radios/checkboxes that were used for stacking, and\n // then undo the floating of radios and checkboxes to match.\n .form-check {\n display: flex;\n align-items: center;\n justify-content: center;\n width: auto;\n margin-top: 0;\n margin-bottom: 0;\n }\n .form-check-label {\n padding-left: 0;\n }\n .form-check-input {\n position: relative;\n margin-top: 0;\n margin-right: $form-check-input-margin-x;\n margin-left: 0;\n }\n\n // Custom form controls\n .custom-control {\n display: flex;\n align-items: center;\n justify-content: center;\n padding-left: 0;\n }\n .custom-control-indicator {\n position: static;\n display: inline-block;\n margin-right: $form-check-input-margin-x; // Flexbox alignment means we lose our HTML space here, so we compensate.\n vertical-align: text-bottom;\n }\n\n // Re-override the feedback icon.\n .has-feedback .form-control-feedback {\n top: 0;\n }\n }\n}\n","// Form control focus state\n//\n// Generate a customized focus state and for any input with the specified color,\n// which defaults to the `@input-border-color-focus` variable.\n//\n// We highly encourage you to not customize the default value, but instead use\n// this to tweak colors on an as-needed basis. This aesthetic change is based on\n// WebKit's default styles, but applicable to a wider range of browsers. Its\n// usability and accessibility should be taken into account with any change.\n//\n// Example usage: change the default blue border and shadow to white for better\n// contrast against a dark gray background.\n@mixin form-control-focus() {\n &:focus {\n color: $input-focus-color;\n background-color: $input-focus-bg;\n border-color: $input-focus-border-color;\n outline: none;\n @include box-shadow($input-focus-box-shadow);\n }\n}\n\n\n@mixin form-validation-state($state, $color) {\n\n .form-control,\n .custom-select {\n .was-validated &:#{$state},\n &.is-#{$state} {\n border-color: $color;\n\n &:focus {\n box-shadow: 0 0 0 .2rem rgba($color,.25);\n }\n\n ~ .invalid-feedback,\n ~ .invalid-tooltip {\n display: block;\n }\n }\n }\n\n\n // TODO: redo check markup lol crap\n .form-check-input {\n .was-validated &:#{$state},\n &.is-#{$state} {\n + .form-check-label {\n color: $color;\n }\n }\n }\n\n // custom radios and checks\n .custom-control-input {\n .was-validated &:#{$state},\n &.is-#{$state} {\n ~ .custom-control-indicator {\n background-color: rgba($color, .25);\n }\n ~ .custom-control-description {\n color: $color;\n }\n }\n }\n\n // custom file\n .custom-file-input {\n .was-validated &:#{$state},\n &.is-#{$state} {\n ~ .custom-file-control {\n border-color: $color;\n\n &::before { border-color: inherit; }\n }\n &:focus {\n box-shadow: 0 0 0 .2rem rgba($color,.25);\n }\n }\n }\n}\n","// scss-lint:disable QualifyingElement\n\n//\n// Base styles\n//\n\n.btn {\n display: inline-block;\n font-weight: $btn-font-weight;\n text-align: center;\n white-space: nowrap;\n vertical-align: middle;\n user-select: none;\n border: $input-btn-border-width solid transparent;\n @include button-size($input-btn-padding-y, $input-btn-padding-x, $font-size-base, $input-btn-line-height, $btn-border-radius);\n @include transition($btn-transition);\n\n // Share hover and focus styles\n @include hover-focus {\n text-decoration: none;\n }\n &:focus,\n &.focus {\n outline: 0;\n box-shadow: $btn-focus-box-shadow;\n }\n\n // Disabled comes first so active can properly restyle\n &.disabled,\n &:disabled {\n opacity: .65;\n @include box-shadow(none);\n }\n\n &:active,\n &.active {\n background-image: none;\n @include box-shadow($btn-focus-box-shadow, $btn-active-box-shadow);\n }\n}\n\n// Future-proof disabling of clicks on `<a>` elements\na.btn.disabled,\nfieldset[disabled] a.btn {\n pointer-events: none;\n}\n\n\n//\n// Alternate buttons\n//\n\n@each $color, $value in $theme-colors {\n .btn-#{$color} {\n @include button-variant($value, $value);\n }\n}\n\n@each $color, $value in $theme-colors {\n .btn-outline-#{$color} {\n @include button-outline-variant($value, #fff);\n }\n}\n\n\n//\n// Link buttons\n//\n\n// Make a button look and behave like a link\n.btn-link {\n font-weight: $font-weight-normal;\n color: $link-color;\n border-radius: 0;\n\n &,\n &:active,\n &.active,\n &:disabled {\n background-color: transparent;\n @include box-shadow(none);\n }\n &,\n &:focus,\n &:active {\n border-color: transparent;\n box-shadow: none;\n }\n @include hover {\n border-color: transparent;\n }\n @include hover-focus {\n color: $link-hover-color;\n text-decoration: $link-hover-decoration;\n background-color: transparent;\n }\n &:disabled {\n color: $btn-link-disabled-color;\n\n @include hover-focus {\n text-decoration: none;\n }\n }\n}\n\n\n//\n// Button Sizes\n//\n\n.btn-lg {\n @include button-size($input-btn-padding-y-lg, $input-btn-padding-x-lg, $font-size-lg, $line-height-lg, $btn-border-radius-lg);\n}\n\n.btn-sm {\n @include button-size($input-btn-padding-y-sm, $input-btn-padding-x-sm, $font-size-sm, $line-height-sm, $btn-border-radius-sm);\n}\n\n\n//\n// Block button\n//\n\n.btn-block {\n display: block;\n width: 100%;\n}\n\n// Vertically space out multiple block buttons\n.btn-block + .btn-block {\n margin-top: $btn-block-spacing-y;\n}\n\n// Specificity overrides\ninput[type=\"submit\"],\ninput[type=\"reset\"],\ninput[type=\"button\"] {\n &.btn-block {\n width: 100%;\n }\n}\n","// Button variants\n//\n// Easily pump out default styles, as well as :hover, :focus, :active,\n// and disabled options for all buttons\n\n@mixin button-variant($background, $border, $active-background: darken($background, 7.5%), $active-border: darken($border, 10%)) {\n @include color-yiq($background);\n background-color: $background;\n border-color: $border;\n @include box-shadow($btn-box-shadow);\n\n &:hover {\n @include color-yiq($background);\n background-color: $active-background;\n border-color: $active-border;\n }\n\n &:focus,\n &.focus {\n // Avoid using mixin so we can pass custom focus shadow properly\n @if $enable-shadows {\n box-shadow: $btn-box-shadow, 0 0 0 3px rgba($border, .5);\n } @else {\n box-shadow: 0 0 0 3px rgba($border, .5);\n }\n }\n\n // Disabled comes first so active can properly restyle\n &.disabled,\n &:disabled {\n background-color: $background;\n border-color: $border;\n }\n\n &:active,\n &.active,\n .show > &.dropdown-toggle {\n background-color: $active-background;\n background-image: none; // Remove the gradient for the pressed/active state\n border-color: $active-border;\n @include box-shadow($btn-active-box-shadow);\n }\n}\n\n@mixin button-outline-variant($color, $color-hover: #fff) {\n color: $color;\n background-color: transparent;\n background-image: none;\n border-color: $color;\n\n @include hover {\n color: $color-hover;\n background-color: $color;\n border-color: $color;\n }\n\n &:focus,\n &.focus {\n box-shadow: 0 0 0 3px rgba($color, .5);\n }\n\n &.disabled,\n &:disabled {\n color: $color;\n background-color: transparent;\n }\n\n &:active,\n &.active,\n .show > &.dropdown-toggle {\n color: $color-hover;\n background-color: $color;\n border-color: $color;\n }\n}\n\n// Button sizes\n@mixin button-size($padding-y, $padding-x, $font-size, $line-height, $border-radius) {\n padding: $padding-y $padding-x;\n font-size: $font-size;\n line-height: $line-height;\n @include border-radius($border-radius);\n}\n","// Bootstrap functions\n//\n// Utility mixins and functions for evalutating source code across our variables, maps, and mixins.\n\n// Ascending\n// Used to evaluate Sass maps like our grid breakpoints.\n@mixin _assert-ascending($map, $map-name) {\n $prev-key: null;\n $prev-num: null;\n @each $key, $num in $map {\n @if $prev-num == null {\n // Do nothing\n } @else if not comparable($prev-num, $num) {\n @warn \"Potentially invalid value for #{$map-name}: This map must be in ascending order, but key '#{$key}' has value #{$num} whose unit makes it incomparable to #{$prev-num}, the value of the previous key '#{$prev-key}' !\";\n } @else if $prev-num >= $num {\n @warn \"Invalid value for #{$map-name}: This map must be in ascending order, but key '#{$key}' has value #{$num} which isn't greater than #{$prev-num}, the value of the previous key '#{$prev-key}' !\";\n }\n $prev-key: $key;\n $prev-num: $num;\n }\n}\n\n// Starts at zero\n// Another grid mixin that ensures the min-width of the lowest breakpoint starts at 0.\n@mixin _assert-starts-at-zero($map) {\n $values: map-values($map);\n $first-value: nth($values, 1);\n @if $first-value != 0 {\n @warn \"First breakpoint in `$grid-breakpoints` must start at 0, but starts at #{$first-value}.\";\n }\n}\n\n// Replace `$search` with `$replace` in `$string`\n// Used on our SVG icon backgrounds for custom forms.\n//\n// @author Hugo Giraudel\n// @param {String} $string - Initial string\n// @param {String} $search - Substring to replace\n// @param {String} $replace ('') - New value\n// @return {String} - Updated string\n@function str-replace($string, $search, $replace: \"\") {\n $index: str-index($string, $search);\n\n @if $index {\n @return str-slice($string, 1, $index - 1) + $replace + str-replace(str-slice($string, $index + str-length($search)), $search, $replace);\n }\n\n @return $string;\n}\n\n// Color contrast\n@mixin color-yiq($color) {\n $r: red($color);\n $g: green($color);\n $b: blue($color);\n\n $yiq: (($r * 299) + ($g * 587) + ($b * 114)) / 1000;\n\n @if ($yiq >= 150) {\n color: #111;\n } @else {\n color: #fff;\n }\n}\n\n// Retreive color Sass maps\n@function color($key: \"blue\") {\n @return map-get($colors, $key);\n}\n\n@function theme-color($key: \"primary\") {\n @return map-get($theme-colors, $key);\n}\n\n@function grayscale($key: \"100\") {\n @return map-get($grays, $key);\n}\n\n// Request a theme color level\n@function theme-color-level($color-name: \"primary\", $level: 0) {\n $color: theme-color($color-name);\n $color-base: if($level > 0, #000, #fff);\n\n @if $level < 0 {\n // Lighter values need a quick double negative for the Sass math to work\n @return mix($color-base, $color, $level * -1 * $theme-color-interval);\n } @else {\n @return mix($color-base, $color, $level * $theme-color-interval);\n }\n}\n",".fade {\n opacity: 0;\n @include transition($transition-fade);\n\n &.show {\n opacity: 1;\n }\n}\n\n.collapse {\n display: none;\n &.show {\n display: block;\n }\n}\n\ntr {\n &.collapse.show {\n display: table-row;\n }\n}\n\ntbody {\n &.collapse.show {\n display: table-row-group;\n }\n}\n\n.collapsing {\n position: relative;\n height: 0;\n overflow: hidden;\n @include transition($transition-collapse);\n}\n","// The dropdown wrapper (`<div>`)\n.dropup,\n.dropdown {\n position: relative;\n}\n\n.dropdown-toggle {\n // Generate the caret automatically\n &::after {\n display: inline-block;\n width: 0;\n height: 0;\n margin-left: $caret-width * .85;\n vertical-align: $caret-width * .85;\n content: \"\";\n border-top: $caret-width solid;\n border-right: $caret-width solid transparent;\n border-left: $caret-width solid transparent;\n }\n\n &:empty::after {\n margin-left: 0;\n }\n}\n\n// Allow for dropdowns to go bottom up (aka, dropup-menu)\n// Just add .dropup after the standard .dropdown class and you're set.\n.dropup {\n .dropdown-menu {\n margin-top: 0;\n margin-bottom: $dropdown-spacer;\n }\n\n .dropdown-toggle {\n &::after {\n border-top: 0;\n border-bottom: $caret-width solid;\n }\n }\n}\n\n// The dropdown menu\n.dropdown-menu {\n position: absolute;\n top: 100%;\n left: 0;\n z-index: $zindex-dropdown;\n display: none; // none by default, but block on \"open\" of the menu\n float: left;\n min-width: $dropdown-min-width;\n padding: $dropdown-padding-y 0;\n margin: $dropdown-spacer 0 0; // override default ul\n font-size: $font-size-base; // Redeclare because nesting can cause inheritance issues\n color: $body-color;\n text-align: left; // Ensures proper alignment if parent has it changed (e.g., modal footer)\n list-style: none;\n background-color: $dropdown-bg;\n background-clip: padding-box;\n border: $dropdown-border-width solid $dropdown-border-color;\n @include border-radius($border-radius);\n @include box-shadow($dropdown-box-shadow);\n}\n\n// Dividers (basically an `<hr>`) within the dropdown\n.dropdown-divider {\n @include nav-divider($dropdown-divider-bg);\n}\n\n// Links, buttons, and more within the dropdown menu\n//\n// `<button>`-specific styles are denoted with `// For <button>s`\n.dropdown-item {\n display: block;\n width: 100%; // For `<button>`s\n padding: $dropdown-item-padding-y $dropdown-item-padding-x;\n clear: both;\n font-weight: $font-weight-normal;\n color: $dropdown-link-color;\n text-align: inherit; // For `<button>`s\n white-space: nowrap; // prevent links from randomly breaking onto new lines\n background: none; // For `<button>`s\n border: 0; // For `<button>`s\n\n @include hover-focus {\n color: $dropdown-link-hover-color;\n text-decoration: none;\n background-color: $dropdown-link-hover-bg;\n }\n\n &.active,\n &:active {\n color: $dropdown-link-active-color;\n text-decoration: none;\n background-color: $dropdown-link-active-bg;\n }\n\n &.disabled,\n &:disabled {\n color: $dropdown-link-disabled-color;\n background-color: transparent;\n // Remove CSS gradients if they're enabled\n @if $enable-gradients {\n background-image: none;\n }\n }\n}\n\n// Open state for the dropdown\n.show {\n // Remove the outline when :focus is triggered\n > a {\n outline: 0;\n }\n}\n\n.dropdown-menu.show {\n display: block;\n}\n\n// Dropdown section headers\n.dropdown-header {\n display: block;\n padding: $dropdown-padding-y $dropdown-item-padding-x;\n margin-bottom: 0; // for use with heading elements\n font-size: $font-size-sm;\n color: $dropdown-header-color;\n white-space: nowrap; // as with > li > a\n}\n","// Horizontal dividers\n//\n// Dividers (basically an hr) within dropdowns and nav lists\n\n@mixin nav-divider($color: #e5e5e5) {\n height: 0;\n margin: ($spacer / 2) 0;\n overflow: hidden;\n border-top: 1px solid $color;\n}\n","// scss-lint:disable QualifyingElement\n\n// Make the div behave like a button\n.btn-group,\n.btn-group-vertical {\n position: relative;\n display: inline-flex;\n vertical-align: middle; // match .btn alignment given font-size hack above\n\n > .btn {\n position: relative;\n flex: 0 1 auto;\n margin-bottom: 0;\n\n // Bring the hover, focused, and \"active\" buttons to the front to overlay\n // the borders properly\n @include hover {\n z-index: 2;\n }\n &:focus,\n &:active,\n &.active {\n z-index: 2;\n }\n }\n\n // Prevent double borders when buttons are next to each other\n .btn + .btn,\n .btn + .btn-group,\n .btn-group + .btn,\n .btn-group + .btn-group {\n margin-left: -$input-btn-border-width;\n }\n}\n\n// Optional: Group multiple button groups together for a toolbar\n.btn-toolbar {\n display: flex;\n flex-wrap: wrap;\n justify-content: flex-start;\n\n .input-group {\n width: auto;\n }\n}\n\n.btn-group > .btn:not(:first-child):not(:last-child):not(.dropdown-toggle) {\n border-radius: 0;\n}\n\n// 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\n.btn-group > .btn:first-child {\n margin-left: 0;\n\n &:not(:last-child):not(.dropdown-toggle) {\n @include border-right-radius(0);\n }\n}\n// Need .dropdown-toggle since :last-child doesn't apply given a .dropdown-menu immediately after it\n.btn-group > .btn:last-child:not(:first-child),\n.btn-group > .dropdown-toggle:not(:first-child) {\n @include border-left-radius(0);\n}\n\n// Custom edits for including btn-groups within btn-groups (useful for including dropdown buttons within a btn-group)\n.btn-group > .btn-group {\n float: left;\n}\n.btn-group > .btn-group:not(:first-child):not(:last-child) > .btn {\n border-radius: 0;\n}\n.btn-group > .btn-group:first-child:not(:last-child) {\n > .btn:last-child,\n > .dropdown-toggle {\n @include border-right-radius(0);\n }\n}\n.btn-group > .btn-group:last-child:not(:first-child) > .btn:first-child {\n @include border-left-radius(0);\n}\n\n\n// Sizing\n//\n// Remix the default button sizing classes into new ones for easier manipulation.\n\n.btn-group-sm > .btn { @extend .btn-sm; }\n.btn-group-lg > .btn { @extend .btn-lg; }\n\n\n//\n// Split button dropdowns\n//\n\n.btn + .dropdown-toggle-split {\n padding-right: $input-btn-padding-x * .75;\n padding-left: $input-btn-padding-x * .75;\n\n &::after {\n margin-left: 0;\n }\n}\n\n.btn-sm + .dropdown-toggle-split {\n padding-right: $input-btn-padding-x-sm * .75;\n padding-left: $input-btn-padding-x-sm * .75;\n}\n\n.btn-lg + .dropdown-toggle-split {\n padding-right: $input-btn-padding-x-lg * .75;\n padding-left: $input-btn-padding-x-lg * .75;\n}\n\n\n// The clickable button for toggling the menu\n// Set the same inset shadow as the :active state\n.btn-group.show .dropdown-toggle {\n @include box-shadow($btn-active-box-shadow);\n\n // Show no shadow for `.btn-link` since it has no other button styles.\n &.btn-link {\n @include box-shadow(none);\n }\n}\n\n\n//\n// Vertical button groups\n//\n\n.btn-group-vertical {\n display: inline-flex;\n flex-direction: column;\n align-items: flex-start;\n justify-content: center;\n\n .btn,\n .btn-group {\n width: 100%;\n }\n\n > .btn + .btn,\n > .btn + .btn-group,\n > .btn-group + .btn,\n > .btn-group + .btn-group {\n margin-top: -$input-btn-border-width;\n margin-left: 0;\n }\n}\n\n.btn-group-vertical > .btn {\n &:not(:first-child):not(:last-child) {\n border-radius: 0;\n }\n &:first-child:not(:last-child) {\n @include border-bottom-radius(0);\n }\n &:last-child:not(:first-child) {\n @include border-top-radius(0);\n }\n}\n.btn-group-vertical > .btn-group:not(:first-child):not(:last-child) > .btn {\n border-radius: 0;\n}\n.btn-group-vertical > .btn-group:first-child:not(:last-child) {\n > .btn:last-child,\n > .dropdown-toggle {\n @include border-bottom-radius(0);\n }\n}\n.btn-group-vertical > .btn-group:last-child:not(:first-child) > .btn:first-child {\n @include border-top-radius(0);\n}\n\n\n// Checkbox and radio options\n//\n// In order to support the browser's form validation feedback, powered by the\n// `required` attribute, we have to \"hide\" the inputs via `clip`. We cannot use\n// `display: none;` or `visibility: hidden;` as that also hides the popover.\n// Simply visually hiding the inputs via `opacity` would leave them clickable in\n// certain cases which is prevented by using `clip` and `pointer-events`.\n// This way, we ensure a DOM element is visible to position the popover from.\n//\n// See https://github.com/twbs/bootstrap/pull/12794 and\n// https://github.com/twbs/bootstrap/pull/14559 for more information.\n\n[data-toggle=\"buttons\"] {\n > .btn,\n > .btn-group > .btn {\n input[type=\"radio\"],\n input[type=\"checkbox\"] {\n position: absolute;\n clip: rect(0,0,0,0);\n pointer-events: none;\n }\n }\n}\n","//\n// Base styles\n//\n\n.input-group {\n position: relative;\n display: flex;\n width: 100%;\n\n .form-control {\n // Ensure that the input is always above the *appended* addon button for\n // proper border colors.\n position: relative;\n z-index: 2;\n flex: 1 1 auto;\n // Add width 1% and flex-basis auto to ensure that button will not wrap out\n // the column. Applies to IE Edge+ and Firefox. Chrome does not require this.\n width: 1%;\n margin-bottom: 0;\n\n // Bring the \"active\" form control to the front\n @include hover-focus-active {\n z-index: 3;\n }\n }\n}\n\n.input-group-addon,\n.input-group-btn,\n.input-group .form-control {\n // Vertically centers the content of the addons within the input group\n display: flex;\n align-items: center;\n\n &:not(:first-child):not(:last-child) {\n @include border-radius(0);\n }\n}\n\n.input-group-addon,\n.input-group-btn {\n white-space: nowrap;\n vertical-align: middle; // Match the inputs\n}\n\n\n// Sizing options\n//\n// Remix the default form control sizing classes into new ones for easier\n// manipulation.\n\n.input-group-lg > .form-control,\n.input-group-lg > .input-group-addon,\n.input-group-lg > .input-group-btn > .btn {\n @extend .form-control-lg;\n}\n.input-group-sm > .form-control,\n.input-group-sm > .input-group-addon,\n.input-group-sm > .input-group-btn > .btn {\n @extend .form-control-sm;\n}\n\n\n//\n// Text input groups\n//\n\n.input-group-addon {\n padding: $input-btn-padding-y $input-btn-padding-x;\n margin-bottom: 0; // Allow use of <label> elements by overriding our default margin-bottom\n font-size: $font-size-base; // Match inputs\n font-weight: $font-weight-normal;\n line-height: $input-btn-line-height;\n color: $input-color;\n text-align: center;\n background-color: $input-group-addon-bg;\n border: $input-btn-border-width solid $input-group-addon-border-color;\n @include border-radius($input-border-radius);\n\n // Sizing\n &.form-control-sm {\n padding: $input-btn-padding-y-sm $input-btn-padding-x-sm;\n font-size: $font-size-sm;\n @include border-radius($input-border-radius-sm);\n }\n\n &.form-control-lg {\n padding: $input-btn-padding-y-lg $input-btn-padding-x-lg;\n font-size: $font-size-lg;\n @include border-radius($input-border-radius-lg);\n }\n\n // scss-lint:disable QualifyingElement\n // Nuke default margins from checkboxes and radios to vertically center within.\n input[type=\"radio\"],\n input[type=\"checkbox\"] {\n margin-top: 0;\n }\n // scss-lint:enable QualifyingElement\n}\n\n\n//\n// Reset rounded corners\n//\n\n.input-group .form-control:not(:last-child),\n.input-group-addon:not(:last-child),\n.input-group-btn:not(:last-child) > .btn,\n.input-group-btn:not(:last-child) > .btn-group > .btn,\n.input-group-btn:not(:last-child) > .dropdown-toggle,\n.input-group-btn:not(:first-child) > .btn:not(:last-child):not(.dropdown-toggle),\n.input-group-btn:not(:first-child) > .btn-group:not(:last-child) > .btn {\n @include border-right-radius(0);\n}\n.input-group-addon:not(:last-child) {\n border-right: 0;\n}\n.input-group .form-control:not(:first-child),\n.input-group-addon:not(:first-child),\n.input-group-btn:not(:first-child) > .btn,\n.input-group-btn:not(:first-child) > .btn-group > .btn,\n.input-group-btn:not(:first-child) > .dropdown-toggle,\n.input-group-btn:not(:last-child) > .btn:not(:first-child),\n.input-group-btn:not(:last-child) > .btn-group:not(:first-child) > .btn {\n @include border-left-radius(0);\n}\n.form-control + .input-group-addon:not(:first-child) {\n border-left: 0;\n}\n\n//\n// Button input groups\n//\n\n.input-group-btn {\n position: relative;\n // Jankily prevent input button groups from wrapping with `white-space` and\n // `font-size` in combination with `inline-block` on buttons.\n font-size: 0;\n white-space: nowrap;\n\n // Negative margin for spacing, position for bringing hovered/focused/actived\n // element above the siblings.\n > .btn {\n position: relative;\n\n + .btn {\n margin-left: (-$input-btn-border-width);\n }\n\n // Bring the \"active\" button to the front\n @include hover-focus-active {\n z-index: 3;\n }\n }\n\n // Negative margin to only have a single, shared border between the two\n &:not(:last-child) {\n > .btn,\n > .btn-group {\n margin-right: (-$input-btn-border-width);\n }\n }\n &:not(:first-child) {\n > .btn,\n > .btn-group {\n z-index: 2;\n margin-left: (-$input-btn-border-width);\n // Because specificity\n @include hover-focus-active {\n z-index: 3;\n }\n }\n }\n}\n","// scss-lint:disable PropertyCount, VendorPrefix\n\n// Embedded icons from Open Iconic.\n// Released under MIT and copyright 2014 Waybury.\n// https://useiconic.com/open\n\n\n// Checkboxes and radios\n//\n// Base class takes care of all the key behavioral aspects.\n\n.custom-control {\n position: relative;\n display: inline-flex;\n min-height: (1rem * $line-height-base);\n padding-left: $custom-control-gutter;\n margin-right: $custom-control-spacer-x;\n}\n\n.custom-control-input {\n position: absolute;\n z-index: -1; // Put the input behind the label so it doesn't overlay text\n opacity: 0;\n\n &:checked ~ .custom-control-indicator {\n color: $custom-control-indicator-checked-color;\n background-color: $custom-control-indicator-checked-bg;\n @include box-shadow($custom-control-indicator-checked-box-shadow);\n }\n\n &:focus ~ .custom-control-indicator {\n // the mixin is not used here to make sure there is feedback\n box-shadow: $custom-control-indicator-focus-box-shadow;\n }\n\n &:active ~ .custom-control-indicator {\n color: $custom-control-indicator-active-color;\n background-color: $custom-control-indicator-active-bg;\n @include box-shadow($custom-control-indicator-active-box-shadow);\n }\n\n &:disabled {\n ~ .custom-control-indicator {\n background-color: $custom-control-indicator-disabled-bg;\n }\n\n ~ .custom-control-description {\n color: $custom-control-description-disabled-color;\n }\n }\n}\n\n// Custom indicator\n//\n// Generates a shadow element to create our makeshift checkbox/radio background.\n\n.custom-control-indicator {\n position: absolute;\n top: (($line-height-base - $custom-control-indicator-size) / 2);\n left: 0;\n display: block;\n width: $custom-control-indicator-size;\n height: $custom-control-indicator-size;\n pointer-events: none;\n user-select: none;\n background-color: $custom-control-indicator-bg;\n background-repeat: no-repeat;\n background-position: center center;\n background-size: $custom-control-indicator-bg-size;\n @include box-shadow($custom-control-indicator-box-shadow);\n}\n\n// Checkboxes\n//\n// Tweak just a few things for checkboxes.\n\n.custom-checkbox {\n .custom-control-indicator {\n @include border-radius($custom-checkbox-indicator-border-radius);\n }\n\n .custom-control-input:checked ~ .custom-control-indicator {\n background-image: $custom-checkbox-indicator-icon-checked;\n }\n\n .custom-control-input:indeterminate ~ .custom-control-indicator {\n background-color: $custom-checkbox-indicator-indeterminate-bg;\n background-image: $custom-checkbox-indicator-icon-indeterminate;\n @include box-shadow($custom-checkbox-indicator-indeterminate-box-shadow);\n }\n}\n\n// Radios\n//\n// Tweak just a few things for radios.\n\n.custom-radio {\n .custom-control-indicator {\n border-radius: $custom-radio-indicator-border-radius;\n }\n\n .custom-control-input:checked ~ .custom-control-indicator {\n background-image: $custom-radio-indicator-icon-checked;\n }\n}\n\n\n// Layout options\n//\n// By default radios and checkboxes are `inline-block` with no additional spacing\n// set. Use these optional classes to tweak the layout.\n\n.custom-controls-stacked {\n display: flex;\n flex-direction: column;\n\n .custom-control {\n margin-bottom: $custom-control-spacer-y;\n\n + .custom-control {\n margin-left: 0;\n }\n }\n}\n\n\n// Select\n//\n// Replaces the browser default select with a custom one, mostly pulled from\n// http://primercss.io.\n//\n\n.custom-select {\n display: inline-block;\n max-width: 100%;\n height: $input-height;\n padding: $custom-select-padding-y ($custom-select-padding-x + $custom-select-indicator-padding) $custom-select-padding-y $custom-select-padding-x;\n line-height: $custom-select-line-height;\n color: $custom-select-color;\n vertical-align: middle;\n background: $custom-select-bg $custom-select-indicator no-repeat right $custom-select-padding-x center;\n background-size: $custom-select-bg-size;\n border: $custom-select-border-width solid $custom-select-border-color;\n @if $enable-rounded {\n border-radius: $custom-select-border-radius;\n } @else {\n border-radius: 0;\n }\n appearance: none;\n\n &:focus {\n border-color: $custom-select-focus-border-color;\n outline: none;\n @include box-shadow($custom-select-focus-box-shadow);\n\n &::-ms-value {\n // For visual consistency with other platforms/browsers,\n // supress the default white text on blue background highlight given to\n // the selected option text when the (still closed) <select> receives focus\n // in IE and (under certain conditions) Edge.\n // See https://github.com/twbs/bootstrap/issues/19398.\n color: $input-color;\n background-color: $input-bg;\n }\n }\n\n &:disabled {\n color: $custom-select-disabled-color;\n background-color: $custom-select-disabled-bg;\n }\n\n // Hides the default caret in IE11\n &::-ms-expand {\n opacity: 0;\n }\n}\n\n.custom-select-sm {\n height: $custom-select-height-sm;\n padding-top: $custom-select-padding-y;\n padding-bottom: $custom-select-padding-y;\n font-size: $custom-select-font-size-sm;\n}\n\n\n// File\n//\n// Custom file input.\n\n.custom-file {\n position: relative;\n display: inline-block;\n max-width: 100%;\n height: $custom-file-height;\n margin-bottom: 0;\n}\n\n.custom-file-input {\n min-width: $custom-file-width;\n max-width: 100%;\n height: $custom-file-height;\n margin: 0;\n opacity: 0;\n\n &:focus ~ .custom-file-control {\n @include box-shadow($custom-file-focus-box-shadow);\n }\n}\n\n.custom-file-control {\n position: absolute;\n top: 0;\n right: 0;\n left: 0;\n z-index: 5;\n height: $custom-file-height;\n padding: $custom-file-padding-x $custom-file-padding-y;\n line-height: $custom-file-line-height;\n color: $custom-file-color;\n pointer-events: none;\n user-select: none;\n background-color: $custom-file-bg;\n border: $custom-file-border-width solid $custom-file-border-color;\n @include border-radius($custom-file-border-radius);\n @include box-shadow($custom-file-box-shadow);\n\n @each $lang, $text in map-get($custom-file-text, placeholder) {\n &:lang(#{$lang}):empty::after {\n content: $text;\n }\n }\n\n &::before {\n position: absolute;\n top: -$custom-file-border-width;\n right: -$custom-file-border-width;\n bottom: -$custom-file-border-width;\n z-index: 6;\n display: block;\n height: $custom-file-height;\n padding: $custom-file-padding-x $custom-file-padding-y;\n line-height: $custom-file-line-height;\n color: $custom-file-button-color;\n background-color: $custom-file-button-bg;\n border: $custom-file-border-width solid $custom-file-border-color;\n @include border-radius(0 $custom-file-border-radius $custom-file-border-radius 0);\n }\n\n @each $lang, $text in map-get($custom-file-text, button-label) {\n &:lang(#{$lang})::before {\n content: $text;\n }\n }\n}\n","// Base class\n//\n// Kickstart any navigation component with a set of style resets. Works with\n// `<nav>`s or `<ul>`s.\n\n.nav {\n display: flex;\n flex-wrap: wrap;\n padding-left: 0;\n margin-bottom: 0;\n list-style: none;\n}\n\n.nav-link {\n display: block;\n padding: $nav-link-padding-y $nav-link-padding-x;\n\n @include hover-focus {\n text-decoration: none;\n }\n\n // Disabled state lightens text\n &.disabled {\n color: $nav-link-disabled-color;\n }\n}\n\n//\n// Tabs\n//\n\n.nav-tabs {\n border-bottom: $nav-tabs-border-width solid $nav-tabs-border-color;\n\n .nav-item {\n margin-bottom: -$nav-tabs-border-width;\n }\n\n .nav-link {\n border: $nav-tabs-border-width solid transparent;\n @include border-top-radius($nav-tabs-border-radius);\n\n @include hover-focus {\n border-color: $nav-tabs-link-hover-border-color $nav-tabs-link-hover-border-color $nav-tabs-border-color;\n }\n\n &.disabled {\n color: $nav-link-disabled-color;\n background-color: transparent;\n border-color: transparent;\n }\n }\n\n .nav-link.active,\n .nav-item.show .nav-link {\n color: $nav-tabs-link-active-color;\n background-color: $nav-tabs-link-active-bg;\n border-color: $nav-tabs-link-active-border-color $nav-tabs-link-active-border-color $nav-tabs-link-active-bg;\n }\n\n .dropdown-menu {\n // Make dropdown border overlap tab border\n margin-top: -$nav-tabs-border-width;\n // Remove the top rounded corners here since there is a hard edge above the menu\n @include border-top-radius(0);\n }\n}\n\n\n//\n// Pills\n//\n\n.nav-pills {\n .nav-link {\n @include border-radius($nav-pills-border-radius);\n\n &.active,\n .show > & {\n color: $nav-pills-link-active-color;\n background-color: $nav-pills-link-active-bg;\n }\n }\n}\n\n\n//\n// Justified variants\n//\n\n.nav-fill {\n .nav-item {\n flex: 1 1 auto;\n text-align: center;\n }\n}\n\n.nav-justified {\n .nav-item {\n flex-basis: 0;\n flex-grow: 1;\n text-align: center;\n }\n}\n\n\n// Tabbable tabs\n//\n// Hide tabbable panes to start, show them when `.active`\n\n.tab-content {\n > .tab-pane {\n display: none;\n }\n > .active {\n display: block;\n }\n}\n","// Contents\n//\n// Navbar\n// Navbar brand\n// Navbar nav\n// Navbar text\n// Navbar divider\n// Responsive navbar\n// Navbar position\n// Navbar themes\n\n\n// Navbar\n//\n// Provide a static navbar from which we expand to create full-width, fixed, and\n// other navbar variations.\n\n.navbar {\n position: relative;\n display: flex;\n flex-wrap: wrap; // allow us to do the line break for collapsing content\n align-items: center;\n justify-content: space-between; // space out brand from logo\n padding: $navbar-padding-y $navbar-padding-x;\n\n // Because flex properties aren't inherited, we need to redeclare these first\n // few properities so that content nested within behave properly.\n > .container,\n > .container-fluid {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n justify-content: space-between;\n }\n}\n\n\n// Navbar brand\n//\n// Used for brand, project, or site names.\n\n.navbar-brand {\n display: inline-block;\n padding-top: $navbar-brand-padding-y;\n padding-bottom: $navbar-brand-padding-y;\n margin-right: $navbar-padding-x;\n font-size: $navbar-brand-font-size;\n line-height: inherit;\n white-space: nowrap;\n\n @include hover-focus {\n text-decoration: none;\n }\n}\n\n\n// Navbar nav\n//\n// Custom navbar navigation (doesn't require `.nav`, but does make use of `.nav-link`).\n\n.navbar-nav {\n display: flex;\n flex-direction: column; // cannot use `inherit` to get the `.navbar`s value\n padding-left: 0;\n margin-bottom: 0;\n list-style: none;\n\n .nav-link {\n padding-right: 0;\n padding-left: 0;\n }\n\n .dropdown-menu {\n position: static;\n float: none;\n }\n}\n\n\n// Navbar text\n//\n//\n\n.navbar-text {\n display: inline-block;\n padding-top: $nav-link-padding-y;\n padding-bottom: $nav-link-padding-y;\n}\n\n\n// Responsive navbar\n//\n// Custom styles for responsive collapsing and toggling of navbar contents.\n// Powered by the collapse Bootstrap JavaScript plugin.\n\n// When collapsed, prevent the toggleable navbar contents from appearing in\n// the default flexbox row orienation. Requires the use of `flex-wrap: wrap`\n// on the `.navbar` parent.\n.navbar-collapse {\n flex-basis: 100%;\n // For always expanded or extra full navbars, ensure content aligns itself\n // properly vertically. Can be easily overridden with flex utilities.\n align-items: center;\n}\n\n// Button for toggling the navbar when in its collapsed state\n.navbar-toggler {\n padding: $navbar-toggler-padding-y $navbar-toggler-padding-x;\n font-size: $navbar-toggler-font-size;\n line-height: 1;\n background: transparent; // remove default button style\n border: $border-width solid transparent; // remove default button style\n @include border-radius($navbar-toggler-border-radius);\n\n @include hover-focus {\n text-decoration: none;\n }\n}\n\n// Keep as a separate element so folks can easily override it with another icon\n// or image file as needed.\n.navbar-toggler-icon {\n display: inline-block;\n width: 1.5em;\n height: 1.5em;\n vertical-align: middle;\n content: \"\";\n background: no-repeat center center;\n background-size: 100% 100%;\n}\n\n// Generate series of `.navbar-expand-*` responsive classes for configuring\n// where your navbar collapses.\n.navbar-expand {\n @each $breakpoint in map-keys($grid-breakpoints) {\n $next: breakpoint-next($breakpoint, $grid-breakpoints);\n $infix: breakpoint-infix($next, $grid-breakpoints);\n\n &#{$infix} {\n @include media-breakpoint-down($breakpoint) {\n > .container,\n > .container-fluid {\n padding-right: 0;\n padding-left: 0;\n }\n }\n\n @include media-breakpoint-up($next) {\n flex-direction: row;\n flex-wrap: nowrap;\n justify-content: flex-start;\n\n .navbar-nav {\n flex-direction: row;\n\n .dropdown-menu {\n position: absolute;\n }\n\n .dropdown-menu-right {\n right: 0;\n left: auto; // Reset the default from `.dropdown-menu`\n }\n\n .nav-link {\n padding-right: .5rem;\n padding-left: .5rem;\n }\n }\n\n // For nesting containers, have to redeclare for alignment purposes\n > .container,\n > .container-fluid {\n flex-wrap: nowrap;\n }\n\n // scss-lint:disable ImportantRule\n .navbar-collapse {\n display: flex !important;\n }\n // scss-lint:enable ImportantRule\n\n .navbar-toggler {\n display: none;\n }\n }\n }\n }\n}\n\n\n// Navbar themes\n//\n// Styles for switching between navbars with light or dark background.\n\n// Dark links against a light background\n.navbar-light {\n .navbar-brand {\n color: $navbar-light-active-color;\n\n @include hover-focus {\n color: $navbar-light-active-color;\n }\n }\n\n .navbar-nav {\n .nav-link {\n color: $navbar-light-color;\n\n @include hover-focus {\n color: $navbar-light-hover-color;\n }\n\n &.disabled {\n color: $navbar-light-disabled-color;\n }\n }\n\n .show > .nav-link,\n .active > .nav-link,\n .nav-link.show,\n .nav-link.active {\n color: $navbar-light-active-color;\n }\n }\n\n .navbar-toggler {\n color: $navbar-light-color;\n border-color: $navbar-light-toggler-border-color;\n }\n\n .navbar-toggler-icon {\n background-image: $navbar-light-toggler-icon-bg;\n }\n\n .navbar-text {\n color: $navbar-light-color;\n }\n}\n\n// White links against a dark background\n.navbar-dark {\n .navbar-brand {\n color: $navbar-dark-active-color;\n\n @include hover-focus {\n color: $navbar-dark-active-color;\n }\n }\n\n .navbar-nav {\n .nav-link {\n color: $navbar-dark-color;\n\n @include hover-focus {\n color: $navbar-dark-hover-color;\n }\n\n &.disabled {\n color: $navbar-dark-disabled-color;\n }\n }\n\n .show > .nav-link,\n .active > .nav-link,\n .nav-link.show,\n .nav-link.active {\n color: $navbar-dark-active-color;\n }\n }\n\n .navbar-toggler {\n color: $navbar-dark-color;\n border-color: $navbar-dark-toggler-border-color;\n }\n\n .navbar-toggler-icon {\n background-image: $navbar-dark-toggler-icon-bg;\n }\n\n .navbar-text {\n color: $navbar-dark-color;\n }\n}\n","//\n// Base styles\n//\n\n.card {\n position: relative;\n display: flex;\n flex-direction: column;\n min-width: 0;\n word-wrap: break-word;\n background-color: $card-bg;\n background-clip: border-box;\n border: $card-border-width solid $card-border-color;\n @include border-radius($card-border-radius);\n}\n\n.card-body {\n // Enable `flex-grow: 1` for decks and groups so that card blocks take up\n // as much space as possible, ensuring footers are aligned to the bottom.\n flex: 1 1 auto;\n padding: $card-spacer-x;\n}\n\n.card-title {\n margin-bottom: $card-spacer-y;\n}\n\n.card-subtitle {\n margin-top: -($card-spacer-y / 2);\n margin-bottom: 0;\n}\n\n.card-text:last-child {\n margin-bottom: 0;\n}\n\n.card-link {\n @include hover {\n text-decoration: none;\n }\n\n + .card-link {\n margin-left: $card-spacer-x;\n }\n}\n\n.card {\n > .list-group:first-child {\n .list-group-item:first-child {\n @include border-top-radius($card-border-radius);\n }\n }\n\n > .list-group:last-child {\n .list-group-item:last-child {\n @include border-bottom-radius($card-border-radius);\n }\n }\n}\n\n\n//\n// Optional textual caps\n//\n\n.card-header {\n padding: $card-spacer-y $card-spacer-x;\n margin-bottom: 0; // Removes the default margin-bottom of <hN>\n background-color: $card-cap-bg;\n border-bottom: $card-border-width solid $card-border-color;\n\n &:first-child {\n @include border-radius($card-inner-border-radius $card-inner-border-radius 0 0);\n }\n}\n\n.card-footer {\n padding: $card-spacer-y $card-spacer-x;\n background-color: $card-cap-bg;\n border-top: $card-border-width solid $card-border-color;\n\n &:last-child {\n @include border-radius(0 0 $card-inner-border-radius $card-inner-border-radius);\n }\n}\n\n\n//\n// Header navs\n//\n\n.card-header-tabs {\n margin-right: -($card-spacer-x / 2);\n margin-bottom: -$card-spacer-y;\n margin-left: -($card-spacer-x / 2);\n border-bottom: 0;\n}\n\n.card-header-pills {\n margin-right: -($card-spacer-x / 2);\n margin-left: -($card-spacer-x / 2);\n}\n\n// Card image\n.card-img-overlay {\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n padding: $card-img-overlay-padding;\n}\n\n.card-img {\n width: 100%; // Required because we use flexbox and this inherently applies align-self: stretch\n @include border-radius($card-inner-border-radius);\n}\n\n// Card image caps\n.card-img-top {\n width: 100%; // Required because we use flexbox and this inherently applies align-self: stretch\n @include border-top-radius($card-inner-border-radius);\n}\n\n.card-img-bottom {\n width: 100%; // Required because we use flexbox and this inherently applies align-self: stretch\n @include border-bottom-radius($card-inner-border-radius);\n}\n\n\n// Card deck\n\n@include media-breakpoint-up(sm) {\n .card-deck {\n display: flex;\n flex-flow: row wrap;\n margin-right: -$card-deck-margin;\n margin-left: -$card-deck-margin;\n\n .card {\n display: flex;\n flex: 1 0 0%;\n flex-direction: column;\n margin-right: $card-deck-margin;\n margin-left: $card-deck-margin;\n }\n }\n}\n\n\n//\n// Card groups\n//\n\n@include media-breakpoint-up(sm) {\n .card-group {\n display: flex;\n flex-flow: row wrap;\n\n .card {\n flex: 1 0 0%;\n\n + .card {\n margin-left: 0;\n border-left: 0;\n }\n\n // Handle rounded corners\n @if $enable-rounded {\n &:first-child {\n @include border-right-radius(0);\n\n .card-img-top {\n border-top-right-radius: 0;\n }\n .card-img-bottom {\n border-bottom-right-radius: 0;\n }\n }\n &:last-child {\n @include border-left-radius(0);\n\n .card-img-top {\n border-top-left-radius: 0;\n }\n .card-img-bottom {\n border-bottom-left-radius: 0;\n }\n }\n\n &:not(:first-child):not(:last-child) {\n border-radius: 0;\n\n .card-img-top,\n .card-img-bottom {\n border-radius: 0;\n }\n }\n }\n }\n }\n}\n\n\n//\n// Columns\n//\n\n.card-columns {\n .card {\n margin-bottom: $card-columns-margin;\n }\n\n @include media-breakpoint-up(sm) {\n column-count: $card-columns-count;\n column-gap: $card-columns-gap;\n\n .card {\n display: inline-block; // Don't let them vertically span multiple columns\n width: 100%; // Don't let their width change\n }\n }\n}\n",".breadcrumb {\n padding: $breadcrumb-padding-y $breadcrumb-padding-x;\n margin-bottom: 1rem;\n list-style: none;\n background-color: $breadcrumb-bg;\n @include border-radius($border-radius);\n @include clearfix;\n}\n\n.breadcrumb-item {\n float: left;\n\n // The separator between breadcrumbs (by default, a forward-slash: \"/\")\n + .breadcrumb-item::before {\n display: inline-block; // Suppress underlining of the separator in modern browsers\n padding-right: $breadcrumb-item-padding;\n padding-left: $breadcrumb-item-padding;\n color: $breadcrumb-divider-color;\n content: \"#{$breadcrumb-divider}\";\n }\n\n // IE9-11 hack to properly handle hyperlink underlines for breadcrumbs built\n // without `<ul>`s. The `::before` pseudo-element generates an element\n // *within* the .breadcrumb-item and thereby inherits the `text-decoration`.\n //\n // To trick IE into suppressing the underline, we give the pseudo-element an\n // underline and then immediately remove it.\n + .breadcrumb-item:hover::before {\n text-decoration: underline;\n }\n + .breadcrumb-item:hover::before {\n text-decoration: none;\n }\n\n &.active {\n color: $breadcrumb-active-color;\n }\n}\n","@mixin clearfix() {\n &::after {\n display: block;\n clear: both;\n content: \"\";\n }\n}\n",".pagination {\n display: flex;\n // 1-2: Disable browser default list styles\n padding-left: 0; // 1\n list-style: none; // 2\n @include border-radius();\n}\n\n.page-item {\n &:first-child {\n .page-link {\n margin-left: 0;\n @include border-left-radius($border-radius);\n }\n }\n &:last-child {\n .page-link {\n @include border-right-radius($border-radius);\n }\n }\n\n &.active .page-link {\n z-index: 2;\n color: $pagination-active-color;\n background-color: $pagination-active-bg;\n border-color: $pagination-active-border-color;\n }\n\n &.disabled .page-link {\n color: $pagination-disabled-color;\n pointer-events: none;\n background-color: $pagination-disabled-bg;\n border-color: $pagination-disabled-border-color;\n }\n}\n\n.page-link {\n position: relative;\n display: block;\n padding: $pagination-padding-y $pagination-padding-x;\n margin-left: -1px;\n line-height: $pagination-line-height;\n color: $pagination-color;\n background-color: $pagination-bg;\n border: $pagination-border-width solid $pagination-border-color;\n\n @include hover-focus {\n color: $pagination-hover-color;\n text-decoration: none;\n background-color: $pagination-hover-bg;\n border-color: $pagination-hover-border-color;\n }\n}\n\n\n//\n// Sizing\n//\n\n.pagination-lg {\n @include pagination-size($pagination-padding-y-lg, $pagination-padding-x-lg, $font-size-lg, $line-height-lg, $border-radius-lg);\n}\n\n.pagination-sm {\n @include pagination-size($pagination-padding-y-sm, $pagination-padding-x-sm, $font-size-sm, $line-height-sm, $border-radius-sm);\n}\n","// Pagination\n\n@mixin pagination-size($padding-y, $padding-x, $font-size, $line-height, $border-radius) {\n .page-link {\n padding: $padding-y $padding-x;\n font-size: $font-size;\n line-height: $line-height;\n }\n\n .page-item {\n &:first-child {\n .page-link {\n @include border-left-radius($border-radius);\n }\n }\n &:last-child {\n .page-link {\n @include border-right-radius($border-radius);\n }\n }\n }\n}\n","// Base class\n//\n// Requires one of the contextual, color modifier classes for `color` and\n// `background-color`.\n\n.badge {\n display: inline-block;\n padding: $badge-padding-y $badge-padding-x;\n font-size: $badge-font-size;\n font-weight: $badge-font-weight;\n line-height: 1;\n color: $badge-color;\n text-align: center;\n white-space: nowrap;\n vertical-align: baseline;\n @include border-radius();\n\n // Empty badges collapse automatically\n &:empty {\n display: none;\n }\n}\n\n// Quick fix for badges in buttons\n.btn .badge {\n position: relative;\n top: -1px;\n}\n\n// Pill badges\n//\n// Make them extra rounded with a modifier to replace v3's badges.\n\n.badge-pill {\n padding-right: $badge-pill-padding-x;\n padding-left: $badge-pill-padding-x;\n @include border-radius($badge-pill-border-radius);\n}\n\n// Colors\n//\n// Contextual variations (linked badges get darker on :hover).\n\n@each $color, $value in $theme-colors {\n .badge-#{$color} {\n @include badge-variant($value);\n }\n}\n","@mixin badge-variant($bg) {\n @include color-yiq($bg);\n background-color: $bg;\n\n &[href] {\n @include hover-focus {\n @include color-yiq($bg);\n text-decoration: none;\n background-color: darken($bg, 10%);\n }\n }\n}\n",".jumbotron {\n padding: $jumbotron-padding ($jumbotron-padding / 2);\n margin-bottom: $jumbotron-padding;\n background-color: $jumbotron-bg;\n @include border-radius($border-radius-lg);\n\n @include media-breakpoint-up(sm) {\n padding: ($jumbotron-padding * 2) $jumbotron-padding;\n }\n}\n\n.jumbotron-fluid {\n padding-right: 0;\n padding-left: 0;\n @include border-radius(0);\n}\n","//\n// Base styles\n//\n\n.alert {\n padding: $alert-padding-y $alert-padding-x;\n margin-bottom: $alert-margin-bottom;\n border: $alert-border-width solid transparent;\n @include border-radius($alert-border-radius);\n}\n\n// Headings for larger alerts\n.alert-heading {\n // Specified to prevent conflicts of changing $headings-color\n color: inherit;\n}\n\n// Provide class for links that match alerts\n.alert-link {\n font-weight: $alert-link-font-weight;\n}\n\n\n// Dismissible alerts\n//\n// Expand the right padding and account for the close button's positioning.\n\n.alert-dismissible {\n // Adjust close link position\n .close {\n position: relative;\n top: -$alert-padding-y;\n right: -$alert-padding-x;\n padding: $alert-padding-y $alert-padding-x;\n color: inherit;\n }\n}\n\n\n// Alternate styles\n//\n// Generate contextual modifier classes for colorizing the alert.\n\n@each $color, $value in $theme-colors {\n .alert-#{$color} {\n @include alert-variant(theme-color-level($color, -10), theme-color-level($color, -9), theme-color-level($color, 6));\n }\n}\n","@mixin alert-variant($background, $border, $color) {\n color: $color;\n background-color: $background;\n border-color: $border;\n\n hr {\n border-top-color: darken($border, 5%);\n }\n\n .alert-link {\n color: darken($color, 10%);\n }\n}\n","@keyframes progress-bar-stripes {\n from { background-position: $progress-height 0; }\n to { background-position: 0 0; }\n}\n\n.progress {\n display: flex;\n overflow: hidden; // force rounded corners by cropping it\n font-size: $progress-font-size;\n line-height: $progress-height;\n text-align: center;\n background-color: $progress-bg;\n @include border-radius($progress-border-radius);\n @include box-shadow($progress-box-shadow);\n}\n\n.progress-bar {\n height: $progress-height;\n line-height: $progress-height;\n color: $progress-bar-color;\n background-color: $progress-bar-bg;\n @include transition($progress-bar-transition);\n}\n\n.progress-bar-striped {\n @include gradient-striped();\n background-size: $progress-height $progress-height;\n}\n\n.progress-bar-animated {\n animation: progress-bar-stripes $progress-bar-animation-timing;\n}\n","// Gradients\n\n// Horizontal gradient, from left to right\n//\n// Creates two color stops, start and end, by specifying a color and position for each color stop.\n@mixin gradient-x($start-color: #555, $end-color: #333, $start-percent: 0%, $end-percent: 100%) {\n background-image: linear-gradient(to right, $start-color $start-percent, $end-color $end-percent);\n background-repeat: repeat-x;\n}\n\n// Vertical gradient, from top to bottom\n//\n// Creates two color stops, start and end, by specifying a color and position for each color stop.\n@mixin gradient-y($start-color: #555, $end-color: #333, $start-percent: 0%, $end-percent: 100%) {\n background-image: linear-gradient(to bottom, $start-color $start-percent, $end-color $end-percent);\n background-repeat: repeat-x;\n}\n\n@mixin gradient-directional($start-color: #555, $end-color: #333, $deg: 45deg) {\n background-image: linear-gradient($deg, $start-color, $end-color);\n background-repeat: repeat-x;\n}\n@mixin gradient-x-three-colors($start-color: #00b3ee, $mid-color: #7a43b6, $color-stop: 50%, $end-color: #c3325f) {\n background-image: linear-gradient(to right, $start-color, $mid-color $color-stop, $end-color);\n background-repeat: no-repeat;\n}\n@mixin gradient-y-three-colors($start-color: #00b3ee, $mid-color: #7a43b6, $color-stop: 50%, $end-color: #c3325f) {\n background-image: linear-gradient($start-color, $mid-color $color-stop, $end-color);\n background-repeat: no-repeat;\n}\n@mixin gradient-radial($inner-color: #555, $outer-color: #333) {\n background-image: radial-gradient(circle, $inner-color, $outer-color);\n background-repeat: no-repeat;\n}\n@mixin gradient-striped($color: rgba(255,255,255,.15), $angle: 45deg) {\n background-image: linear-gradient($angle, $color 25%, transparent 25%, transparent 50%, $color 50%, $color 75%, transparent 75%, transparent);\n}\n",".media {\n display: flex;\n align-items: flex-start;\n}\n\n.media-body {\n flex: 1;\n}\n","// Base class\n//\n// Easily usable on <ul>, <ol>, or <div>.\n\n.list-group {\n display: flex;\n flex-direction: column;\n\n // No need to set list-style: none; since .list-group-item is block level\n padding-left: 0; // reset padding because ul and ol\n margin-bottom: 0;\n}\n\n\n// Interactive list items\n//\n// Use anchor or button elements instead of `li`s or `div`s to create interactive\n// list items. Includes an extra `.active` modifier class for selected items.\n\n.list-group-item-action {\n width: 100%; // For `<button>`s (anchors become 100% by default though)\n color: $list-group-action-color;\n text-align: inherit; // For `<button>`s (anchors inherit)\n\n // Hover state\n @include hover-focus {\n color: $list-group-action-hover-color;\n text-decoration: none;\n background-color: $list-group-hover-bg;\n }\n\n &:active {\n color: $list-group-action-active-color;\n background-color: $list-group-action-active-bg;\n }\n}\n\n\n// Individual list items\n//\n// Use on `li`s or `div`s within the `.list-group` parent.\n\n.list-group-item {\n position: relative;\n display: block;\n padding: $list-group-item-padding-y $list-group-item-padding-x;\n // Place the border on the list items and negative margin up for better styling\n margin-bottom: -$list-group-border-width;\n background-color: $list-group-bg;\n border: $list-group-border-width solid $list-group-border-color;\n\n &:first-child {\n @include border-top-radius($list-group-border-radius);\n }\n\n &:last-child {\n margin-bottom: 0;\n @include border-bottom-radius($list-group-border-radius);\n }\n\n @include hover-focus {\n text-decoration: none;\n }\n\n &.disabled,\n &:disabled {\n color: $list-group-disabled-color;\n background-color: $list-group-disabled-bg;\n }\n\n // Include both here for `<a>`s and `<button>`s\n &.active {\n z-index: 2; // Place active items above their siblings for proper border styling\n color: $list-group-active-color;\n background-color: $list-group-active-bg;\n border-color: $list-group-active-border-color;\n }\n}\n\n\n// Flush list items\n//\n// Remove borders and border-radius to keep list group items edge-to-edge. Most\n// useful within other components (e.g., cards).\n\n.list-group-flush {\n .list-group-item {\n border-right: 0;\n border-left: 0;\n border-radius: 0;\n }\n\n &:first-child {\n .list-group-item:first-child {\n border-top: 0;\n }\n }\n\n &:last-child {\n .list-group-item:last-child {\n border-bottom: 0;\n }\n }\n}\n\n\n// Contextual variants\n//\n// Add modifier classes to change text and background color on individual items.\n// Organizationally, this must come after the `:hover` states.\n\n@each $color, $value in $theme-colors {\n @include list-group-item-variant($color, theme-color-level($color, -9), theme-color-level($color, 6));\n}\n","// List Groups\n\n@mixin list-group-item-variant($state, $background, $color) {\n .list-group-item-#{$state} {\n color: $color;\n background-color: $background;\n }\n\n //scss-lint:disable QualifyingElement\n a.list-group-item-#{$state},\n button.list-group-item-#{$state} {\n color: $color;\n\n @include hover-focus {\n color: $color;\n background-color: darken($background, 5%);\n }\n\n &.active {\n color: #fff;\n background-color: $color;\n border-color: $color;\n }\n }\n // scss-lint:enable QualifyingElement\n}\n",".close {\n float: right;\n font-size: $close-font-size;\n font-weight: $close-font-weight;\n line-height: 1;\n color: $close-color;\n text-shadow: $close-text-shadow;\n opacity: .5;\n\n @include hover-focus {\n color: $close-color;\n text-decoration: none;\n opacity: .75;\n }\n}\n\n// Additional properties for button version\n// iOS requires the button element instead of an anchor tag.\n// If you want the anchor version, it requires `href=\"#\"`.\n// See https://developer.mozilla.org/en-US/docs/Web/Events/click#Safari_Mobile\n\n// scss-lint:disable QualifyingElement\nbutton.close {\n padding: 0;\n background: transparent;\n border: 0;\n -webkit-appearance: none;\n}\n// scss-lint:enable QualifyingElement\n","// .modal-open - body class for killing the scroll\n// .modal - container to scroll within\n// .modal-dialog - positioning shell for the actual modal\n// .modal-content - actual modal w/ bg and corners and stuff\n\n\n// Kill the scroll on the body\n.modal-open {\n overflow: hidden;\n}\n\n// Container that the modal scrolls within\n.modal {\n position: fixed;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: $zindex-modal;\n display: none;\n overflow: hidden;\n // Prevent Chrome on Windows from adding a focus outline. For details, see\n // https://github.com/twbs/bootstrap/pull/10951.\n outline: 0;\n // We deliberately don't use `-webkit-overflow-scrolling: touch;` due to a\n // gnarly iOS Safari bug: https://bugs.webkit.org/show_bug.cgi?id=158342\n // See also https://github.com/twbs/bootstrap/issues/17695\n\n // When fading in the modal, animate it to slide down\n &.fade .modal-dialog {\n @include transition($modal-transition);\n transform: translate(0, -25%);\n }\n &.show .modal-dialog { transform: translate(0, 0); }\n}\n.modal-open .modal {\n overflow-x: hidden;\n overflow-y: auto;\n}\n\n// Shell div to position the modal with bottom padding\n.modal-dialog {\n position: relative;\n width: auto;\n margin: $modal-dialog-margin;\n}\n\n// Actual modal\n.modal-content {\n position: relative;\n display: flex;\n flex-direction: column;\n background-color: $modal-content-bg;\n background-clip: padding-box;\n border: $modal-content-border-width solid $modal-content-border-color;\n @include border-radius($border-radius-lg);\n @include box-shadow($modal-content-box-shadow-xs);\n // Remove focus outline from opened modal\n outline: 0;\n}\n\n// Modal background\n.modal-backdrop {\n position: fixed;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: $zindex-modal-backdrop;\n background-color: $modal-backdrop-bg;\n\n // Fade for backdrop\n &.fade { opacity: 0; }\n &.show { opacity: $modal-backdrop-opacity; }\n}\n\n// Modal header\n// Top section of the modal w/ title and dismiss\n.modal-header {\n display: flex;\n align-items: center; // vertically center it\n justify-content: space-between; // Put modal header elements (title and dismiss) on opposite ends\n padding: $modal-header-padding;\n border-bottom: $modal-header-border-width solid $modal-header-border-color;\n}\n\n// Title text within header\n.modal-title {\n margin-bottom: 0;\n line-height: $modal-title-line-height;\n}\n\n// Modal body\n// Where all modal content resides (sibling of .modal-header and .modal-footer)\n.modal-body {\n position: relative;\n // Enable `flex-grow: 1` so that the body take up as much space as possible\n // when should there be a fixed height on `.modal-dialog`.\n flex: 1 1 auto;\n padding: $modal-inner-padding;\n}\n\n// Footer (for actions)\n.modal-footer {\n display: flex;\n align-items: center; // vertically center\n justify-content: flex-end; // Right align buttons with flex property because text-align doesn't work on flex items\n padding: $modal-inner-padding;\n border-top: $modal-footer-border-width solid $modal-footer-border-color;\n\n // Easily place margin between footer elements\n > :not(:first-child) { margin-left: .25rem; }\n > :not(:last-child) { margin-right: .25rem; }\n}\n\n// Measure scrollbar width for padding body during modal show/hide\n.modal-scrollbar-measure {\n position: absolute;\n top: -9999px;\n width: 50px;\n height: 50px;\n overflow: scroll;\n}\n\n// Scale up the modal\n@include media-breakpoint-up(sm) {\n // Automatically set modal's width for larger viewports\n .modal-dialog {\n max-width: $modal-md;\n margin: $modal-dialog-margin-y-sm-up auto;\n }\n\n .modal-content {\n @include box-shadow($modal-content-box-shadow-sm-up);\n }\n\n .modal-sm { max-width: $modal-sm; }\n}\n\n@include media-breakpoint-up(lg) {\n .modal-lg { max-width: $modal-lg; }\n}\n","// Base class\n.tooltip {\n position: absolute;\n z-index: $zindex-tooltip;\n display: block;\n margin: $tooltip-margin;\n // Our parent element can be arbitrary since tooltips are by default inserted as a sibling of their target element.\n // So reset our font and text properties to avoid inheriting weird values.\n @include reset-text();\n font-size: $font-size-sm;\n // Allow breaking very long words so they don't overflow the tooltip's bounds\n word-wrap: break-word;\n opacity: 0;\n\n &.show { opacity: $tooltip-opacity; }\n\n .arrow {\n position: absolute;\n display: block;\n width: $tooltip-arrow-width;\n height: $tooltip-arrow-height;\n }\n\n &.bs-tooltip-top {\n padding: $tooltip-arrow-width 0;\n .arrow {\n bottom: 0;\n }\n\n .arrow::before {\n margin-left: -($tooltip-arrow-width - 2);\n content: \"\";\n border-width: $tooltip-arrow-width $tooltip-arrow-width 0;\n border-top-color: $tooltip-arrow-color;\n }\n }\n &.bs-tooltip-right {\n padding: 0 $tooltip-arrow-width;\n .arrow {\n left: 0;\n }\n\n .arrow::before {\n margin-top: -($tooltip-arrow-width - 2);\n content: \"\";\n border-width: $tooltip-arrow-width $tooltip-arrow-width $tooltip-arrow-width 0;\n border-right-color: $tooltip-arrow-color;\n }\n }\n &.bs-tooltip-bottom {\n padding: $tooltip-arrow-width 0;\n .arrow {\n top: 0;\n }\n\n .arrow::before {\n margin-left: -($tooltip-arrow-width - 2);\n content: \"\";\n border-width: 0 $tooltip-arrow-width $tooltip-arrow-width;\n border-bottom-color: $tooltip-arrow-color;\n }\n }\n &.bs-tooltip-left {\n padding: 0 $tooltip-arrow-width;\n .arrow {\n right: 0;\n }\n\n .arrow::before {\n right: 0;\n margin-top: -($tooltip-arrow-width - 2);\n content: \"\";\n border-width: $tooltip-arrow-width 0 $tooltip-arrow-width $tooltip-arrow-width;\n border-left-color: $tooltip-arrow-color;\n }\n }\n &.bs-tooltip-auto {\n &[x-placement^=\"top\"] {\n @extend .bs-tooltip-top;\n }\n &[x-placement^=\"right\"] {\n @extend .bs-tooltip-right;\n }\n &[x-placement^=\"bottom\"] {\n @extend .bs-tooltip-bottom;\n }\n &[x-placement^=\"left\"] {\n @extend .bs-tooltip-left;\n }\n }\n\n .arrow::before {\n position: absolute;\n border-color: transparent;\n border-style: solid;\n }\n}\n\n// Wrapper for the tooltip content\n.tooltip-inner {\n max-width: $tooltip-max-width;\n padding: $tooltip-padding-y $tooltip-padding-x;\n color: $tooltip-color;\n text-align: center;\n background-color: $tooltip-bg;\n @include border-radius($border-radius);\n}\n","// scss-lint:disable DuplicateProperty\n@mixin reset-text {\n font-family: $font-family-base;\n // We deliberately do NOT reset font-size or word-wrap.\n font-style: normal;\n font-weight: $font-weight-normal;\n line-height: $line-height-base;\n text-align: left; // Fallback for where `start` is not supported\n text-align: start;\n text-decoration: none;\n text-shadow: none;\n text-transform: none;\n letter-spacing: normal;\n word-break: normal;\n word-spacing: normal;\n white-space: normal;\n line-break: auto;\n}\n",".popover {\n position: absolute;\n top: 0;\n left: 0;\n z-index: $zindex-popover;\n display: block;\n max-width: $popover-max-width;\n padding: $popover-inner-padding;\n // Our parent element can be arbitrary since tooltips are by default inserted as a sibling of their target element.\n // So reset our font and text properties to avoid inheriting weird values.\n @include reset-text();\n font-size: $font-size-sm;\n // Allow breaking very long words so they don't overflow the popover's bounds\n word-wrap: break-word;\n background-color: $popover-bg;\n background-clip: padding-box;\n border: $popover-border-width solid $popover-border-color;\n @include border-radius($border-radius-lg);\n @include box-shadow($popover-box-shadow);\n\n // Arrows\n //\n // .arrow is outer, .arrow::after is inner\n\n .arrow {\n position: absolute;\n display: block;\n width: $popover-arrow-width;\n height: $popover-arrow-height;\n }\n\n .arrow::before,\n .arrow::after {\n position: absolute;\n display: block;\n border-color: transparent;\n border-style: solid;\n }\n\n .arrow::before {\n content: \"\";\n border-width: $popover-arrow-outer-width;\n }\n .arrow::after {\n content: \"\";\n border-width: $popover-arrow-outer-width;\n }\n\n // Popover directions\n\n &.bs-popover-top {\n margin-bottom: $popover-arrow-width;\n\n .arrow {\n bottom: 0;\n }\n\n .arrow::before,\n .arrow::after {\n border-bottom-width: 0;\n }\n\n .arrow::before {\n bottom: -$popover-arrow-outer-width;\n margin-left: -($popover-arrow-outer-width - 5);\n border-top-color: $popover-arrow-outer-color;\n }\n\n .arrow::after {\n bottom: -($popover-arrow-outer-width - 1);\n margin-left: -($popover-arrow-outer-width - 5);\n border-top-color: $popover-arrow-color;\n }\n }\n\n &.bs-popover-right {\n margin-left: $popover-arrow-width;\n\n .arrow {\n left: 0;\n }\n\n .arrow::before,\n .arrow::after {\n margin-top: -($popover-arrow-outer-width - 3);\n border-left-width: 0;\n }\n\n .arrow::before {\n left: -$popover-arrow-outer-width;\n border-right-color: $popover-arrow-outer-color;\n }\n\n .arrow::after {\n left: -($popover-arrow-outer-width - 1);\n border-right-color: $popover-arrow-color;\n }\n }\n\n &.bs-popover-bottom {\n margin-top: $popover-arrow-width;\n\n .arrow {\n top: 0;\n }\n\n .arrow::before,\n .arrow::after {\n margin-left: -($popover-arrow-width - 3);\n border-top-width: 0;\n }\n\n .arrow::before {\n top: -$popover-arrow-outer-width;\n border-bottom-color: $popover-arrow-outer-color;\n }\n\n .arrow::after {\n top: -($popover-arrow-outer-width - 1);\n border-bottom-color: $popover-arrow-color;\n }\n\n // This will remove the popover-header's border just below the arrow\n .popover-header::before {\n position: absolute;\n top: 0;\n left: 50%;\n display: block;\n width: 20px;\n margin-left: -10px;\n content: \"\";\n border-bottom: 1px solid $popover-header-bg;\n }\n }\n\n &.bs-popover-left {\n margin-right: $popover-arrow-width;\n\n .arrow {\n right: 0;\n }\n\n .arrow::before,\n .arrow::after {\n margin-top: -($popover-arrow-outer-width - 3);\n border-right-width: 0;\n }\n\n .arrow::before {\n right: -$popover-arrow-outer-width;\n border-left-color: $popover-arrow-outer-color;\n }\n\n .arrow::after {\n right: -($popover-arrow-outer-width - 1);\n border-left-color: $popover-arrow-color;\n }\n }\n &.bs-popover-auto {\n &[x-placement^=\"top\"] {\n @extend .bs-popover-top;\n }\n &[x-placement^=\"right\"] {\n @extend .bs-popover-right;\n }\n &[x-placement^=\"bottom\"] {\n @extend .bs-popover-bottom;\n }\n &[x-placement^=\"left\"] {\n @extend .bs-popover-left;\n }\n }\n}\n\n\n// Offset the popover to account for the popover arrow\n.popover-header {\n padding: $popover-header-padding-y $popover-header-padding-x;\n margin-bottom: 0; // Reset the default from Reboot\n font-size: $font-size-base;\n color: $popover-header-color;\n background-color: $popover-header-bg;\n border-bottom: $popover-border-width solid darken($popover-header-bg, 5%);\n $offset-border-width: calc(#{$border-radius-lg} - #{$popover-border-width});\n @include border-top-radius($offset-border-width);\n\n &:empty {\n display: none;\n }\n}\n\n.popover-body {\n padding: $popover-body-padding-y $popover-body-padding-x;\n color: $popover-body-color;\n}\n","// Wrapper for the slide container and indicators\n.carousel {\n position: relative;\n}\n\n.carousel-inner {\n position: relative;\n width: 100%;\n overflow: hidden;\n}\n\n.carousel-item {\n position: relative;\n display: none;\n align-items: center;\n width: 100%;\n @include transition($carousel-transition);\n backface-visibility: hidden;\n perspective: 1000px;\n}\n\n.carousel-item.active,\n.carousel-item-next,\n.carousel-item-prev {\n display: block;\n}\n\n.carousel-item-next,\n.carousel-item-prev {\n position: absolute;\n top: 0;\n}\n\n// CSS3 transforms when supported by the browser\n.carousel-item-next.carousel-item-left,\n.carousel-item-prev.carousel-item-right {\n transform: translateX(0);\n\n @supports (transform-style: preserve-3d) {\n transform: translate3d(0, 0, 0);\n }\n}\n\n.carousel-item-next,\n.active.carousel-item-right {\n transform: translateX(100%);\n\n @supports (transform-style: preserve-3d) {\n transform: translate3d(100%, 0, 0);\n }\n}\n\n.carousel-item-prev,\n.active.carousel-item-left {\n transform: translateX(-100%);\n\n @supports (transform-style: preserve-3d) {\n transform: translate3d(-100%, 0, 0);\n }\n}\n\n\n//\n// Left/right controls for nav\n//\n\n.carousel-control-prev,\n.carousel-control-next {\n position: absolute;\n top: 0;\n bottom: 0;\n // Use flex for alignment (1-3)\n display: flex; // 1. allow flex styles\n align-items: center; // 2. vertically center contents\n justify-content: center; // 3. horizontally center contents\n width: $carousel-control-width;\n color: $carousel-control-color;\n text-align: center;\n opacity: $carousel-control-opacity;\n // We can't have a transition here because WebKit cancels the carousel\n // animation if you trip this while in the middle of another animation.\n\n // Hover/focus state\n @include hover-focus {\n color: $carousel-control-color;\n text-decoration: none;\n outline: 0;\n opacity: .9;\n }\n}\n.carousel-control-prev {\n left: 0;\n}\n.carousel-control-next {\n right: 0;\n}\n\n// Icons for within\n.carousel-control-prev-icon,\n.carousel-control-next-icon {\n display: inline-block;\n width: $carousel-control-icon-width;\n height: $carousel-control-icon-width;\n background: transparent no-repeat center center;\n background-size: 100% 100%;\n}\n.carousel-control-prev-icon {\n background-image: $carousel-control-prev-icon-bg;\n}\n.carousel-control-next-icon {\n background-image: $carousel-control-next-icon-bg;\n}\n\n\n// Optional indicator pips\n//\n// Add an ordered list with the following class and add a list item for each\n// slide your carousel holds.\n\n.carousel-indicators {\n position: absolute;\n right: 0;\n bottom: 10px;\n left: 0;\n z-index: 15;\n display: flex;\n justify-content: center;\n padding-left: 0; // override <ol> default\n // Use the .carousel-control's width as margin so we don't overlay those\n margin-right: $carousel-control-width;\n margin-left: $carousel-control-width;\n list-style: none;\n\n li {\n position: relative;\n flex: 0 1 auto;\n width: $carousel-indicator-width;\n height: $carousel-indicator-height;\n margin-right: $carousel-indicator-spacer;\n margin-left: $carousel-indicator-spacer;\n text-indent: -999px;\n background-color: rgba($carousel-indicator-active-bg, .5);\n\n // Use pseudo classes to increase the hit area by 10px on top and bottom.\n &::before {\n position: absolute;\n top: -10px;\n left: 0;\n display: inline-block;\n width: 100%;\n height: 10px;\n content: \"\";\n }\n &::after {\n position: absolute;\n bottom: -10px;\n left: 0;\n display: inline-block;\n width: 100%;\n height: 10px;\n content: \"\";\n }\n }\n\n .active {\n background-color: $carousel-indicator-active-bg;\n }\n}\n\n\n// Optional captions\n//\n//\n\n.carousel-caption {\n position: absolute;\n right: ((100% - $carousel-caption-width) / 2);\n bottom: 20px;\n left: ((100% - $carousel-caption-width) / 2);\n z-index: 10;\n padding-top: 20px;\n padding-bottom: 20px;\n color: $carousel-caption-color;\n text-align: center;\n}\n",".align-baseline { vertical-align: baseline !important; } // Browser default\n.align-top { vertical-align: top !important; }\n.align-middle { vertical-align: middle !important; }\n.align-bottom { vertical-align: bottom !important; }\n.align-text-bottom { vertical-align: text-bottom !important; }\n.align-text-top { vertical-align: text-top !important; }\n","// Contextual backgrounds\n\n@mixin bg-variant($parent, $color) {\n #{$parent} {\n background-color: $color !important;\n }\n a#{$parent} {\n @include hover-focus {\n background-color: darken($color, 10%) !important;\n }\n }\n}\n","@each $color, $value in $theme-colors {\n @include bg-variant('.bg-#{$color}', $value);\n}\n\n.bg-white { background-color: $white !important; }\n.bg-transparent { background-color: transparent !important; }\n","//\n// Border\n//\n\n.border { border: 1px solid $gray-200 !important; }\n.border-0 { border: 0 !important; }\n.border-top-0 { border-top: 0 !important; }\n.border-right-0 { border-right: 0 !important; }\n.border-bottom-0 { border-bottom: 0 !important; }\n.border-left-0 { border-left: 0 !important; }\n\n@each $color, $value in $theme-colors {\n .border-#{$color} {\n border-color: $value !important;\n }\n}\n\n.border-white {\n border-color: $white !important;\n}\n\n//\n// Border-radius\n//\n\n.rounded {\n border-radius: $border-radius !important;\n}\n.rounded-top {\n border-top-left-radius: $border-radius !important;\n border-top-right-radius: $border-radius !important;\n}\n.rounded-right {\n border-top-right-radius: $border-radius !important;\n border-bottom-right-radius: $border-radius !important;\n}\n.rounded-bottom {\n border-bottom-right-radius: $border-radius !important;\n border-bottom-left-radius: $border-radius !important;\n}\n.rounded-left {\n border-top-left-radius: $border-radius !important;\n border-bottom-left-radius: $border-radius !important;\n}\n\n.rounded-circle {\n border-radius: 50%;\n}\n\n.rounded-0 {\n border-radius: 0;\n}\n","//\n// Utilities for common `display` values\n//\n\n@each $breakpoint in map-keys($grid-breakpoints) {\n @include media-breakpoint-up($breakpoint) {\n $infix: breakpoint-infix($breakpoint, $grid-breakpoints);\n\n .d#{$infix}-none { display: none !important; }\n .d#{$infix}-inline { display: inline !important; }\n .d#{$infix}-inline-block { display: inline-block !important; }\n .d#{$infix}-block { display: block !important; }\n .d#{$infix}-table { display: table !important; }\n .d#{$infix}-table-cell { display: table-cell !important; }\n .d#{$infix}-flex { display: flex !important; }\n .d#{$infix}-inline-flex { display: inline-flex !important; }\n }\n}\n\n\n//\n// Utilities for toggling `display` in print\n//\n\n.d-print-block {\n display: none !important;\n\n @media print {\n display: block !important;\n }\n}\n\n.d-print-inline {\n display: none !important;\n\n @media print {\n display: inline !important;\n }\n}\n\n.d-print-inline-block {\n display: none !important;\n\n @media print {\n display: inline-block !important;\n }\n}\n\n.d-print-none {\n @media print {\n display: none !important;\n }\n}\n","// Credit: Nicolas Gallagher and SUIT CSS.\n\n.embed-responsive {\n position: relative;\n display: block;\n width: 100%;\n padding: 0;\n overflow: hidden;\n\n &::before {\n display: block;\n content: \"\";\n }\n\n .embed-responsive-item,\n iframe,\n embed,\n object,\n video {\n position: absolute;\n top: 0;\n bottom: 0;\n left: 0;\n width: 100%;\n height: 100%;\n border: 0;\n }\n}\n\n.embed-responsive-21by9 {\n &::before {\n padding-top: percentage(9 / 21);\n }\n}\n\n.embed-responsive-16by9 {\n &::before {\n padding-top: percentage(9 / 16);\n }\n}\n\n.embed-responsive-4by3 {\n &::before {\n padding-top: percentage(3 / 4);\n }\n}\n\n.embed-responsive-1by1 {\n &::before {\n padding-top: percentage(1 / 1);\n }\n}\n","// Flex variation\n//\n// Custom styles for additional flex alignment options.\n\n@each $breakpoint in map-keys($grid-breakpoints) {\n @include media-breakpoint-up($breakpoint) {\n $infix: breakpoint-infix($breakpoint, $grid-breakpoints);\n\n .flex#{$infix}-row { flex-direction: row !important; }\n .flex#{$infix}-column { flex-direction: column !important; }\n .flex#{$infix}-row-reverse { flex-direction: row-reverse !important; }\n .flex#{$infix}-column-reverse { flex-direction: column-reverse !important; }\n\n .flex#{$infix}-wrap { flex-wrap: wrap !important; }\n .flex#{$infix}-nowrap { flex-wrap: nowrap !important; }\n .flex#{$infix}-wrap-reverse { flex-wrap: wrap-reverse !important; }\n\n .justify-content#{$infix}-start { justify-content: flex-start !important; }\n .justify-content#{$infix}-end { justify-content: flex-end !important; }\n .justify-content#{$infix}-center { justify-content: center !important; }\n .justify-content#{$infix}-between { justify-content: space-between !important; }\n .justify-content#{$infix}-around { justify-content: space-around !important; }\n\n .align-items#{$infix}-start { align-items: flex-start !important; }\n .align-items#{$infix}-end { align-items: flex-end !important; }\n .align-items#{$infix}-center { align-items: center !important; }\n .align-items#{$infix}-baseline { align-items: baseline !important; }\n .align-items#{$infix}-stretch { align-items: stretch !important; }\n\n .align-content#{$infix}-start { align-content: flex-start !important; }\n .align-content#{$infix}-end { align-content: flex-end !important; }\n .align-content#{$infix}-center { align-content: center !important; }\n .align-content#{$infix}-between { align-content: space-between !important; }\n .align-content#{$infix}-around { align-content: space-around !important; }\n .align-content#{$infix}-stretch { align-content: stretch !important; }\n\n .align-self#{$infix}-auto { align-self: auto !important; }\n .align-self#{$infix}-start { align-self: flex-start !important; }\n .align-self#{$infix}-end { align-self: flex-end !important; }\n .align-self#{$infix}-center { align-self: center !important; }\n .align-self#{$infix}-baseline { align-self: baseline !important; }\n .align-self#{$infix}-stretch { align-self: stretch !important; }\n }\n}\n","@each $breakpoint in map-keys($grid-breakpoints) {\n @include media-breakpoint-up($breakpoint) {\n $infix: breakpoint-infix($breakpoint, $grid-breakpoints);\n\n .float#{$infix}-left { @include float-left; }\n .float#{$infix}-right { @include float-right; }\n .float#{$infix}-none { @include float-none; }\n }\n}\n","@mixin float-left {\n float: left !important;\n}\n@mixin float-right {\n float: right !important;\n}\n@mixin float-none {\n float: none !important;\n}\n","// Positioning\n\n.fixed-top {\n position: fixed;\n top: 0;\n right: 0;\n left: 0;\n z-index: $zindex-fixed;\n}\n\n.fixed-bottom {\n position: fixed;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: $zindex-fixed;\n}\n\n.sticky-top {\n @supports (position: sticky) {\n position: sticky;\n top: 0;\n z-index: $zindex-sticky;\n }\n}\n","//\n// Screenreaders\n//\n\n.sr-only {\n @include sr-only();\n}\n\n.sr-only-focusable {\n @include sr-only-focusable();\n}\n","// Only display content to screen readers\n//\n// See: http://a11yproject.com/posts/how-to-hide-content\n// See: http://hugogiraudel.com/2016/10/13/css-hide-and-seek/\n\n@mixin sr-only {\n position: absolute;\n width: 1px;\n height: 1px;\n padding: 0;\n overflow: hidden;\n clip: rect(0,0,0,0);\n white-space: nowrap;\n clip-path: inset(50%);\n border: 0;\n}\n\n// Use in conjunction with .sr-only to only display content when it's focused.\n//\n// Useful for \"Skip to main content\" links; see https://www.w3.org/TR/2013/NOTE-WCAG20-TECHS-20130905/G1\n//\n// Credit: HTML5 Boilerplate\n\n@mixin sr-only-focusable {\n &:active,\n &:focus {\n position: static;\n width: auto;\n height: auto;\n overflow: visible;\n clip: auto;\n white-space: normal;\n clip-path: none;\n }\n}\n","// Width and height\n\n@each $prop, $abbrev in (width: w, height: h) {\n @each $size, $length in $sizes {\n .#{$abbrev}-#{$size} { #{$prop}: $length !important; }\n }\n}\n\n.mw-100 { max-width: 100% !important; }\n.mh-100 { max-height: 100% !important; }\n","// Margin and Padding\n\n@each $breakpoint in map-keys($grid-breakpoints) {\n @include media-breakpoint-up($breakpoint) {\n $infix: breakpoint-infix($breakpoint, $grid-breakpoints);\n\n @each $prop, $abbrev in (margin: m, padding: p) {\n @each $size, $length in $spacers {\n\n .#{$abbrev}#{$infix}-#{$size} { #{$prop}: $length !important; }\n .#{$abbrev}t#{$infix}-#{$size} { #{$prop}-top: $length !important; }\n .#{$abbrev}r#{$infix}-#{$size} { #{$prop}-right: $length !important; }\n .#{$abbrev}b#{$infix}-#{$size} { #{$prop}-bottom: $length !important; }\n .#{$abbrev}l#{$infix}-#{$size} { #{$prop}-left: $length !important; }\n .#{$abbrev}x#{$infix}-#{$size} {\n #{$prop}-right: $length !important;\n #{$prop}-left: $length !important;\n }\n .#{$abbrev}y#{$infix}-#{$size} {\n #{$prop}-top: $length !important;\n #{$prop}-bottom: $length !important;\n }\n }\n }\n\n // Some special margin utils\n .m#{$infix}-auto { margin: auto !important; }\n .mt#{$infix}-auto { margin-top: auto !important; }\n .mr#{$infix}-auto { margin-right: auto !important; }\n .mb#{$infix}-auto { margin-bottom: auto !important; }\n .ml#{$infix}-auto { margin-left: auto !important; }\n .mx#{$infix}-auto {\n margin-right: auto !important;\n margin-left: auto !important;\n }\n .my#{$infix}-auto {\n margin-top: auto !important;\n margin-bottom: auto !important;\n }\n }\n}\n","//\n// Text\n//\n\n// Alignment\n\n.text-justify { text-align: justify !important; }\n.text-nowrap { white-space: nowrap !important; }\n.text-truncate { @include text-truncate; }\n\n// Responsive alignment\n\n@each $breakpoint in map-keys($grid-breakpoints) {\n @include media-breakpoint-up($breakpoint) {\n $infix: breakpoint-infix($breakpoint, $grid-breakpoints);\n\n .text#{$infix}-left { text-align: left !important; }\n .text#{$infix}-right { text-align: right !important; }\n .text#{$infix}-center { text-align: center !important; }\n }\n}\n\n// Transformation\n\n.text-lowercase { text-transform: lowercase !important; }\n.text-uppercase { text-transform: uppercase !important; }\n.text-capitalize { text-transform: capitalize !important; }\n\n// Weight and italics\n\n.font-weight-normal { font-weight: $font-weight-normal; }\n.font-weight-bold { font-weight: $font-weight-bold; }\n.font-italic { font-style: italic; }\n\n// Contextual colors\n\n.text-white { color: #fff !important; }\n\n@each $color, $value in $theme-colors {\n @include text-emphasis-variant('.text-#{$color}', $value);\n}\n\n.text-muted { color: $text-muted !important; }\n\n// Misc\n\n.text-hide {\n @include text-hide();\n}\n","// Text truncate\n// Requires inline-block or block for proper styling\n\n@mixin text-truncate() {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n","// Typography\n\n@mixin text-emphasis-variant($parent, $color) {\n #{$parent} {\n color: $color !important;\n }\n a#{$parent} {\n @include hover-focus {\n color: darken($color, 10%) !important;\n }\n }\n}\n","// CSS image replacement\n@mixin text-hide() {\n font: 0/0 a;\n color: transparent;\n text-shadow: none;\n background-color: transparent;\n border: 0;\n}\n","//\n// Visibility utilities\n//\n\n.visible {\n @include invisible(visible);\n}\n\n.invisible {\n @include invisible(hidden);\n}\n","// Visibility\n\n@mixin invisible($visibility) {\n visibility: $visibility !important;\n}\n"]} \ No newline at end of file
diff --git a/library/bootstrap/js/bootstrap.js b/library/bootstrap/js/bootstrap.js
index 865256739..7597fb328 100644
--- a/library/bootstrap/js/bootstrap.js
+++ b/library/bootstrap/js/bootstrap.js
@@ -1,5 +1,5 @@
/*!
- * Bootstrap v4.0.0-alpha.6 (https://getbootstrap.com)
+ * Bootstrap v4.0.0-beta (https://getbootstrap.com)
* Copyright 2011-2017 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors)
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
*/
@@ -28,7 +28,7 @@ function _classCallCheck(instance, Constructor) { if (!(instance instanceof Cons
/**
* --------------------------------------------------------------------------
- * Bootstrap (v4.0.0-alpha.6): util.js
+ * Bootstrap (v4.0.0-beta): util.js
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
* --------------------------------------------------------------------------
*/
@@ -50,10 +50,9 @@ var Util = function ($) {
MozTransition: 'transitionend',
OTransition: 'oTransitionEnd otransitionend',
transition: 'transitionend'
- };
- // shoutout AngusCroll (https://goo.gl/pxwQGp)
- function toType(obj) {
+ // shoutout AngusCroll (https://goo.gl/pxwQGp)
+ };function toType(obj) {
return {}.toString.call(obj).match(/\s([a-zA-Z]+)/)[1].toLowerCase();
}
@@ -181,7 +180,7 @@ var Util = function ($) {
/**
* --------------------------------------------------------------------------
- * Bootstrap (v4.0.0-alpha.6): alert.js
+ * Bootstrap (v4.0.0-beta): alert.js
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
* --------------------------------------------------------------------------
*/
@@ -195,7 +194,7 @@ var Alert = function ($) {
*/
var NAME = 'alert';
- var VERSION = '4.0.0-alpha.6';
+ var VERSION = '4.0.0-beta';
var DATA_KEY = 'bs.alert';
var EVENT_KEY = '.' + DATA_KEY;
var DATA_API_KEY = '.data-api';
@@ -216,14 +215,14 @@ var Alert = function ($) {
ALERT: 'alert',
FADE: 'fade',
SHOW: 'show'
- };
- /**
- * ------------------------------------------------------------------------
- * Class Definition
- * ------------------------------------------------------------------------
- */
+ /**
+ * ------------------------------------------------------------------------
+ * Class Definition
+ * ------------------------------------------------------------------------
+ */
+ };
var Alert = function () {
function Alert(element) {
_classCallCheck(this, Alert);
@@ -360,7 +359,7 @@ var Alert = function ($) {
/**
* --------------------------------------------------------------------------
- * Bootstrap (v4.0.0-alpha.6): button.js
+ * Bootstrap (v4.0.0-beta): button.js
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
* --------------------------------------------------------------------------
*/
@@ -374,7 +373,7 @@ var Button = function ($) {
*/
var NAME = 'button';
- var VERSION = '4.0.0-alpha.6';
+ var VERSION = '4.0.0-beta';
var DATA_KEY = 'bs.button';
var EVENT_KEY = '.' + DATA_KEY;
var DATA_API_KEY = '.data-api';
@@ -397,14 +396,14 @@ var Button = function ($) {
var Event = {
CLICK_DATA_API: 'click' + EVENT_KEY + DATA_API_KEY,
FOCUS_BLUR_DATA_API: 'focus' + EVENT_KEY + DATA_API_KEY + ' ' + ('blur' + EVENT_KEY + DATA_API_KEY)
- };
- /**
- * ------------------------------------------------------------------------
- * Class Definition
- * ------------------------------------------------------------------------
- */
+ /**
+ * ------------------------------------------------------------------------
+ * Class Definition
+ * ------------------------------------------------------------------------
+ */
+ };
var Button = function () {
function Button(element) {
_classCallCheck(this, Button);
@@ -438,6 +437,9 @@ var Button = function ($) {
}
if (triggerChangeEvent) {
+ if (input.hasAttribute('disabled') || rootElement.hasAttribute('disabled') || input.classList.contains('disabled') || rootElement.classList.contains('disabled')) {
+ return;
+ }
input.checked = !$(this._element).hasClass(ClassName.ACTIVE);
$(input).trigger('change');
}
@@ -527,7 +529,7 @@ var Button = function ($) {
/**
* --------------------------------------------------------------------------
- * Bootstrap (v4.0.0-alpha.6): carousel.js
+ * Bootstrap (v4.0.0-beta): carousel.js
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
* --------------------------------------------------------------------------
*/
@@ -541,7 +543,7 @@ var Carousel = function ($) {
*/
var NAME = 'carousel';
- var VERSION = '4.0.0-alpha.6';
+ var VERSION = '4.0.0-beta';
var DATA_KEY = 'bs.carousel';
var EVENT_KEY = '.' + DATA_KEY;
var DATA_API_KEY = '.data-api';
@@ -604,14 +606,14 @@ var Carousel = function ($) {
INDICATORS: '.carousel-indicators',
DATA_SLIDE: '[data-slide], [data-slide-to]',
DATA_RIDE: '[data-ride="carousel"]'
- };
- /**
- * ------------------------------------------------------------------------
- * Class Definition
- * ------------------------------------------------------------------------
- */
+ /**
+ * ------------------------------------------------------------------------
+ * Class Definition
+ * ------------------------------------------------------------------------
+ */
+ };
var Carousel = function () {
function Carousel(element, config) {
_classCallCheck(this, Carousel);
@@ -1034,7 +1036,7 @@ var Carousel = function ($) {
/**
* --------------------------------------------------------------------------
- * Bootstrap (v4.0.0-alpha.6): collapse.js
+ * Bootstrap (v4.0.0-beta): collapse.js
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
* --------------------------------------------------------------------------
*/
@@ -1048,7 +1050,7 @@ var Collapse = function ($) {
*/
var NAME = 'collapse';
- var VERSION = '4.0.0-alpha.6';
+ var VERSION = '4.0.0-beta';
var DATA_KEY = 'bs.collapse';
var EVENT_KEY = '.' + DATA_KEY;
var DATA_API_KEY = '.data-api';
@@ -1086,17 +1088,16 @@ var Collapse = function ($) {
};
var Selector = {
- ACTIVES: '.card > .show, .card > .collapsing',
- DATA_TOGGLE: '[data-toggle="collapse"]',
- DATA_CHILDREN: 'data-children'
- };
+ ACTIVES: '.show, .collapsing',
+ DATA_TOGGLE: '[data-toggle="collapse"]'
- /**
- * ------------------------------------------------------------------------
- * Class Definition
- * ------------------------------------------------------------------------
- */
+ /**
+ * ------------------------------------------------------------------------
+ * Class Definition
+ * ------------------------------------------------------------------------
+ */
+ };
var Collapse = function () {
function Collapse(element, config) {
_classCallCheck(this, Collapse);
@@ -1105,20 +1106,21 @@ var Collapse = function ($) {
this._element = element;
this._config = this._getConfig(config);
this._triggerArray = $.makeArray($('[data-toggle="collapse"][href="#' + element.id + '"],' + ('[data-toggle="collapse"][data-target="#' + element.id + '"]')));
+ var tabToggles = $(Selector.DATA_TOGGLE);
+ for (var i = 0; i < tabToggles.length; i++) {
+ var elem = tabToggles[i];
+ var selector = Util.getSelectorFromElement(elem);
+ if (selector !== null && $(selector).filter(element).length > 0) {
+ this._triggerArray.push(elem);
+ }
+ }
+
this._parent = this._config.parent ? this._getParent() : null;
if (!this._config.parent) {
this._addAriaAndCollapsedClass(this._element, this._triggerArray);
}
- this._selectorActives = Selector.ACTIVES;
- if (this._parent) {
- var childrenSelector = this._parent.hasAttribute(Selector.DATA_CHILDREN) ? this._parent.getAttribute(Selector.DATA_CHILDREN) : null;
- if (childrenSelector !== null) {
- this._selectorActives = childrenSelector + ' > .show, ' + childrenSelector + ' > .collapsing';
- }
- }
-
if (this._config.toggle) {
this.toggle();
}
@@ -1147,7 +1149,7 @@ var Collapse = function ($) {
var activesData = void 0;
if (this._parent) {
- actives = $.makeArray($(this._parent).find(this._selectorActives));
+ actives = $.makeArray($(this._parent).children().children(Selector.ACTIVES));
if (!actives.length) {
actives = null;
}
@@ -1230,7 +1232,16 @@ var Collapse = function ($) {
$(this._element).addClass(ClassName.COLLAPSING).removeClass(ClassName.COLLAPSE).removeClass(ClassName.SHOW);
if (this._triggerArray.length) {
- $(this._triggerArray).addClass(ClassName.COLLAPSED).attr('aria-expanded', false);
+ for (var i = 0; i < this._triggerArray.length; i++) {
+ var trigger = this._triggerArray[i];
+ var selector = Util.getSelectorFromElement(trigger);
+ if (selector !== null) {
+ var $elem = $(selector);
+ if (!$elem.hasClass(ClassName.SHOW)) {
+ $(trigger).addClass(ClassName.COLLAPSED).attr('aria-expanded', false);
+ }
+ }
+ }
}
this.setTransitioning(true);
@@ -1358,11 +1369,14 @@ var Collapse = function ($) {
event.preventDefault();
}
- var target = Collapse._getTargetFromElement(this);
- var data = $(target).data(DATA_KEY);
- var config = data ? 'toggle' : $(this).data();
-
- Collapse._jQueryInterface.call($(target), config);
+ var $trigger = $(this);
+ var selector = Util.getSelectorFromElement(this);
+ $(selector).each(function () {
+ var $target = $(this);
+ var data = $target.data(DATA_KEY);
+ var config = data ? 'toggle' : $trigger.data();
+ Collapse._jQueryInterface.call($target, config);
+ });
});
/**
@@ -1381,9 +1395,11 @@ var Collapse = function ($) {
return Collapse;
}(jQuery);
+/* global Popper */
+
/**
* --------------------------------------------------------------------------
- * Bootstrap (v4.0.0-alpha.6): dropdown.js
+ * Bootstrap (v4.0.0-beta): dropdown.js
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
* --------------------------------------------------------------------------
*/
@@ -1391,13 +1407,21 @@ var Collapse = function ($) {
var Dropdown = function ($) {
/**
+ * Check for Popper dependency
+ * Popper - https://popper.js.org
+ */
+ if (typeof Popper === 'undefined') {
+ throw new Error('Bootstrap dropdown require Popper.js (https://popper.js.org)');
+ }
+
+ /**
* ------------------------------------------------------------------------
* Constants
* ------------------------------------------------------------------------
*/
var NAME = 'dropdown';
- var VERSION = '4.0.0-alpha.6';
+ var VERSION = '4.0.0-beta';
var DATA_KEY = 'bs.dropdown';
var EVENT_KEY = '.' + DATA_KEY;
var DATA_API_KEY = '.data-api';
@@ -1423,7 +1447,10 @@ var Dropdown = function ($) {
var ClassName = {
DISABLED: 'disabled',
- SHOW: 'show'
+ SHOW: 'show',
+ DROPUP: 'dropup',
+ MENURIGHT: 'dropdown-menu-right',
+ MENULEFT: 'dropdown-menu-left'
};
var Selector = {
@@ -1434,17 +1461,40 @@ var Dropdown = function ($) {
VISIBLE_ITEMS: '.dropdown-menu .dropdown-item:not(.disabled)'
};
- /**
- * ------------------------------------------------------------------------
- * Class Definition
- * ------------------------------------------------------------------------
- */
+ var AttachmentMap = {
+ TOP: 'top-start',
+ TOPEND: 'top-end',
+ BOTTOM: 'bottom-start',
+ BOTTOMEND: 'bottom-end'
+ };
+
+ var Default = {
+ placement: AttachmentMap.BOTTOM,
+ offset: 0,
+ flip: true
+ };
+
+ var DefaultType = {
+ placement: 'string',
+ offset: '(number|string)',
+ flip: 'boolean'
+ /**
+ * ------------------------------------------------------------------------
+ * Class Definition
+ * ------------------------------------------------------------------------
+ */
+
+ };
var Dropdown = function () {
- function Dropdown(element) {
+ function Dropdown(element, config) {
_classCallCheck(this, Dropdown);
this._element = element;
+ this._popper = null;
+ this._config = this._getConfig(config);
+ this._menu = this._getMenuElement();
+ this._inNavbar = this._detectNavbar();
this._addEventListeners();
}
@@ -1454,29 +1504,38 @@ var Dropdown = function ($) {
// public
Dropdown.prototype.toggle = function toggle() {
- if (this.disabled || $(this).hasClass(ClassName.DISABLED)) {
- return false;
+ if (this._element.disabled || $(this._element).hasClass(ClassName.DISABLED)) {
+ return;
}
- var parent = Dropdown._getParentFromElement(this);
- var isActive = $(parent).hasClass(ClassName.SHOW);
+ var parent = Dropdown._getParentFromElement(this._element);
+ var isActive = $(this._menu).hasClass(ClassName.SHOW);
Dropdown._clearMenus();
if (isActive) {
- return false;
+ return;
}
var relatedTarget = {
- relatedTarget: this
+ relatedTarget: this._element
};
var showEvent = $.Event(Event.SHOW, relatedTarget);
$(parent).trigger(showEvent);
if (showEvent.isDefaultPrevented()) {
- return false;
+ return;
+ }
+
+ var element = this._element;
+ // for dropup with alignment we use the parent as popper container
+ if ($(parent).hasClass(ClassName.DROPUP)) {
+ if ($(this._menu).hasClass(ClassName.MENULEFT) || $(this._menu).hasClass(ClassName.MENURIGHT)) {
+ element = parent;
+ }
}
+ this._popper = new Popper(element, this._menu, this._getPopperConfig());
// if this is a touch-enabled device we add extra
// empty mouseover listeners to the body's immediate children;
@@ -1486,25 +1545,103 @@ var Dropdown = function ($) {
$('body').children().on('mouseover', null, $.noop);
}
- this.focus();
- this.setAttribute('aria-expanded', true);
+ this._element.focus();
+ this._element.setAttribute('aria-expanded', true);
- $(parent).toggleClass(ClassName.SHOW);
- $(parent).trigger($.Event(Event.SHOWN, relatedTarget));
-
- return false;
+ $(this._menu).toggleClass(ClassName.SHOW);
+ $(parent).toggleClass(ClassName.SHOW).trigger($.Event(Event.SHOWN, relatedTarget));
};
Dropdown.prototype.dispose = function dispose() {
$.removeData(this._element, DATA_KEY);
$(this._element).off(EVENT_KEY);
this._element = null;
+ this._menu = null;
+ if (this._popper !== null) {
+ this._popper.destroy();
+ }
+ this._popper = null;
+ };
+
+ Dropdown.prototype.update = function update() {
+ this._inNavbar = this._detectNavbar();
+ if (this._popper !== null) {
+ this._popper.scheduleUpdate();
+ }
};
// private
Dropdown.prototype._addEventListeners = function _addEventListeners() {
- $(this._element).on(Event.CLICK, this.toggle);
+ var _this9 = this;
+
+ $(this._element).on(Event.CLICK, function (event) {
+ event.preventDefault();
+ event.stopPropagation();
+ _this9.toggle();
+ });
+ };
+
+ Dropdown.prototype._getConfig = function _getConfig(config) {
+ var elementData = $(this._element).data();
+ if (elementData.placement !== undefined) {
+ elementData.placement = AttachmentMap[elementData.placement.toUpperCase()];
+ }
+
+ config = $.extend({}, this.constructor.Default, $(this._element).data(), config);
+
+ Util.typeCheckConfig(NAME, config, this.constructor.DefaultType);
+
+ return config;
+ };
+
+ Dropdown.prototype._getMenuElement = function _getMenuElement() {
+ if (!this._menu) {
+ var parent = Dropdown._getParentFromElement(this._element);
+ this._menu = $(parent).find(Selector.MENU)[0];
+ }
+ return this._menu;
+ };
+
+ Dropdown.prototype._getPlacement = function _getPlacement() {
+ var $parentDropdown = $(this._element).parent();
+ var placement = this._config.placement;
+
+ // Handle dropup
+ if ($parentDropdown.hasClass(ClassName.DROPUP) || this._config.placement === AttachmentMap.TOP) {
+ placement = AttachmentMap.TOP;
+ if ($(this._menu).hasClass(ClassName.MENURIGHT)) {
+ placement = AttachmentMap.TOPEND;
+ }
+ } else if ($(this._menu).hasClass(ClassName.MENURIGHT)) {
+ placement = AttachmentMap.BOTTOMEND;
+ }
+ return placement;
+ };
+
+ Dropdown.prototype._detectNavbar = function _detectNavbar() {
+ return $(this._element).closest('.navbar').length > 0;
+ };
+
+ Dropdown.prototype._getPopperConfig = function _getPopperConfig() {
+ var popperConfig = {
+ placement: this._getPlacement(),
+ modifiers: {
+ offset: {
+ offset: this._config.offset
+ },
+ flip: {
+ enabled: this._config.flip
+ }
+ }
+
+ // Disable Popper.js for Dropdown in Navbar
+ };if (this._inNavbar) {
+ popperConfig.modifiers.applyStyle = {
+ enabled: !this._inNavbar
+ };
+ }
+ return popperConfig;
};
// static
@@ -1512,9 +1649,10 @@ var Dropdown = function ($) {
Dropdown._jQueryInterface = function _jQueryInterface(config) {
return this.each(function () {
var data = $(this).data(DATA_KEY);
+ var _config = (typeof config === 'undefined' ? 'undefined' : _typeof(config)) === 'object' ? config : null;
if (!data) {
- data = new Dropdown(this);
+ data = new Dropdown(this, _config);
$(this).data(DATA_KEY, data);
}
@@ -1522,7 +1660,7 @@ var Dropdown = function ($) {
if (data[config] === undefined) {
throw new Error('No method named "' + config + '"');
}
- data[config].call(this);
+ data[config]();
}
});
};
@@ -1533,13 +1671,18 @@ var Dropdown = function ($) {
}
var toggles = $.makeArray($(Selector.DATA_TOGGLE));
-
for (var i = 0; i < toggles.length; i++) {
var parent = Dropdown._getParentFromElement(toggles[i]);
+ var context = $(toggles[i]).data(DATA_KEY);
var relatedTarget = {
relatedTarget: toggles[i]
};
+ if (!context) {
+ continue;
+ }
+
+ var dropdownMenu = context._menu;
if (!$(parent).hasClass(ClassName.SHOW)) {
continue;
}
@@ -1562,6 +1705,7 @@ var Dropdown = function ($) {
toggles[i].setAttribute('aria-expanded', 'false');
+ $(dropdownMenu).removeClass(ClassName.SHOW);
$(parent).removeClass(ClassName.SHOW).trigger($.Event(Event.HIDDEN, relatedTarget));
}
};
@@ -1633,6 +1777,16 @@ var Dropdown = function ($) {
get: function get() {
return VERSION;
}
+ }, {
+ key: 'Default',
+ get: function get() {
+ return Default;
+ }
+ }, {
+ key: 'DefaultType',
+ get: function get() {
+ return DefaultType;
+ }
}]);
return Dropdown;
@@ -1644,7 +1798,11 @@ var Dropdown = function ($) {
* ------------------------------------------------------------------------
*/
- $(document).on(Event.KEYDOWN_DATA_API, Selector.DATA_TOGGLE, Dropdown._dataApiKeydownHandler).on(Event.KEYDOWN_DATA_API, Selector.MENU, Dropdown._dataApiKeydownHandler).on(Event.CLICK_DATA_API + ' ' + Event.KEYUP_DATA_API, Dropdown._clearMenus).on(Event.CLICK_DATA_API, Selector.DATA_TOGGLE, Dropdown.prototype.toggle).on(Event.CLICK_DATA_API, Selector.FORM_CHILD, function (e) {
+ $(document).on(Event.KEYDOWN_DATA_API, Selector.DATA_TOGGLE, Dropdown._dataApiKeydownHandler).on(Event.KEYDOWN_DATA_API, Selector.MENU, Dropdown._dataApiKeydownHandler).on(Event.CLICK_DATA_API + ' ' + Event.KEYUP_DATA_API, Dropdown._clearMenus).on(Event.CLICK_DATA_API, Selector.DATA_TOGGLE, function (event) {
+ event.preventDefault();
+ event.stopPropagation();
+ Dropdown._jQueryInterface.call($(this), 'toggle');
+ }).on(Event.CLICK_DATA_API, Selector.FORM_CHILD, function (e) {
e.stopPropagation();
});
@@ -1666,7 +1824,7 @@ var Dropdown = function ($) {
/**
* --------------------------------------------------------------------------
- * Bootstrap (v4.0.0-alpha.6): modal.js
+ * Bootstrap (v4.0.0-beta): modal.js
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
* --------------------------------------------------------------------------
*/
@@ -1680,7 +1838,7 @@ var Modal = function ($) {
*/
var NAME = 'modal';
- var VERSION = '4.0.0-alpha.6';
+ var VERSION = '4.0.0-beta';
var DATA_KEY = 'bs.modal';
var EVENT_KEY = '.' + DATA_KEY;
var DATA_API_KEY = '.data-api';
@@ -1731,14 +1889,14 @@ var Modal = function ($) {
DATA_DISMISS: '[data-dismiss="modal"]',
FIXED_CONTENT: '.fixed-top, .fixed-bottom, .is-fixed, .sticky-top',
NAVBAR_TOGGLER: '.navbar-toggler'
- };
- /**
- * ------------------------------------------------------------------------
- * Class Definition
- * ------------------------------------------------------------------------
- */
+ /**
+ * ------------------------------------------------------------------------
+ * Class Definition
+ * ------------------------------------------------------------------------
+ */
+ };
var Modal = function () {
function Modal(element, config) {
_classCallCheck(this, Modal);
@@ -1763,7 +1921,7 @@ var Modal = function ($) {
};
Modal.prototype.show = function show(relatedTarget) {
- var _this9 = this;
+ var _this10 = this;
if (this._isTransitioning) {
return;
@@ -1794,24 +1952,24 @@ var Modal = function ($) {
this._setResizeEvent();
$(this._element).on(Event.CLICK_DISMISS, Selector.DATA_DISMISS, function (event) {
- return _this9.hide(event);
+ return _this10.hide(event);
});
$(this._dialog).on(Event.MOUSEDOWN_DISMISS, function () {
- $(_this9._element).one(Event.MOUSEUP_DISMISS, function (event) {
- if ($(event.target).is(_this9._element)) {
- _this9._ignoreBackdropClick = true;
+ $(_this10._element).one(Event.MOUSEUP_DISMISS, function (event) {
+ if ($(event.target).is(_this10._element)) {
+ _this10._ignoreBackdropClick = true;
}
});
});
this._showBackdrop(function () {
- return _this9._showElement(relatedTarget);
+ return _this10._showElement(relatedTarget);
});
};
Modal.prototype.hide = function hide(event) {
- var _this10 = this;
+ var _this11 = this;
if (event) {
event.preventDefault();
@@ -1850,7 +2008,7 @@ var Modal = function ($) {
if (transition) {
$(this._element).one(Util.TRANSITION_END, function (event) {
- return _this10._hideModal(event);
+ return _this11._hideModal(event);
}).emulateTransitionEnd(TRANSITION_DURATION);
} else {
this._hideModal();
@@ -1885,7 +2043,7 @@ var Modal = function ($) {
};
Modal.prototype._showElement = function _showElement(relatedTarget) {
- var _this11 = this;
+ var _this12 = this;
var transition = Util.supportsTransitionEnd() && $(this._element).hasClass(ClassName.FADE);
@@ -1913,11 +2071,11 @@ var Modal = function ($) {
});
var transitionComplete = function transitionComplete() {
- if (_this11._config.focus) {
- _this11._element.focus();
+ if (_this12._config.focus) {
+ _this12._element.focus();
}
- _this11._isTransitioning = false;
- $(_this11._element).trigger(shownEvent);
+ _this12._isTransitioning = false;
+ $(_this12._element).trigger(shownEvent);
};
if (transition) {
@@ -1928,24 +2086,24 @@ var Modal = function ($) {
};
Modal.prototype._enforceFocus = function _enforceFocus() {
- var _this12 = this;
+ var _this13 = this;
$(document).off(Event.FOCUSIN) // guard against infinite focus loop
.on(Event.FOCUSIN, function (event) {
- if (document !== event.target && _this12._element !== event.target && !$(_this12._element).has(event.target).length) {
- _this12._element.focus();
+ if (document !== event.target && _this13._element !== event.target && !$(_this13._element).has(event.target).length) {
+ _this13._element.focus();
}
});
};
Modal.prototype._setEscapeEvent = function _setEscapeEvent() {
- var _this13 = this;
+ var _this14 = this;
if (this._isShown && this._config.keyboard) {
$(this._element).on(Event.KEYDOWN_DISMISS, function (event) {
if (event.which === ESCAPE_KEYCODE) {
event.preventDefault();
- _this13.hide();
+ _this14.hide();
}
});
} else if (!this._isShown) {
@@ -1954,11 +2112,11 @@ var Modal = function ($) {
};
Modal.prototype._setResizeEvent = function _setResizeEvent() {
- var _this14 = this;
+ var _this15 = this;
if (this._isShown) {
$(window).on(Event.RESIZE, function (event) {
- return _this14.handleUpdate(event);
+ return _this15.handleUpdate(event);
});
} else {
$(window).off(Event.RESIZE);
@@ -1966,16 +2124,16 @@ var Modal = function ($) {
};
Modal.prototype._hideModal = function _hideModal() {
- var _this15 = this;
+ var _this16 = this;
this._element.style.display = 'none';
this._element.setAttribute('aria-hidden', true);
this._isTransitioning = false;
this._showBackdrop(function () {
$(document.body).removeClass(ClassName.OPEN);
- _this15._resetAdjustments();
- _this15._resetScrollbar();
- $(_this15._element).trigger(Event.HIDDEN);
+ _this16._resetAdjustments();
+ _this16._resetScrollbar();
+ $(_this16._element).trigger(Event.HIDDEN);
});
};
@@ -1987,7 +2145,7 @@ var Modal = function ($) {
};
Modal.prototype._showBackdrop = function _showBackdrop(callback) {
- var _this16 = this;
+ var _this17 = this;
var animate = $(this._element).hasClass(ClassName.FADE) ? ClassName.FADE : '';
@@ -2004,17 +2162,17 @@ var Modal = function ($) {
$(this._backdrop).appendTo(document.body);
$(this._element).on(Event.CLICK_DISMISS, function (event) {
- if (_this16._ignoreBackdropClick) {
- _this16._ignoreBackdropClick = false;
+ if (_this17._ignoreBackdropClick) {
+ _this17._ignoreBackdropClick = false;
return;
}
if (event.target !== event.currentTarget) {
return;
}
- if (_this16._config.backdrop === 'static') {
- _this16._element.focus();
+ if (_this17._config.backdrop === 'static') {
+ _this17._element.focus();
} else {
- _this16.hide();
+ _this17.hide();
}
});
@@ -2038,7 +2196,7 @@ var Modal = function ($) {
$(this._backdrop).removeClass(ClassName.SHOW);
var callbackRemove = function callbackRemove() {
- _this16._removeBackdrop();
+ _this17._removeBackdrop();
if (callback) {
callback();
}
@@ -2082,7 +2240,7 @@ var Modal = function ($) {
};
Modal.prototype._setScrollbar = function _setScrollbar() {
- var _this17 = this;
+ var _this18 = this;
if (this._isBodyOverflowing) {
// Note: DOMNode.style.paddingRight returns the actual value or '' if not set
@@ -2092,14 +2250,14 @@ var Modal = function ($) {
$(Selector.FIXED_CONTENT).each(function (index, element) {
var actualPadding = $(element)[0].style.paddingRight;
var calculatedPadding = $(element).css('padding-right');
- $(element).data('padding-right', actualPadding).css('padding-right', parseFloat(calculatedPadding) + _this17._scrollbarWidth + 'px');
+ $(element).data('padding-right', actualPadding).css('padding-right', parseFloat(calculatedPadding) + _this18._scrollbarWidth + 'px');
});
// Adjust navbar-toggler margin
$(Selector.NAVBAR_TOGGLER).each(function (index, element) {
var actualMargin = $(element)[0].style.marginRight;
var calculatedMargin = $(element).css('margin-right');
- $(element).data('margin-right', actualMargin).css('margin-right', parseFloat(calculatedMargin) + _this17._scrollbarWidth + 'px');
+ $(element).data('margin-right', actualMargin).css('margin-right', parseFloat(calculatedMargin) + _this18._scrollbarWidth + 'px');
});
// Adjust body padding
@@ -2188,7 +2346,7 @@ var Modal = function ($) {
*/
$(document).on(Event.CLICK_DATA_API, Selector.DATA_TOGGLE, function (event) {
- var _this18 = this;
+ var _this19 = this;
var target = void 0;
var selector = Util.getSelectorFromElement(this);
@@ -2210,8 +2368,8 @@ var Modal = function ($) {
}
$target.one(Event.HIDDEN, function () {
- if ($(_this18).is(':visible')) {
- _this18.focus();
+ if ($(_this19).is(':visible')) {
+ _this19.focus();
}
});
});
@@ -2237,7 +2395,7 @@ var Modal = function ($) {
/**
* --------------------------------------------------------------------------
- * Bootstrap (v4.0.0-alpha.6): scrollspy.js
+ * Bootstrap (v4.0.0-beta): scrollspy.js
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
* --------------------------------------------------------------------------
*/
@@ -2251,7 +2409,7 @@ var ScrollSpy = function ($) {
*/
var NAME = 'scrollspy';
- var VERSION = '4.0.0-alpha.6';
+ var VERSION = '4.0.0-beta';
var DATA_KEY = 'bs.scrollspy';
var EVENT_KEY = '.' + DATA_KEY;
var DATA_API_KEY = '.data-api';
@@ -2295,17 +2453,17 @@ var ScrollSpy = function ($) {
var OffsetMethod = {
OFFSET: 'offset',
POSITION: 'position'
- };
- /**
- * ------------------------------------------------------------------------
- * Class Definition
- * ------------------------------------------------------------------------
- */
+ /**
+ * ------------------------------------------------------------------------
+ * Class Definition
+ * ------------------------------------------------------------------------
+ */
+ };
var ScrollSpy = function () {
function ScrollSpy(element, config) {
- var _this19 = this;
+ var _this20 = this;
_classCallCheck(this, ScrollSpy);
@@ -2319,7 +2477,7 @@ var ScrollSpy = function ($) {
this._scrollHeight = 0;
$(this._scrollElement).on(Event.SCROLL, function (event) {
- return _this19._process(event);
+ return _this20._process(event);
});
this.refresh();
@@ -2331,7 +2489,7 @@ var ScrollSpy = function ($) {
// public
ScrollSpy.prototype.refresh = function refresh() {
- var _this20 = this;
+ var _this21 = this;
var autoMethod = this._scrollElement !== this._scrollElement.window ? OffsetMethod.POSITION : OffsetMethod.OFFSET;
@@ -2367,8 +2525,8 @@ var ScrollSpy = function ($) {
}).sort(function (a, b) {
return a[0] - b[0];
}).forEach(function (item) {
- _this20._offsets.push(item[0]);
- _this20._targets.push(item[1]);
+ _this21._offsets.push(item[0]);
+ _this21._targets.push(item[1]);
});
};
@@ -2551,7 +2709,7 @@ var ScrollSpy = function ($) {
/**
* --------------------------------------------------------------------------
- * Bootstrap (v4.0.0-alpha.6): tab.js
+ * Bootstrap (v4.0.0-beta): tab.js
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
* --------------------------------------------------------------------------
*/
@@ -2565,7 +2723,7 @@ var Tab = function ($) {
*/
var NAME = 'tab';
- var VERSION = '4.0.0-alpha.6';
+ var VERSION = '4.0.0-beta';
var DATA_KEY = 'bs.tab';
var EVENT_KEY = '.' + DATA_KEY;
var DATA_API_KEY = '.data-api';
@@ -2595,14 +2753,14 @@ var Tab = function ($) {
DATA_TOGGLE: '[data-toggle="tab"], [data-toggle="pill"], [data-toggle="list"]',
DROPDOWN_TOGGLE: '.dropdown-toggle',
DROPDOWN_ACTIVE_CHILD: '> .dropdown-menu .active'
- };
- /**
- * ------------------------------------------------------------------------
- * Class Definition
- * ------------------------------------------------------------------------
- */
+ /**
+ * ------------------------------------------------------------------------
+ * Class Definition
+ * ------------------------------------------------------------------------
+ */
+ };
var Tab = function () {
function Tab(element) {
_classCallCheck(this, Tab);
@@ -2615,7 +2773,7 @@ var Tab = function ($) {
// public
Tab.prototype.show = function show() {
- var _this21 = this;
+ var _this22 = this;
if (this._element.parentNode && this._element.parentNode.nodeType === Node.ELEMENT_NODE && $(this._element).hasClass(ClassName.ACTIVE) || $(this._element).hasClass(ClassName.DISABLED)) {
return;
@@ -2657,7 +2815,7 @@ var Tab = function ($) {
var complete = function complete() {
var hiddenEvent = $.Event(Event.HIDDEN, {
- relatedTarget: _this21._element
+ relatedTarget: _this22._element
});
var shownEvent = $.Event(Event.SHOWN, {
@@ -2665,7 +2823,7 @@ var Tab = function ($) {
});
$(previous).trigger(hiddenEvent);
- $(_this21._element).trigger(shownEvent);
+ $(_this22._element).trigger(shownEvent);
};
if (target) {
@@ -2676,20 +2834,20 @@ var Tab = function ($) {
};
Tab.prototype.dispose = function dispose() {
- $.removeClass(this._element, DATA_KEY);
+ $.removeData(this._element, DATA_KEY);
this._element = null;
};
// private
Tab.prototype._activate = function _activate(element, container, callback) {
- var _this22 = this;
+ var _this23 = this;
var active = $(container).find(Selector.ACTIVE)[0];
var isTransitioning = callback && Util.supportsTransitionEnd() && active && $(active).hasClass(ClassName.FADE);
var complete = function complete() {
- return _this22._transitionComplete(element, active, isTransitioning, callback);
+ return _this23._transitionComplete(element, active, isTransitioning, callback);
};
if (active && isTransitioning) {
@@ -2799,11 +2957,11 @@ var Tab = function ($) {
return Tab;
}(jQuery);
-/* global Tether */
+/* global Popper */
/**
* --------------------------------------------------------------------------
- * Bootstrap (v4.0.0-alpha.6): tooltip.js
+ * Bootstrap (v4.0.0-beta): tooltip.js
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
* --------------------------------------------------------------------------
*/
@@ -2811,11 +2969,11 @@ var Tab = function ($) {
var Tooltip = function ($) {
/**
- * Check for Tether dependency
- * Tether - http://tether.io/
+ * Check for Popper dependency
+ * Popper - https://popper.js.org
*/
- if (typeof Tether === 'undefined') {
- throw new Error('Bootstrap tooltips require Tether (http://tether.io/)');
+ if (typeof Popper === 'undefined') {
+ throw new Error('Bootstrap tooltips require Popper.js (https://popper.js.org)');
}
/**
@@ -2825,27 +2983,13 @@ var Tooltip = function ($) {
*/
var NAME = 'tooltip';
- var VERSION = '4.0.0-alpha.6';
+ var VERSION = '4.0.0-beta';
var DATA_KEY = 'bs.tooltip';
var EVENT_KEY = '.' + DATA_KEY;
var JQUERY_NO_CONFLICT = $.fn[NAME];
var TRANSITION_DURATION = 150;
- var CLASS_PREFIX = 'bs-tether';
- var TETHER_PREFIX_REGEX = new RegExp('(^|\\s)' + CLASS_PREFIX + '\\S+', 'g');
-
- var Default = {
- animation: true,
- template: '<div class="tooltip" role="tooltip">' + '<div class="tooltip-inner"></div></div>',
- trigger: 'hover focus',
- title: '',
- delay: 0,
- html: false,
- selector: false,
- placement: 'top',
- offset: '0 0',
- constraints: [],
- container: false
- };
+ var CLASS_PREFIX = 'bs-tooltip';
+ var BSCLS_PREFIX_REGEX = new RegExp('(^|\\s)' + CLASS_PREFIX + '\\S+', 'g');
var DefaultType = {
animation: 'boolean',
@@ -2856,16 +3000,31 @@ var Tooltip = function ($) {
html: 'boolean',
selector: '(string|boolean)',
placement: '(string|function)',
- offset: 'string',
- constraints: 'array',
- container: '(string|element|boolean)'
+ offset: '(number|string)',
+ container: '(string|element|boolean)',
+ fallbackPlacement: '(string|array)'
};
var AttachmentMap = {
- TOP: 'bottom center',
- RIGHT: 'middle left',
- BOTTOM: 'top center',
- LEFT: 'middle right'
+ AUTO: 'auto',
+ TOP: 'top',
+ RIGHT: 'right',
+ BOTTOM: 'bottom',
+ LEFT: 'left'
+ };
+
+ var Default = {
+ animation: true,
+ template: '<div class="tooltip" role="tooltip">' + '<div class="arrow"></div>' + '<div class="tooltip-inner"></div></div>',
+ trigger: 'hover focus',
+ title: '',
+ delay: 0,
+ html: false,
+ selector: false,
+ placement: 'top',
+ offset: 0,
+ container: false,
+ fallbackPlacement: 'flip'
};
var HoverState = {
@@ -2893,12 +3052,8 @@ var Tooltip = function ($) {
var Selector = {
TOOLTIP: '.tooltip',
- TOOLTIP_INNER: '.tooltip-inner'
- };
-
- var TetherClass = {
- element: false,
- enabled: false
+ TOOLTIP_INNER: '.tooltip-inner',
+ ARROW: '.arrow'
};
var Trigger = {
@@ -2906,14 +3061,14 @@ var Tooltip = function ($) {
FOCUS: 'focus',
CLICK: 'click',
MANUAL: 'manual'
- };
- /**
- * ------------------------------------------------------------------------
- * Class Definition
- * ------------------------------------------------------------------------
- */
+ /**
+ * ------------------------------------------------------------------------
+ * Class Definition
+ * ------------------------------------------------------------------------
+ */
+ };
var Tooltip = function () {
function Tooltip(element, config) {
_classCallCheck(this, Tooltip);
@@ -2923,7 +3078,7 @@ var Tooltip = function ($) {
this._timeout = 0;
this._hoverState = '';
this._activeTrigger = {};
- this._tether = null;
+ this._popper = null;
// protected
this.element = element;
@@ -2980,8 +3135,6 @@ var Tooltip = function ($) {
Tooltip.prototype.dispose = function dispose() {
clearTimeout(this._timeout);
- this.cleanupTether();
-
$.removeData(this.element, this.constructor.DATA_KEY);
$(this.element).off(this.constructor.EVENT_KEY);
@@ -2995,7 +3148,10 @@ var Tooltip = function ($) {
this._timeout = null;
this._hoverState = null;
this._activeTrigger = null;
- this._tether = null;
+ if (this._popper !== null) {
+ this._popper.destroy();
+ }
+ this._popper = null;
this.element = null;
this.config = null;
@@ -3003,7 +3159,7 @@ var Tooltip = function ($) {
};
Tooltip.prototype.show = function show() {
- var _this23 = this;
+ var _this24 = this;
if ($(this.element).css('display') === 'none') {
throw new Error('Please use show on visible elements');
@@ -3034,6 +3190,7 @@ var Tooltip = function ($) {
var placement = typeof this.config.placement === 'function' ? this.config.placement.call(this, tip, this.element) : this.config.placement;
var attachment = this._getAttachment(placement);
+ this.addAttachmentClass(attachment);
var container = this.config.container === false ? document.body : $(this.config.container);
@@ -3045,20 +3202,29 @@ var Tooltip = function ($) {
$(this.element).trigger(this.constructor.Event.INSERTED);
- this._tether = new Tether({
- attachment: attachment,
- element: tip,
- target: this.element,
- classes: TetherClass,
- classPrefix: CLASS_PREFIX,
- offset: this.config.offset,
- constraints: this.config.constraints,
- addTargetClasses: false
+ this._popper = new Popper(this.element, tip, {
+ placement: attachment,
+ modifiers: {
+ offset: {
+ offset: this.config.offset
+ },
+ flip: {
+ behavior: this.config.fallbackPlacement
+ },
+ arrow: {
+ element: Selector.ARROW
+ }
+ },
+ onCreate: function onCreate(data) {
+ if (data.originalPlacement !== data.placement) {
+ _this24._handlePopperPlacementChange(data);
+ }
+ },
+ onUpdate: function onUpdate(data) {
+ _this24._handlePopperPlacementChange(data);
+ }
});
- Util.reflow(tip);
- this._tether.position();
-
$(tip).addClass(ClassName.SHOW);
// if this is a touch-enabled device we add extra
@@ -3070,39 +3236,43 @@ var Tooltip = function ($) {
}
var complete = function complete() {
- var prevHoverState = _this23._hoverState;
- _this23._hoverState = null;
+ if (_this24.config.animation) {
+ _this24._fixTransition();
+ }
+ var prevHoverState = _this24._hoverState;
+ _this24._hoverState = null;
- $(_this23.element).trigger(_this23.constructor.Event.SHOWN);
+ $(_this24.element).trigger(_this24.constructor.Event.SHOWN);
if (prevHoverState === HoverState.OUT) {
- _this23._leave(null, _this23);
+ _this24._leave(null, _this24);
}
};
if (Util.supportsTransitionEnd() && $(this.tip).hasClass(ClassName.FADE)) {
$(this.tip).one(Util.TRANSITION_END, complete).emulateTransitionEnd(Tooltip._TRANSITION_DURATION);
- return;
+ } else {
+ complete();
}
-
- complete();
}
};
Tooltip.prototype.hide = function hide(callback) {
- var _this24 = this;
+ var _this25 = this;
var tip = this.getTipElement();
var hideEvent = $.Event(this.constructor.Event.HIDE);
var complete = function complete() {
- if (_this24._hoverState !== HoverState.SHOW && tip.parentNode) {
+ if (_this25._hoverState !== HoverState.SHOW && tip.parentNode) {
tip.parentNode.removeChild(tip);
}
- _this24._cleanTipClass();
- _this24.element.removeAttribute('aria-describedby');
- $(_this24.element).trigger(_this24.constructor.Event.HIDDEN);
- _this24.cleanupTether();
+ _this25._cleanTipClass();
+ _this25.element.removeAttribute('aria-describedby');
+ $(_this25.element).trigger(_this25.constructor.Event.HIDDEN);
+ if (_this25._popper !== null) {
+ _this25._popper.destroy();
+ }
if (callback) {
callback();
@@ -3137,24 +3307,30 @@ var Tooltip = function ($) {
this._hoverState = '';
};
+ Tooltip.prototype.update = function update() {
+ if (this._popper !== null) {
+ this._popper.scheduleUpdate();
+ }
+ };
+
// protected
Tooltip.prototype.isWithContent = function isWithContent() {
return Boolean(this.getTitle());
};
+ Tooltip.prototype.addAttachmentClass = function addAttachmentClass(attachment) {
+ $(this.getTipElement()).addClass(CLASS_PREFIX + '-' + attachment);
+ };
+
Tooltip.prototype.getTipElement = function getTipElement() {
return this.tip = this.tip || $(this.config.template)[0];
};
Tooltip.prototype.setContent = function setContent() {
var $tip = $(this.getTipElement());
-
this.setElementContent($tip.find(Selector.TOOLTIP_INNER), this.getTitle());
-
$tip.removeClass(ClassName.FADE + ' ' + ClassName.SHOW);
-
- this.cleanupTether();
};
Tooltip.prototype.setElementContent = function setElementContent($element, content) {
@@ -3183,49 +3359,35 @@ var Tooltip = function ($) {
return title;
};
- Tooltip.prototype.cleanupTether = function cleanupTether() {
- if (this._tether) {
- this._tether.destroy();
- }
- };
-
// private
Tooltip.prototype._getAttachment = function _getAttachment(placement) {
return AttachmentMap[placement.toUpperCase()];
};
- Tooltip.prototype._cleanTipClass = function _cleanTipClass() {
- var $tip = $(this.getTipElement());
- var tabClass = $tip.attr('class').match(TETHER_PREFIX_REGEX);
- if (tabClass !== null && tabClass.length > 0) {
- $tip.removeClass(tabClass.join(''));
- }
- };
-
Tooltip.prototype._setListeners = function _setListeners() {
- var _this25 = this;
+ var _this26 = this;
var triggers = this.config.trigger.split(' ');
triggers.forEach(function (trigger) {
if (trigger === 'click') {
- $(_this25.element).on(_this25.constructor.Event.CLICK, _this25.config.selector, function (event) {
- return _this25.toggle(event);
+ $(_this26.element).on(_this26.constructor.Event.CLICK, _this26.config.selector, function (event) {
+ return _this26.toggle(event);
});
} else if (trigger !== Trigger.MANUAL) {
- var eventIn = trigger === Trigger.HOVER ? _this25.constructor.Event.MOUSEENTER : _this25.constructor.Event.FOCUSIN;
- var eventOut = trigger === Trigger.HOVER ? _this25.constructor.Event.MOUSELEAVE : _this25.constructor.Event.FOCUSOUT;
+ var eventIn = trigger === Trigger.HOVER ? _this26.constructor.Event.MOUSEENTER : _this26.constructor.Event.FOCUSIN;
+ var eventOut = trigger === Trigger.HOVER ? _this26.constructor.Event.MOUSELEAVE : _this26.constructor.Event.FOCUSOUT;
- $(_this25.element).on(eventIn, _this25.config.selector, function (event) {
- return _this25._enter(event);
- }).on(eventOut, _this25.config.selector, function (event) {
- return _this25._leave(event);
+ $(_this26.element).on(eventIn, _this26.config.selector, function (event) {
+ return _this26._enter(event);
+ }).on(eventOut, _this26.config.selector, function (event) {
+ return _this26._leave(event);
});
}
- $(_this25.element).closest('.modal').on('hide.bs.modal', function () {
- return _this25.hide();
+ $(_this26.element).closest('.modal').on('hide.bs.modal', function () {
+ return _this26.hide();
});
});
@@ -3363,6 +3525,32 @@ var Tooltip = function ($) {
return config;
};
+ Tooltip.prototype._cleanTipClass = function _cleanTipClass() {
+ var $tip = $(this.getTipElement());
+ var tabClass = $tip.attr('class').match(BSCLS_PREFIX_REGEX);
+ if (tabClass !== null && tabClass.length > 0) {
+ $tip.removeClass(tabClass.join(''));
+ }
+ };
+
+ Tooltip.prototype._handlePopperPlacementChange = function _handlePopperPlacementChange(data) {
+ this._cleanTipClass();
+ this.addAttachmentClass(this._getAttachment(data.placement));
+ };
+
+ Tooltip.prototype._fixTransition = function _fixTransition() {
+ var tip = this.getTipElement();
+ var initConfigAnimation = this.config.animation;
+ if (tip.getAttribute('x-placement') !== null) {
+ return;
+ }
+ $(tip).removeClass(ClassName.FADE);
+ this.config.animation = false;
+ this.hide();
+ this.show();
+ this.config.animation = initConfigAnimation;
+ };
+
// static
Tooltip._jQueryInterface = function _jQueryInterface(config) {
@@ -3446,7 +3634,7 @@ var Tooltip = function ($) {
/**
* --------------------------------------------------------------------------
- * Bootstrap (v4.0.0-alpha.6): popover.js
+ * Bootstrap (v4.0.0-beta): popover.js
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
* --------------------------------------------------------------------------
*/
@@ -3460,16 +3648,18 @@ var Popover = function ($) {
*/
var NAME = 'popover';
- var VERSION = '4.0.0-alpha.6';
+ var VERSION = '4.0.0-beta';
var DATA_KEY = 'bs.popover';
var EVENT_KEY = '.' + DATA_KEY;
var JQUERY_NO_CONFLICT = $.fn[NAME];
+ var CLASS_PREFIX = 'bs-popover';
+ var BSCLS_PREFIX_REGEX = new RegExp('(^|\\s)' + CLASS_PREFIX + '\\S+', 'g');
var Default = $.extend({}, Tooltip.Default, {
placement: 'right',
trigger: 'click',
content: '',
- template: '<div class="popover" role="tooltip">' + '<h3 class="popover-title"></h3>' + '<div class="popover-content"></div></div>'
+ template: '<div class="popover" role="tooltip">' + '<div class="arrow"></div>' + '<h3 class="popover-header"></h3>' + '<div class="popover-body"></div></div>'
});
var DefaultType = $.extend({}, Tooltip.DefaultType, {
@@ -3482,8 +3672,8 @@ var Popover = function ($) {
};
var Selector = {
- TITLE: '.popover-title',
- CONTENT: '.popover-content'
+ TITLE: '.popover-header',
+ CONTENT: '.popover-body'
};
var Event = {
@@ -3497,14 +3687,14 @@ var Popover = function ($) {
FOCUSOUT: 'focusout' + EVENT_KEY,
MOUSEENTER: 'mouseenter' + EVENT_KEY,
MOUSELEAVE: 'mouseleave' + EVENT_KEY
- };
- /**
- * ------------------------------------------------------------------------
- * Class Definition
- * ------------------------------------------------------------------------
- */
+ /**
+ * ------------------------------------------------------------------------
+ * Class Definition
+ * ------------------------------------------------------------------------
+ */
+ };
var Popover = function (_Tooltip) {
_inherits(Popover, _Tooltip);
@@ -3520,6 +3710,10 @@ var Popover = function ($) {
return this.getTitle() || this._getContent();
};
+ Popover.prototype.addAttachmentClass = function addAttachmentClass(attachment) {
+ $(this.getTipElement()).addClass(CLASS_PREFIX + '-' + attachment);
+ };
+
Popover.prototype.getTipElement = function getTipElement() {
return this.tip = this.tip || $(this.config.template)[0];
};
@@ -3532,8 +3726,6 @@ var Popover = function ($) {
this.setElementContent($tip.find(Selector.CONTENT), this._getContent());
$tip.removeClass(ClassName.FADE + ' ' + ClassName.SHOW);
-
- this.cleanupTether();
};
// private
@@ -3542,6 +3734,14 @@ var Popover = function ($) {
return this.element.getAttribute('data-content') || (typeof this.config.content === 'function' ? this.config.content.call(this.element) : this.config.content);
};
+ Popover.prototype._cleanTipClass = function _cleanTipClass() {
+ var $tip = $(this.getTipElement());
+ var tabClass = $tip.attr('class').match(BSCLS_PREFIX_REGEX);
+ if (tabClass !== null && tabClass.length > 0) {
+ $tip.removeClass(tabClass.join(''));
+ }
+ };
+
// static
Popover._jQueryInterface = function _jQueryInterface(config) {
@@ -3628,4 +3828,4 @@ var Popover = function ($) {
}(jQuery);
-})() \ No newline at end of file
+})(); \ No newline at end of file
diff --git a/library/bootstrap/js/bootstrap.min.js b/library/bootstrap/js/bootstrap.min.js
index 8537f817f..e1874769b 100644
--- a/library/bootstrap/js/bootstrap.min.js
+++ b/library/bootstrap/js/bootstrap.min.js
@@ -1,7 +1,6 @@
/*!
- * Bootstrap v4.0.0-alpha.6 (https://getbootstrap.com)
+ * Bootstrap v4.0.0-beta (https://getbootstrap.com)
* Copyright 2011-2017 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors)
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
*/
-if("undefined"==typeof jQuery)throw new Error("Bootstrap's JavaScript requires jQuery. jQuery must be included before Bootstrap's JavaScript.");!function(t){var e=t.fn.jquery.split(" ")[0].split(".");if(e[0]<2&&e[1]<9||1==e[0]&&9==e[1]&&e[2]<1||e[0]>=4)throw new Error("Bootstrap's JavaScript requires at least jQuery v1.9.1 but less than v4.0.0")}(jQuery),function(){function t(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function e(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}function n(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}var i="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},o=function(){function t(t,e){for(var n=0;n<e.length;n++){var i=e[n];i.enumerable=i.enumerable||!1,i.configurable=!0,"value"in i&&(i.writable=!0),Object.defineProperty(t,i.key,i)}}return function(e,n,i){return n&&t(e.prototype,n),i&&t(e,i),e}}(),r=function(t){function e(t){return{}.toString.call(t).match(/\s([a-zA-Z]+)/)[1].toLowerCase()}function n(t){return(t[0]||t).nodeType}function i(){return{bindType:s.end,delegateType:s.end,handle:function(e){if(t(e.target).is(this))return e.handleObj.handler.apply(this,arguments)}}}function o(){if(window.QUnit)return!1;var t=document.createElement("bootstrap");for(var e in a)if(void 0!==t.style[e])return{end:a[e]};return!1}function r(e){var n=this,i=!1;return t(this).one(l.TRANSITION_END,function(){i=!0}),setTimeout(function(){i||l.triggerTransitionEnd(n)},e),this}var s=!1,a={WebkitTransition:"webkitTransitionEnd",MozTransition:"transitionend",OTransition:"oTransitionEnd otransitionend",transition:"transitionend"},l={TRANSITION_END:"bsTransitionEnd",getUID:function(t){do{t+=~~(1e6*Math.random())}while(document.getElementById(t));return t},getSelectorFromElement:function(e){var n=e.getAttribute("data-target");n&&"#"!==n||(n=e.getAttribute("href")||"");try{return t(n).length>0?n:null}catch(t){return null}},reflow:function(t){return t.offsetHeight},triggerTransitionEnd:function(e){t(e).trigger(s.end)},supportsTransitionEnd:function(){return Boolean(s)},typeCheckConfig:function(t,i,o){for(var r in o)if(o.hasOwnProperty(r)){var s=o[r],a=i[r],l=a&&n(a)?"element":e(a);if(!new RegExp(s).test(l))throw new Error(t.toUpperCase()+': Option "'+r+'" provided type "'+l+'" but expected type "'+s+'".')}}};return function(){s=o(),t.fn.emulateTransitionEnd=r,l.supportsTransitionEnd()&&(t.event.special[l.TRANSITION_END]=i())}(),l}(jQuery),s=(function(t){var e="alert",i=t.fn[e],s={DISMISS:'[data-dismiss="alert"]'},a={CLOSE:"close.bs.alert",CLOSED:"closed.bs.alert",CLICK_DATA_API:"click.bs.alert.data-api"},l={ALERT:"alert",FADE:"fade",SHOW:"show"},h=function(){function e(t){n(this,e),this._element=t}return e.prototype.close=function(t){t=t||this._element;var e=this._getRootElement(t);this._triggerCloseEvent(e).isDefaultPrevented()||this._removeElement(e)},e.prototype.dispose=function(){t.removeData(this._element,"bs.alert"),this._element=null},e.prototype._getRootElement=function(e){var n=r.getSelectorFromElement(e),i=!1;return n&&(i=t(n)[0]),i||(i=t(e).closest("."+l.ALERT)[0]),i},e.prototype._triggerCloseEvent=function(e){var n=t.Event(a.CLOSE);return t(e).trigger(n),n},e.prototype._removeElement=function(e){var n=this;if(t(e).removeClass(l.SHOW),!r.supportsTransitionEnd()||!t(e).hasClass(l.FADE))return void this._destroyElement(e);t(e).one(r.TRANSITION_END,function(t){return n._destroyElement(e,t)}).emulateTransitionEnd(150)},e.prototype._destroyElement=function(e){t(e).detach().trigger(a.CLOSED).remove()},e._jQueryInterface=function(n){return this.each(function(){var i=t(this),o=i.data("bs.alert");o||(o=new e(this),i.data("bs.alert",o)),"close"===n&&o[n](this)})},e._handleDismiss=function(t){return function(e){e&&e.preventDefault(),t.close(this)}},o(e,null,[{key:"VERSION",get:function(){return"4.0.0-alpha.6"}}]),e}();t(document).on(a.CLICK_DATA_API,s.DISMISS,h._handleDismiss(new h)),t.fn[e]=h._jQueryInterface,t.fn[e].Constructor=h,t.fn[e].noConflict=function(){return t.fn[e]=i,h._jQueryInterface}}(jQuery),function(t){var e="button",i=t.fn[e],r={ACTIVE:"active",BUTTON:"btn",FOCUS:"focus"},s={DATA_TOGGLE_CARROT:'[data-toggle^="button"]',DATA_TOGGLE:'[data-toggle="buttons"]',INPUT:"input",ACTIVE:".active",BUTTON:".btn"},a={CLICK_DATA_API:"click.bs.button.data-api",FOCUS_BLUR_DATA_API:"focus.bs.button.data-api blur.bs.button.data-api"},l=function(){function e(t){n(this,e),this._element=t}return e.prototype.toggle=function(){var e=!0,n=!0,i=t(this._element).closest(s.DATA_TOGGLE)[0];if(i){var o=t(this._element).find(s.INPUT)[0];if(o){if("radio"===o.type)if(o.checked&&t(this._element).hasClass(r.ACTIVE))e=!1;else{var a=t(i).find(s.ACTIVE)[0];a&&t(a).removeClass(r.ACTIVE)}e&&(o.checked=!t(this._element).hasClass(r.ACTIVE),t(o).trigger("change")),o.focus(),n=!1}}n&&this._element.setAttribute("aria-pressed",!t(this._element).hasClass(r.ACTIVE)),e&&t(this._element).toggleClass(r.ACTIVE)},e.prototype.dispose=function(){t.removeData(this._element,"bs.button"),this._element=null},e._jQueryInterface=function(n){return this.each(function(){var i=t(this).data("bs.button");i||(i=new e(this),t(this).data("bs.button",i)),"toggle"===n&&i[n]()})},o(e,null,[{key:"VERSION",get:function(){return"4.0.0-alpha.6"}}]),e}();t(document).on(a.CLICK_DATA_API,s.DATA_TOGGLE_CARROT,function(e){e.preventDefault();var n=e.target;t(n).hasClass(r.BUTTON)||(n=t(n).closest(s.BUTTON)),l._jQueryInterface.call(t(n),"toggle")}).on(a.FOCUS_BLUR_DATA_API,s.DATA_TOGGLE_CARROT,function(e){var n=t(e.target).closest(s.BUTTON)[0];t(n).toggleClass(r.FOCUS,/^focus(in)?$/.test(e.type))}),t.fn[e]=l._jQueryInterface,t.fn[e].Constructor=l,t.fn[e].noConflict=function(){return t.fn[e]=i,l._jQueryInterface}}(jQuery),function(t){var e="carousel",s="bs.carousel",a="."+s,l=t.fn[e],h={interval:5e3,keyboard:!0,slide:!1,pause:"hover",wrap:!0},c={interval:"(number|boolean)",keyboard:"boolean",slide:"(boolean|string)",pause:"(string|boolean)",wrap:"boolean"},u={NEXT:"next",PREV:"prev",LEFT:"left",RIGHT:"right"},d={SLIDE:"slide"+a,SLID:"slid"+a,KEYDOWN:"keydown"+a,MOUSEENTER:"mouseenter"+a,MOUSELEAVE:"mouseleave"+a,TOUCHEND:"touchend"+a,LOAD_DATA_API:"load.bs.carousel.data-api",CLICK_DATA_API:"click.bs.carousel.data-api"},f={CAROUSEL:"carousel",ACTIVE:"active",SLIDE:"slide",RIGHT:"carousel-item-right",LEFT:"carousel-item-left",NEXT:"carousel-item-next",PREV:"carousel-item-prev",ITEM:"carousel-item"},_={ACTIVE:".active",ACTIVE_ITEM:".active.carousel-item",ITEM:".carousel-item",NEXT_PREV:".carousel-item-next, .carousel-item-prev",INDICATORS:".carousel-indicators",DATA_SLIDE:"[data-slide], [data-slide-to]",DATA_RIDE:'[data-ride="carousel"]'},g=function(){function l(e,i){n(this,l),this._items=null,this._interval=null,this._activeElement=null,this._isPaused=!1,this._isSliding=!1,this.touchTimeout=null,this._config=this._getConfig(i),this._element=t(e)[0],this._indicatorsElement=t(this._element).find(_.INDICATORS)[0],this._addEventListeners()}return l.prototype.next=function(){this._isSliding||this._slide(u.NEXT)},l.prototype.nextWhenVisible=function(){document.hidden||this.next()},l.prototype.prev=function(){this._isSliding||this._slide(u.PREV)},l.prototype.pause=function(e){e||(this._isPaused=!0),t(this._element).find(_.NEXT_PREV)[0]&&r.supportsTransitionEnd()&&(r.triggerTransitionEnd(this._element),this.cycle(!0)),clearInterval(this._interval),this._interval=null},l.prototype.cycle=function(t){t||(this._isPaused=!1),this._interval&&(clearInterval(this._interval),this._interval=null),this._config.interval&&!this._isPaused&&(this._interval=setInterval((document.visibilityState?this.nextWhenVisible:this.next).bind(this),this._config.interval))},l.prototype.to=function(e){var n=this;this._activeElement=t(this._element).find(_.ACTIVE_ITEM)[0];var i=this._getItemIndex(this._activeElement);if(!(e>this._items.length-1||e<0)){if(this._isSliding)return void t(this._element).one(d.SLID,function(){return n.to(e)});if(i===e)return this.pause(),void this.cycle();var o=e>i?u.NEXT:u.PREV;this._slide(o,this._items[e])}},l.prototype.dispose=function(){t(this._element).off(a),t.removeData(this._element,s),this._items=null,this._config=null,this._element=null,this._interval=null,this._isPaused=null,this._isSliding=null,this._activeElement=null,this._indicatorsElement=null},l.prototype._getConfig=function(n){return n=t.extend({},h,n),r.typeCheckConfig(e,n,c),n},l.prototype._addEventListeners=function(){var e=this;this._config.keyboard&&t(this._element).on(d.KEYDOWN,function(t){return e._keydown(t)}),"hover"===this._config.pause&&(t(this._element).on(d.MOUSEENTER,function(t){return e.pause(t)}).on(d.MOUSELEAVE,function(t){return e.cycle(t)}),"ontouchstart"in document.documentElement&&t(this._element).on(d.TOUCHEND,function(){e.pause(),e.touchTimeout&&clearTimeout(e.touchTimeout),e.touchTimeout=setTimeout(function(t){return e.cycle(t)},500+e._config.interval)}))},l.prototype._keydown=function(t){if(!/input|textarea/i.test(t.target.tagName))switch(t.which){case 37:t.preventDefault(),this.prev();break;case 39:t.preventDefault(),this.next();break;default:return}},l.prototype._getItemIndex=function(e){return this._items=t.makeArray(t(e).parent().find(_.ITEM)),this._items.indexOf(e)},l.prototype._getItemByDirection=function(t,e){var n=t===u.NEXT,i=t===u.PREV,o=this._getItemIndex(e),r=this._items.length-1;if((i&&0===o||n&&o===r)&&!this._config.wrap)return e;var s=t===u.PREV?-1:1,a=(o+s)%this._items.length;return-1===a?this._items[this._items.length-1]:this._items[a]},l.prototype._triggerSlideEvent=function(e,n){var i=this._getItemIndex(e),o=this._getItemIndex(t(this._element).find(_.ACTIVE_ITEM)[0]),r=t.Event(d.SLIDE,{relatedTarget:e,direction:n,from:o,to:i});return t(this._element).trigger(r),r},l.prototype._setActiveIndicatorElement=function(e){if(this._indicatorsElement){t(this._indicatorsElement).find(_.ACTIVE).removeClass(f.ACTIVE);var n=this._indicatorsElement.children[this._getItemIndex(e)];n&&t(n).addClass(f.ACTIVE)}},l.prototype._slide=function(e,n){var i=this,o=t(this._element).find(_.ACTIVE_ITEM)[0],s=this._getItemIndex(o),a=n||o&&this._getItemByDirection(e,o),l=this._getItemIndex(a),h=Boolean(this._interval),c=void 0,g=void 0,p=void 0;if(e===u.NEXT?(c=f.LEFT,g=f.NEXT,p=u.LEFT):(c=f.RIGHT,g=f.PREV,p=u.RIGHT),a&&t(a).hasClass(f.ACTIVE))return void(this._isSliding=!1);if(!this._triggerSlideEvent(a,p).isDefaultPrevented()&&o&&a){this._isSliding=!0,h&&this.pause(),this._setActiveIndicatorElement(a);var m=t.Event(d.SLID,{relatedTarget:a,direction:p,from:s,to:l});r.supportsTransitionEnd()&&t(this._element).hasClass(f.SLIDE)?(t(a).addClass(g),r.reflow(a),t(o).addClass(c),t(a).addClass(c),t(o).one(r.TRANSITION_END,function(){t(a).removeClass(c+" "+g).addClass(f.ACTIVE),t(o).removeClass(f.ACTIVE+" "+g+" "+c),i._isSliding=!1,setTimeout(function(){return t(i._element).trigger(m)},0)}).emulateTransitionEnd(600)):(t(o).removeClass(f.ACTIVE),t(a).addClass(f.ACTIVE),this._isSliding=!1,t(this._element).trigger(m)),h&&this.cycle()}},l._jQueryInterface=function(e){return this.each(function(){var n=t(this).data(s),o=t.extend({},h,t(this).data());"object"===(void 0===e?"undefined":i(e))&&t.extend(o,e);var r="string"==typeof e?e:o.slide;if(n||(n=new l(this,o),t(this).data(s,n)),"number"==typeof e)n.to(e);else if("string"==typeof r){if(void 0===n[r])throw new Error('No method named "'+r+'"');n[r]()}else o.interval&&(n.pause(),n.cycle())})},l._dataApiClickHandler=function(e){var n=r.getSelectorFromElement(this);if(n){var i=t(n)[0];if(i&&t(i).hasClass(f.CAROUSEL)){var o=t.extend({},t(i).data(),t(this).data()),a=this.getAttribute("data-slide-to");a&&(o.interval=!1),l._jQueryInterface.call(t(i),o),a&&t(i).data(s).to(a),e.preventDefault()}}},o(l,null,[{key:"VERSION",get:function(){return"4.0.0-alpha.6"}},{key:"Default",get:function(){return h}}]),l}();t(document).on(d.CLICK_DATA_API,_.DATA_SLIDE,g._dataApiClickHandler),t(window).on(d.LOAD_DATA_API,function(){t(_.DATA_RIDE).each(function(){var e=t(this);g._jQueryInterface.call(e,e.data())})}),t.fn[e]=g._jQueryInterface,t.fn[e].Constructor=g,t.fn[e].noConflict=function(){return t.fn[e]=l,g._jQueryInterface}}(jQuery),function(t){var e="collapse",s="bs.collapse",a=t.fn[e],l={toggle:!0,parent:""},h={toggle:"boolean",parent:"string"},c={SHOW:"show."+s,SHOWN:"shown."+s,HIDE:"hide."+s,HIDDEN:"hidden."+s,CLICK_DATA_API:"click.bs.collapse.data-api"},u={SHOW:"show",COLLAPSE:"collapse",COLLAPSING:"collapsing",COLLAPSED:"collapsed"},d={WIDTH:"width",HEIGHT:"height"},f={ACTIVES:".card > .show, .card > .collapsing",DATA_TOGGLE:'[data-toggle="collapse"]',DATA_CHILDREN:"data-children"},_=function(){function a(e,i){if(n(this,a),this._isTransitioning=!1,this._element=e,this._config=this._getConfig(i),this._triggerArray=t.makeArray(t('[data-toggle="collapse"][href="#'+e.id+'"],[data-toggle="collapse"][data-target="#'+e.id+'"]')),this._parent=this._config.parent?this._getParent():null,this._config.parent||this._addAriaAndCollapsedClass(this._element,this._triggerArray),this._selectorActives=f.ACTIVES,this._parent){var o=this._parent.hasAttribute(f.DATA_CHILDREN)?this._parent.getAttribute(f.DATA_CHILDREN):null;null!==o&&(this._selectorActives=o+" > .show, "+o+" > .collapsing")}this._config.toggle&&this.toggle()}return a.prototype.toggle=function(){t(this._element).hasClass(u.SHOW)?this.hide():this.show()},a.prototype.show=function(){var e=this;if(!this._isTransitioning&&!t(this._element).hasClass(u.SHOW)){var n=void 0,i=void 0;if(this._parent&&(n=t.makeArray(t(this._parent).find(this._selectorActives)),n.length||(n=null)),!(n&&(i=t(n).data(s))&&i._isTransitioning)){var o=t.Event(c.SHOW);if(t(this._element).trigger(o),!o.isDefaultPrevented()){n&&(a._jQueryInterface.call(t(n),"hide"),i||t(n).data(s,null));var l=this._getDimension();t(this._element).removeClass(u.COLLAPSE).addClass(u.COLLAPSING),this._element.style[l]=0,this._triggerArray.length&&t(this._triggerArray).removeClass(u.COLLAPSED).attr("aria-expanded",!0),this.setTransitioning(!0);var h=function(){t(e._element).removeClass(u.COLLAPSING).addClass(u.COLLAPSE).addClass(u.SHOW),e._element.style[l]="",e.setTransitioning(!1),t(e._element).trigger(c.SHOWN)};if(!r.supportsTransitionEnd())return void h();var d=l[0].toUpperCase()+l.slice(1),f="scroll"+d;t(this._element).one(r.TRANSITION_END,h).emulateTransitionEnd(600),this._element.style[l]=this._element[f]+"px"}}}},a.prototype.hide=function(){var e=this;if(!this._isTransitioning&&t(this._element).hasClass(u.SHOW)){var n=t.Event(c.HIDE);if(t(this._element).trigger(n),!n.isDefaultPrevented()){var i=this._getDimension();this._element.style[i]=this._element.getBoundingClientRect()[i]+"px",r.reflow(this._element),t(this._element).addClass(u.COLLAPSING).removeClass(u.COLLAPSE).removeClass(u.SHOW),this._triggerArray.length&&t(this._triggerArray).addClass(u.COLLAPSED).attr("aria-expanded",!1),this.setTransitioning(!0);var o=function(){e.setTransitioning(!1),t(e._element).removeClass(u.COLLAPSING).addClass(u.COLLAPSE).trigger(c.HIDDEN)};if(this._element.style[i]="",!r.supportsTransitionEnd())return void o();t(this._element).one(r.TRANSITION_END,o).emulateTransitionEnd(600)}}},a.prototype.setTransitioning=function(t){this._isTransitioning=t},a.prototype.dispose=function(){t.removeData(this._element,s),this._config=null,this._parent=null,this._element=null,this._triggerArray=null,this._isTransitioning=null},a.prototype._getConfig=function(n){return n=t.extend({},l,n),n.toggle=Boolean(n.toggle),r.typeCheckConfig(e,n,h),n},a.prototype._getDimension=function(){return t(this._element).hasClass(d.WIDTH)?d.WIDTH:d.HEIGHT},a.prototype._getParent=function(){var e=this,n=t(this._config.parent)[0],i='[data-toggle="collapse"][data-parent="'+this._config.parent+'"]';return t(n).find(i).each(function(t,n){e._addAriaAndCollapsedClass(a._getTargetFromElement(n),[n])}),n},a.prototype._addAriaAndCollapsedClass=function(e,n){if(e){var i=t(e).hasClass(u.SHOW);n.length&&t(n).toggleClass(u.COLLAPSED,!i).attr("aria-expanded",i)}},a._getTargetFromElement=function(e){var n=r.getSelectorFromElement(e);return n?t(n)[0]:null},a._jQueryInterface=function(e){return this.each(function(){var n=t(this),o=n.data(s),r=t.extend({},l,n.data(),"object"===(void 0===e?"undefined":i(e))&&e);if(!o&&r.toggle&&/show|hide/.test(e)&&(r.toggle=!1),o||(o=new a(this,r),n.data(s,o)),"string"==typeof e){if(void 0===o[e])throw new Error('No method named "'+e+'"');o[e]()}})},o(a,null,[{key:"VERSION",get:function(){return"4.0.0-alpha.6"}},{key:"Default",get:function(){return l}}]),a}();t(document).on(c.CLICK_DATA_API,f.DATA_TOGGLE,function(e){/input|textarea/i.test(e.target.tagName)||e.preventDefault();var n=_._getTargetFromElement(this),i=t(n).data(s),o=i?"toggle":t(this).data();_._jQueryInterface.call(t(n),o)}),t.fn[e]=_._jQueryInterface,t.fn[e].Constructor=_,t.fn[e].noConflict=function(){return t.fn[e]=a,_._jQueryInterface}}(jQuery),function(t){var e="dropdown",i=".bs.dropdown",s=t.fn[e],a=new RegExp("38|40|27"),l={HIDE:"hide"+i,HIDDEN:"hidden"+i,SHOW:"show"+i,SHOWN:"shown"+i,CLICK:"click"+i,CLICK_DATA_API:"click.bs.dropdown.data-api",KEYDOWN_DATA_API:"keydown.bs.dropdown.data-api",KEYUP_DATA_API:"keyup.bs.dropdown.data-api"},h={DISABLED:"disabled",SHOW:"show"},c={DATA_TOGGLE:'[data-toggle="dropdown"]',FORM_CHILD:".dropdown form",MENU:".dropdown-menu",NAVBAR_NAV:".navbar-nav",VISIBLE_ITEMS:".dropdown-menu .dropdown-item:not(.disabled)"},u=function(){function e(t){n(this,e),this._element=t,this._addEventListeners()}return e.prototype.toggle=function(){if(this.disabled||t(this).hasClass(h.DISABLED))return!1;var n=e._getParentFromElement(this),i=t(n).hasClass(h.SHOW);if(e._clearMenus(),i)return!1;var o={relatedTarget:this},r=t.Event(l.SHOW,o);return t(n).trigger(r),!r.isDefaultPrevented()&&("ontouchstart"in document.documentElement&&!t(n).closest(c.NAVBAR_NAV).length&&t("body").children().on("mouseover",null,t.noop),this.focus(),this.setAttribute("aria-expanded",!0),t(n).toggleClass(h.SHOW),t(n).trigger(t.Event(l.SHOWN,o)),!1)},e.prototype.dispose=function(){t.removeData(this._element,"bs.dropdown"),t(this._element).off(i),this._element=null},e.prototype._addEventListeners=function(){t(this._element).on(l.CLICK,this.toggle)},e._jQueryInterface=function(n){return this.each(function(){var i=t(this).data("bs.dropdown");if(i||(i=new e(this),t(this).data("bs.dropdown",i)),"string"==typeof n){if(void 0===i[n])throw new Error('No method named "'+n+'"');i[n].call(this)}})},e._clearMenus=function(n){if(!n||3!==n.which&&("keyup"!==n.type||9===n.which))for(var i=t.makeArray(t(c.DATA_TOGGLE)),o=0;o<i.length;o++){var r=e._getParentFromElement(i[o]),s={relatedTarget:i[o]};if(t(r).hasClass(h.SHOW)&&!(n&&("click"===n.type&&/input|textarea/i.test(n.target.tagName)||"keyup"===n.type&&9===n.which)&&t.contains(r,n.target))){var a=t.Event(l.HIDE,s);t(r).trigger(a),a.isDefaultPrevented()||("ontouchstart"in document.documentElement&&t("body").children().off("mouseover",null,t.noop),i[o].setAttribute("aria-expanded","false"),t(r).removeClass(h.SHOW).trigger(t.Event(l.HIDDEN,s)))}}},e._getParentFromElement=function(e){var n=void 0,i=r.getSelectorFromElement(e);return i&&(n=t(i)[0]),n||e.parentNode},e._dataApiKeydownHandler=function(n){if(!(!a.test(n.which)||/button/i.test(n.target.tagName)&&32===n.which||/input|textarea/i.test(n.target.tagName)||(n.preventDefault(),n.stopPropagation(),this.disabled||t(this).hasClass(h.DISABLED)))){var i=e._getParentFromElement(this),o=t(i).hasClass(h.SHOW);if(!o&&(27!==n.which||32!==n.which)||o&&(27===n.which||32===n.which)){if(27===n.which){var r=t(i).find(c.DATA_TOGGLE)[0];t(r).trigger("focus")}return void t(this).trigger("click")}var s=t(i).find(c.VISIBLE_ITEMS).get();if(s.length){var l=s.indexOf(n.target);38===n.which&&l>0&&l--,40===n.which&&l<s.length-1&&l++,l<0&&(l=0),s[l].focus()}}},o(e,null,[{key:"VERSION",get:function(){return"4.0.0-alpha.6"}}]),e}();t(document).on(l.KEYDOWN_DATA_API,c.DATA_TOGGLE,u._dataApiKeydownHandler).on(l.KEYDOWN_DATA_API,c.MENU,u._dataApiKeydownHandler).on(l.CLICK_DATA_API+" "+l.KEYUP_DATA_API,u._clearMenus).on(l.CLICK_DATA_API,c.DATA_TOGGLE,u.prototype.toggle).on(l.CLICK_DATA_API,c.FORM_CHILD,function(t){t.stopPropagation()}),t.fn[e]=u._jQueryInterface,t.fn[e].Constructor=u,t.fn[e].noConflict=function(){return t.fn[e]=s,u._jQueryInterface}}(jQuery),function(t){var e="modal",s=".bs.modal",a=t.fn[e],l={backdrop:!0,keyboard:!0,focus:!0,show:!0},h={backdrop:"(boolean|string)",keyboard:"boolean",focus:"boolean",show:"boolean"},c={HIDE:"hide.bs.modal",HIDDEN:"hidden.bs.modal",SHOW:"show.bs.modal",SHOWN:"shown.bs.modal",FOCUSIN:"focusin.bs.modal",RESIZE:"resize.bs.modal",CLICK_DISMISS:"click.dismiss.bs.modal",KEYDOWN_DISMISS:"keydown.dismiss.bs.modal",MOUSEUP_DISMISS:"mouseup.dismiss.bs.modal",MOUSEDOWN_DISMISS:"mousedown.dismiss.bs.modal",CLICK_DATA_API:"click.bs.modal.data-api"},u={SCROLLBAR_MEASURER:"modal-scrollbar-measure",BACKDROP:"modal-backdrop",OPEN:"modal-open",FADE:"fade",SHOW:"show"},d={DIALOG:".modal-dialog",DATA_TOGGLE:'[data-toggle="modal"]',DATA_DISMISS:'[data-dismiss="modal"]',FIXED_CONTENT:".fixed-top, .fixed-bottom, .is-fixed, .sticky-top",NAVBAR_TOGGLER:".navbar-toggler"},f=function(){function a(e,i){n(this,a),this._config=this._getConfig(i),this._element=e,this._dialog=t(e).find(d.DIALOG)[0],this._backdrop=null,this._isShown=!1,this._isBodyOverflowing=!1,this._ignoreBackdropClick=!1,this._originalBodyPadding=0,this._scrollbarWidth=0}return a.prototype.toggle=function(t){return this._isShown?this.hide():this.show(t)},a.prototype.show=function(e){var n=this;if(!this._isTransitioning){r.supportsTransitionEnd()&&t(this._element).hasClass(u.FADE)&&(this._isTransitioning=!0);var i=t.Event(c.SHOW,{relatedTarget:e});t(this._element).trigger(i),this._isShown||i.isDefaultPrevented()||(this._isShown=!0,this._checkScrollbar(),this._setScrollbar(),t(document.body).addClass(u.OPEN),this._setEscapeEvent(),this._setResizeEvent(),t(this._element).on(c.CLICK_DISMISS,d.DATA_DISMISS,function(t){return n.hide(t)}),t(this._dialog).on(c.MOUSEDOWN_DISMISS,function(){t(n._element).one(c.MOUSEUP_DISMISS,function(e){t(e.target).is(n._element)&&(n._ignoreBackdropClick=!0)})}),this._showBackdrop(function(){return n._showElement(e)}))}},a.prototype.hide=function(e){var n=this;if(e&&e.preventDefault(),!this._isTransitioning&&this._isShown){var i=r.supportsTransitionEnd()&&t(this._element).hasClass(u.FADE);i&&(this._isTransitioning=!0);var o=t.Event(c.HIDE);t(this._element).trigger(o),this._isShown&&!o.isDefaultPrevented()&&(this._isShown=!1,this._setEscapeEvent(),this._setResizeEvent(),t(document).off(c.FOCUSIN),t(this._element).removeClass(u.SHOW),t(this._element).off(c.CLICK_DISMISS),t(this._dialog).off(c.MOUSEDOWN_DISMISS),i?t(this._element).one(r.TRANSITION_END,function(t){return n._hideModal(t)}).emulateTransitionEnd(300):this._hideModal())}},a.prototype.dispose=function(){t.removeData(this._element,"bs.modal"),t(window,document,this._element,this._backdrop).off(s),this._config=null,this._element=null,this._dialog=null,this._backdrop=null,this._isShown=null,this._isBodyOverflowing=null,this._ignoreBackdropClick=null,this._scrollbarWidth=null},a.prototype.handleUpdate=function(){this._adjustDialog()},a.prototype._getConfig=function(n){return n=t.extend({},l,n),r.typeCheckConfig(e,n,h),n},a.prototype._showElement=function(e){var n=this,i=r.supportsTransitionEnd()&&t(this._element).hasClass(u.FADE);this._element.parentNode&&this._element.parentNode.nodeType===Node.ELEMENT_NODE||document.body.appendChild(this._element),this._element.style.display="block",this._element.removeAttribute("aria-hidden"),this._element.scrollTop=0,i&&r.reflow(this._element),t(this._element).addClass(u.SHOW),this._config.focus&&this._enforceFocus();var o=t.Event(c.SHOWN,{relatedTarget:e}),s=function(){n._config.focus&&n._element.focus(),n._isTransitioning=!1,t(n._element).trigger(o)};i?t(this._dialog).one(r.TRANSITION_END,s).emulateTransitionEnd(300):s()},a.prototype._enforceFocus=function(){var e=this;t(document).off(c.FOCUSIN).on(c.FOCUSIN,function(n){document===n.target||e._element===n.target||t(e._element).has(n.target).length||e._element.focus()})},a.prototype._setEscapeEvent=function(){var e=this;this._isShown&&this._config.keyboard?t(this._element).on(c.KEYDOWN_DISMISS,function(t){27===t.which&&(t.preventDefault(),e.hide())}):this._isShown||t(this._element).off(c.KEYDOWN_DISMISS)},a.prototype._setResizeEvent=function(){var e=this;this._isShown?t(window).on(c.RESIZE,function(t){return e.handleUpdate(t)}):t(window).off(c.RESIZE)},a.prototype._hideModal=function(){var e=this;this._element.style.display="none",this._element.setAttribute("aria-hidden",!0),this._isTransitioning=!1,this._showBackdrop(function(){t(document.body).removeClass(u.OPEN),e._resetAdjustments(),e._resetScrollbar(),t(e._element).trigger(c.HIDDEN)})},a.prototype._removeBackdrop=function(){this._backdrop&&(t(this._backdrop).remove(),this._backdrop=null)},a.prototype._showBackdrop=function(e){var n=this,i=t(this._element).hasClass(u.FADE)?u.FADE:"";if(this._isShown&&this._config.backdrop){var o=r.supportsTransitionEnd()&&i;if(this._backdrop=document.createElement("div"),this._backdrop.className=u.BACKDROP,i&&t(this._backdrop).addClass(i),t(this._backdrop).appendTo(document.body),t(this._element).on(c.CLICK_DISMISS,function(t){if(n._ignoreBackdropClick)return void(n._ignoreBackdropClick=!1);t.target===t.currentTarget&&("static"===n._config.backdrop?n._element.focus():n.hide())}),o&&r.reflow(this._backdrop),t(this._backdrop).addClass(u.SHOW),!e)return;if(!o)return void e();t(this._backdrop).one(r.TRANSITION_END,e).emulateTransitionEnd(150)}else if(!this._isShown&&this._backdrop){t(this._backdrop).removeClass(u.SHOW);var s=function(){n._removeBackdrop(),e&&e()};r.supportsTransitionEnd()&&t(this._element).hasClass(u.FADE)?t(this._backdrop).one(r.TRANSITION_END,s).emulateTransitionEnd(150):s()}else e&&e()},a.prototype._adjustDialog=function(){var t=this._element.scrollHeight>document.documentElement.clientHeight;!this._isBodyOverflowing&&t&&(this._element.style.paddingLeft=this._scrollbarWidth+"px"),this._isBodyOverflowing&&!t&&(this._element.style.paddingRight=this._scrollbarWidth+"px")},a.prototype._resetAdjustments=function(){this._element.style.paddingLeft="",this._element.style.paddingRight=""},a.prototype._checkScrollbar=function(){this._isBodyOverflowing=document.body.clientWidth<window.innerWidth,this._scrollbarWidth=this._getScrollbarWidth()},a.prototype._setScrollbar=function(){var e=this;if(this._isBodyOverflowing){t(d.FIXED_CONTENT).each(function(n,i){var o=t(i)[0].style.paddingRight,r=t(i).css("padding-right");t(i).data("padding-right",o).css("padding-right",parseFloat(r)+e._scrollbarWidth+"px")}),t(d.NAVBAR_TOGGLER).each(function(n,i){var o=t(i)[0].style.marginRight,r=t(i).css("margin-right");t(i).data("margin-right",o).css("margin-right",parseFloat(r)+e._scrollbarWidth+"px")});var n=document.body.style.paddingRight,i=t("body").css("padding-right");t("body").data("padding-right",n).css("padding-right",parseFloat(i)+this._scrollbarWidth+"px")}},a.prototype._resetScrollbar=function(){t(d.FIXED_CONTENT).each(function(e,n){var i=t(n).data("padding-right");void 0!==i&&t(n).css("padding-right",i).removeData("padding-right")}),t(d.NAVBAR_TOGGLER).each(function(e,n){var i=t(n).data("margin-right");void 0!==i&&t(n).css("margin-right",i).removeData("margin-right")});var e=t("body").data("padding-right");void 0!==e&&t("body").css("padding-right",e).removeData("padding-right")},a.prototype._getScrollbarWidth=function(){var t=document.createElement("div");t.className=u.SCROLLBAR_MEASURER,document.body.appendChild(t);var e=t.getBoundingClientRect().width-t.clientWidth;return document.body.removeChild(t),e},a._jQueryInterface=function(e,n){return this.each(function(){var o=t(this).data("bs.modal"),r=t.extend({},a.Default,t(this).data(),"object"===(void 0===e?"undefined":i(e))&&e);if(o||(o=new a(this,r),t(this).data("bs.modal",o)),"string"==typeof e){if(void 0===o[e])throw new Error('No method named "'+e+'"');o[e](n)}else r.show&&o.show(n)})},o(a,null,[{key:"VERSION",get:function(){return"4.0.0-alpha.6"}},{key:"Default",get:function(){return l}}]),a}();t(document).on(c.CLICK_DATA_API,d.DATA_TOGGLE,function(e){var n=this,i=void 0,o=r.getSelectorFromElement(this);o&&(i=t(o)[0]);var s=t(i).data("bs.modal")?"toggle":t.extend({},t(i).data(),t(this).data());"A"!==this.tagName&&"AREA"!==this.tagName||e.preventDefault();var a=t(i).one(c.SHOW,function(e){e.isDefaultPrevented()||a.one(c.HIDDEN,function(){t(n).is(":visible")&&n.focus()})});f._jQueryInterface.call(t(i),s,this)}),t.fn[e]=f._jQueryInterface,t.fn[e].Constructor=f,t.fn[e].noConflict=function(){return t.fn[e]=a,f._jQueryInterface}}(jQuery),function(t){var e="scrollspy",s=t.fn[e],a={offset:10,method:"auto",target:""},l={offset:"number",method:"string",target:"(string|element)"},h={ACTIVATE:"activate.bs.scrollspy",SCROLL:"scroll.bs.scrollspy",LOAD_DATA_API:"load.bs.scrollspy.data-api"},c={DROPDOWN_ITEM:"dropdown-item",DROPDOWN_MENU:"dropdown-menu",ACTIVE:"active"},u={DATA_SPY:'[data-spy="scroll"]',ACTIVE:".active",NAV_LIST_GROUP:".nav, .list-group",NAV_LINKS:".nav-link",LIST_ITEMS:".list-group-item",DROPDOWN:".dropdown",DROPDOWN_ITEMS:".dropdown-item",DROPDOWN_TOGGLE:".dropdown-toggle"},d={OFFSET:"offset",POSITION:"position"},f=function(){function s(e,i){var o=this;n(this,s),this._element=e,this._scrollElement="BODY"===e.tagName?window:e,this._config=this._getConfig(i),this._selector=this._config.target+" "+u.NAV_LINKS+","+this._config.target+" "+u.LIST_ITEMS+","+this._config.target+" "+u.DROPDOWN_ITEMS,this._offsets=[],this._targets=[],this._activeTarget=null,this._scrollHeight=0,t(this._scrollElement).on(h.SCROLL,function(t){return o._process(t)}),this.refresh(),this._process()}return s.prototype.refresh=function(){var e=this,n=this._scrollElement!==this._scrollElement.window?d.POSITION:d.OFFSET,i="auto"===this._config.method?n:this._config.method,o=i===d.POSITION?this._getScrollTop():0;this._offsets=[],this._targets=[],this._scrollHeight=this._getScrollHeight(),t.makeArray(t(this._selector)).map(function(e){var n=void 0,s=r.getSelectorFromElement(e);if(s&&(n=t(s)[0]),n){var a=n.getBoundingClientRect();if(a.width||a.height)return[t(n)[i]().top+o,s]}return null}).filter(function(t){return t}).sort(function(t,e){return t[0]-e[0]}).forEach(function(t){e._offsets.push(t[0]),e._targets.push(t[1])})},s.prototype.dispose=function(){t.removeData(this._element,"bs.scrollspy"),t(this._scrollElement).off(".bs.scrollspy"),this._element=null,this._scrollElement=null,this._config=null,this._selector=null,this._offsets=null,this._targets=null,this._activeTarget=null,this._scrollHeight=null},s.prototype._getConfig=function(n){if(n=t.extend({},a,n),"string"!=typeof n.target){var i=t(n.target).attr("id");i||(i=r.getUID(e),t(n.target).attr("id",i)),n.target="#"+i}return r.typeCheckConfig(e,n,l),n},s.prototype._getScrollTop=function(){return this._scrollElement===window?this._scrollElement.pageYOffset:this._scrollElement.scrollTop},s.prototype._getScrollHeight=function(){return this._scrollElement.scrollHeight||Math.max(document.body.scrollHeight,document.documentElement.scrollHeight)},s.prototype._getOffsetHeight=function(){return this._scrollElement===window?window.innerHeight:this._scrollElement.getBoundingClientRect().height},s.prototype._process=function(){var t=this._getScrollTop()+this._config.offset,e=this._getScrollHeight(),n=this._config.offset+e-this._getOffsetHeight()
-;if(this._scrollHeight!==e&&this.refresh(),t>=n){var i=this._targets[this._targets.length-1];return void(this._activeTarget!==i&&this._activate(i))}if(this._activeTarget&&t<this._offsets[0]&&this._offsets[0]>0)return this._activeTarget=null,void this._clear();for(var o=this._offsets.length;o--;){this._activeTarget!==this._targets[o]&&t>=this._offsets[o]&&(void 0===this._offsets[o+1]||t<this._offsets[o+1])&&this._activate(this._targets[o])}},s.prototype._activate=function(e){this._activeTarget=e,this._clear();var n=this._selector.split(",");n=n.map(function(t){return t+'[data-target="'+e+'"],'+t+'[href="'+e+'"]'});var i=t(n.join(","));i.hasClass(c.DROPDOWN_ITEM)?(i.closest(u.DROPDOWN).find(u.DROPDOWN_TOGGLE).addClass(c.ACTIVE),i.addClass(c.ACTIVE)):(i.addClass(c.ACTIVE),i.parents(u.NAV_LIST_GROUP).prev(u.NAV_LINKS+", "+u.LIST_ITEMS).addClass(c.ACTIVE)),t(this._scrollElement).trigger(h.ACTIVATE,{relatedTarget:e})},s.prototype._clear=function(){t(this._selector).filter(u.ACTIVE).removeClass(c.ACTIVE)},s._jQueryInterface=function(e){return this.each(function(){var n=t(this).data("bs.scrollspy"),o="object"===(void 0===e?"undefined":i(e))&&e;if(n||(n=new s(this,o),t(this).data("bs.scrollspy",n)),"string"==typeof e){if(void 0===n[e])throw new Error('No method named "'+e+'"');n[e]()}})},o(s,null,[{key:"VERSION",get:function(){return"4.0.0-alpha.6"}},{key:"Default",get:function(){return a}}]),s}();t(window).on(h.LOAD_DATA_API,function(){for(var e=t.makeArray(t(u.DATA_SPY)),n=e.length;n--;){var i=t(e[n]);f._jQueryInterface.call(i,i.data())}}),t.fn[e]=f._jQueryInterface,t.fn[e].Constructor=f,t.fn[e].noConflict=function(){return t.fn[e]=s,f._jQueryInterface}}(jQuery),function(t){var e=t.fn.tab,i={HIDE:"hide.bs.tab",HIDDEN:"hidden.bs.tab",SHOW:"show.bs.tab",SHOWN:"shown.bs.tab",CLICK_DATA_API:"click.bs.tab.data-api"},s={DROPDOWN_MENU:"dropdown-menu",ACTIVE:"active",DISABLED:"disabled",FADE:"fade",SHOW:"show"},a={DROPDOWN:".dropdown",NAV_LIST_GROUP:".nav, .list-group",ACTIVE:".active",DATA_TOGGLE:'[data-toggle="tab"], [data-toggle="pill"], [data-toggle="list"]',DROPDOWN_TOGGLE:".dropdown-toggle",DROPDOWN_ACTIVE_CHILD:"> .dropdown-menu .active"},l=function(){function e(t){n(this,e),this._element=t}return e.prototype.show=function(){var e=this;if(!(this._element.parentNode&&this._element.parentNode.nodeType===Node.ELEMENT_NODE&&t(this._element).hasClass(s.ACTIVE)||t(this._element).hasClass(s.DISABLED))){var n=void 0,o=void 0,l=t(this._element).closest(a.NAV_LIST_GROUP)[0],h=r.getSelectorFromElement(this._element);l&&(o=t.makeArray(t(l).find(a.ACTIVE)),o=o[o.length-1]);var c=t.Event(i.HIDE,{relatedTarget:this._element}),u=t.Event(i.SHOW,{relatedTarget:o});if(o&&t(o).trigger(c),t(this._element).trigger(u),!u.isDefaultPrevented()&&!c.isDefaultPrevented()){h&&(n=t(h)[0]),this._activate(this._element,l);var d=function(){var n=t.Event(i.HIDDEN,{relatedTarget:e._element}),r=t.Event(i.SHOWN,{relatedTarget:o});t(o).trigger(n),t(e._element).trigger(r)};n?this._activate(n,n.parentNode,d):d()}}},e.prototype.dispose=function(){t.removeClass(this._element,"bs.tab"),this._element=null},e.prototype._activate=function(e,n,i){var o=this,l=t(n).find(a.ACTIVE)[0],h=i&&r.supportsTransitionEnd()&&l&&t(l).hasClass(s.FADE),c=function(){return o._transitionComplete(e,l,h,i)};l&&h?t(l).one(r.TRANSITION_END,c).emulateTransitionEnd(150):c(),l&&t(l).removeClass(s.SHOW)},e.prototype._transitionComplete=function(e,n,i,o){if(n){t(n).removeClass(s.ACTIVE);var l=t(n.parentNode).find(a.DROPDOWN_ACTIVE_CHILD)[0];l&&t(l).removeClass(s.ACTIVE),n.setAttribute("aria-expanded",!1)}if(t(e).addClass(s.ACTIVE),e.setAttribute("aria-expanded",!0),i?(r.reflow(e),t(e).addClass(s.SHOW)):t(e).removeClass(s.FADE),e.parentNode&&t(e.parentNode).hasClass(s.DROPDOWN_MENU)){var h=t(e).closest(a.DROPDOWN)[0];h&&t(h).find(a.DROPDOWN_TOGGLE).addClass(s.ACTIVE),e.setAttribute("aria-expanded",!0)}o&&o()},e._jQueryInterface=function(n){return this.each(function(){var i=t(this),o=i.data("bs.tab");if(o||(o=new e(this),i.data("bs.tab",o)),"string"==typeof n){if(void 0===o[n])throw new Error('No method named "'+n+'"');o[n]()}})},o(e,null,[{key:"VERSION",get:function(){return"4.0.0-alpha.6"}}]),e}();t(document).on(i.CLICK_DATA_API,a.DATA_TOGGLE,function(e){e.preventDefault(),l._jQueryInterface.call(t(this),"show")}),t.fn.tab=l._jQueryInterface,t.fn.tab.Constructor=l,t.fn.tab.noConflict=function(){return t.fn.tab=e,l._jQueryInterface}}(jQuery),function(t){if("undefined"==typeof Tether)throw new Error("Bootstrap tooltips require Tether (http://tether.io/)");var e="tooltip",s=".bs.tooltip",a=t.fn[e],l=new RegExp("(^|\\s)bs-tether\\S+","g"),h={animation:!0,template:'<div class="tooltip" role="tooltip"><div class="tooltip-inner"></div></div>',trigger:"hover focus",title:"",delay:0,html:!1,selector:!1,placement:"top",offset:"0 0",constraints:[],container:!1},c={animation:"boolean",template:"string",title:"(string|element|function)",trigger:"string",delay:"(number|object)",html:"boolean",selector:"(string|boolean)",placement:"(string|function)",offset:"string",constraints:"array",container:"(string|element|boolean)"},u={TOP:"bottom center",RIGHT:"middle left",BOTTOM:"top center",LEFT:"middle right"},d={SHOW:"show",OUT:"out"},f={HIDE:"hide"+s,HIDDEN:"hidden"+s,SHOW:"show"+s,SHOWN:"shown"+s,INSERTED:"inserted"+s,CLICK:"click"+s,FOCUSIN:"focusin"+s,FOCUSOUT:"focusout"+s,MOUSEENTER:"mouseenter"+s,MOUSELEAVE:"mouseleave"+s},_={FADE:"fade",SHOW:"show"},g={TOOLTIP:".tooltip",TOOLTIP_INNER:".tooltip-inner"},p={element:!1,enabled:!1},m={HOVER:"hover",FOCUS:"focus",CLICK:"click",MANUAL:"manual"},E=function(){function a(t,e){n(this,a),this._isEnabled=!0,this._timeout=0,this._hoverState="",this._activeTrigger={},this._tether=null,this.element=t,this.config=this._getConfig(e),this.tip=null,this._setListeners()}return a.prototype.enable=function(){this._isEnabled=!0},a.prototype.disable=function(){this._isEnabled=!1},a.prototype.toggleEnabled=function(){this._isEnabled=!this._isEnabled},a.prototype.toggle=function(e){if(e){var n=this.constructor.DATA_KEY,i=t(e.currentTarget).data(n);i||(i=new this.constructor(e.currentTarget,this._getDelegateConfig()),t(e.currentTarget).data(n,i)),i._activeTrigger.click=!i._activeTrigger.click,i._isWithActiveTrigger()?i._enter(null,i):i._leave(null,i)}else{if(t(this.getTipElement()).hasClass(_.SHOW))return void this._leave(null,this);this._enter(null,this)}},a.prototype.dispose=function(){clearTimeout(this._timeout),this.cleanupTether(),t.removeData(this.element,this.constructor.DATA_KEY),t(this.element).off(this.constructor.EVENT_KEY),t(this.element).closest(".modal").off("hide.bs.modal"),this.tip&&t(this.tip).remove(),this._isEnabled=null,this._timeout=null,this._hoverState=null,this._activeTrigger=null,this._tether=null,this.element=null,this.config=null,this.tip=null},a.prototype.show=function(){var e=this;if("none"===t(this.element).css("display"))throw new Error("Please use show on visible elements");var n=t.Event(this.constructor.Event.SHOW);if(this.isWithContent()&&this._isEnabled){t(this.element).trigger(n);var i=t.contains(this.element.ownerDocument.documentElement,this.element);if(n.isDefaultPrevented()||!i)return;var o=this.getTipElement(),s=r.getUID(this.constructor.NAME);o.setAttribute("id",s),this.element.setAttribute("aria-describedby",s),this.setContent(),this.config.animation&&t(o).addClass(_.FADE);var l="function"==typeof this.config.placement?this.config.placement.call(this,o,this.element):this.config.placement,h=this._getAttachment(l),c=!1===this.config.container?document.body:t(this.config.container);t(o).data(this.constructor.DATA_KEY,this),t.contains(this.element.ownerDocument.documentElement,this.tip)||t(o).appendTo(c),t(this.element).trigger(this.constructor.Event.INSERTED),this._tether=new Tether({attachment:h,element:o,target:this.element,classes:p,classPrefix:"bs-tether",offset:this.config.offset,constraints:this.config.constraints,addTargetClasses:!1}),r.reflow(o),this._tether.position(),t(o).addClass(_.SHOW),"ontouchstart"in document.documentElement&&t("body").children().on("mouseover",null,t.noop);var u=function(){var n=e._hoverState;e._hoverState=null,t(e.element).trigger(e.constructor.Event.SHOWN),n===d.OUT&&e._leave(null,e)};if(r.supportsTransitionEnd()&&t(this.tip).hasClass(_.FADE))return void t(this.tip).one(r.TRANSITION_END,u).emulateTransitionEnd(a._TRANSITION_DURATION);u()}},a.prototype.hide=function(e){var n=this,i=this.getTipElement(),o=t.Event(this.constructor.Event.HIDE),s=function(){n._hoverState!==d.SHOW&&i.parentNode&&i.parentNode.removeChild(i),n._cleanTipClass(),n.element.removeAttribute("aria-describedby"),t(n.element).trigger(n.constructor.Event.HIDDEN),n.cleanupTether(),e&&e()};t(this.element).trigger(o),o.isDefaultPrevented()||(t(i).removeClass(_.SHOW),"ontouchstart"in document.documentElement&&t("body").children().off("mouseover",null,t.noop),this._activeTrigger[m.CLICK]=!1,this._activeTrigger[m.FOCUS]=!1,this._activeTrigger[m.HOVER]=!1,r.supportsTransitionEnd()&&t(this.tip).hasClass(_.FADE)?t(i).one(r.TRANSITION_END,s).emulateTransitionEnd(150):s(),this._hoverState="")},a.prototype.isWithContent=function(){return Boolean(this.getTitle())},a.prototype.getTipElement=function(){return this.tip=this.tip||t(this.config.template)[0]},a.prototype.setContent=function(){var e=t(this.getTipElement());this.setElementContent(e.find(g.TOOLTIP_INNER),this.getTitle()),e.removeClass(_.FADE+" "+_.SHOW),this.cleanupTether()},a.prototype.setElementContent=function(e,n){var o=this.config.html;"object"===(void 0===n?"undefined":i(n))&&(n.nodeType||n.jquery)?o?t(n).parent().is(e)||e.empty().append(n):e.text(t(n).text()):e[o?"html":"text"](n)},a.prototype.getTitle=function(){var t=this.element.getAttribute("data-original-title");return t||(t="function"==typeof this.config.title?this.config.title.call(this.element):this.config.title),t},a.prototype.cleanupTether=function(){this._tether&&this._tether.destroy()},a.prototype._getAttachment=function(t){return u[t.toUpperCase()]},a.prototype._cleanTipClass=function(){var e=t(this.getTipElement()),n=e.attr("class").match(l);null!==n&&n.length>0&&e.removeClass(n.join(""))},a.prototype._setListeners=function(){var e=this;this.config.trigger.split(" ").forEach(function(n){if("click"===n)t(e.element).on(e.constructor.Event.CLICK,e.config.selector,function(t){return e.toggle(t)});else if(n!==m.MANUAL){var i=n===m.HOVER?e.constructor.Event.MOUSEENTER:e.constructor.Event.FOCUSIN,o=n===m.HOVER?e.constructor.Event.MOUSELEAVE:e.constructor.Event.FOCUSOUT;t(e.element).on(i,e.config.selector,function(t){return e._enter(t)}).on(o,e.config.selector,function(t){return e._leave(t)})}t(e.element).closest(".modal").on("hide.bs.modal",function(){return e.hide()})}),this.config.selector?this.config=t.extend({},this.config,{trigger:"manual",selector:""}):this._fixTitle()},a.prototype._fixTitle=function(){var t=i(this.element.getAttribute("data-original-title"));(this.element.getAttribute("title")||"string"!==t)&&(this.element.setAttribute("data-original-title",this.element.getAttribute("title")||""),this.element.setAttribute("title",""))},a.prototype._enter=function(e,n){var i=this.constructor.DATA_KEY;return n=n||t(e.currentTarget).data(i),n||(n=new this.constructor(e.currentTarget,this._getDelegateConfig()),t(e.currentTarget).data(i,n)),e&&(n._activeTrigger["focusin"===e.type?m.FOCUS:m.HOVER]=!0),t(n.getTipElement()).hasClass(_.SHOW)||n._hoverState===d.SHOW?void(n._hoverState=d.SHOW):(clearTimeout(n._timeout),n._hoverState=d.SHOW,n.config.delay&&n.config.delay.show?void(n._timeout=setTimeout(function(){n._hoverState===d.SHOW&&n.show()},n.config.delay.show)):void n.show())},a.prototype._leave=function(e,n){var i=this.constructor.DATA_KEY;if(n=n||t(e.currentTarget).data(i),n||(n=new this.constructor(e.currentTarget,this._getDelegateConfig()),t(e.currentTarget).data(i,n)),e&&(n._activeTrigger["focusout"===e.type?m.FOCUS:m.HOVER]=!1),!n._isWithActiveTrigger()){if(clearTimeout(n._timeout),n._hoverState=d.OUT,!n.config.delay||!n.config.delay.hide)return void n.hide();n._timeout=setTimeout(function(){n._hoverState===d.OUT&&n.hide()},n.config.delay.hide)}},a.prototype._isWithActiveTrigger=function(){for(var t in this._activeTrigger)if(this._activeTrigger[t])return!0;return!1},a.prototype._getConfig=function(n){return n=t.extend({},this.constructor.Default,t(this.element).data(),n),n.delay&&"number"==typeof n.delay&&(n.delay={show:n.delay,hide:n.delay}),n.title&&"number"==typeof n.title&&(n.title=n.title.toString()),n.content&&"number"==typeof n.content&&(n.content=n.content.toString()),r.typeCheckConfig(e,n,this.constructor.DefaultType),n},a.prototype._getDelegateConfig=function(){var t={};if(this.config)for(var e in this.config)this.constructor.Default[e]!==this.config[e]&&(t[e]=this.config[e]);return t},a._jQueryInterface=function(e){return this.each(function(){var n=t(this).data("bs.tooltip"),o="object"===(void 0===e?"undefined":i(e))&&e;if((n||!/dispose|hide/.test(e))&&(n||(n=new a(this,o),t(this).data("bs.tooltip",n)),"string"==typeof e)){if(void 0===n[e])throw new Error('No method named "'+e+'"');n[e]()}})},o(a,null,[{key:"VERSION",get:function(){return"4.0.0-alpha.6"}},{key:"Default",get:function(){return h}},{key:"NAME",get:function(){return e}},{key:"DATA_KEY",get:function(){return"bs.tooltip"}},{key:"Event",get:function(){return f}},{key:"EVENT_KEY",get:function(){return s}},{key:"DefaultType",get:function(){return c}}]),a}();return t.fn[e]=E._jQueryInterface,t.fn[e].Constructor=E,t.fn[e].noConflict=function(){return t.fn[e]=a,E._jQueryInterface},E}(jQuery));!function(r){var a="popover",l=".bs.popover",h=r.fn[a],c=r.extend({},s.Default,{placement:"right",trigger:"click",content:"",template:'<div class="popover" role="tooltip"><h3 class="popover-title"></h3><div class="popover-content"></div></div>'}),u=r.extend({},s.DefaultType,{content:"(string|element|function)"}),d={FADE:"fade",SHOW:"show"},f={TITLE:".popover-title",CONTENT:".popover-content"},_={HIDE:"hide"+l,HIDDEN:"hidden"+l,SHOW:"show"+l,SHOWN:"shown"+l,INSERTED:"inserted"+l,CLICK:"click"+l,FOCUSIN:"focusin"+l,FOCUSOUT:"focusout"+l,MOUSEENTER:"mouseenter"+l,MOUSELEAVE:"mouseleave"+l},g=function(s){function h(){return n(this,h),t(this,s.apply(this,arguments))}return e(h,s),h.prototype.isWithContent=function(){return this.getTitle()||this._getContent()},h.prototype.getTipElement=function(){return this.tip=this.tip||r(this.config.template)[0]},h.prototype.setContent=function(){var t=r(this.getTipElement());this.setElementContent(t.find(f.TITLE),this.getTitle()),this.setElementContent(t.find(f.CONTENT),this._getContent()),t.removeClass(d.FADE+" "+d.SHOW),this.cleanupTether()},h.prototype._getContent=function(){return this.element.getAttribute("data-content")||("function"==typeof this.config.content?this.config.content.call(this.element):this.config.content)},h._jQueryInterface=function(t){return this.each(function(){var e=r(this).data("bs.popover"),n="object"===(void 0===t?"undefined":i(t))?t:null;if((e||!/destroy|hide/.test(t))&&(e||(e=new h(this,n),r(this).data("bs.popover",e)),"string"==typeof t)){if(void 0===e[t])throw new Error('No method named "'+t+'"');e[t]()}})},o(h,null,[{key:"VERSION",get:function(){return"4.0.0-alpha.6"}},{key:"Default",get:function(){return c}},{key:"NAME",get:function(){return a}},{key:"DATA_KEY",get:function(){return"bs.popover"}},{key:"Event",get:function(){return _}},{key:"EVENT_KEY",get:function(){return l}},{key:"DefaultType",get:function(){return u}}]),h}(s);r.fn[a]=g._jQueryInterface,r.fn[a].Constructor=g,r.fn[a].noConflict=function(){return r.fn[a]=h,g._jQueryInterface}}(jQuery)}(); \ No newline at end of file
+if("undefined"==typeof jQuery)throw new Error("Bootstrap's JavaScript requires jQuery. jQuery must be included before Bootstrap's JavaScript.");!function(t){var e=jQuery.fn.jquery.split(" ")[0].split(".");if(e[0]<2&&e[1]<9||1==e[0]&&9==e[1]&&e[2]<1||e[0]>=4)throw new Error("Bootstrap's JavaScript requires at least jQuery v1.9.1 but less than v4.0.0")}(),function(){function t(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function e(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}function n(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}var i="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},o=function(){function t(t,e){for(var n=0;n<e.length;n++){var i=e[n];i.enumerable=i.enumerable||!1,i.configurable=!0,"value"in i&&(i.writable=!0),Object.defineProperty(t,i.key,i)}}return function(e,n,i){return n&&t(e.prototype,n),i&&t(e,i),e}}(),r=function(t){function e(t){return{}.toString.call(t).match(/\s([a-zA-Z]+)/)[1].toLowerCase()}function n(t){return(t[0]||t).nodeType}function i(){return{bindType:s.end,delegateType:s.end,handle:function(e){if(t(e.target).is(this))return e.handleObj.handler.apply(this,arguments)}}}function o(){if(window.QUnit)return!1;var t=document.createElement("bootstrap");for(var e in a)if(void 0!==t.style[e])return{end:a[e]};return!1}function r(e){var n=this,i=!1;return t(this).one(l.TRANSITION_END,function(){i=!0}),setTimeout(function(){i||l.triggerTransitionEnd(n)},e),this}var s=!1,a={WebkitTransition:"webkitTransitionEnd",MozTransition:"transitionend",OTransition:"oTransitionEnd otransitionend",transition:"transitionend"},l={TRANSITION_END:"bsTransitionEnd",getUID:function(t){do{t+=~~(1e6*Math.random())}while(document.getElementById(t));return t},getSelectorFromElement:function(e){var n=e.getAttribute("data-target");n&&"#"!==n||(n=e.getAttribute("href")||"");try{return t(n).length>0?n:null}catch(t){return null}},reflow:function(t){return t.offsetHeight},triggerTransitionEnd:function(e){t(e).trigger(s.end)},supportsTransitionEnd:function(){return Boolean(s)},typeCheckConfig:function(t,i,o){for(var r in o)if(o.hasOwnProperty(r)){var s=o[r],a=i[r],l=a&&n(a)?"element":e(a);if(!new RegExp(s).test(l))throw new Error(t.toUpperCase()+': Option "'+r+'" provided type "'+l+'" but expected type "'+s+'".')}}};return s=o(),t.fn.emulateTransitionEnd=r,l.supportsTransitionEnd()&&(t.event.special[l.TRANSITION_END]=i()),l}(jQuery),s=(function(t){var e="alert",i=t.fn[e],s={DISMISS:'[data-dismiss="alert"]'},a={CLOSE:"close.bs.alert",CLOSED:"closed.bs.alert",CLICK_DATA_API:"click.bs.alert.data-api"},l={ALERT:"alert",FADE:"fade",SHOW:"show"},h=function(){function e(t){n(this,e),this._element=t}return e.prototype.close=function(t){t=t||this._element;var e=this._getRootElement(t);this._triggerCloseEvent(e).isDefaultPrevented()||this._removeElement(e)},e.prototype.dispose=function(){t.removeData(this._element,"bs.alert"),this._element=null},e.prototype._getRootElement=function(e){var n=r.getSelectorFromElement(e),i=!1;return n&&(i=t(n)[0]),i||(i=t(e).closest("."+l.ALERT)[0]),i},e.prototype._triggerCloseEvent=function(e){var n=t.Event(a.CLOSE);return t(e).trigger(n),n},e.prototype._removeElement=function(e){var n=this;t(e).removeClass(l.SHOW),r.supportsTransitionEnd()&&t(e).hasClass(l.FADE)?t(e).one(r.TRANSITION_END,function(t){return n._destroyElement(e,t)}).emulateTransitionEnd(150):this._destroyElement(e)},e.prototype._destroyElement=function(e){t(e).detach().trigger(a.CLOSED).remove()},e._jQueryInterface=function(n){return this.each(function(){var i=t(this),o=i.data("bs.alert");o||(o=new e(this),i.data("bs.alert",o)),"close"===n&&o[n](this)})},e._handleDismiss=function(t){return function(e){e&&e.preventDefault(),t.close(this)}},o(e,null,[{key:"VERSION",get:function(){return"4.0.0-beta"}}]),e}();t(document).on(a.CLICK_DATA_API,s.DISMISS,h._handleDismiss(new h)),t.fn[e]=h._jQueryInterface,t.fn[e].Constructor=h,t.fn[e].noConflict=function(){return t.fn[e]=i,h._jQueryInterface}}(jQuery),function(t){var e="button",i=t.fn[e],r={ACTIVE:"active",BUTTON:"btn",FOCUS:"focus"},s={DATA_TOGGLE_CARROT:'[data-toggle^="button"]',DATA_TOGGLE:'[data-toggle="buttons"]',INPUT:"input",ACTIVE:".active",BUTTON:".btn"},a={CLICK_DATA_API:"click.bs.button.data-api",FOCUS_BLUR_DATA_API:"focus.bs.button.data-api blur.bs.button.data-api"},l=function(){function e(t){n(this,e),this._element=t}return e.prototype.toggle=function(){var e=!0,n=!0,i=t(this._element).closest(s.DATA_TOGGLE)[0];if(i){var o=t(this._element).find(s.INPUT)[0];if(o){if("radio"===o.type)if(o.checked&&t(this._element).hasClass(r.ACTIVE))e=!1;else{var a=t(i).find(s.ACTIVE)[0];a&&t(a).removeClass(r.ACTIVE)}if(e){if(o.hasAttribute("disabled")||i.hasAttribute("disabled")||o.classList.contains("disabled")||i.classList.contains("disabled"))return;o.checked=!t(this._element).hasClass(r.ACTIVE),t(o).trigger("change")}o.focus(),n=!1}}n&&this._element.setAttribute("aria-pressed",!t(this._element).hasClass(r.ACTIVE)),e&&t(this._element).toggleClass(r.ACTIVE)},e.prototype.dispose=function(){t.removeData(this._element,"bs.button"),this._element=null},e._jQueryInterface=function(n){return this.each(function(){var i=t(this).data("bs.button");i||(i=new e(this),t(this).data("bs.button",i)),"toggle"===n&&i[n]()})},o(e,null,[{key:"VERSION",get:function(){return"4.0.0-beta"}}]),e}();t(document).on(a.CLICK_DATA_API,s.DATA_TOGGLE_CARROT,function(e){e.preventDefault();var n=e.target;t(n).hasClass(r.BUTTON)||(n=t(n).closest(s.BUTTON)),l._jQueryInterface.call(t(n),"toggle")}).on(a.FOCUS_BLUR_DATA_API,s.DATA_TOGGLE_CARROT,function(e){var n=t(e.target).closest(s.BUTTON)[0];t(n).toggleClass(r.FOCUS,/^focus(in)?$/.test(e.type))}),t.fn[e]=l._jQueryInterface,t.fn[e].Constructor=l,t.fn[e].noConflict=function(){return t.fn[e]=i,l._jQueryInterface}}(jQuery),function(t){var e="carousel",s="bs.carousel",a="."+s,l=t.fn[e],h={interval:5e3,keyboard:!0,slide:!1,pause:"hover",wrap:!0},c={interval:"(number|boolean)",keyboard:"boolean",slide:"(boolean|string)",pause:"(string|boolean)",wrap:"boolean"},u={NEXT:"next",PREV:"prev",LEFT:"left",RIGHT:"right"},d={SLIDE:"slide"+a,SLID:"slid"+a,KEYDOWN:"keydown"+a,MOUSEENTER:"mouseenter"+a,MOUSELEAVE:"mouseleave"+a,TOUCHEND:"touchend"+a,LOAD_DATA_API:"load.bs.carousel.data-api",CLICK_DATA_API:"click.bs.carousel.data-api"},f={CAROUSEL:"carousel",ACTIVE:"active",SLIDE:"slide",RIGHT:"carousel-item-right",LEFT:"carousel-item-left",NEXT:"carousel-item-next",PREV:"carousel-item-prev",ITEM:"carousel-item"},p={ACTIVE:".active",ACTIVE_ITEM:".active.carousel-item",ITEM:".carousel-item",NEXT_PREV:".carousel-item-next, .carousel-item-prev",INDICATORS:".carousel-indicators",DATA_SLIDE:"[data-slide], [data-slide-to]",DATA_RIDE:'[data-ride="carousel"]'},_=function(){function l(e,i){n(this,l),this._items=null,this._interval=null,this._activeElement=null,this._isPaused=!1,this._isSliding=!1,this.touchTimeout=null,this._config=this._getConfig(i),this._element=t(e)[0],this._indicatorsElement=t(this._element).find(p.INDICATORS)[0],this._addEventListeners()}return l.prototype.next=function(){this._isSliding||this._slide(u.NEXT)},l.prototype.nextWhenVisible=function(){document.hidden||this.next()},l.prototype.prev=function(){this._isSliding||this._slide(u.PREV)},l.prototype.pause=function(e){e||(this._isPaused=!0),t(this._element).find(p.NEXT_PREV)[0]&&r.supportsTransitionEnd()&&(r.triggerTransitionEnd(this._element),this.cycle(!0)),clearInterval(this._interval),this._interval=null},l.prototype.cycle=function(t){t||(this._isPaused=!1),this._interval&&(clearInterval(this._interval),this._interval=null),this._config.interval&&!this._isPaused&&(this._interval=setInterval((document.visibilityState?this.nextWhenVisible:this.next).bind(this),this._config.interval))},l.prototype.to=function(e){var n=this;this._activeElement=t(this._element).find(p.ACTIVE_ITEM)[0];var i=this._getItemIndex(this._activeElement);if(!(e>this._items.length-1||e<0))if(this._isSliding)t(this._element).one(d.SLID,function(){return n.to(e)});else{if(i===e)return this.pause(),void this.cycle();var o=e>i?u.NEXT:u.PREV;this._slide(o,this._items[e])}},l.prototype.dispose=function(){t(this._element).off(a),t.removeData(this._element,s),this._items=null,this._config=null,this._element=null,this._interval=null,this._isPaused=null,this._isSliding=null,this._activeElement=null,this._indicatorsElement=null},l.prototype._getConfig=function(n){return n=t.extend({},h,n),r.typeCheckConfig(e,n,c),n},l.prototype._addEventListeners=function(){var e=this;this._config.keyboard&&t(this._element).on(d.KEYDOWN,function(t){return e._keydown(t)}),"hover"===this._config.pause&&(t(this._element).on(d.MOUSEENTER,function(t){return e.pause(t)}).on(d.MOUSELEAVE,function(t){return e.cycle(t)}),"ontouchstart"in document.documentElement&&t(this._element).on(d.TOUCHEND,function(){e.pause(),e.touchTimeout&&clearTimeout(e.touchTimeout),e.touchTimeout=setTimeout(function(t){return e.cycle(t)},500+e._config.interval)}))},l.prototype._keydown=function(t){if(!/input|textarea/i.test(t.target.tagName))switch(t.which){case 37:t.preventDefault(),this.prev();break;case 39:t.preventDefault(),this.next();break;default:return}},l.prototype._getItemIndex=function(e){return this._items=t.makeArray(t(e).parent().find(p.ITEM)),this._items.indexOf(e)},l.prototype._getItemByDirection=function(t,e){var n=t===u.NEXT,i=t===u.PREV,o=this._getItemIndex(e),r=this._items.length-1;if((i&&0===o||n&&o===r)&&!this._config.wrap)return e;var s=(o+(t===u.PREV?-1:1))%this._items.length;return-1===s?this._items[this._items.length-1]:this._items[s]},l.prototype._triggerSlideEvent=function(e,n){var i=this._getItemIndex(e),o=this._getItemIndex(t(this._element).find(p.ACTIVE_ITEM)[0]),r=t.Event(d.SLIDE,{relatedTarget:e,direction:n,from:o,to:i});return t(this._element).trigger(r),r},l.prototype._setActiveIndicatorElement=function(e){if(this._indicatorsElement){t(this._indicatorsElement).find(p.ACTIVE).removeClass(f.ACTIVE);var n=this._indicatorsElement.children[this._getItemIndex(e)];n&&t(n).addClass(f.ACTIVE)}},l.prototype._slide=function(e,n){var i=this,o=t(this._element).find(p.ACTIVE_ITEM)[0],s=this._getItemIndex(o),a=n||o&&this._getItemByDirection(e,o),l=this._getItemIndex(a),h=Boolean(this._interval),c=void 0,_=void 0,g=void 0;if(e===u.NEXT?(c=f.LEFT,_=f.NEXT,g=u.LEFT):(c=f.RIGHT,_=f.PREV,g=u.RIGHT),a&&t(a).hasClass(f.ACTIVE))this._isSliding=!1;else if(!this._triggerSlideEvent(a,g).isDefaultPrevented()&&o&&a){this._isSliding=!0,h&&this.pause(),this._setActiveIndicatorElement(a);var m=t.Event(d.SLID,{relatedTarget:a,direction:g,from:s,to:l});r.supportsTransitionEnd()&&t(this._element).hasClass(f.SLIDE)?(t(a).addClass(_),r.reflow(a),t(o).addClass(c),t(a).addClass(c),t(o).one(r.TRANSITION_END,function(){t(a).removeClass(c+" "+_).addClass(f.ACTIVE),t(o).removeClass(f.ACTIVE+" "+_+" "+c),i._isSliding=!1,setTimeout(function(){return t(i._element).trigger(m)},0)}).emulateTransitionEnd(600)):(t(o).removeClass(f.ACTIVE),t(a).addClass(f.ACTIVE),this._isSliding=!1,t(this._element).trigger(m)),h&&this.cycle()}},l._jQueryInterface=function(e){return this.each(function(){var n=t(this).data(s),o=t.extend({},h,t(this).data());"object"===(void 0===e?"undefined":i(e))&&t.extend(o,e);var r="string"==typeof e?e:o.slide;if(n||(n=new l(this,o),t(this).data(s,n)),"number"==typeof e)n.to(e);else if("string"==typeof r){if(void 0===n[r])throw new Error('No method named "'+r+'"');n[r]()}else o.interval&&(n.pause(),n.cycle())})},l._dataApiClickHandler=function(e){var n=r.getSelectorFromElement(this);if(n){var i=t(n)[0];if(i&&t(i).hasClass(f.CAROUSEL)){var o=t.extend({},t(i).data(),t(this).data()),a=this.getAttribute("data-slide-to");a&&(o.interval=!1),l._jQueryInterface.call(t(i),o),a&&t(i).data(s).to(a),e.preventDefault()}}},o(l,null,[{key:"VERSION",get:function(){return"4.0.0-beta"}},{key:"Default",get:function(){return h}}]),l}();t(document).on(d.CLICK_DATA_API,p.DATA_SLIDE,_._dataApiClickHandler),t(window).on(d.LOAD_DATA_API,function(){t(p.DATA_RIDE).each(function(){var e=t(this);_._jQueryInterface.call(e,e.data())})}),t.fn[e]=_._jQueryInterface,t.fn[e].Constructor=_,t.fn[e].noConflict=function(){return t.fn[e]=l,_._jQueryInterface}}(jQuery),function(t){var e="collapse",s="bs.collapse",a=t.fn[e],l={toggle:!0,parent:""},h={toggle:"boolean",parent:"string"},c={SHOW:"show.bs.collapse",SHOWN:"shown.bs.collapse",HIDE:"hide.bs.collapse",HIDDEN:"hidden.bs.collapse",CLICK_DATA_API:"click.bs.collapse.data-api"},u={SHOW:"show",COLLAPSE:"collapse",COLLAPSING:"collapsing",COLLAPSED:"collapsed"},d={WIDTH:"width",HEIGHT:"height"},f={ACTIVES:".show, .collapsing",DATA_TOGGLE:'[data-toggle="collapse"]'},p=function(){function a(e,i){n(this,a),this._isTransitioning=!1,this._element=e,this._config=this._getConfig(i),this._triggerArray=t.makeArray(t('[data-toggle="collapse"][href="#'+e.id+'"],[data-toggle="collapse"][data-target="#'+e.id+'"]'));for(var o=t(f.DATA_TOGGLE),s=0;s<o.length;s++){var l=o[s],h=r.getSelectorFromElement(l);null!==h&&t(h).filter(e).length>0&&this._triggerArray.push(l)}this._parent=this._config.parent?this._getParent():null,this._config.parent||this._addAriaAndCollapsedClass(this._element,this._triggerArray),this._config.toggle&&this.toggle()}return a.prototype.toggle=function(){t(this._element).hasClass(u.SHOW)?this.hide():this.show()},a.prototype.show=function(){var e=this;if(!this._isTransitioning&&!t(this._element).hasClass(u.SHOW)){var n=void 0,i=void 0;if(this._parent&&((n=t.makeArray(t(this._parent).children().children(f.ACTIVES))).length||(n=null)),!(n&&(i=t(n).data(s))&&i._isTransitioning)){var o=t.Event(c.SHOW);if(t(this._element).trigger(o),!o.isDefaultPrevented()){n&&(a._jQueryInterface.call(t(n),"hide"),i||t(n).data(s,null));var l=this._getDimension();t(this._element).removeClass(u.COLLAPSE).addClass(u.COLLAPSING),this._element.style[l]=0,this._triggerArray.length&&t(this._triggerArray).removeClass(u.COLLAPSED).attr("aria-expanded",!0),this.setTransitioning(!0);var h=function(){t(e._element).removeClass(u.COLLAPSING).addClass(u.COLLAPSE).addClass(u.SHOW),e._element.style[l]="",e.setTransitioning(!1),t(e._element).trigger(c.SHOWN)};if(r.supportsTransitionEnd()){var d="scroll"+(l[0].toUpperCase()+l.slice(1));t(this._element).one(r.TRANSITION_END,h).emulateTransitionEnd(600),this._element.style[l]=this._element[d]+"px"}else h()}}}},a.prototype.hide=function(){var e=this;if(!this._isTransitioning&&t(this._element).hasClass(u.SHOW)){var n=t.Event(c.HIDE);if(t(this._element).trigger(n),!n.isDefaultPrevented()){var i=this._getDimension();if(this._element.style[i]=this._element.getBoundingClientRect()[i]+"px",r.reflow(this._element),t(this._element).addClass(u.COLLAPSING).removeClass(u.COLLAPSE).removeClass(u.SHOW),this._triggerArray.length)for(var o=0;o<this._triggerArray.length;o++){var s=this._triggerArray[o],a=r.getSelectorFromElement(s);null!==a&&(t(a).hasClass(u.SHOW)||t(s).addClass(u.COLLAPSED).attr("aria-expanded",!1))}this.setTransitioning(!0);var l=function(){e.setTransitioning(!1),t(e._element).removeClass(u.COLLAPSING).addClass(u.COLLAPSE).trigger(c.HIDDEN)};this._element.style[i]="",r.supportsTransitionEnd()?t(this._element).one(r.TRANSITION_END,l).emulateTransitionEnd(600):l()}}},a.prototype.setTransitioning=function(t){this._isTransitioning=t},a.prototype.dispose=function(){t.removeData(this._element,s),this._config=null,this._parent=null,this._element=null,this._triggerArray=null,this._isTransitioning=null},a.prototype._getConfig=function(n){return n=t.extend({},l,n),n.toggle=Boolean(n.toggle),r.typeCheckConfig(e,n,h),n},a.prototype._getDimension=function(){return t(this._element).hasClass(d.WIDTH)?d.WIDTH:d.HEIGHT},a.prototype._getParent=function(){var e=this,n=t(this._config.parent)[0],i='[data-toggle="collapse"][data-parent="'+this._config.parent+'"]';return t(n).find(i).each(function(t,n){e._addAriaAndCollapsedClass(a._getTargetFromElement(n),[n])}),n},a.prototype._addAriaAndCollapsedClass=function(e,n){if(e){var i=t(e).hasClass(u.SHOW);n.length&&t(n).toggleClass(u.COLLAPSED,!i).attr("aria-expanded",i)}},a._getTargetFromElement=function(e){var n=r.getSelectorFromElement(e);return n?t(n)[0]:null},a._jQueryInterface=function(e){return this.each(function(){var n=t(this),o=n.data(s),r=t.extend({},l,n.data(),"object"===(void 0===e?"undefined":i(e))&&e);if(!o&&r.toggle&&/show|hide/.test(e)&&(r.toggle=!1),o||(o=new a(this,r),n.data(s,o)),"string"==typeof e){if(void 0===o[e])throw new Error('No method named "'+e+'"');o[e]()}})},o(a,null,[{key:"VERSION",get:function(){return"4.0.0-beta"}},{key:"Default",get:function(){return l}}]),a}();t(document).on(c.CLICK_DATA_API,f.DATA_TOGGLE,function(e){/input|textarea/i.test(e.target.tagName)||e.preventDefault();var n=t(this),i=r.getSelectorFromElement(this);t(i).each(function(){var e=t(this),i=e.data(s)?"toggle":n.data();p._jQueryInterface.call(e,i)})}),t.fn[e]=p._jQueryInterface,t.fn[e].Constructor=p,t.fn[e].noConflict=function(){return t.fn[e]=a,p._jQueryInterface}}(jQuery),function(t){if("undefined"==typeof Popper)throw new Error("Bootstrap dropdown require Popper.js (https://popper.js.org)");var e="dropdown",s="bs.dropdown",a="."+s,l=t.fn[e],h=new RegExp("38|40|27"),c={HIDE:"hide"+a,HIDDEN:"hidden"+a,SHOW:"show"+a,SHOWN:"shown"+a,CLICK:"click"+a,CLICK_DATA_API:"click.bs.dropdown.data-api",KEYDOWN_DATA_API:"keydown.bs.dropdown.data-api",KEYUP_DATA_API:"keyup.bs.dropdown.data-api"},u={DISABLED:"disabled",SHOW:"show",DROPUP:"dropup",MENURIGHT:"dropdown-menu-right",MENULEFT:"dropdown-menu-left"},d={DATA_TOGGLE:'[data-toggle="dropdown"]',FORM_CHILD:".dropdown form",MENU:".dropdown-menu",NAVBAR_NAV:".navbar-nav",VISIBLE_ITEMS:".dropdown-menu .dropdown-item:not(.disabled)"},f={TOP:"top-start",TOPEND:"top-end",BOTTOM:"bottom-start",BOTTOMEND:"bottom-end"},p={placement:f.BOTTOM,offset:0,flip:!0},_={placement:"string",offset:"(number|string)",flip:"boolean"},g=function(){function l(t,e){n(this,l),this._element=t,this._popper=null,this._config=this._getConfig(e),this._menu=this._getMenuElement(),this._inNavbar=this._detectNavbar(),this._addEventListeners()}return l.prototype.toggle=function(){if(!this._element.disabled&&!t(this._element).hasClass(u.DISABLED)){var e=l._getParentFromElement(this._element),n=t(this._menu).hasClass(u.SHOW);if(l._clearMenus(),!n){var i={relatedTarget:this._element},o=t.Event(c.SHOW,i);if(t(e).trigger(o),!o.isDefaultPrevented()){var r=this._element;t(e).hasClass(u.DROPUP)&&(t(this._menu).hasClass(u.MENULEFT)||t(this._menu).hasClass(u.MENURIGHT))&&(r=e),this._popper=new Popper(r,this._menu,this._getPopperConfig()),"ontouchstart"in document.documentElement&&!t(e).closest(d.NAVBAR_NAV).length&&t("body").children().on("mouseover",null,t.noop),this._element.focus(),this._element.setAttribute("aria-expanded",!0),t(this._menu).toggleClass(u.SHOW),t(e).toggleClass(u.SHOW).trigger(t.Event(c.SHOWN,i))}}}},l.prototype.dispose=function(){t.removeData(this._element,s),t(this._element).off(a),this._element=null,this._menu=null,null!==this._popper&&this._popper.destroy(),this._popper=null},l.prototype.update=function(){this._inNavbar=this._detectNavbar(),null!==this._popper&&this._popper.scheduleUpdate()},l.prototype._addEventListeners=function(){var e=this;t(this._element).on(c.CLICK,function(t){t.preventDefault(),t.stopPropagation(),e.toggle()})},l.prototype._getConfig=function(n){var i=t(this._element).data();return void 0!==i.placement&&(i.placement=f[i.placement.toUpperCase()]),n=t.extend({},this.constructor.Default,t(this._element).data(),n),r.typeCheckConfig(e,n,this.constructor.DefaultType),n},l.prototype._getMenuElement=function(){if(!this._menu){var e=l._getParentFromElement(this._element);this._menu=t(e).find(d.MENU)[0]}return this._menu},l.prototype._getPlacement=function(){var e=t(this._element).parent(),n=this._config.placement;return e.hasClass(u.DROPUP)||this._config.placement===f.TOP?(n=f.TOP,t(this._menu).hasClass(u.MENURIGHT)&&(n=f.TOPEND)):t(this._menu).hasClass(u.MENURIGHT)&&(n=f.BOTTOMEND),n},l.prototype._detectNavbar=function(){return t(this._element).closest(".navbar").length>0},l.prototype._getPopperConfig=function(){var t={placement:this._getPlacement(),modifiers:{offset:{offset:this._config.offset},flip:{enabled:this._config.flip}}};return this._inNavbar&&(t.modifiers.applyStyle={enabled:!this._inNavbar}),t},l._jQueryInterface=function(e){return this.each(function(){var n=t(this).data(s),o="object"===(void 0===e?"undefined":i(e))?e:null;if(n||(n=new l(this,o),t(this).data(s,n)),"string"==typeof e){if(void 0===n[e])throw new Error('No method named "'+e+'"');n[e]()}})},l._clearMenus=function(e){if(!e||3!==e.which&&("keyup"!==e.type||9===e.which))for(var n=t.makeArray(t(d.DATA_TOGGLE)),i=0;i<n.length;i++){var o=l._getParentFromElement(n[i]),r=t(n[i]).data(s),a={relatedTarget:n[i]};if(r){var h=r._menu;if(t(o).hasClass(u.SHOW)&&!(e&&("click"===e.type&&/input|textarea/i.test(e.target.tagName)||"keyup"===e.type&&9===e.which)&&t.contains(o,e.target))){var f=t.Event(c.HIDE,a);t(o).trigger(f),f.isDefaultPrevented()||("ontouchstart"in document.documentElement&&t("body").children().off("mouseover",null,t.noop),n[i].setAttribute("aria-expanded","false"),t(h).removeClass(u.SHOW),t(o).removeClass(u.SHOW).trigger(t.Event(c.HIDDEN,a)))}}}},l._getParentFromElement=function(e){var n=void 0,i=r.getSelectorFromElement(e);return i&&(n=t(i)[0]),n||e.parentNode},l._dataApiKeydownHandler=function(e){if(!(!h.test(e.which)||/button/i.test(e.target.tagName)&&32===e.which||/input|textarea/i.test(e.target.tagName)||(e.preventDefault(),e.stopPropagation(),this.disabled||t(this).hasClass(u.DISABLED)))){var n=l._getParentFromElement(this),i=t(n).hasClass(u.SHOW);if((i||27===e.which&&32===e.which)&&(!i||27!==e.which&&32!==e.which)){var o=t(n).find(d.VISIBLE_ITEMS).get();if(o.length){var r=o.indexOf(e.target);38===e.which&&r>0&&r--,40===e.which&&r<o.length-1&&r++,r<0&&(r=0),o[r].focus()}}else{if(27===e.which){var s=t(n).find(d.DATA_TOGGLE)[0];t(s).trigger("focus")}t(this).trigger("click")}}},o(l,null,[{key:"VERSION",get:function(){return"4.0.0-beta"}},{key:"Default",get:function(){return p}},{key:"DefaultType",get:function(){return _}}]),l}();t(document).on(c.KEYDOWN_DATA_API,d.DATA_TOGGLE,g._dataApiKeydownHandler).on(c.KEYDOWN_DATA_API,d.MENU,g._dataApiKeydownHandler).on(c.CLICK_DATA_API+" "+c.KEYUP_DATA_API,g._clearMenus).on(c.CLICK_DATA_API,d.DATA_TOGGLE,function(e){e.preventDefault(),e.stopPropagation(),g._jQueryInterface.call(t(this),"toggle")}).on(c.CLICK_DATA_API,d.FORM_CHILD,function(t){t.stopPropagation()}),t.fn[e]=g._jQueryInterface,t.fn[e].Constructor=g,t.fn[e].noConflict=function(){return t.fn[e]=l,g._jQueryInterface}}(jQuery),function(t){var e="modal",s=".bs.modal",a=t.fn[e],l={backdrop:!0,keyboard:!0,focus:!0,show:!0},h={backdrop:"(boolean|string)",keyboard:"boolean",focus:"boolean",show:"boolean"},c={HIDE:"hide.bs.modal",HIDDEN:"hidden.bs.modal",SHOW:"show.bs.modal",SHOWN:"shown.bs.modal",FOCUSIN:"focusin.bs.modal",RESIZE:"resize.bs.modal",CLICK_DISMISS:"click.dismiss.bs.modal",KEYDOWN_DISMISS:"keydown.dismiss.bs.modal",MOUSEUP_DISMISS:"mouseup.dismiss.bs.modal",MOUSEDOWN_DISMISS:"mousedown.dismiss.bs.modal",CLICK_DATA_API:"click.bs.modal.data-api"},u={SCROLLBAR_MEASURER:"modal-scrollbar-measure",BACKDROP:"modal-backdrop",OPEN:"modal-open",FADE:"fade",SHOW:"show"},d={DIALOG:".modal-dialog",DATA_TOGGLE:'[data-toggle="modal"]',DATA_DISMISS:'[data-dismiss="modal"]',FIXED_CONTENT:".fixed-top, .fixed-bottom, .is-fixed, .sticky-top",NAVBAR_TOGGLER:".navbar-toggler"},f=function(){function a(e,i){n(this,a),this._config=this._getConfig(i),this._element=e,this._dialog=t(e).find(d.DIALOG)[0],this._backdrop=null,this._isShown=!1,this._isBodyOverflowing=!1,this._ignoreBackdropClick=!1,this._originalBodyPadding=0,this._scrollbarWidth=0}return a.prototype.toggle=function(t){return this._isShown?this.hide():this.show(t)},a.prototype.show=function(e){var n=this;if(!this._isTransitioning){r.supportsTransitionEnd()&&t(this._element).hasClass(u.FADE)&&(this._isTransitioning=!0);var i=t.Event(c.SHOW,{relatedTarget:e});t(this._element).trigger(i),this._isShown||i.isDefaultPrevented()||(this._isShown=!0,this._checkScrollbar(),this._setScrollbar(),t(document.body).addClass(u.OPEN),this._setEscapeEvent(),this._setResizeEvent(),t(this._element).on(c.CLICK_DISMISS,d.DATA_DISMISS,function(t){return n.hide(t)}),t(this._dialog).on(c.MOUSEDOWN_DISMISS,function(){t(n._element).one(c.MOUSEUP_DISMISS,function(e){t(e.target).is(n._element)&&(n._ignoreBackdropClick=!0)})}),this._showBackdrop(function(){return n._showElement(e)}))}},a.prototype.hide=function(e){var n=this;if(e&&e.preventDefault(),!this._isTransitioning&&this._isShown){var i=r.supportsTransitionEnd()&&t(this._element).hasClass(u.FADE);i&&(this._isTransitioning=!0);var o=t.Event(c.HIDE);t(this._element).trigger(o),this._isShown&&!o.isDefaultPrevented()&&(this._isShown=!1,this._setEscapeEvent(),this._setResizeEvent(),t(document).off(c.FOCUSIN),t(this._element).removeClass(u.SHOW),t(this._element).off(c.CLICK_DISMISS),t(this._dialog).off(c.MOUSEDOWN_DISMISS),i?t(this._element).one(r.TRANSITION_END,function(t){return n._hideModal(t)}).emulateTransitionEnd(300):this._hideModal())}},a.prototype.dispose=function(){t.removeData(this._element,"bs.modal"),t(window,document,this._element,this._backdrop).off(s),this._config=null,this._element=null,this._dialog=null,this._backdrop=null,this._isShown=null,this._isBodyOverflowing=null,this._ignoreBackdropClick=null,this._scrollbarWidth=null},a.prototype.handleUpdate=function(){this._adjustDialog()},a.prototype._getConfig=function(n){return n=t.extend({},l,n),r.typeCheckConfig(e,n,h),n},a.prototype._showElement=function(e){var n=this,i=r.supportsTransitionEnd()&&t(this._element).hasClass(u.FADE);this._element.parentNode&&this._element.parentNode.nodeType===Node.ELEMENT_NODE||document.body.appendChild(this._element),this._element.style.display="block",this._element.removeAttribute("aria-hidden"),this._element.scrollTop=0,i&&r.reflow(this._element),t(this._element).addClass(u.SHOW),this._config.focus&&this._enforceFocus();var o=t.Event(c.SHOWN,{relatedTarget:e}),s=function(){n._config.focus&&n._element.focus(),n._isTransitioning=!1,t(n._element).trigger(o)};i?t(this._dialog).one(r.TRANSITION_END,s).emulateTransitionEnd(300):s()},a.prototype._enforceFocus=function(){var e=this;t(document).off(c.FOCUSIN).on(c.FOCUSIN,function(n){document===n.target||e._element===n.target||t(e._element).has(n.target).length||e._element.focus()})},a.prototype._setEscapeEvent=function(){var e=this;this._isShown&&this._config.keyboard?t(this._element).on(c.KEYDOWN_DISMISS,function(t){27===t.which&&(t.preventDefault(),e.hide())}):this._isShown||t(this._element).off(c.KEYDOWN_DISMISS)},a.prototype._setResizeEvent=function(){var e=this;this._isShown?t(window).on(c.RESIZE,function(t){return e.handleUpdate(t)}):t(window).off(c.RESIZE)},a.prototype._hideModal=function(){var e=this;this._element.style.display="none",this._element.setAttribute("aria-hidden",!0),this._isTransitioning=!1,this._showBackdrop(function(){t(document.body).removeClass(u.OPEN),e._resetAdjustments(),e._resetScrollbar(),t(e._element).trigger(c.HIDDEN)})},a.prototype._removeBackdrop=function(){this._backdrop&&(t(this._backdrop).remove(),this._backdrop=null)},a.prototype._showBackdrop=function(e){var n=this,i=t(this._element).hasClass(u.FADE)?u.FADE:"";if(this._isShown&&this._config.backdrop){var o=r.supportsTransitionEnd()&&i;if(this._backdrop=document.createElement("div"),this._backdrop.className=u.BACKDROP,i&&t(this._backdrop).addClass(i),t(this._backdrop).appendTo(document.body),t(this._element).on(c.CLICK_DISMISS,function(t){n._ignoreBackdropClick?n._ignoreBackdropClick=!1:t.target===t.currentTarget&&("static"===n._config.backdrop?n._element.focus():n.hide())}),o&&r.reflow(this._backdrop),t(this._backdrop).addClass(u.SHOW),!e)return;if(!o)return void e();t(this._backdrop).one(r.TRANSITION_END,e).emulateTransitionEnd(150)}else if(!this._isShown&&this._backdrop){t(this._backdrop).removeClass(u.SHOW);var s=function(){n._removeBackdrop(),e&&e()};r.supportsTransitionEnd()&&t(this._element).hasClass(u.FADE)?t(this._backdrop).one(r.TRANSITION_END,s).emulateTransitionEnd(150):s()}else e&&e()},a.prototype._adjustDialog=function(){var t=this._element.scrollHeight>document.documentElement.clientHeight;!this._isBodyOverflowing&&t&&(this._element.style.paddingLeft=this._scrollbarWidth+"px"),this._isBodyOverflowing&&!t&&(this._element.style.paddingRight=this._scrollbarWidth+"px")},a.prototype._resetAdjustments=function(){this._element.style.paddingLeft="",this._element.style.paddingRight=""},a.prototype._checkScrollbar=function(){this._isBodyOverflowing=document.body.clientWidth<window.innerWidth,this._scrollbarWidth=this._getScrollbarWidth()},a.prototype._setScrollbar=function(){var e=this;if(this._isBodyOverflowing){t(d.FIXED_CONTENT).each(function(n,i){var o=t(i)[0].style.paddingRight,r=t(i).css("padding-right");t(i).data("padding-right",o).css("padding-right",parseFloat(r)+e._scrollbarWidth+"px")}),t(d.NAVBAR_TOGGLER).each(function(n,i){var o=t(i)[0].style.marginRight,r=t(i).css("margin-right");t(i).data("margin-right",o).css("margin-right",parseFloat(r)+e._scrollbarWidth+"px")});var n=document.body.style.paddingRight,i=t("body").css("padding-right");t("body").data("padding-right",n).css("padding-right",parseFloat(i)+this._scrollbarWidth+"px")}},a.prototype._resetScrollbar=function(){t(d.FIXED_CONTENT).each(function(e,n){var i=t(n).data("padding-right");void 0!==i&&t(n).css("padding-right",i).removeData("padding-right")}),t(d.NAVBAR_TOGGLER).each(function(e,n){var i=t(n).data("margin-right");void 0!==i&&t(n).css("margin-right",i).removeData("margin-right")});var e=t("body").data("padding-right");void 0!==e&&t("body").css("padding-right",e).removeData("padding-right")},a.prototype._getScrollbarWidth=function(){var t=document.createElement("div");t.className=u.SCROLLBAR_MEASURER,document.body.appendChild(t);var e=t.getBoundingClientRect().width-t.clientWidth;return document.body.removeChild(t),e},a._jQueryInterface=function(e,n){return this.each(function(){var o=t(this).data("bs.modal"),r=t.extend({},a.Default,t(this).data(),"object"===(void 0===e?"undefined":i(e))&&e);if(o||(o=new a(this,r),t(this).data("bs.modal",o)),"string"==typeof e){if(void 0===o[e])throw new Error('No method named "'+e+'"');o[e](n)}else r.show&&o.show(n)})},o(a,null,[{key:"VERSION",get:function(){return"4.0.0-beta"}},{key:"Default",get:function(){return l}}]),a}();t(document).on(c.CLICK_DATA_API,d.DATA_TOGGLE,function(e){var n=this,i=void 0,o=r.getSelectorFromElement(this);o&&(i=t(o)[0]);var s=t(i).data("bs.modal")?"toggle":t.extend({},t(i).data(),t(this).data());"A"!==this.tagName&&"AREA"!==this.tagName||e.preventDefault();var a=t(i).one(c.SHOW,function(e){e.isDefaultPrevented()||a.one(c.HIDDEN,function(){t(n).is(":visible")&&n.focus()})});f._jQueryInterface.call(t(i),s,this)}),t.fn[e]=f._jQueryInterface,t.fn[e].Constructor=f,t.fn[e].noConflict=function(){return t.fn[e]=a,f._jQueryInterface}}(jQuery),function(t){var e="scrollspy",s=t.fn[e],a={offset:10,method:"auto",target:""},l={offset:"number",method:"string",target:"(string|element)"},h={ACTIVATE:"activate.bs.scrollspy",SCROLL:"scroll.bs.scrollspy",LOAD_DATA_API:"load.bs.scrollspy.data-api"},c={DROPDOWN_ITEM:"dropdown-item",DROPDOWN_MENU:"dropdown-menu",ACTIVE:"active"},u={DATA_SPY:'[data-spy="scroll"]',ACTIVE:".active",NAV_LIST_GROUP:".nav, .list-group",NAV_LINKS:".nav-link",LIST_ITEMS:".list-group-item",DROPDOWN:".dropdown",DROPDOWN_ITEMS:".dropdown-item",DROPDOWN_TOGGLE:".dropdown-toggle"},d={OFFSET:"offset",POSITION:"position"},f=function(){function s(e,i){var o=this;n(this,s),this._element=e,this._scrollElement="BODY"===e.tagName?window:e,this._config=this._getConfig(i),this._selector=this._config.target+" "+u.NAV_LINKS+","+this._config.target+" "+u.LIST_ITEMS+","+this._config.target+" "+u.DROPDOWN_ITEMS,this._offsets=[],this._targets=[],this._activeTarget=null,this._scrollHeight=0,t(this._scrollElement).on(h.SCROLL,function(t){return o._process(t)}),this.refresh(),this._process()}return s.prototype.refresh=function(){var e=this,n=this._scrollElement!==this._scrollElement.window?d.POSITION:d.OFFSET,i="auto"===this._config.method?n:this._config.method,o=i===d.POSITION?this._getScrollTop():0;this._offsets=[],this._targets=[],this._scrollHeight=this._getScrollHeight(),t.makeArray(t(this._selector)).map(function(e){var n=void 0,s=r.getSelectorFromElement(e);if(s&&(n=t(s)[0]),n){var a=n.getBoundingClientRect();if(a.width||a.height)return[t(n)[i]().top+o,s]}return null}).filter(function(t){return t}).sort(function(t,e){return t[0]-e[0]}).forEach(function(t){e._offsets.push(t[0]),e._targets.push(t[1])})},s.prototype.dispose=function(){t.removeData(this._element,"bs.scrollspy"),t(this._scrollElement).off(".bs.scrollspy"),this._element=null,this._scrollElement=null,this._config=null,this._selector=null,this._offsets=null,this._targets=null,this._activeTarget=null,this._scrollHeight=null},s.prototype._getConfig=function(n){if("string"!=typeof(n=t.extend({},a,n)).target){var i=t(n.target).attr("id");i||(i=r.getUID(e),t(n.target).attr("id",i)),n.target="#"+i}return r.typeCheckConfig(e,n,l),n},s.prototype._getScrollTop=function(){return this._scrollElement===window?this._scrollElement.pageYOffset:this._scrollElement.scrollTop},s.prototype._getScrollHeight=function(){return this._scrollElement.scrollHeight||Math.max(document.body.scrollHeight,document.documentElement.scrollHeight)},s.prototype._getOffsetHeight=function(){return this._scrollElement===window?window.innerHeight:this._scrollElement.getBoundingClientRect().height},s.prototype._process=function(){var t=this._getScrollTop()+this._config.offset,e=this._getScrollHeight(),n=this._config.offset+e-this._getOffsetHeight();if(this._scrollHeight!==e&&this.refresh(),t>=n){var i=this._targets[this._targets.length-1];this._activeTarget!==i&&this._activate(i)}else{if(this._activeTarget&&t<this._offsets[0]&&this._offsets[0]>0)return this._activeTarget=null,void this._clear();for(var o=this._offsets.length;o--;)this._activeTarget!==this._targets[o]&&t>=this._offsets[o]&&(void 0===this._offsets[o+1]||t<this._offsets[o+1])&&this._activate(this._targets[o])}},s.prototype._activate=function(e){this._activeTarget=e,this._clear();var n=this._selector.split(",");n=n.map(function(t){return t+'[data-target="'+e+'"],'+t+'[href="'+e+'"]'});var i=t(n.join(","));i.hasClass(c.DROPDOWN_ITEM)?(i.closest(u.DROPDOWN).find(u.DROPDOWN_TOGGLE).addClass(c.ACTIVE),i.addClass(c.ACTIVE)):(i.addClass(c.ACTIVE),i.parents(u.NAV_LIST_GROUP).prev(u.NAV_LINKS+", "+u.LIST_ITEMS).addClass(c.ACTIVE)),t(this._scrollElement).trigger(h.ACTIVATE,{relatedTarget:e})},s.prototype._clear=function(){t(this._selector).filter(u.ACTIVE).removeClass(c.ACTIVE)},s._jQueryInterface=function(e){return this.each(function(){var n=t(this).data("bs.scrollspy"),o="object"===(void 0===e?"undefined":i(e))&&e;if(n||(n=new s(this,o),t(this).data("bs.scrollspy",n)),"string"==typeof e){if(void 0===n[e])throw new Error('No method named "'+e+'"');n[e]()}})},o(s,null,[{key:"VERSION",get:function(){return"4.0.0-beta"}},{key:"Default",get:function(){return a}}]),s}();t(window).on(h.LOAD_DATA_API,function(){for(var e=t.makeArray(t(u.DATA_SPY)),n=e.length;n--;){var i=t(e[n]);f._jQueryInterface.call(i,i.data())}}),t.fn[e]=f._jQueryInterface,t.fn[e].Constructor=f,t.fn[e].noConflict=function(){return t.fn[e]=s,f._jQueryInterface}}(jQuery),function(t){var e=t.fn.tab,i={HIDE:"hide.bs.tab",HIDDEN:"hidden.bs.tab",SHOW:"show.bs.tab",SHOWN:"shown.bs.tab",CLICK_DATA_API:"click.bs.tab.data-api"},s={DROPDOWN_MENU:"dropdown-menu",ACTIVE:"active",DISABLED:"disabled",FADE:"fade",SHOW:"show"},a={DROPDOWN:".dropdown",NAV_LIST_GROUP:".nav, .list-group",ACTIVE:".active",DATA_TOGGLE:'[data-toggle="tab"], [data-toggle="pill"], [data-toggle="list"]',DROPDOWN_TOGGLE:".dropdown-toggle",DROPDOWN_ACTIVE_CHILD:"> .dropdown-menu .active"},l=function(){function e(t){n(this,e),this._element=t}return e.prototype.show=function(){var e=this;if(!(this._element.parentNode&&this._element.parentNode.nodeType===Node.ELEMENT_NODE&&t(this._element).hasClass(s.ACTIVE)||t(this._element).hasClass(s.DISABLED))){var n=void 0,o=void 0,l=t(this._element).closest(a.NAV_LIST_GROUP)[0],h=r.getSelectorFromElement(this._element);l&&(o=t.makeArray(t(l).find(a.ACTIVE)),o=o[o.length-1]);var c=t.Event(i.HIDE,{relatedTarget:this._element}),u=t.Event(i.SHOW,{relatedTarget:o});if(o&&t(o).trigger(c),t(this._element).trigger(u),!u.isDefaultPrevented()&&!c.isDefaultPrevented()){h&&(n=t(h)[0]),this._activate(this._element,l);var d=function(){var n=t.Event(i.HIDDEN,{relatedTarget:e._element}),r=t.Event(i.SHOWN,{relatedTarget:o});t(o).trigger(n),t(e._element).trigger(r)};n?this._activate(n,n.parentNode,d):d()}}},e.prototype.dispose=function(){t.removeData(this._element,"bs.tab"),this._element=null},e.prototype._activate=function(e,n,i){var o=this,l=t(n).find(a.ACTIVE)[0],h=i&&r.supportsTransitionEnd()&&l&&t(l).hasClass(s.FADE),c=function(){return o._transitionComplete(e,l,h,i)};l&&h?t(l).one(r.TRANSITION_END,c).emulateTransitionEnd(150):c(),l&&t(l).removeClass(s.SHOW)},e.prototype._transitionComplete=function(e,n,i,o){if(n){t(n).removeClass(s.ACTIVE);var l=t(n.parentNode).find(a.DROPDOWN_ACTIVE_CHILD)[0];l&&t(l).removeClass(s.ACTIVE),n.setAttribute("aria-expanded",!1)}if(t(e).addClass(s.ACTIVE),e.setAttribute("aria-expanded",!0),i?(r.reflow(e),t(e).addClass(s.SHOW)):t(e).removeClass(s.FADE),e.parentNode&&t(e.parentNode).hasClass(s.DROPDOWN_MENU)){var h=t(e).closest(a.DROPDOWN)[0];h&&t(h).find(a.DROPDOWN_TOGGLE).addClass(s.ACTIVE),e.setAttribute("aria-expanded",!0)}o&&o()},e._jQueryInterface=function(n){return this.each(function(){var i=t(this),o=i.data("bs.tab");if(o||(o=new e(this),i.data("bs.tab",o)),"string"==typeof n){if(void 0===o[n])throw new Error('No method named "'+n+'"');o[n]()}})},o(e,null,[{key:"VERSION",get:function(){return"4.0.0-beta"}}]),e}();t(document).on(i.CLICK_DATA_API,a.DATA_TOGGLE,function(e){e.preventDefault(),l._jQueryInterface.call(t(this),"show")}),t.fn.tab=l._jQueryInterface,t.fn.tab.Constructor=l,t.fn.tab.noConflict=function(){return t.fn.tab=e,l._jQueryInterface}}(jQuery),function(t){if("undefined"==typeof Popper)throw new Error("Bootstrap tooltips require Popper.js (https://popper.js.org)");var e="tooltip",s=".bs.tooltip",a=t.fn[e],l=new RegExp("(^|\\s)bs-tooltip\\S+","g"),h={animation:"boolean",template:"string",title:"(string|element|function)",trigger:"string",delay:"(number|object)",html:"boolean",selector:"(string|boolean)",placement:"(string|function)",offset:"(number|string)",container:"(string|element|boolean)",fallbackPlacement:"(string|array)"},c={AUTO:"auto",TOP:"top",RIGHT:"right",BOTTOM:"bottom",LEFT:"left"},u={animation:!0,template:'<div class="tooltip" role="tooltip"><div class="arrow"></div><div class="tooltip-inner"></div></div>',trigger:"hover focus",title:"",delay:0,html:!1,selector:!1,placement:"top",offset:0,container:!1,fallbackPlacement:"flip"},d={SHOW:"show",OUT:"out"},f={HIDE:"hide"+s,HIDDEN:"hidden"+s,SHOW:"show"+s,SHOWN:"shown"+s,INSERTED:"inserted"+s,CLICK:"click"+s,FOCUSIN:"focusin"+s,FOCUSOUT:"focusout"+s,MOUSEENTER:"mouseenter"+s,MOUSELEAVE:"mouseleave"+s},p={FADE:"fade",SHOW:"show"},_={TOOLTIP:".tooltip",TOOLTIP_INNER:".tooltip-inner",ARROW:".arrow"},g={HOVER:"hover",FOCUS:"focus",CLICK:"click",MANUAL:"manual"},m=function(){function a(t,e){n(this,a),this._isEnabled=!0,this._timeout=0,this._hoverState="",this._activeTrigger={},this._popper=null,this.element=t,this.config=this._getConfig(e),this.tip=null,this._setListeners()}return a.prototype.enable=function(){this._isEnabled=!0},a.prototype.disable=function(){this._isEnabled=!1},a.prototype.toggleEnabled=function(){this._isEnabled=!this._isEnabled},a.prototype.toggle=function(e){if(e){var n=this.constructor.DATA_KEY,i=t(e.currentTarget).data(n);i||(i=new this.constructor(e.currentTarget,this._getDelegateConfig()),t(e.currentTarget).data(n,i)),i._activeTrigger.click=!i._activeTrigger.click,i._isWithActiveTrigger()?i._enter(null,i):i._leave(null,i)}else{if(t(this.getTipElement()).hasClass(p.SHOW))return void this._leave(null,this);this._enter(null,this)}},a.prototype.dispose=function(){clearTimeout(this._timeout),t.removeData(this.element,this.constructor.DATA_KEY),t(this.element).off(this.constructor.EVENT_KEY),t(this.element).closest(".modal").off("hide.bs.modal"),this.tip&&t(this.tip).remove(),this._isEnabled=null,this._timeout=null,this._hoverState=null,this._activeTrigger=null,null!==this._popper&&this._popper.destroy(),this._popper=null,this.element=null,this.config=null,this.tip=null},a.prototype.show=function(){var e=this;if("none"===t(this.element).css("display"))throw new Error("Please use show on visible elements");var n=t.Event(this.constructor.Event.SHOW);if(this.isWithContent()&&this._isEnabled){t(this.element).trigger(n);var i=t.contains(this.element.ownerDocument.documentElement,this.element);if(n.isDefaultPrevented()||!i)return;var o=this.getTipElement(),s=r.getUID(this.constructor.NAME);o.setAttribute("id",s),this.element.setAttribute("aria-describedby",s),this.setContent(),this.config.animation&&t(o).addClass(p.FADE);var l="function"==typeof this.config.placement?this.config.placement.call(this,o,this.element):this.config.placement,h=this._getAttachment(l);this.addAttachmentClass(h);var c=!1===this.config.container?document.body:t(this.config.container);t(o).data(this.constructor.DATA_KEY,this),t.contains(this.element.ownerDocument.documentElement,this.tip)||t(o).appendTo(c),t(this.element).trigger(this.constructor.Event.INSERTED),this._popper=new Popper(this.element,o,{placement:h,modifiers:{offset:{offset:this.config.offset},flip:{behavior:this.config.fallbackPlacement},arrow:{element:_.ARROW}},onCreate:function(t){t.originalPlacement!==t.placement&&e._handlePopperPlacementChange(t)},onUpdate:function(t){e._handlePopperPlacementChange(t)}}),t(o).addClass(p.SHOW),"ontouchstart"in document.documentElement&&t("body").children().on("mouseover",null,t.noop);var u=function(){e.config.animation&&e._fixTransition();var n=e._hoverState;e._hoverState=null,t(e.element).trigger(e.constructor.Event.SHOWN),n===d.OUT&&e._leave(null,e)};r.supportsTransitionEnd()&&t(this.tip).hasClass(p.FADE)?t(this.tip).one(r.TRANSITION_END,u).emulateTransitionEnd(a._TRANSITION_DURATION):u()}},a.prototype.hide=function(e){var n=this,i=this.getTipElement(),o=t.Event(this.constructor.Event.HIDE),s=function(){n._hoverState!==d.SHOW&&i.parentNode&&i.parentNode.removeChild(i),n._cleanTipClass(),n.element.removeAttribute("aria-describedby"),t(n.element).trigger(n.constructor.Event.HIDDEN),null!==n._popper&&n._popper.destroy(),e&&e()};t(this.element).trigger(o),o.isDefaultPrevented()||(t(i).removeClass(p.SHOW),"ontouchstart"in document.documentElement&&t("body").children().off("mouseover",null,t.noop),this._activeTrigger[g.CLICK]=!1,this._activeTrigger[g.FOCUS]=!1,this._activeTrigger[g.HOVER]=!1,r.supportsTransitionEnd()&&t(this.tip).hasClass(p.FADE)?t(i).one(r.TRANSITION_END,s).emulateTransitionEnd(150):s(),this._hoverState="")},a.prototype.update=function(){null!==this._popper&&this._popper.scheduleUpdate()},a.prototype.isWithContent=function(){return Boolean(this.getTitle())},a.prototype.addAttachmentClass=function(e){t(this.getTipElement()).addClass("bs-tooltip-"+e)},a.prototype.getTipElement=function(){return this.tip=this.tip||t(this.config.template)[0]},a.prototype.setContent=function(){var e=t(this.getTipElement());this.setElementContent(e.find(_.TOOLTIP_INNER),this.getTitle()),e.removeClass(p.FADE+" "+p.SHOW)},a.prototype.setElementContent=function(e,n){var o=this.config.html;"object"===(void 0===n?"undefined":i(n))&&(n.nodeType||n.jquery)?o?t(n).parent().is(e)||e.empty().append(n):e.text(t(n).text()):e[o?"html":"text"](n)},a.prototype.getTitle=function(){var t=this.element.getAttribute("data-original-title");return t||(t="function"==typeof this.config.title?this.config.title.call(this.element):this.config.title),t},a.prototype._getAttachment=function(t){return c[t.toUpperCase()]},a.prototype._setListeners=function(){var e=this;this.config.trigger.split(" ").forEach(function(n){if("click"===n)t(e.element).on(e.constructor.Event.CLICK,e.config.selector,function(t){return e.toggle(t)});else if(n!==g.MANUAL){var i=n===g.HOVER?e.constructor.Event.MOUSEENTER:e.constructor.Event.FOCUSIN,o=n===g.HOVER?e.constructor.Event.MOUSELEAVE:e.constructor.Event.FOCUSOUT;t(e.element).on(i,e.config.selector,function(t){return e._enter(t)}).on(o,e.config.selector,function(t){return e._leave(t)})}t(e.element).closest(".modal").on("hide.bs.modal",function(){return e.hide()})}),this.config.selector?this.config=t.extend({},this.config,{trigger:"manual",selector:""}):this._fixTitle()},a.prototype._fixTitle=function(){var t=i(this.element.getAttribute("data-original-title"));(this.element.getAttribute("title")||"string"!==t)&&(this.element.setAttribute("data-original-title",this.element.getAttribute("title")||""),this.element.setAttribute("title",""))},a.prototype._enter=function(e,n){var i=this.constructor.DATA_KEY;(n=n||t(e.currentTarget).data(i))||(n=new this.constructor(e.currentTarget,this._getDelegateConfig()),t(e.currentTarget).data(i,n)),e&&(n._activeTrigger["focusin"===e.type?g.FOCUS:g.HOVER]=!0),t(n.getTipElement()).hasClass(p.SHOW)||n._hoverState===d.SHOW?n._hoverState=d.SHOW:(clearTimeout(n._timeout),n._hoverState=d.SHOW,n.config.delay&&n.config.delay.show?n._timeout=setTimeout(function(){n._hoverState===d.SHOW&&n.show()},n.config.delay.show):n.show())},a.prototype._leave=function(e,n){var i=this.constructor.DATA_KEY;(n=n||t(e.currentTarget).data(i))||(n=new this.constructor(e.currentTarget,this._getDelegateConfig()),t(e.currentTarget).data(i,n)),e&&(n._activeTrigger["focusout"===e.type?g.FOCUS:g.HOVER]=!1),n._isWithActiveTrigger()||(clearTimeout(n._timeout),n._hoverState=d.OUT,n.config.delay&&n.config.delay.hide?n._timeout=setTimeout(function(){n._hoverState===d.OUT&&n.hide()},n.config.delay.hide):n.hide())},a.prototype._isWithActiveTrigger=function(){for(var t in this._activeTrigger)if(this._activeTrigger[t])return!0;return!1},a.prototype._getConfig=function(n){return(n=t.extend({},this.constructor.Default,t(this.element).data(),n)).delay&&"number"==typeof n.delay&&(n.delay={show:n.delay,hide:n.delay}),n.title&&"number"==typeof n.title&&(n.title=n.title.toString()),n.content&&"number"==typeof n.content&&(n.content=n.content.toString()),r.typeCheckConfig(e,n,this.constructor.DefaultType),n},a.prototype._getDelegateConfig=function(){var t={};if(this.config)for(var e in this.config)this.constructor.Default[e]!==this.config[e]&&(t[e]=this.config[e]);return t},a.prototype._cleanTipClass=function(){var e=t(this.getTipElement()),n=e.attr("class").match(l);null!==n&&n.length>0&&e.removeClass(n.join(""))},a.prototype._handlePopperPlacementChange=function(t){this._cleanTipClass(),this.addAttachmentClass(this._getAttachment(t.placement))},a.prototype._fixTransition=function(){var e=this.getTipElement(),n=this.config.animation;null===e.getAttribute("x-placement")&&(t(e).removeClass(p.FADE),this.config.animation=!1,this.hide(),this.show(),this.config.animation=n)},a._jQueryInterface=function(e){return this.each(function(){var n=t(this).data("bs.tooltip"),o="object"===(void 0===e?"undefined":i(e))&&e;if((n||!/dispose|hide/.test(e))&&(n||(n=new a(this,o),t(this).data("bs.tooltip",n)),"string"==typeof e)){if(void 0===n[e])throw new Error('No method named "'+e+'"');n[e]()}})},o(a,null,[{key:"VERSION",get:function(){return"4.0.0-beta"}},{key:"Default",get:function(){return u}},{key:"NAME",get:function(){return e}},{key:"DATA_KEY",get:function(){return"bs.tooltip"}},{key:"Event",get:function(){return f}},{key:"EVENT_KEY",get:function(){return s}},{key:"DefaultType",get:function(){return h}}]),a}();return t.fn[e]=m._jQueryInterface,t.fn[e].Constructor=m,t.fn[e].noConflict=function(){return t.fn[e]=a,m._jQueryInterface},m}(jQuery));!function(r){var a="popover",l=".bs.popover",h=r.fn[a],c=new RegExp("(^|\\s)bs-popover\\S+","g"),u=r.extend({},s.Default,{placement:"right",trigger:"click",content:"",template:'<div class="popover" role="tooltip"><div class="arrow"></div><h3 class="popover-header"></h3><div class="popover-body"></div></div>'}),d=r.extend({},s.DefaultType,{content:"(string|element|function)"}),f={FADE:"fade",SHOW:"show"},p={TITLE:".popover-header",CONTENT:".popover-body"},_={HIDE:"hide"+l,HIDDEN:"hidden"+l,SHOW:"show"+l,SHOWN:"shown"+l,INSERTED:"inserted"+l,CLICK:"click"+l,FOCUSIN:"focusin"+l,FOCUSOUT:"focusout"+l,MOUSEENTER:"mouseenter"+l,MOUSELEAVE:"mouseleave"+l},g=function(s){function h(){return n(this,h),t(this,s.apply(this,arguments))}return e(h,s),h.prototype.isWithContent=function(){return this.getTitle()||this._getContent()},h.prototype.addAttachmentClass=function(t){r(this.getTipElement()).addClass("bs-popover-"+t)},h.prototype.getTipElement=function(){return this.tip=this.tip||r(this.config.template)[0]},h.prototype.setContent=function(){var t=r(this.getTipElement());this.setElementContent(t.find(p.TITLE),this.getTitle()),this.setElementContent(t.find(p.CONTENT),this._getContent()),t.removeClass(f.FADE+" "+f.SHOW)},h.prototype._getContent=function(){return this.element.getAttribute("data-content")||("function"==typeof this.config.content?this.config.content.call(this.element):this.config.content)},h.prototype._cleanTipClass=function(){var t=r(this.getTipElement()),e=t.attr("class").match(c);null!==e&&e.length>0&&t.removeClass(e.join(""))},h._jQueryInterface=function(t){return this.each(function(){var e=r(this).data("bs.popover"),n="object"===(void 0===t?"undefined":i(t))?t:null;if((e||!/destroy|hide/.test(t))&&(e||(e=new h(this,n),r(this).data("bs.popover",e)),"string"==typeof t)){if(void 0===e[t])throw new Error('No method named "'+t+'"');e[t]()}})},o(h,null,[{key:"VERSION",get:function(){return"4.0.0-beta"}},{key:"Default",get:function(){return u}},{key:"NAME",get:function(){return a}},{key:"DATA_KEY",get:function(){return"bs.popover"}},{key:"Event",get:function(){return _}},{key:"EVENT_KEY",get:function(){return l}},{key:"DefaultType",get:function(){return d}}]),h}(s);r.fn[a]=g._jQueryInterface,r.fn[a].Constructor=g,r.fn[a].noConflict=function(){return r.fn[a]=h,g._jQueryInterface}}(jQuery)}(); \ No newline at end of file
diff --git a/library/oauth2/.gitignore b/library/oauth2/.gitignore
deleted file mode 100644
index c43a667d4..000000000
--- a/library/oauth2/.gitignore
+++ /dev/null
@@ -1,5 +0,0 @@
-# Test Files #
-test/config/test.sqlite
-vendor
-composer.lock
-.idea
diff --git a/library/oauth2/.travis.yml b/library/oauth2/.travis.yml
deleted file mode 100644
index dd4aae4a6..000000000
--- a/library/oauth2/.travis.yml
+++ /dev/null
@@ -1,30 +0,0 @@
-language: php
-sudo: false
-cache:
- directories:
- - $HOME/.composer/cache
- - vendor
-php:
-- 5.3
-- 5.4
-- 5.5
-- 5.6
-- 7
-- hhvm
-env:
- global:
- - SKIP_MONGO_TESTS=1
- - secure: Bc5ZqvZ1YYpoPZNNuU2eCB8DS6vBYrAdfBtTenBs5NSxzb+Vjven4kWakbzaMvZjb/Ib7Uph7DGuOtJXpmxnvBXPLd707LZ89oFWN/yqQlZKCcm8iErvJCB5XL+/ONHj2iPdR242HJweMcat6bMCwbVWoNDidjtWMH0U2mYFy3M=
- - secure: R3bXlymyFiY2k2jf7+fv/J8i34wtXTkmD4mCr5Ps/U+vn9axm2VtvR2Nj+r7LbRjn61gzFE/xIVjYft/wOyBOYwysrfriydrnRVS0owh6y+7EyOyQWbRX11vVQMf8o31QCQE5BY58V5AJZW3MjoOL0FVlTgySJiJvdw6Pv18v+E=
-services:
-- mongodb
-- redis-server
-- cassandra
-before_install:
-- phpenv config-rm xdebug.ini || return 0
-install:
-- composer install --no-interaction
-before_script:
-- psql -c 'create database oauth2_server_php;' -U postgres
-after_script:
-- php test/cleanup.php
diff --git a/library/oauth2/CHANGELOG.md b/library/oauth2/CHANGELOG.md
deleted file mode 100644
index 03d925e06..000000000
--- a/library/oauth2/CHANGELOG.md
+++ /dev/null
@@ -1,152 +0,0 @@
-CHANGELOG for 1.x
-=================
-
-This changelog references the relevant changes (bug and security fixes) done
-in 1.x minor versions.
-
-To see the files changed for a given bug, go to https://github.com/bshaffer/oauth2-server-php/issues/### where ### is the bug number
-To get the diff between two versions, go to https://github.com/bshaffer/oauth2-server-php/compare/v1.0...v1.1
-To get the diff for a specific change, go to https://github.com/bshaffer/oauth2-server-php/commit/XXX where XXX is the change hash
-
-* 1.8.0 (2015-09-18)
-
- PR: https://github.com/bshaffer/oauth2-server-php/pull/643
-
- * bug #594 - adds jti
- * bug #598 - fixes lifetime configurations for JWTs
- * bug #634 - fixes travis builds, upgrade to containers
- * bug #586 - support for revoking tokens
- * bug #636 - Adds FirebaseJWT bridge
- * bug #639 - Mongo HHVM compatibility
-
-* 1.7.0 (2015-04-23)
-
- PR: https://github.com/bshaffer/oauth2-server-php/pull/572
-
- * bug #500 - PDO fetch mode changed from FETCH_BOTH to FETCH_ASSOC
- * bug #508 - Case insensitive for Bearer token header name ba716d4
- * bug #512 - validateRedirectUri is now public
- * bug #530 - Add PublicKeyInterface, UserClaimsInterface to Cassandra Storage
- * bug #505 - DynamoDB storage fixes
- * bug #556 - adds "code id_token" return type to openid connect
- * bug #563 - Include "issuer" config key for JwtAccessToken
- * bug #564 - Fixes JWT vulnerability
- * bug #571 - Added unset_refresh_token_after_use option
-
-* 1.6 (2015-01-16)
-
- PR: https://github.com/bshaffer/oauth2-server-php/pull/496
-
- * bug 437 - renames CryptoToken to JwtAccessToken / use_crypto_tokens to use_jwt_access_tokens
- * bug 447 - Adds a Couchbase storage implementation
- * bug 460 - Rename JWT claims to match spec
- * bug 470 - order does not matter for multi-valued response types
- * bug 471 - Make validateAuthorizeRequest available for POST in addition to GET
- * bug 475 - Adds JTI table definitiion
- * bug 481 - better randomness for generating access tokens
- * bug 480 - Use hash_equals() for signature verification (prevents remote timing attacks)
- * bugs 489, 491, 498 - misc other fixes
-
-* 1.5 (2014-08-27)
-
- PR: https://github.com/bshaffer/oauth2-server-php/pull/446
-
- * bug #399 - Add DynamoDB Support
- * bug #404 - renamed error name for malformed/expired tokens
- * bug #412 - Openid connect: fixes for claims with more than one scope / Add support for the prompt parameter ('consent' and 'none')
- * bug #411 - fixes xml output
- * bug #413 - fixes invalid format error
- * bug #401 - fixes code standards / whitespace
- * bug #354 - bundles PDO SQL with the library
- * [BC] bug #397 - refresh tokens should not be encrypted
- * bug #423 - makes "scope" optional for refresh token storage
-
-* 1.4 (2014-06-12)
-
- PR: https://github.com/bshaffer/oauth2-server-php/pull/392
-
- * bug #189 Storage\PDO - allows DSN string in constructor
- * bug #233 Bearer Tokens - allows token in request body for PUT requests
- * bug #346 Fixes open_basedir warning
- * bug #351 Adds OpenID Connect support
- * bug #355 Adds php 5.6 and HHVM to travis.ci testing
- * [BC] bug #358 Adds `getQuerystringIdentifier()` to the GrantType interface
- * bug #363 Encryption\JWT - Allows for subclassing JWT Headers
- * bug #349 Bearer Tokens - adds requestHasToken method for when access tokens are optional
- * bug #301 Encryption\JWT - fixes urlSafeB64Encode(): ensures newlines are replaced as expected
- * bug #323 ResourceController - client_id is no longer required to be returned when calling getAccessToken
- * bug #367 Storage\PDO - adds Postgres support
- * bug #368 Access Tokens - use mcrypt_create_iv or openssl_random_pseudo_bytes to create token string
- * bug #376 Request - allows case insensitive headers
- * bug #384 Storage\PDO - can pass in PDO options in constructor of PDO storage
- * misc fixes #361, #292, #373, #374, #379, #396
-* 1.3 (2014-02-27)
-
- PR: https://github.com/bshaffer/oauth2-server-php/pull/325
-
- * bug #311 adds cassandra storage
- * bug #298 fixes response code for user credentials grant type
- * bug #318 adds 'use_crypto_tokens' config to Server class for better DX
- * [BC] bug #320 pass client_id to getDefaultScope
- * bug #324 better feedback when running tests
- * bug #335 adds support for non-expiring refresh tokens
- * bug #333 fixes Pdo storage for getClientKey
- * bug #336 fixes Redis storage for expireAuthorizationCode
-
-* 1.2 (2014-01-03)
-
- PR: https://github.com/bshaffer/oauth2-server-php/pull/288
-
- * bug #285 changed response header from 200 to 401 when empty token received
- * bug #286 adds documentation and links to spec for not including error messages when no token is supplied
- * bug #280 ensures PHP warnings do not get thrown as a result of an invalid argument to $jwt->decode()
- * bug #279 predis wrong number of arguments
- * bug #277 Securing JS WebApp client secret w/ password grant type
-
-* 1.1 (2013-12-17)
-
- PR: https://github.com/bshaffer/oauth2-server-php/pull/276
-
- * bug #278 adds refresh token configuration to Server class
- * bug #274 Supplying a null client_id and client_secret grants API access
- * bug #244 [MongoStorage] More detailed implementation info
- * bug #268 Implement jti for JWT Bearer tokens to prevent replay attacks.
- * bug #266 Removing unused argument to getAccessTokenData
- * bug #247 Make Bearer token type consistent
- * bug #253 Fixing CryptoToken refresh token lifetime
- * bug #246 refactors public key logic to be more intuitive
- * bug #245 adds support for JSON crypto tokens
- * bug #230 Remove unused columns in oauth_clients
- * bug #215 makes Redis Scope Storage obey the same paradigm as PDO
- * bug #228 removes scope group
- * bug #227 squelches open basedir restriction error
- * bug #223 Updated docblocks for RefreshTokenInterface.php
- * bug #224 Adds protected properties
- * bug #217 Implement ScopeInterface for PDO, Redis
-
-* 1.0 (2013-08-12)
-
- * bug #203 Add redirect\_status_code config param for AuthorizeController
- * bug #205 ensures unnecessary ? is not set when ** bug
- * bug #204 Fixed call to LogicException
- * bug #202 Add explode to checkRestrictedGrant in PDO Storage
- * bug #197 adds support for 'false' default scope ** bug
- * bug #192 reference errors and adds tests
- * bug #194 makes some appropriate properties ** bug
- * bug #191 passes config to HttpBasic
- * bug #190 validates client credentials before ** bug
- * bug #171 Fix wrong redirect following authorization step
- * bug #187 client_id is now passed to getDefaultScope().
- * bug #176 Require refresh_token in getRefreshToken response
- * bug #174 make user\_id not required for refresh_token grant
- * bug #173 Duplication in JwtBearer Grant
- * bug #168 user\_id not required for authorization_code grant
- * bug #133 hardens default security for user object
- * bug #163 allows redirect\_uri on authorization_code to be NULL in docs example
- * bug #162 adds getToken on ResourceController for convenience
- * bug #161 fixes fatal error
- * bug #163 Invalid redirect_uri handling
- * bug #156 user\_id in OAuth2\_Storage_AuthorizationCodeInterface::getAuthorizationCode() response
- * bug #157 Fix for extending access and refresh tokens
- * bug #154 ResponseInterface: getParameter method is used in the library but not defined in the interface
- * bug #148 Add more detail to examples in Readme.md
diff --git a/library/oauth2/LICENSE b/library/oauth2/LICENSE
deleted file mode 100644
index d7ece8467..000000000
--- a/library/oauth2/LICENSE
+++ /dev/null
@@ -1,21 +0,0 @@
-The MIT License
-
-Copyright (c) 2014 Brent Shaffer
-
-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/oauth2/README.md b/library/oauth2/README.md
deleted file mode 100644
index 4ceda6cf9..000000000
--- a/library/oauth2/README.md
+++ /dev/null
@@ -1,8 +0,0 @@
-oauth2-server-php
-=================
-
-[![Build Status](https://travis-ci.org/bshaffer/oauth2-server-php.svg?branch=develop)](https://travis-ci.org/bshaffer/oauth2-server-php)
-
-[![Total Downloads](https://poser.pugx.org/bshaffer/oauth2-server-php/downloads.png)](https://packagist.org/packages/bshaffer/oauth2-server-php)
-
-View the [complete documentation](http://bshaffer.github.io/oauth2-server-php-docs/) \ No newline at end of file
diff --git a/library/oauth2/phpunit.xml b/library/oauth2/phpunit.xml
deleted file mode 100644
index e36403f0a..000000000
--- a/library/oauth2/phpunit.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-
-<phpunit backupGlobals="false"
- backupStaticAttributes="false"
- colors="true"
- convertErrorsToExceptions="true"
- convertNoticesToExceptions="true"
- convertWarningsToExceptions="true"
- processIsolation="false"
- stopOnFailure="false"
- syntaxCheck="false"
- bootstrap="test/bootstrap.php"
->
- <testsuites>
- <testsuite name="Oauth2 Test Suite">
- <directory>./test/OAuth2/</directory>
- </testsuite>
- </testsuites>
-
- <filter>
- <whitelist>
- <directory suffix=".php">./src/OAuth2/</directory>
- </whitelist>
- </filter>
-</phpunit>
diff --git a/library/oauth2/src/OAuth2/Autoloader.php b/library/oauth2/src/OAuth2/Autoloader.php
deleted file mode 100644
index ecfb6ba75..000000000
--- a/library/oauth2/src/OAuth2/Autoloader.php
+++ /dev/null
@@ -1,48 +0,0 @@
-<?php
-
-namespace OAuth2;
-
-/**
- * Autoloads OAuth2 classes
- *
- * @author Brent Shaffer <bshafs at gmail dot com>
- * @license MIT License
- */
-class Autoloader
-{
- private $dir;
-
- public function __construct($dir = null)
- {
- if (is_null($dir)) {
- $dir = dirname(__FILE__).'/..';
- }
- $this->dir = $dir;
- }
- /**
- * Registers OAuth2\Autoloader as an SPL autoloader.
- */
- public static function register($dir = null)
- {
- ini_set('unserialize_callback_func', 'spl_autoload_call');
- spl_autoload_register(array(new self($dir), 'autoload'));
- }
-
- /**
- * Handles autoloading of classes.
- *
- * @param string $class A class name.
- *
- * @return boolean Returns true if the class has been loaded
- */
- public function autoload($class)
- {
- if (0 !== strpos($class, 'OAuth2')) {
- return;
- }
-
- if (file_exists($file = $this->dir.'/'.str_replace('\\', '/', $class).'.php')) {
- require $file;
- }
- }
-}
diff --git a/library/oauth2/src/OAuth2/ClientAssertionType/ClientAssertionTypeInterface.php b/library/oauth2/src/OAuth2/ClientAssertionType/ClientAssertionTypeInterface.php
deleted file mode 100644
index 29c7171b5..000000000
--- a/library/oauth2/src/OAuth2/ClientAssertionType/ClientAssertionTypeInterface.php
+++ /dev/null
@@ -1,15 +0,0 @@
-<?php
-
-namespace OAuth2\ClientAssertionType;
-
-use OAuth2\RequestInterface;
-use OAuth2\ResponseInterface;
-
-/**
- * Interface for all OAuth2 Client Assertion Types
- */
-interface ClientAssertionTypeInterface
-{
- public function validateRequest(RequestInterface $request, ResponseInterface $response);
- public function getClientId();
-}
diff --git a/library/oauth2/src/OAuth2/ClientAssertionType/HttpBasic.php b/library/oauth2/src/OAuth2/ClientAssertionType/HttpBasic.php
deleted file mode 100644
index 0ecb7e18d..000000000
--- a/library/oauth2/src/OAuth2/ClientAssertionType/HttpBasic.php
+++ /dev/null
@@ -1,123 +0,0 @@
-<?php
-
-namespace OAuth2\ClientAssertionType;
-
-use OAuth2\Storage\ClientCredentialsInterface;
-use OAuth2\RequestInterface;
-use OAuth2\ResponseInterface;
-
-/**
- * Validate a client via Http Basic authentication
- *
- * @author Brent Shaffer <bshafs at gmail dot com>
- */
-class HttpBasic implements ClientAssertionTypeInterface
-{
- private $clientData;
-
- protected $storage;
- protected $config;
-
- /**
- * @param OAuth2\Storage\ClientCredentialsInterface $clientStorage REQUIRED Storage class for retrieving client credentials information
- * @param array $config OPTIONAL Configuration options for the server
- * <code>
- * $config = array(
- * 'allow_credentials_in_request_body' => true, // whether to look for credentials in the POST body in addition to the Authorize HTTP Header
- * 'allow_public_clients' => true // if true, "public clients" (clients without a secret) may be authenticated
- * );
- * </code>
- */
- public function __construct(ClientCredentialsInterface $storage, array $config = array())
- {
- $this->storage = $storage;
- $this->config = array_merge(array(
- 'allow_credentials_in_request_body' => true,
- 'allow_public_clients' => true,
- ), $config);
- }
-
- public function validateRequest(RequestInterface $request, ResponseInterface $response)
- {
- if (!$clientData = $this->getClientCredentials($request, $response)) {
- return false;
- }
-
- if (!isset($clientData['client_id'])) {
- throw new \LogicException('the clientData array must have "client_id" set');
- }
-
- if (!isset($clientData['client_secret']) || $clientData['client_secret'] == '') {
- if (!$this->config['allow_public_clients']) {
- $response->setError(400, 'invalid_client', 'client credentials are required');
-
- return false;
- }
-
- if (!$this->storage->isPublicClient($clientData['client_id'])) {
- $response->setError(400, 'invalid_client', 'This client is invalid or must authenticate using a client secret');
-
- return false;
- }
- } elseif ($this->storage->checkClientCredentials($clientData['client_id'], $clientData['client_secret']) === false) {
- $response->setError(400, 'invalid_client', 'The client credentials are invalid');
-
- return false;
- }
-
- $this->clientData = $clientData;
-
- return true;
- }
-
- public function getClientId()
- {
- return $this->clientData['client_id'];
- }
-
- /**
- * Internal function used to get the client credentials from HTTP basic
- * auth or POST data.
- *
- * According to the spec (draft 20), the client_id can be provided in
- * the Basic Authorization header (recommended) or via GET/POST.
- *
- * @return
- * A list containing the client identifier and password, for example
- * @code
- * return array(
- * "client_id" => CLIENT_ID, // REQUIRED the client id
- * "client_secret" => CLIENT_SECRET, // OPTIONAL the client secret (may be omitted for public clients)
- * );
- * @endcode
- *
- * @see http://tools.ietf.org/html/rfc6749#section-2.3.1
- *
- * @ingroup oauth2_section_2
- */
- public function getClientCredentials(RequestInterface $request, ResponseInterface $response = null)
- {
- if (!is_null($request->headers('PHP_AUTH_USER')) && !is_null($request->headers('PHP_AUTH_PW'))) {
- return array('client_id' => $request->headers('PHP_AUTH_USER'), 'client_secret' => $request->headers('PHP_AUTH_PW'));
- }
-
- if ($this->config['allow_credentials_in_request_body']) {
- // Using POST for HttpBasic authorization is not recommended, but is supported by specification
- if (!is_null($request->request('client_id'))) {
- /**
- * client_secret can be null if the client's password is an empty string
- * @see http://tools.ietf.org/html/rfc6749#section-2.3.1
- */
-
- return array('client_id' => $request->request('client_id'), 'client_secret' => $request->request('client_secret'));
- }
- }
-
- if ($response) {
- $message = $this->config['allow_credentials_in_request_body'] ? ' or body' : '';
- $response->setError(400, 'invalid_client', 'Client credentials were not found in the headers'.$message);
- }
-
- return null;
- }
-}
diff --git a/library/oauth2/src/OAuth2/Controller/AuthorizeController.php b/library/oauth2/src/OAuth2/Controller/AuthorizeController.php
deleted file mode 100644
index a9a722587..000000000
--- a/library/oauth2/src/OAuth2/Controller/AuthorizeController.php
+++ /dev/null
@@ -1,388 +0,0 @@
-<?php
-
-namespace OAuth2\Controller;
-
-use OAuth2\Storage\ClientInterface;
-use OAuth2\ScopeInterface;
-use OAuth2\RequestInterface;
-use OAuth2\ResponseInterface;
-use OAuth2\Scope;
-
-/**
- * @see OAuth2\Controller\AuthorizeControllerInterface
- */
-class AuthorizeController implements AuthorizeControllerInterface
-{
- private $scope;
- private $state;
- private $client_id;
- private $redirect_uri;
- private $response_type;
-
- protected $clientStorage;
- protected $responseTypes;
- protected $config;
- protected $scopeUtil;
-
- /**
- * @param OAuth2\Storage\ClientInterface $clientStorage REQUIRED Instance of OAuth2\Storage\ClientInterface to retrieve client information
- * @param array $responseTypes OPTIONAL Array of OAuth2\ResponseType\ResponseTypeInterface objects. Valid array
- * keys are "code" and "token"
- * @param array $config OPTIONAL Configuration options for the server
- * <code>
- * $config = array(
- * 'allow_implicit' => false, // if the controller should allow the "implicit" grant type
- * 'enforce_state' => true // if the controller should require the "state" parameter
- * 'require_exact_redirect_uri' => true, // if the controller should require an exact match on the "redirect_uri" parameter
- * 'redirect_status_code' => 302, // HTTP status code to use for redirect responses
- * );
- * </code>
- * @param OAuth2\ScopeInterface $scopeUtil OPTIONAL Instance of OAuth2\ScopeInterface to validate the requested scope
- */
- public function __construct(ClientInterface $clientStorage, array $responseTypes = array(), array $config = array(), ScopeInterface $scopeUtil = null)
- {
- $this->clientStorage = $clientStorage;
- $this->responseTypes = $responseTypes;
- $this->config = array_merge(array(
- 'allow_implicit' => false,
- 'enforce_state' => true,
- 'require_exact_redirect_uri' => true,
- 'redirect_status_code' => 302,
- ), $config);
-
- if (is_null($scopeUtil)) {
- $scopeUtil = new Scope();
- }
- $this->scopeUtil = $scopeUtil;
- }
-
- public function handleAuthorizeRequest(RequestInterface $request, ResponseInterface $response, $is_authorized, $user_id = null)
- {
- if (!is_bool($is_authorized)) {
- throw new \InvalidArgumentException('Argument "is_authorized" must be a boolean. This method must know if the user has granted access to the client.');
- }
-
- // We repeat this, because we need to re-validate. The request could be POSTed
- // by a 3rd-party (because we are not internally enforcing NONCEs, etc)
- if (!$this->validateAuthorizeRequest($request, $response)) {
- return;
- }
-
- // If no redirect_uri is passed in the request, use client's registered one
- if (empty($this->redirect_uri)) {
- $clientData = $this->clientStorage->getClientDetails($this->client_id);
- $registered_redirect_uri = $clientData['redirect_uri'];
- }
-
- // the user declined access to the client's application
- if ($is_authorized === false) {
- $redirect_uri = $this->redirect_uri ?: $registered_redirect_uri;
- $this->setNotAuthorizedResponse($request, $response, $redirect_uri, $user_id);
-
- return;
- }
-
- // build the parameters to set in the redirect URI
- if (!$params = $this->buildAuthorizeParameters($request, $response, $user_id)) {
- return;
- }
-
- $authResult = $this->responseTypes[$this->response_type]->getAuthorizeResponse($params, $user_id);
-
- list($redirect_uri, $uri_params) = $authResult;
-
- if (empty($redirect_uri) && !empty($registered_redirect_uri)) {
- $redirect_uri = $registered_redirect_uri;
- }
-
- $uri = $this->buildUri($redirect_uri, $uri_params);
-
- // return redirect response
- $response->setRedirect($this->config['redirect_status_code'], $uri);
- }
-
- protected function setNotAuthorizedResponse(RequestInterface $request, ResponseInterface $response, $redirect_uri, $user_id = null)
- {
- $error = 'access_denied';
- $error_message = 'The user denied access to your application';
- $response->setRedirect($this->config['redirect_status_code'], $redirect_uri, $this->state, $error, $error_message);
- }
-
- /*
- * We have made this protected so this class can be extended to add/modify
- * these parameters
- */
- protected function buildAuthorizeParameters($request, $response, $user_id)
- {
- // @TODO: we should be explicit with this in the future
- $params = array(
- 'scope' => $this->scope,
- 'state' => $this->state,
- 'client_id' => $this->client_id,
- 'redirect_uri' => $this->redirect_uri,
- 'response_type' => $this->response_type,
- );
-
- return $params;
- }
-
- public function validateAuthorizeRequest(RequestInterface $request, ResponseInterface $response)
- {
- // Make sure a valid client id was supplied (we can not redirect because we were unable to verify the URI)
- if (!$client_id = $request->query('client_id', $request->request('client_id'))) {
- // We don't have a good URI to use
- $response->setError(400, 'invalid_client', "No client id supplied");
-
- return false;
- }
-
- // Get client details
- if (!$clientData = $this->clientStorage->getClientDetails($client_id)) {
- $response->setError(400, 'invalid_client', 'The client id supplied is invalid');
-
- return false;
- }
-
- $registered_redirect_uri = isset($clientData['redirect_uri']) ? $clientData['redirect_uri'] : '';
-
- // Make sure a valid redirect_uri was supplied. If specified, it must match the clientData URI.
- // @see http://tools.ietf.org/html/rfc6749#section-3.1.2
- // @see http://tools.ietf.org/html/rfc6749#section-4.1.2.1
- // @see http://tools.ietf.org/html/rfc6749#section-4.2.2.1
- if ($supplied_redirect_uri = $request->query('redirect_uri', $request->request('redirect_uri'))) {
- // validate there is no fragment supplied
- $parts = parse_url($supplied_redirect_uri);
- if (isset($parts['fragment']) && $parts['fragment']) {
- $response->setError(400, 'invalid_uri', 'The redirect URI must not contain a fragment');
-
- return false;
- }
-
- // validate against the registered redirect uri(s) if available
- if ($registered_redirect_uri && !$this->validateRedirectUri($supplied_redirect_uri, $registered_redirect_uri)) {
- $response->setError(400, 'redirect_uri_mismatch', 'The redirect URI provided is missing or does not match', '#section-3.1.2');
-
- return false;
- }
- $redirect_uri = $supplied_redirect_uri;
- } else {
- // use the registered redirect_uri if none has been supplied, if possible
- if (!$registered_redirect_uri) {
- $response->setError(400, 'invalid_uri', 'No redirect URI was supplied or stored');
-
- return false;
- }
-
- if (count(explode(' ', $registered_redirect_uri)) > 1) {
- $response->setError(400, 'invalid_uri', 'A redirect URI must be supplied when multiple redirect URIs are registered', '#section-3.1.2.3');
-
- return false;
- }
- $redirect_uri = $registered_redirect_uri;
- }
-
- // Select the redirect URI
- $response_type = $request->query('response_type', $request->request('response_type'));
-
- // for multiple-valued response types - make them alphabetical
- if (false !== strpos($response_type, ' ')) {
- $types = explode(' ', $response_type);
- sort($types);
- $response_type = ltrim(implode(' ', $types));
- }
-
- $state = $request->query('state', $request->request('state'));
-
- // type and client_id are required
- if (!$response_type || !in_array($response_type, $this->getValidResponseTypes())) {
- $response->setRedirect($this->config['redirect_status_code'], $redirect_uri, $state, 'invalid_request', 'Invalid or missing response type', null);
-
- return false;
- }
-
- if ($response_type == self::RESPONSE_TYPE_AUTHORIZATION_CODE) {
- if (!isset($this->responseTypes['code'])) {
- $response->setRedirect($this->config['redirect_status_code'], $redirect_uri, $state, 'unsupported_response_type', 'authorization code grant type not supported', null);
-
- return false;
- }
- if (!$this->clientStorage->checkRestrictedGrantType($client_id, 'authorization_code')) {
- $response->setRedirect($this->config['redirect_status_code'], $redirect_uri, $state, 'unauthorized_client', 'The grant type is unauthorized for this client_id', null);
-
- return false;
- }
- if ($this->responseTypes['code']->enforceRedirect() && !$redirect_uri) {
- $response->setError(400, 'redirect_uri_mismatch', 'The redirect URI is mandatory and was not supplied');
-
- return false;
- }
- } else {
- if (!$this->config['allow_implicit']) {
- $response->setRedirect($this->config['redirect_status_code'], $redirect_uri, $state, 'unsupported_response_type', 'implicit grant type not supported', null);
-
- return false;
- }
- if (!$this->clientStorage->checkRestrictedGrantType($client_id, 'implicit')) {
- $response->setRedirect($this->config['redirect_status_code'], $redirect_uri, $state, 'unauthorized_client', 'The grant type is unauthorized for this client_id', null);
-
- return false;
- }
- }
-
- // validate requested scope if it exists
- $requestedScope = $this->scopeUtil->getScopeFromRequest($request);
-
- if ($requestedScope) {
- // restrict scope by client specific scope if applicable,
- // otherwise verify the scope exists
- $clientScope = $this->clientStorage->getClientScope($client_id);
- if ((empty($clientScope) && !$this->scopeUtil->scopeExists($requestedScope))
- || (!empty($clientScope) && !$this->scopeUtil->checkScope($requestedScope, $clientScope))) {
- $response->setRedirect($this->config['redirect_status_code'], $redirect_uri, $state, 'invalid_scope', 'An unsupported scope was requested', null);
-
- return false;
- }
- } else {
- // use a globally-defined default scope
- $defaultScope = $this->scopeUtil->getDefaultScope($client_id);
-
- if (false === $defaultScope) {
- $response->setRedirect($this->config['redirect_status_code'], $redirect_uri, $state, 'invalid_client', 'This application requires you specify a scope parameter', null);
-
- return false;
- }
-
- $requestedScope = $defaultScope;
- }
-
- // Validate state parameter exists (if configured to enforce this)
- if ($this->config['enforce_state'] && !$state) {
- $response->setRedirect($this->config['redirect_status_code'], $redirect_uri, null, 'invalid_request', 'The state parameter is required');
-
- return false;
- }
-
- // save the input data and return true
- $this->scope = $requestedScope;
- $this->state = $state;
- $this->client_id = $client_id;
- // Only save the SUPPLIED redirect URI (@see http://tools.ietf.org/html/rfc6749#section-4.1.3)
- $this->redirect_uri = $supplied_redirect_uri;
- $this->response_type = $response_type;
-
- return true;
- }
-
- /**
- * Build the absolute URI based on supplied URI and parameters.
- *
- * @param $uri An absolute URI.
- * @param $params Parameters to be append as GET.
- *
- * @return
- * An absolute URI with supplied parameters.
- *
- * @ingroup oauth2_section_4
- */
- private function buildUri($uri, $params)
- {
- $parse_url = parse_url($uri);
-
- // Add our params to the parsed uri
- foreach ($params as $k => $v) {
- if (isset($parse_url[$k])) {
- $parse_url[$k] .= "&" . http_build_query($v, '', '&');
- } else {
- $parse_url[$k] = http_build_query($v, '', '&');
- }
- }
-
- // Put humpty dumpty back together
- return
- ((isset($parse_url["scheme"])) ? $parse_url["scheme"] . "://" : "")
- . ((isset($parse_url["user"])) ? $parse_url["user"]
- . ((isset($parse_url["pass"])) ? ":" . $parse_url["pass"] : "") . "@" : "")
- . ((isset($parse_url["host"])) ? $parse_url["host"] : "")
- . ((isset($parse_url["port"])) ? ":" . $parse_url["port"] : "")
- . ((isset($parse_url["path"])) ? $parse_url["path"] : "")
- . ((isset($parse_url["query"]) && !empty($parse_url['query'])) ? "?" . $parse_url["query"] : "")
- . ((isset($parse_url["fragment"])) ? "#" . $parse_url["fragment"] : "")
- ;
- }
-
- protected function getValidResponseTypes()
- {
- return array(
- self::RESPONSE_TYPE_ACCESS_TOKEN,
- self::RESPONSE_TYPE_AUTHORIZATION_CODE,
- );
- }
-
- /**
- * Internal method for validating redirect URI supplied
- *
- * @param string $inputUri The submitted URI to be validated
- * @param string $registeredUriString The allowed URI(s) to validate against. Can be a space-delimited string of URIs to
- * allow for multiple URIs
- *
- * @see http://tools.ietf.org/html/rfc6749#section-3.1.2
- */
- protected function validateRedirectUri($inputUri, $registeredUriString)
- {
- if (!$inputUri || !$registeredUriString) {
- return false; // if either one is missing, assume INVALID
- }
-
- $registered_uris = explode(' ', $registeredUriString);
- foreach ($registered_uris as $registered_uri) {
- if ($this->config['require_exact_redirect_uri']) {
- // the input uri is validated against the registered uri using exact match
- if (strcmp($inputUri, $registered_uri) === 0) {
- return true;
- }
- } else {
- $registered_uri_length = strlen($registered_uri);
- if ($registered_uri_length === 0) {
- return false;
- }
-
- // the input uri is validated against the registered uri using case-insensitive match of the initial string
- // i.e. additional query parameters may be applied
- if (strcasecmp(substr($inputUri, 0, $registered_uri_length), $registered_uri) === 0) {
- return true;
- }
- }
- }
-
- return false;
- }
-
- /**
- * Convenience methods to access the parameters derived from the validated request
- */
-
- public function getScope()
- {
- return $this->scope;
- }
-
- public function getState()
- {
- return $this->state;
- }
-
- public function getClientId()
- {
- return $this->client_id;
- }
-
- public function getRedirectUri()
- {
- return $this->redirect_uri;
- }
-
- public function getResponseType()
- {
- return $this->response_type;
- }
-}
diff --git a/library/oauth2/src/OAuth2/Controller/AuthorizeControllerInterface.php b/library/oauth2/src/OAuth2/Controller/AuthorizeControllerInterface.php
deleted file mode 100644
index fa07ae8d2..000000000
--- a/library/oauth2/src/OAuth2/Controller/AuthorizeControllerInterface.php
+++ /dev/null
@@ -1,43 +0,0 @@
-<?php
-
-namespace OAuth2\Controller;
-
-use OAuth2\RequestInterface;
-use OAuth2\ResponseInterface;
-
-/**
- * This controller is called when a user should be authorized
- * by an authorization server. As OAuth2 does not handle
- * authorization directly, this controller ensures the request is valid, but
- * requires the application to determine the value of $is_authorized
- *
- * ex:
- * > $user_id = $this->somehowDetermineUserId();
- * > $is_authorized = $this->somehowDetermineUserAuthorization();
- * > $response = new OAuth2\Response();
- * > $authorizeController->handleAuthorizeRequest(
- * > OAuth2\Request::createFromGlobals(),
- * > $response,
- * > $is_authorized,
- * > $user_id);
- * > $response->send();
- *
- */
-interface AuthorizeControllerInterface
-{
- /**
- * List of possible authentication response types.
- * The "authorization_code" mechanism exclusively supports 'code'
- * and the "implicit" mechanism exclusively supports 'token'.
- *
- * @var string
- * @see http://tools.ietf.org/html/rfc6749#section-4.1.1
- * @see http://tools.ietf.org/html/rfc6749#section-4.2.1
- */
- const RESPONSE_TYPE_AUTHORIZATION_CODE = 'code';
- const RESPONSE_TYPE_ACCESS_TOKEN = 'token';
-
- public function handleAuthorizeRequest(RequestInterface $request, ResponseInterface $response, $is_authorized, $user_id = null);
-
- public function validateAuthorizeRequest(RequestInterface $request, ResponseInterface $response);
-}
diff --git a/library/oauth2/src/OAuth2/Controller/ResourceController.php b/library/oauth2/src/OAuth2/Controller/ResourceController.php
deleted file mode 100644
index e8588188f..000000000
--- a/library/oauth2/src/OAuth2/Controller/ResourceController.php
+++ /dev/null
@@ -1,111 +0,0 @@
-<?php
-
-namespace OAuth2\Controller;
-
-use OAuth2\TokenType\TokenTypeInterface;
-use OAuth2\Storage\AccessTokenInterface;
-use OAuth2\ScopeInterface;
-use OAuth2\RequestInterface;
-use OAuth2\ResponseInterface;
-use OAuth2\Scope;
-
-/**
- * @see OAuth2\Controller\ResourceControllerInterface
- */
-class ResourceController implements ResourceControllerInterface
-{
- private $token;
-
- protected $tokenType;
- protected $tokenStorage;
- protected $config;
- protected $scopeUtil;
-
- public function __construct(TokenTypeInterface $tokenType, AccessTokenInterface $tokenStorage, $config = array(), ScopeInterface $scopeUtil = null)
- {
- $this->tokenType = $tokenType;
- $this->tokenStorage = $tokenStorage;
-
- $this->config = array_merge(array(
- 'www_realm' => 'Service',
- ), $config);
-
- if (is_null($scopeUtil)) {
- $scopeUtil = new Scope();
- }
- $this->scopeUtil = $scopeUtil;
- }
-
- public function verifyResourceRequest(RequestInterface $request, ResponseInterface $response, $scope = null)
- {
- $token = $this->getAccessTokenData($request, $response);
-
- // Check if we have token data
- if (is_null($token)) {
- return false;
- }
-
- /**
- * Check scope, if provided
- * If token doesn't have a scope, it's null/empty, or it's insufficient, then throw 403
- * @see http://tools.ietf.org/html/rfc6750#section-3.1
- */
- if ($scope && (!isset($token["scope"]) || !$token["scope"] || !$this->scopeUtil->checkScope($scope, $token["scope"]))) {
- $response->setError(403, 'insufficient_scope', 'The request requires higher privileges than provided by the access token');
- $response->addHttpHeaders(array(
- 'WWW-Authenticate' => sprintf('%s realm="%s", scope="%s", error="%s", error_description="%s"',
- $this->tokenType->getTokenType(),
- $this->config['www_realm'],
- $scope,
- $response->getParameter('error'),
- $response->getParameter('error_description')
- )
- ));
-
- return false;
- }
-
- // allow retrieval of the token
- $this->token = $token;
-
- return (bool) $token;
- }
-
- public function getAccessTokenData(RequestInterface $request, ResponseInterface $response)
- {
- // Get the token parameter
- if ($token_param = $this->tokenType->getAccessTokenParameter($request, $response)) {
- // Get the stored token data (from the implementing subclass)
- // Check we have a well formed token
- // Check token expiration (expires is a mandatory paramter)
- if (!$token = $this->tokenStorage->getAccessToken($token_param)) {
- $response->setError(401, 'invalid_token', 'The access token provided is invalid');
- } elseif (!isset($token["expires"]) || !isset($token["client_id"])) {
- $response->setError(401, 'malformed_token', 'Malformed token (missing "expires")');
- } elseif (time() > $token["expires"]) {
- $response->setError(401, 'expired_token', 'The access token provided has expired');
- } else {
- return $token;
- }
- }
-
- $authHeader = sprintf('%s realm="%s"', $this->tokenType->getTokenType(), $this->config['www_realm']);
-
- if ($error = $response->getParameter('error')) {
- $authHeader = sprintf('%s, error="%s"', $authHeader, $error);
- if ($error_description = $response->getParameter('error_description')) {
- $authHeader = sprintf('%s, error_description="%s"', $authHeader, $error_description);
- }
- }
-
- $response->addHttpHeaders(array('WWW-Authenticate' => $authHeader));
-
- return null;
- }
-
- // convenience method to allow retrieval of the token
- public function getToken()
- {
- return $this->token;
- }
-}
diff --git a/library/oauth2/src/OAuth2/Controller/ResourceControllerInterface.php b/library/oauth2/src/OAuth2/Controller/ResourceControllerInterface.php
deleted file mode 100644
index 611421935..000000000
--- a/library/oauth2/src/OAuth2/Controller/ResourceControllerInterface.php
+++ /dev/null
@@ -1,26 +0,0 @@
-<?php
-
-namespace OAuth2\Controller;
-
-use OAuth2\RequestInterface;
-use OAuth2\ResponseInterface;
-
-/**
- * This controller is called when a "resource" is requested.
- * call verifyResourceRequest in order to determine if the request
- * contains a valid token.
- *
- * ex:
- * > if (!$resourceController->verifyResourceRequest(OAuth2\Request::createFromGlobals(), $response = new OAuth2\Response())) {
- * > $response->send(); // authorization failed
- * > die();
- * > }
- * > return json_encode($resource); // valid token! Send the stuff!
- *
- */
-interface ResourceControllerInterface
-{
- public function verifyResourceRequest(RequestInterface $request, ResponseInterface $response, $scope = null);
-
- public function getAccessTokenData(RequestInterface $request, ResponseInterface $response);
-}
diff --git a/library/oauth2/src/OAuth2/Controller/TokenController.php b/library/oauth2/src/OAuth2/Controller/TokenController.php
deleted file mode 100644
index 42dab892f..000000000
--- a/library/oauth2/src/OAuth2/Controller/TokenController.php
+++ /dev/null
@@ -1,278 +0,0 @@
-<?php
-
-namespace OAuth2\Controller;
-
-use OAuth2\ResponseType\AccessTokenInterface;
-use OAuth2\ClientAssertionType\ClientAssertionTypeInterface;
-use OAuth2\GrantType\GrantTypeInterface;
-use OAuth2\ScopeInterface;
-use OAuth2\Scope;
-use OAuth2\Storage\ClientInterface;
-use OAuth2\RequestInterface;
-use OAuth2\ResponseInterface;
-
-/**
- * @see OAuth2\Controller\TokenControllerInterface
- */
-class TokenController implements TokenControllerInterface
-{
- protected $accessToken;
- protected $grantTypes;
- protected $clientAssertionType;
- protected $scopeUtil;
- protected $clientStorage;
-
- public function __construct(AccessTokenInterface $accessToken, ClientInterface $clientStorage, array $grantTypes = array(), ClientAssertionTypeInterface $clientAssertionType = null, ScopeInterface $scopeUtil = null)
- {
- if (is_null($clientAssertionType)) {
- foreach ($grantTypes as $grantType) {
- if (!$grantType instanceof ClientAssertionTypeInterface) {
- throw new \InvalidArgumentException('You must supply an instance of OAuth2\ClientAssertionType\ClientAssertionTypeInterface or only use grant types which implement OAuth2\ClientAssertionType\ClientAssertionTypeInterface');
- }
- }
- }
- $this->clientAssertionType = $clientAssertionType;
- $this->accessToken = $accessToken;
- $this->clientStorage = $clientStorage;
- foreach ($grantTypes as $grantType) {
- $this->addGrantType($grantType);
- }
-
- if (is_null($scopeUtil)) {
- $scopeUtil = new Scope();
- }
- $this->scopeUtil = $scopeUtil;
- }
-
- public function handleTokenRequest(RequestInterface $request, ResponseInterface $response)
- {
- if ($token = $this->grantAccessToken($request, $response)) {
- // @see http://tools.ietf.org/html/rfc6749#section-5.1
- // server MUST disable caching in headers when tokens are involved
- $response->setStatusCode(200);
- $response->addParameters($token);
- $response->addHttpHeaders(array(
- 'Cache-Control' => 'no-store',
- 'Pragma' => 'no-cache',
- 'Content-Type' => 'application/json'
- ));
- }
- }
-
- /**
- * Grant or deny a requested access token.
- * This would be called from the "/token" endpoint as defined in the spec.
- * You can call your endpoint whatever you want.
- *
- * @param $request - RequestInterface
- * Request object to grant access token
- *
- * @throws InvalidArgumentException
- * @throws LogicException
- *
- * @see http://tools.ietf.org/html/rfc6749#section-4
- * @see http://tools.ietf.org/html/rfc6749#section-10.6
- * @see http://tools.ietf.org/html/rfc6749#section-4.1.3
- *
- * @ingroup oauth2_section_4
- */
- public function grantAccessToken(RequestInterface $request, ResponseInterface $response)
- {
- if (strtolower($request->server('REQUEST_METHOD')) != 'post') {
- $response->setError(405, 'invalid_request', 'The request method must be POST when requesting an access token', '#section-3.2');
- $response->addHttpHeaders(array('Allow' => 'POST'));
-
- return null;
- }
-
- /**
- * Determine grant type from request
- * and validate the request for that grant type
- */
- if (!$grantTypeIdentifier = $request->request('grant_type')) {
- $response->setError(400, 'invalid_request', 'The grant type was not specified in the request');
-
- return null;
- }
-
- if (!isset($this->grantTypes[$grantTypeIdentifier])) {
- /* TODO: If this is an OAuth2 supported grant type that we have chosen not to implement, throw a 501 Not Implemented instead */
- $response->setError(400, 'unsupported_grant_type', sprintf('Grant type "%s" not supported', $grantTypeIdentifier));
-
- return null;
- }
-
- $grantType = $this->grantTypes[$grantTypeIdentifier];
-
- /**
- * Retrieve the client information from the request
- * ClientAssertionTypes allow for grant types which also assert the client data
- * in which case ClientAssertion is handled in the validateRequest method
- *
- * @see OAuth2\GrantType\JWTBearer
- * @see OAuth2\GrantType\ClientCredentials
- */
- if (!$grantType instanceof ClientAssertionTypeInterface) {
- if (!$this->clientAssertionType->validateRequest($request, $response)) {
- return null;
- }
- $clientId = $this->clientAssertionType->getClientId();
- }
-
- /**
- * Retrieve the grant type information from the request
- * The GrantTypeInterface object handles all validation
- * If the object is an instance of ClientAssertionTypeInterface,
- * That logic is handled here as well
- */
- if (!$grantType->validateRequest($request, $response)) {
- return null;
- }
-
- if ($grantType instanceof ClientAssertionTypeInterface) {
- $clientId = $grantType->getClientId();
- } else {
- // validate the Client ID (if applicable)
- if (!is_null($storedClientId = $grantType->getClientId()) && $storedClientId != $clientId) {
- $response->setError(400, 'invalid_grant', sprintf('%s doesn\'t exist or is invalid for the client', $grantTypeIdentifier));
-
- return null;
- }
- }
-
- /**
- * Validate the client can use the requested grant type
- */
- if (!$this->clientStorage->checkRestrictedGrantType($clientId, $grantTypeIdentifier)) {
- $response->setError(400, 'unauthorized_client', 'The grant type is unauthorized for this client_id');
-
- return false;
- }
-
- /**
- * Validate the scope of the token
- *
- * requestedScope - the scope specified in the token request
- * availableScope - the scope associated with the grant type
- * ex: in the case of the "Authorization Code" grant type,
- * the scope is specified in the authorize request
- *
- * @see http://tools.ietf.org/html/rfc6749#section-3.3
- */
-
- $requestedScope = $this->scopeUtil->getScopeFromRequest($request);
- $availableScope = $grantType->getScope();
-
- if ($requestedScope) {
- // validate the requested scope
- if ($availableScope) {
- if (!$this->scopeUtil->checkScope($requestedScope, $availableScope)) {
- $response->setError(400, 'invalid_scope', 'The scope requested is invalid for this request');
-
- return null;
- }
- } else {
- // validate the client has access to this scope
- if ($clientScope = $this->clientStorage->getClientScope($clientId)) {
- if (!$this->scopeUtil->checkScope($requestedScope, $clientScope)) {
- $response->setError(400, 'invalid_scope', 'The scope requested is invalid for this client');
-
- return false;
- }
- } elseif (!$this->scopeUtil->scopeExists($requestedScope)) {
- $response->setError(400, 'invalid_scope', 'An unsupported scope was requested');
-
- return null;
- }
- }
- } elseif ($availableScope) {
- // use the scope associated with this grant type
- $requestedScope = $availableScope;
- } else {
- // use a globally-defined default scope
- $defaultScope = $this->scopeUtil->getDefaultScope($clientId);
-
- // "false" means default scopes are not allowed
- if (false === $defaultScope) {
- $response->setError(400, 'invalid_scope', 'This application requires you specify a scope parameter');
-
- return null;
- }
-
- $requestedScope = $defaultScope;
- }
-
- return $grantType->createAccessToken($this->accessToken, $clientId, $grantType->getUserId(), $requestedScope);
- }
-
- /**
- * addGrantType
- *
- * @param grantType - OAuth2\GrantTypeInterface
- * the grant type to add for the specified identifier
- * @param identifier - string
- * a string passed in as "grant_type" in the response that will call this grantType
- */
- public function addGrantType(GrantTypeInterface $grantType, $identifier = null)
- {
- if (is_null($identifier) || is_numeric($identifier)) {
- $identifier = $grantType->getQuerystringIdentifier();
- }
-
- $this->grantTypes[$identifier] = $grantType;
- }
-
- public function handleRevokeRequest(RequestInterface $request, ResponseInterface $response)
- {
- if ($this->revokeToken($request, $response)) {
- $response->setStatusCode(200);
- $response->addParameters(array('revoked' => true));
- }
- }
-
- /**
- * Revoke a refresh or access token. Returns true on success and when tokens are invalid
- *
- * Note: invalid tokens do not cause an error response since the client
- * cannot handle such an error in a reasonable way. Moreover, the
- * purpose of the revocation request, invalidating the particular token,
- * is already achieved.
- *
- * @param RequestInterface $request
- * @param ResponseInterface $response
- * @return bool|null
- */
- public function revokeToken(RequestInterface $request, ResponseInterface $response)
- {
- if (strtolower($request->server('REQUEST_METHOD')) != 'post') {
- $response->setError(405, 'invalid_request', 'The request method must be POST when revoking an access token', '#section-3.2');
- $response->addHttpHeaders(array('Allow' => 'POST'));
-
- return null;
- }
-
- $token_type_hint = $request->request('token_type_hint');
- if (!in_array($token_type_hint, array(null, 'access_token', 'refresh_token'), true)) {
- $response->setError(400, 'invalid_request', 'Token type hint must be either \'access_token\' or \'refresh_token\'');
-
- return null;
- }
-
- $token = $request->request('token');
- if ($token === null) {
- $response->setError(400, 'invalid_request', 'Missing token parameter to revoke');
-
- return null;
- }
-
- // @todo remove this check for v2.0
- if (!method_exists($this->accessToken, 'revokeToken')) {
- $class = get_class($this->accessToken);
- throw new \RuntimeException("AccessToken {$class} does not implement required revokeToken method");
- }
-
- $this->accessToken->revokeToken($token, $token_type_hint);
-
- return true;
- }
-}
diff --git a/library/oauth2/src/OAuth2/Controller/TokenControllerInterface.php b/library/oauth2/src/OAuth2/Controller/TokenControllerInterface.php
deleted file mode 100644
index 72d72570f..000000000
--- a/library/oauth2/src/OAuth2/Controller/TokenControllerInterface.php
+++ /dev/null
@@ -1,32 +0,0 @@
-<?php
-
-namespace OAuth2\Controller;
-
-use OAuth2\RequestInterface;
-use OAuth2\ResponseInterface;
-
-/**
- * This controller is called when a token is being requested.
- * it is called to handle all grant types the application supports.
- * It also validates the client's credentials
- *
- * ex:
- * > $tokenController->handleTokenRequest(OAuth2\Request::createFromGlobals(), $response = new OAuth2\Response());
- * > $response->send();
- *
- */
-interface TokenControllerInterface
-{
- /**
- * handleTokenRequest
- *
- * @param $request
- * OAuth2\RequestInterface - The current http request
- * @param $response
- * OAuth2\ResponseInterface - An instance of OAuth2\ResponseInterface to contain the response data
- *
- */
- public function handleTokenRequest(RequestInterface $request, ResponseInterface $response);
-
- public function grantAccessToken(RequestInterface $request, ResponseInterface $response);
-}
diff --git a/library/oauth2/src/OAuth2/Encryption/EncryptionInterface.php b/library/oauth2/src/OAuth2/Encryption/EncryptionInterface.php
deleted file mode 100644
index 2d336c664..000000000
--- a/library/oauth2/src/OAuth2/Encryption/EncryptionInterface.php
+++ /dev/null
@@ -1,11 +0,0 @@
-<?php
-
-namespace OAuth2\Encryption;
-
-interface EncryptionInterface
-{
- public function encode($payload, $key, $algorithm = null);
- public function decode($payload, $key, $algorithm = null);
- public function urlSafeB64Encode($data);
- public function urlSafeB64Decode($b64);
-}
diff --git a/library/oauth2/src/OAuth2/Encryption/FirebaseJwt.php b/library/oauth2/src/OAuth2/Encryption/FirebaseJwt.php
deleted file mode 100644
index 1b527e0a0..000000000
--- a/library/oauth2/src/OAuth2/Encryption/FirebaseJwt.php
+++ /dev/null
@@ -1,47 +0,0 @@
-<?php
-
-namespace OAuth2\Encryption;
-
-/**
- * Bridge file to use the firebase/php-jwt package for JWT encoding and decoding.
- * @author Francis Chuang <francis.chuang@gmail.com>
- */
-class FirebaseJwt implements EncryptionInterface
-{
- public function __construct()
- {
- if (!class_exists('\JWT')) {
- throw new \ErrorException('firebase/php-jwt must be installed to use this feature. You can do this by running "composer require firebase/php-jwt"');
- }
- }
-
- public function encode($payload, $key, $alg = 'HS256', $keyId = null)
- {
- return \JWT::encode($payload, $key, $alg, $keyId);
- }
-
- public function decode($jwt, $key = null, $allowedAlgorithms = null)
- {
- try {
-
- //Maintain BC: Do not verify if no algorithms are passed in.
- if (!$allowedAlgorithms) {
- $key = null;
- }
-
- return (array)\JWT::decode($jwt, $key, $allowedAlgorithms);
- } catch (\Exception $e) {
- return false;
- }
- }
-
- public function urlSafeB64Encode($data)
- {
- return \JWT::urlsafeB64Encode($data);
- }
-
- public function urlSafeB64Decode($b64)
- {
- return \JWT::urlsafeB64Decode($b64);
- }
-}
diff --git a/library/oauth2/src/OAuth2/Encryption/Jwt.php b/library/oauth2/src/OAuth2/Encryption/Jwt.php
deleted file mode 100644
index ee576e643..000000000
--- a/library/oauth2/src/OAuth2/Encryption/Jwt.php
+++ /dev/null
@@ -1,173 +0,0 @@
-<?php
-
-namespace OAuth2\Encryption;
-
-/**
- * @link https://github.com/F21/jwt
- * @author F21
- */
-class Jwt implements EncryptionInterface
-{
- public function encode($payload, $key, $algo = 'HS256')
- {
- $header = $this->generateJwtHeader($payload, $algo);
-
- $segments = array(
- $this->urlSafeB64Encode(json_encode($header)),
- $this->urlSafeB64Encode(json_encode($payload))
- );
-
- $signing_input = implode('.', $segments);
-
- $signature = $this->sign($signing_input, $key, $algo);
- $segments[] = $this->urlsafeB64Encode($signature);
-
- return implode('.', $segments);
- }
-
- public function decode($jwt, $key = null, $allowedAlgorithms = true)
- {
- if (!strpos($jwt, '.')) {
- return false;
- }
-
- $tks = explode('.', $jwt);
-
- if (count($tks) != 3) {
- return false;
- }
-
- list($headb64, $payloadb64, $cryptob64) = $tks;
-
- if (null === ($header = json_decode($this->urlSafeB64Decode($headb64), true))) {
- return false;
- }
-
- if (null === $payload = json_decode($this->urlSafeB64Decode($payloadb64), true)) {
- return false;
- }
-
- $sig = $this->urlSafeB64Decode($cryptob64);
-
- if ((bool) $allowedAlgorithms) {
- if (!isset($header['alg'])) {
- return false;
- }
-
- // check if bool arg supplied here to maintain BC
- if (is_array($allowedAlgorithms) && !in_array($header['alg'], $allowedAlgorithms)) {
- return false;
- }
-
- if (!$this->verifySignature($sig, "$headb64.$payloadb64", $key, $header['alg'])) {
- return false;
- }
- }
-
- return $payload;
- }
-
- private function verifySignature($signature, $input, $key, $algo = 'HS256')
- {
- // use constants when possible, for HipHop support
- switch ($algo) {
- case'HS256':
- case'HS384':
- case'HS512':
- return $this->hash_equals(
- $this->sign($input, $key, $algo),
- $signature
- );
-
- case 'RS256':
- return openssl_verify($input, $signature, $key, defined('OPENSSL_ALGO_SHA256') ? OPENSSL_ALGO_SHA256 : 'sha256') === 1;
-
- case 'RS384':
- return @openssl_verify($input, $signature, $key, defined('OPENSSL_ALGO_SHA384') ? OPENSSL_ALGO_SHA384 : 'sha384') === 1;
-
- case 'RS512':
- return @openssl_verify($input, $signature, $key, defined('OPENSSL_ALGO_SHA512') ? OPENSSL_ALGO_SHA512 : 'sha512') === 1;
-
- default:
- throw new \InvalidArgumentException("Unsupported or invalid signing algorithm.");
- }
- }
-
- private function sign($input, $key, $algo = 'HS256')
- {
- switch ($algo) {
- case 'HS256':
- return hash_hmac('sha256', $input, $key, true);
-
- case 'HS384':
- return hash_hmac('sha384', $input, $key, true);
-
- case 'HS512':
- return hash_hmac('sha512', $input, $key, true);
-
- case 'RS256':
- return $this->generateRSASignature($input, $key, defined('OPENSSL_ALGO_SHA256') ? OPENSSL_ALGO_SHA256 : 'sha256');
-
- case 'RS384':
- return $this->generateRSASignature($input, $key, defined('OPENSSL_ALGO_SHA384') ? OPENSSL_ALGO_SHA384 : 'sha384');
-
- case 'RS512':
- return $this->generateRSASignature($input, $key, defined('OPENSSL_ALGO_SHA512') ? OPENSSL_ALGO_SHA512 : 'sha512');
-
- default:
- throw new \Exception("Unsupported or invalid signing algorithm.");
- }
- }
-
- private function generateRSASignature($input, $key, $algo)
- {
- if (!openssl_sign($input, $signature, $key, $algo)) {
- throw new \Exception("Unable to sign data.");
- }
-
- return $signature;
- }
-
- public function urlSafeB64Encode($data)
- {
- $b64 = base64_encode($data);
- $b64 = str_replace(array('+', '/', "\r", "\n", '='),
- array('-', '_'),
- $b64);
-
- return $b64;
- }
-
- public function urlSafeB64Decode($b64)
- {
- $b64 = str_replace(array('-', '_'),
- array('+', '/'),
- $b64);
-
- return base64_decode($b64);
- }
-
- /**
- * Override to create a custom header
- */
- protected function generateJwtHeader($payload, $algorithm)
- {
- return array(
- 'typ' => 'JWT',
- 'alg' => $algorithm,
- );
- }
-
- protected function hash_equals($a, $b)
- {
- if (function_exists('hash_equals')) {
- return hash_equals($a, $b);
- }
- $diff = strlen($a) ^ strlen($b);
- for ($i = 0; $i < strlen($a) && $i < strlen($b); $i++) {
- $diff |= ord($a[$i]) ^ ord($b[$i]);
- }
-
- return $diff === 0;
- }
-}
diff --git a/library/oauth2/src/OAuth2/GrantType/AuthorizationCode.php b/library/oauth2/src/OAuth2/GrantType/AuthorizationCode.php
deleted file mode 100644
index e8995204c..000000000
--- a/library/oauth2/src/OAuth2/GrantType/AuthorizationCode.php
+++ /dev/null
@@ -1,100 +0,0 @@
-<?php
-
-namespace OAuth2\GrantType;
-
-use OAuth2\Storage\AuthorizationCodeInterface;
-use OAuth2\ResponseType\AccessTokenInterface;
-use OAuth2\RequestInterface;
-use OAuth2\ResponseInterface;
-
-/**
- *
- * @author Brent Shaffer <bshafs at gmail dot com>
- */
-class AuthorizationCode implements GrantTypeInterface
-{
- protected $storage;
- protected $authCode;
-
- /**
- * @param OAuth2\Storage\AuthorizationCodeInterface $storage REQUIRED Storage class for retrieving authorization code information
- */
- public function __construct(AuthorizationCodeInterface $storage)
- {
- $this->storage = $storage;
- }
-
- public function getQuerystringIdentifier()
- {
- return 'authorization_code';
- }
-
- public function validateRequest(RequestInterface $request, ResponseInterface $response)
- {
- if (!$request->request('code')) {
- $response->setError(400, 'invalid_request', 'Missing parameter: "code" is required');
-
- return false;
- }
-
- $code = $request->request('code');
- if (!$authCode = $this->storage->getAuthorizationCode($code)) {
- $response->setError(400, 'invalid_grant', 'Authorization code doesn\'t exist or is invalid for the client');
-
- return false;
- }
-
- /*
- * 4.1.3 - ensure that the "redirect_uri" parameter is present if the "redirect_uri" parameter was included in the initial authorization request
- * @uri - http://tools.ietf.org/html/rfc6749#section-4.1.3
- */
- if (isset($authCode['redirect_uri']) && $authCode['redirect_uri']) {
- if (!$request->request('redirect_uri') || urldecode($request->request('redirect_uri')) != $authCode['redirect_uri']) {
- $response->setError(400, 'redirect_uri_mismatch', "The redirect URI is missing or do not match", "#section-4.1.3");
-
- return false;
- }
- }
-
- if (!isset($authCode['expires'])) {
- throw new \Exception('Storage must return authcode with a value for "expires"');
- }
-
- if ($authCode["expires"] < time()) {
- $response->setError(400, 'invalid_grant', "The authorization code has expired");
-
- return false;
- }
-
- if (!isset($authCode['code'])) {
- $authCode['code'] = $code; // used to expire the code after the access token is granted
- }
-
- $this->authCode = $authCode;
-
- return true;
- }
-
- public function getClientId()
- {
- return $this->authCode['client_id'];
- }
-
- public function getScope()
- {
- return isset($this->authCode['scope']) ? $this->authCode['scope'] : null;
- }
-
- public function getUserId()
- {
- return isset($this->authCode['user_id']) ? $this->authCode['user_id'] : null;
- }
-
- public function createAccessToken(AccessTokenInterface $accessToken, $client_id, $user_id, $scope)
- {
- $token = $accessToken->createAccessToken($client_id, $user_id, $scope);
- $this->storage->expireAuthorizationCode($this->authCode['code']);
-
- return $token;
- }
-}
diff --git a/library/oauth2/src/OAuth2/GrantType/ClientCredentials.php b/library/oauth2/src/OAuth2/GrantType/ClientCredentials.php
deleted file mode 100644
index f953e4e8d..000000000
--- a/library/oauth2/src/OAuth2/GrantType/ClientCredentials.php
+++ /dev/null
@@ -1,67 +0,0 @@
-<?php
-
-namespace OAuth2\GrantType;
-
-use OAuth2\ClientAssertionType\HttpBasic;
-use OAuth2\ResponseType\AccessTokenInterface;
-use OAuth2\Storage\ClientCredentialsInterface;
-
-/**
- * @author Brent Shaffer <bshafs at gmail dot com>
- *
- * @see OAuth2\ClientAssertionType_HttpBasic
- */
-class ClientCredentials extends HttpBasic implements GrantTypeInterface
-{
- private $clientData;
-
- public function __construct(ClientCredentialsInterface $storage, array $config = array())
- {
- /**
- * The client credentials grant type MUST only be used by confidential clients
- *
- * @see http://tools.ietf.org/html/rfc6749#section-4.4
- */
- $config['allow_public_clients'] = false;
-
- parent::__construct($storage, $config);
- }
-
- public function getQuerystringIdentifier()
- {
- return 'client_credentials';
- }
-
- public function getScope()
- {
- $this->loadClientData();
-
- return isset($this->clientData['scope']) ? $this->clientData['scope'] : null;
- }
-
- public function getUserId()
- {
- $this->loadClientData();
-
- return isset($this->clientData['user_id']) ? $this->clientData['user_id'] : null;
- }
-
- public function createAccessToken(AccessTokenInterface $accessToken, $client_id, $user_id, $scope)
- {
- /**
- * Client Credentials Grant does NOT include a refresh token
- *
- * @see http://tools.ietf.org/html/rfc6749#section-4.4.3
- */
- $includeRefreshToken = false;
-
- return $accessToken->createAccessToken($client_id, $user_id, $scope, $includeRefreshToken);
- }
-
- private function loadClientData()
- {
- if (!$this->clientData) {
- $this->clientData = $this->storage->getClientDetails($this->getClientId());
- }
- }
-}
diff --git a/library/oauth2/src/OAuth2/GrantType/GrantTypeInterface.php b/library/oauth2/src/OAuth2/GrantType/GrantTypeInterface.php
deleted file mode 100644
index 98489e9c1..000000000
--- a/library/oauth2/src/OAuth2/GrantType/GrantTypeInterface.php
+++ /dev/null
@@ -1,20 +0,0 @@
-<?php
-
-namespace OAuth2\GrantType;
-
-use OAuth2\ResponseType\AccessTokenInterface;
-use OAuth2\RequestInterface;
-use OAuth2\ResponseInterface;
-
-/**
- * Interface for all OAuth2 Grant Types
- */
-interface GrantTypeInterface
-{
- public function getQuerystringIdentifier();
- public function validateRequest(RequestInterface $request, ResponseInterface $response);
- public function getClientId();
- public function getUserId();
- public function getScope();
- public function createAccessToken(AccessTokenInterface $accessToken, $client_id, $user_id, $scope);
-}
diff --git a/library/oauth2/src/OAuth2/GrantType/JwtBearer.php b/library/oauth2/src/OAuth2/GrantType/JwtBearer.php
deleted file mode 100644
index bb11a6954..000000000
--- a/library/oauth2/src/OAuth2/GrantType/JwtBearer.php
+++ /dev/null
@@ -1,226 +0,0 @@
-<?php
-
-namespace OAuth2\GrantType;
-
-use OAuth2\ClientAssertionType\ClientAssertionTypeInterface;
-use OAuth2\Storage\JwtBearerInterface;
-use OAuth2\Encryption\Jwt;
-use OAuth2\Encryption\EncryptionInterface;
-use OAuth2\ResponseType\AccessTokenInterface;
-use OAuth2\RequestInterface;
-use OAuth2\ResponseInterface;
-
-/**
- * The JWT bearer authorization grant implements JWT (JSON Web Tokens) as a grant type per the IETF draft.
- *
- * @see http://tools.ietf.org/html/draft-ietf-oauth-jwt-bearer-04#section-4
- *
- * @author F21
- * @author Brent Shaffer <bshafs at gmail dot com>
- */
-class JwtBearer implements GrantTypeInterface, ClientAssertionTypeInterface
-{
- private $jwt;
-
- protected $storage;
- protected $audience;
- protected $jwtUtil;
- protected $allowedAlgorithms;
-
- /**
- * Creates an instance of the JWT bearer grant type.
- *
- * @param OAuth2\Storage\JWTBearerInterface|JwtBearerInterface $storage A valid storage interface that implements storage hooks for the JWT bearer grant type.
- * @param string $audience The audience to validate the token against. This is usually the full URI of the OAuth token requests endpoint.
- * @param EncryptionInterface|OAuth2\Encryption\JWT $jwtUtil OPTONAL The class used to decode, encode and verify JWTs.
- * @param array $config
- */
- public function __construct(JwtBearerInterface $storage, $audience, EncryptionInterface $jwtUtil = null, array $config = array())
- {
- $this->storage = $storage;
- $this->audience = $audience;
-
- if (is_null($jwtUtil)) {
- $jwtUtil = new Jwt();
- }
-
- $this->config = array_merge(array(
- 'allowed_algorithms' => array('RS256', 'RS384', 'RS512')
- ), $config);
-
- $this->jwtUtil = $jwtUtil;
-
- $this->allowedAlgorithms = $this->config['allowed_algorithms'];
- }
-
- /**
- * Returns the grant_type get parameter to identify the grant type request as JWT bearer authorization grant.
- *
- * @return
- * The string identifier for grant_type.
- *
- * @see OAuth2\GrantType\GrantTypeInterface::getQuerystringIdentifier()
- */
- public function getQuerystringIdentifier()
- {
- return 'urn:ietf:params:oauth:grant-type:jwt-bearer';
- }
-
- /**
- * Validates the data from the decoded JWT.
- *
- * @return
- * TRUE if the JWT request is valid and can be decoded. Otherwise, FALSE is returned.
- *
- * @see OAuth2\GrantType\GrantTypeInterface::getTokenData()
- */
- public function validateRequest(RequestInterface $request, ResponseInterface $response)
- {
- if (!$request->request("assertion")) {
- $response->setError(400, 'invalid_request', 'Missing parameters: "assertion" required');
-
- return null;
- }
-
- // Store the undecoded JWT for later use
- $undecodedJWT = $request->request('assertion');
-
- // Decode the JWT
- $jwt = $this->jwtUtil->decode($request->request('assertion'), null, false);
-
- if (!$jwt) {
- $response->setError(400, 'invalid_request', "JWT is malformed");
-
- return null;
- }
-
- // ensure these properties contain a value
- // @todo: throw malformed error for missing properties
- $jwt = array_merge(array(
- 'scope' => null,
- 'iss' => null,
- 'sub' => null,
- 'aud' => null,
- 'exp' => null,
- 'nbf' => null,
- 'iat' => null,
- 'jti' => null,
- 'typ' => null,
- ), $jwt);
-
- if (!isset($jwt['iss'])) {
- $response->setError(400, 'invalid_grant', "Invalid issuer (iss) provided");
-
- return null;
- }
-
- if (!isset($jwt['sub'])) {
- $response->setError(400, 'invalid_grant', "Invalid subject (sub) provided");
-
- return null;
- }
-
- if (!isset($jwt['exp'])) {
- $response->setError(400, 'invalid_grant', "Expiration (exp) time must be present");
-
- return null;
- }
-
- // Check expiration
- if (ctype_digit($jwt['exp'])) {
- if ($jwt['exp'] <= time()) {
- $response->setError(400, 'invalid_grant', "JWT has expired");
-
- return null;
- }
- } else {
- $response->setError(400, 'invalid_grant', "Expiration (exp) time must be a unix time stamp");
-
- return null;
- }
-
- // Check the not before time
- if ($notBefore = $jwt['nbf']) {
- if (ctype_digit($notBefore)) {
- if ($notBefore > time()) {
- $response->setError(400, 'invalid_grant', "JWT cannot be used before the Not Before (nbf) time");
-
- return null;
- }
- } else {
- $response->setError(400, 'invalid_grant', "Not Before (nbf) time must be a unix time stamp");
-
- return null;
- }
- }
-
- // Check the audience if required to match
- if (!isset($jwt['aud']) || ($jwt['aud'] != $this->audience)) {
- $response->setError(400, 'invalid_grant', "Invalid audience (aud)");
-
- return null;
- }
-
- // Check the jti (nonce)
- // @see http://tools.ietf.org/html/draft-ietf-oauth-json-web-token-13#section-4.1.7
- if (isset($jwt['jti'])) {
- $jti = $this->storage->getJti($jwt['iss'], $jwt['sub'], $jwt['aud'], $jwt['exp'], $jwt['jti']);
-
- //Reject if jti is used and jwt is still valid (exp parameter has not expired).
- if ($jti && $jti['expires'] > time()) {
- $response->setError(400, 'invalid_grant', "JSON Token Identifier (jti) has already been used");
-
- return null;
- } else {
- $this->storage->setJti($jwt['iss'], $jwt['sub'], $jwt['aud'], $jwt['exp'], $jwt['jti']);
- }
- }
-
- // Get the iss's public key
- // @see http://tools.ietf.org/html/draft-ietf-oauth-json-web-token-06#section-4.1.1
- if (!$key = $this->storage->getClientKey($jwt['iss'], $jwt['sub'])) {
- $response->setError(400, 'invalid_grant', "Invalid issuer (iss) or subject (sub) provided");
-
- return null;
- }
-
- // Verify the JWT
- if (!$this->jwtUtil->decode($undecodedJWT, $key, $this->allowedAlgorithms)) {
- $response->setError(400, 'invalid_grant', "JWT failed signature verification");
-
- return null;
- }
-
- $this->jwt = $jwt;
-
- return true;
- }
-
- public function getClientId()
- {
- return $this->jwt['iss'];
- }
-
- public function getUserId()
- {
- return $this->jwt['sub'];
- }
-
- public function getScope()
- {
- return null;
- }
-
- /**
- * Creates an access token that is NOT associated with a refresh token.
- * If a subject (sub) the name of the user/account we are accessing data on behalf of.
- *
- * @see OAuth2\GrantType\GrantTypeInterface::createAccessToken()
- */
- public function createAccessToken(AccessTokenInterface $accessToken, $client_id, $user_id, $scope)
- {
- $includeRefreshToken = false;
-
- return $accessToken->createAccessToken($client_id, $user_id, $scope, $includeRefreshToken);
- }
-}
diff --git a/library/oauth2/src/OAuth2/GrantType/RefreshToken.php b/library/oauth2/src/OAuth2/GrantType/RefreshToken.php
deleted file mode 100644
index e55385222..000000000
--- a/library/oauth2/src/OAuth2/GrantType/RefreshToken.php
+++ /dev/null
@@ -1,111 +0,0 @@
-<?php
-
-namespace OAuth2\GrantType;
-
-use OAuth2\Storage\RefreshTokenInterface;
-use OAuth2\ResponseType\AccessTokenInterface;
-use OAuth2\RequestInterface;
-use OAuth2\ResponseInterface;
-
-/**
- *
- * @author Brent Shaffer <bshafs at gmail dot com>
- */
-class RefreshToken implements GrantTypeInterface
-{
- private $refreshToken;
-
- protected $storage;
- protected $config;
-
- /**
- * @param OAuth2\Storage\RefreshTokenInterface $storage REQUIRED Storage class for retrieving refresh token information
- * @param array $config OPTIONAL Configuration options for the server
- * <code>
- * $config = array(
- * 'always_issue_new_refresh_token' => true, // whether to issue a new refresh token upon successful token request
- * 'unset_refresh_token_after_use' => true // whether to unset the refresh token after after using
- * );
- * </code>
- */
- public function __construct(RefreshTokenInterface $storage, $config = array())
- {
- $this->config = array_merge(array(
- 'always_issue_new_refresh_token' => false,
- 'unset_refresh_token_after_use' => true
- ), $config);
-
- // to preserve B.C. with v1.6
- // @see https://github.com/bshaffer/oauth2-server-php/pull/580
- // @todo - remove in v2.0
- if (isset($config['always_issue_new_refresh_token']) && !isset($config['unset_refresh_token_after_use'])) {
- $this->config['unset_refresh_token_after_use'] = $config['always_issue_new_refresh_token'];
- }
-
- $this->storage = $storage;
- }
-
- public function getQuerystringIdentifier()
- {
- return 'refresh_token';
- }
-
- public function validateRequest(RequestInterface $request, ResponseInterface $response)
- {
- if (!$request->request("refresh_token")) {
- $response->setError(400, 'invalid_request', 'Missing parameter: "refresh_token" is required');
-
- return null;
- }
-
- if (!$refreshToken = $this->storage->getRefreshToken($request->request("refresh_token"))) {
- $response->setError(400, 'invalid_grant', 'Invalid refresh token');
-
- return null;
- }
-
- if ($refreshToken['expires'] > 0 && $refreshToken["expires"] < time()) {
- $response->setError(400, 'invalid_grant', 'Refresh token has expired');
-
- return null;
- }
-
- // store the refresh token locally so we can delete it when a new refresh token is generated
- $this->refreshToken = $refreshToken;
-
- return true;
- }
-
- public function getClientId()
- {
- return $this->refreshToken['client_id'];
- }
-
- public function getUserId()
- {
- return isset($this->refreshToken['user_id']) ? $this->refreshToken['user_id'] : null;
- }
-
- public function getScope()
- {
- return isset($this->refreshToken['scope']) ? $this->refreshToken['scope'] : null;
- }
-
- public function createAccessToken(AccessTokenInterface $accessToken, $client_id, $user_id, $scope)
- {
- /*
- * It is optional to force a new refresh token when a refresh token is used.
- * However, if a new refresh token is issued, the old one MUST be expired
- * @see http://tools.ietf.org/html/rfc6749#section-6
- */
- $issueNewRefreshToken = $this->config['always_issue_new_refresh_token'];
- $unsetRefreshToken = $this->config['unset_refresh_token_after_use'];
- $token = $accessToken->createAccessToken($client_id, $user_id, $scope, $issueNewRefreshToken);
-
- if ($unsetRefreshToken) {
- $this->storage->unsetRefreshToken($this->refreshToken['refresh_token']);
- }
-
- return $token;
- }
-}
diff --git a/library/oauth2/src/OAuth2/GrantType/UserCredentials.php b/library/oauth2/src/OAuth2/GrantType/UserCredentials.php
deleted file mode 100644
index f165538ba..000000000
--- a/library/oauth2/src/OAuth2/GrantType/UserCredentials.php
+++ /dev/null
@@ -1,83 +0,0 @@
-<?php
-
-namespace OAuth2\GrantType;
-
-use OAuth2\Storage\UserCredentialsInterface;
-use OAuth2\ResponseType\AccessTokenInterface;
-use OAuth2\RequestInterface;
-use OAuth2\ResponseInterface;
-
-/**
- *
- * @author Brent Shaffer <bshafs at gmail dot com>
- */
-class UserCredentials implements GrantTypeInterface
-{
- private $userInfo;
-
- protected $storage;
-
- /**
- * @param OAuth2\Storage\UserCredentialsInterface $storage REQUIRED Storage class for retrieving user credentials information
- */
- public function __construct(UserCredentialsInterface $storage)
- {
- $this->storage = $storage;
- }
-
- public function getQuerystringIdentifier()
- {
- return 'password';
- }
-
- public function validateRequest(RequestInterface $request, ResponseInterface $response)
- {
- if (!$request->request("password") || !$request->request("username")) {
- $response->setError(400, 'invalid_request', 'Missing parameters: "username" and "password" required');
-
- return null;
- }
-
- if (!$this->storage->checkUserCredentials($request->request("username"), $request->request("password"))) {
- $response->setError(401, 'invalid_grant', 'Invalid username and password combination');
-
- return null;
- }
-
- $userInfo = $this->storage->getUserDetails($request->request("username"));
-
- if (empty($userInfo)) {
- $response->setError(400, 'invalid_grant', 'Unable to retrieve user information');
-
- return null;
- }
-
- if (!isset($userInfo['user_id'])) {
- throw new \LogicException("you must set the user_id on the array returned by getUserDetails");
- }
-
- $this->userInfo = $userInfo;
-
- return true;
- }
-
- public function getClientId()
- {
- return null;
- }
-
- public function getUserId()
- {
- return $this->userInfo['user_id'];
- }
-
- public function getScope()
- {
- return isset($this->userInfo['scope']) ? $this->userInfo['scope'] : null;
- }
-
- public function createAccessToken(AccessTokenInterface $accessToken, $client_id, $user_id, $scope)
- {
- return $accessToken->createAccessToken($client_id, $user_id, $scope);
- }
-}
diff --git a/library/oauth2/src/OAuth2/OpenID/Controller/AuthorizeController.php b/library/oauth2/src/OAuth2/OpenID/Controller/AuthorizeController.php
deleted file mode 100644
index c9b5c6af7..000000000
--- a/library/oauth2/src/OAuth2/OpenID/Controller/AuthorizeController.php
+++ /dev/null
@@ -1,106 +0,0 @@
-<?php
-
-namespace OAuth2\OpenID\Controller;
-
-use OAuth2\Controller\AuthorizeController as BaseAuthorizeController;
-use OAuth2\RequestInterface;
-use OAuth2\ResponseInterface;
-
-/**
- * @see OAuth2\Controller\AuthorizeControllerInterface
- */
-class AuthorizeController extends BaseAuthorizeController implements AuthorizeControllerInterface
-{
- private $nonce;
-
- protected function setNotAuthorizedResponse(RequestInterface $request, ResponseInterface $response, $redirect_uri, $user_id = null)
- {
- $prompt = $request->query('prompt', 'consent');
- if ($prompt == 'none') {
- if (is_null($user_id)) {
- $error = 'login_required';
- $error_message = 'The user must log in';
- } else {
- $error = 'interaction_required';
- $error_message = 'The user must grant access to your application';
- }
- } else {
- $error = 'consent_required';
- $error_message = 'The user denied access to your application';
- }
-
- $response->setRedirect($this->config['redirect_status_code'], $redirect_uri, $this->getState(), $error, $error_message);
- }
-
- protected function buildAuthorizeParameters($request, $response, $user_id)
- {
- if (!$params = parent::buildAuthorizeParameters($request, $response, $user_id)) {
- return;
- }
-
- // Generate an id token if needed.
- if ($this->needsIdToken($this->getScope()) && $this->getResponseType() == self::RESPONSE_TYPE_AUTHORIZATION_CODE) {
- $params['id_token'] = $this->responseTypes['id_token']->createIdToken($this->getClientId(), $user_id, $this->nonce);
- }
-
- // add the nonce to return with the redirect URI
- $params['nonce'] = $this->nonce;
-
- return $params;
- }
-
- public function validateAuthorizeRequest(RequestInterface $request, ResponseInterface $response)
- {
- if (!parent::validateAuthorizeRequest($request, $response)) {
- return false;
- }
-
- $nonce = $request->query('nonce');
-
- // Validate required nonce for "id_token" and "id_token token"
- if (!$nonce && in_array($this->getResponseType(), array(self::RESPONSE_TYPE_ID_TOKEN, self::RESPONSE_TYPE_ID_TOKEN_TOKEN))) {
- $response->setError(400, 'invalid_nonce', 'This application requires you specify a nonce parameter');
-
- return false;
- }
-
- $this->nonce = $nonce;
-
- return true;
- }
-
- protected function getValidResponseTypes()
- {
- return array(
- self::RESPONSE_TYPE_ACCESS_TOKEN,
- self::RESPONSE_TYPE_AUTHORIZATION_CODE,
- self::RESPONSE_TYPE_ID_TOKEN,
- self::RESPONSE_TYPE_ID_TOKEN_TOKEN,
- self::RESPONSE_TYPE_CODE_ID_TOKEN,
- );
- }
-
- /**
- * Returns whether the current request needs to generate an id token.
- *
- * ID Tokens are a part of the OpenID Connect specification, so this
- * method checks whether OpenID Connect is enabled in the server settings
- * and whether the openid scope was requested.
- *
- * @param $request_scope
- * A space-separated string of scopes.
- *
- * @return
- * TRUE if an id token is needed, FALSE otherwise.
- */
- public function needsIdToken($request_scope)
- {
- // see if the "openid" scope exists in the requested scope
- return $this->scopeUtil->checkScope('openid', $request_scope);
- }
-
- public function getNonce()
- {
- return $this->nonce;
- }
-}
diff --git a/library/oauth2/src/OAuth2/OpenID/Controller/AuthorizeControllerInterface.php b/library/oauth2/src/OAuth2/OpenID/Controller/AuthorizeControllerInterface.php
deleted file mode 100644
index 1e231d844..000000000
--- a/library/oauth2/src/OAuth2/OpenID/Controller/AuthorizeControllerInterface.php
+++ /dev/null
@@ -1,10 +0,0 @@
-<?php
-
-namespace OAuth2\OpenID\Controller;
-
-interface AuthorizeControllerInterface
-{
- const RESPONSE_TYPE_ID_TOKEN = 'id_token';
- const RESPONSE_TYPE_ID_TOKEN_TOKEN = 'id_token token';
- const RESPONSE_TYPE_CODE_ID_TOKEN = 'code id_token';
-}
diff --git a/library/oauth2/src/OAuth2/OpenID/Controller/UserInfoController.php b/library/oauth2/src/OAuth2/OpenID/Controller/UserInfoController.php
deleted file mode 100644
index 30cb942d0..000000000
--- a/library/oauth2/src/OAuth2/OpenID/Controller/UserInfoController.php
+++ /dev/null
@@ -1,58 +0,0 @@
-<?php
-
-namespace OAuth2\OpenID\Controller;
-
-use OAuth2\Scope;
-use OAuth2\TokenType\TokenTypeInterface;
-use OAuth2\Storage\AccessTokenInterface;
-use OAuth2\OpenID\Storage\UserClaimsInterface;
-use OAuth2\Controller\ResourceController;
-use OAuth2\ScopeInterface;
-use OAuth2\RequestInterface;
-use OAuth2\ResponseInterface;
-
-/**
- * @see OAuth2\Controller\UserInfoControllerInterface
- */
-class UserInfoController extends ResourceController implements UserInfoControllerInterface
-{
- private $token;
-
- protected $tokenType;
- protected $tokenStorage;
- protected $userClaimsStorage;
- protected $config;
- protected $scopeUtil;
-
- public function __construct(TokenTypeInterface $tokenType, AccessTokenInterface $tokenStorage, UserClaimsInterface $userClaimsStorage, $config = array(), ScopeInterface $scopeUtil = null)
- {
- $this->tokenType = $tokenType;
- $this->tokenStorage = $tokenStorage;
- $this->userClaimsStorage = $userClaimsStorage;
-
- $this->config = array_merge(array(
- 'www_realm' => 'Service',
- ), $config);
-
- if (is_null($scopeUtil)) {
- $scopeUtil = new Scope();
- }
- $this->scopeUtil = $scopeUtil;
- }
-
- public function handleUserInfoRequest(RequestInterface $request, ResponseInterface $response)
- {
- if (!$this->verifyResourceRequest($request, $response, 'openid')) {
- return;
- }
-
- $token = $this->getToken();
- $claims = $this->userClaimsStorage->getUserClaims($token['user_id'], $token['scope']);
- // The sub Claim MUST always be returned in the UserInfo Response.
- // http://openid.net/specs/openid-connect-core-1_0.html#UserInfoResponse
- $claims += array(
- 'sub' => $token['user_id'],
- );
- $response->addParameters($claims);
- }
-}
diff --git a/library/oauth2/src/OAuth2/OpenID/Controller/UserInfoControllerInterface.php b/library/oauth2/src/OAuth2/OpenID/Controller/UserInfoControllerInterface.php
deleted file mode 100644
index a89049d49..000000000
--- a/library/oauth2/src/OAuth2/OpenID/Controller/UserInfoControllerInterface.php
+++ /dev/null
@@ -1,23 +0,0 @@
-<?php
-
-namespace OAuth2\OpenID\Controller;
-
-use OAuth2\RequestInterface;
-use OAuth2\ResponseInterface;
-
-/**
- * This controller is called when the user claims for OpenID Connect's
- * UserInfo endpoint should be returned.
- *
- * ex:
- * > $response = new OAuth2\Response();
- * > $userInfoController->handleUserInfoRequest(
- * > OAuth2\Request::createFromGlobals(),
- * > $response;
- * > $response->send();
- *
- */
-interface UserInfoControllerInterface
-{
- public function handleUserInfoRequest(RequestInterface $request, ResponseInterface $response);
-}
diff --git a/library/oauth2/src/OAuth2/OpenID/GrantType/AuthorizationCode.php b/library/oauth2/src/OAuth2/OpenID/GrantType/AuthorizationCode.php
deleted file mode 100644
index 8ed1edc26..000000000
--- a/library/oauth2/src/OAuth2/OpenID/GrantType/AuthorizationCode.php
+++ /dev/null
@@ -1,33 +0,0 @@
-<?php
-
-namespace OAuth2\OpenID\GrantType;
-
-use OAuth2\GrantType\AuthorizationCode as BaseAuthorizationCode;
-use OAuth2\ResponseType\AccessTokenInterface;
-
-/**
- *
- * @author Brent Shaffer <bshafs at gmail dot com>
- */
-class AuthorizationCode extends BaseAuthorizationCode
-{
- public function createAccessToken(AccessTokenInterface $accessToken, $client_id, $user_id, $scope)
- {
- $includeRefreshToken = true;
- if (isset($this->authCode['id_token'])) {
- // OpenID Connect requests include the refresh token only if the
- // offline_access scope has been requested and granted.
- $scopes = explode(' ', trim($scope));
- $includeRefreshToken = in_array('offline_access', $scopes);
- }
-
- $token = $accessToken->createAccessToken($client_id, $user_id, $scope, $includeRefreshToken);
- if (isset($this->authCode['id_token'])) {
- $token['id_token'] = $this->authCode['id_token'];
- }
-
- $this->storage->expireAuthorizationCode($this->authCode['code']);
-
- return $token;
- }
-}
diff --git a/library/oauth2/src/OAuth2/OpenID/ResponseType/AuthorizationCode.php b/library/oauth2/src/OAuth2/OpenID/ResponseType/AuthorizationCode.php
deleted file mode 100644
index 8971954c5..000000000
--- a/library/oauth2/src/OAuth2/OpenID/ResponseType/AuthorizationCode.php
+++ /dev/null
@@ -1,60 +0,0 @@
-<?php
-
-namespace OAuth2\OpenID\ResponseType;
-
-use OAuth2\ResponseType\AuthorizationCode as BaseAuthorizationCode;
-use OAuth2\OpenID\Storage\AuthorizationCodeInterface as AuthorizationCodeStorageInterface;
-
-/**
- *
- * @author Brent Shaffer <bshafs at gmail dot com>
- */
-class AuthorizationCode extends BaseAuthorizationCode implements AuthorizationCodeInterface
-{
- public function __construct(AuthorizationCodeStorageInterface $storage, array $config = array())
- {
- parent::__construct($storage, $config);
- }
-
- public function getAuthorizeResponse($params, $user_id = null)
- {
- // build the URL to redirect to
- $result = array('query' => array());
-
- $params += array('scope' => null, 'state' => null, 'id_token' => null);
-
- $result['query']['code'] = $this->createAuthorizationCode($params['client_id'], $user_id, $params['redirect_uri'], $params['scope'], $params['id_token']);
-
- if (isset($params['state'])) {
- $result['query']['state'] = $params['state'];
- }
-
- return array($params['redirect_uri'], $result);
- }
-
- /**
- * Handle the creation of the authorization code.
- *
- * @param $client_id
- * Client identifier related to the authorization code
- * @param $user_id
- * User ID associated with the authorization code
- * @param $redirect_uri
- * An absolute URI to which the authorization server will redirect the
- * user-agent to when the end-user authorization step is completed.
- * @param $scope
- * (optional) Scopes to be stored in space-separated string.
- * @param $id_token
- * (optional) The OpenID Connect id_token.
- *
- * @see http://tools.ietf.org/html/rfc6749#section-4
- * @ingroup oauth2_section_4
- */
- public function createAuthorizationCode($client_id, $user_id, $redirect_uri, $scope = null, $id_token = null)
- {
- $code = $this->generateAuthorizationCode();
- $this->storage->setAuthorizationCode($code, $client_id, $user_id, $redirect_uri, time() + $this->config['auth_code_lifetime'], $scope, $id_token);
-
- return $code;
- }
-}
diff --git a/library/oauth2/src/OAuth2/OpenID/ResponseType/AuthorizationCodeInterface.php b/library/oauth2/src/OAuth2/OpenID/ResponseType/AuthorizationCodeInterface.php
deleted file mode 100644
index ea4779255..000000000
--- a/library/oauth2/src/OAuth2/OpenID/ResponseType/AuthorizationCodeInterface.php
+++ /dev/null
@@ -1,27 +0,0 @@
-<?php
-
-namespace OAuth2\OpenID\ResponseType;
-
-use OAuth2\ResponseType\AuthorizationCodeInterface as BaseAuthorizationCodeInterface;
-
-/**
- *
- * @author Brent Shaffer <bshafs at gmail dot com>
- */
-interface AuthorizationCodeInterface extends BaseAuthorizationCodeInterface
-{
- /**
- * Handle the creation of the authorization code.
- *
- * @param $client_id Client identifier related to the authorization code
- * @param $user_id User ID associated with the authorization code
- * @param $redirect_uri An absolute URI to which the authorization server will redirect the
- * user-agent to when the end-user authorization step is completed.
- * @param $scope OPTIONAL Scopes to be stored in space-separated string.
- * @param $id_token OPTIONAL The OpenID Connect id_token.
- *
- * @see http://tools.ietf.org/html/rfc6749#section-4
- * @ingroup oauth2_section_4
- */
- public function createAuthorizationCode($client_id, $user_id, $redirect_uri, $scope = null, $id_token = null);
-}
diff --git a/library/oauth2/src/OAuth2/OpenID/ResponseType/CodeIdToken.php b/library/oauth2/src/OAuth2/OpenID/ResponseType/CodeIdToken.php
deleted file mode 100644
index ac7764d6c..000000000
--- a/library/oauth2/src/OAuth2/OpenID/ResponseType/CodeIdToken.php
+++ /dev/null
@@ -1,24 +0,0 @@
-<?php
-
-namespace OAuth2\OpenID\ResponseType;
-
-class CodeIdToken implements CodeIdTokenInterface
-{
- protected $authCode;
- protected $idToken;
-
- public function __construct(AuthorizationCodeInterface $authCode, IdTokenInterface $idToken)
- {
- $this->authCode = $authCode;
- $this->idToken = $idToken;
- }
-
- public function getAuthorizeResponse($params, $user_id = null)
- {
- $result = $this->authCode->getAuthorizeResponse($params, $user_id);
- $resultIdToken = $this->idToken->getAuthorizeResponse($params, $user_id);
- $result[1]['query']['id_token'] = $resultIdToken[1]['fragment']['id_token'];
-
- return $result;
- }
-}
diff --git a/library/oauth2/src/OAuth2/OpenID/ResponseType/CodeIdTokenInterface.php b/library/oauth2/src/OAuth2/OpenID/ResponseType/CodeIdTokenInterface.php
deleted file mode 100644
index 629adcca8..000000000
--- a/library/oauth2/src/OAuth2/OpenID/ResponseType/CodeIdTokenInterface.php
+++ /dev/null
@@ -1,9 +0,0 @@
-<?php
-
-namespace OAuth2\OpenID\ResponseType;
-
-use OAuth2\ResponseType\ResponseTypeInterface;
-
-interface CodeIdTokenInterface extends ResponseTypeInterface
-{
-}
diff --git a/library/oauth2/src/OAuth2/OpenID/ResponseType/IdToken.php b/library/oauth2/src/OAuth2/OpenID/ResponseType/IdToken.php
deleted file mode 100644
index 97777fbf2..000000000
--- a/library/oauth2/src/OAuth2/OpenID/ResponseType/IdToken.php
+++ /dev/null
@@ -1,124 +0,0 @@
-<?php
-
-namespace OAuth2\OpenID\ResponseType;
-
-use OAuth2\Encryption\EncryptionInterface;
-use OAuth2\Encryption\Jwt;
-use OAuth2\Storage\PublicKeyInterface;
-use OAuth2\OpenID\Storage\UserClaimsInterface;
-
-class IdToken implements IdTokenInterface
-{
- protected $userClaimsStorage;
- protected $publicKeyStorage;
- protected $config;
- protected $encryptionUtil;
-
- public function __construct(UserClaimsInterface $userClaimsStorage, PublicKeyInterface $publicKeyStorage, array $config = array(), EncryptionInterface $encryptionUtil = null)
- {
- $this->userClaimsStorage = $userClaimsStorage;
- $this->publicKeyStorage = $publicKeyStorage;
- if (is_null($encryptionUtil)) {
- $encryptionUtil = new Jwt();
- }
- $this->encryptionUtil = $encryptionUtil;
-
- if (!isset($config['issuer'])) {
- throw new \LogicException('config parameter "issuer" must be set');
- }
- $this->config = array_merge(array(
- 'id_lifetime' => 3600,
- ), $config);
- }
-
- public function getAuthorizeResponse($params, $userInfo = null)
- {
- // build the URL to redirect to
- $result = array('query' => array());
- $params += array('scope' => null, 'state' => null, 'nonce' => null);
-
- // create the id token.
- list($user_id, $auth_time) = $this->getUserIdAndAuthTime($userInfo);
- $userClaims = $this->userClaimsStorage->getUserClaims($user_id, $params['scope']);
-
- $id_token = $this->createIdToken($params['client_id'], $userInfo, $params['nonce'], $userClaims, null);
- $result["fragment"] = array('id_token' => $id_token);
- if (isset($params['state'])) {
- $result["fragment"]["state"] = $params['state'];
- }
-
- return array($params['redirect_uri'], $result);
- }
-
- public function createIdToken($client_id, $userInfo, $nonce = null, $userClaims = null, $access_token = null)
- {
- // pull auth_time from user info if supplied
- list($user_id, $auth_time) = $this->getUserIdAndAuthTime($userInfo);
-
- $token = array(
- 'iss' => $this->config['issuer'],
- 'sub' => $user_id,
- 'aud' => $client_id,
- 'iat' => time(),
- 'exp' => time() + $this->config['id_lifetime'],
- 'auth_time' => $auth_time,
- );
-
- if ($nonce) {
- $token['nonce'] = $nonce;
- }
-
- if ($userClaims) {
- $token += $userClaims;
- }
-
- if ($access_token) {
- $token['at_hash'] = $this->createAtHash($access_token, $client_id);
- }
-
- return $this->encodeToken($token, $client_id);
- }
-
- protected function createAtHash($access_token, $client_id = null)
- {
- // maps HS256 and RS256 to sha256, etc.
- $algorithm = $this->publicKeyStorage->getEncryptionAlgorithm($client_id);
- $hash_algorithm = 'sha' . substr($algorithm, 2);
- $hash = hash($hash_algorithm, $access_token, true);
- $at_hash = substr($hash, 0, strlen($hash) / 2);
-
- return $this->encryptionUtil->urlSafeB64Encode($at_hash);
- }
-
- protected function encodeToken(array $token, $client_id = null)
- {
- $private_key = $this->publicKeyStorage->getPrivateKey($client_id);
- $algorithm = $this->publicKeyStorage->getEncryptionAlgorithm($client_id);
-
- return $this->encryptionUtil->encode($token, $private_key, $algorithm);
- }
-
- private function getUserIdAndAuthTime($userInfo)
- {
- $auth_time = null;
-
- // support an array for user_id / auth_time
- if (is_array($userInfo)) {
- if (!isset($userInfo['user_id'])) {
- throw new \LogicException('if $user_id argument is an array, user_id index must be set');
- }
-
- $auth_time = isset($userInfo['auth_time']) ? $userInfo['auth_time'] : null;
- $user_id = $userInfo['user_id'];
- } else {
- $user_id = $userInfo;
- }
-
- if (is_null($auth_time)) {
- $auth_time = time();
- }
-
- // userInfo is a scalar, and so this is the $user_id. Auth Time is null
- return array($user_id, $auth_time);
- }
-}
diff --git a/library/oauth2/src/OAuth2/OpenID/ResponseType/IdTokenInterface.php b/library/oauth2/src/OAuth2/OpenID/ResponseType/IdTokenInterface.php
deleted file mode 100644
index 0bd2f8391..000000000
--- a/library/oauth2/src/OAuth2/OpenID/ResponseType/IdTokenInterface.php
+++ /dev/null
@@ -1,29 +0,0 @@
-<?php
-
-namespace OAuth2\OpenID\ResponseType;
-
-use OAuth2\ResponseType\ResponseTypeInterface;
-
-interface IdTokenInterface extends ResponseTypeInterface
-{
- /**
- * Create the id token.
- *
- * If Authorization Code Flow is used, the id_token is generated when the
- * authorization code is issued, and later returned from the token endpoint
- * together with the access_token.
- * If the Implicit Flow is used, the token and id_token are generated and
- * returned together.
- *
- * @param string $client_id The client id.
- * @param string $user_id The user id.
- * @param string $nonce OPTIONAL The nonce.
- * @param string $userClaims OPTIONAL Claims about the user.
- * @param string $access_token OPTIONAL The access token, if known.
- *
- * @return string The ID Token represented as a JSON Web Token (JWT).
- *
- * @see http://openid.net/specs/openid-connect-core-1_0.html#IDToken
- */
- public function createIdToken($client_id, $userInfo, $nonce = null, $userClaims = null, $access_token = null);
-}
diff --git a/library/oauth2/src/OAuth2/OpenID/ResponseType/IdTokenToken.php b/library/oauth2/src/OAuth2/OpenID/ResponseType/IdTokenToken.php
deleted file mode 100644
index f0c59799b..000000000
--- a/library/oauth2/src/OAuth2/OpenID/ResponseType/IdTokenToken.php
+++ /dev/null
@@ -1,27 +0,0 @@
-<?php
-
-namespace OAuth2\OpenID\ResponseType;
-
-use OAuth2\ResponseType\AccessTokenInterface;
-
-class IdTokenToken implements IdTokenTokenInterface
-{
- protected $accessToken;
- protected $idToken;
-
- public function __construct(AccessTokenInterface $accessToken, IdTokenInterface $idToken)
- {
- $this->accessToken = $accessToken;
- $this->idToken = $idToken;
- }
-
- public function getAuthorizeResponse($params, $user_id = null)
- {
- $result = $this->accessToken->getAuthorizeResponse($params, $user_id);
- $access_token = $result[1]['fragment']['access_token'];
- $id_token = $this->idToken->createIdToken($params['client_id'], $user_id, $params['nonce'], null, $access_token);
- $result[1]['fragment']['id_token'] = $id_token;
-
- return $result;
- }
-}
diff --git a/library/oauth2/src/OAuth2/OpenID/ResponseType/IdTokenTokenInterface.php b/library/oauth2/src/OAuth2/OpenID/ResponseType/IdTokenTokenInterface.php
deleted file mode 100644
index ac13e2032..000000000
--- a/library/oauth2/src/OAuth2/OpenID/ResponseType/IdTokenTokenInterface.php
+++ /dev/null
@@ -1,9 +0,0 @@
-<?php
-
-namespace OAuth2\OpenID\ResponseType;
-
-use OAuth2\ResponseType\ResponseTypeInterface;
-
-interface IdTokenTokenInterface extends ResponseTypeInterface
-{
-}
diff --git a/library/oauth2/src/OAuth2/OpenID/Storage/AuthorizationCodeInterface.php b/library/oauth2/src/OAuth2/OpenID/Storage/AuthorizationCodeInterface.php
deleted file mode 100644
index 51dd867ec..000000000
--- a/library/oauth2/src/OAuth2/OpenID/Storage/AuthorizationCodeInterface.php
+++ /dev/null
@@ -1,37 +0,0 @@
-<?php
-
-namespace OAuth2\OpenID\Storage;
-
-use OAuth2\Storage\AuthorizationCodeInterface as BaseAuthorizationCodeInterface;
-/**
- * Implement this interface to specify where the OAuth2 Server
- * should get/save authorization codes for the "Authorization Code"
- * grant type
- *
- * @author Brent Shaffer <bshafs at gmail dot com>
- */
-interface AuthorizationCodeInterface extends BaseAuthorizationCodeInterface
-{
- /**
- * Take the provided authorization code values and store them somewhere.
- *
- * This function should be the storage counterpart to getAuthCode().
- *
- * If storage fails for some reason, we're not currently checking for
- * any sort of success/failure, so you should bail out of the script
- * and provide a descriptive fail message.
- *
- * Required for OAuth2::GRANT_TYPE_AUTH_CODE.
- *
- * @param $code authorization code to be stored.
- * @param $client_id client identifier to be stored.
- * @param $user_id user identifier to be stored.
- * @param string $redirect_uri redirect URI(s) to be stored in a space-separated string.
- * @param int $expires expiration to be stored as a Unix timestamp.
- * @param string $scope OPTIONAL scopes to be stored in space-separated string.
- * @param string $id_token OPTIONAL the OpenID Connect id_token.
- *
- * @ingroup oauth2_section_4
- */
- public function setAuthorizationCode($code, $client_id, $user_id, $redirect_uri, $expires, $scope = null, $id_token = null);
-}
diff --git a/library/oauth2/src/OAuth2/OpenID/Storage/UserClaimsInterface.php b/library/oauth2/src/OAuth2/OpenID/Storage/UserClaimsInterface.php
deleted file mode 100644
index f230bef9e..000000000
--- a/library/oauth2/src/OAuth2/OpenID/Storage/UserClaimsInterface.php
+++ /dev/null
@@ -1,38 +0,0 @@
-<?php
-
-namespace OAuth2\OpenID\Storage;
-
-/**
- * Implement this interface to specify where the OAuth2 Server
- * should retrieve user claims for the OpenID Connect id_token.
- */
-interface UserClaimsInterface
-{
- // valid scope values to pass into the user claims API call
- const VALID_CLAIMS = 'profile email address phone';
-
- // fields returned for the claims above
- const PROFILE_CLAIM_VALUES = 'name family_name given_name middle_name nickname preferred_username profile picture website gender birthdate zoneinfo locale updated_at';
- const EMAIL_CLAIM_VALUES = 'email email_verified';
- const ADDRESS_CLAIM_VALUES = 'formatted street_address locality region postal_code country';
- const PHONE_CLAIM_VALUES = 'phone_number phone_number_verified';
-
- /**
- * Return claims about the provided user id.
- *
- * Groups of claims are returned based on the requested scopes. No group
- * is required, and no claim is required.
- *
- * @param $user_id
- * The id of the user for which claims should be returned.
- * @param $scope
- * The requested scope.
- * Scopes with matching claims: profile, email, address, phone.
- *
- * @return
- * An array in the claim => value format.
- *
- * @see http://openid.net/specs/openid-connect-core-1_0.html#ScopeClaims
- */
- public function getUserClaims($user_id, $scope);
-}
diff --git a/library/oauth2/src/OAuth2/Request.php b/library/oauth2/src/OAuth2/Request.php
deleted file mode 100644
index c92cee821..000000000
--- a/library/oauth2/src/OAuth2/Request.php
+++ /dev/null
@@ -1,213 +0,0 @@
-<?php
-
-namespace OAuth2;
-
-/**
- * OAuth2\Request
- * This class is taken from the Symfony2 Framework and is part of the Symfony package.
- * See Symfony\Component\HttpFoundation\Request (https://github.com/symfony/symfony)
- */
-class Request implements RequestInterface
-{
- public $attributes;
- public $request;
- public $query;
- public $server;
- public $files;
- public $cookies;
- public $headers;
- public $content;
-
- /**
- * Constructor.
- *
- * @param array $query The GET parameters
- * @param array $request The POST parameters
- * @param array $attributes The request attributes (parameters parsed from the PATH_INFO, ...)
- * @param array $cookies The COOKIE parameters
- * @param array $files The FILES parameters
- * @param array $server The SERVER parameters
- * @param string $content The raw body data
- *
- * @api
- */
- public function __construct(array $query = array(), array $request = array(), array $attributes = array(), array $cookies = array(), array $files = array(), array $server = array(), $content = null, array $headers = null)
- {
- $this->initialize($query, $request, $attributes, $cookies, $files, $server, $content, $headers);
- }
-
- /**
- * Sets the parameters for this request.
- *
- * This method also re-initializes all properties.
- *
- * @param array $query The GET parameters
- * @param array $request The POST parameters
- * @param array $attributes The request attributes (parameters parsed from the PATH_INFO, ...)
- * @param array $cookies The COOKIE parameters
- * @param array $files The FILES parameters
- * @param array $server The SERVER parameters
- * @param string $content The raw body data
- *
- * @api
- */
- public function initialize(array $query = array(), array $request = array(), array $attributes = array(), array $cookies = array(), array $files = array(), array $server = array(), $content = null, array $headers = null)
- {
- $this->request = $request;
- $this->query = $query;
- $this->attributes = $attributes;
- $this->cookies = $cookies;
- $this->files = $files;
- $this->server = $server;
- $this->content = $content;
- $this->headers = is_null($headers) ? $this->getHeadersFromServer($this->server) : $headers;
- }
-
- public function query($name, $default = null)
- {
- return isset($this->query[$name]) ? $this->query[$name] : $default;
- }
-
- public function request($name, $default = null)
- {
- return isset($this->request[$name]) ? $this->request[$name] : $default;
- }
-
- public function server($name, $default = null)
- {
- return isset($this->server[$name]) ? $this->server[$name] : $default;
- }
-
- public function headers($name, $default = null)
- {
- $headers = array_change_key_case($this->headers);
- $name = strtolower($name);
-
- return isset($headers[$name]) ? $headers[$name] : $default;
- }
-
- public function getAllQueryParameters()
- {
- return $this->query;
- }
-
- /**
- * Returns the request body content.
- *
- * @param Boolean $asResource If true, a resource will be returned
- *
- * @return string|resource The request body content or a resource to read the body stream.
- */
- public function getContent($asResource = false)
- {
- if (false === $this->content || (true === $asResource && null !== $this->content)) {
- throw new \LogicException('getContent() can only be called once when using the resource return type.');
- }
-
- if (true === $asResource) {
- $this->content = false;
-
- return fopen('php://input', 'rb');
- }
-
- if (null === $this->content) {
- $this->content = file_get_contents('php://input');
- }
-
- return $this->content;
- }
-
- private function getHeadersFromServer($server)
- {
- $headers = array();
- foreach ($server as $key => $value) {
- if (0 === strpos($key, 'HTTP_')) {
- $headers[substr($key, 5)] = $value;
- }
- // CONTENT_* are not prefixed with HTTP_
- elseif (in_array($key, array('CONTENT_LENGTH', 'CONTENT_MD5', 'CONTENT_TYPE'))) {
- $headers[$key] = $value;
- }
- }
-
- if (isset($server['PHP_AUTH_USER'])) {
- $headers['PHP_AUTH_USER'] = $server['PHP_AUTH_USER'];
- $headers['PHP_AUTH_PW'] = isset($server['PHP_AUTH_PW']) ? $server['PHP_AUTH_PW'] : '';
- } else {
- /*
- * php-cgi under Apache does not pass HTTP Basic user/pass to PHP by default
- * For this workaround to work, add this line to your .htaccess file:
- * RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
- *
- * A sample .htaccess file:
- * RewriteEngine On
- * RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
- * RewriteCond %{REQUEST_FILENAME} !-f
- * RewriteRule ^(.*)$ app.php [QSA,L]
- */
-
- $authorizationHeader = null;
- if (isset($server['HTTP_AUTHORIZATION'])) {
- $authorizationHeader = $server['HTTP_AUTHORIZATION'];
- } elseif (isset($server['REDIRECT_HTTP_AUTHORIZATION'])) {
- $authorizationHeader = $server['REDIRECT_HTTP_AUTHORIZATION'];
- } elseif (function_exists('apache_request_headers')) {
- $requestHeaders = (array) apache_request_headers();
-
- // Server-side fix for bug in old Android versions (a nice side-effect of this fix means we don't care about capitalization for Authorization)
- $requestHeaders = array_combine(array_map('ucwords', array_keys($requestHeaders)), array_values($requestHeaders));
-
- if (isset($requestHeaders['Authorization'])) {
- $authorizationHeader = trim($requestHeaders['Authorization']);
- }
- }
-
- if (null !== $authorizationHeader) {
- $headers['AUTHORIZATION'] = $authorizationHeader;
- // Decode AUTHORIZATION header into PHP_AUTH_USER and PHP_AUTH_PW when authorization header is basic
- if (0 === stripos($authorizationHeader, 'basic')) {
- $exploded = explode(':', base64_decode(substr($authorizationHeader, 6)));
- if (count($exploded) == 2) {
- list($headers['PHP_AUTH_USER'], $headers['PHP_AUTH_PW']) = $exploded;
- }
- }
- }
- }
-
- // PHP_AUTH_USER/PHP_AUTH_PW
- if (isset($headers['PHP_AUTH_USER'])) {
- $headers['AUTHORIZATION'] = 'Basic '.base64_encode($headers['PHP_AUTH_USER'].':'.$headers['PHP_AUTH_PW']);
- }
-
- return $headers;
- }
-
- /**
- * Creates a new request with values from PHP's super globals.
- *
- * @return Request A new request
- *
- * @api
- */
- public static function createFromGlobals()
- {
- $class = get_called_class();
- $request = new $class($_GET, $_POST, array(), $_COOKIE, $_FILES, $_SERVER);
-
- $contentType = $request->server('CONTENT_TYPE', '');
- $requestMethod = $request->server('REQUEST_METHOD', 'GET');
- if (0 === strpos($contentType, 'application/x-www-form-urlencoded')
- && in_array(strtoupper($requestMethod), array('PUT', 'DELETE'))
- ) {
- parse_str($request->getContent(), $data);
- $request->request = $data;
- } elseif (0 === strpos($contentType, 'application/json')
- && in_array(strtoupper($requestMethod), array('POST', 'PUT', 'DELETE'))
- ) {
- $data = json_decode($request->getContent(), true);
- $request->request = $data;
- }
-
- return $request;
- }
-}
diff --git a/library/oauth2/src/OAuth2/RequestInterface.php b/library/oauth2/src/OAuth2/RequestInterface.php
deleted file mode 100644
index 8a70d5fad..000000000
--- a/library/oauth2/src/OAuth2/RequestInterface.php
+++ /dev/null
@@ -1,16 +0,0 @@
-<?php
-
-namespace OAuth2;
-
-interface RequestInterface
-{
- public function query($name, $default = null);
-
- public function request($name, $default = null);
-
- public function server($name, $default = null);
-
- public function headers($name, $default = null);
-
- public function getAllQueryParameters();
-}
diff --git a/library/oauth2/src/OAuth2/Response.php b/library/oauth2/src/OAuth2/Response.php
deleted file mode 100644
index d8eabe79e..000000000
--- a/library/oauth2/src/OAuth2/Response.php
+++ /dev/null
@@ -1,369 +0,0 @@
-<?php
-
-namespace OAuth2;
-
-/**
- * Class to handle OAuth2 Responses in a graceful way. Use this interface
- * to output the proper OAuth2 responses.
- *
- * @see OAuth2\ResponseInterface
- *
- * This class borrows heavily from the Symfony2 Framework and is part of the symfony package
- * @see Symfony\Component\HttpFoundation\Request (https://github.com/symfony/symfony)
- */
-class Response implements ResponseInterface
-{
- public $version;
- protected $statusCode = 200;
- protected $statusText;
- protected $parameters = array();
- protected $httpHeaders = array();
-
- public static $statusTexts = array(
- 100 => 'Continue',
- 101 => 'Switching Protocols',
- 200 => 'OK',
- 201 => 'Created',
- 202 => 'Accepted',
- 203 => 'Non-Authoritative Information',
- 204 => 'No Content',
- 205 => 'Reset Content',
- 206 => 'Partial Content',
- 300 => 'Multiple Choices',
- 301 => 'Moved Permanently',
- 302 => 'Found',
- 303 => 'See Other',
- 304 => 'Not Modified',
- 305 => 'Use Proxy',
- 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',
- 500 => 'Internal Server Error',
- 501 => 'Not Implemented',
- 502 => 'Bad Gateway',
- 503 => 'Service Unavailable',
- 504 => 'Gateway Timeout',
- 505 => 'HTTP Version Not Supported',
- );
-
- public function __construct($parameters = array(), $statusCode = 200, $headers = array())
- {
- $this->setParameters($parameters);
- $this->setStatusCode($statusCode);
- $this->setHttpHeaders($headers);
- $this->version = '1.1';
- }
-
- /**
- * Converts the response object to string containing all headers and the response content.
- *
- * @return string The response with headers and content
- */
- public function __toString()
- {
- $headers = array();
- foreach ($this->httpHeaders as $name => $value) {
- $headers[$name] = (array) $value;
- }
-
- return
- sprintf('HTTP/%s %s %s', $this->version, $this->statusCode, $this->statusText)."\r\n".
- $this->getHttpHeadersAsString($headers)."\r\n".
- $this->getResponseBody();
- }
-
- /**
- * Returns the build header line.
- *
- * @param string $name The header name
- * @param string $value The header value
- *
- * @return string The built header line
- */
- protected function buildHeader($name, $value)
- {
- return sprintf("%s: %s\n", $name, $value);
- }
-
- public function getStatusCode()
- {
- return $this->statusCode;
- }
-
- public function setStatusCode($statusCode, $text = null)
- {
- $this->statusCode = (int) $statusCode;
- if ($this->isInvalid()) {
- throw new \InvalidArgumentException(sprintf('The HTTP status code "%s" is not valid.', $statusCode));
- }
-
- $this->statusText = false === $text ? '' : (null === $text ? self::$statusTexts[$this->statusCode] : $text);
- }
-
- public function getStatusText()
- {
- return $this->statusText;
- }
-
- public function getParameters()
- {
- return $this->parameters;
- }
-
- public function setParameters(array $parameters)
- {
- $this->parameters = $parameters;
- }
-
- public function addParameters(array $parameters)
- {
- $this->parameters = array_merge($this->parameters, $parameters);
- }
-
- public function getParameter($name, $default = null)
- {
- return isset($this->parameters[$name]) ? $this->parameters[$name] : $default;
- }
-
- public function setParameter($name, $value)
- {
- $this->parameters[$name] = $value;
- }
-
- public function setHttpHeaders(array $httpHeaders)
- {
- $this->httpHeaders = $httpHeaders;
- }
-
- public function setHttpHeader($name, $value)
- {
- $this->httpHeaders[$name] = $value;
- }
-
- public function addHttpHeaders(array $httpHeaders)
- {
- $this->httpHeaders = array_merge($this->httpHeaders, $httpHeaders);
- }
-
- public function getHttpHeaders()
- {
- return $this->httpHeaders;
- }
-
- public function getHttpHeader($name, $default = null)
- {
- return isset($this->httpHeaders[$name]) ? $this->httpHeaders[$name] : $default;
- }
-
- public function getResponseBody($format = 'json')
- {
- switch ($format) {
- case 'json':
- return json_encode($this->parameters);
- case 'xml':
- // this only works for single-level arrays
- $xml = new \SimpleXMLElement('<response/>');
- foreach ($this->parameters as $key => $param) {
- $xml->addChild($key, $param);
- }
-
- return $xml->asXML();
- }
-
- throw new \InvalidArgumentException(sprintf('The format %s is not supported', $format));
-
- }
-
- public function send($format = 'json')
- {
- // headers have already been sent by the developer
- if (headers_sent()) {
- return;
- }
-
- switch ($format) {
- case 'json':
- $this->setHttpHeader('Content-Type', 'application/json');
- break;
- case 'xml':
- $this->setHttpHeader('Content-Type', 'text/xml');
- break;
- }
- // status
- header(sprintf('HTTP/%s %s %s', $this->version, $this->statusCode, $this->statusText));
-
- foreach ($this->getHttpHeaders() as $name => $header) {
- header(sprintf('%s: %s', $name, $header));
- }
- echo $this->getResponseBody($format);
- }
-
- public function setError($statusCode, $error, $errorDescription = null, $errorUri = null)
- {
- $parameters = array(
- 'error' => $error,
- 'error_description' => $errorDescription,
- );
-
- if (!is_null($errorUri)) {
- if (strlen($errorUri) > 0 && $errorUri[0] == '#') {
- // we are referencing an oauth bookmark (for brevity)
- $errorUri = 'http://tools.ietf.org/html/rfc6749' . $errorUri;
- }
- $parameters['error_uri'] = $errorUri;
- }
-
- $httpHeaders = array(
- 'Cache-Control' => 'no-store'
- );
-
- $this->setStatusCode($statusCode);
- $this->addParameters($parameters);
- $this->addHttpHeaders($httpHeaders);
-
- if (!$this->isClientError() && !$this->isServerError()) {
- throw new \InvalidArgumentException(sprintf('The HTTP status code is not an error ("%s" given).', $statusCode));
- }
- }
-
- public function setRedirect($statusCode, $url, $state = null, $error = null, $errorDescription = null, $errorUri = null)
- {
- if (empty($url)) {
- throw new \InvalidArgumentException('Cannot redirect to an empty URL.');
- }
-
- $parameters = array();
-
- if (!is_null($state)) {
- $parameters['state'] = $state;
- }
-
- if (!is_null($error)) {
- $this->setError(400, $error, $errorDescription, $errorUri);
- }
- $this->setStatusCode($statusCode);
- $this->addParameters($parameters);
-
- if (count($this->parameters) > 0) {
- // add parameters to URL redirection
- $parts = parse_url($url);
- $sep = isset($parts['query']) && count($parts['query']) > 0 ? '&' : '?';
- $url .= $sep . http_build_query($this->parameters);
- }
-
- $this->addHttpHeaders(array('Location' => $url));
-
- if (!$this->isRedirection()) {
- throw new \InvalidArgumentException(sprintf('The HTTP status code is not a redirect ("%s" given).', $statusCode));
- }
- }
-
- // http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html
- /**
- * @return Boolean
- *
- * @api
- */
- public function isInvalid()
- {
- return $this->statusCode < 100 || $this->statusCode >= 600;
- }
-
- /**
- * @return Boolean
- *
- * @api
- */
- public function isInformational()
- {
- return $this->statusCode >= 100 && $this->statusCode < 200;
- }
-
- /**
- * @return Boolean
- *
- * @api
- */
- public function isSuccessful()
- {
- return $this->statusCode >= 200 && $this->statusCode < 300;
- }
-
- /**
- * @return Boolean
- *
- * @api
- */
- public function isRedirection()
- {
- return $this->statusCode >= 300 && $this->statusCode < 400;
- }
-
- /**
- * @return Boolean
- *
- * @api
- */
- public function isClientError()
- {
- return $this->statusCode >= 400 && $this->statusCode < 500;
- }
-
- /**
- * @return Boolean
- *
- * @api
- */
- public function isServerError()
- {
- return $this->statusCode >= 500 && $this->statusCode < 600;
- }
-
- /*
- * Functions from Symfony2 HttpFoundation - output pretty header
- */
- private function getHttpHeadersAsString($headers)
- {
- if (count($headers) == 0) {
- return '';
- }
-
- $max = max(array_map('strlen', array_keys($headers))) + 1;
- $content = '';
- ksort($headers);
- foreach ($headers as $name => $values) {
- foreach ($values as $value) {
- $content .= sprintf("%-{$max}s %s\r\n", $this->beautifyHeaderName($name).':', $value);
- }
- }
-
- return $content;
- }
-
- private function beautifyHeaderName($name)
- {
- return preg_replace_callback('/\-(.)/', array($this, 'beautifyCallback'), ucfirst($name));
- }
-
- private function beautifyCallback($match)
- {
- return '-'.strtoupper($match[1]);
- }
-}
diff --git a/library/oauth2/src/OAuth2/ResponseInterface.php b/library/oauth2/src/OAuth2/ResponseInterface.php
deleted file mode 100644
index c99b5f7d1..000000000
--- a/library/oauth2/src/OAuth2/ResponseInterface.php
+++ /dev/null
@@ -1,24 +0,0 @@
-<?php
-
-namespace OAuth2;
-
-/**
- * Interface which represents an object response. Meant to handle and display the proper OAuth2 Responses
- * for errors and successes
- *
- * @see OAuth2\Response
- */
-interface ResponseInterface
-{
- public function addParameters(array $parameters);
-
- public function addHttpHeaders(array $httpHeaders);
-
- public function setStatusCode($statusCode);
-
- public function setError($statusCode, $name, $description = null, $uri = null);
-
- public function setRedirect($statusCode, $url, $state = null, $error = null, $errorDescription = null, $errorUri = null);
-
- public function getParameter($name);
-}
diff --git a/library/oauth2/src/OAuth2/ResponseType/AccessToken.php b/library/oauth2/src/OAuth2/ResponseType/AccessToken.php
deleted file mode 100644
index b235ad0c5..000000000
--- a/library/oauth2/src/OAuth2/ResponseType/AccessToken.php
+++ /dev/null
@@ -1,194 +0,0 @@
-<?php
-
-namespace OAuth2\ResponseType;
-
-use OAuth2\Storage\AccessTokenInterface as AccessTokenStorageInterface;
-use OAuth2\Storage\RefreshTokenInterface;
-
-/**
- *
- * @author Brent Shaffer <bshafs at gmail dot com>
- */
-class AccessToken implements AccessTokenInterface
-{
- protected $tokenStorage;
- protected $refreshStorage;
- protected $config;
-
- /**
- * @param OAuth2\Storage\AccessTokenInterface $tokenStorage REQUIRED Storage class for saving access token information
- * @param OAuth2\Storage\RefreshTokenInterface $refreshStorage OPTIONAL Storage class for saving refresh token information
- * @param array $config OPTIONAL Configuration options for the server
- * <code>
- * $config = array(
- * 'token_type' => 'bearer', // token type identifier
- * 'access_lifetime' => 3600, // time before access token expires
- * 'refresh_token_lifetime' => 1209600, // time before refresh token expires
- * );
- * </endcode>
- */
- public function __construct(AccessTokenStorageInterface $tokenStorage, RefreshTokenInterface $refreshStorage = null, array $config = array())
- {
- $this->tokenStorage = $tokenStorage;
- $this->refreshStorage = $refreshStorage;
-
- $this->config = array_merge(array(
- 'token_type' => 'bearer',
- 'access_lifetime' => 3600,
- 'refresh_token_lifetime' => 1209600,
- ), $config);
- }
-
- public function getAuthorizeResponse($params, $user_id = null)
- {
- // build the URL to redirect to
- $result = array('query' => array());
-
- $params += array('scope' => null, 'state' => null);
-
- /*
- * a refresh token MUST NOT be included in the fragment
- *
- * @see http://tools.ietf.org/html/rfc6749#section-4.2.2
- */
- $includeRefreshToken = false;
- $result["fragment"] = $this->createAccessToken($params['client_id'], $user_id, $params['scope'], $includeRefreshToken);
-
- if (isset($params['state'])) {
- $result["fragment"]["state"] = $params['state'];
- }
-
- return array($params['redirect_uri'], $result);
- }
-
- /**
- * Handle the creation of access token, also issue refresh token if supported / desirable.
- *
- * @param $client_id client identifier related to the access token.
- * @param $user_id user ID associated with the access token
- * @param $scope OPTIONAL scopes to be stored in space-separated string.
- * @param bool $includeRefreshToken if true, a new refresh_token will be added to the response
- *
- * @see http://tools.ietf.org/html/rfc6749#section-5
- * @ingroup oauth2_section_5
- */
- public function createAccessToken($client_id, $user_id, $scope = null, $includeRefreshToken = true)
- {
- $token = array(
- "access_token" => $this->generateAccessToken(),
- "expires_in" => $this->config['access_lifetime'],
- "token_type" => $this->config['token_type'],
- "scope" => $scope
- );
-
- $this->tokenStorage->setAccessToken($token["access_token"], $client_id, $user_id, $this->config['access_lifetime'] ? time() + $this->config['access_lifetime'] : null, $scope);
-
- /*
- * Issue a refresh token also, if we support them
- *
- * Refresh Tokens are considered supported if an instance of OAuth2\Storage\RefreshTokenInterface
- * is supplied in the constructor
- */
- if ($includeRefreshToken && $this->refreshStorage) {
- $token["refresh_token"] = $this->generateRefreshToken();
- $expires = 0;
- if ($this->config['refresh_token_lifetime'] > 0) {
- $expires = time() + $this->config['refresh_token_lifetime'];
- }
- $this->refreshStorage->setRefreshToken($token['refresh_token'], $client_id, $user_id, $expires, $scope);
- }
-
- return $token;
- }
-
- /**
- * Generates an unique access token.
- *
- * Implementing classes may want to override this function to implement
- * other access token generation schemes.
- *
- * @return
- * An unique access token.
- *
- * @ingroup oauth2_section_4
- */
- protected function generateAccessToken()
- {
- if (function_exists('mcrypt_create_iv')) {
- $randomData = mcrypt_create_iv(20, MCRYPT_DEV_URANDOM);
- if ($randomData !== false && strlen($randomData) === 20) {
- return bin2hex($randomData);
- }
- }
- if (function_exists('openssl_random_pseudo_bytes')) {
- $randomData = openssl_random_pseudo_bytes(20);
- if ($randomData !== false && strlen($randomData) === 20) {
- return bin2hex($randomData);
- }
- }
- if (@file_exists('/dev/urandom')) { // Get 100 bytes of random data
- $randomData = file_get_contents('/dev/urandom', false, null, 0, 20);
- if ($randomData !== false && strlen($randomData) === 20) {
- return bin2hex($randomData);
- }
- }
- // Last resort which you probably should just get rid of:
- $randomData = mt_rand() . mt_rand() . mt_rand() . mt_rand() . microtime(true) . uniqid(mt_rand(), true);
-
- return substr(hash('sha512', $randomData), 0, 40);
- }
-
- /**
- * Generates an unique refresh token
- *
- * Implementing classes may want to override this function to implement
- * other refresh token generation schemes.
- *
- * @return
- * An unique refresh.
- *
- * @ingroup oauth2_section_4
- * @see OAuth2::generateAccessToken()
- */
- protected function generateRefreshToken()
- {
- return $this->generateAccessToken(); // let's reuse the same scheme for token generation
- }
-
- /**
- * Handle the revoking of refresh tokens, and access tokens if supported / desirable
- * RFC7009 specifies that "If the server is unable to locate the token using
- * the given hint, it MUST extend its search across all of its supported token types"
- *
- * @param $token
- * @param null $tokenTypeHint
- * @return boolean
- */
- public function revokeToken($token, $tokenTypeHint = null)
- {
- if ($tokenTypeHint == 'refresh_token') {
- if ($this->refreshStorage && $revoked = $this->refreshStorage->unsetRefreshToken($token)) {
- return true;
- }
- }
-
- /** @TODO remove in v2 */
- if (!method_exists($this->tokenStorage, 'unsetAccessToken')) {
- throw new \RuntimeException(
- sprintf('Token storage %s must implement unsetAccessToken method', get_class($this->tokenStorage)
- ));
- }
-
- $revoked = $this->tokenStorage->unsetAccessToken($token);
-
- // if a typehint is supplied and fails, try other storages
- // @see https://tools.ietf.org/html/rfc7009#section-2.1
- if (!$revoked && $tokenTypeHint != 'refresh_token') {
- if ($this->refreshStorage) {
- $revoked = $this->refreshStorage->unsetRefreshToken($token);
- }
- }
-
- return $revoked;
- }
-}
diff --git a/library/oauth2/src/OAuth2/ResponseType/AccessTokenInterface.php b/library/oauth2/src/OAuth2/ResponseType/AccessTokenInterface.php
deleted file mode 100644
index 4bd3928d8..000000000
--- a/library/oauth2/src/OAuth2/ResponseType/AccessTokenInterface.php
+++ /dev/null
@@ -1,34 +0,0 @@
-<?php
-
-namespace OAuth2\ResponseType;
-
-/**
- *
- * @author Brent Shaffer <bshafs at gmail dot com>
- */
-interface AccessTokenInterface extends ResponseTypeInterface
-{
- /**
- * Handle the creation of access token, also issue refresh token if supported / desirable.
- *
- * @param $client_id client identifier related to the access token.
- * @param $user_id user ID associated with the access token
- * @param $scope OPTONAL scopes to be stored in space-separated string.
- * @param bool $includeRefreshToken if true, a new refresh_token will be added to the response
- *
- * @see http://tools.ietf.org/html/rfc6749#section-5
- * @ingroup oauth2_section_5
- */
- public function createAccessToken($client_id, $user_id, $scope = null, $includeRefreshToken = true);
-
- /**
- * Handle the revoking of refresh tokens, and access tokens if supported / desirable
- *
- * @param $token
- * @param $tokenTypeHint
- * @return mixed
- *
- * @todo v2.0 include this method in interface. Omitted to maintain BC in v1.x
- */
- //public function revokeToken($token, $tokenTypeHint);
-}
diff --git a/library/oauth2/src/OAuth2/ResponseType/AuthorizationCode.php b/library/oauth2/src/OAuth2/ResponseType/AuthorizationCode.php
deleted file mode 100644
index 6a305fd75..000000000
--- a/library/oauth2/src/OAuth2/ResponseType/AuthorizationCode.php
+++ /dev/null
@@ -1,100 +0,0 @@
-<?php
-
-namespace OAuth2\ResponseType;
-
-use OAuth2\Storage\AuthorizationCodeInterface as AuthorizationCodeStorageInterface;
-
-/**
- *
- * @author Brent Shaffer <bshafs at gmail dot com>
- */
-class AuthorizationCode implements AuthorizationCodeInterface
-{
- protected $storage;
- protected $config;
-
- public function __construct(AuthorizationCodeStorageInterface $storage, array $config = array())
- {
- $this->storage = $storage;
- $this->config = array_merge(array(
- 'enforce_redirect' => false,
- 'auth_code_lifetime' => 30,
- ), $config);
- }
-
- public function getAuthorizeResponse($params, $user_id = null)
- {
- // build the URL to redirect to
- $result = array('query' => array());
-
- $params += array('scope' => null, 'state' => null);
-
- $result['query']['code'] = $this->createAuthorizationCode($params['client_id'], $user_id, $params['redirect_uri'], $params['scope']);
-
- if (isset($params['state'])) {
- $result['query']['state'] = $params['state'];
- }
-
- return array($params['redirect_uri'], $result);
- }
-
- /**
- * Handle the creation of the authorization code.
- *
- * @param $client_id
- * Client identifier related to the authorization code
- * @param $user_id
- * User ID associated with the authorization code
- * @param $redirect_uri
- * An absolute URI to which the authorization server will redirect the
- * user-agent to when the end-user authorization step is completed.
- * @param $scope
- * (optional) Scopes to be stored in space-separated string.
- *
- * @see http://tools.ietf.org/html/rfc6749#section-4
- * @ingroup oauth2_section_4
- */
- public function createAuthorizationCode($client_id, $user_id, $redirect_uri, $scope = null)
- {
- $code = $this->generateAuthorizationCode();
- $this->storage->setAuthorizationCode($code, $client_id, $user_id, $redirect_uri, time() + $this->config['auth_code_lifetime'], $scope);
-
- return $code;
- }
-
- /**
- * @return
- * TRUE if the grant type requires a redirect_uri, FALSE if not
- */
- public function enforceRedirect()
- {
- return $this->config['enforce_redirect'];
- }
-
- /**
- * Generates an unique auth code.
- *
- * Implementing classes may want to override this function to implement
- * other auth code generation schemes.
- *
- * @return
- * An unique auth code.
- *
- * @ingroup oauth2_section_4
- */
- protected function generateAuthorizationCode()
- {
- $tokenLen = 40;
- if (function_exists('mcrypt_create_iv')) {
- $randomData = mcrypt_create_iv(100, MCRYPT_DEV_URANDOM);
- } elseif (function_exists('openssl_random_pseudo_bytes')) {
- $randomData = openssl_random_pseudo_bytes(100);
- } elseif (@file_exists('/dev/urandom')) { // Get 100 bytes of random data
- $randomData = file_get_contents('/dev/urandom', false, null, 0, 100) . uniqid(mt_rand(), true);
- } else {
- $randomData = mt_rand() . mt_rand() . mt_rand() . mt_rand() . microtime(true) . uniqid(mt_rand(), true);
- }
-
- return substr(hash('sha512', $randomData), 0, $tokenLen);
- }
-}
diff --git a/library/oauth2/src/OAuth2/ResponseType/AuthorizationCodeInterface.php b/library/oauth2/src/OAuth2/ResponseType/AuthorizationCodeInterface.php
deleted file mode 100644
index df777e221..000000000
--- a/library/oauth2/src/OAuth2/ResponseType/AuthorizationCodeInterface.php
+++ /dev/null
@@ -1,30 +0,0 @@
-<?php
-
-namespace OAuth2\ResponseType;
-
-/**
- *
- * @author Brent Shaffer <bshafs at gmail dot com>
- */
-interface AuthorizationCodeInterface extends ResponseTypeInterface
-{
- /**
- * @return
- * TRUE if the grant type requires a redirect_uri, FALSE if not
- */
- public function enforceRedirect();
-
- /**
- * Handle the creation of the authorization code.
- *
- * @param $client_id client identifier related to the authorization code
- * @param $user_id user id associated with the authorization code
- * @param $redirect_uri an absolute URI to which the authorization server will redirect the
- * user-agent to when the end-user authorization step is completed.
- * @param $scope OPTIONAL scopes to be stored in space-separated string.
- *
- * @see http://tools.ietf.org/html/rfc6749#section-4
- * @ingroup oauth2_section_4
- */
- public function createAuthorizationCode($client_id, $user_id, $redirect_uri, $scope = null);
-}
diff --git a/library/oauth2/src/OAuth2/ResponseType/JwtAccessToken.php b/library/oauth2/src/OAuth2/ResponseType/JwtAccessToken.php
deleted file mode 100644
index 3942fe41e..000000000
--- a/library/oauth2/src/OAuth2/ResponseType/JwtAccessToken.php
+++ /dev/null
@@ -1,124 +0,0 @@
-<?php
-
-namespace OAuth2\ResponseType;
-
-use OAuth2\Encryption\EncryptionInterface;
-use OAuth2\Encryption\Jwt;
-use OAuth2\Storage\AccessTokenInterface as AccessTokenStorageInterface;
-use OAuth2\Storage\RefreshTokenInterface;
-use OAuth2\Storage\PublicKeyInterface;
-use OAuth2\Storage\Memory;
-
-/**
- *
- * @author Brent Shaffer <bshafs at gmail dot com>
- */
-class JwtAccessToken extends AccessToken
-{
- protected $publicKeyStorage;
- protected $encryptionUtil;
-
- /**
- * @param $config
- * - store_encrypted_token_string (bool true)
- * whether the entire encrypted string is stored,
- * or just the token ID is stored
- */
- public function __construct(PublicKeyInterface $publicKeyStorage = null, AccessTokenStorageInterface $tokenStorage = null, RefreshTokenInterface $refreshStorage = null, array $config = array(), EncryptionInterface $encryptionUtil = null)
- {
- $this->publicKeyStorage = $publicKeyStorage;
- $config = array_merge(array(
- 'store_encrypted_token_string' => true,
- 'issuer' => ''
- ), $config);
- if (is_null($tokenStorage)) {
- // a pass-thru, so we can call the parent constructor
- $tokenStorage = new Memory();
- }
- if (is_null($encryptionUtil)) {
- $encryptionUtil = new Jwt();
- }
- $this->encryptionUtil = $encryptionUtil;
- parent::__construct($tokenStorage, $refreshStorage, $config);
- }
-
- /**
- * Handle the creation of access token, also issue refresh token if supported / desirable.
- *
- * @param $client_id
- * Client identifier related to the access token.
- * @param $user_id
- * User ID associated with the access token
- * @param $scope
- * (optional) Scopes to be stored in space-separated string.
- * @param bool $includeRefreshToken
- * If true, a new refresh_token will be added to the response
- *
- * @see http://tools.ietf.org/html/rfc6749#section-5
- * @ingroup oauth2_section_5
- */
- public function createAccessToken($client_id, $user_id, $scope = null, $includeRefreshToken = true)
- {
- // token to encrypt
- $expires = time() + $this->config['access_lifetime'];
- $id = $this->generateAccessToken();
- $jwtAccessToken = array(
- 'id' => $id, // for BC (see #591)
- 'jti' => $id,
- 'iss' => $this->config['issuer'],
- 'aud' => $client_id,
- 'sub' => $user_id,
- 'exp' => $expires,
- 'iat' => time(),
- 'token_type' => $this->config['token_type'],
- 'scope' => $scope
- );
-
- /*
- * Encode the token data into a single access_token string
- */
- $access_token = $this->encodeToken($jwtAccessToken, $client_id);
-
- /*
- * Save the token to a secondary storage. This is implemented on the
- * OAuth2\Storage\JwtAccessToken side, and will not actually store anything,
- * if no secondary storage has been supplied
- */
- $token_to_store = $this->config['store_encrypted_token_string'] ? $access_token : $jwtAccessToken['id'];
- $this->tokenStorage->setAccessToken($token_to_store, $client_id, $user_id, $this->config['access_lifetime'] ? time() + $this->config['access_lifetime'] : null, $scope);
-
- // token to return to the client
- $token = array(
- 'access_token' => $access_token,
- 'expires_in' => $this->config['access_lifetime'],
- 'token_type' => $this->config['token_type'],
- 'scope' => $scope
- );
-
- /*
- * Issue a refresh token also, if we support them
- *
- * Refresh Tokens are considered supported if an instance of OAuth2\Storage\RefreshTokenInterface
- * is supplied in the constructor
- */
- if ($includeRefreshToken && $this->refreshStorage) {
- $refresh_token = $this->generateRefreshToken();
- $expires = 0;
- if ($this->config['refresh_token_lifetime'] > 0) {
- $expires = time() + $this->config['refresh_token_lifetime'];
- }
- $this->refreshStorage->setRefreshToken($refresh_token, $client_id, $user_id, $expires, $scope);
- $token['refresh_token'] = $refresh_token;
- }
-
- return $token;
- }
-
- protected function encodeToken(array $token, $client_id = null)
- {
- $private_key = $this->publicKeyStorage->getPrivateKey($client_id);
- $algorithm = $this->publicKeyStorage->getEncryptionAlgorithm($client_id);
-
- return $this->encryptionUtil->encode($token, $private_key, $algorithm);
- }
-}
diff --git a/library/oauth2/src/OAuth2/ResponseType/ResponseTypeInterface.php b/library/oauth2/src/OAuth2/ResponseType/ResponseTypeInterface.php
deleted file mode 100644
index f8e26a5b0..000000000
--- a/library/oauth2/src/OAuth2/ResponseType/ResponseTypeInterface.php
+++ /dev/null
@@ -1,8 +0,0 @@
-<?php
-
-namespace OAuth2\ResponseType;
-
-interface ResponseTypeInterface
-{
- public function getAuthorizeResponse($params, $user_id = null);
-}
diff --git a/library/oauth2/src/OAuth2/Scope.php b/library/oauth2/src/OAuth2/Scope.php
deleted file mode 100644
index c44350bfd..000000000
--- a/library/oauth2/src/OAuth2/Scope.php
+++ /dev/null
@@ -1,103 +0,0 @@
-<?php
-
-namespace OAuth2;
-
-use OAuth2\Storage\Memory;
-use OAuth2\Storage\ScopeInterface as ScopeStorageInterface;
-
-/**
-* @see OAuth2\ScopeInterface
-*/
-class Scope implements ScopeInterface
-{
- protected $storage;
-
- /**
- * @param mixed @storage
- * Either an array of supported scopes, or an instance of OAuth2\Storage\ScopeInterface
- */
- public function __construct($storage = null)
- {
- if (is_null($storage) || is_array($storage)) {
- $storage = new Memory((array) $storage);
- }
-
- if (!$storage instanceof ScopeStorageInterface) {
- throw new \InvalidArgumentException("Argument 1 to OAuth2\Scope must be null, an array, or instance of OAuth2\Storage\ScopeInterface");
- }
-
- $this->storage = $storage;
- }
-
- /**
- * Check if everything in required scope is contained in available scope.
- *
- * @param $required_scope
- * A space-separated string of scopes.
- *
- * @return
- * TRUE if everything in required scope is contained in available scope,
- * and FALSE if it isn't.
- *
- * @see http://tools.ietf.org/html/rfc6749#section-7
- *
- * @ingroup oauth2_section_7
- */
- public function checkScope($required_scope, $available_scope)
- {
- $required_scope = explode(' ', trim($required_scope));
- $available_scope = explode(' ', trim($available_scope));
-
- return (count(array_diff($required_scope, $available_scope)) == 0);
- }
-
- /**
- * Check if the provided scope exists in storage.
- *
- * @param $scope
- * A space-separated string of scopes.
- *
- * @return
- * TRUE if it exists, FALSE otherwise.
- */
- public function scopeExists($scope)
- {
- // Check reserved scopes first.
- $scope = explode(' ', trim($scope));
- $reservedScope = $this->getReservedScopes();
- $nonReservedScopes = array_diff($scope, $reservedScope);
- if (count($nonReservedScopes) == 0) {
- return true;
- } else {
- // Check the storage for non-reserved scopes.
- $nonReservedScopes = implode(' ', $nonReservedScopes);
-
- return $this->storage->scopeExists($nonReservedScopes);
- }
- }
-
- public function getScopeFromRequest(RequestInterface $request)
- {
- // "scope" is valid if passed in either POST or QUERY
- return $request->request('scope', $request->query('scope'));
- }
-
- public function getDefaultScope($client_id = null)
- {
- return $this->storage->getDefaultScope($client_id);
- }
-
- /**
- * Get reserved scopes needed by the server.
- *
- * In case OpenID Connect is used, these scopes must include:
- * 'openid', offline_access'.
- *
- * @return
- * An array of reserved scopes.
- */
- public function getReservedScopes()
- {
- return array('openid', 'offline_access');
- }
-}
diff --git a/library/oauth2/src/OAuth2/ScopeInterface.php b/library/oauth2/src/OAuth2/ScopeInterface.php
deleted file mode 100644
index 5b60f9aee..000000000
--- a/library/oauth2/src/OAuth2/ScopeInterface.php
+++ /dev/null
@@ -1,40 +0,0 @@
-<?php
-
-namespace OAuth2;
-
-use OAuth2\Storage\ScopeInterface as ScopeStorageInterface;
-
-/**
- * Class to handle scope implementation logic
- *
- * @see OAuth2\Storage\ScopeInterface
- */
-interface ScopeInterface extends ScopeStorageInterface
-{
- /**
- * Check if everything in required scope is contained in available scope.
- *
- * @param $required_scope
- * A space-separated string of scopes.
- *
- * @return
- * TRUE if everything in required scope is contained in available scope,
- * and FALSE if it isn't.
- *
- * @see http://tools.ietf.org/html/rfc6749#section-7
- *
- * @ingroup oauth2_section_7
- */
- public function checkScope($required_scope, $available_scope);
-
- /**
- * Return scope info from request
- *
- * @param OAuth2\RequestInterface
- * Request object to check
- *
- * @return
- * string representation of requested scope
- */
- public function getScopeFromRequest(RequestInterface $request);
-}
diff --git a/library/oauth2/src/OAuth2/Server.php b/library/oauth2/src/OAuth2/Server.php
deleted file mode 100644
index 171a4f069..000000000
--- a/library/oauth2/src/OAuth2/Server.php
+++ /dev/null
@@ -1,832 +0,0 @@
-<?php
-
-namespace OAuth2;
-
-use OAuth2\Controller\ResourceControllerInterface;
-use OAuth2\Controller\ResourceController;
-use OAuth2\OpenID\Controller\UserInfoControllerInterface;
-use OAuth2\OpenID\Controller\UserInfoController;
-use OAuth2\OpenID\Controller\AuthorizeController as OpenIDAuthorizeController;
-use OAuth2\OpenID\ResponseType\AuthorizationCode as OpenIDAuthorizationCodeResponseType;
-use OAuth2\OpenID\Storage\AuthorizationCodeInterface as OpenIDAuthorizationCodeInterface;
-use OAuth2\OpenID\GrantType\AuthorizationCode as OpenIDAuthorizationCodeGrantType;
-use OAuth2\Controller\AuthorizeControllerInterface;
-use OAuth2\Controller\AuthorizeController;
-use OAuth2\Controller\TokenControllerInterface;
-use OAuth2\Controller\TokenController;
-use OAuth2\ClientAssertionType\ClientAssertionTypeInterface;
-use OAuth2\ClientAssertionType\HttpBasic;
-use OAuth2\ResponseType\ResponseTypeInterface;
-use OAuth2\ResponseType\AuthorizationCode as AuthorizationCodeResponseType;
-use OAuth2\ResponseType\AccessToken;
-use OAuth2\ResponseType\JwtAccessToken;
-use OAuth2\OpenID\ResponseType\CodeIdToken;
-use OAuth2\OpenID\ResponseType\IdToken;
-use OAuth2\OpenID\ResponseType\IdTokenToken;
-use OAuth2\TokenType\TokenTypeInterface;
-use OAuth2\TokenType\Bearer;
-use OAuth2\GrantType\GrantTypeInterface;
-use OAuth2\GrantType\UserCredentials;
-use OAuth2\GrantType\ClientCredentials;
-use OAuth2\GrantType\RefreshToken;
-use OAuth2\GrantType\AuthorizationCode;
-use OAuth2\Storage\JwtAccessToken as JwtAccessTokenStorage;
-use OAuth2\Storage\JwtAccessTokenInterface;
-
-/**
-* Server class for OAuth2
-* This class serves as a convience class which wraps the other Controller classes
-*
-* @see OAuth2\Controller\ResourceController
-* @see OAuth2\Controller\AuthorizeController
-* @see OAuth2\Controller\TokenController
-*/
-class Server implements ResourceControllerInterface,
- AuthorizeControllerInterface,
- TokenControllerInterface,
- UserInfoControllerInterface
-{
- // misc properties
- protected $response;
- protected $config;
- protected $storages;
-
- // servers
- protected $authorizeController;
- protected $tokenController;
- protected $resourceController;
- protected $userInfoController;
-
- // config classes
- protected $grantTypes;
- protected $responseTypes;
- protected $tokenType;
- protected $scopeUtil;
- protected $clientAssertionType;
-
- protected $storageMap = array(
- 'access_token' => 'OAuth2\Storage\AccessTokenInterface',
- 'authorization_code' => 'OAuth2\Storage\AuthorizationCodeInterface',
- 'client_credentials' => 'OAuth2\Storage\ClientCredentialsInterface',
- 'client' => 'OAuth2\Storage\ClientInterface',
- 'refresh_token' => 'OAuth2\Storage\RefreshTokenInterface',
- 'user_credentials' => 'OAuth2\Storage\UserCredentialsInterface',
- 'user_claims' => 'OAuth2\OpenID\Storage\UserClaimsInterface',
- 'public_key' => 'OAuth2\Storage\PublicKeyInterface',
- 'jwt_bearer' => 'OAuth2\Storage\JWTBearerInterface',
- 'scope' => 'OAuth2\Storage\ScopeInterface',
- );
-
- protected $responseTypeMap = array(
- 'token' => 'OAuth2\ResponseType\AccessTokenInterface',
- 'code' => 'OAuth2\ResponseType\AuthorizationCodeInterface',
- 'id_token' => 'OAuth2\OpenID\ResponseType\IdTokenInterface',
- 'id_token token' => 'OAuth2\OpenID\ResponseType\IdTokenTokenInterface',
- 'code id_token' => 'OAuth2\OpenID\ResponseType\CodeIdTokenInterface',
- );
-
- /**
- * @param mixed $storage (array or OAuth2\Storage) - single object or array of objects implementing the
- * required storage types (ClientCredentialsInterface and AccessTokenInterface as a minimum)
- * @param array $config specify a different token lifetime, token header name, etc
- * @param array $grantTypes An array of OAuth2\GrantType\GrantTypeInterface to use for granting access tokens
- * @param array $responseTypes Response types to use. array keys should be "code" and and "token" for
- * Access Token and Authorization Code response types
- * @param OAuth2\TokenType\TokenTypeInterface $tokenType The token type object to use. Valid token types are "bearer" and "mac"
- * @param OAuth2\ScopeInterface $scopeUtil The scope utility class to use to validate scope
- * @param OAuth2\ClientAssertionType\ClientAssertionTypeInterface $clientAssertionType The method in which to verify the client identity. Default is HttpBasic
- *
- * @ingroup oauth2_section_7
- */
- public function __construct($storage = array(), array $config = array(), array $grantTypes = array(), array $responseTypes = array(), TokenTypeInterface $tokenType = null, ScopeInterface $scopeUtil = null, ClientAssertionTypeInterface $clientAssertionType = null)
- {
- $storage = is_array($storage) ? $storage : array($storage);
- $this->storages = array();
- foreach ($storage as $key => $service) {
- $this->addStorage($service, $key);
- }
-
- // merge all config values. These get passed to our controller objects
- $this->config = array_merge(array(
- 'use_jwt_access_tokens' => false,
- 'store_encrypted_token_string' => true,
- 'use_openid_connect' => false,
- 'id_lifetime' => 3600,
- 'access_lifetime' => 3600,
- 'www_realm' => 'Service',
- 'token_param_name' => 'access_token',
- 'token_bearer_header_name' => 'Bearer',
- 'enforce_state' => true,
- 'require_exact_redirect_uri' => true,
- 'allow_implicit' => false,
- 'allow_credentials_in_request_body' => true,
- 'allow_public_clients' => true,
- 'always_issue_new_refresh_token' => false,
- 'unset_refresh_token_after_use' => true,
- ), $config);
-
- foreach ($grantTypes as $key => $grantType) {
- $this->addGrantType($grantType, $key);
- }
-
- foreach ($responseTypes as $key => $responseType) {
- $this->addResponseType($responseType, $key);
- }
-
- $this->tokenType = $tokenType;
- $this->scopeUtil = $scopeUtil;
- $this->clientAssertionType = $clientAssertionType;
-
- if ($this->config['use_openid_connect']) {
- $this->validateOpenIdConnect();
- }
- }
-
- public function getAuthorizeController()
- {
- if (is_null($this->authorizeController)) {
- $this->authorizeController = $this->createDefaultAuthorizeController();
- }
-
- return $this->authorizeController;
- }
-
- public function getTokenController()
- {
- if (is_null($this->tokenController)) {
- $this->tokenController = $this->createDefaultTokenController();
- }
-
- return $this->tokenController;
- }
-
- public function getResourceController()
- {
- if (is_null($this->resourceController)) {
- $this->resourceController = $this->createDefaultResourceController();
- }
-
- return $this->resourceController;
- }
-
- public function getUserInfoController()
- {
- if (is_null($this->userInfoController)) {
- $this->userInfoController = $this->createDefaultUserInfoController();
- }
-
- return $this->userInfoController;
- }
-
- /**
- * every getter deserves a setter
- */
- public function setAuthorizeController(AuthorizeControllerInterface $authorizeController)
- {
- $this->authorizeController = $authorizeController;
- }
-
- /**
- * every getter deserves a setter
- */
- public function setTokenController(TokenControllerInterface $tokenController)
- {
- $this->tokenController = $tokenController;
- }
-
- /**
- * every getter deserves a setter
- */
- public function setResourceController(ResourceControllerInterface $resourceController)
- {
- $this->resourceController = $resourceController;
- }
-
- /**
- * every getter deserves a setter
- */
- public function setUserInfoController(UserInfoControllerInterface $userInfoController)
- {
- $this->userInfoController = $userInfoController;
- }
-
- /**
- * Return claims about the authenticated end-user.
- * This would be called from the "/UserInfo" endpoint as defined in the spec.
- *
- * @param $request - OAuth2\RequestInterface
- * Request object to grant access token
- *
- * @param $response - OAuth2\ResponseInterface
- * Response object containing error messages (failure) or user claims (success)
- *
- * @throws InvalidArgumentException
- * @throws LogicException
- *
- * @see http://openid.net/specs/openid-connect-core-1_0.html#UserInfo
- */
- public function handleUserInfoRequest(RequestInterface $request, ResponseInterface $response = null)
- {
- $this->response = is_null($response) ? new Response() : $response;
- $this->getUserInfoController()->handleUserInfoRequest($request, $this->response);
-
- return $this->response;
- }
-
- /**
- * Grant or deny a requested access token.
- * This would be called from the "/token" endpoint as defined in the spec.
- * Obviously, you can call your endpoint whatever you want.
- *
- * @param $request - OAuth2\RequestInterface
- * Request object to grant access token
- *
- * @param $response - OAuth2\ResponseInterface
- * Response object containing error messages (failure) or access token (success)
- *
- * @throws InvalidArgumentException
- * @throws LogicException
- *
- * @see http://tools.ietf.org/html/rfc6749#section-4
- * @see http://tools.ietf.org/html/rfc6749#section-10.6
- * @see http://tools.ietf.org/html/rfc6749#section-4.1.3
- *
- * @ingroup oauth2_section_4
- */
- public function handleTokenRequest(RequestInterface $request, ResponseInterface $response = null)
- {
- $this->response = is_null($response) ? new Response() : $response;
- $this->getTokenController()->handleTokenRequest($request, $this->response);
-
- return $this->response;
- }
-
- public function grantAccessToken(RequestInterface $request, ResponseInterface $response = null)
- {
- $this->response = is_null($response) ? new Response() : $response;
- $value = $this->getTokenController()->grantAccessToken($request, $this->response);
-
- return $value;
- }
-
- /**
- * Handle a revoke token request
- * This would be called from the "/revoke" endpoint as defined in the draft Token Revocation spec
- *
- * @see https://tools.ietf.org/html/rfc7009#section-2
- *
- * @param RequestInterface $request
- * @param ResponseInterface $response
- * @return Response|ResponseInterface
- */
- public function handleRevokeRequest(RequestInterface $request, ResponseInterface $response = null)
- {
- $this->response = is_null($response) ? new Response() : $response;
- $this->getTokenController()->handleRevokeRequest($request, $this->response);
-
- return $this->response;
- }
-
- /**
- * Redirect the user appropriately after approval.
- *
- * After the user has approved or denied the resource request the
- * authorization server should call this function to redirect the user
- * appropriately.
- *
- * @param $request
- * The request should have the follow parameters set in the querystring:
- * - response_type: The requested response: an access token, an
- * authorization code, or both.
- * - client_id: The client identifier as described in Section 2.
- * - redirect_uri: An absolute URI to which the authorization server
- * will redirect the user-agent to when the end-user authorization
- * step is completed.
- * - scope: (optional) The scope of the resource request expressed as a
- * list of space-delimited strings.
- * - state: (optional) An opaque value used by the client to maintain
- * state between the request and callback.
- * @param $is_authorized
- * TRUE or FALSE depending on whether the user authorized the access.
- * @param $user_id
- * Identifier of user who authorized the client
- *
- * @see http://tools.ietf.org/html/rfc6749#section-4
- *
- * @ingroup oauth2_section_4
- */
- public function handleAuthorizeRequest(RequestInterface $request, ResponseInterface $response, $is_authorized, $user_id = null)
- {
- $this->response = $response;
- $this->getAuthorizeController()->handleAuthorizeRequest($request, $this->response, $is_authorized, $user_id);
-
- return $this->response;
- }
-
- /**
- * Pull the authorization request data out of the HTTP request.
- * - The redirect_uri is OPTIONAL as per draft 20. But your implementation can enforce it
- * by setting $config['enforce_redirect'] to true.
- * - The state is OPTIONAL but recommended to enforce CSRF. Draft 21 states, however, that
- * CSRF protection is MANDATORY. You can enforce this by setting the $config['enforce_state'] to true.
- *
- * The draft specifies that the parameters should be retrieved from GET, override the Response
- * object to change this
- *
- * @return
- * The authorization parameters so the authorization server can prompt
- * the user for approval if valid.
- *
- * @see http://tools.ietf.org/html/rfc6749#section-4.1.1
- * @see http://tools.ietf.org/html/rfc6749#section-10.12
- *
- * @ingroup oauth2_section_3
- */
- public function validateAuthorizeRequest(RequestInterface $request, ResponseInterface $response = null)
- {
- $this->response = is_null($response) ? new Response() : $response;
- $value = $this->getAuthorizeController()->validateAuthorizeRequest($request, $this->response);
-
- return $value;
- }
-
- public function verifyResourceRequest(RequestInterface $request, ResponseInterface $response = null, $scope = null)
- {
- $this->response = is_null($response) ? new Response() : $response;
- $value = $this->getResourceController()->verifyResourceRequest($request, $this->response, $scope);
-
- return $value;
- }
-
- public function getAccessTokenData(RequestInterface $request, ResponseInterface $response = null)
- {
- $this->response = is_null($response) ? new Response() : $response;
- $value = $this->getResourceController()->getAccessTokenData($request, $this->response);
-
- return $value;
- }
-
- public function addGrantType(GrantTypeInterface $grantType, $identifier = null)
- {
- if (!is_string($identifier)) {
- $identifier = $grantType->getQuerystringIdentifier();
- }
-
- $this->grantTypes[$identifier] = $grantType;
-
- // persist added grant type down to TokenController
- if (!is_null($this->tokenController)) {
- $this->getTokenController()->addGrantType($grantType, $identifier);
- }
- }
-
- /**
- * Set a storage object for the server
- *
- * @param $storage
- * An object implementing one of the Storage interfaces
- * @param $key
- * If null, the storage is set to the key of each storage interface it implements
- *
- * @see storageMap
- */
- public function addStorage($storage, $key = null)
- {
- // if explicitly set to a valid key, do not "magically" set below
- if (isset($this->storageMap[$key])) {
- if (!is_null($storage) && !$storage instanceof $this->storageMap[$key]) {
- throw new \InvalidArgumentException(sprintf('storage of type "%s" must implement interface "%s"', $key, $this->storageMap[$key]));
- }
- $this->storages[$key] = $storage;
-
- // special logic to handle "client" and "client_credentials" strangeness
- if ($key === 'client' && !isset($this->storages['client_credentials'])) {
- if ($storage instanceof \OAuth2\Storage\ClientCredentialsInterface) {
- $this->storages['client_credentials'] = $storage;
- }
- } elseif ($key === 'client_credentials' && !isset($this->storages['client'])) {
- if ($storage instanceof \OAuth2\Storage\ClientInterface) {
- $this->storages['client'] = $storage;
- }
- }
- } elseif (!is_null($key) && !is_numeric($key)) {
- throw new \InvalidArgumentException(sprintf('unknown storage key "%s", must be one of [%s]', $key, implode(', ', array_keys($this->storageMap))));
- } else {
- $set = false;
- foreach ($this->storageMap as $type => $interface) {
- if ($storage instanceof $interface) {
- $this->storages[$type] = $storage;
- $set = true;
- }
- }
-
- if (!$set) {
- throw new \InvalidArgumentException(sprintf('storage of class "%s" must implement one of [%s]', get_class($storage), implode(', ', $this->storageMap)));
- }
- }
- }
-
- public function addResponseType(ResponseTypeInterface $responseType, $key = null)
- {
- $key = $this->normalizeResponseType($key);
-
- if (isset($this->responseTypeMap[$key])) {
- if (!$responseType instanceof $this->responseTypeMap[$key]) {
- throw new \InvalidArgumentException(sprintf('responseType of type "%s" must implement interface "%s"', $key, $this->responseTypeMap[$key]));
- }
- $this->responseTypes[$key] = $responseType;
- } elseif (!is_null($key) && !is_numeric($key)) {
- throw new \InvalidArgumentException(sprintf('unknown responseType key "%s", must be one of [%s]', $key, implode(', ', array_keys($this->responseTypeMap))));
- } else {
- $set = false;
- foreach ($this->responseTypeMap as $type => $interface) {
- if ($responseType instanceof $interface) {
- $this->responseTypes[$type] = $responseType;
- $set = true;
- }
- }
-
- if (!$set) {
- throw new \InvalidArgumentException(sprintf('Unknown response type %s. Please implement one of [%s]', get_class($responseType), implode(', ', $this->responseTypeMap)));
- }
- }
- }
-
- public function getScopeUtil()
- {
- if (!$this->scopeUtil) {
- $storage = isset($this->storages['scope']) ? $this->storages['scope'] : null;
- $this->scopeUtil = new Scope($storage);
- }
-
- return $this->scopeUtil;
- }
-
- /**
- * every getter deserves a setter
- */
- public function setScopeUtil($scopeUtil)
- {
- $this->scopeUtil = $scopeUtil;
- }
-
- protected function createDefaultAuthorizeController()
- {
- if (!isset($this->storages['client'])) {
- throw new \LogicException("You must supply a storage object implementing OAuth2\Storage\ClientInterface to use the authorize server");
- }
- if (0 == count($this->responseTypes)) {
- $this->responseTypes = $this->getDefaultResponseTypes();
- }
- if ($this->config['use_openid_connect'] && !isset($this->responseTypes['id_token'])) {
- $this->responseTypes['id_token'] = $this->createDefaultIdTokenResponseType();
- if ($this->config['allow_implicit']) {
- $this->responseTypes['id_token token'] = $this->createDefaultIdTokenTokenResponseType();
- }
- }
-
- $config = array_intersect_key($this->config, array_flip(explode(' ', 'allow_implicit enforce_state require_exact_redirect_uri')));
-
- if ($this->config['use_openid_connect']) {
- return new OpenIDAuthorizeController($this->storages['client'], $this->responseTypes, $config, $this->getScopeUtil());
- }
-
- return new AuthorizeController($this->storages['client'], $this->responseTypes, $config, $this->getScopeUtil());
- }
-
- protected function createDefaultTokenController()
- {
- if (0 == count($this->grantTypes)) {
- $this->grantTypes = $this->getDefaultGrantTypes();
- }
-
- if (is_null($this->clientAssertionType)) {
- // see if HttpBasic assertion type is requred. If so, then create it from storage classes.
- foreach ($this->grantTypes as $grantType) {
- if (!$grantType instanceof ClientAssertionTypeInterface) {
- if (!isset($this->storages['client_credentials'])) {
- throw new \LogicException("You must supply a storage object implementing OAuth2\Storage\ClientCredentialsInterface to use the token server");
- }
- $config = array_intersect_key($this->config, array_flip(explode(' ', 'allow_credentials_in_request_body allow_public_clients')));
- $this->clientAssertionType = new HttpBasic($this->storages['client_credentials'], $config);
- break;
- }
- }
- }
-
- if (!isset($this->storages['client'])) {
- throw new \LogicException("You must supply a storage object implementing OAuth2\Storage\ClientInterface to use the token server");
- }
-
- $accessTokenResponseType = $this->getAccessTokenResponseType();
-
- return new TokenController($accessTokenResponseType, $this->storages['client'], $this->grantTypes, $this->clientAssertionType, $this->getScopeUtil());
- }
-
- protected function createDefaultResourceController()
- {
- if ($this->config['use_jwt_access_tokens']) {
- // overwrites access token storage with crypto token storage if "use_jwt_access_tokens" is set
- if (!isset($this->storages['access_token']) || !$this->storages['access_token'] instanceof JwtAccessTokenInterface) {
- $this->storages['access_token'] = $this->createDefaultJwtAccessTokenStorage();
- }
- } elseif (!isset($this->storages['access_token'])) {
- throw new \LogicException("You must supply a storage object implementing OAuth2\Storage\AccessTokenInterface or use JwtAccessTokens to use the resource server");
- }
-
- if (!$this->tokenType) {
- $this->tokenType = $this->getDefaultTokenType();
- }
-
- $config = array_intersect_key($this->config, array('www_realm' => ''));
-
- return new ResourceController($this->tokenType, $this->storages['access_token'], $config, $this->getScopeUtil());
- }
-
- protected function createDefaultUserInfoController()
- {
- if ($this->config['use_jwt_access_tokens']) {
- // overwrites access token storage with crypto token storage if "use_jwt_access_tokens" is set
- if (!isset($this->storages['access_token']) || !$this->storages['access_token'] instanceof JwtAccessTokenInterface) {
- $this->storages['access_token'] = $this->createDefaultJwtAccessTokenStorage();
- }
- } elseif (!isset($this->storages['access_token'])) {
- throw new \LogicException("You must supply a storage object implementing OAuth2\Storage\AccessTokenInterface or use JwtAccessTokens to use the UserInfo server");
- }
-
- if (!isset($this->storages['user_claims'])) {
- throw new \LogicException("You must supply a storage object implementing OAuth2\OpenID\Storage\UserClaimsInterface to use the UserInfo server");
- }
-
- if (!$this->tokenType) {
- $this->tokenType = $this->getDefaultTokenType();
- }
-
- $config = array_intersect_key($this->config, array('www_realm' => ''));
-
- return new UserInfoController($this->tokenType, $this->storages['access_token'], $this->storages['user_claims'], $config, $this->getScopeUtil());
- }
-
- protected function getDefaultTokenType()
- {
- $config = array_intersect_key($this->config, array_flip(explode(' ', 'token_param_name token_bearer_header_name')));
-
- return new Bearer($config);
- }
-
- protected function getDefaultResponseTypes()
- {
- $responseTypes = array();
-
- if ($this->config['allow_implicit']) {
- $responseTypes['token'] = $this->getAccessTokenResponseType();
- }
-
- if ($this->config['use_openid_connect']) {
- $responseTypes['id_token'] = $this->getIdTokenResponseType();
- if ($this->config['allow_implicit']) {
- $responseTypes['id_token token'] = $this->getIdTokenTokenResponseType();
- }
- }
-
- if (isset($this->storages['authorization_code'])) {
- $config = array_intersect_key($this->config, array_flip(explode(' ', 'enforce_redirect auth_code_lifetime')));
- if ($this->config['use_openid_connect']) {
- if (!$this->storages['authorization_code'] instanceof OpenIDAuthorizationCodeInterface) {
- throw new \LogicException("Your authorization_code storage must implement OAuth2\OpenID\Storage\AuthorizationCodeInterface to work when 'use_openid_connect' is true");
- }
- $responseTypes['code'] = new OpenIDAuthorizationCodeResponseType($this->storages['authorization_code'], $config);
- $responseTypes['code id_token'] = new CodeIdToken($responseTypes['code'], $responseTypes['id_token']);
- } else {
- $responseTypes['code'] = new AuthorizationCodeResponseType($this->storages['authorization_code'], $config);
- }
- }
-
- if (count($responseTypes) == 0) {
- throw new \LogicException("You must supply an array of response_types in the constructor or implement a OAuth2\Storage\AuthorizationCodeInterface storage object or set 'allow_implicit' to true and implement a OAuth2\Storage\AccessTokenInterface storage object");
- }
-
- return $responseTypes;
- }
-
- protected function getDefaultGrantTypes()
- {
- $grantTypes = array();
-
- if (isset($this->storages['user_credentials'])) {
- $grantTypes['password'] = new UserCredentials($this->storages['user_credentials']);
- }
-
- if (isset($this->storages['client_credentials'])) {
- $config = array_intersect_key($this->config, array('allow_credentials_in_request_body' => ''));
- $grantTypes['client_credentials'] = new ClientCredentials($this->storages['client_credentials'], $config);
- }
-
- if (isset($this->storages['refresh_token'])) {
- $config = array_intersect_key($this->config, array_flip(explode(' ', 'always_issue_new_refresh_token unset_refresh_token_after_use')));
- $grantTypes['refresh_token'] = new RefreshToken($this->storages['refresh_token'], $config);
- }
-
- if (isset($this->storages['authorization_code'])) {
- if ($this->config['use_openid_connect']) {
- if (!$this->storages['authorization_code'] instanceof OpenIDAuthorizationCodeInterface) {
- throw new \LogicException("Your authorization_code storage must implement OAuth2\OpenID\Storage\AuthorizationCodeInterface to work when 'use_openid_connect' is true");
- }
- $grantTypes['authorization_code'] = new OpenIDAuthorizationCodeGrantType($this->storages['authorization_code']);
- } else {
- $grantTypes['authorization_code'] = new AuthorizationCode($this->storages['authorization_code']);
- }
- }
-
- if (count($grantTypes) == 0) {
- throw new \LogicException("Unable to build default grant types - You must supply an array of grant_types in the constructor");
- }
-
- return $grantTypes;
- }
-
- protected function getAccessTokenResponseType()
- {
- if (isset($this->responseTypes['token'])) {
- return $this->responseTypes['token'];
- }
-
- if ($this->config['use_jwt_access_tokens']) {
- return $this->createDefaultJwtAccessTokenResponseType();
- }
-
- return $this->createDefaultAccessTokenResponseType();
- }
-
- protected function getIdTokenResponseType()
- {
- if (isset($this->responseTypes['id_token'])) {
- return $this->responseTypes['id_token'];
- }
-
- return $this->createDefaultIdTokenResponseType();
- }
-
- protected function getIdTokenTokenResponseType()
- {
- if (isset($this->responseTypes['id_token token'])) {
- return $this->responseTypes['id_token token'];
- }
-
- return $this->createDefaultIdTokenTokenResponseType();
- }
-
- /**
- * For Resource Controller
- */
- protected function createDefaultJwtAccessTokenStorage()
- {
- if (!isset($this->storages['public_key'])) {
- throw new \LogicException("You must supply a storage object implementing OAuth2\Storage\PublicKeyInterface to use crypto tokens");
- }
- $tokenStorage = null;
- if (!empty($this->config['store_encrypted_token_string']) && isset($this->storages['access_token'])) {
- $tokenStorage = $this->storages['access_token'];
- }
- // wrap the access token storage as required.
- return new JwtAccessTokenStorage($this->storages['public_key'], $tokenStorage);
- }
-
- /**
- * For Authorize and Token Controllers
- */
- protected function createDefaultJwtAccessTokenResponseType()
- {
- if (!isset($this->storages['public_key'])) {
- throw new \LogicException("You must supply a storage object implementing OAuth2\Storage\PublicKeyInterface to use crypto tokens");
- }
-
- $tokenStorage = null;
- if (isset($this->storages['access_token'])) {
- $tokenStorage = $this->storages['access_token'];
- }
-
- $refreshStorage = null;
- if (isset($this->storages['refresh_token'])) {
- $refreshStorage = $this->storages['refresh_token'];
- }
-
- $config = array_intersect_key($this->config, array_flip(explode(' ', 'store_encrypted_token_string issuer access_lifetime refresh_token_lifetime')));
-
- return new JwtAccessToken($this->storages['public_key'], $tokenStorage, $refreshStorage, $config);
- }
-
- protected function createDefaultAccessTokenResponseType()
- {
- if (!isset($this->storages['access_token'])) {
- throw new \LogicException("You must supply a response type implementing OAuth2\ResponseType\AccessTokenInterface, or a storage object implementing OAuth2\Storage\AccessTokenInterface to use the token server");
- }
-
- $refreshStorage = null;
- if (isset($this->storages['refresh_token'])) {
- $refreshStorage = $this->storages['refresh_token'];
- }
-
- $config = array_intersect_key($this->config, array_flip(explode(' ', 'access_lifetime refresh_token_lifetime')));
- $config['token_type'] = $this->tokenType ? $this->tokenType->getTokenType() : $this->getDefaultTokenType()->getTokenType();
-
- return new AccessToken($this->storages['access_token'], $refreshStorage, $config);
- }
-
- protected function createDefaultIdTokenResponseType()
- {
- if (!isset($this->storages['user_claims'])) {
- throw new \LogicException("You must supply a storage object implementing OAuth2\OpenID\Storage\UserClaimsInterface to use openid connect");
- }
- if (!isset($this->storages['public_key'])) {
- throw new \LogicException("You must supply a storage object implementing OAuth2\Storage\PublicKeyInterface to use openid connect");
- }
-
- $config = array_intersect_key($this->config, array_flip(explode(' ', 'issuer id_lifetime')));
-
- return new IdToken($this->storages['user_claims'], $this->storages['public_key'], $config);
- }
-
- protected function createDefaultIdTokenTokenResponseType()
- {
- return new IdTokenToken($this->getAccessTokenResponseType(), $this->getIdTokenResponseType());
- }
-
- protected function validateOpenIdConnect()
- {
- $authCodeGrant = $this->getGrantType('authorization_code');
- if (!empty($authCodeGrant) && !$authCodeGrant instanceof OpenIDAuthorizationCodeGrantType) {
- throw new \InvalidArgumentException('You have enabled OpenID Connect, but supplied a grant type that does not support it.');
- }
- }
-
- protected function normalizeResponseType($name)
- {
- // for multiple-valued response types - make them alphabetical
- if (!empty($name) && false !== strpos($name, ' ')) {
- $types = explode(' ', $name);
- sort($types);
- $name = implode(' ', $types);
- }
-
- return $name;
- }
-
- public function getResponse()
- {
- return $this->response;
- }
-
- public function getStorages()
- {
- return $this->storages;
- }
-
- public function getStorage($name)
- {
- return isset($this->storages[$name]) ? $this->storages[$name] : null;
- }
-
- public function getGrantTypes()
- {
- return $this->grantTypes;
- }
-
- public function getGrantType($name)
- {
- return isset($this->grantTypes[$name]) ? $this->grantTypes[$name] : null;
- }
-
- public function getResponseTypes()
- {
- return $this->responseTypes;
- }
-
- public function getResponseType($name)
- {
- // for multiple-valued response types - make them alphabetical
- $name = $this->normalizeResponseType($name);
-
- return isset($this->responseTypes[$name]) ? $this->responseTypes[$name] : null;
- }
-
- public function getTokenType()
- {
- return $this->tokenType;
- }
-
- public function getClientAssertionType()
- {
- return $this->clientAssertionType;
- }
-
- public function setConfig($name, $value)
- {
- $this->config[$name] = $value;
- }
-
- public function getConfig($name, $default = null)
- {
- return isset($this->config[$name]) ? $this->config[$name] : $default;
- }
-}
diff --git a/library/oauth2/src/OAuth2/Storage/AccessTokenInterface.php b/library/oauth2/src/OAuth2/Storage/AccessTokenInterface.php
deleted file mode 100644
index 1819158af..000000000
--- a/library/oauth2/src/OAuth2/Storage/AccessTokenInterface.php
+++ /dev/null
@@ -1,64 +0,0 @@
-<?php
-
-namespace OAuth2\Storage;
-
-/**
- * Implement this interface to specify where the OAuth2 Server
- * should get/save access tokens
- *
- * @author Brent Shaffer <bshafs at gmail dot com>
- */
-interface AccessTokenInterface
-{
- /**
- * Look up the supplied oauth_token from storage.
- *
- * We need to retrieve access token data as we create and verify tokens.
- *
- * @param $oauth_token
- * oauth_token to be check with.
- *
- * @return
- * An associative array as below, and return NULL if the supplied oauth_token
- * is invalid:
- * - expires: Stored expiration in unix timestamp.
- * - client_id: (optional) Stored client identifier.
- * - user_id: (optional) Stored user identifier.
- * - scope: (optional) Stored scope values in space-separated string.
- * - id_token: (optional) Stored id_token (if "use_openid_connect" is true).
- *
- * @ingroup oauth2_section_7
- */
- public function getAccessToken($oauth_token);
-
- /**
- * Store the supplied access token values to storage.
- *
- * We need to store access token data as we create and verify tokens.
- *
- * @param $oauth_token oauth_token to be stored.
- * @param $client_id client identifier to be stored.
- * @param $user_id user identifier to be stored.
- * @param int $expires expiration to be stored as a Unix timestamp.
- * @param string $scope OPTIONAL Scopes to be stored in space-separated string.
- *
- * @ingroup oauth2_section_4
- */
- public function setAccessToken($oauth_token, $client_id, $user_id, $expires, $scope = null);
-
- /**
- * Expire an access token.
- *
- * This is not explicitly required in the spec, but if defined in a draft RFC for token
- * revoking (RFC 7009) https://tools.ietf.org/html/rfc7009
- *
- * @param $access_token
- * Access token to be expired.
- *
- * @return BOOL true if an access token was unset, false if not
- * @ingroup oauth2_section_6
- *
- * @todo v2.0 include this method in interface. Omitted to maintain BC in v1.x
- */
- //public function unsetAccessToken($access_token);
-}
diff --git a/library/oauth2/src/OAuth2/Storage/AuthorizationCodeInterface.php b/library/oauth2/src/OAuth2/Storage/AuthorizationCodeInterface.php
deleted file mode 100644
index 3beb0e437..000000000
--- a/library/oauth2/src/OAuth2/Storage/AuthorizationCodeInterface.php
+++ /dev/null
@@ -1,86 +0,0 @@
-<?php
-
-namespace OAuth2\Storage;
-
-/**
- * Implement this interface to specify where the OAuth2 Server
- * should get/save authorization codes for the "Authorization Code"
- * grant type
- *
- * @author Brent Shaffer <bshafs at gmail dot com>
- */
-interface AuthorizationCodeInterface
-{
- /**
- * The Authorization Code grant type supports a response type of "code".
- *
- * @var string
- * @see http://tools.ietf.org/html/rfc6749#section-1.4.1
- * @see http://tools.ietf.org/html/rfc6749#section-4.2
- */
- const RESPONSE_TYPE_CODE = "code";
-
- /**
- * Fetch authorization code data (probably the most common grant type).
- *
- * Retrieve the stored data for the given authorization code.
- *
- * Required for OAuth2::GRANT_TYPE_AUTH_CODE.
- *
- * @param $code
- * Authorization code to be check with.
- *
- * @return
- * An associative array as below, and NULL if the code is invalid
- * @code
- * return array(
- * "client_id" => CLIENT_ID, // REQUIRED Stored client identifier
- * "user_id" => USER_ID, // REQUIRED Stored user identifier
- * "expires" => EXPIRES, // REQUIRED Stored expiration in unix timestamp
- * "redirect_uri" => REDIRECT_URI, // REQUIRED Stored redirect URI
- * "scope" => SCOPE, // OPTIONAL Stored scope values in space-separated string
- * );
- * @endcode
- *
- * @see http://tools.ietf.org/html/rfc6749#section-4.1
- *
- * @ingroup oauth2_section_4
- */
- public function getAuthorizationCode($code);
-
- /**
- * Take the provided authorization code values and store them somewhere.
- *
- * This function should be the storage counterpart to getAuthCode().
- *
- * If storage fails for some reason, we're not currently checking for
- * any sort of success/failure, so you should bail out of the script
- * and provide a descriptive fail message.
- *
- * Required for OAuth2::GRANT_TYPE_AUTH_CODE.
- *
- * @param string $code Authorization code to be stored.
- * @param mixed $client_id Client identifier to be stored.
- * @param mixed $user_id User identifier to be stored.
- * @param string $redirect_uri Redirect URI(s) to be stored in a space-separated string.
- * @param int $expires Expiration to be stored as a Unix timestamp.
- * @param string $scope OPTIONAL Scopes to be stored in space-separated string.
- *
- * @ingroup oauth2_section_4
- */
- public function setAuthorizationCode($code, $client_id, $user_id, $redirect_uri, $expires, $scope = null);
-
- /**
- * once an Authorization Code is used, it must be exipired
- *
- * @see http://tools.ietf.org/html/rfc6749#section-4.1.2
- *
- * The client MUST NOT use the authorization code
- * more than once. If an authorization code is used more than
- * once, the authorization server MUST deny the request and SHOULD
- * revoke (when possible) all tokens previously issued based on
- * that authorization code
- *
- */
- public function expireAuthorizationCode($code);
-}
diff --git a/library/oauth2/src/OAuth2/Storage/Cassandra.php b/library/oauth2/src/OAuth2/Storage/Cassandra.php
deleted file mode 100644
index 602e8a058..000000000
--- a/library/oauth2/src/OAuth2/Storage/Cassandra.php
+++ /dev/null
@@ -1,480 +0,0 @@
-<?php
-
-namespace OAuth2\Storage;
-
-use phpcassa\ColumnFamily;
-use phpcassa\ColumnSlice;
-use phpcassa\Connection\ConnectionPool;
-use OAuth2\OpenID\Storage\UserClaimsInterface;
-use OAuth2\OpenID\Storage\AuthorizationCodeInterface as OpenIDAuthorizationCodeInterface;
-
-/**
- * Cassandra storage for all storage types
- *
- * To use, install "thobbs/phpcassa" via composer
- * <code>
- * composer require thobbs/phpcassa:dev-master
- * </code>
- *
- * Once this is done, instantiate the
- * <code>
- * $cassandra = new \phpcassa\Connection\ConnectionPool('oauth2_server', array('127.0.0.1:9160'));
- * </code>
- *
- * Then, register the storage client:
- * <code>
- * $storage = new OAuth2\Storage\Cassandra($cassandra);
- * $storage->setClientDetails($client_id, $client_secret, $redirect_uri);
- * </code>
- *
- * @see test/lib/OAuth2/Storage/Bootstrap::getCassandraStorage
- */
-class Cassandra implements AuthorizationCodeInterface,
- AccessTokenInterface,
- ClientCredentialsInterface,
- UserCredentialsInterface,
- RefreshTokenInterface,
- JwtBearerInterface,
- ScopeInterface,
- PublicKeyInterface,
- UserClaimsInterface,
- OpenIDAuthorizationCodeInterface
-{
-
- private $cache;
-
- /* The cassandra client */
- protected $cassandra;
-
- /* Configuration array */
- protected $config;
-
- /**
- * Cassandra Storage! uses phpCassa
- *
- * @param \phpcassa\ConnectionPool $cassandra
- * @param array $config
- */
- public function __construct($connection = array(), array $config = array())
- {
- if ($connection instanceof ConnectionPool) {
- $this->cassandra = $connection;
- } else {
- if (!is_array($connection)) {
- throw new \InvalidArgumentException('First argument to OAuth2\Storage\Cassandra must be an instance of phpcassa\Connection\ConnectionPool or a configuration array');
- }
- $connection = array_merge(array(
- 'keyspace' => 'oauth2',
- 'servers' => null,
- ), $connection);
-
- $this->cassandra = new ConnectionPool($connection['keyspace'], $connection['servers']);
- }
-
- $this->config = array_merge(array(
- // cassandra config
- 'column_family' => 'auth',
-
- // key names
- 'client_key' => 'oauth_clients:',
- 'access_token_key' => 'oauth_access_tokens:',
- 'refresh_token_key' => 'oauth_refresh_tokens:',
- 'code_key' => 'oauth_authorization_codes:',
- 'user_key' => 'oauth_users:',
- 'jwt_key' => 'oauth_jwt:',
- 'scope_key' => 'oauth_scopes:',
- 'public_key_key' => 'oauth_public_keys:',
- ), $config);
- }
-
- protected function getValue($key)
- {
- if (isset($this->cache[$key])) {
- return $this->cache[$key];
- }
- $cf = new ColumnFamily($this->cassandra, $this->config['column_family']);
-
- try {
- $value = $cf->get($key, new ColumnSlice("", ""));
- $value = array_shift($value);
- } catch (\cassandra\NotFoundException $e) {
- return false;
- }
-
- return json_decode($value, true);
- }
-
- protected function setValue($key, $value, $expire = 0)
- {
- $this->cache[$key] = $value;
-
- $cf = new ColumnFamily($this->cassandra, $this->config['column_family']);
-
- $str = json_encode($value);
- if ($expire > 0) {
- try {
- $seconds = $expire - time();
- // __data key set as C* requires a field, note: max TTL can only be 630720000 seconds
- $cf->insert($key, array('__data' => $str), null, $seconds);
- } catch (\Exception $e) {
- return false;
- }
- } else {
- try {
- // __data key set as C* requires a field
- $cf->insert($key, array('__data' => $str));
- } catch (\Exception $e) {
- return false;
- }
- }
-
- return true;
- }
-
- protected function expireValue($key)
- {
- unset($this->cache[$key]);
-
- $cf = new ColumnFamily($this->cassandra, $this->config['column_family']);
-
- if ($cf->get_count($key) > 0) {
- try {
- // __data key set as C* requires a field
- $cf->remove($key, array('__data'));
- } catch (\Exception $e) {
- return false;
- }
-
- return true;
- }
-
- return false;
- }
-
- /* AuthorizationCodeInterface */
- public function getAuthorizationCode($code)
- {
- return $this->getValue($this->config['code_key'] . $code);
- }
-
- public function setAuthorizationCode($authorization_code, $client_id, $user_id, $redirect_uri, $expires, $scope = null, $id_token = null)
- {
- return $this->setValue(
- $this->config['code_key'] . $authorization_code,
- compact('authorization_code', 'client_id', 'user_id', 'redirect_uri', 'expires', 'scope', 'id_token'),
- $expires
- );
- }
-
- public function expireAuthorizationCode($code)
- {
- $key = $this->config['code_key'] . $code;
- unset($this->cache[$key]);
-
- return $this->expireValue($key);
- }
-
- /* UserCredentialsInterface */
- public function checkUserCredentials($username, $password)
- {
- if ($user = $this->getUser($username)) {
- return $this->checkPassword($user, $password);
- }
-
- return false;
- }
-
- // plaintext passwords are bad! Override this for your application
- protected function checkPassword($user, $password)
- {
- return $user['password'] == $this->hashPassword($password);
- }
-
- // use a secure hashing algorithm when storing passwords. Override this for your application
- protected function hashPassword($password)
- {
- return sha1($password);
- }
-
- public function getUserDetails($username)
- {
- return $this->getUser($username);
- }
-
- public function getUser($username)
- {
- if (!$userInfo = $this->getValue($this->config['user_key'] . $username)) {
- return false;
- }
-
- // the default behavior is to use "username" as the user_id
- return array_merge(array(
- 'user_id' => $username,
- ), $userInfo);
- }
-
- public function setUser($username, $password, $first_name = null, $last_name = null)
- {
- $password = $this->hashPassword($password);
-
- return $this->setValue(
- $this->config['user_key'] . $username,
- compact('username', 'password', 'first_name', 'last_name')
- );
- }
-
- /* ClientCredentialsInterface */
- public function checkClientCredentials($client_id, $client_secret = null)
- {
- if (!$client = $this->getClientDetails($client_id)) {
- return false;
- }
-
- return isset($client['client_secret'])
- && $client['client_secret'] == $client_secret;
- }
-
- public function isPublicClient($client_id)
- {
- if (!$client = $this->getClientDetails($client_id)) {
- return false;
- }
-
- return empty($client['client_secret']);;
- }
-
- /* ClientInterface */
- public function getClientDetails($client_id)
- {
- return $this->getValue($this->config['client_key'] . $client_id);
- }
-
- public function setClientDetails($client_id, $client_secret = null, $redirect_uri = null, $grant_types = null, $scope = null, $user_id = null)
- {
- return $this->setValue(
- $this->config['client_key'] . $client_id,
- compact('client_id', 'client_secret', 'redirect_uri', 'grant_types', 'scope', 'user_id')
- );
- }
-
- public function checkRestrictedGrantType($client_id, $grant_type)
- {
- $details = $this->getClientDetails($client_id);
- if (isset($details['grant_types'])) {
- $grant_types = explode(' ', $details['grant_types']);
-
- return in_array($grant_type, (array) $grant_types);
- }
-
- // if grant_types are not defined, then none are restricted
- return true;
- }
-
- /* RefreshTokenInterface */
- public function getRefreshToken($refresh_token)
- {
- return $this->getValue($this->config['refresh_token_key'] . $refresh_token);
- }
-
- public function setRefreshToken($refresh_token, $client_id, $user_id, $expires, $scope = null)
- {
- return $this->setValue(
- $this->config['refresh_token_key'] . $refresh_token,
- compact('refresh_token', 'client_id', 'user_id', 'expires', 'scope'),
- $expires
- );
- }
-
- public function unsetRefreshToken($refresh_token)
- {
- return $this->expireValue($this->config['refresh_token_key'] . $refresh_token);
- }
-
- /* AccessTokenInterface */
- public function getAccessToken($access_token)
- {
- return $this->getValue($this->config['access_token_key'].$access_token);
- }
-
- public function setAccessToken($access_token, $client_id, $user_id, $expires, $scope = null)
- {
- return $this->setValue(
- $this->config['access_token_key'].$access_token,
- compact('access_token', 'client_id', 'user_id', 'expires', 'scope'),
- $expires
- );
- }
-
- public function unsetAccessToken($access_token)
- {
- return $this->expireValue($this->config['access_token_key'] . $access_token);
- }
-
- /* ScopeInterface */
- public function scopeExists($scope)
- {
- $scope = explode(' ', $scope);
-
- $result = $this->getValue($this->config['scope_key'].'supported:global');
-
- $supportedScope = explode(' ', (string) $result);
-
- return (count(array_diff($scope, $supportedScope)) == 0);
- }
-
- public function getDefaultScope($client_id = null)
- {
- if (is_null($client_id) || !$result = $this->getValue($this->config['scope_key'].'default:'.$client_id)) {
- $result = $this->getValue($this->config['scope_key'].'default:global');
- }
-
- return $result;
- }
-
- public function setScope($scope, $client_id = null, $type = 'supported')
- {
- if (!in_array($type, array('default', 'supported'))) {
- throw new \InvalidArgumentException('"$type" must be one of "default", "supported"');
- }
-
- if (is_null($client_id)) {
- $key = $this->config['scope_key'].$type.':global';
- } else {
- $key = $this->config['scope_key'].$type.':'.$client_id;
- }
-
- return $this->setValue($key, $scope);
- }
-
- /*JWTBearerInterface */
- public function getClientKey($client_id, $subject)
- {
- if (!$jwt = $this->getValue($this->config['jwt_key'] . $client_id)) {
- return false;
- }
-
- if (isset($jwt['subject']) && $jwt['subject'] == $subject ) {
- return $jwt['key'];
- }
-
- return null;
- }
-
- public function setClientKey($client_id, $key, $subject = null)
- {
- return $this->setValue($this->config['jwt_key'] . $client_id, array(
- 'key' => $key,
- 'subject' => $subject
- ));
- }
-
- /*ScopeInterface */
- public function getClientScope($client_id)
- {
- if (!$clientDetails = $this->getClientDetails($client_id)) {
- return false;
- }
-
- if (isset($clientDetails['scope'])) {
- return $clientDetails['scope'];
- }
-
- return null;
- }
-
- public function getJti($client_id, $subject, $audience, $expiration, $jti)
- {
- //TODO: Needs cassandra implementation.
- throw new \Exception('getJti() for the Cassandra driver is currently unimplemented.');
- }
-
- public function setJti($client_id, $subject, $audience, $expiration, $jti)
- {
- //TODO: Needs cassandra implementation.
- throw new \Exception('setJti() for the Cassandra driver is currently unimplemented.');
- }
-
- /* PublicKeyInterface */
- public function getPublicKey($client_id = '')
- {
- $public_key = $this->getValue($this->config['public_key_key'] . $client_id);
- if (is_array($public_key)) {
- return $public_key['public_key'];
- }
- $public_key = $this->getValue($this->config['public_key_key']);
- if (is_array($public_key)) {
- return $public_key['public_key'];
- }
- }
-
- public function getPrivateKey($client_id = '')
- {
- $public_key = $this->getValue($this->config['public_key_key'] . $client_id);
- if (is_array($public_key)) {
- return $public_key['private_key'];
- }
- $public_key = $this->getValue($this->config['public_key_key']);
- if (is_array($public_key)) {
- return $public_key['private_key'];
- }
- }
-
- public function getEncryptionAlgorithm($client_id = null)
- {
- $public_key = $this->getValue($this->config['public_key_key'] . $client_id);
- if (is_array($public_key)) {
- return $public_key['encryption_algorithm'];
- }
- $public_key = $this->getValue($this->config['public_key_key']);
- if (is_array($public_key)) {
- return $public_key['encryption_algorithm'];
- }
-
- return 'RS256';
- }
-
- /* UserClaimsInterface */
- public function getUserClaims($user_id, $claims)
- {
- $userDetails = $this->getUserDetails($user_id);
- if (!is_array($userDetails)) {
- return false;
- }
-
- $claims = explode(' ', trim($claims));
- $userClaims = array();
-
- // for each requested claim, if the user has the claim, set it in the response
- $validClaims = explode(' ', self::VALID_CLAIMS);
- foreach ($validClaims as $validClaim) {
- if (in_array($validClaim, $claims)) {
- if ($validClaim == 'address') {
- // address is an object with subfields
- $userClaims['address'] = $this->getUserClaim($validClaim, $userDetails['address'] ?: $userDetails);
- } else {
- $userClaims = array_merge($userClaims, $this->getUserClaim($validClaim, $userDetails));
- }
- }
- }
-
- return $userClaims;
- }
-
- protected function getUserClaim($claim, $userDetails)
- {
- $userClaims = array();
- $claimValuesString = constant(sprintf('self::%s_CLAIM_VALUES', strtoupper($claim)));
- $claimValues = explode(' ', $claimValuesString);
-
- foreach ($claimValues as $value) {
- if ($value == 'email_verified') {
- $userClaims[$value] = $userDetails[$value]=='true' ? true : false;
- } else {
- $userClaims[$value] = isset($userDetails[$value]) ? $userDetails[$value] : null;
- }
- }
-
- return $userClaims;
- }
-
-}
diff --git a/library/oauth2/src/OAuth2/Storage/ClientCredentialsInterface.php b/library/oauth2/src/OAuth2/Storage/ClientCredentialsInterface.php
deleted file mode 100644
index 3318c6966..000000000
--- a/library/oauth2/src/OAuth2/Storage/ClientCredentialsInterface.php
+++ /dev/null
@@ -1,49 +0,0 @@
-<?php
-
-namespace OAuth2\Storage;
-
-/**
- * Implement this interface to specify how the OAuth2 Server
- * should verify client credentials
- *
- * @author Brent Shaffer <bshafs at gmail dot com>
- */
-interface ClientCredentialsInterface extends ClientInterface
-{
-
- /**
- * Make sure that the client credentials is valid.
- *
- * @param $client_id
- * Client identifier to be check with.
- * @param $client_secret
- * (optional) If a secret is required, check that they've given the right one.
- *
- * @return
- * TRUE if the client credentials are valid, and MUST return FALSE if it isn't.
- * @endcode
- *
- * @see http://tools.ietf.org/html/rfc6749#section-3.1
- *
- * @ingroup oauth2_section_3
- */
- public function checkClientCredentials($client_id, $client_secret = null);
-
- /**
- * Determine if the client is a "public" client, and therefore
- * does not require passing credentials for certain grant types
- *
- * @param $client_id
- * Client identifier to be check with.
- *
- * @return
- * TRUE if the client is public, and FALSE if it isn't.
- * @endcode
- *
- * @see http://tools.ietf.org/html/rfc6749#section-2.3
- * @see https://github.com/bshaffer/oauth2-server-php/issues/257
- *
- * @ingroup oauth2_section_2
- */
- public function isPublicClient($client_id);
-}
diff --git a/library/oauth2/src/OAuth2/Storage/ClientInterface.php b/library/oauth2/src/OAuth2/Storage/ClientInterface.php
deleted file mode 100644
index 09a5bffc1..000000000
--- a/library/oauth2/src/OAuth2/Storage/ClientInterface.php
+++ /dev/null
@@ -1,66 +0,0 @@
-<?php
-
-namespace OAuth2\Storage;
-
-/**
- * Implement this interface to specify where the OAuth2 Server
- * should retrieve client information
- *
- * @author Brent Shaffer <bshafs at gmail dot com>
- */
-interface ClientInterface
-{
- /**
- * Get client details corresponding client_id.
- *
- * OAuth says we should store request URIs for each registered client.
- * Implement this function to grab the stored URI for a given client id.
- *
- * @param $client_id
- * Client identifier to be check with.
- *
- * @return array
- * Client details. The only mandatory key in the array is "redirect_uri".
- * This function MUST return FALSE if the given client does not exist or is
- * invalid. "redirect_uri" can be space-delimited to allow for multiple valid uris.
- * <code>
- * return array(
- * "redirect_uri" => REDIRECT_URI, // REQUIRED redirect_uri registered for the client
- * "client_id" => CLIENT_ID, // OPTIONAL the client id
- * "grant_types" => GRANT_TYPES, // OPTIONAL an array of restricted grant types
- * "user_id" => USER_ID, // OPTIONAL the user identifier associated with this client
- * "scope" => SCOPE, // OPTIONAL the scopes allowed for this client
- * );
- * </code>
- *
- * @ingroup oauth2_section_4
- */
- public function getClientDetails($client_id);
-
- /**
- * Get the scope associated with this client
- *
- * @return
- * STRING the space-delineated scope list for the specified client_id
- */
- public function getClientScope($client_id);
-
- /**
- * Check restricted grant types of corresponding client identifier.
- *
- * If you want to restrict clients to certain grant types, override this
- * function.
- *
- * @param $client_id
- * Client identifier to be check with.
- * @param $grant_type
- * Grant type to be check with
- *
- * @return
- * TRUE if the grant type is supported by this client identifier, and
- * FALSE if it isn't.
- *
- * @ingroup oauth2_section_4
- */
- public function checkRestrictedGrantType($client_id, $grant_type);
-}
diff --git a/library/oauth2/src/OAuth2/Storage/CouchbaseDB.php b/library/oauth2/src/OAuth2/Storage/CouchbaseDB.php
deleted file mode 100755
index 1eb55f027..000000000
--- a/library/oauth2/src/OAuth2/Storage/CouchbaseDB.php
+++ /dev/null
@@ -1,331 +0,0 @@
-<?php
-
-namespace OAuth2\Storage;
-
-use OAuth2\OpenID\Storage\AuthorizationCodeInterface as OpenIDAuthorizationCodeInterface;
-
-/**
- * Simple Couchbase storage for all storage types
- *
- * This class should be extended or overridden as required
- *
- * NOTE: Passwords are stored in plaintext, which is never
- * a good idea. Be sure to override this for your application
- *
- * @author Tom Park <tom@raucter.com>
- */
-class CouchbaseDB implements AuthorizationCodeInterface,
- AccessTokenInterface,
- ClientCredentialsInterface,
- UserCredentialsInterface,
- RefreshTokenInterface,
- JwtBearerInterface,
- OpenIDAuthorizationCodeInterface
-{
- protected $db;
- protected $config;
-
- public function __construct($connection, $config = array())
- {
- if ($connection instanceof \Couchbase) {
- $this->db = $connection;
- } else {
- if (!is_array($connection) || !is_array($connection['servers'])) {
- throw new \InvalidArgumentException('First argument to OAuth2\Storage\CouchbaseDB must be an instance of Couchbase or a configuration array containing a server array');
- }
-
- $this->db = new \Couchbase($connection['servers'], (!isset($connection['username'])) ? '' : $connection['username'], (!isset($connection['password'])) ? '' : $connection['password'], $connection['bucket'], false);
- }
-
- $this->config = array_merge(array(
- 'client_table' => 'oauth_clients',
- 'access_token_table' => 'oauth_access_tokens',
- 'refresh_token_table' => 'oauth_refresh_tokens',
- 'code_table' => 'oauth_authorization_codes',
- 'user_table' => 'oauth_users',
- 'jwt_table' => 'oauth_jwt',
- ), $config);
- }
-
- // Helper function to access couchbase item by type:
- protected function getObjectByType($name,$id)
- {
- return json_decode($this->db->get($this->config[$name].'-'.$id),true);
- }
-
- // Helper function to set couchbase item by type:
- protected function setObjectByType($name,$id,$array)
- {
- $array['type'] = $name;
-
- return $this->db->set($this->config[$name].'-'.$id,json_encode($array));
- }
-
- // Helper function to delete couchbase item by type, wait for persist to at least 1 node
- protected function deleteObjectByType($name,$id)
- {
- $this->db->delete($this->config[$name].'-'.$id,"",1);
- }
-
- /* ClientCredentialsInterface */
- public function checkClientCredentials($client_id, $client_secret = null)
- {
- if ($result = $this->getObjectByType('client_table',$client_id)) {
- return $result['client_secret'] == $client_secret;
- }
-
- return false;
- }
-
- public function isPublicClient($client_id)
- {
- if (!$result = $this->getObjectByType('client_table',$client_id)) {
- return false;
- }
-
- return empty($result['client_secret']);
- }
-
- /* ClientInterface */
- public function getClientDetails($client_id)
- {
- $result = $this->getObjectByType('client_table',$client_id);
-
- return is_null($result) ? false : $result;
- }
-
- public function setClientDetails($client_id, $client_secret = null, $redirect_uri = null, $grant_types = null, $scope = null, $user_id = null)
- {
- if ($this->getClientDetails($client_id)) {
-
- $this->setObjectByType('client_table',$client_id, array(
- 'client_id' => $client_id,
- 'client_secret' => $client_secret,
- 'redirect_uri' => $redirect_uri,
- 'grant_types' => $grant_types,
- 'scope' => $scope,
- 'user_id' => $user_id,
- ));
- } else {
- $this->setObjectByType('client_table',$client_id, array(
- 'client_id' => $client_id,
- 'client_secret' => $client_secret,
- 'redirect_uri' => $redirect_uri,
- 'grant_types' => $grant_types,
- 'scope' => $scope,
- 'user_id' => $user_id,
- ));
- }
-
- return true;
- }
-
- public function checkRestrictedGrantType($client_id, $grant_type)
- {
- $details = $this->getClientDetails($client_id);
- if (isset($details['grant_types'])) {
- $grant_types = explode(' ', $details['grant_types']);
-
- return in_array($grant_type, $grant_types);
- }
-
- // if grant_types are not defined, then none are restricted
- return true;
- }
-
- /* AccessTokenInterface */
- public function getAccessToken($access_token)
- {
- $token = $this->getObjectByType('access_token_table',$access_token);
-
- return is_null($token) ? false : $token;
- }
-
- public function setAccessToken($access_token, $client_id, $user_id, $expires, $scope = null)
- {
- // if it exists, update it.
- if ($this->getAccessToken($access_token)) {
- $this->setObjectByType('access_token_table',$access_token, array(
- 'access_token' => $access_token,
- 'client_id' => $client_id,
- 'expires' => $expires,
- 'user_id' => $user_id,
- 'scope' => $scope
- ));
- } else {
- $this->setObjectByType('access_token_table',$access_token, array(
- 'access_token' => $access_token,
- 'client_id' => $client_id,
- 'expires' => $expires,
- 'user_id' => $user_id,
- 'scope' => $scope
- ));
- }
-
- return true;
- }
-
- /* AuthorizationCodeInterface */
- public function getAuthorizationCode($code)
- {
- $code = $this->getObjectByType('code_table',$code);
-
- return is_null($code) ? false : $code;
- }
-
- public function setAuthorizationCode($code, $client_id, $user_id, $redirect_uri, $expires, $scope = null, $id_token = null)
- {
- // if it exists, update it.
- if ($this->getAuthorizationCode($code)) {
- $this->setObjectByType('code_table',$code, array(
- 'authorization_code' => $code,
- 'client_id' => $client_id,
- 'user_id' => $user_id,
- 'redirect_uri' => $redirect_uri,
- 'expires' => $expires,
- 'scope' => $scope,
- 'id_token' => $id_token,
- ));
- } else {
- $this->setObjectByType('code_table',$code,array(
- 'authorization_code' => $code,
- 'client_id' => $client_id,
- 'user_id' => $user_id,
- 'redirect_uri' => $redirect_uri,
- 'expires' => $expires,
- 'scope' => $scope,
- 'id_token' => $id_token,
- ));
- }
-
- return true;
- }
-
- public function expireAuthorizationCode($code)
- {
- $this->deleteObjectByType('code_table',$code);
-
- return true;
- }
-
- /* UserCredentialsInterface */
- public function checkUserCredentials($username, $password)
- {
- if ($user = $this->getUser($username)) {
- return $this->checkPassword($user, $password);
- }
-
- return false;
- }
-
- public function getUserDetails($username)
- {
- if ($user = $this->getUser($username)) {
- $user['user_id'] = $user['username'];
- }
-
- return $user;
- }
-
- /* RefreshTokenInterface */
- public function getRefreshToken($refresh_token)
- {
- $token = $this->getObjectByType('refresh_token_table',$refresh_token);
-
- return is_null($token) ? false : $token;
- }
-
- public function setRefreshToken($refresh_token, $client_id, $user_id, $expires, $scope = null)
- {
- $this->setObjectByType('refresh_token_table',$refresh_token, array(
- 'refresh_token' => $refresh_token,
- 'client_id' => $client_id,
- 'user_id' => $user_id,
- 'expires' => $expires,
- 'scope' => $scope
- ));
-
- return true;
- }
-
- public function unsetRefreshToken($refresh_token)
- {
- $this->deleteObjectByType('refresh_token_table',$refresh_token);
-
- return true;
- }
-
- // plaintext passwords are bad! Override this for your application
- protected function checkPassword($user, $password)
- {
- return $user['password'] == $password;
- }
-
- public function getUser($username)
- {
- $result = $this->getObjectByType('user_table',$username);
-
- return is_null($result) ? false : $result;
- }
-
- public function setUser($username, $password, $firstName = null, $lastName = null)
- {
- if ($this->getUser($username)) {
- $this->setObjectByType('user_table',$username, array(
- 'username' => $username,
- 'password' => $password,
- 'first_name' => $firstName,
- 'last_name' => $lastName
- ));
-
- } else {
- $this->setObjectByType('user_table',$username, array(
- 'username' => $username,
- 'password' => $password,
- 'first_name' => $firstName,
- 'last_name' => $lastName
- ));
-
- }
-
- return true;
- }
-
- public function getClientKey($client_id, $subject)
- {
- if (!$jwt = $this->getObjectByType('jwt_table',$client_id)) {
- return false;
- }
-
- if (isset($jwt['subject']) && $jwt['subject'] == $subject) {
- return $jwt['key'];
- }
-
- return false;
- }
-
- public function getClientScope($client_id)
- {
- if (!$clientDetails = $this->getClientDetails($client_id)) {
- return false;
- }
-
- if (isset($clientDetails['scope'])) {
- return $clientDetails['scope'];
- }
-
- return null;
- }
-
- public function getJti($client_id, $subject, $audience, $expiration, $jti)
- {
- //TODO: Needs couchbase implementation.
- throw new \Exception('getJti() for the Couchbase driver is currently unimplemented.');
- }
-
- public function setJti($client_id, $subject, $audience, $expiration, $jti)
- {
- //TODO: Needs couchbase implementation.
- throw new \Exception('setJti() for the Couchbase driver is currently unimplemented.');
- }
-}
diff --git a/library/oauth2/src/OAuth2/Storage/DynamoDB.php b/library/oauth2/src/OAuth2/Storage/DynamoDB.php
deleted file mode 100644
index 8347ab258..000000000
--- a/library/oauth2/src/OAuth2/Storage/DynamoDB.php
+++ /dev/null
@@ -1,540 +0,0 @@
-<?php
-
-namespace OAuth2\Storage;
-
-use Aws\DynamoDb\DynamoDbClient;
-
-use OAuth2\OpenID\Storage\UserClaimsInterface;
-use OAuth2\OpenID\Storage\AuthorizationCodeInterface as OpenIDAuthorizationCodeInterface;
-/**
- * DynamoDB storage for all storage types
- *
- * To use, install "aws/aws-sdk-php" via composer
- * <code>
- * composer require aws/aws-sdk-php:dev-master
- * </code>
- *
- * Once this is done, instantiate the DynamoDB client
- * <code>
- * $storage = new OAuth2\Storage\Dynamodb(array("key" => "YOURKEY", "secret" => "YOURSECRET", "region" => "YOURREGION"));
- * </code>
- *
- * Table :
- * - oauth_access_tokens (primary hash key : access_token)
- * - oauth_authorization_codes (primary hash key : authorization_code)
- * - oauth_clients (primary hash key : client_id)
- * - oauth_jwt (primary hash key : client_id, primary range key : subject)
- * - oauth_public_keys (primary hash key : client_id)
- * - oauth_refresh_tokens (primary hash key : refresh_token)
- * - oauth_scopes (primary hash key : scope, secondary index : is_default-index hash key is_default)
- * - oauth_users (primary hash key : username)
- *
- * @author Frederic AUGUSTE <frederic.auguste at gmail dot com>
- */
-class DynamoDB implements
- AuthorizationCodeInterface,
- AccessTokenInterface,
- ClientCredentialsInterface,
- UserCredentialsInterface,
- RefreshTokenInterface,
- JwtBearerInterface,
- ScopeInterface,
- PublicKeyInterface,
- UserClaimsInterface,
- OpenIDAuthorizationCodeInterface
-{
- protected $client;
- protected $config;
-
- public function __construct($connection, $config = array())
- {
- if (!($connection instanceof DynamoDbClient)) {
- if (!is_array($connection)) {
- throw new \InvalidArgumentException('First argument to OAuth2\Storage\Dynamodb must be an instance a configuration array containt key, secret, region');
- }
- if (!array_key_exists("key",$connection) || !array_key_exists("secret",$connection) || !array_key_exists("region",$connection) ) {
- throw new \InvalidArgumentException('First argument to OAuth2\Storage\Dynamodb must be an instance a configuration array containt key, secret, region');
- }
- $this->client = DynamoDbClient::factory(array(
- 'key' => $connection["key"],
- 'secret' => $connection["secret"],
- 'region' =>$connection["region"]
- ));
- } else {
- $this->client = $connection;
- }
-
- $this->config = array_merge(array(
- 'client_table' => 'oauth_clients',
- 'access_token_table' => 'oauth_access_tokens',
- 'refresh_token_table' => 'oauth_refresh_tokens',
- 'code_table' => 'oauth_authorization_codes',
- 'user_table' => 'oauth_users',
- 'jwt_table' => 'oauth_jwt',
- 'scope_table' => 'oauth_scopes',
- 'public_key_table' => 'oauth_public_keys',
- ), $config);
- }
-
- /* OAuth2\Storage\ClientCredentialsInterface */
- public function checkClientCredentials($client_id, $client_secret = null)
- {
- $result = $this->client->getItem(array(
- "TableName"=> $this->config['client_table'],
- "Key" => array('client_id' => array('S' => $client_id))
- ));
-
- return $result->count()==1 && $result["Item"]["client_secret"]["S"] == $client_secret;
- }
-
- public function isPublicClient($client_id)
- {
- $result = $this->client->getItem(array(
- "TableName"=> $this->config['client_table'],
- "Key" => array('client_id' => array('S' => $client_id))
- ));
-
- if ($result->count()==0) {
- return false ;
- }
-
- return empty($result["Item"]["client_secret"]);
- }
-
- /* OAuth2\Storage\ClientInterface */
- public function getClientDetails($client_id)
- {
- $result = $this->client->getItem(array(
- "TableName"=> $this->config['client_table'],
- "Key" => array('client_id' => array('S' => $client_id))
- ));
- if ($result->count()==0) {
- return false ;
- }
- $result = $this->dynamo2array($result);
- foreach (array('client_id', 'client_secret', 'redirect_uri', 'grant_types', 'scope', 'user_id') as $key => $val) {
- if (!array_key_exists ($val, $result)) {
- $result[$val] = null;
- }
- }
-
- return $result;
- }
-
- public function setClientDetails($client_id, $client_secret = null, $redirect_uri = null, $grant_types = null, $scope = null, $user_id = null)
- {
- $clientData = compact('client_id', 'client_secret', 'redirect_uri', 'grant_types', 'scope', 'user_id');
- $clientData = array_filter($clientData, 'self::isNotEmpty');
-
- $result = $this->client->putItem(array(
- 'TableName' => $this->config['client_table'],
- 'Item' => $this->client->formatAttributes($clientData)
- ));
-
- return true;
- }
-
- public function checkRestrictedGrantType($client_id, $grant_type)
- {
- $details = $this->getClientDetails($client_id);
- if (isset($details['grant_types'])) {
- $grant_types = explode(' ', $details['grant_types']);
-
- return in_array($grant_type, (array) $grant_types);
- }
-
- // if grant_types are not defined, then none are restricted
- return true;
- }
-
- /* OAuth2\Storage\AccessTokenInterface */
- public function getAccessToken($access_token)
- {
- $result = $this->client->getItem(array(
- "TableName"=> $this->config['access_token_table'],
- "Key" => array('access_token' => array('S' => $access_token))
- ));
- if ($result->count()==0) {
- return false ;
- }
- $token = $this->dynamo2array($result);
- if (array_key_exists ('expires', $token)) {
- $token['expires'] = strtotime($token['expires']);
- }
-
- return $token;
- }
-
- public function setAccessToken($access_token, $client_id, $user_id, $expires, $scope = null)
- {
- // convert expires to datestring
- $expires = date('Y-m-d H:i:s', $expires);
-
- $clientData = compact('access_token', 'client_id', 'user_id', 'expires', 'scope');
- $clientData = array_filter($clientData, 'self::isNotEmpty');
-
- $result = $this->client->putItem(array(
- 'TableName' => $this->config['access_token_table'],
- 'Item' => $this->client->formatAttributes($clientData)
- ));
-
- return true;
-
- }
-
- public function unsetAccessToken($access_token)
- {
- $result = $this->client->deleteItem(array(
- 'TableName' => $this->config['access_token_table'],
- 'Key' => $this->client->formatAttributes(array("access_token" => $access_token)),
- 'ReturnValues' => 'ALL_OLD',
- ));
-
- return null !== $result->get('Attributes');
- }
-
- /* OAuth2\Storage\AuthorizationCodeInterface */
- public function getAuthorizationCode($code)
- {
- $result = $this->client->getItem(array(
- "TableName"=> $this->config['code_table'],
- "Key" => array('authorization_code' => array('S' => $code))
- ));
- if ($result->count()==0) {
- return false ;
- }
- $token = $this->dynamo2array($result);
- if (!array_key_exists("id_token", $token )) {
- $token['id_token'] = null;
- }
- $token['expires'] = strtotime($token['expires']);
-
- return $token;
-
- }
-
- public function setAuthorizationCode($authorization_code, $client_id, $user_id, $redirect_uri, $expires, $scope = null, $id_token = null)
- {
- // convert expires to datestring
- $expires = date('Y-m-d H:i:s', $expires);
-
- $clientData = compact('authorization_code', 'client_id', 'user_id', 'redirect_uri', 'expires', 'id_token', 'scope');
- $clientData = array_filter($clientData, 'self::isNotEmpty');
-
- $result = $this->client->putItem(array(
- 'TableName' => $this->config['code_table'],
- 'Item' => $this->client->formatAttributes($clientData)
- ));
-
- return true;
- }
-
- public function expireAuthorizationCode($code)
- {
-
- $result = $this->client->deleteItem(array(
- 'TableName' => $this->config['code_table'],
- 'Key' => $this->client->formatAttributes(array("authorization_code" => $code))
- ));
-
- return true;
- }
-
- /* OAuth2\Storage\UserCredentialsInterface */
- public function checkUserCredentials($username, $password)
- {
- if ($user = $this->getUser($username)) {
- return $this->checkPassword($user, $password);
- }
-
- return false;
- }
-
- public function getUserDetails($username)
- {
- return $this->getUser($username);
- }
-
- /* UserClaimsInterface */
- public function getUserClaims($user_id, $claims)
- {
- if (!$userDetails = $this->getUserDetails($user_id)) {
- return false;
- }
-
- $claims = explode(' ', trim($claims));
- $userClaims = array();
-
- // for each requested claim, if the user has the claim, set it in the response
- $validClaims = explode(' ', self::VALID_CLAIMS);
- foreach ($validClaims as $validClaim) {
- if (in_array($validClaim, $claims)) {
- if ($validClaim == 'address') {
- // address is an object with subfields
- $userClaims['address'] = $this->getUserClaim($validClaim, $userDetails['address'] ?: $userDetails);
- } else {
- $userClaims = array_merge($userClaims, $this->getUserClaim($validClaim, $userDetails));
- }
- }
- }
-
- return $userClaims;
- }
-
- protected function getUserClaim($claim, $userDetails)
- {
- $userClaims = array();
- $claimValuesString = constant(sprintf('self::%s_CLAIM_VALUES', strtoupper($claim)));
- $claimValues = explode(' ', $claimValuesString);
-
- foreach ($claimValues as $value) {
- if ($value == 'email_verified') {
- $userClaims[$value] = $userDetails[$value]=='true' ? true : false;
- } else {
- $userClaims[$value] = isset($userDetails[$value]) ? $userDetails[$value] : null;
- }
- }
-
- return $userClaims;
- }
-
- /* OAuth2\Storage\RefreshTokenInterface */
- public function getRefreshToken($refresh_token)
- {
- $result = $this->client->getItem(array(
- "TableName"=> $this->config['refresh_token_table'],
- "Key" => array('refresh_token' => array('S' => $refresh_token))
- ));
- if ($result->count()==0) {
- return false ;
- }
- $token = $this->dynamo2array($result);
- $token['expires'] = strtotime($token['expires']);
-
- return $token;
- }
-
- public function setRefreshToken($refresh_token, $client_id, $user_id, $expires, $scope = null)
- {
- // convert expires to datestring
- $expires = date('Y-m-d H:i:s', $expires);
-
- $clientData = compact('refresh_token', 'client_id', 'user_id', 'expires', 'scope');
- $clientData = array_filter($clientData, 'self::isNotEmpty');
-
- $result = $this->client->putItem(array(
- 'TableName' => $this->config['refresh_token_table'],
- 'Item' => $this->client->formatAttributes($clientData)
- ));
-
- return true;
- }
-
- public function unsetRefreshToken($refresh_token)
- {
- $result = $this->client->deleteItem(array(
- 'TableName' => $this->config['refresh_token_table'],
- 'Key' => $this->client->formatAttributes(array("refresh_token" => $refresh_token))
- ));
-
- return true;
- }
-
- // plaintext passwords are bad! Override this for your application
- protected function checkPassword($user, $password)
- {
- return $user['password'] == $this->hashPassword($password);
- }
-
- // use a secure hashing algorithm when storing passwords. Override this for your application
- protected function hashPassword($password)
- {
- return sha1($password);
- }
-
- public function getUser($username)
- {
- $result = $this->client->getItem(array(
- "TableName"=> $this->config['user_table'],
- "Key" => array('username' => array('S' => $username))
- ));
- if ($result->count()==0) {
- return false ;
- }
- $token = $this->dynamo2array($result);
- $token['user_id'] = $username;
-
- return $token;
- }
-
- public function setUser($username, $password, $first_name = null, $last_name = null)
- {
- // do not store in plaintext
- $password = $this->hashPassword($password);
-
- $clientData = compact('username', 'password', 'first_name', 'last_name');
- $clientData = array_filter($clientData, 'self::isNotEmpty');
-
- $result = $this->client->putItem(array(
- 'TableName' => $this->config['user_table'],
- 'Item' => $this->client->formatAttributes($clientData)
- ));
-
- return true;
-
- }
-
- /* ScopeInterface */
- public function scopeExists($scope)
- {
- $scope = explode(' ', $scope);
- $scope_query = array();
- $count = 0;
- foreach ($scope as $key => $val) {
- $result = $this->client->query(array(
- 'TableName' => $this->config['scope_table'],
- 'Select' => 'COUNT',
- 'KeyConditions' => array(
- 'scope' => array(
- 'AttributeValueList' => array(array('S' => $val)),
- 'ComparisonOperator' => 'EQ'
- )
- )
- ));
- $count += $result['Count'];
- }
-
- return $count == count($scope);
- }
-
- public function getDefaultScope($client_id = null)
- {
-
- $result = $this->client->query(array(
- 'TableName' => $this->config['scope_table'],
- 'IndexName' => 'is_default-index',
- 'Select' => 'ALL_ATTRIBUTES',
- 'KeyConditions' => array(
- 'is_default' => array(
- 'AttributeValueList' => array(array('S' => 'true')),
- 'ComparisonOperator' => 'EQ',
- ),
- )
- ));
- $defaultScope = array();
- if ($result->count() > 0) {
- $array = $result->toArray();
- foreach ($array["Items"] as $item) {
- $defaultScope[] = $item['scope']['S'];
- }
-
- return empty($defaultScope) ? null : implode(' ', $defaultScope);
- }
-
- return null;
- }
-
- /* JWTBearerInterface */
- public function getClientKey($client_id, $subject)
- {
- $result = $this->client->getItem(array(
- "TableName"=> $this->config['jwt_table'],
- "Key" => array('client_id' => array('S' => $client_id), 'subject' => array('S' => $subject))
- ));
- if ($result->count()==0) {
- return false ;
- }
- $token = $this->dynamo2array($result);
-
- return $token['public_key'];
- }
-
- public function getClientScope($client_id)
- {
- if (!$clientDetails = $this->getClientDetails($client_id)) {
- return false;
- }
-
- if (isset($clientDetails['scope'])) {
- return $clientDetails['scope'];
- }
-
- return null;
- }
-
- public function getJti($client_id, $subject, $audience, $expires, $jti)
- {
- //TODO not use.
- }
-
- public function setJti($client_id, $subject, $audience, $expires, $jti)
- {
- //TODO not use.
- }
-
- /* PublicKeyInterface */
- public function getPublicKey($client_id = '0')
- {
-
- $result = $this->client->getItem(array(
- "TableName"=> $this->config['public_key_table'],
- "Key" => array('client_id' => array('S' => $client_id))
- ));
- if ($result->count()==0) {
- return false ;
- }
- $token = $this->dynamo2array($result);
-
- return $token['public_key'];
-
- }
-
- public function getPrivateKey($client_id = '0')
- {
- $result = $this->client->getItem(array(
- "TableName"=> $this->config['public_key_table'],
- "Key" => array('client_id' => array('S' => $client_id))
- ));
- if ($result->count()==0) {
- return false ;
- }
- $token = $this->dynamo2array($result);
-
- return $token['private_key'];
- }
-
- public function getEncryptionAlgorithm($client_id = null)
- {
- $result = $this->client->getItem(array(
- "TableName"=> $this->config['public_key_table'],
- "Key" => array('client_id' => array('S' => $client_id))
- ));
- if ($result->count()==0) {
- return 'RS256' ;
- }
- $token = $this->dynamo2array($result);
-
- return $token['encryption_algorithm'];
- }
-
- /**
- * Transform dynamodb resultset to an array.
- * @param $dynamodbResult
- * @return $array
- */
- private function dynamo2array($dynamodbResult)
- {
- $result = array();
- foreach ($dynamodbResult["Item"] as $key => $val) {
- $result[$key] = $val["S"];
- $result[] = $val["S"];
- }
-
- return $result;
- }
-
- private static function isNotEmpty($value)
- {
- return null !== $value && '' !== $value;
- }
-}
diff --git a/library/oauth2/src/OAuth2/Storage/JwtAccessToken.php b/library/oauth2/src/OAuth2/Storage/JwtAccessToken.php
deleted file mode 100644
index 75b49d301..000000000
--- a/library/oauth2/src/OAuth2/Storage/JwtAccessToken.php
+++ /dev/null
@@ -1,88 +0,0 @@
-<?php
-
-namespace OAuth2\Storage;
-
-use OAuth2\Encryption\EncryptionInterface;
-use OAuth2\Encryption\Jwt;
-
-/**
- *
- * @author Brent Shaffer <bshafs at gmail dot com>
- */
-class JwtAccessToken implements JwtAccessTokenInterface
-{
- protected $publicKeyStorage;
- protected $tokenStorage;
- protected $encryptionUtil;
-
- /**
- * @param OAuth2\Encryption\PublicKeyInterface $publicKeyStorage the public key encryption to use
- * @param OAuth2\Storage\AccessTokenInterface $tokenStorage OPTIONAL persist the access token to another storage. This is useful if
- * you want to retain access token grant information somewhere, but
- * is not necessary when using this grant type.
- * @param OAuth2\Encryption\EncryptionInterface $encryptionUtil OPTIONAL class to use for "encode" and "decode" functions.
- */
- public function __construct(PublicKeyInterface $publicKeyStorage, AccessTokenInterface $tokenStorage = null, EncryptionInterface $encryptionUtil = null)
- {
- $this->publicKeyStorage = $publicKeyStorage;
- $this->tokenStorage = $tokenStorage;
- if (is_null($encryptionUtil)) {
- $encryptionUtil = new Jwt;
- }
- $this->encryptionUtil = $encryptionUtil;
- }
-
- public function getAccessToken($oauth_token)
- {
- // just decode the token, don't verify
- if (!$tokenData = $this->encryptionUtil->decode($oauth_token, null, false)) {
- return false;
- }
-
- $client_id = isset($tokenData['aud']) ? $tokenData['aud'] : null;
- $public_key = $this->publicKeyStorage->getPublicKey($client_id);
- $algorithm = $this->publicKeyStorage->getEncryptionAlgorithm($client_id);
-
- // now that we have the client_id, verify the token
- if (false === $this->encryptionUtil->decode($oauth_token, $public_key, array($algorithm))) {
- return false;
- }
-
- // normalize the JWT claims to the format expected by other components in this library
- return $this->convertJwtToOAuth2($tokenData);
- }
-
- public function setAccessToken($oauth_token, $client_id, $user_id, $expires, $scope = null)
- {
- if ($this->tokenStorage) {
- return $this->tokenStorage->setAccessToken($oauth_token, $client_id, $user_id, $expires, $scope);
- }
- }
-
- public function unsetAccessToken($access_token)
- {
- if ($this->tokenStorage) {
- return $this->tokenStorage->unsetAccessToken($access_token);
- }
- }
-
-
- // converts a JWT access token into an OAuth2-friendly format
- protected function convertJwtToOAuth2($tokenData)
- {
- $keyMapping = array(
- 'aud' => 'client_id',
- 'exp' => 'expires',
- 'sub' => 'user_id'
- );
-
- foreach ($keyMapping as $jwtKey => $oauth2Key) {
- if (isset($tokenData[$jwtKey])) {
- $tokenData[$oauth2Key] = $tokenData[$jwtKey];
- unset($tokenData[$jwtKey]);
- }
- }
-
- return $tokenData;
- }
-}
diff --git a/library/oauth2/src/OAuth2/Storage/JwtAccessTokenInterface.php b/library/oauth2/src/OAuth2/Storage/JwtAccessTokenInterface.php
deleted file mode 100644
index 3abb2aa2d..000000000
--- a/library/oauth2/src/OAuth2/Storage/JwtAccessTokenInterface.php
+++ /dev/null
@@ -1,14 +0,0 @@
-<?php
-
-namespace OAuth2\Storage;
-
-/**
- * No specific methods, but allows the library to check "instanceof"
- * against interface rather than class
- *
- * @author Brent Shaffer <bshafs at gmail dot com>
- */
-interface JwtAccessTokenInterface extends AccessTokenInterface
-{
-
-}
diff --git a/library/oauth2/src/OAuth2/Storage/JwtBearerInterface.php b/library/oauth2/src/OAuth2/Storage/JwtBearerInterface.php
deleted file mode 100644
index c83aa72ea..000000000
--- a/library/oauth2/src/OAuth2/Storage/JwtBearerInterface.php
+++ /dev/null
@@ -1,74 +0,0 @@
-<?php
-
-namespace OAuth2\Storage;
-
-/**
- * Implement this interface to specify where the OAuth2 Server
- * should get the JWT key for clients
- *
- * @TODO consider extending ClientInterface, as this will almost always
- * be the same storage as retrieving clientData
- *
- * @author F21
- * @author Brent Shaffer <bshafs at gmail dot com>
- */
-interface JwtBearerInterface
-{
- /**
- * Get the public key associated with a client_id
- *
- * @param $client_id
- * Client identifier to be checked with.
- *
- * @return
- * STRING Return the public key for the client_id if it exists, and MUST return FALSE if it doesn't.
- */
- public function getClientKey($client_id, $subject);
-
- /**
- * Get a jti (JSON token identifier) by matching against the client_id, subject, audience and expiration.
- *
- * @param $client_id
- * Client identifier to match.
- *
- * @param $subject
- * The subject to match.
- *
- * @param $audience
- * The audience to match.
- *
- * @param $expiration
- * The expiration of the jti.
- *
- * @param $jti
- * The jti to match.
- *
- * @return
- * An associative array as below, and return NULL if the jti does not exist.
- * - issuer: Stored client identifier.
- * - subject: Stored subject.
- * - audience: Stored audience.
- * - expires: Stored expiration in unix timestamp.
- * - jti: The stored jti.
- */
- public function getJti($client_id, $subject, $audience, $expiration, $jti);
-
- /**
- * Store a used jti so that we can check against it to prevent replay attacks.
- * @param $client_id
- * Client identifier to insert.
- *
- * @param $subject
- * The subject to insert.
- *
- * @param $audience
- * The audience to insert.
- *
- * @param $expiration
- * The expiration of the jti.
- *
- * @param $jti
- * The jti to insert.
- */
- public function setJti($client_id, $subject, $audience, $expiration, $jti);
-}
diff --git a/library/oauth2/src/OAuth2/Storage/Memory.php b/library/oauth2/src/OAuth2/Storage/Memory.php
deleted file mode 100644
index 42d833ccb..000000000
--- a/library/oauth2/src/OAuth2/Storage/Memory.php
+++ /dev/null
@@ -1,381 +0,0 @@
-<?php
-
-namespace OAuth2\Storage;
-
-use OAuth2\OpenID\Storage\UserClaimsInterface;
-use OAuth2\OpenID\Storage\AuthorizationCodeInterface as OpenIDAuthorizationCodeInterface;
-
-/**
- * Simple in-memory storage for all storage types
- *
- * NOTE: This class should never be used in production, and is
- * a stub class for example use only
- *
- * @author Brent Shaffer <bshafs at gmail dot com>
- */
-class Memory implements AuthorizationCodeInterface,
- UserCredentialsInterface,
- UserClaimsInterface,
- AccessTokenInterface,
- ClientCredentialsInterface,
- RefreshTokenInterface,
- JwtBearerInterface,
- ScopeInterface,
- PublicKeyInterface,
- OpenIDAuthorizationCodeInterface
-{
- public $authorizationCodes;
- public $userCredentials;
- public $clientCredentials;
- public $refreshTokens;
- public $accessTokens;
- public $jwt;
- public $jti;
- public $supportedScopes;
- public $defaultScope;
- public $keys;
-
- public function __construct($params = array())
- {
- $params = array_merge(array(
- 'authorization_codes' => array(),
- 'user_credentials' => array(),
- 'client_credentials' => array(),
- 'refresh_tokens' => array(),
- 'access_tokens' => array(),
- 'jwt' => array(),
- 'jti' => array(),
- 'default_scope' => null,
- 'supported_scopes' => array(),
- 'keys' => array(),
- ), $params);
-
- $this->authorizationCodes = $params['authorization_codes'];
- $this->userCredentials = $params['user_credentials'];
- $this->clientCredentials = $params['client_credentials'];
- $this->refreshTokens = $params['refresh_tokens'];
- $this->accessTokens = $params['access_tokens'];
- $this->jwt = $params['jwt'];
- $this->jti = $params['jti'];
- $this->supportedScopes = $params['supported_scopes'];
- $this->defaultScope = $params['default_scope'];
- $this->keys = $params['keys'];
- }
-
- /* AuthorizationCodeInterface */
- public function getAuthorizationCode($code)
- {
- if (!isset($this->authorizationCodes[$code])) {
- return false;
- }
-
- return array_merge(array(
- 'authorization_code' => $code,
- ), $this->authorizationCodes[$code]);
- }
-
- public function setAuthorizationCode($code, $client_id, $user_id, $redirect_uri, $expires, $scope = null, $id_token = null)
- {
- $this->authorizationCodes[$code] = compact('code', 'client_id', 'user_id', 'redirect_uri', 'expires', 'scope', 'id_token');
-
- return true;
- }
-
- public function setAuthorizationCodes($authorization_codes)
- {
- $this->authorizationCodes = $authorization_codes;
- }
-
- public function expireAuthorizationCode($code)
- {
- unset($this->authorizationCodes[$code]);
- }
-
- /* UserCredentialsInterface */
- public function checkUserCredentials($username, $password)
- {
- $userDetails = $this->getUserDetails($username);
-
- return $userDetails && $userDetails['password'] && $userDetails['password'] === $password;
- }
-
- public function setUser($username, $password, $firstName = null, $lastName = null)
- {
- $this->userCredentials[$username] = array(
- 'password' => $password,
- 'first_name' => $firstName,
- 'last_name' => $lastName,
- );
-
- return true;
- }
-
- public function getUserDetails($username)
- {
- if (!isset($this->userCredentials[$username])) {
- return false;
- }
-
- return array_merge(array(
- 'user_id' => $username,
- 'password' => null,
- 'first_name' => null,
- 'last_name' => null,
- ), $this->userCredentials[$username]);
- }
-
- /* UserClaimsInterface */
- public function getUserClaims($user_id, $claims)
- {
- if (!$userDetails = $this->getUserDetails($user_id)) {
- return false;
- }
-
- $claims = explode(' ', trim($claims));
- $userClaims = array();
-
- // for each requested claim, if the user has the claim, set it in the response
- $validClaims = explode(' ', self::VALID_CLAIMS);
- foreach ($validClaims as $validClaim) {
- if (in_array($validClaim, $claims)) {
- if ($validClaim == 'address') {
- // address is an object with subfields
- $userClaims['address'] = $this->getUserClaim($validClaim, $userDetails['address'] ?: $userDetails);
- } else {
- $userClaims = array_merge($userClaims, $this->getUserClaim($validClaim, $userDetails));
- }
- }
- }
-
- return $userClaims;
- }
-
- protected function getUserClaim($claim, $userDetails)
- {
- $userClaims = array();
- $claimValuesString = constant(sprintf('self::%s_CLAIM_VALUES', strtoupper($claim)));
- $claimValues = explode(' ', $claimValuesString);
-
- foreach ($claimValues as $value) {
- $userClaims[$value] = isset($userDetails[$value]) ? $userDetails[$value] : null;
- }
-
- return $userClaims;
- }
-
- /* ClientCredentialsInterface */
- public function checkClientCredentials($client_id, $client_secret = null)
- {
- return isset($this->clientCredentials[$client_id]['client_secret']) && $this->clientCredentials[$client_id]['client_secret'] === $client_secret;
- }
-
- public function isPublicClient($client_id)
- {
- if (!isset($this->clientCredentials[$client_id])) {
- return false;
- }
-
- return empty($this->clientCredentials[$client_id]['client_secret']);
- }
-
- /* ClientInterface */
- public function getClientDetails($client_id)
- {
- if (!isset($this->clientCredentials[$client_id])) {
- return false;
- }
-
- $clientDetails = array_merge(array(
- 'client_id' => $client_id,
- 'client_secret' => null,
- 'redirect_uri' => null,
- 'scope' => null,
- ), $this->clientCredentials[$client_id]);
-
- return $clientDetails;
- }
-
- public function checkRestrictedGrantType($client_id, $grant_type)
- {
- if (isset($this->clientCredentials[$client_id]['grant_types'])) {
- $grant_types = explode(' ', $this->clientCredentials[$client_id]['grant_types']);
-
- return in_array($grant_type, $grant_types);
- }
-
- // if grant_types are not defined, then none are restricted
- return true;
- }
-
- public function setClientDetails($client_id, $client_secret = null, $redirect_uri = null, $grant_types = null, $scope = null, $user_id = null)
- {
- $this->clientCredentials[$client_id] = array(
- 'client_id' => $client_id,
- 'client_secret' => $client_secret,
- 'redirect_uri' => $redirect_uri,
- 'grant_types' => $grant_types,
- 'scope' => $scope,
- 'user_id' => $user_id,
- );
-
- return true;
- }
-
- /* RefreshTokenInterface */
- public function getRefreshToken($refresh_token)
- {
- return isset($this->refreshTokens[$refresh_token]) ? $this->refreshTokens[$refresh_token] : false;
- }
-
- public function setRefreshToken($refresh_token, $client_id, $user_id, $expires, $scope = null)
- {
- $this->refreshTokens[$refresh_token] = compact('refresh_token', 'client_id', 'user_id', 'expires', 'scope');
-
- return true;
- }
-
- public function unsetRefreshToken($refresh_token)
- {
- if (isset($this->refreshTokens[$refresh_token])) {
- unset($this->refreshTokens[$refresh_token]);
-
- return true;
- }
-
- return false;
- }
-
- public function setRefreshTokens($refresh_tokens)
- {
- $this->refreshTokens = $refresh_tokens;
- }
-
- /* AccessTokenInterface */
- public function getAccessToken($access_token)
- {
- return isset($this->accessTokens[$access_token]) ? $this->accessTokens[$access_token] : false;
- }
-
- public function setAccessToken($access_token, $client_id, $user_id, $expires, $scope = null, $id_token = null)
- {
- $this->accessTokens[$access_token] = compact('access_token', 'client_id', 'user_id', 'expires', 'scope', 'id_token');
-
- return true;
- }
-
- public function unsetAccessToken($access_token)
- {
- if (isset($this->accessTokens[$access_token])) {
- unset($this->accessTokens[$access_token]);
-
- return true;
- }
-
- return false;
- }
-
- public function scopeExists($scope)
- {
- $scope = explode(' ', trim($scope));
-
- return (count(array_diff($scope, $this->supportedScopes)) == 0);
- }
-
- public function getDefaultScope($client_id = null)
- {
- return $this->defaultScope;
- }
-
- /*JWTBearerInterface */
- public function getClientKey($client_id, $subject)
- {
- if (isset($this->jwt[$client_id])) {
- $jwt = $this->jwt[$client_id];
- if ($jwt) {
- if ($jwt["subject"] == $subject) {
- return $jwt["key"];
- }
- }
- }
-
- return false;
- }
-
- public function getClientScope($client_id)
- {
- if (!$clientDetails = $this->getClientDetails($client_id)) {
- return false;
- }
-
- if (isset($clientDetails['scope'])) {
- return $clientDetails['scope'];
- }
-
- return null;
- }
-
- public function getJti($client_id, $subject, $audience, $expires, $jti)
- {
- foreach ($this->jti as $storedJti) {
- if ($storedJti['issuer'] == $client_id && $storedJti['subject'] == $subject && $storedJti['audience'] == $audience && $storedJti['expires'] == $expires && $storedJti['jti'] == $jti) {
- return array(
- 'issuer' => $storedJti['issuer'],
- 'subject' => $storedJti['subject'],
- 'audience' => $storedJti['audience'],
- 'expires' => $storedJti['expires'],
- 'jti' => $storedJti['jti']
- );
- }
- }
-
- return null;
- }
-
- public function setJti($client_id, $subject, $audience, $expires, $jti)
- {
- $this->jti[] = array('issuer' => $client_id, 'subject' => $subject, 'audience' => $audience, 'expires' => $expires, 'jti' => $jti);
- }
-
- /*PublicKeyInterface */
- public function getPublicKey($client_id = null)
- {
- if (isset($this->keys[$client_id])) {
- return $this->keys[$client_id]['public_key'];
- }
-
- // use a global encryption pair
- if (isset($this->keys['public_key'])) {
- return $this->keys['public_key'];
- }
-
- return false;
- }
-
- public function getPrivateKey($client_id = null)
- {
- if (isset($this->keys[$client_id])) {
- return $this->keys[$client_id]['private_key'];
- }
-
- // use a global encryption pair
- if (isset($this->keys['private_key'])) {
- return $this->keys['private_key'];
- }
-
- return false;
- }
-
- public function getEncryptionAlgorithm($client_id = null)
- {
- if (isset($this->keys[$client_id]['encryption_algorithm'])) {
- return $this->keys[$client_id]['encryption_algorithm'];
- }
-
- // use a global encryption algorithm
- if (isset($this->keys['encryption_algorithm'])) {
- return $this->keys['encryption_algorithm'];
- }
-
- return 'RS256';
- }
-}
diff --git a/library/oauth2/src/OAuth2/Storage/Mongo.php b/library/oauth2/src/OAuth2/Storage/Mongo.php
deleted file mode 100644
index cef35e5e9..000000000
--- a/library/oauth2/src/OAuth2/Storage/Mongo.php
+++ /dev/null
@@ -1,339 +0,0 @@
-<?php
-
-namespace OAuth2\Storage;
-
-use OAuth2\OpenID\Storage\AuthorizationCodeInterface as OpenIDAuthorizationCodeInterface;
-
-/**
- * Simple MongoDB storage for all storage types
- *
- * NOTE: This class is meant to get users started
- * quickly. If your application requires further
- * customization, extend this class or create your own.
- *
- * NOTE: Passwords are stored in plaintext, which is never
- * a good idea. Be sure to override this for your application
- *
- * @author Julien Chaumond <chaumond@gmail.com>
- */
-class Mongo implements AuthorizationCodeInterface,
- AccessTokenInterface,
- ClientCredentialsInterface,
- UserCredentialsInterface,
- RefreshTokenInterface,
- JwtBearerInterface,
- OpenIDAuthorizationCodeInterface
-{
- protected $db;
- protected $config;
-
- public function __construct($connection, $config = array())
- {
- if ($connection instanceof \MongoDB) {
- $this->db = $connection;
- } else {
- if (!is_array($connection)) {
- throw new \InvalidArgumentException('First argument to OAuth2\Storage\Mongo must be an instance of MongoDB or a configuration array');
- }
- $server = sprintf('mongodb://%s:%d', $connection['host'], $connection['port']);
- $m = new \MongoClient($server);
- $this->db = $m->{$connection['database']};
- }
-
- $this->config = array_merge(array(
- 'client_table' => 'oauth_clients',
- 'access_token_table' => 'oauth_access_tokens',
- 'refresh_token_table' => 'oauth_refresh_tokens',
- 'code_table' => 'oauth_authorization_codes',
- 'user_table' => 'oauth_users',
- 'jwt_table' => 'oauth_jwt',
- ), $config);
- }
-
- // Helper function to access a MongoDB collection by `type`:
- protected function collection($name)
- {
- return $this->db->{$this->config[$name]};
- }
-
- /* ClientCredentialsInterface */
- public function checkClientCredentials($client_id, $client_secret = null)
- {
- if ($result = $this->collection('client_table')->findOne(array('client_id' => $client_id))) {
- return $result['client_secret'] == $client_secret;
- }
-
- return false;
- }
-
- public function isPublicClient($client_id)
- {
- if (!$result = $this->collection('client_table')->findOne(array('client_id' => $client_id))) {
- return false;
- }
-
- return empty($result['client_secret']);
- }
-
- /* ClientInterface */
- public function getClientDetails($client_id)
- {
- $result = $this->collection('client_table')->findOne(array('client_id' => $client_id));
-
- return is_null($result) ? false : $result;
- }
-
- public function setClientDetails($client_id, $client_secret = null, $redirect_uri = null, $grant_types = null, $scope = null, $user_id = null)
- {
- if ($this->getClientDetails($client_id)) {
- $this->collection('client_table')->update(
- array('client_id' => $client_id),
- array('$set' => array(
- 'client_secret' => $client_secret,
- 'redirect_uri' => $redirect_uri,
- 'grant_types' => $grant_types,
- 'scope' => $scope,
- 'user_id' => $user_id,
- ))
- );
- } else {
- $client = array(
- 'client_id' => $client_id,
- 'client_secret' => $client_secret,
- 'redirect_uri' => $redirect_uri,
- 'grant_types' => $grant_types,
- 'scope' => $scope,
- 'user_id' => $user_id,
- );
- $this->collection('client_table')->insert($client);
- }
-
- return true;
- }
-
- public function checkRestrictedGrantType($client_id, $grant_type)
- {
- $details = $this->getClientDetails($client_id);
- if (isset($details['grant_types'])) {
- $grant_types = explode(' ', $details['grant_types']);
-
- return in_array($grant_type, $grant_types);
- }
-
- // if grant_types are not defined, then none are restricted
- return true;
- }
-
- /* AccessTokenInterface */
- public function getAccessToken($access_token)
- {
- $token = $this->collection('access_token_table')->findOne(array('access_token' => $access_token));
-
- return is_null($token) ? false : $token;
- }
-
- public function setAccessToken($access_token, $client_id, $user_id, $expires, $scope = null)
- {
- // if it exists, update it.
- if ($this->getAccessToken($access_token)) {
- $this->collection('access_token_table')->update(
- array('access_token' => $access_token),
- array('$set' => array(
- 'client_id' => $client_id,
- 'expires' => $expires,
- 'user_id' => $user_id,
- 'scope' => $scope
- ))
- );
- } else {
- $token = array(
- 'access_token' => $access_token,
- 'client_id' => $client_id,
- 'expires' => $expires,
- 'user_id' => $user_id,
- 'scope' => $scope
- );
- $this->collection('access_token_table')->insert($token);
- }
-
- return true;
- }
-
- public function unsetAccessToken($access_token)
- {
- $result = $this->collection('access_token_table')->remove(array(
- 'access_token' => $access_token
- ), array('w' => 1));
-
- return $result['n'] > 0;
- }
-
-
- /* AuthorizationCodeInterface */
- public function getAuthorizationCode($code)
- {
- $code = $this->collection('code_table')->findOne(array('authorization_code' => $code));
-
- return is_null($code) ? false : $code;
- }
-
- public function setAuthorizationCode($code, $client_id, $user_id, $redirect_uri, $expires, $scope = null, $id_token = null)
- {
- // if it exists, update it.
- if ($this->getAuthorizationCode($code)) {
- $this->collection('code_table')->update(
- array('authorization_code' => $code),
- array('$set' => array(
- 'client_id' => $client_id,
- 'user_id' => $user_id,
- 'redirect_uri' => $redirect_uri,
- 'expires' => $expires,
- 'scope' => $scope,
- 'id_token' => $id_token,
- ))
- );
- } else {
- $token = array(
- 'authorization_code' => $code,
- 'client_id' => $client_id,
- 'user_id' => $user_id,
- 'redirect_uri' => $redirect_uri,
- 'expires' => $expires,
- 'scope' => $scope,
- 'id_token' => $id_token,
- );
- $this->collection('code_table')->insert($token);
- }
-
- return true;
- }
-
- public function expireAuthorizationCode($code)
- {
- $this->collection('code_table')->remove(array('authorization_code' => $code));
-
- return true;
- }
-
- /* UserCredentialsInterface */
- public function checkUserCredentials($username, $password)
- {
- if ($user = $this->getUser($username)) {
- return $this->checkPassword($user, $password);
- }
-
- return false;
- }
-
- public function getUserDetails($username)
- {
- if ($user = $this->getUser($username)) {
- $user['user_id'] = $user['username'];
- }
-
- return $user;
- }
-
- /* RefreshTokenInterface */
- public function getRefreshToken($refresh_token)
- {
- $token = $this->collection('refresh_token_table')->findOne(array('refresh_token' => $refresh_token));
-
- return is_null($token) ? false : $token;
- }
-
- public function setRefreshToken($refresh_token, $client_id, $user_id, $expires, $scope = null)
- {
- $token = array(
- 'refresh_token' => $refresh_token,
- 'client_id' => $client_id,
- 'user_id' => $user_id,
- 'expires' => $expires,
- 'scope' => $scope
- );
- $this->collection('refresh_token_table')->insert($token);
-
- return true;
- }
-
- public function unsetRefreshToken($refresh_token)
- {
- $result = $this->collection('refresh_token_table')->remove(array(
- 'refresh_token' => $refresh_token
- ), array('w' => 1));
-
- return $result['n'] > 0;
- }
-
- // plaintext passwords are bad! Override this for your application
- protected function checkPassword($user, $password)
- {
- return $user['password'] == $password;
- }
-
- public function getUser($username)
- {
- $result = $this->collection('user_table')->findOne(array('username' => $username));
-
- return is_null($result) ? false : $result;
- }
-
- public function setUser($username, $password, $firstName = null, $lastName = null)
- {
- if ($this->getUser($username)) {
- $this->collection('user_table')->update(
- array('username' => $username),
- array('$set' => array(
- 'password' => $password,
- 'first_name' => $firstName,
- 'last_name' => $lastName
- ))
- );
- } else {
- $user = array(
- 'username' => $username,
- 'password' => $password,
- 'first_name' => $firstName,
- 'last_name' => $lastName
- );
- $this->collection('user_table')->insert($user);
- }
-
- return true;
- }
-
- public function getClientKey($client_id, $subject)
- {
- $result = $this->collection('jwt_table')->findOne(array(
- 'client_id' => $client_id,
- 'subject' => $subject
- ));
-
- return is_null($result) ? false : $result['key'];
- }
-
- public function getClientScope($client_id)
- {
- if (!$clientDetails = $this->getClientDetails($client_id)) {
- return false;
- }
-
- if (isset($clientDetails['scope'])) {
- return $clientDetails['scope'];
- }
-
- return null;
- }
-
- public function getJti($client_id, $subject, $audience, $expiration, $jti)
- {
- //TODO: Needs mongodb implementation.
- throw new \Exception('getJti() for the MongoDB driver is currently unimplemented.');
- }
-
- public function setJti($client_id, $subject, $audience, $expiration, $jti)
- {
- //TODO: Needs mongodb implementation.
- throw new \Exception('setJti() for the MongoDB driver is currently unimplemented.');
- }
-}
diff --git a/library/oauth2/src/OAuth2/Storage/Pdo.php b/library/oauth2/src/OAuth2/Storage/Pdo.php
deleted file mode 100644
index ae5107e29..000000000
--- a/library/oauth2/src/OAuth2/Storage/Pdo.php
+++ /dev/null
@@ -1,553 +0,0 @@
-<?php
-
-namespace OAuth2\Storage;
-
-use OAuth2\OpenID\Storage\UserClaimsInterface;
-use OAuth2\OpenID\Storage\AuthorizationCodeInterface as OpenIDAuthorizationCodeInterface;
-
-/**
- * Simple PDO storage for all storage types
- *
- * NOTE: This class is meant to get users started
- * quickly. If your application requires further
- * customization, extend this class or create your own.
- *
- * NOTE: Passwords are stored in plaintext, which is never
- * a good idea. Be sure to override this for your application
- *
- * @author Brent Shaffer <bshafs at gmail dot com>
- */
-class Pdo implements
- AuthorizationCodeInterface,
- AccessTokenInterface,
- ClientCredentialsInterface,
- UserCredentialsInterface,
- RefreshTokenInterface,
- JwtBearerInterface,
- ScopeInterface,
- PublicKeyInterface,
- UserClaimsInterface,
- OpenIDAuthorizationCodeInterface
-{
- protected $db;
- protected $config;
-
- public function __construct($connection, $config = array())
- {
- if (!$connection instanceof \PDO) {
- if (is_string($connection)) {
- $connection = array('dsn' => $connection);
- }
- if (!is_array($connection)) {
- throw new \InvalidArgumentException('First argument to OAuth2\Storage\Pdo must be an instance of PDO, a DSN string, or a configuration array');
- }
- if (!isset($connection['dsn'])) {
- throw new \InvalidArgumentException('configuration array must contain "dsn"');
- }
- // merge optional parameters
- $connection = array_merge(array(
- 'username' => null,
- 'password' => null,
- 'options' => array(),
- ), $connection);
- $connection = new \PDO($connection['dsn'], $connection['username'], $connection['password'], $connection['options']);
- }
- $this->db = $connection;
-
- // debugging
- $connection->setAttribute(\PDO::ATTR_ERRMODE, \PDO::ERRMODE_EXCEPTION);
-
- $this->config = array_merge(array(
- 'client_table' => 'oauth_clients',
- 'access_token_table' => 'oauth_access_tokens',
- 'refresh_token_table' => 'oauth_refresh_tokens',
- 'code_table' => 'oauth_authorization_codes',
- 'user_table' => 'oauth_users',
- 'jwt_table' => 'oauth_jwt',
- 'jti_table' => 'oauth_jti',
- 'scope_table' => 'oauth_scopes',
- 'public_key_table' => 'oauth_public_keys',
- ), $config);
- }
-
- /* OAuth2\Storage\ClientCredentialsInterface */
- public function checkClientCredentials($client_id, $client_secret = null)
- {
- $stmt = $this->db->prepare(sprintf('SELECT * from %s where client_id = :client_id', $this->config['client_table']));
- $stmt->execute(compact('client_id'));
- $result = $stmt->fetch(\PDO::FETCH_ASSOC);
-
- // make this extensible
- return $result && $result['client_secret'] == $client_secret;
- }
-
- public function isPublicClient($client_id)
- {
- $stmt = $this->db->prepare(sprintf('SELECT * from %s where client_id = :client_id', $this->config['client_table']));
- $stmt->execute(compact('client_id'));
-
- if (!$result = $stmt->fetch(\PDO::FETCH_ASSOC)) {
- return false;
- }
-
- return empty($result['client_secret']);
- }
-
- /* OAuth2\Storage\ClientInterface */
- public function getClientDetails($client_id)
- {
- $stmt = $this->db->prepare(sprintf('SELECT * from %s where client_id = :client_id', $this->config['client_table']));
- $stmt->execute(compact('client_id'));
-
- return $stmt->fetch(\PDO::FETCH_ASSOC);
- }
-
- public function setClientDetails($client_id, $client_secret = null, $redirect_uri = null, $grant_types = null, $scope = null, $user_id = null)
- {
- // if it exists, update it.
- if ($this->getClientDetails($client_id)) {
- $stmt = $this->db->prepare($sql = sprintf('UPDATE %s SET client_secret=:client_secret, redirect_uri=:redirect_uri, grant_types=:grant_types, scope=:scope, user_id=:user_id where client_id=:client_id', $this->config['client_table']));
- } else {
- $stmt = $this->db->prepare(sprintf('INSERT INTO %s (client_id, client_secret, redirect_uri, grant_types, scope, user_id) VALUES (:client_id, :client_secret, :redirect_uri, :grant_types, :scope, :user_id)', $this->config['client_table']));
- }
-
- return $stmt->execute(compact('client_id', 'client_secret', 'redirect_uri', 'grant_types', 'scope', 'user_id'));
- }
-
- public function checkRestrictedGrantType($client_id, $grant_type)
- {
- $details = $this->getClientDetails($client_id);
- if (isset($details['grant_types'])) {
- $grant_types = explode(' ', $details['grant_types']);
-
- return in_array($grant_type, (array) $grant_types);
- }
-
- // if grant_types are not defined, then none are restricted
- return true;
- }
-
- /* OAuth2\Storage\AccessTokenInterface */
- public function getAccessToken($access_token)
- {
- $stmt = $this->db->prepare(sprintf('SELECT * from %s where access_token = :access_token', $this->config['access_token_table']));
-
- $token = $stmt->execute(compact('access_token'));
- if ($token = $stmt->fetch(\PDO::FETCH_ASSOC)) {
- // convert date string back to timestamp
- $token['expires'] = strtotime($token['expires']);
- }
-
- return $token;
- }
-
- public function setAccessToken($access_token, $client_id, $user_id, $expires, $scope = null)
- {
- // convert expires to datestring
- $expires = date('Y-m-d H:i:s', $expires);
-
- // if it exists, update it.
- if ($this->getAccessToken($access_token)) {
- $stmt = $this->db->prepare(sprintf('UPDATE %s SET client_id=:client_id, expires=:expires, user_id=:user_id, scope=:scope where access_token=:access_token', $this->config['access_token_table']));
- } else {
- $stmt = $this->db->prepare(sprintf('INSERT INTO %s (access_token, client_id, expires, user_id, scope) VALUES (:access_token, :client_id, :expires, :user_id, :scope)', $this->config['access_token_table']));
- }
-
- return $stmt->execute(compact('access_token', 'client_id', 'user_id', 'expires', 'scope'));
- }
-
- public function unsetAccessToken($access_token)
- {
- $stmt = $this->db->prepare(sprintf('DELETE FROM %s WHERE access_token = :access_token', $this->config['access_token_table']));
-
- $stmt->execute(compact('access_token'));
-
- return $stmt->rowCount() > 0;
- }
-
- /* OAuth2\Storage\AuthorizationCodeInterface */
- public function getAuthorizationCode($code)
- {
- $stmt = $this->db->prepare(sprintf('SELECT * from %s where authorization_code = :code', $this->config['code_table']));
- $stmt->execute(compact('code'));
-
- if ($code = $stmt->fetch(\PDO::FETCH_ASSOC)) {
- // convert date string back to timestamp
- $code['expires'] = strtotime($code['expires']);
- }
-
- return $code;
- }
-
- public function setAuthorizationCode($code, $client_id, $user_id, $redirect_uri, $expires, $scope = null, $id_token = null)
- {
- if (func_num_args() > 6) {
- // we are calling with an id token
- return call_user_func_array(array($this, 'setAuthorizationCodeWithIdToken'), func_get_args());
- }
-
- // convert expires to datestring
- $expires = date('Y-m-d H:i:s', $expires);
-
- // if it exists, update it.
- if ($this->getAuthorizationCode($code)) {
- $stmt = $this->db->prepare($sql = sprintf('UPDATE %s SET client_id=:client_id, user_id=:user_id, redirect_uri=:redirect_uri, expires=:expires, scope=:scope where authorization_code=:code', $this->config['code_table']));
- } else {
- $stmt = $this->db->prepare(sprintf('INSERT INTO %s (authorization_code, client_id, user_id, redirect_uri, expires, scope) VALUES (:code, :client_id, :user_id, :redirect_uri, :expires, :scope)', $this->config['code_table']));
- }
-
- return $stmt->execute(compact('code', 'client_id', 'user_id', 'redirect_uri', 'expires', 'scope'));
- }
-
- private function setAuthorizationCodeWithIdToken($code, $client_id, $user_id, $redirect_uri, $expires, $scope = null, $id_token = null)
- {
- // convert expires to datestring
- $expires = date('Y-m-d H:i:s', $expires);
-
- // if it exists, update it.
- if ($this->getAuthorizationCode($code)) {
- $stmt = $this->db->prepare($sql = sprintf('UPDATE %s SET client_id=:client_id, user_id=:user_id, redirect_uri=:redirect_uri, expires=:expires, scope=:scope, id_token =:id_token where authorization_code=:code', $this->config['code_table']));
- } else {
- $stmt = $this->db->prepare(sprintf('INSERT INTO %s (authorization_code, client_id, user_id, redirect_uri, expires, scope, id_token) VALUES (:code, :client_id, :user_id, :redirect_uri, :expires, :scope, :id_token)', $this->config['code_table']));
- }
-
- return $stmt->execute(compact('code', 'client_id', 'user_id', 'redirect_uri', 'expires', 'scope', 'id_token'));
- }
-
- public function expireAuthorizationCode($code)
- {
- $stmt = $this->db->prepare(sprintf('DELETE FROM %s WHERE authorization_code = :code', $this->config['code_table']));
-
- return $stmt->execute(compact('code'));
- }
-
- /* OAuth2\Storage\UserCredentialsInterface */
- public function checkUserCredentials($username, $password)
- {
- if ($user = $this->getUser($username)) {
- return $this->checkPassword($user, $password);
- }
-
- return false;
- }
-
- public function getUserDetails($username)
- {
- return $this->getUser($username);
- }
-
- /* UserClaimsInterface */
- public function getUserClaims($user_id, $claims)
- {
- if (!$userDetails = $this->getUserDetails($user_id)) {
- return false;
- }
-
- $claims = explode(' ', trim($claims));
- $userClaims = array();
-
- // for each requested claim, if the user has the claim, set it in the response
- $validClaims = explode(' ', self::VALID_CLAIMS);
- foreach ($validClaims as $validClaim) {
- if (in_array($validClaim, $claims)) {
- if ($validClaim == 'address') {
- // address is an object with subfields
- $userClaims['address'] = $this->getUserClaim($validClaim, $userDetails['address'] ?: $userDetails);
- } else {
- $userClaims = array_merge($userClaims, $this->getUserClaim($validClaim, $userDetails));
- }
- }
- }
-
- return $userClaims;
- }
-
- protected function getUserClaim($claim, $userDetails)
- {
- $userClaims = array();
- $claimValuesString = constant(sprintf('self::%s_CLAIM_VALUES', strtoupper($claim)));
- $claimValues = explode(' ', $claimValuesString);
-
- foreach ($claimValues as $value) {
- $userClaims[$value] = isset($userDetails[$value]) ? $userDetails[$value] : null;
- }
-
- return $userClaims;
- }
-
- /* OAuth2\Storage\RefreshTokenInterface */
- public function getRefreshToken($refresh_token)
- {
- $stmt = $this->db->prepare(sprintf('SELECT * FROM %s WHERE refresh_token = :refresh_token', $this->config['refresh_token_table']));
-
- $token = $stmt->execute(compact('refresh_token'));
- if ($token = $stmt->fetch(\PDO::FETCH_ASSOC)) {
- // convert expires to epoch time
- $token['expires'] = strtotime($token['expires']);
- }
-
- return $token;
- }
-
- public function setRefreshToken($refresh_token, $client_id, $user_id, $expires, $scope = null)
- {
- // convert expires to datestring
- $expires = date('Y-m-d H:i:s', $expires);
-
- $stmt = $this->db->prepare(sprintf('INSERT INTO %s (refresh_token, client_id, user_id, expires, scope) VALUES (:refresh_token, :client_id, :user_id, :expires, :scope)', $this->config['refresh_token_table']));
-
- return $stmt->execute(compact('refresh_token', 'client_id', 'user_id', 'expires', 'scope'));
- }
-
- public function unsetRefreshToken($refresh_token)
- {
- $stmt = $this->db->prepare(sprintf('DELETE FROM %s WHERE refresh_token = :refresh_token', $this->config['refresh_token_table']));
-
- $stmt->execute(compact('refresh_token'));
-
- return $stmt->rowCount() > 0;
- }
-
- // plaintext passwords are bad! Override this for your application
- protected function checkPassword($user, $password)
- {
- return $user['password'] == $this->hashPassword($password);
- }
-
- // use a secure hashing algorithm when storing passwords. Override this for your application
- protected function hashPassword($password)
- {
- return sha1($password);
- }
-
- public function getUser($username)
- {
- $stmt = $this->db->prepare($sql = sprintf('SELECT * from %s where username=:username', $this->config['user_table']));
- $stmt->execute(array('username' => $username));
-
- if (!$userInfo = $stmt->fetch(\PDO::FETCH_ASSOC)) {
- return false;
- }
-
- // the default behavior is to use "username" as the user_id
- return array_merge(array(
- 'user_id' => $username
- ), $userInfo);
- }
-
- public function setUser($username, $password, $firstName = null, $lastName = null)
- {
- // do not store in plaintext
- $password = $this->hashPassword($password);
-
- // if it exists, update it.
- if ($this->getUser($username)) {
- $stmt = $this->db->prepare($sql = sprintf('UPDATE %s SET password=:password, first_name=:firstName, last_name=:lastName where username=:username', $this->config['user_table']));
- } else {
- $stmt = $this->db->prepare(sprintf('INSERT INTO %s (username, password, first_name, last_name) VALUES (:username, :password, :firstName, :lastName)', $this->config['user_table']));
- }
-
- return $stmt->execute(compact('username', 'password', 'firstName', 'lastName'));
- }
-
- /* ScopeInterface */
- public function scopeExists($scope)
- {
- $scope = explode(' ', $scope);
- $whereIn = implode(',', array_fill(0, count($scope), '?'));
- $stmt = $this->db->prepare(sprintf('SELECT count(scope) as count FROM %s WHERE scope IN (%s)', $this->config['scope_table'], $whereIn));
- $stmt->execute($scope);
-
- if ($result = $stmt->fetch(\PDO::FETCH_ASSOC)) {
- return $result['count'] == count($scope);
- }
-
- return false;
- }
-
- public function getDefaultScope($client_id = null)
- {
- $stmt = $this->db->prepare(sprintf('SELECT scope FROM %s WHERE is_default=:is_default', $this->config['scope_table']));
- $stmt->execute(array('is_default' => true));
-
- if ($result = $stmt->fetchAll(\PDO::FETCH_ASSOC)) {
- $defaultScope = array_map(function ($row) {
- return $row['scope'];
- }, $result);
-
- return implode(' ', $defaultScope);
- }
-
- return null;
- }
-
- /* JWTBearerInterface */
- public function getClientKey($client_id, $subject)
- {
- $stmt = $this->db->prepare($sql = sprintf('SELECT public_key from %s where client_id=:client_id AND subject=:subject', $this->config['jwt_table']));
-
- $stmt->execute(array('client_id' => $client_id, 'subject' => $subject));
-
- return $stmt->fetchColumn();
- }
-
- public function getClientScope($client_id)
- {
- if (!$clientDetails = $this->getClientDetails($client_id)) {
- return false;
- }
-
- if (isset($clientDetails['scope'])) {
- return $clientDetails['scope'];
- }
-
- return null;
- }
-
- public function getJti($client_id, $subject, $audience, $expires, $jti)
- {
- $stmt = $this->db->prepare($sql = sprintf('SELECT * FROM %s WHERE issuer=:client_id AND subject=:subject AND audience=:audience AND expires=:expires AND jti=:jti', $this->config['jti_table']));
-
- $stmt->execute(compact('client_id', 'subject', 'audience', 'expires', 'jti'));
-
- if ($result = $stmt->fetch(\PDO::FETCH_ASSOC)) {
- return array(
- 'issuer' => $result['issuer'],
- 'subject' => $result['subject'],
- 'audience' => $result['audience'],
- 'expires' => $result['expires'],
- 'jti' => $result['jti'],
- );
- }
-
- return null;
- }
-
- public function setJti($client_id, $subject, $audience, $expires, $jti)
- {
- $stmt = $this->db->prepare(sprintf('INSERT INTO %s (issuer, subject, audience, expires, jti) VALUES (:client_id, :subject, :audience, :expires, :jti)', $this->config['jti_table']));
-
- return $stmt->execute(compact('client_id', 'subject', 'audience', 'expires', 'jti'));
- }
-
- /* PublicKeyInterface */
- public function getPublicKey($client_id = null)
- {
- $stmt = $this->db->prepare($sql = sprintf('SELECT public_key FROM %s WHERE client_id=:client_id OR client_id IS NULL ORDER BY client_id IS NOT NULL DESC', $this->config['public_key_table']));
-
- $stmt->execute(compact('client_id'));
- if ($result = $stmt->fetch(\PDO::FETCH_ASSOC)) {
- return $result['public_key'];
- }
- }
-
- public function getPrivateKey($client_id = null)
- {
- $stmt = $this->db->prepare($sql = sprintf('SELECT private_key FROM %s WHERE client_id=:client_id OR client_id IS NULL ORDER BY client_id IS NOT NULL DESC', $this->config['public_key_table']));
-
- $stmt->execute(compact('client_id'));
- if ($result = $stmt->fetch(\PDO::FETCH_ASSOC)) {
- return $result['private_key'];
- }
- }
-
- public function getEncryptionAlgorithm($client_id = null)
- {
- $stmt = $this->db->prepare($sql = sprintf('SELECT encryption_algorithm FROM %s WHERE client_id=:client_id OR client_id IS NULL ORDER BY client_id IS NOT NULL DESC', $this->config['public_key_table']));
-
- $stmt->execute(compact('client_id'));
- if ($result = $stmt->fetch(\PDO::FETCH_ASSOC)) {
- return $result['encryption_algorithm'];
- }
-
- return 'RS256';
- }
-
- /**
- * DDL to create OAuth2 database and tables for PDO storage
- *
- * @see https://github.com/dsquier/oauth2-server-php-mysql
- */
- public function getBuildSql($dbName = 'oauth2_server_php')
- {
- $sql = "
- CREATE TABLE {$this->config['client_table']} (
- client_id VARCHAR(80) NOT NULL,
- client_secret VARCHAR(80),
- redirect_uri VARCHAR(2000),
- grant_types VARCHAR(80),
- scope VARCHAR(4000),
- user_id VARCHAR(80),
- PRIMARY KEY (client_id)
- );
-
- CREATE TABLE {$this->config['access_token_table']} (
- access_token VARCHAR(40) NOT NULL,
- client_id VARCHAR(80) NOT NULL,
- user_id VARCHAR(80),
- expires TIMESTAMP NOT NULL,
- scope VARCHAR(4000),
- PRIMARY KEY (access_token)
- );
-
- CREATE TABLE {$this->config['code_table']} (
- authorization_code VARCHAR(40) NOT NULL,
- client_id VARCHAR(80) NOT NULL,
- user_id VARCHAR(80),
- redirect_uri VARCHAR(2000),
- expires TIMESTAMP NOT NULL,
- scope VARCHAR(4000),
- id_token VARCHAR(1000),
- PRIMARY KEY (authorization_code)
- );
-
- CREATE TABLE {$this->config['refresh_token_table']} (
- refresh_token VARCHAR(40) NOT NULL,
- client_id VARCHAR(80) NOT NULL,
- user_id VARCHAR(80),
- expires TIMESTAMP NOT NULL,
- scope VARCHAR(4000),
- PRIMARY KEY (refresh_token)
- );
-
- CREATE TABLE {$this->config['user_table']} (
- username VARCHAR(80),
- password VARCHAR(80),
- first_name VARCHAR(80),
- last_name VARCHAR(80),
- email VARCHAR(80),
- email_verified BOOLEAN,
- scope VARCHAR(4000)
- );
-
- CREATE TABLE {$this->config['scope_table']} (
- scope VARCHAR(80) NOT NULL,
- is_default BOOLEAN,
- PRIMARY KEY (scope)
- );
-
- CREATE TABLE {$this->config['jwt_table']} (
- client_id VARCHAR(80) NOT NULL,
- subject VARCHAR(80),
- public_key VARCHAR(2000) NOT NULL
- );
-
- CREATE TABLE {$this->config['jti_table']} (
- issuer VARCHAR(80) NOT NULL,
- subject VARCHAR(80),
- audience VARCHAR(80),
- expires TIMESTAMP NOT NULL,
- jti VARCHAR(2000) NOT NULL
- );
-
- CREATE TABLE {$this->config['public_key_table']} (
- client_id VARCHAR(80),
- public_key VARCHAR(2000),
- private_key VARCHAR(2000),
- encryption_algorithm VARCHAR(100) DEFAULT 'RS256'
- )
-";
-
- return $sql;
- }
-}
diff --git a/library/oauth2/src/OAuth2/Storage/PublicKeyInterface.php b/library/oauth2/src/OAuth2/Storage/PublicKeyInterface.php
deleted file mode 100644
index 108418d3a..000000000
--- a/library/oauth2/src/OAuth2/Storage/PublicKeyInterface.php
+++ /dev/null
@@ -1,16 +0,0 @@
-<?php
-
-namespace OAuth2\Storage;
-
-/**
- * Implement this interface to specify where the OAuth2 Server
- * should get public/private key information
- *
- * @author Brent Shaffer <bshafs at gmail dot com>
- */
-interface PublicKeyInterface
-{
- public function getPublicKey($client_id = null);
- public function getPrivateKey($client_id = null);
- public function getEncryptionAlgorithm($client_id = null);
-}
diff --git a/library/oauth2/src/OAuth2/Storage/Redis.php b/library/oauth2/src/OAuth2/Storage/Redis.php
deleted file mode 100644
index e6294e22d..000000000
--- a/library/oauth2/src/OAuth2/Storage/Redis.php
+++ /dev/null
@@ -1,321 +0,0 @@
-<?php
-
-namespace OAuth2\Storage;
-
-use OAuth2\OpenID\Storage\AuthorizationCodeInterface as OpenIDAuthorizationCodeInterface;
-
-/**
- * redis storage for all storage types
- *
- * To use, install "predis/predis" via composer
- *
- * Register client:
- * <code>
- * $storage = new OAuth2\Storage\Redis($redis);
- * $storage->setClientDetails($client_id, $client_secret, $redirect_uri);
- * </code>
- */
-class Redis implements AuthorizationCodeInterface,
- AccessTokenInterface,
- ClientCredentialsInterface,
- UserCredentialsInterface,
- RefreshTokenInterface,
- JwtBearerInterface,
- ScopeInterface,
- OpenIDAuthorizationCodeInterface
-{
-
- private $cache;
-
- /* The redis client */
- protected $redis;
-
- /* Configuration array */
- protected $config;
-
- /**
- * Redis Storage!
- *
- * @param \Predis\Client $redis
- * @param array $config
- */
- public function __construct($redis, $config=array())
- {
- $this->redis = $redis;
- $this->config = array_merge(array(
- 'client_key' => 'oauth_clients:',
- 'access_token_key' => 'oauth_access_tokens:',
- 'refresh_token_key' => 'oauth_refresh_tokens:',
- 'code_key' => 'oauth_authorization_codes:',
- 'user_key' => 'oauth_users:',
- 'jwt_key' => 'oauth_jwt:',
- 'scope_key' => 'oauth_scopes:',
- ), $config);
- }
-
- protected function getValue($key)
- {
- if ( isset($this->cache[$key]) ) {
- return $this->cache[$key];
- }
- $value = $this->redis->get($key);
- if ( isset($value) ) {
- return json_decode($value, true);
- } else {
- return false;
- }
- }
-
- protected function setValue($key, $value, $expire=0)
- {
- $this->cache[$key] = $value;
- $str = json_encode($value);
- if ($expire > 0) {
- $seconds = $expire - time();
- $ret = $this->redis->setex($key, $seconds, $str);
- } else {
- $ret = $this->redis->set($key, $str);
- }
-
- // check that the key was set properly
- // if this fails, an exception will usually thrown, so this step isn't strictly necessary
- return is_bool($ret) ? $ret : $ret->getPayload() == 'OK';
- }
-
- protected function expireValue($key)
- {
- unset($this->cache[$key]);
-
- return $this->redis->del($key);
- }
-
- /* AuthorizationCodeInterface */
- public function getAuthorizationCode($code)
- {
- return $this->getValue($this->config['code_key'] . $code);
- }
-
- public function setAuthorizationCode($authorization_code, $client_id, $user_id, $redirect_uri, $expires, $scope = null, $id_token = null)
- {
- return $this->setValue(
- $this->config['code_key'] . $authorization_code,
- compact('authorization_code', 'client_id', 'user_id', 'redirect_uri', 'expires', 'scope', 'id_token'),
- $expires
- );
- }
-
- public function expireAuthorizationCode($code)
- {
- $key = $this->config['code_key'] . $code;
- unset($this->cache[$key]);
-
- return $this->expireValue($key);
- }
-
- /* UserCredentialsInterface */
- public function checkUserCredentials($username, $password)
- {
- $user = $this->getUserDetails($username);
-
- return $user && $user['password'] === $password;
- }
-
- public function getUserDetails($username)
- {
- return $this->getUser($username);
- }
-
- public function getUser($username)
- {
- if (!$userInfo = $this->getValue($this->config['user_key'] . $username)) {
- return false;
- }
-
- // the default behavior is to use "username" as the user_id
- return array_merge(array(
- 'user_id' => $username,
- ), $userInfo);
- }
-
- public function setUser($username, $password, $first_name = null, $last_name = null)
- {
- return $this->setValue(
- $this->config['user_key'] . $username,
- compact('username', 'password', 'first_name', 'last_name')
- );
- }
-
- /* ClientCredentialsInterface */
- public function checkClientCredentials($client_id, $client_secret = null)
- {
- if (!$client = $this->getClientDetails($client_id)) {
- return false;
- }
-
- return isset($client['client_secret'])
- && $client['client_secret'] == $client_secret;
- }
-
- public function isPublicClient($client_id)
- {
- if (!$client = $this->getClientDetails($client_id)) {
- return false;
- }
-
- return empty($client['client_secret']);
- }
-
- /* ClientInterface */
- public function getClientDetails($client_id)
- {
- return $this->getValue($this->config['client_key'] . $client_id);
- }
-
- public function setClientDetails($client_id, $client_secret = null, $redirect_uri = null, $grant_types = null, $scope = null, $user_id = null)
- {
- return $this->setValue(
- $this->config['client_key'] . $client_id,
- compact('client_id', 'client_secret', 'redirect_uri', 'grant_types', 'scope', 'user_id')
- );
- }
-
- public function checkRestrictedGrantType($client_id, $grant_type)
- {
- $details = $this->getClientDetails($client_id);
- if (isset($details['grant_types'])) {
- $grant_types = explode(' ', $details['grant_types']);
-
- return in_array($grant_type, (array) $grant_types);
- }
-
- // if grant_types are not defined, then none are restricted
- return true;
- }
-
- /* RefreshTokenInterface */
- public function getRefreshToken($refresh_token)
- {
- return $this->getValue($this->config['refresh_token_key'] . $refresh_token);
- }
-
- public function setRefreshToken($refresh_token, $client_id, $user_id, $expires, $scope = null)
- {
- return $this->setValue(
- $this->config['refresh_token_key'] . $refresh_token,
- compact('refresh_token', 'client_id', 'user_id', 'expires', 'scope'),
- $expires
- );
- }
-
- public function unsetRefreshToken($refresh_token)
- {
- $result = $this->expireValue($this->config['refresh_token_key'] . $refresh_token);
-
- return $result > 0;
- }
-
- /* AccessTokenInterface */
- public function getAccessToken($access_token)
- {
- return $this->getValue($this->config['access_token_key'].$access_token);
- }
-
- public function setAccessToken($access_token, $client_id, $user_id, $expires, $scope = null)
- {
- return $this->setValue(
- $this->config['access_token_key'].$access_token,
- compact('access_token', 'client_id', 'user_id', 'expires', 'scope'),
- $expires
- );
- }
-
- public function unsetAccessToken($access_token)
- {
- $result = $this->expireValue($this->config['access_token_key'] . $access_token);
-
- return $result > 0;
- }
-
- /* ScopeInterface */
- public function scopeExists($scope)
- {
- $scope = explode(' ', $scope);
-
- $result = $this->getValue($this->config['scope_key'].'supported:global');
-
- $supportedScope = explode(' ', (string) $result);
-
- return (count(array_diff($scope, $supportedScope)) == 0);
- }
-
- public function getDefaultScope($client_id = null)
- {
- if (is_null($client_id) || !$result = $this->getValue($this->config['scope_key'].'default:'.$client_id)) {
- $result = $this->getValue($this->config['scope_key'].'default:global');
- }
-
- return $result;
- }
-
- public function setScope($scope, $client_id = null, $type = 'supported')
- {
- if (!in_array($type, array('default', 'supported'))) {
- throw new \InvalidArgumentException('"$type" must be one of "default", "supported"');
- }
-
- if (is_null($client_id)) {
- $key = $this->config['scope_key'].$type.':global';
- } else {
- $key = $this->config['scope_key'].$type.':'.$client_id;
- }
-
- return $this->setValue($key, $scope);
- }
-
- /*JWTBearerInterface */
- public function getClientKey($client_id, $subject)
- {
- if (!$jwt = $this->getValue($this->config['jwt_key'] . $client_id)) {
- return false;
- }
-
- if (isset($jwt['subject']) && $jwt['subject'] == $subject) {
- return $jwt['key'];
- }
-
- return null;
- }
-
- public function setClientKey($client_id, $key, $subject = null)
- {
- return $this->setValue($this->config['jwt_key'] . $client_id, array(
- 'key' => $key,
- 'subject' => $subject
- ));
- }
-
- public function getClientScope($client_id)
- {
- if (!$clientDetails = $this->getClientDetails($client_id)) {
- return false;
- }
-
- if (isset($clientDetails['scope'])) {
- return $clientDetails['scope'];
- }
-
- return null;
- }
-
- public function getJti($client_id, $subject, $audience, $expiration, $jti)
- {
- //TODO: Needs redis implementation.
- throw new \Exception('getJti() for the Redis driver is currently unimplemented.');
- }
-
- public function setJti($client_id, $subject, $audience, $expiration, $jti)
- {
- //TODO: Needs redis implementation.
- throw new \Exception('setJti() for the Redis driver is currently unimplemented.');
- }
-}
diff --git a/library/oauth2/src/OAuth2/Storage/RefreshTokenInterface.php b/library/oauth2/src/OAuth2/Storage/RefreshTokenInterface.php
deleted file mode 100644
index 0273f2125..000000000
--- a/library/oauth2/src/OAuth2/Storage/RefreshTokenInterface.php
+++ /dev/null
@@ -1,82 +0,0 @@
-<?php
-
-namespace OAuth2\Storage;
-
-/**
- * Implement this interface to specify where the OAuth2 Server
- * should get/save refresh tokens for the "Refresh Token"
- * grant type
- *
- * @author Brent Shaffer <bshafs at gmail dot com>
- */
-interface RefreshTokenInterface
-{
- /**
- * Grant refresh access tokens.
- *
- * Retrieve the stored data for the given refresh token.
- *
- * Required for OAuth2::GRANT_TYPE_REFRESH_TOKEN.
- *
- * @param $refresh_token
- * Refresh token to be check with.
- *
- * @return
- * An associative array as below, and NULL if the refresh_token is
- * invalid:
- * - refresh_token: Refresh token identifier.
- * - client_id: Client identifier.
- * - user_id: User identifier.
- * - expires: Expiration unix timestamp, or 0 if the token doesn't expire.
- * - scope: (optional) Scope values in space-separated string.
- *
- * @see http://tools.ietf.org/html/rfc6749#section-6
- *
- * @ingroup oauth2_section_6
- */
- public function getRefreshToken($refresh_token);
-
- /**
- * Take the provided refresh token values and store them somewhere.
- *
- * This function should be the storage counterpart to getRefreshToken().
- *
- * If storage fails for some reason, we're not currently checking for
- * any sort of success/failure, so you should bail out of the script
- * and provide a descriptive fail message.
- *
- * Required for OAuth2::GRANT_TYPE_REFRESH_TOKEN.
- *
- * @param $refresh_token
- * Refresh token to be stored.
- * @param $client_id
- * Client identifier to be stored.
- * @param $user_id
- * User identifier to be stored.
- * @param $expires
- * Expiration timestamp to be stored. 0 if the token doesn't expire.
- * @param $scope
- * (optional) Scopes to be stored in space-separated string.
- *
- * @ingroup oauth2_section_6
- */
- public function setRefreshToken($refresh_token, $client_id, $user_id, $expires, $scope = null);
-
- /**
- * Expire a used refresh token.
- *
- * This is not explicitly required in the spec, but is almost implied.
- * After granting a new refresh token, the old one is no longer useful and
- * so should be forcibly expired in the data store so it can't be used again.
- *
- * If storage fails for some reason, we're not currently checking for
- * any sort of success/failure, so you should bail out of the script
- * and provide a descriptive fail message.
- *
- * @param $refresh_token
- * Refresh token to be expirse.
- *
- * @ingroup oauth2_section_6
- */
- public function unsetRefreshToken($refresh_token);
-}
diff --git a/library/oauth2/src/OAuth2/Storage/ScopeInterface.php b/library/oauth2/src/OAuth2/Storage/ScopeInterface.php
deleted file mode 100644
index a8292269b..000000000
--- a/library/oauth2/src/OAuth2/Storage/ScopeInterface.php
+++ /dev/null
@@ -1,46 +0,0 @@
-<?php
-
-namespace OAuth2\Storage;
-
-/**
- * Implement this interface to specify where the OAuth2 Server
- * should retrieve data involving the relevent scopes associated
- * with this implementation.
- *
- * @author Brent Shaffer <bshafs at gmail dot com>
- */
-interface ScopeInterface
-{
- /**
- * Check if the provided scope exists.
- *
- * @param $scope
- * A space-separated string of scopes.
- *
- * @return
- * TRUE if it exists, FALSE otherwise.
- */
- public function scopeExists($scope);
-
- /**
- * The default scope to use in the event the client
- * does not request one. By returning "false", a
- * request_error is returned by the server to force a
- * scope request by the client. By returning "null",
- * opt out of requiring scopes
- *
- * @param $client_id
- * An optional client id that can be used to return customized default scopes.
- *
- * @return
- * string representation of default scope, null if
- * scopes are not defined, or false to force scope
- * request by the client
- *
- * ex:
- * 'default'
- * ex:
- * null
- */
- public function getDefaultScope($client_id = null);
-}
diff --git a/library/oauth2/src/OAuth2/Storage/UserCredentialsInterface.php b/library/oauth2/src/OAuth2/Storage/UserCredentialsInterface.php
deleted file mode 100644
index 6e0fd7bad..000000000
--- a/library/oauth2/src/OAuth2/Storage/UserCredentialsInterface.php
+++ /dev/null
@@ -1,52 +0,0 @@
-<?php
-
-namespace OAuth2\Storage;
-
-/**
- * Implement this interface to specify where the OAuth2 Server
- * should retrieve user credentials for the
- * "Resource Owner Password Credentials" grant type
- *
- * @author Brent Shaffer <bshafs at gmail dot com>
- */
-interface UserCredentialsInterface
-{
- /**
- * Grant access tokens for basic user credentials.
- *
- * Check the supplied username and password for validity.
- *
- * You can also use the $client_id param to do any checks required based
- * on a client, if you need that.
- *
- * Required for OAuth2::GRANT_TYPE_USER_CREDENTIALS.
- *
- * @param $username
- * Username to be check with.
- * @param $password
- * Password to be check with.
- *
- * @return
- * TRUE if the username and password are valid, and FALSE if it isn't.
- * Moreover, if the username and password are valid, and you want to
- *
- * @see http://tools.ietf.org/html/rfc6749#section-4.3
- *
- * @ingroup oauth2_section_4
- */
- public function checkUserCredentials($username, $password);
-
- /**
- * @return
- * ARRAY the associated "user_id" and optional "scope" values
- * This function MUST return FALSE if the requested user does not exist or is
- * invalid. "scope" is a space-separated list of restricted scopes.
- * @code
- * return array(
- * "user_id" => USER_ID, // REQUIRED user_id to be stored with the authorization code or access token
- * "scope" => SCOPE // OPTIONAL space-separated list of restricted scopes
- * );
- * @endcode
- */
- public function getUserDetails($username);
-}
diff --git a/library/oauth2/src/OAuth2/TokenType/Bearer.php b/library/oauth2/src/OAuth2/TokenType/Bearer.php
deleted file mode 100644
index 8ac8596ac..000000000
--- a/library/oauth2/src/OAuth2/TokenType/Bearer.php
+++ /dev/null
@@ -1,130 +0,0 @@
-<?php
-
-namespace OAuth2\TokenType;
-
-use OAuth2\RequestInterface;
-use OAuth2\ResponseInterface;
-
-/**
-*
-*/
-class Bearer implements TokenTypeInterface
-{
- private $config;
-
- public function __construct(array $config = array())
- {
- $this->config = array_merge(array(
- 'token_param_name' => 'access_token',
- 'token_bearer_header_name' => 'Bearer',
- ), $config);
- }
-
- public function getTokenType()
- {
- return 'Bearer';
- }
-
- /**
- * Check if the request has supplied token
- *
- * @see https://github.com/bshaffer/oauth2-server-php/issues/349#issuecomment-37993588
- */
- public function requestHasToken(RequestInterface $request)
- {
- $headers = $request->headers('AUTHORIZATION');
-
- // check the header, then the querystring, then the request body
- return !empty($headers) || (bool) ($request->request($this->config['token_param_name'])) || (bool) ($request->query($this->config['token_param_name']));
- }
-
- /**
- * This is a convenience function that can be used to get the token, which can then
- * be passed to getAccessTokenData(). The constraints specified by the draft are
- * attempted to be adheared to in this method.
- *
- * As per the Bearer spec (draft 8, section 2) - there are three ways for a client
- * to specify the bearer token, in order of preference: Authorization Header,
- * POST and GET.
- *
- * NB: Resource servers MUST accept tokens via the Authorization scheme
- * (http://tools.ietf.org/html/rfc6750#section-2).
- *
- * @todo Should we enforce TLS/SSL in this function?
- *
- * @see http://tools.ietf.org/html/rfc6750#section-2.1
- * @see http://tools.ietf.org/html/rfc6750#section-2.2
- * @see http://tools.ietf.org/html/rfc6750#section-2.3
- *
- * Old Android version bug (at least with version 2.2)
- * @see http://code.google.com/p/android/issues/detail?id=6684
- *
- */
- public function getAccessTokenParameter(RequestInterface $request, ResponseInterface $response)
- {
- $headers = $request->headers('AUTHORIZATION');
-
- /**
- * Ensure more than one method is not used for including an
- * access token
- *
- * @see http://tools.ietf.org/html/rfc6750#section-3.1
- */
- $methodsUsed = !empty($headers) + (bool) ($request->query($this->config['token_param_name'])) + (bool) ($request->request($this->config['token_param_name']));
- if ($methodsUsed > 1) {
- $response->setError(400, 'invalid_request', 'Only one method may be used to authenticate at a time (Auth header, GET or POST)');
-
- return null;
- }
-
- /**
- * If no authentication is provided, set the status code
- * to 401 and return no other error information
- *
- * @see http://tools.ietf.org/html/rfc6750#section-3.1
- */
- if ($methodsUsed == 0) {
- $response->setStatusCode(401);
-
- return null;
- }
-
- // HEADER: Get the access token from the header
- if (!empty($headers)) {
- if (!preg_match('/' . $this->config['token_bearer_header_name'] . '\s(\S+)/i', $headers, $matches)) {
- $response->setError(400, 'invalid_request', 'Malformed auth header');
-
- return null;
- }
-
- return $matches[1];
- }
-
- if ($request->request($this->config['token_param_name'])) {
- // // POST: Get the token from POST data
- if (!in_array(strtolower($request->server('REQUEST_METHOD')), array('post', 'put'))) {
- $response->setError(400, 'invalid_request', 'When putting the token in the body, the method must be POST or PUT', '#section-2.2');
-
- return null;
- }
-
- $contentType = $request->server('CONTENT_TYPE');
- if (false !== $pos = strpos($contentType, ';')) {
- $contentType = substr($contentType, 0, $pos);
- }
-
- if ($contentType !== null && $contentType != 'application/x-www-form-urlencoded') {
- // IETF specifies content-type. NB: Not all webservers populate this _SERVER variable
- // @see http://tools.ietf.org/html/rfc6750#section-2.2
- $response->setError(400, 'invalid_request', 'The content type for POST requests must be "application/x-www-form-urlencoded"');
-
- return null;
- }
-
- return $request->request($this->config['token_param_name']);
- }
-
- // GET method
- return $request->query($this->config['token_param_name']);
- }
-}
diff --git a/library/oauth2/src/OAuth2/TokenType/Mac.php b/library/oauth2/src/OAuth2/TokenType/Mac.php
deleted file mode 100644
index fe6a86aa6..000000000
--- a/library/oauth2/src/OAuth2/TokenType/Mac.php
+++ /dev/null
@@ -1,22 +0,0 @@
-<?php
-
-namespace OAuth2\TokenType;
-
-use OAuth2\RequestInterface;
-use OAuth2\ResponseInterface;
-
-/**
-* This is not yet supported!
-*/
-class Mac implements TokenTypeInterface
-{
- public function getTokenType()
- {
- return 'mac';
- }
-
- public function getAccessTokenParameter(RequestInterface $request, ResponseInterface $response)
- {
- throw new \LogicException("Not supported");
- }
-}
diff --git a/library/oauth2/src/OAuth2/TokenType/TokenTypeInterface.php b/library/oauth2/src/OAuth2/TokenType/TokenTypeInterface.php
deleted file mode 100644
index ad77d4a25..000000000
--- a/library/oauth2/src/OAuth2/TokenType/TokenTypeInterface.php
+++ /dev/null
@@ -1,21 +0,0 @@
-<?php
-
-namespace OAuth2\TokenType;
-
-use OAuth2\RequestInterface;
-use OAuth2\ResponseInterface;
-
-interface TokenTypeInterface
-{
- /**
- * Token type identification string
- *
- * ex: "bearer" or "mac"
- */
- public function getTokenType();
-
- /**
- * Retrieves the token string from the request object
- */
- public function getAccessTokenParameter(RequestInterface $request, ResponseInterface $response);
-}
diff --git a/library/oauth2/test/OAuth2/AutoloadTest.php b/library/oauth2/test/OAuth2/AutoloadTest.php
deleted file mode 100644
index 5901bdc42..000000000
--- a/library/oauth2/test/OAuth2/AutoloadTest.php
+++ /dev/null
@@ -1,16 +0,0 @@
-<?php
-
-namespace OAuth2;
-
-class AutoloadTest extends \PHPUnit_Framework_TestCase
-{
- public function testClassesExist()
- {
- // autoloader is called in test/bootstrap.php
- $this->assertTrue(class_exists('OAuth2\Server'));
- $this->assertTrue(class_exists('OAuth2\Request'));
- $this->assertTrue(class_exists('OAuth2\Response'));
- $this->assertTrue(class_exists('OAuth2\GrantType\UserCredentials'));
- $this->assertTrue(interface_exists('OAuth2\Storage\AccessTokenInterface'));
- }
-}
diff --git a/library/oauth2/test/OAuth2/Controller/AuthorizeControllerTest.php b/library/oauth2/test/OAuth2/Controller/AuthorizeControllerTest.php
deleted file mode 100644
index 3bfc760e4..000000000
--- a/library/oauth2/test/OAuth2/Controller/AuthorizeControllerTest.php
+++ /dev/null
@@ -1,492 +0,0 @@
-<?php
-
-namespace OAuth2\Controller;
-
-use OAuth2\Storage\Memory;
-use OAuth2\Scope;
-use OAuth2\Storage\Bootstrap;
-use OAuth2\Server;
-use OAuth2\GrantType\AuthorizationCode;
-use OAuth2\Request;
-use OAuth2\Response;
-use OAuth2\Request\TestRequest;
-
-class AuthorizeControllerTest extends \PHPUnit_Framework_TestCase
-{
- public function testNoClientIdResponse()
- {
- $server = $this->getTestServer();
- $request = new Request();
- $server->handleAuthorizeRequest($request, $response = new Response(), false);
-
- $this->assertEquals($response->getStatusCode(), 400);
- $this->assertEquals($response->getParameter('error'), 'invalid_client');
- $this->assertEquals($response->getParameter('error_description'), 'No client id supplied');
- }
-
- public function testInvalidClientIdResponse()
- {
- $server = $this->getTestServer();
- $request = new Request(array(
- 'client_id' => 'Fake Client ID', // invalid client id
- ));
- $server->handleAuthorizeRequest($request, $response = new Response(), false);
-
- $this->assertEquals($response->getStatusCode(), 400);
- $this->assertEquals($response->getParameter('error'), 'invalid_client');
- $this->assertEquals($response->getParameter('error_description'), 'The client id supplied is invalid');
- }
-
- public function testNoRedirectUriSuppliedOrStoredResponse()
- {
- $server = $this->getTestServer();
- $request = new Request(array(
- 'client_id' => 'Test Client ID', // valid client id
- ));
- $server->handleAuthorizeRequest($request, $response = new Response(), false);
-
- $this->assertEquals($response->getStatusCode(), 400);
- $this->assertEquals($response->getParameter('error'), 'invalid_uri');
- $this->assertEquals($response->getParameter('error_description'), 'No redirect URI was supplied or stored');
- }
-
- public function testNoResponseTypeResponse()
- {
- $server = $this->getTestServer();
- $request = new Request(array(
- 'client_id' => 'Test Client ID', // valid client id
- 'redirect_uri' => 'http://adobe.com', // valid redirect URI
- ));
- $server->handleAuthorizeRequest($request, $response = new Response(), false);
-
- $this->assertEquals($response->getStatusCode(), 302);
- $location = $response->getHttpHeader('Location');
- $parts = parse_url($location);
- parse_str($parts['query'], $query);
-
- $this->assertEquals($query['error'], 'invalid_request');
- $this->assertEquals($query['error_description'], 'Invalid or missing response type');
- }
-
- public function testInvalidResponseTypeResponse()
- {
- $server = $this->getTestServer();
- $request = new Request(array(
- 'client_id' => 'Test Client ID', // valid client id
- 'redirect_uri' => 'http://adobe.com', // valid redirect URI
- 'response_type' => 'invalid', // invalid response type
- ));
- $server->handleAuthorizeRequest($request, $response = new Response(), false);
-
- $this->assertEquals($response->getStatusCode(), 302);
- $location = $response->getHttpHeader('Location');
- $parts = parse_url($location);
- parse_str($parts['query'], $query);
-
- $this->assertEquals($query['error'], 'invalid_request');
- $this->assertEquals($query['error_description'], 'Invalid or missing response type');
- }
-
- public function testRedirectUriFragmentResponse()
- {
- $server = $this->getTestServer();
- $request = new Request(array(
- 'client_id' => 'Test Client ID', // valid client id
- 'redirect_uri' => 'http://adobe.com#fragment', // valid redirect URI
- 'response_type' => 'code', // invalid response type
- ));
- $server->handleAuthorizeRequest($request, $response = new Response(), true);
-
- $this->assertEquals($response->getStatusCode(), 400);
- $this->assertEquals($response->getParameter('error'), 'invalid_uri');
- $this->assertEquals($response->getParameter('error_description'), 'The redirect URI must not contain a fragment');
- }
-
- public function testEnforceState()
- {
- $server = $this->getTestServer(array('enforce_state' => true));
- $request = new Request(array(
- 'client_id' => 'Test Client ID', // valid client id
- 'redirect_uri' => 'http://adobe.com', // valid redirect URI
- 'response_type' => 'code',
- ));
- $server->handleAuthorizeRequest($request, $response = new Response(), true);
-
- $this->assertEquals($response->getStatusCode(), 302);
- $location = $response->getHttpHeader('Location');
- $parts = parse_url($location);
- parse_str($parts['query'], $query);
-
- $this->assertEquals($query['error'], 'invalid_request');
- $this->assertEquals($query['error_description'], 'The state parameter is required');
- }
-
- public function testDoNotEnforceState()
- {
- $server = $this->getTestServer(array('enforce_state' => false));
- $request = new Request(array(
- 'client_id' => 'Test Client ID', // valid client id
- 'redirect_uri' => 'http://adobe.com', // valid redirect URI
- 'response_type' => 'code',
- ));
- $server->handleAuthorizeRequest($request, $response = new Response(), true);
-
- $this->assertEquals($response->getStatusCode(), 302);
- $this->assertNotContains('error', $response->getHttpHeader('Location'));
- }
-
- public function testEnforceScope()
- {
- $server = $this->getTestServer();
- $scopeStorage = new Memory(array('default_scope' => false, 'supported_scopes' => array('testscope')));
- $server->setScopeUtil(new Scope($scopeStorage));
-
- $request = new Request(array(
- 'client_id' => 'Test Client ID', // valid client id
- 'redirect_uri' => 'http://adobe.com', // valid redirect URI
- 'response_type' => 'code',
- 'state' => 'xyz',
- ));
- $server->handleAuthorizeRequest($request, $response = new Response(), true);
-
- $this->assertEquals($response->getStatusCode(), 302);
- $parts = parse_url($response->getHttpHeader('Location'));
- parse_str($parts['query'], $query);
-
- $this->assertEquals($query['error'], 'invalid_client');
- $this->assertEquals($query['error_description'], 'This application requires you specify a scope parameter');
-
- $request->query['scope'] = 'testscope';
- $server->handleAuthorizeRequest($request, $response = new Response(), true);
-
- $this->assertEquals($response->getStatusCode(), 302);
- $this->assertNotContains('error', $response->getHttpHeader('Location'));
- }
-
- public function testInvalidRedirectUri()
- {
- $server = $this->getTestServer();
- $request = new Request(array(
- 'client_id' => 'Test Client ID with Redirect Uri', // valid client id
- 'redirect_uri' => 'http://adobe.com', // invalid redirect URI
- 'response_type' => 'code',
- ));
- $server->handleAuthorizeRequest($request, $response = new Response(), true);
-
- $this->assertEquals($response->getStatusCode(), 400);
- $this->assertEquals($response->getParameter('error'), 'redirect_uri_mismatch');
- $this->assertEquals($response->getParameter('error_description'), 'The redirect URI provided is missing or does not match');
- }
-
- public function testInvalidRedirectUriApprovedByBuggyRegisteredUri()
- {
- $server = $this->getTestServer();
- $server->setConfig('require_exact_redirect_uri', false);
- $request = new Request(array(
- 'client_id' => 'Test Client ID with Buggy Redirect Uri', // valid client id
- 'redirect_uri' => 'http://adobe.com', // invalid redirect URI
- 'response_type' => 'code',
- ));
- $server->handleAuthorizeRequest($request, $response = new Response(), true);
-
- $this->assertEquals($response->getStatusCode(), 400);
- $this->assertEquals($response->getParameter('error'), 'redirect_uri_mismatch');
- $this->assertEquals($response->getParameter('error_description'), 'The redirect URI provided is missing or does not match');
- }
-
- public function testNoRedirectUriWithMultipleRedirectUris()
- {
- $server = $this->getTestServer();
-
- // create a request with no "redirect_uri" in querystring
- $request = new Request(array(
- 'client_id' => 'Test Client ID with Multiple Redirect Uris', // valid client id
- 'response_type' => 'code',
- ));
-
- $server->handleAuthorizeRequest($request, $response = new Response(), true);
-
- $this->assertEquals($response->getStatusCode(), 400);
- $this->assertEquals($response->getParameter('error'), 'invalid_uri');
- $this->assertEquals($response->getParameter('error_description'), 'A redirect URI must be supplied when multiple redirect URIs are registered');
- }
-
- public function testRedirectUriWithValidRedirectUri()
- {
- $server = $this->getTestServer();
-
- // create a request with no "redirect_uri" in querystring
- $request = new Request(array(
- 'client_id' => 'Test Client ID with Redirect Uri Parts', // valid client id
- 'response_type' => 'code',
- 'redirect_uri' => 'http://user:pass@brentertainment.com:2222/authorize/cb?auth_type=oauth&test=true',
- 'state' => 'xyz',
- ));
-
- $server->handleAuthorizeRequest($request, $response = new Response(), true);
-
- $this->assertEquals($response->getStatusCode(), 302);
- $this->assertContains('code', $response->getHttpHeader('Location'));
- }
-
- public function testRedirectUriWithDifferentQueryAndExactMatchRequired()
- {
- $server = $this->getTestServer(array('require_exact_redirect_uri' => true));
-
- // create a request with no "redirect_uri" in querystring
- $request = new Request(array(
- 'client_id' => 'Test Client ID with Redirect Uri Parts', // valid client id
- 'response_type' => 'code',
- 'redirect_uri' => 'http://user:pass@brentertainment.com:2222/authorize/cb?auth_type=oauth&test=true&hereisa=querystring',
- ));
-
- $server->handleAuthorizeRequest($request, $response = new Response(), true);
-
- $this->assertEquals($response->getStatusCode(), 400);
- $this->assertEquals($response->getParameter('error'), 'redirect_uri_mismatch');
- $this->assertEquals($response->getParameter('error_description'), 'The redirect URI provided is missing or does not match');
- }
-
- public function testRedirectUriWithDifferentQueryAndExactMatchNotRequired()
- {
- $server = $this->getTestServer(array('require_exact_redirect_uri' => false));
-
- // create a request with no "redirect_uri" in querystring
- $request = new Request(array(
- 'client_id' => 'Test Client ID with Redirect Uri Parts', // valid client id
- 'response_type' => 'code',
- 'redirect_uri' => 'http://user:pass@brentertainment.com:2222/authorize/cb?auth_type=oauth&test=true&hereisa=querystring',
- 'state' => 'xyz',
- ));
-
- $server->handleAuthorizeRequest($request, $response = new Response(), true);
-
- $this->assertEquals($response->getStatusCode(), 302);
- $this->assertContains('code', $response->getHttpHeader('Location'));
- }
-
- public function testMultipleRedirectUris()
- {
- $server = $this->getTestServer();
- $request = new Request(array(
- 'client_id' => 'Test Client ID with Multiple Redirect Uris', // valid client id
- 'redirect_uri' => 'http://brentertainment.com', // valid redirect URI
- 'response_type' => 'code',
- 'state' => 'xyz'
- ));
-
- $server->handleAuthorizeRequest($request, $response = new Response(), true);
- $this->assertEquals($response->getStatusCode(), 302);
- $this->assertContains('code', $response->getHttpHeader('Location'));
-
- // call again with different (but still valid) redirect URI
- $request->query['redirect_uri'] = 'http://morehazards.com';
-
- $server->handleAuthorizeRequest($request, $response = new Response(), true);
- $this->assertEquals($response->getStatusCode(), 302);
- $this->assertContains('code', $response->getHttpHeader('Location'));
- }
-
- /**
- * @see http://tools.ietf.org/html/rfc6749#section-4.1.3
- * @see https://github.com/bshaffer/oauth2-server-php/issues/163
- */
- public function testNoRedirectUriSuppliedDoesNotRequireTokenRedirectUri()
- {
- $server = $this->getTestServer();
- $request = new Request(array(
- 'client_id' => 'Test Client ID with Redirect Uri', // valid client id
- 'response_type' => 'code',
- 'state' => 'xyz',
- ));
-
- $server->handleAuthorizeRequest($request, $response = new Response(), true);
- $this->assertEquals($response->getStatusCode(), 302);
- $this->assertContains('state', $response->getHttpHeader('Location'));
- $this->assertStringStartsWith('http://brentertainment.com?code=', $response->getHttpHeader('Location'));
-
- $parts = parse_url($response->getHttpHeader('Location'));
- parse_str($parts['query'], $query);
-
- // call token endpoint with no redirect_uri supplied
- $request = TestRequest::createPost(array(
- 'client_id' => 'Test Client ID with Redirect Uri', // valid client id
- 'client_secret' => 'TestSecret2',
- 'grant_type' => 'authorization_code',
- 'code' => $query['code'],
- ));
-
- $server->handleTokenRequest($request, $response = new Response(), true);
- $this->assertEquals($response->getStatusCode(), 200);
- $this->assertNotNull($response->getParameter('access_token'));
- }
-
- public function testUserDeniesAccessResponse()
- {
- $server = $this->getTestServer();
- $request = new Request(array(
- 'client_id' => 'Test Client ID', // valid client id
- 'redirect_uri' => 'http://adobe.com', // valid redirect URI
- 'response_type' => 'code',
- 'state' => 'xyz',
- ));
- $server->handleAuthorizeRequest($request, $response = new Response(), false);
-
- $this->assertEquals($response->getStatusCode(), 302);
- $location = $response->getHttpHeader('Location');
- $parts = parse_url($location);
- parse_str($parts['query'], $query);
-
- $this->assertEquals($query['error'], 'access_denied');
- $this->assertEquals($query['error_description'], 'The user denied access to your application');
- }
-
- public function testCodeQueryParamIsSet()
- {
- $server = $this->getTestServer();
- $request = new Request(array(
- 'client_id' => 'Test Client ID', // valid client id
- 'redirect_uri' => 'http://adobe.com', // valid redirect URI
- 'response_type' => 'code',
- 'state' => 'xyz',
- ));
- $server->handleAuthorizeRequest($request, $response = new Response(), true);
-
- $this->assertEquals($response->getStatusCode(), 302);
- $location = $response->getHttpHeader('Location');
- $parts = parse_url($location);
- parse_str($parts['query'], $query);
-
- $location = $response->getHttpHeader('Location');
- $parts = parse_url($location);
-
- $this->assertEquals('http', $parts['scheme']); // same as passed in to redirect_uri
- $this->assertEquals('adobe.com', $parts['host']); // same as passed in to redirect_uri
- $this->assertArrayHasKey('query', $parts);
- $this->assertFalse(isset($parts['fragment']));
-
- // assert fragment is in "application/x-www-form-urlencoded" format
- parse_str($parts['query'], $query);
- $this->assertNotNull($query);
- $this->assertArrayHasKey('code', $query);
-
- // ensure no id_token was saved, since the openid scope wasn't requested
- $storage = $server->getStorage('authorization_code');
- $code = $storage->getAuthorizationCode($query['code']);
- $this->assertTrue(empty($code['id_token']));
-
- // ensure no error was returned
- $this->assertFalse(isset($query['error']));
- $this->assertFalse(isset($query['error_description']));
- }
-
- public function testSuccessfulRequestReturnsStateParameter()
- {
- $server = $this->getTestServer(array('allow_implicit' => true));
- $request = new Request(array(
- 'client_id' => 'Test Client ID', // valid client id
- 'redirect_uri' => 'http://adobe.com', // valid redirect URI
- 'response_type' => 'code',
- 'state' => 'test', // valid state string (just needs to be passed back to us)
- ));
- $server->handleAuthorizeRequest($request, $response = new Response(), true);
-
- $this->assertEquals($response->getStatusCode(), 302);
-
- $location = $response->getHttpHeader('Location');
- $parts = parse_url($location);
- $this->assertArrayHasKey('query', $parts);
- parse_str($parts['query'], $query);
-
- $this->assertArrayHasKey('state', $query);
- $this->assertEquals($query['state'], 'test');
-
- // ensure no error was returned
- $this->assertFalse(isset($query['error']));
- $this->assertFalse(isset($query['error_description']));
- }
-
- public function testSuccessfulRequestStripsExtraParameters()
- {
- $server = $this->getTestServer(array('allow_implicit' => true));
- $request = new Request(array(
- 'client_id' => 'Test Client ID', // valid client id
- 'redirect_uri' => 'http://adobe.com', // valid redirect URI
- 'response_type' => 'code',
- 'state' => 'test', // valid state string (just needs to be passed back to us)
- 'fake' => 'something', // extra query param
- ));
- $server->handleAuthorizeRequest($request, $response = new Response(), true);
-
- $this->assertEquals($response->getStatusCode(), 302);
- $location = $response->getHttpHeader('Location');
- $this->assertNotContains('error', $location);
-
- $parts = parse_url($location);
- $this->assertFalse(isset($parts['fake']));
- $this->assertArrayHasKey('query', $parts);
- parse_str($parts['query'], $query);
-
- $this->assertFalse(isset($parmas['fake']));
- $this->assertArrayHasKey('state', $query);
- $this->assertEquals($query['state'], 'test');
- }
-
- public function testSuccessfulOpenidConnectRequest()
- {
- $server = $this->getTestServer(array(
- 'use_openid_connect' => true,
- 'issuer' => 'bojanz',
- ));
-
- $request = new Request(array(
- 'client_id' => 'Test Client ID',
- 'redirect_uri' => 'http://adobe.com',
- 'response_type' => 'code',
- 'state' => 'xyz',
- 'scope' => 'openid',
- ));
- $server->handleAuthorizeRequest($request, $response = new Response(), true);
-
- $this->assertEquals($response->getStatusCode(), 302);
- $location = $response->getHttpHeader('Location');
- $parts = parse_url($location);
- parse_str($parts['query'], $query);
-
- $location = $response->getHttpHeader('Location');
- $parts = parse_url($location);
- $this->assertArrayHasKey('query', $parts);
- $this->assertFalse(isset($parts['fragment']));
-
- // assert fragment is in "application/x-www-form-urlencoded" format
- parse_str($parts['query'], $query);
- $this->assertNotNull($query);
- $this->assertArrayHasKey('code', $query);
-
- // ensure no error was returned
- $this->assertFalse(isset($query['error']));
- $this->assertFalse(isset($query['error_description']));
-
- // confirm that the id_token has been created.
- $storage = $server->getStorage('authorization_code');
- $code = $storage->getAuthorizationCode($query['code']);
- $this->assertTrue(!empty($code['id_token']));
- }
-
- public function testCreateController()
- {
- $storage = Bootstrap::getInstance()->getMemoryStorage();
- $controller = new AuthorizeController($storage);
- }
-
- private function getTestServer($config = array())
- {
- $storage = Bootstrap::getInstance()->getMemoryStorage();
- $server = new Server($storage, $config);
-
- // Add the two types supported for authorization grant
- $server->addGrantType(new AuthorizationCode($storage));
-
- return $server;
- }
-}
diff --git a/library/oauth2/test/OAuth2/Controller/ResourceControllerTest.php b/library/oauth2/test/OAuth2/Controller/ResourceControllerTest.php
deleted file mode 100644
index ee6d96ff8..000000000
--- a/library/oauth2/test/OAuth2/Controller/ResourceControllerTest.php
+++ /dev/null
@@ -1,175 +0,0 @@
-<?php
-
-namespace OAuth2\Controller;
-
-use OAuth2\Storage\Bootstrap;
-use OAuth2\Server;
-use OAuth2\GrantType\AuthorizationCode;
-use OAuth2\Request;
-use OAuth2\Response;
-
-class ResourceControllerTest extends \PHPUnit_Framework_TestCase
-{
- public function testNoAccessToken()
- {
- $server = $this->getTestServer();
- $request = Request::createFromGlobals();
- $allow = $server->verifyResourceRequest($request, $response = new Response());
- $this->assertFalse($allow);
-
- $this->assertEquals($response->getStatusCode(), 401);
- $this->assertNull($response->getParameter('error'));
- $this->assertNull($response->getParameter('error_description'));
- }
-
- public function testMalformedHeader()
- {
- $server = $this->getTestServer();
- $request = Request::createFromGlobals();
- $request->headers['AUTHORIZATION'] = 'tH1s i5 B0gU5';
- $allow = $server->verifyResourceRequest($request, $response = new Response());
- $this->assertFalse($allow);
-
- $this->assertEquals($response->getStatusCode(), 400);
- $this->assertEquals($response->getParameter('error'), 'invalid_request');
- $this->assertEquals($response->getParameter('error_description'), 'Malformed auth header');
- }
-
- public function testMultipleTokensSubmitted()
- {
- $server = $this->getTestServer();
- $request = Request::createFromGlobals();
- $request->request['access_token'] = 'TEST';
- $request->query['access_token'] = 'TEST';
- $allow = $server->verifyResourceRequest($request, $response = new Response());
- $this->assertFalse($allow);
-
- $this->assertEquals($response->getStatusCode(), 400);
- $this->assertEquals($response->getParameter('error'), 'invalid_request');
- $this->assertEquals($response->getParameter('error_description'), 'Only one method may be used to authenticate at a time (Auth header, GET or POST)');
- }
-
- public function testInvalidRequestMethod()
- {
- $server = $this->getTestServer();
- $request = Request::createFromGlobals();
- $request->server['REQUEST_METHOD'] = 'GET';
- $request->request['access_token'] = 'TEST';
- $allow = $server->verifyResourceRequest($request, $response = new Response());
- $this->assertFalse($allow);
-
- $this->assertEquals($response->getStatusCode(), 400);
- $this->assertEquals($response->getParameter('error'), 'invalid_request');
- $this->assertEquals($response->getParameter('error_description'), 'When putting the token in the body, the method must be POST or PUT');
- }
-
- public function testInvalidContentType()
- {
- $server = $this->getTestServer();
- $request = Request::createFromGlobals();
- $request->server['REQUEST_METHOD'] = 'POST';
- $request->server['CONTENT_TYPE'] = 'application/json';
- $request->request['access_token'] = 'TEST';
- $allow = $server->verifyResourceRequest($request, $response = new Response());
- $this->assertFalse($allow);
-
- $this->assertEquals($response->getStatusCode(), 400);
- $this->assertEquals($response->getParameter('error'), 'invalid_request');
- $this->assertEquals($response->getParameter('error_description'), 'The content type for POST requests must be "application/x-www-form-urlencoded"');
- }
-
- public function testInvalidToken()
- {
- $server = $this->getTestServer();
- $request = Request::createFromGlobals();
- $request->headers['AUTHORIZATION'] = 'Bearer TESTTOKEN';
- $allow = $server->verifyResourceRequest($request, $response = new Response());
- $this->assertFalse($allow);
-
- $this->assertEquals($response->getStatusCode(), 401);
- $this->assertEquals($response->getParameter('error'), 'invalid_token');
- $this->assertEquals($response->getParameter('error_description'), 'The access token provided is invalid');
- }
-
- public function testExpiredToken()
- {
- $server = $this->getTestServer();
- $request = Request::createFromGlobals();
- $request->headers['AUTHORIZATION'] = 'Bearer accesstoken-expired';
- $allow = $server->verifyResourceRequest($request, $response = new Response());
- $this->assertFalse($allow);
-
- $this->assertEquals($response->getStatusCode(), 401);
- $this->assertEquals($response->getParameter('error'), 'expired_token');
- $this->assertEquals($response->getParameter('error_description'), 'The access token provided has expired');
- }
-
- public function testOutOfScopeToken()
- {
- $server = $this->getTestServer();
- $request = Request::createFromGlobals();
- $request->headers['AUTHORIZATION'] = 'Bearer accesstoken-scope';
- $scope = 'outofscope';
- $allow = $server->verifyResourceRequest($request, $response = new Response(), $scope);
- $this->assertFalse($allow);
-
- $this->assertEquals($response->getStatusCode(), 403);
- $this->assertEquals($response->getParameter('error'), 'insufficient_scope');
- $this->assertEquals($response->getParameter('error_description'), 'The request requires higher privileges than provided by the access token');
-
- // verify the "scope" has been set in the "WWW-Authenticate" header
- preg_match('/scope="(.*?)"/', $response->getHttpHeader('WWW-Authenticate'), $matches);
- $this->assertEquals(2, count($matches));
- $this->assertEquals($matches[1], 'outofscope');
- }
-
- public function testMalformedToken()
- {
- $server = $this->getTestServer();
- $request = Request::createFromGlobals();
- $request->headers['AUTHORIZATION'] = 'Bearer accesstoken-malformed';
- $allow = $server->verifyResourceRequest($request, $response = new Response());
- $this->assertFalse($allow);
-
- $this->assertEquals($response->getStatusCode(), 401);
- $this->assertEquals($response->getParameter('error'), 'malformed_token');
- $this->assertEquals($response->getParameter('error_description'), 'Malformed token (missing "expires")');
- }
-
- public function testValidToken()
- {
- $server = $this->getTestServer();
- $request = Request::createFromGlobals();
- $request->headers['AUTHORIZATION'] = 'Bearer accesstoken-scope';
- $allow = $server->verifyResourceRequest($request, $response = new Response());
- $this->assertTrue($allow);
- }
-
- public function testValidTokenWithScopeParam()
- {
- $server = $this->getTestServer();
- $request = Request::createFromGlobals();
- $request->headers['AUTHORIZATION'] = 'Bearer accesstoken-scope';
- $request->query['scope'] = 'testscope';
- $allow = $server->verifyResourceRequest($request, $response = new Response());
- $this->assertTrue($allow);
- }
-
- public function testCreateController()
- {
- $storage = Bootstrap::getInstance()->getMemoryStorage();
- $tokenType = new \OAuth2\TokenType\Bearer();
- $controller = new ResourceController($tokenType, $storage);
- }
-
- private function getTestServer($config = array())
- {
- $storage = Bootstrap::getInstance()->getMemoryStorage();
- $server = new Server($storage, $config);
-
- // Add the two types supported for authorization grant
- $server->addGrantType(new AuthorizationCode($storage));
-
- return $server;
- }
-}
diff --git a/library/oauth2/test/OAuth2/Controller/TokenControllerTest.php b/library/oauth2/test/OAuth2/Controller/TokenControllerTest.php
deleted file mode 100644
index 4a217bd55..000000000
--- a/library/oauth2/test/OAuth2/Controller/TokenControllerTest.php
+++ /dev/null
@@ -1,289 +0,0 @@
-<?php
-
-namespace OAuth2\Controller;
-
-use OAuth2\Storage\Bootstrap;
-use OAuth2\Server;
-use OAuth2\GrantType\AuthorizationCode;
-use OAuth2\GrantType\ClientCredentials;
-use OAuth2\GrantType\UserCredentials;
-use OAuth2\Scope;
-use OAuth2\Request\TestRequest;
-use OAuth2\Response;
-
-class TokenControllerTest extends \PHPUnit_Framework_TestCase
-{
- public function testNoGrantType()
- {
- // add the test parameters in memory
- $server = $this->getTestServer();
- $server->handleTokenRequest(TestRequest::createPost(), $response = new Response());
-
- $this->assertEquals($response->getStatusCode(), 400);
- $this->assertEquals($response->getParameter('error'), 'invalid_request');
- $this->assertEquals($response->getParameter('error_description'), 'The grant type was not specified in the request');
- }
-
- public function testInvalidGrantType()
- {
- // add the test parameters in memory
- $server = $this->getTestServer();
- $request = TestRequest::createPost(array(
- 'grant_type' => 'invalid_grant_type', // invalid grant type
- ));
- $server->handleTokenRequest($request, $response = new Response());
-
- $this->assertEquals($response->getStatusCode(), 400);
- $this->assertEquals($response->getParameter('error'), 'unsupported_grant_type');
- $this->assertEquals($response->getParameter('error_description'), 'Grant type "invalid_grant_type" not supported');
- }
-
- public function testNoClientId()
- {
- // add the test parameters in memory
- $server = $this->getTestServer();
- $request = TestRequest::createPost(array(
- 'grant_type' => 'authorization_code', // valid grant type
- 'code' => 'testcode',
- ));
- $server->handleTokenRequest($request, $response = new Response());
-
- $this->assertEquals($response->getStatusCode(), 400);
- $this->assertEquals($response->getParameter('error'), 'invalid_client');
- $this->assertEquals($response->getParameter('error_description'), 'Client credentials were not found in the headers or body');
- }
-
- public function testNoClientSecretWithConfidentialClient()
- {
- // add the test parameters in memory
- $server = $this->getTestServer();
- $request = TestRequest::createPost(array(
- 'grant_type' => 'authorization_code', // valid grant type
- 'code' => 'testcode',
- 'client_id' => 'Test Client ID', // valid client id
- ));
- $server->handleTokenRequest($request, $response = new Response());
-
- $this->assertEquals($response->getStatusCode(), 400);
- $this->assertEquals($response->getParameter('error'), 'invalid_client');
- $this->assertEquals($response->getParameter('error_description'), 'This client is invalid or must authenticate using a client secret');
- }
-
- public function testNoClientSecretWithEmptySecret()
- {
- // add the test parameters in memory
- $server = $this->getTestServer();
- $request = TestRequest::createPost(array(
- 'grant_type' => 'authorization_code', // valid grant type
- 'code' => 'testcode-empty-secret',
- 'client_id' => 'Test Client ID Empty Secret', // valid client id
- ));
- $server->handleTokenRequest($request, $response = new Response());
-
- $this->assertEquals($response->getStatusCode(), 200);
- }
-
- public function testInvalidClientId()
- {
- // add the test parameters in memory
- $server = $this->getTestServer();
- $request = TestRequest::createPost(array(
- 'grant_type' => 'authorization_code', // valid grant type
- 'code' => 'testcode',
- 'client_id' => 'Fake Client ID', // invalid client id
- 'client_secret' => 'TestSecret', // valid client secret
- ));
- $server->handleTokenRequest($request, $response = new Response());
-
- $this->assertEquals($response->getStatusCode(), 400);
- $this->assertEquals($response->getParameter('error'), 'invalid_client');
- $this->assertEquals($response->getParameter('error_description'), 'The client credentials are invalid');
- }
-
- public function testInvalidClientSecret()
- {
- // add the test parameters in memory
- $server = $this->getTestServer();
- $request = TestRequest::createPost(array(
- 'grant_type' => 'authorization_code', // valid grant type
- 'code' => 'testcode',
- 'client_id' => 'Test Client ID', // valid client id
- 'client_secret' => 'Fake Client Secret', // invalid client secret
- ));
- $server->handleTokenRequest($request, $response = new Response());
-
- $this->assertEquals($response->getStatusCode(), 400);
- $this->assertEquals($response->getParameter('error'), 'invalid_client');
- $this->assertEquals($response->getParameter('error_description'), 'The client credentials are invalid');
- }
-
- public function testValidTokenResponse()
- {
- // add the test parameters in memory
- $server = $this->getTestServer();
- $request = TestRequest::createPost(array(
- 'grant_type' => 'authorization_code', // valid grant type
- 'client_id' => 'Test Client ID', // valid client id
- 'client_secret' => 'TestSecret', // valid client secret
- 'code' => 'testcode', // valid authorization code
- ));
- $server->handleTokenRequest($request, $response = new Response());
-
- $this->assertTrue($response instanceof Response);
- $this->assertEquals($response->getStatusCode(), 200);
- $this->assertNull($response->getParameter('error'));
- $this->assertNull($response->getParameter('error_description'));
- $this->assertNotNull($response->getParameter('access_token'));
- $this->assertNotNull($response->getParameter('expires_in'));
- $this->assertNotNull($response->getParameter('token_type'));
- }
-
- public function testValidClientIdScope()
- {
- // add the test parameters in memory
- $server = $this->getTestServer();
- $request = TestRequest::createPost(array(
- 'grant_type' => 'authorization_code', // valid grant type
- 'code' => 'testcode',
- 'client_id' => 'Test Client ID', // valid client id
- 'client_secret' => 'TestSecret', // valid client secret
- 'scope' => 'clientscope1 clientscope2'
- ));
- $server->handleTokenRequest($request, $response = new Response());
-
- $this->assertEquals($response->getStatusCode(), 200);
- $this->assertNull($response->getParameter('error'));
- $this->assertNull($response->getParameter('error_description'));
- $this->assertEquals('clientscope1 clientscope2', $response->getParameter('scope'));
- }
-
- public function testInvalidClientIdScope()
- {
- // add the test parameters in memory
- $server = $this->getTestServer();
- $request = TestRequest::createPost(array(
- 'grant_type' => 'authorization_code', // valid grant type
- 'code' => 'testcode-with-scope',
- 'client_id' => 'Test Client ID', // valid client id
- 'client_secret' => 'TestSecret', // valid client secret
- 'scope' => 'clientscope3'
- ));
- $server->handleTokenRequest($request, $response = new Response());
-
- $this->assertEquals($response->getStatusCode(), 400);
- $this->assertEquals($response->getParameter('error'), 'invalid_scope');
- $this->assertEquals($response->getParameter('error_description'), 'The scope requested is invalid for this request');
- }
-
- public function testEnforceScope()
- {
- $storage = Bootstrap::getInstance()->getMemoryStorage();
- $server = new Server($storage);
- $server->addGrantType(new ClientCredentials($storage));
-
- $scope = new Scope(array(
- 'default_scope' => false,
- 'supported_scopes' => array('testscope')
- ));
- $server->setScopeUtil($scope);
-
- $request = TestRequest::createPost(array(
- 'grant_type' => 'client_credentials', // valid grant type
- 'client_id' => 'Test Client ID', // valid client id
- 'client_secret' => 'TestSecret', // valid client secret
- ));
- $response = $server->handleTokenRequest($request);
-
- $this->assertEquals($response->getStatusCode(), 400);
- $this->assertEquals($response->getParameter('error'), 'invalid_scope');
- $this->assertEquals($response->getParameter('error_description'), 'This application requires you specify a scope parameter');
- }
-
- public function testCanReceiveAccessTokenUsingPasswordGrantTypeWithoutClientSecret()
- {
- // add the test parameters in memory
- $storage = Bootstrap::getInstance()->getMemoryStorage();
- $server = new Server($storage);
- $server->addGrantType(new UserCredentials($storage));
-
- $request = TestRequest::createPost(array(
- 'grant_type' => 'password', // valid grant type
- 'client_id' => 'Test Client ID For Password Grant', // valid client id
- 'username' => 'johndoe', // valid username
- 'password' => 'password', // valid password for username
- ));
- $server->handleTokenRequest($request, $response = new Response());
-
- $this->assertTrue($response instanceof Response);
- $this->assertEquals(200, $response->getStatusCode(), var_export($response, 1));
- $this->assertNull($response->getParameter('error'));
- $this->assertNull($response->getParameter('error_description'));
- $this->assertNotNull($response->getParameter('access_token'));
- $this->assertNotNull($response->getParameter('expires_in'));
- $this->assertNotNull($response->getParameter('token_type'));
- }
-
- public function testInvalidTokenTypeHintForRevoke()
- {
- $server = $this->getTestServer();
-
- $request = TestRequest::createPost(array(
- 'token_type_hint' => 'foo',
- 'token' => 'sometoken'
- ));
-
- $server->handleRevokeRequest($request, $response = new Response());
-
- $this->assertTrue($response instanceof Response);
- $this->assertEquals(400, $response->getStatusCode(), var_export($response, 1));
- $this->assertEquals($response->getParameter('error'), 'invalid_request');
- $this->assertEquals($response->getParameter('error_description'), 'Token type hint must be either \'access_token\' or \'refresh_token\'');
- }
-
- public function testMissingTokenForRevoke()
- {
- $server = $this->getTestServer();
-
- $request = TestRequest::createPost(array(
- 'token_type_hint' => 'access_token'
- ));
-
- $server->handleRevokeRequest($request, $response = new Response());
- $this->assertTrue($response instanceof Response);
- $this->assertEquals(400, $response->getStatusCode(), var_export($response, 1));
- $this->assertEquals($response->getParameter('error'), 'invalid_request');
- $this->assertEquals($response->getParameter('error_description'), 'Missing token parameter to revoke');
- }
-
- public function testInvalidRequestMethodForRevoke()
- {
- $server = $this->getTestServer();
-
- $request = new TestRequest();
- $request->setQuery(array(
- 'token_type_hint' => 'access_token'
- ));
-
- $server->handleRevokeRequest($request, $response = new Response());
- $this->assertTrue($response instanceof Response);
- $this->assertEquals(405, $response->getStatusCode(), var_export($response, 1));
- $this->assertEquals($response->getParameter('error'), 'invalid_request');
- $this->assertEquals($response->getParameter('error_description'), 'The request method must be POST when revoking an access token');
- }
-
- public function testCreateController()
- {
- $storage = Bootstrap::getInstance()->getMemoryStorage();
- $accessToken = new \OAuth2\ResponseType\AccessToken($storage);
- $controller = new TokenController($accessToken, $storage);
- }
-
- private function getTestServer()
- {
- $storage = Bootstrap::getInstance()->getMemoryStorage();
- $server = new Server($storage);
- $server->addGrantType(new AuthorizationCode($storage));
-
- return $server;
- }
-}
diff --git a/library/oauth2/test/OAuth2/Encryption/FirebaseJwtTest.php b/library/oauth2/test/OAuth2/Encryption/FirebaseJwtTest.php
deleted file mode 100644
index d34136767..000000000
--- a/library/oauth2/test/OAuth2/Encryption/FirebaseJwtTest.php
+++ /dev/null
@@ -1,102 +0,0 @@
-<?php
-
-namespace OAuth2\Encryption;
-
-use OAuth2\Storage\Bootstrap;
-
-class FirebaseJwtTest extends \PHPUnit_Framework_TestCase
-{
- private $privateKey;
-
- public function setUp()
- {
- $this->privateKey = <<<EOD
------BEGIN RSA PRIVATE KEY-----
-MIICXAIBAAKBgQC5/SxVlE8gnpFqCxgl2wjhzY7ucEi00s0kUg3xp7lVEvgLgYcA
-nHiWp+gtSjOFfH2zsvpiWm6Lz5f743j/FEzHIO1owR0p4d9pOaJK07d01+RzoQLO
-IQAgXrr4T1CCWUesncwwPBVCyy2Mw3Nmhmr9MrF8UlvdRKBxriRnlP3qJQIDAQAB
-AoGAVgJJVU4fhYMu1e5JfYAcTGfF+Gf+h3iQm4JCpoUcxMXf5VpB9ztk3K7LRN5y
-kwFuFALpnUAarRcUPs0D8FoP4qBluKksbAtgHkO7bMSH9emN+mH4le4qpFlR7+P1
-3fLE2Y19IBwPwEfClC+TpJvuog6xqUYGPlg6XLq/MxQUB4ECQQDgovP1v+ONSeGS
-R+NgJTR47noTkQT3M2izlce/OG7a+O0yw6BOZjNXqH2wx3DshqMcPUFrTjibIClP
-l/tEQ3ShAkEA0/TdBYDtXpNNjqg0R9GVH2pw7Kh68ne6mZTuj0kCgFYpUF6L6iMm
-zXamIJ51rTDsTyKTAZ1JuAhAsK/M2BbDBQJAKQ5fXEkIA+i+64dsDUR/hKLBeRYG
-PFAPENONQGvGBwt7/s02XV3cgGbxIgAxqWkqIp0neb9AJUoJgtyaNe3GQQJANoL4
-QQ0af0NVJAZgg8QEHTNL3aGrFSbzx8IE5Lb7PLRsJa5bP5lQxnDoYuU+EI/Phr62
-niisp/b/ZDGidkTMXQJBALeRsH1I+LmICAvWXpLKa9Gv0zGCwkuIJLiUbV9c6CVh
-suocCAteQwL5iW2gA4AnYr5OGeHFsEl7NCQcwfPZpJ0=
------END RSA PRIVATE KEY-----
-EOD;
- }
-
- /** @dataProvider provideClientCredentials */
- public function testJwtUtil($client_id, $client_key)
- {
- $jwtUtil = new FirebaseJwt();
-
- $params = array(
- 'iss' => $client_id,
- 'exp' => time() + 1000,
- 'iat' => time(),
- 'sub' => 'testuser@ourdomain.com',
- 'aud' => 'http://myapp.com/oauth/auth',
- 'scope' => null,
- );
-
- $encoded = $jwtUtil->encode($params, $this->privateKey, 'RS256');
-
- // test BC behaviour of trusting the algorithm in the header
- $payload = $jwtUtil->decode($encoded, $client_key, array('RS256'));
- $this->assertEquals($params, $payload);
-
- // test BC behaviour of not verifying by passing false
- $payload = $jwtUtil->decode($encoded, $client_key, false);
- $this->assertEquals($params, $payload);
-
- // test the new restricted algorithms header
- $payload = $jwtUtil->decode($encoded, $client_key, array('RS256'));
- $this->assertEquals($params, $payload);
- }
-
- public function testInvalidJwt()
- {
- $jwtUtil = new FirebaseJwt();
-
- $this->assertFalse($jwtUtil->decode('goob'));
- $this->assertFalse($jwtUtil->decode('go.o.b'));
- }
-
- /** @dataProvider provideClientCredentials */
- public function testInvalidJwtHeader($client_id, $client_key)
- {
- $jwtUtil = new FirebaseJwt();
-
- $params = array(
- 'iss' => $client_id,
- 'exp' => time() + 1000,
- 'iat' => time(),
- 'sub' => 'testuser@ourdomain.com',
- 'aud' => 'http://myapp.com/oauth/auth',
- 'scope' => null,
- );
-
- // testing for algorithm tampering when only RSA256 signing is allowed
- // @see https://auth0.com/blog/2015/03/31/critical-vulnerabilities-in-json-web-token-libraries/
- $tampered = $jwtUtil->encode($params, $client_key, 'HS256');
-
- $payload = $jwtUtil->decode($tampered, $client_key, array('RS256'));
-
- $this->assertFalse($payload);
- }
-
- public function provideClientCredentials()
- {
- $storage = Bootstrap::getInstance()->getMemoryStorage();
- $client_id = 'Test Client ID';
- $client_key = $storage->getClientKey($client_id, "testuser@ourdomain.com");
-
- return array(
- array($client_id, $client_key),
- );
- }
-}
diff --git a/library/oauth2/test/OAuth2/Encryption/JwtTest.php b/library/oauth2/test/OAuth2/Encryption/JwtTest.php
deleted file mode 100644
index 214eebac8..000000000
--- a/library/oauth2/test/OAuth2/Encryption/JwtTest.php
+++ /dev/null
@@ -1,102 +0,0 @@
-<?php
-
-namespace OAuth2\Encryption;
-
-use OAuth2\Storage\Bootstrap;
-
-class JwtTest extends \PHPUnit_Framework_TestCase
-{
- private $privateKey;
-
- public function setUp()
- {
- $this->privateKey = <<<EOD
------BEGIN RSA PRIVATE KEY-----
-MIICXAIBAAKBgQC5/SxVlE8gnpFqCxgl2wjhzY7ucEi00s0kUg3xp7lVEvgLgYcA
-nHiWp+gtSjOFfH2zsvpiWm6Lz5f743j/FEzHIO1owR0p4d9pOaJK07d01+RzoQLO
-IQAgXrr4T1CCWUesncwwPBVCyy2Mw3Nmhmr9MrF8UlvdRKBxriRnlP3qJQIDAQAB
-AoGAVgJJVU4fhYMu1e5JfYAcTGfF+Gf+h3iQm4JCpoUcxMXf5VpB9ztk3K7LRN5y
-kwFuFALpnUAarRcUPs0D8FoP4qBluKksbAtgHkO7bMSH9emN+mH4le4qpFlR7+P1
-3fLE2Y19IBwPwEfClC+TpJvuog6xqUYGPlg6XLq/MxQUB4ECQQDgovP1v+ONSeGS
-R+NgJTR47noTkQT3M2izlce/OG7a+O0yw6BOZjNXqH2wx3DshqMcPUFrTjibIClP
-l/tEQ3ShAkEA0/TdBYDtXpNNjqg0R9GVH2pw7Kh68ne6mZTuj0kCgFYpUF6L6iMm
-zXamIJ51rTDsTyKTAZ1JuAhAsK/M2BbDBQJAKQ5fXEkIA+i+64dsDUR/hKLBeRYG
-PFAPENONQGvGBwt7/s02XV3cgGbxIgAxqWkqIp0neb9AJUoJgtyaNe3GQQJANoL4
-QQ0af0NVJAZgg8QEHTNL3aGrFSbzx8IE5Lb7PLRsJa5bP5lQxnDoYuU+EI/Phr62
-niisp/b/ZDGidkTMXQJBALeRsH1I+LmICAvWXpLKa9Gv0zGCwkuIJLiUbV9c6CVh
-suocCAteQwL5iW2gA4AnYr5OGeHFsEl7NCQcwfPZpJ0=
------END RSA PRIVATE KEY-----
-EOD;
- }
-
- /** @dataProvider provideClientCredentials */
- public function testJwtUtil($client_id, $client_key)
- {
- $jwtUtil = new Jwt();
-
- $params = array(
- 'iss' => $client_id,
- 'exp' => time() + 1000,
- 'iat' => time(),
- 'sub' => 'testuser@ourdomain.com',
- 'aud' => 'http://myapp.com/oauth/auth',
- 'scope' => null,
- );
-
- $encoded = $jwtUtil->encode($params, $this->privateKey, 'RS256');
-
- // test BC behaviour of trusting the algorithm in the header
- $payload = $jwtUtil->decode($encoded, $client_key);
- $this->assertEquals($params, $payload);
-
- // test BC behaviour of not verifying by passing false
- $payload = $jwtUtil->decode($encoded, $client_key, false);
- $this->assertEquals($params, $payload);
-
- // test the new restricted algorithms header
- $payload = $jwtUtil->decode($encoded, $client_key, array('RS256'));
- $this->assertEquals($params, $payload);
- }
-
- public function testInvalidJwt()
- {
- $jwtUtil = new Jwt();
-
- $this->assertFalse($jwtUtil->decode('goob'));
- $this->assertFalse($jwtUtil->decode('go.o.b'));
- }
-
- /** @dataProvider provideClientCredentials */
- public function testInvalidJwtHeader($client_id, $client_key)
- {
- $jwtUtil = new Jwt();
-
- $params = array(
- 'iss' => $client_id,
- 'exp' => time() + 1000,
- 'iat' => time(),
- 'sub' => 'testuser@ourdomain.com',
- 'aud' => 'http://myapp.com/oauth/auth',
- 'scope' => null,
- );
-
- // testing for algorithm tampering when only RSA256 signing is allowed
- // @see https://auth0.com/blog/2015/03/31/critical-vulnerabilities-in-json-web-token-libraries/
- $tampered = $jwtUtil->encode($params, $client_key, 'HS256');
-
- $payload = $jwtUtil->decode($tampered, $client_key, array('RS256'));
-
- $this->assertFalse($payload);
- }
-
- public function provideClientCredentials()
- {
- $storage = Bootstrap::getInstance()->getMemoryStorage();
- $client_id = 'Test Client ID';
- $client_key = $storage->getClientKey($client_id, "testuser@ourdomain.com");
-
- return array(
- array($client_id, $client_key),
- );
- }
-}
diff --git a/library/oauth2/test/OAuth2/GrantType/AuthorizationCodeTest.php b/library/oauth2/test/OAuth2/GrantType/AuthorizationCodeTest.php
deleted file mode 100644
index 740989635..000000000
--- a/library/oauth2/test/OAuth2/GrantType/AuthorizationCodeTest.php
+++ /dev/null
@@ -1,207 +0,0 @@
-<?php
-
-namespace OAuth2\GrantType;
-
-use OAuth2\Storage\Bootstrap;
-use OAuth2\Server;
-use OAuth2\Request\TestRequest;
-use OAuth2\Response;
-
-class AuthorizationCodeTest extends \PHPUnit_Framework_TestCase
-{
- public function testNoCode()
- {
- $server = $this->getTestServer();
- $request = TestRequest::createPost(array(
- 'grant_type' => 'authorization_code', // valid grant type
- 'client_id' => 'Test Client ID', // valid client id
- 'client_secret' => 'TestSecret', // valid client secret
- ));
- $server->handleTokenRequest($request, $response = new Response());
-
- $this->assertEquals($response->getStatusCode(), 400);
- $this->assertEquals($response->getParameter('error'), 'invalid_request');
- $this->assertEquals($response->getParameter('error_description'), 'Missing parameter: "code" is required');
- }
-
- public function testInvalidCode()
- {
- $server = $this->getTestServer();
- $request = TestRequest::createPost(array(
- 'grant_type' => 'authorization_code', // valid grant type
- 'client_id' => 'Test Client ID', // valid client id
- 'client_secret' => 'TestSecret', // valid client secret
- 'code' => 'InvalidCode', // invalid authorization code
- ));
- $server->handleTokenRequest($request, $response = new Response());
-
- $this->assertEquals($response->getStatusCode(), 400);
- $this->assertEquals($response->getParameter('error'), 'invalid_grant');
- $this->assertEquals($response->getParameter('error_description'), 'Authorization code doesn\'t exist or is invalid for the client');
- }
-
- public function testCodeCannotBeUsedTwice()
- {
- $server = $this->getTestServer();
- $request = TestRequest::createPost(array(
- 'grant_type' => 'authorization_code', // valid grant type
- 'client_id' => 'Test Client ID', // valid client id
- 'client_secret' => 'TestSecret', // valid client secret
- 'code' => 'testcode', // valid code
- ));
- $server->handleTokenRequest($request, $response = new Response());
-
- $this->assertEquals($response->getStatusCode(), 200);
- $this->assertNotNull($response->getParameter('access_token'));
-
- // try to use the same code again
- $server->handleTokenRequest($request, $response = new Response());
-
- $this->assertEquals($response->getStatusCode(), 400);
- $this->assertEquals($response->getParameter('error'), 'invalid_grant');
- $this->assertEquals($response->getParameter('error_description'), 'Authorization code doesn\'t exist or is invalid for the client');
- }
-
- public function testExpiredCode()
- {
- $server = $this->getTestServer();
- $request = TestRequest::createPost(array(
- 'grant_type' => 'authorization_code', // valid grant type
- 'client_id' => 'Test Client ID', // valid client id
- 'client_secret' => 'TestSecret', // valid client secret
- 'code' => 'testcode-expired', // expired authorization code
- ));
- $server->handleTokenRequest($request, $response = new Response());
-
- $this->assertEquals($response->getStatusCode(), 400);
- $this->assertEquals($response->getParameter('error'), 'invalid_grant');
- $this->assertEquals($response->getParameter('error_description'), 'The authorization code has expired');
- }
-
- public function testValidCode()
- {
- $server = $this->getTestServer();
- $request = TestRequest::createPost(array(
- 'grant_type' => 'authorization_code', // valid grant type
- 'client_id' => 'Test Client ID', // valid client id
- 'client_secret' => 'TestSecret', // valid client secret
- 'code' => 'testcode', // valid code
- ));
- $token = $server->grantAccessToken($request, new Response());
-
- $this->assertNotNull($token);
- $this->assertArrayHasKey('access_token', $token);
- }
-
- public function testValidCodeNoScope()
- {
- $server = $this->getTestServer();
- $request = TestRequest::createPost(array(
- 'grant_type' => 'authorization_code', // valid grant type
- 'client_id' => 'Test Client ID', // valid client id
- 'client_secret' => 'TestSecret', // valid client secret
- 'code' => 'testcode-with-scope', // valid code
- ));
- $token = $server->grantAccessToken($request, new Response());
-
- $this->assertNotNull($token);
- $this->assertArrayHasKey('access_token', $token);
- $this->assertArrayHasKey('scope', $token);
- $this->assertEquals($token['scope'], 'scope1 scope2');
- }
-
- public function testValidCodeSameScope()
- {
- $server = $this->getTestServer();
- $request = TestRequest::createPost(array(
- 'grant_type' => 'authorization_code', // valid grant type
- 'client_id' => 'Test Client ID', // valid client id
- 'client_secret' => 'TestSecret', // valid client secret
- 'code' => 'testcode-with-scope', // valid code
- 'scope' => 'scope2 scope1',
- ));
- $token = $server->grantAccessToken($request, new Response());
-
- $this->assertNotNull($token);
- $this->assertArrayHasKey('access_token', $token);
- $this->assertArrayHasKey('scope', $token);
- $this->assertEquals($token['scope'], 'scope2 scope1');
- }
-
- public function testValidCodeLessScope()
- {
- $server = $this->getTestServer();
- $request = TestRequest::createPost(array(
- 'grant_type' => 'authorization_code', // valid grant type
- 'client_id' => 'Test Client ID', // valid client id
- 'client_secret' => 'TestSecret', // valid client secret
- 'code' => 'testcode-with-scope', // valid code
- 'scope' => 'scope1',
- ));
- $token = $server->grantAccessToken($request, new Response());
-
- $this->assertNotNull($token);
- $this->assertArrayHasKey('access_token', $token);
- $this->assertArrayHasKey('scope', $token);
- $this->assertEquals($token['scope'], 'scope1');
- }
-
- public function testValidCodeDifferentScope()
- {
- $server = $this->getTestServer();
- $request = TestRequest::createPost(array(
- 'grant_type' => 'authorization_code', // valid grant type
- 'client_id' => 'Test Client ID', // valid client id
- 'client_secret' => 'TestSecret', // valid client secret
- 'code' => 'testcode-with-scope', // valid code
- 'scope' => 'scope3',
- ));
- $token = $server->grantAccessToken($request, $response = new Response());
-
- $this->assertEquals($response->getStatusCode(), 400);
- $this->assertEquals($response->getParameter('error'), 'invalid_scope');
- $this->assertEquals($response->getParameter('error_description'), 'The scope requested is invalid for this request');
- }
-
- public function testValidCodeInvalidScope()
- {
- $server = $this->getTestServer();
- $request = TestRequest::createPost(array(
- 'grant_type' => 'authorization_code', // valid grant type
- 'client_id' => 'Test Client ID', // valid client id
- 'client_secret' => 'TestSecret', // valid client secret
- 'code' => 'testcode-with-scope', // valid code
- 'scope' => 'invalid-scope',
- ));
- $token = $server->grantAccessToken($request, $response = new Response());
-
- $this->assertEquals($response->getStatusCode(), 400);
- $this->assertEquals($response->getParameter('error'), 'invalid_scope');
- $this->assertEquals($response->getParameter('error_description'), 'The scope requested is invalid for this request');
- }
-
- public function testValidClientDifferentCode()
- {
- $server = $this->getTestServer();
- $request = TestRequest::createPost(array(
- 'grant_type' => 'authorization_code', // valid grant type
- 'client_id' => 'Test Some Other Client', // valid client id
- 'client_secret' => 'TestSecret3', // valid client secret
- 'code' => 'testcode', // valid code
- ));
- $token = $server->grantAccessToken($request, $response = new Response());
-
- $this->assertEquals($response->getStatusCode(), 400);
- $this->assertEquals($response->getParameter('error'), 'invalid_grant');
- $this->assertEquals($response->getParameter('error_description'), 'authorization_code doesn\'t exist or is invalid for the client');
- }
-
- private function getTestServer()
- {
- $storage = Bootstrap::getInstance()->getMemoryStorage();
- $server = new Server($storage);
- $server->addGrantType(new AuthorizationCode($storage));
-
- return $server;
- }
-}
diff --git a/library/oauth2/test/OAuth2/GrantType/ClientCredentialsTest.php b/library/oauth2/test/OAuth2/GrantType/ClientCredentialsTest.php
deleted file mode 100644
index f0d46ccb3..000000000
--- a/library/oauth2/test/OAuth2/GrantType/ClientCredentialsTest.php
+++ /dev/null
@@ -1,159 +0,0 @@
-<?php
-
-namespace OAuth2\GrantType;
-
-use OAuth2\Storage\Bootstrap;
-use OAuth2\Server;
-use OAuth2\Request\TestRequest;
-use OAuth2\Request;
-use OAuth2\Response;
-
-class ClientCredentialsTest extends \PHPUnit_Framework_TestCase
-{
- public function testInvalidCredentials()
- {
- $server = $this->getTestServer();
- $request = TestRequest::createPost(array(
- 'grant_type' => 'client_credentials', // valid grant type
- 'client_id' => 'Test Client ID', // valid client id
- 'client_secret' => 'FakeSecret', // valid client secret
- ));
- $server->handleTokenRequest($request, $response = new Response());
-
- $this->assertEquals($response->getStatusCode(), 400);
- $this->assertEquals($response->getParameter('error'), 'invalid_client');
- $this->assertEquals($response->getParameter('error_description'), 'The client credentials are invalid');
- }
-
- public function testValidCredentials()
- {
- $server = $this->getTestServer();
- $request = TestRequest::createPost(array(
- 'grant_type' => 'client_credentials', // valid grant type
- 'client_id' => 'Test Client ID', // valid client id
- 'client_secret' => 'TestSecret', // valid client secret
- ));
- $token = $server->grantAccessToken($request, new Response());
-
- $this->assertNotNull($token);
- $this->assertArrayHasKey('scope', $token);
- $this->assertNull($token['scope']);
- }
-
- public function testValidCredentialsWithScope()
- {
- $server = $this->getTestServer();
- $request = TestRequest::createPost(array(
- 'grant_type' => 'client_credentials', // valid grant type
- 'client_id' => 'Test Client ID', // valid client id
- 'client_secret' => 'TestSecret', // valid client secret
- 'scope' => 'scope1',
- ));
- $token = $server->grantAccessToken($request, new Response());
-
- $this->assertNotNull($token);
- $this->assertArrayHasKey('access_token', $token);
- $this->assertArrayHasKey('scope', $token);
- $this->assertEquals($token['scope'], 'scope1');
- }
-
- public function testValidCredentialsInvalidScope()
- {
- $server = $this->getTestServer();
- $request = TestRequest::createPost(array(
- 'grant_type' => 'client_credentials', // valid grant type
- 'client_id' => 'Test Client ID', // valid client id
- 'client_secret' => 'TestSecret', // valid client secret
- 'scope' => 'invalid-scope',
- ));
- $token = $server->grantAccessToken($request, $response = new Response());
-
- $this->assertEquals($response->getStatusCode(), 400);
- $this->assertEquals($response->getParameter('error'), 'invalid_scope');
- $this->assertEquals($response->getParameter('error_description'), 'An unsupported scope was requested');
- }
-
- public function testValidCredentialsInHeader()
- {
- // create with HTTP_AUTHORIZATION in header
- $server = $this->getTestServer();
- $headers = array('HTTP_AUTHORIZATION' => 'Basic '.base64_encode('Test Client ID:TestSecret'), 'REQUEST_METHOD' => 'POST');
- $params = array('grant_type' => 'client_credentials');
- $request = new Request(array(), $params, array(), array(), array(), $headers);
- $token = $server->grantAccessToken($request, new Response());
-
- $this->assertNotNull($token);
- $this->assertArrayHasKey('access_token', $token);
- $this->assertNotNull($token['access_token']);
-
- // create using PHP Authorization Globals
- $headers = array('PHP_AUTH_USER' => 'Test Client ID', 'PHP_AUTH_PW' => 'TestSecret', 'REQUEST_METHOD' => 'POST');
- $params = array('grant_type' => 'client_credentials');
- $request = new Request(array(), $params, array(), array(), array(), $headers);
- $token = $server->grantAccessToken($request, new Response());
-
- $this->assertNotNull($token);
- $this->assertArrayHasKey('access_token', $token);
- $this->assertNotNull($token['access_token']);
- }
-
- public function testValidCredentialsInRequest()
- {
- $server = $this->getTestServer();
- $request = TestRequest::createPost(array(
- 'grant_type' => 'client_credentials', // valid grant type
- 'client_id' => 'Test Client ID', // valid client id
- 'client_secret' => 'TestSecret', // valid client secret
- ));
- $token = $server->grantAccessToken($request, new Response());
-
- $this->assertNotNull($token);
- $this->assertArrayHasKey('access_token', $token);
- $this->assertNotNull($token['access_token']);
- }
-
- public function testValidCredentialsInQuerystring()
- {
- $server = $this->getTestServer();
- $request = TestRequest::createPost(array(
- 'grant_type' => 'client_credentials', // valid grant type
- 'client_id' => 'Test Client ID', // valid client id
- 'client_secret' => 'TestSecret', // valid client secret
- ));
- $token = $server->grantAccessToken($request, new Response());
-
- $this->assertNotNull($token);
- $this->assertArrayHasKey('access_token', $token);
- $this->assertNotNull($token['access_token']);
- }
-
- public function testClientUserIdIsSetInAccessToken()
- {
- $server = $this->getTestServer();
- $request = TestRequest::createPost(array(
- 'grant_type' => 'client_credentials', // valid grant type
- 'client_id' => 'Client ID With User ID', // valid client id
- 'client_secret' => 'TestSecret', // valid client secret
- ));
- $token = $server->grantAccessToken($request, new Response());
-
- $this->assertNotNull($token);
- $this->assertArrayHasKey('access_token', $token);
-
- // verify the user_id was associated with the token
- $storage = $server->getStorage('client');
- $token = $storage->getAccessToken($token['access_token']);
- $this->assertNotNull($token);
- $this->assertArrayHasKey('user_id', $token);
- $this->assertEquals($token['user_id'], 'brent@brentertainment.com');
- }
-
- private function getTestServer()
- {
- $storage = Bootstrap::getInstance()->getMemoryStorage();
- $server = new Server($storage);
- $server->addGrantType(new ClientCredentials($storage));
-
- return $server;
- }
-}
diff --git a/library/oauth2/test/OAuth2/GrantType/ImplicitTest.php b/library/oauth2/test/OAuth2/GrantType/ImplicitTest.php
deleted file mode 100644
index a47aae3e8..000000000
--- a/library/oauth2/test/OAuth2/GrantType/ImplicitTest.php
+++ /dev/null
@@ -1,143 +0,0 @@
-<?php
-
-namespace OAuth2\GrantType;
-
-use OAuth2\Storage\Bootstrap;
-use OAuth2\Server;
-use OAuth2\Request;
-use OAuth2\Response;
-
-class ImplicitTest extends \PHPUnit_Framework_TestCase
-{
- public function testImplicitNotAllowedResponse()
- {
- $server = $this->getTestServer();
- $request = new Request(array(
- 'client_id' => 'Test Client ID', // valid client id
- 'redirect_uri' => 'http://adobe.com', // valid redirect URI
- 'response_type' => 'token', // invalid response type
- ));
- $server->handleAuthorizeRequest($request, $response = new Response(), false);
-
- $this->assertEquals($response->getStatusCode(), 302);
- $location = $response->getHttpHeader('Location');
- $parts = parse_url($location);
- parse_str($parts['query'], $query);
-
- $this->assertEquals($query['error'], 'unsupported_response_type');
- $this->assertEquals($query['error_description'], 'implicit grant type not supported');
- }
-
- public function testUserDeniesAccessResponse()
- {
- $server = $this->getTestServer(array('allow_implicit' => true));
- $request = new Request(array(
- 'client_id' => 'Test Client ID', // valid client id
- 'redirect_uri' => 'http://adobe.com', // valid redirect URI
- 'response_type' => 'token', // valid response type
- 'state' => 'xyz',
- ));
- $server->handleAuthorizeRequest($request, $response = new Response(), false);
-
- $this->assertEquals($response->getStatusCode(), 302);
- $location = $response->getHttpHeader('Location');
- $parts = parse_url($location);
- parse_str($parts['query'], $query);
-
- $this->assertEquals($query['error'], 'access_denied');
- $this->assertEquals($query['error_description'], 'The user denied access to your application');
- }
-
- public function testSuccessfulRequestFragmentParameter()
- {
- $server = $this->getTestServer(array('allow_implicit' => true));
- $request = new Request(array(
- 'client_id' => 'Test Client ID', // valid client id
- 'redirect_uri' => 'http://adobe.com', // valid redirect URI
- 'response_type' => 'token', // valid response type
- 'state' => 'xyz',
- ));
- $server->handleAuthorizeRequest($request, $response = new Response(), true);
-
- $this->assertEquals($response->getStatusCode(), 302);
- $this->assertNull($response->getParameter('error'));
- $this->assertNull($response->getParameter('error_description'));
-
- $location = $response->getHttpHeader('Location');
- $parts = parse_url($location);
-
- $this->assertEquals('http', $parts['scheme']); // same as passed in to redirect_uri
- $this->assertEquals('adobe.com', $parts['host']); // same as passed in to redirect_uri
- $this->assertArrayHasKey('fragment', $parts);
- $this->assertFalse(isset($parts['query']));
-
- // assert fragment is in "application/x-www-form-urlencoded" format
- parse_str($parts['fragment'], $params);
- $this->assertNotNull($params);
- $this->assertArrayHasKey('access_token', $params);
- $this->assertArrayHasKey('expires_in', $params);
- $this->assertArrayHasKey('token_type', $params);
- }
-
- public function testSuccessfulRequestReturnsStateParameter()
- {
- $server = $this->getTestServer(array('allow_implicit' => true));
- $request = new Request(array(
- 'client_id' => 'Test Client ID', // valid client id
- 'redirect_uri' => 'http://adobe.com', // valid redirect URI
- 'response_type' => 'token', // valid response type
- 'state' => 'test', // valid state string (just needs to be passed back to us)
- ));
- $server->handleAuthorizeRequest($request, $response = new Response(), true);
-
- $this->assertEquals($response->getStatusCode(), 302);
- $this->assertNull($response->getParameter('error'));
- $this->assertNull($response->getParameter('error_description'));
-
- $location = $response->getHttpHeader('Location');
- $parts = parse_url($location);
- $this->assertArrayHasKey('fragment', $parts);
- parse_str($parts['fragment'], $params);
-
- $this->assertArrayHasKey('state', $params);
- $this->assertEquals($params['state'], 'test');
- }
-
- public function testSuccessfulRequestStripsExtraParameters()
- {
- $server = $this->getTestServer(array('allow_implicit' => true));
- $request = new Request(array(
- 'client_id' => 'Test Client ID', // valid client id
- 'redirect_uri' => 'http://adobe.com?fake=something', // valid redirect URI
- 'response_type' => 'token', // valid response type
- 'state' => 'test', // valid state string (just needs to be passed back to us)
- 'fake' => 'something', // add extra param to querystring
- ));
- $server->handleAuthorizeRequest($request, $response = new Response(), true);
-
- $this->assertEquals($response->getStatusCode(), 302);
- $this->assertNull($response->getParameter('error'));
- $this->assertNull($response->getParameter('error_description'));
-
- $location = $response->getHttpHeader('Location');
- $parts = parse_url($location);
- $this->assertFalse(isset($parts['fake']));
- $this->assertArrayHasKey('fragment', $parts);
- parse_str($parts['fragment'], $params);
-
- $this->assertFalse(isset($params['fake']));
- $this->assertArrayHasKey('state', $params);
- $this->assertEquals($params['state'], 'test');
- }
-
- private function getTestServer($config = array())
- {
- $storage = Bootstrap::getInstance()->getMemoryStorage();
- $server = new Server($storage, $config);
-
- // Add the two types supported for authorization grant
- $server->addGrantType(new AuthorizationCode($storage));
-
- return $server;
- }
-}
diff --git a/library/oauth2/test/OAuth2/GrantType/JwtBearerTest.php b/library/oauth2/test/OAuth2/GrantType/JwtBearerTest.php
deleted file mode 100644
index 0a6c4b827..000000000
--- a/library/oauth2/test/OAuth2/GrantType/JwtBearerTest.php
+++ /dev/null
@@ -1,360 +0,0 @@
-<?php
-
-namespace OAuth2\GrantType;
-
-use OAuth2\Storage\Bootstrap;
-use OAuth2\Server;
-use OAuth2\Request\TestRequest;
-use OAuth2\Response;
-use OAuth2\Encryption\Jwt;
-
-class JwtBearerTest extends \PHPUnit_Framework_TestCase
-{
- private $privateKey;
-
- public function setUp()
- {
- $this->privateKey = <<<EOD
------BEGIN RSA PRIVATE KEY-----
-MIICXAIBAAKBgQC5/SxVlE8gnpFqCxgl2wjhzY7ucEi00s0kUg3xp7lVEvgLgYcA
-nHiWp+gtSjOFfH2zsvpiWm6Lz5f743j/FEzHIO1owR0p4d9pOaJK07d01+RzoQLO
-IQAgXrr4T1CCWUesncwwPBVCyy2Mw3Nmhmr9MrF8UlvdRKBxriRnlP3qJQIDAQAB
-AoGAVgJJVU4fhYMu1e5JfYAcTGfF+Gf+h3iQm4JCpoUcxMXf5VpB9ztk3K7LRN5y
-kwFuFALpnUAarRcUPs0D8FoP4qBluKksbAtgHkO7bMSH9emN+mH4le4qpFlR7+P1
-3fLE2Y19IBwPwEfClC+TpJvuog6xqUYGPlg6XLq/MxQUB4ECQQDgovP1v+ONSeGS
-R+NgJTR47noTkQT3M2izlce/OG7a+O0yw6BOZjNXqH2wx3DshqMcPUFrTjibIClP
-l/tEQ3ShAkEA0/TdBYDtXpNNjqg0R9GVH2pw7Kh68ne6mZTuj0kCgFYpUF6L6iMm
-zXamIJ51rTDsTyKTAZ1JuAhAsK/M2BbDBQJAKQ5fXEkIA+i+64dsDUR/hKLBeRYG
-PFAPENONQGvGBwt7/s02XV3cgGbxIgAxqWkqIp0neb9AJUoJgtyaNe3GQQJANoL4
-QQ0af0NVJAZgg8QEHTNL3aGrFSbzx8IE5Lb7PLRsJa5bP5lQxnDoYuU+EI/Phr62
-niisp/b/ZDGidkTMXQJBALeRsH1I+LmICAvWXpLKa9Gv0zGCwkuIJLiUbV9c6CVh
-suocCAteQwL5iW2gA4AnYr5OGeHFsEl7NCQcwfPZpJ0=
------END RSA PRIVATE KEY-----
-EOD;
- }
-
- public function testMalformedJWT()
- {
- $server = $this->getTestServer();
- $request = TestRequest::createPost(array(
- 'grant_type' => 'urn:ietf:params:oauth:grant-type:jwt-bearer', // valid grant type
- ));
-
- //Get the jwt and break it
- $jwt = $this->getJWT();
- $jwt = substr_replace($jwt, 'broken', 3, 6);
-
- $request->request['assertion'] = $jwt;
-
- $server->grantAccessToken($request, $response = new Response());
-
- $this->assertEquals($response->getStatusCode(), 400);
- $this->assertEquals($response->getParameter('error'), 'invalid_request');
- $this->assertEquals($response->getParameter('error_description'), 'JWT is malformed');
- }
-
- public function testBrokenSignature()
- {
- $server = $this->getTestServer();
- $request = TestRequest::createPost(array(
- 'grant_type' => 'urn:ietf:params:oauth:grant-type:jwt-bearer', // valid grant type
- ));
-
- //Get the jwt and break signature
- $jwt = $this->getJWT() . 'notSupposeToBeHere';
- $request->request['assertion'] = $jwt;
-
- $server->grantAccessToken($request, $response = new Response());
-
- $this->assertEquals($response->getStatusCode(), 400);
- $this->assertEquals($response->getParameter('error'), 'invalid_grant');
- $this->assertEquals($response->getParameter('error_description'), 'JWT failed signature verification');
- }
-
- public function testExpiredJWT()
- {
- $server = $this->getTestServer();
- $request = TestRequest::createPost(array(
- 'grant_type' => 'urn:ietf:params:oauth:grant-type:jwt-bearer', // valid grant type
- ));
-
- //Get an expired JWT
- $jwt = $this->getJWT(1234);
- $request->request['assertion'] = $jwt;
-
- $server->grantAccessToken($request, $response = new Response());
-
- $this->assertEquals($response->getStatusCode(), 400);
- $this->assertEquals($response->getParameter('error'), 'invalid_grant');
- $this->assertEquals($response->getParameter('error_description'), 'JWT has expired');
- }
-
- public function testBadExp()
- {
- $server = $this->getTestServer();
- $request = TestRequest::createPost(array(
- 'grant_type' => 'urn:ietf:params:oauth:grant-type:jwt-bearer', // valid grant type
- ));
-
- //Get an expired JWT
- $jwt = $this->getJWT('badtimestamp');
- $request->request['assertion'] = $jwt;
-
- $server->grantAccessToken($request, $response = new Response());
-
- $this->assertEquals($response->getStatusCode(), 400);
- $this->assertEquals($response->getParameter('error'), 'invalid_grant');
- $this->assertEquals($response->getParameter('error_description'), 'Expiration (exp) time must be a unix time stamp');
- }
-
- public function testNoAssert()
- {
- $server = $this->getTestServer();
- $request = TestRequest::createPost(array(
- 'grant_type' => 'urn:ietf:params:oauth:grant-type:jwt-bearer', // valid grant type
- ));
-
- //Do not pass the assert (JWT)
-
- $server->grantAccessToken($request, $response = new Response());
-
- $this->assertEquals($response->getStatusCode(), 400);
- $this->assertEquals($response->getParameter('error'), 'invalid_request');
- $this->assertEquals($response->getParameter('error_description'), 'Missing parameters: "assertion" required');
- }
-
- public function testNotBefore()
- {
- $server = $this->getTestServer();
- $request = TestRequest::createPost(array(
- 'grant_type' => 'urn:ietf:params:oauth:grant-type:jwt-bearer', // valid grant type
- ));
-
- //Get a future NBF
- $jwt = $this->getJWT(null, time() + 10000);
- $request->request['assertion'] = $jwt;
-
- $server->grantAccessToken($request, $response = new Response());
-
- $this->assertEquals($response->getStatusCode(), 400);
- $this->assertEquals($response->getParameter('error'), 'invalid_grant');
- $this->assertEquals($response->getParameter('error_description'), 'JWT cannot be used before the Not Before (nbf) time');
- }
-
- public function testBadNotBefore()
- {
- $server = $this->getTestServer();
- $request = TestRequest::createPost(array(
- 'grant_type' => 'urn:ietf:params:oauth:grant-type:jwt-bearer', // valid grant type
- ));
-
- //Get a non timestamp nbf
- $jwt = $this->getJWT(null, 'notatimestamp');
- $request->request['assertion'] = $jwt;
-
- $server->grantAccessToken($request, $response = new Response());
-
- $this->assertEquals($response->getStatusCode(), 400);
- $this->assertEquals($response->getParameter('error'), 'invalid_grant');
- $this->assertEquals($response->getParameter('error_description'), 'Not Before (nbf) time must be a unix time stamp');
- }
-
- public function testNonMatchingAudience()
- {
- $server = $this->getTestServer('http://google.com/oauth/o/auth');
- $request = TestRequest::createPost(array(
- 'grant_type' => 'urn:ietf:params:oauth:grant-type:jwt-bearer', // valid grant type
- 'assertion' => $this->getJWT(),
- ));
-
- $server->grantAccessToken($request, $response = new Response());
-
- $this->assertEquals($response->getStatusCode(), 400);
- $this->assertEquals($response->getParameter('error'), 'invalid_grant');
- $this->assertEquals($response->getParameter('error_description'), 'Invalid audience (aud)');
- }
-
- public function testBadClientID()
- {
- $server = $this->getTestServer();
- $request = TestRequest::createPost(array(
- 'grant_type' => 'urn:ietf:params:oauth:grant-type:jwt-bearer', // valid grant type
- 'assertion' => $this->getJWT(null, null, null, 'bad_client_id'),
- ));
-
- $server->grantAccessToken($request, $response = new Response());
-
- $this->assertEquals($response->getStatusCode(), 400);
- $this->assertEquals($response->getParameter('error'), 'invalid_grant');
- $this->assertEquals($response->getParameter('error_description'), 'Invalid issuer (iss) or subject (sub) provided');
- }
-
- public function testBadSubject()
- {
- $server = $this->getTestServer();
- $request = TestRequest::createPost(array(
- 'grant_type' => 'urn:ietf:params:oauth:grant-type:jwt-bearer', // valid grant type
- 'assertion' => $this->getJWT(null, null, 'anotheruser@ourdomain,com'),
- ));
-
- $server->grantAccessToken($request, $response = new Response());
-
- $this->assertEquals($response->getStatusCode(), 400);
- $this->assertEquals($response->getParameter('error'), 'invalid_grant');
- $this->assertEquals($response->getParameter('error_description'), 'Invalid issuer (iss) or subject (sub) provided');
- }
-
- public function testMissingKey()
- {
- $server = $this->getTestServer();
- $request = TestRequest::createPost(array(
- 'grant_type' => 'urn:ietf:params:oauth:grant-type:jwt-bearer', // valid grant type
- 'assertion' => $this->getJWT(null, null, null, 'Missing Key Cli,nt'),
- ));
-
- $server->grantAccessToken($request, $response = new Response());
-
- $this->assertEquals($response->getStatusCode(), 400);
- $this->assertEquals($response->getParameter('error'), 'invalid_grant');
- $this->assertEquals($response->getParameter('error_description'), 'Invalid issuer (iss) or subject (sub) provided');
- }
-
- public function testValidJwt()
- {
- $server = $this->getTestServer();
- $request = TestRequest::createPost(array(
- 'grant_type' => 'urn:ietf:params:oauth:grant-type:jwt-bearer', // valid grant type
- 'assertion' => $this->getJWT(), // valid assertion
- ));
-
- $token = $server->grantAccessToken($request, new Response());
- $this->assertNotNull($token);
- $this->assertArrayHasKey('access_token', $token);
- }
-
- public function testValidJwtWithScope()
- {
- $server = $this->getTestServer();
- $request = TestRequest::createPost(array(
- 'grant_type' => 'urn:ietf:params:oauth:grant-type:jwt-bearer', // valid grant type
- 'assertion' => $this->getJWT(null, null, null, 'Test Client ID'), // valid assertion
- 'scope' => 'scope1', // valid scope
- ));
- $token = $server->grantAccessToken($request, new Response());
-
- $this->assertNotNull($token);
- $this->assertArrayHasKey('access_token', $token);
- $this->assertArrayHasKey('scope', $token);
- $this->assertEquals($token['scope'], 'scope1');
- }
-
- public function testValidJwtInvalidScope()
- {
- $server = $this->getTestServer();
- $request = TestRequest::createPost(array(
- 'grant_type' => 'urn:ietf:params:oauth:grant-type:jwt-bearer', // valid grant type
- 'assertion' => $this->getJWT(null, null, null, 'Test Client ID'), // valid assertion
- 'scope' => 'invalid-scope', // invalid scope
- ));
- $token = $server->grantAccessToken($request, $response = new Response());
-
- $this->assertEquals($response->getStatusCode(), 400);
- $this->assertEquals($response->getParameter('error'), 'invalid_scope');
- $this->assertEquals($response->getParameter('error_description'), 'An unsupported scope was requested');
- }
-
- public function testValidJti()
- {
- $server = $this->getTestServer();
- $request = TestRequest::createPost(array(
- 'grant_type' => 'urn:ietf:params:oauth:grant-type:jwt-bearer', // valid grant type
- 'assertion' => $this->getJWT(null, null, 'testuser@ourdomain.com', 'Test Client ID', 'unused_jti'), // valid assertion with invalid scope
- ));
- $token = $server->grantAccessToken($request, $response = new Response());
-
- $this->assertNotNull($token);
- $this->assertArrayHasKey('access_token', $token);
- }
-
- public function testInvalidJti()
- {
- $server = $this->getTestServer();
- $request = TestRequest::createPost(array(
- 'grant_type' => 'urn:ietf:params:oauth:grant-type:jwt-bearer', // valid grant type
- 'assertion' => $this->getJWT(99999999900, null, 'testuser@ourdomain.com', 'Test Client ID', 'used_jti'), // valid assertion with invalid scope
- ));
- $token = $server->grantAccessToken($request, $response = new Response());
-
- $this->assertEquals($response->getStatusCode(), 400);
- $this->assertEquals($response->getParameter('error'), 'invalid_grant');
- $this->assertEquals($response->getParameter('error_description'), 'JSON Token Identifier (jti) has already been used');
- }
-
- public function testJtiReplayAttack()
- {
- $server = $this->getTestServer();
- $request = TestRequest::createPost(array(
- 'grant_type' => 'urn:ietf:params:oauth:grant-type:jwt-bearer', // valid grant type
- 'assertion' => $this->getJWT(99999999900, null, 'testuser@ourdomain.com', 'Test Client ID', 'totally_new_jti'), // valid assertion with invalid scope
- ));
- $token = $server->grantAccessToken($request, $response = new Response());
-
- $this->assertNotNull($token);
- $this->assertArrayHasKey('access_token', $token);
-
- //Replay the same request
- $token = $server->grantAccessToken($request, $response = new Response());
-
- $this->assertEquals($response->getStatusCode(), 400);
- $this->assertEquals($response->getParameter('error'), 'invalid_grant');
- $this->assertEquals($response->getParameter('error_description'), 'JSON Token Identifier (jti) has already been used');
- }
-
- /**
- * Generates a JWT
- * @param $exp The expiration date. If the current time is greater than the exp, the JWT is invalid.
- * @param $nbf The "not before" time. If the current time is less than the nbf, the JWT is invalid.
- * @param $sub The subject we are acting on behalf of. This could be the email address of the user in the system.
- * @param $iss The issuer, usually the client_id.
- * @return string
- */
- private function getJWT($exp = null, $nbf = null, $sub = null, $iss = 'Test Client ID', $jti = null)
- {
- if (!$exp) {
- $exp = time() + 1000;
- }
-
- if (!$sub) {
- $sub = "testuser@ourdomain.com";
- }
-
- $params = array(
- 'iss' => $iss,
- 'exp' => $exp,
- 'iat' => time(),
- 'sub' => $sub,
- 'aud' => 'http://myapp.com/oauth/auth',
- );
-
- if ($nbf) {
- $params['nbf'] = $nbf;
- }
-
- if ($jti) {
- $params['jti'] = $jti;
- }
-
- $jwtUtil = new Jwt();
-
- return $jwtUtil->encode($params, $this->privateKey, 'RS256');
- }
-
- private function getTestServer($audience = 'http://myapp.com/oauth/auth')
- {
- $storage = Bootstrap::getInstance()->getMemoryStorage();
- $server = new Server($storage);
- $server->addGrantType(new JwtBearer($storage, $audience, new Jwt()));
-
- return $server;
- }
-}
diff --git a/library/oauth2/test/OAuth2/GrantType/RefreshTokenTest.php b/library/oauth2/test/OAuth2/GrantType/RefreshTokenTest.php
deleted file mode 100644
index a458aad8a..000000000
--- a/library/oauth2/test/OAuth2/GrantType/RefreshTokenTest.php
+++ /dev/null
@@ -1,204 +0,0 @@
-<?php
-
-namespace OAuth2\GrantType;
-
-use OAuth2\Storage\Bootstrap;
-use OAuth2\Server;
-use OAuth2\Request\TestRequest;
-use OAuth2\Response;
-
-class RefreshTokenTest extends \PHPUnit_Framework_TestCase
-{
- private $storage;
-
- public function testNoRefreshToken()
- {
- $server = $this->getTestServer();
- $server->addGrantType(new RefreshToken($this->storage));
-
- $request = TestRequest::createPost(array(
- 'grant_type' => 'refresh_token', // valid grant type
- 'client_id' => 'Test Client ID', // valid client id
- 'client_secret' => 'TestSecret', // valid client secret
- ));
- $server->grantAccessToken($request, $response = new Response());
-
- $this->assertEquals($response->getStatusCode(), 400);
- $this->assertEquals($response->getParameter('error'), 'invalid_request');
- $this->assertEquals($response->getParameter('error_description'), 'Missing parameter: "refresh_token" is required');
- }
-
- public function testInvalidRefreshToken()
- {
- $server = $this->getTestServer();
- $server->addGrantType(new RefreshToken($this->storage));
-
- $request = TestRequest::createPost(array(
- 'grant_type' => 'refresh_token', // valid grant type
- 'client_id' => 'Test Client ID', // valid client id
- 'client_secret' => 'TestSecret', // valid client secret
- 'refresh_token' => 'fake-token', // invalid refresh token
- ));
- $server->grantAccessToken($request, $response = new Response());
-
- $this->assertEquals($response->getStatusCode(), 400);
- $this->assertEquals($response->getParameter('error'), 'invalid_grant');
- $this->assertEquals($response->getParameter('error_description'), 'Invalid refresh token');
- }
-
- public function testValidRefreshTokenWithNewRefreshTokenInResponse()
- {
- $server = $this->getTestServer();
- $server->addGrantType(new RefreshToken($this->storage, array('always_issue_new_refresh_token' => true)));
-
- $request = TestRequest::createPost(array(
- 'grant_type' => 'refresh_token', // valid grant type
- 'client_id' => 'Test Client ID', // valid client id
- 'client_secret' => 'TestSecret', // valid client secret
- 'refresh_token' => 'test-refreshtoken', // valid refresh token
- ));
- $token = $server->grantAccessToken($request, new Response());
- $this->assertTrue(isset($token['refresh_token']), 'refresh token should always refresh');
-
- $refresh_token = $this->storage->getRefreshToken($token['refresh_token']);
- $this->assertNotNull($refresh_token);
- $this->assertEquals($refresh_token['refresh_token'], $token['refresh_token']);
- $this->assertEquals($refresh_token['client_id'], $request->request('client_id'));
- $this->assertTrue($token['refresh_token'] != 'test-refreshtoken', 'the refresh token returned is not the one used');
- $used_token = $this->storage->getRefreshToken('test-refreshtoken');
- $this->assertFalse($used_token, 'the refresh token used is no longer valid');
- }
-
- public function testValidRefreshTokenDoesNotUnsetToken()
- {
- $server = $this->getTestServer();
- $server->addGrantType(new RefreshToken($this->storage, array(
- 'always_issue_new_refresh_token' => true,
- 'unset_refresh_token_after_use' => false,
- )));
-
- $request = TestRequest::createPost(array(
- 'grant_type' => 'refresh_token', // valid grant type
- 'client_id' => 'Test Client ID', // valid client id
- 'client_secret' => 'TestSecret', // valid client secret
- 'refresh_token' => 'test-refreshtoken', // valid refresh token
- ));
- $token = $server->grantAccessToken($request, new Response());
- $this->assertTrue(isset($token['refresh_token']), 'refresh token should always refresh');
-
- $used_token = $this->storage->getRefreshToken('test-refreshtoken');
- $this->assertNotNull($used_token, 'the refresh token used is still valid');
- }
-
- public function testValidRefreshTokenWithNoRefreshTokenInResponse()
- {
- $server = $this->getTestServer();
- $server->addGrantType(new RefreshToken($this->storage, array('always_issue_new_refresh_token' => false)));
-
- $request = TestRequest::createPost(array(
- 'grant_type' => 'refresh_token', // valid grant type
- 'client_id' => 'Test Client ID', // valid client id
- 'client_secret' => 'TestSecret', // valid client secret
- 'refresh_token' => 'test-refreshtoken', // valid refresh token
- ));
- $token = $server->grantAccessToken($request, new Response());
- $this->assertFalse(isset($token['refresh_token']), 'refresh token should not be returned');
-
- $used_token = $this->storage->getRefreshToken('test-refreshtoken');
- $this->assertNotNull($used_token, 'the refresh token used is still valid');
- }
-
- public function testValidRefreshTokenSameScope()
- {
- $server = $this->getTestServer();
- $request = TestRequest::createPost(array(
- 'grant_type' => 'refresh_token', // valid grant type
- 'client_id' => 'Test Client ID', // valid client id
- 'client_secret' => 'TestSecret', // valid client secret
- 'refresh_token' => 'test-refreshtoken-with-scope', // valid refresh token (with scope)
- 'scope' => 'scope2 scope1',
- ));
- $token = $server->grantAccessToken($request, new Response());
-
- $this->assertNotNull($token);
- $this->assertArrayHasKey('access_token', $token);
- $this->assertArrayHasKey('scope', $token);
- $this->assertEquals($token['scope'], 'scope2 scope1');
- }
-
- public function testValidRefreshTokenLessScope()
- {
- $server = $this->getTestServer();
- $request = TestRequest::createPost(array(
- 'grant_type' => 'refresh_token', // valid grant type
- 'client_id' => 'Test Client ID', // valid client id
- 'client_secret' => 'TestSecret', // valid client secret
- 'refresh_token' => 'test-refreshtoken-with-scope', // valid refresh token (with scope)
- 'scope' => 'scope1',
- ));
- $token = $server->grantAccessToken($request, new Response());
-
- $this->assertNotNull($token);
- $this->assertArrayHasKey('access_token', $token);
- $this->assertArrayHasKey('scope', $token);
- $this->assertEquals($token['scope'], 'scope1');
- }
-
- public function testValidRefreshTokenDifferentScope()
- {
- $server = $this->getTestServer();
- $request = TestRequest::createPost(array(
- 'grant_type' => 'refresh_token', // valid grant type
- 'client_id' => 'Test Client ID', // valid client id
- 'client_secret' => 'TestSecret', // valid client secret
- 'refresh_token' => 'test-refreshtoken-with-scope', // valid refresh token (with scope)
- 'scope' => 'scope3',
- ));
- $token = $server->grantAccessToken($request, $response = new Response());
-
- $this->assertEquals($response->getStatusCode(), 400);
- $this->assertEquals($response->getParameter('error'), 'invalid_scope');
- $this->assertEquals($response->getParameter('error_description'), 'The scope requested is invalid for this request');
- }
-
- public function testValidRefreshTokenInvalidScope()
- {
- $server = $this->getTestServer();
- $request = TestRequest::createPost(array(
- 'grant_type' => 'refresh_token', // valid grant type
- 'client_id' => 'Test Client ID', // valid client id
- 'client_secret' => 'TestSecret', // valid client secret
- 'refresh_token' => 'test-refreshtoken-with-scope', // valid refresh token (with scope)
- 'scope' => 'invalid-scope',
- ));
- $token = $server->grantAccessToken($request, $response = new Response());
-
- $this->assertEquals($response->getStatusCode(), 400);
- $this->assertEquals($response->getParameter('error'), 'invalid_scope');
- $this->assertEquals($response->getParameter('error_description'), 'The scope requested is invalid for this request');
- }
-
- public function testValidClientDifferentRefreshToken()
- {
- $server = $this->getTestServer();
- $request = TestRequest::createPost(array(
- 'grant_type' => 'refresh_token', // valid grant type
- 'client_id' => 'Test Some Other Client', // valid client id
- 'client_secret' => 'TestSecret3', // valid client secret
- 'refresh_token' => 'test-refreshtoken', // valid refresh token
- ));
- $token = $server->grantAccessToken($request, $response = new Response());
-
- $this->assertEquals($response->getStatusCode(), 400);
- $this->assertEquals($response->getParameter('error'), 'invalid_grant');
- $this->assertEquals($response->getParameter('error_description'), 'refresh_token doesn\'t exist or is invalid for the client');
- }
-
- private function getTestServer()
- {
- $this->storage = Bootstrap::getInstance()->getMemoryStorage();
- $server = new Server($this->storage);
-
- return $server;
- }
-}
diff --git a/library/oauth2/test/OAuth2/GrantType/UserCredentialsTest.php b/library/oauth2/test/OAuth2/GrantType/UserCredentialsTest.php
deleted file mode 100644
index 18943d055..000000000
--- a/library/oauth2/test/OAuth2/GrantType/UserCredentialsTest.php
+++ /dev/null
@@ -1,172 +0,0 @@
-<?php
-
-namespace OAuth2\GrantType;
-
-use OAuth2\Storage\Bootstrap;
-use OAuth2\Server;
-use OAuth2\Request\TestRequest;
-use OAuth2\Response;
-
-class UserCredentialsTest extends \PHPUnit_Framework_TestCase
-{
- public function testNoUsername()
- {
- $server = $this->getTestServer();
- $request = TestRequest::createPost(array(
- 'grant_type' => 'password', // valid grant type
- 'client_id' => 'Test Client ID', // valid client id
- 'client_secret' => 'TestSecret', // valid client secret
- 'password' => 'testpass', // valid password
- ));
- $server->grantAccessToken($request, $response = new Response());
-
- $this->assertEquals($response->getStatusCode(), 400);
- $this->assertEquals($response->getParameter('error'), 'invalid_request');
- $this->assertEquals($response->getParameter('error_description'), 'Missing parameters: "username" and "password" required');
- }
-
- public function testNoPassword()
- {
- $server = $this->getTestServer();
- $request = TestRequest::createPost(array(
- 'grant_type' => 'password', // valid grant type
- 'client_id' => 'Test Client ID', // valid client id
- 'client_secret' => 'TestSecret', // valid client secret
- 'username' => 'test-username', // valid username
- ));
- $server->grantAccessToken($request, $response = new Response());
-
- $this->assertEquals($response->getStatusCode(), 400);
- $this->assertEquals($response->getParameter('error'), 'invalid_request');
- $this->assertEquals($response->getParameter('error_description'), 'Missing parameters: "username" and "password" required');
- }
-
- public function testInvalidUsername()
- {
- $server = $this->getTestServer();
- $request = TestRequest::createPost(array(
- 'grant_type' => 'password', // valid grant type
- 'client_id' => 'Test Client ID', // valid client id
- 'client_secret' => 'TestSecret', // valid client secret
- 'username' => 'fake-username', // valid username
- 'password' => 'testpass', // valid password
- ));
- $token = $server->grantAccessToken($request, $response = new Response());
-
- $this->assertEquals($response->getStatusCode(), 401);
- $this->assertEquals($response->getParameter('error'), 'invalid_grant');
- $this->assertEquals($response->getParameter('error_description'), 'Invalid username and password combination');
- }
-
- public function testInvalidPassword()
- {
- $server = $this->getTestServer();
- $request = TestRequest::createPost(array(
- 'grant_type' => 'password', // valid grant type
- 'client_id' => 'Test Client ID', // valid client id
- 'client_secret' => 'TestSecret', // valid client secret
- 'username' => 'test-username', // valid username
- 'password' => 'fakepass', // invalid password
- ));
- $token = $server->grantAccessToken($request, $response = new Response());
-
- $this->assertEquals($response->getStatusCode(), 401);
- $this->assertEquals($response->getParameter('error'), 'invalid_grant');
- $this->assertEquals($response->getParameter('error_description'), 'Invalid username and password combination');
- }
-
- public function testValidCredentials()
- {
- $server = $this->getTestServer();
- $request = TestRequest::createPost(array(
- 'grant_type' => 'password', // valid grant type
- 'client_id' => 'Test Client ID', // valid client id
- 'client_secret' => 'TestSecret', // valid client secret
- 'username' => 'test-username', // valid username
- 'password' => 'testpass', // valid password
- ));
- $token = $server->grantAccessToken($request, new Response());
-
- $this->assertNotNull($token);
- $this->assertArrayHasKey('access_token', $token);
- }
-
- public function testValidCredentialsWithScope()
- {
- $server = $this->getTestServer();
- $request = TestRequest::createPost(array(
- 'grant_type' => 'password', // valid grant type
- 'client_id' => 'Test Client ID', // valid client id
- 'client_secret' => 'TestSecret', // valid client secret
- 'username' => 'test-username', // valid username
- 'password' => 'testpass', // valid password
- 'scope' => 'scope1', // valid scope
- ));
- $token = $server->grantAccessToken($request, new Response());
-
- $this->assertNotNull($token);
- $this->assertArrayHasKey('access_token', $token);
- $this->assertArrayHasKey('scope', $token);
- $this->assertEquals($token['scope'], 'scope1');
- }
-
- public function testValidCredentialsInvalidScope()
- {
- $server = $this->getTestServer();
- $request = TestRequest::createPost(array(
- 'grant_type' => 'password', // valid grant type
- 'client_id' => 'Test Client ID', // valid client id
- 'client_secret' => 'TestSecret', // valid client secret
- 'username' => 'test-username', // valid username
- 'password' => 'testpass', // valid password
- 'scope' => 'invalid-scope',
- ));
- $token = $server->grantAccessToken($request, $response = new Response());
-
- $this->assertEquals($response->getStatusCode(), 400);
- $this->assertEquals($response->getParameter('error'), 'invalid_scope');
- $this->assertEquals($response->getParameter('error_description'), 'An unsupported scope was requested');
- }
-
- public function testNoSecretWithPublicClient()
- {
- $server = $this->getTestServer();
- $request = TestRequest::createPost(array(
- 'grant_type' => 'password', // valid grant type
- 'client_id' => 'Test Client ID Empty Secret', // valid public client
- 'username' => 'test-username', // valid username
- 'password' => 'testpass', // valid password
- ));
-
- $token = $server->grantAccessToken($request, $response = new Response());
-
- $this->assertNotNull($token);
- $this->assertArrayHasKey('access_token', $token);
- }
-
- public function testNoSecretWithConfidentialClient()
- {
- $server = $this->getTestServer();
- $request = TestRequest::createPost(array(
- 'grant_type' => 'password', // valid grant type
- 'client_id' => 'Test Client ID', // valid public client
- 'username' => 'test-username', // valid username
- 'password' => 'testpass', // valid password
- ));
-
- $token = $server->grantAccessToken($request, $response = new Response());
-
- $this->assertEquals($response->getStatusCode(), 400);
- $this->assertEquals($response->getParameter('error'), 'invalid_client');
- $this->assertEquals($response->getParameter('error_description'), 'This client is invalid or must authenticate using a client secret');
- }
-
- private function getTestServer()
- {
- $storage = Bootstrap::getInstance()->getMemoryStorage();
- $server = new Server($storage);
- $server->addGrantType(new UserCredentials($storage));
-
- return $server;
- }
-}
diff --git a/library/oauth2/test/OAuth2/OpenID/Controller/AuthorizeControllerTest.php b/library/oauth2/test/OAuth2/OpenID/Controller/AuthorizeControllerTest.php
deleted file mode 100644
index 46de936d8..000000000
--- a/library/oauth2/test/OAuth2/OpenID/Controller/AuthorizeControllerTest.php
+++ /dev/null
@@ -1,182 +0,0 @@
-<?php
-
-namespace OAuth2\OpenID\Controller;
-
-use OAuth2\Storage\Bootstrap;
-use OAuth2\Server;
-use OAuth2\Request;
-use OAuth2\Response;
-
-class AuthorizeControllerTest extends \PHPUnit_Framework_TestCase
-{
- public function testValidateAuthorizeRequest()
- {
- $server = $this->getTestServer();
-
- $response = new Response();
- $request = new Request(array(
- 'client_id' => 'Test Client ID', // valid client id
- 'redirect_uri' => 'http://adobe.com', // valid redirect URI
- 'response_type' => 'id_token',
- 'state' => 'af0ifjsldkj',
- 'nonce' => 'n-0S6_WzA2Mj',
- ));
-
- // Test valid id_token request
- $server->handleAuthorizeRequest($request, $response, true);
-
- $parts = parse_url($response->getHttpHeader('Location'));
- parse_str($parts['fragment'], $query);
-
- $this->assertEquals('n-0S6_WzA2Mj', $server->getAuthorizeController()->getNonce());
- $this->assertEquals($query['state'], 'af0ifjsldkj');
-
- $this->assertArrayHasKey('id_token', $query);
- $this->assertArrayHasKey('state', $query);
- $this->assertArrayNotHasKey('access_token', $query);
- $this->assertArrayNotHasKey('expires_in', $query);
- $this->assertArrayNotHasKey('token_type', $query);
-
- // Test valid token id_token request
- $request->query['response_type'] = 'id_token token';
- $server->handleAuthorizeRequest($request, $response, true);
-
- $parts = parse_url($response->getHttpHeader('Location'));
- parse_str($parts['fragment'], $query);
-
- $this->assertEquals('n-0S6_WzA2Mj', $server->getAuthorizeController()->getNonce());
- $this->assertEquals($query['state'], 'af0ifjsldkj');
-
- $this->assertArrayHasKey('access_token', $query);
- $this->assertArrayHasKey('expires_in', $query);
- $this->assertArrayHasKey('token_type', $query);
- $this->assertArrayHasKey('state', $query);
- $this->assertArrayHasKey('id_token', $query);
-
- // assert that with multiple-valued response types, order does not matter
- $request->query['response_type'] = 'token id_token';
- $server->handleAuthorizeRequest($request, $response, true);
-
- $parts = parse_url($response->getHttpHeader('Location'));
- parse_str($parts['fragment'], $query);
-
- $this->assertEquals('n-0S6_WzA2Mj', $server->getAuthorizeController()->getNonce());
- $this->assertEquals($query['state'], 'af0ifjsldkj');
-
- $this->assertArrayHasKey('access_token', $query);
- $this->assertArrayHasKey('expires_in', $query);
- $this->assertArrayHasKey('token_type', $query);
- $this->assertArrayHasKey('state', $query);
- $this->assertArrayHasKey('id_token', $query);
-
- // assert that with multiple-valued response types with extra spaces do not matter
- $request->query['response_type'] = ' token id_token ';
- $server->handleAuthorizeRequest($request, $response, true);
-
- $parts = parse_url($response->getHttpHeader('Location'));
- parse_str($parts['fragment'], $query);
-
- $this->assertEquals('n-0S6_WzA2Mj', $server->getAuthorizeController()->getNonce());
- $this->assertEquals($query['state'], 'af0ifjsldkj');
-
- $this->assertArrayHasKey('access_token', $query);
- $this->assertArrayHasKey('expires_in', $query);
- $this->assertArrayHasKey('token_type', $query);
- $this->assertArrayHasKey('state', $query);
- $this->assertArrayHasKey('id_token', $query);
- }
-
- public function testMissingNonce()
- {
- $server = $this->getTestServer();
- $authorize = $server->getAuthorizeController();
-
- $response = new Response();
- $request = new Request(array(
- 'client_id' => 'Test Client ID', // valid client id
- 'redirect_uri' => 'http://adobe.com', // valid redirect URI
- 'response_type' => 'id_token',
- 'state' => 'xyz',
- ));
-
- // Test missing nonce for 'id_token' response type
- $server->handleAuthorizeRequest($request, $response, true);
- $params = $response->getParameters();
-
- $this->assertEquals($params['error'], 'invalid_nonce');
- $this->assertEquals($params['error_description'], 'This application requires you specify a nonce parameter');
-
- // Test missing nonce for 'id_token token' response type
- $request->query['response_type'] = 'id_token token';
- $server->handleAuthorizeRequest($request, $response, true);
- $params = $response->getParameters();
-
- $this->assertEquals($params['error'], 'invalid_nonce');
- $this->assertEquals($params['error_description'], 'This application requires you specify a nonce parameter');
- }
-
- public function testNotGrantedApplication()
- {
- $server = $this->getTestServer();
-
- $response = new Response();
- $request = new Request(array(
- 'client_id' => 'Test Client ID', // valid client id
- 'redirect_uri' => 'http://adobe.com', // valid redirect URI
- 'response_type' => 'id_token',
- 'state' => 'af0ifjsldkj',
- 'nonce' => 'n-0S6_WzA2Mj',
- ));
-
- // Test not approved application
- $server->handleAuthorizeRequest($request, $response, false);
-
- $params = $response->getParameters();
-
- $this->assertEquals($params['error'], 'consent_required');
- $this->assertEquals($params['error_description'], 'The user denied access to your application');
-
- // Test not approved application with prompt parameter
- $request->query['prompt'] = 'none';
- $server->handleAuthorizeRequest($request, $response, false);
-
- $params = $response->getParameters();
-
- $this->assertEquals($params['error'], 'login_required');
- $this->assertEquals($params['error_description'], 'The user must log in');
-
- // Test not approved application with user_id set
- $request->query['prompt'] = 'none';
- $server->handleAuthorizeRequest($request, $response, false, 'some-user-id');
-
- $params = $response->getParameters();
-
- $this->assertEquals($params['error'], 'interaction_required');
- $this->assertEquals($params['error_description'], 'The user must grant access to your application');
- }
-
- public function testNeedsIdToken()
- {
- $server = $this->getTestServer();
- $authorize = $server->getAuthorizeController();
-
- $this->assertTrue($authorize->needsIdToken('openid'));
- $this->assertTrue($authorize->needsIdToken('openid profile'));
- $this->assertFalse($authorize->needsIdToken(''));
- $this->assertFalse($authorize->needsIdToken('some-scope'));
- }
-
- private function getTestServer($config = array())
- {
- $config += array(
- 'use_openid_connect' => true,
- 'issuer' => 'phpunit',
- 'allow_implicit' => true
- );
-
- $storage = Bootstrap::getInstance()->getMemoryStorage();
- $server = new Server($storage, $config);
-
- return $server;
- }
-}
diff --git a/library/oauth2/test/OAuth2/OpenID/Controller/UserInfoControllerTest.php b/library/oauth2/test/OAuth2/OpenID/Controller/UserInfoControllerTest.php
deleted file mode 100644
index b1b687077..000000000
--- a/library/oauth2/test/OAuth2/OpenID/Controller/UserInfoControllerTest.php
+++ /dev/null
@@ -1,44 +0,0 @@
-<?php
-
-namespace OAuth2\OpenID\Controller;
-
-use OAuth2\Storage\Bootstrap;
-use OAuth2\Server;
-use OAuth2\Request;
-use OAuth2\Response;
-
-class UserInfoControllerTest extends \PHPUnit_Framework_TestCase
-{
- public function testCreateController()
- {
- $tokenType = new \OAuth2\TokenType\Bearer();
- $storage = new \OAuth2\Storage\Memory();
- $controller = new UserInfoController($tokenType, $storage, $storage);
-
- $response = new Response();
- $controller->handleUserInfoRequest(new Request(), $response);
- $this->assertEquals(401, $response->getStatusCode());
- }
-
- public function testValidToken()
- {
- $server = $this->getTestServer();
- $request = Request::createFromGlobals();
- $request->headers['AUTHORIZATION'] = 'Bearer accesstoken-openid-connect';
- $response = new Response();
-
- $server->handleUserInfoRequest($request, $response);
- $parameters = $response->getParameters();
- $this->assertEquals($parameters['sub'], 'testuser');
- $this->assertEquals($parameters['email'], 'testuser@test.com');
- $this->assertEquals($parameters['email_verified'], true);
- }
-
- private function getTestServer($config = array())
- {
- $storage = Bootstrap::getInstance()->getMemoryStorage();
- $server = new Server($storage, $config);
-
- return $server;
- }
-}
diff --git a/library/oauth2/test/OAuth2/OpenID/GrantType/AuthorizationCodeTest.php b/library/oauth2/test/OAuth2/OpenID/GrantType/AuthorizationCodeTest.php
deleted file mode 100644
index 776002d1e..000000000
--- a/library/oauth2/test/OAuth2/OpenID/GrantType/AuthorizationCodeTest.php
+++ /dev/null
@@ -1,57 +0,0 @@
-<?php
-
-namespace OAuth2\OpenID\GrantType;
-
-use OAuth2\Storage\Bootstrap;
-use OAuth2\Server;
-use OAuth2\Request\TestRequest;
-use OAuth2\Response;
-
-class AuthorizationCodeTest extends \PHPUnit_Framework_TestCase
-{
- public function testValidCode()
- {
- $server = $this->getTestServer();
- $request = TestRequest::createPost(array(
- 'grant_type' => 'authorization_code', // valid grant type
- 'client_id' => 'Test Client ID', // valid client id
- 'client_secret' => 'TestSecret', // valid client secret
- 'code' => 'testcode-openid', // valid code
- ));
- $token = $server->grantAccessToken($request, new Response());
-
- $this->assertNotNull($token);
- $this->assertArrayHasKey('id_token', $token);
- $this->assertEquals('test_id_token', $token['id_token']);
-
- // this is only true if "offline_access" was requested
- $this->assertFalse(isset($token['refresh_token']));
- }
-
- public function testOfflineAccess()
- {
- $server = $this->getTestServer();
- $request = TestRequest::createPost(array(
- 'grant_type' => 'authorization_code', // valid grant type
- 'client_id' => 'Test Client ID', // valid client id
- 'client_secret' => 'TestSecret', // valid client secret
- 'code' => 'testcode-openid', // valid code
- 'scope' => 'offline_access', // valid code
- ));
- $token = $server->grantAccessToken($request, new Response());
-
- $this->assertNotNull($token);
- $this->assertArrayHasKey('id_token', $token);
- $this->assertEquals('test_id_token', $token['id_token']);
- $this->assertTrue(isset($token['refresh_token']));
- }
-
- private function getTestServer()
- {
- $storage = Bootstrap::getInstance()->getMemoryStorage();
- $server = new Server($storage, array('use_openid_connect' => true));
- $server->addGrantType(new AuthorizationCode($storage));
-
- return $server;
- }
-}
diff --git a/library/oauth2/test/OAuth2/OpenID/ResponseType/CodeIdTokenTest.php b/library/oauth2/test/OAuth2/OpenID/ResponseType/CodeIdTokenTest.php
deleted file mode 100644
index b0311434a..000000000
--- a/library/oauth2/test/OAuth2/OpenID/ResponseType/CodeIdTokenTest.php
+++ /dev/null
@@ -1,182 +0,0 @@
-<?php
-
-namespace OAuth2\OpenID\ResponseType;
-
-use OAuth2\Server;
-use OAuth2\Request;
-use OAuth2\Response;
-use OAuth2\Storage\Bootstrap;
-use OAuth2\GrantType\ClientCredentials;
-
-class CodeIdTokenTest extends \PHPUnit_Framework_TestCase
-{
- public function testHandleAuthorizeRequest()
- {
- // add the test parameters in memory
- $server = $this->getTestServer();
-
- $request = new Request(array(
- 'response_type' => 'code id_token',
- 'redirect_uri' => 'http://adobe.com',
- 'client_id' => 'Test Client ID',
- 'scope' => 'openid',
- 'state' => 'test',
- 'nonce' => 'test',
- ));
-
- $server->handleAuthorizeRequest($request, $response = new Response(), true);
-
- $this->assertEquals($response->getStatusCode(), 302);
- $location = $response->getHttpHeader('Location');
- $this->assertNotContains('error', $location);
-
- $parts = parse_url($location);
- $this->assertArrayHasKey('query', $parts);
-
- // assert fragment is in "application/x-www-form-urlencoded" format
- parse_str($parts['query'], $params);
- $this->assertNotNull($params);
- $this->assertArrayHasKey('id_token', $params);
- $this->assertArrayHasKey('code', $params);
-
- // validate ID Token
- $parts = explode('.', $params['id_token']);
- foreach ($parts as &$part) {
- // Each part is a base64url encoded json string.
- $part = str_replace(array('-', '_'), array('+', '/'), $part);
- $part = base64_decode($part);
- $part = json_decode($part, true);
- }
- list($header, $claims, $signature) = $parts;
-
- $this->assertArrayHasKey('iss', $claims);
- $this->assertArrayHasKey('sub', $claims);
- $this->assertArrayHasKey('aud', $claims);
- $this->assertArrayHasKey('iat', $claims);
- $this->assertArrayHasKey('exp', $claims);
- $this->assertArrayHasKey('auth_time', $claims);
- $this->assertArrayHasKey('nonce', $claims);
-
- // only exists if an access token was granted along with the id_token
- $this->assertArrayNotHasKey('at_hash', $claims);
-
- $this->assertEquals($claims['iss'], 'test');
- $this->assertEquals($claims['aud'], 'Test Client ID');
- $this->assertEquals($claims['nonce'], 'test');
- $duration = $claims['exp'] - $claims['iat'];
- $this->assertEquals($duration, 3600);
- }
-
- public function testUserClaimsWithUserId()
- {
- // add the test parameters in memory
- $server = $this->getTestServer();
-
- $request = new Request(array(
- 'response_type' => 'code id_token',
- 'redirect_uri' => 'http://adobe.com',
- 'client_id' => 'Test Client ID',
- 'scope' => 'openid email',
- 'state' => 'test',
- 'nonce' => 'test',
- ));
-
- $userId = 'testuser';
- $server->handleAuthorizeRequest($request, $response = new Response(), true, $userId);
-
- $this->assertEquals($response->getStatusCode(), 302);
- $location = $response->getHttpHeader('Location');
- $this->assertNotContains('error', $location);
-
- $parts = parse_url($location);
- $this->assertArrayHasKey('query', $parts);
-
- // assert fragment is in "application/x-www-form-urlencoded" format
- parse_str($parts['query'], $params);
- $this->assertNotNull($params);
- $this->assertArrayHasKey('id_token', $params);
- $this->assertArrayHasKey('code', $params);
-
- // validate ID Token
- $parts = explode('.', $params['id_token']);
- foreach ($parts as &$part) {
- // Each part is a base64url encoded json string.
- $part = str_replace(array('-', '_'), array('+', '/'), $part);
- $part = base64_decode($part);
- $part = json_decode($part, true);
- }
- list($header, $claims, $signature) = $parts;
-
- $this->assertArrayHasKey('email', $claims);
- $this->assertArrayHasKey('email_verified', $claims);
- $this->assertNotNull($claims['email']);
- $this->assertNotNull($claims['email_verified']);
- }
-
- public function testUserClaimsWithoutUserId()
- {
- // add the test parameters in memory
- $server = $this->getTestServer();
-
- $request = new Request(array(
- 'response_type' => 'code id_token',
- 'redirect_uri' => 'http://adobe.com',
- 'client_id' => 'Test Client ID',
- 'scope' => 'openid email',
- 'state' => 'test',
- 'nonce' => 'test',
- ));
-
- $userId = null;
- $server->handleAuthorizeRequest($request, $response = new Response(), true, $userId);
-
- $this->assertEquals($response->getStatusCode(), 302);
- $location = $response->getHttpHeader('Location');
- $this->assertNotContains('error', $location);
-
- $parts = parse_url($location);
- $this->assertArrayHasKey('query', $parts);
-
- // assert fragment is in "application/x-www-form-urlencoded" format
- parse_str($parts['query'], $params);
- $this->assertNotNull($params);
- $this->assertArrayHasKey('id_token', $params);
- $this->assertArrayHasKey('code', $params);
-
- // validate ID Token
- $parts = explode('.', $params['id_token']);
- foreach ($parts as &$part) {
- // Each part is a base64url encoded json string.
- $part = str_replace(array('-', '_'), array('+', '/'), $part);
- $part = base64_decode($part);
- $part = json_decode($part, true);
- }
- list($header, $claims, $signature) = $parts;
-
- $this->assertArrayNotHasKey('email', $claims);
- $this->assertArrayNotHasKey('email_verified', $claims);
- }
-
- private function getTestServer($config = array())
- {
- $config += array(
- 'use_openid_connect' => true,
- 'issuer' => 'test',
- 'id_lifetime' => 3600,
- 'allow_implicit' => true,
- );
-
- $memoryStorage = Bootstrap::getInstance()->getMemoryStorage();
- $memoryStorage->supportedScopes[] = 'email';
- $responseTypes = array(
- 'code' => $code = new AuthorizationCode($memoryStorage),
- 'id_token' => $idToken = new IdToken($memoryStorage, $memoryStorage, $config),
- 'code id_token' => new CodeIdToken($code, $idToken),
- );
-
- $server = new Server($memoryStorage, $config, array(), $responseTypes);
- $server->addGrantType(new ClientCredentials($memoryStorage));
-
- return $server;
- }
-}
diff --git a/library/oauth2/test/OAuth2/OpenID/ResponseType/IdTokenTest.php b/library/oauth2/test/OAuth2/OpenID/ResponseType/IdTokenTest.php
deleted file mode 100644
index e772f6be4..000000000
--- a/library/oauth2/test/OAuth2/OpenID/ResponseType/IdTokenTest.php
+++ /dev/null
@@ -1,184 +0,0 @@
-<?php
-
-namespace OAuth2\OpenID\ResponseType;
-
-use OAuth2\Server;
-use OAuth2\Request;
-use OAuth2\Response;
-use OAuth2\Storage\Bootstrap;
-use OAuth2\GrantType\ClientCredentials;
-use OAuth2\Encryption\Jwt;
-
-class IdTokenTest extends \PHPUnit_Framework_TestCase
-{
- public function testValidateAuthorizeRequest()
- {
- $query = array(
- 'response_type' => 'id_token',
- 'redirect_uri' => 'http://adobe.com',
- 'client_id' => 'Test Client ID',
- 'scope' => 'openid',
- 'state' => 'test',
- );
-
- // attempt to do the request without a nonce.
- $server = $this->getTestServer(array('allow_implicit' => true));
- $request = new Request($query);
- $valid = $server->validateAuthorizeRequest($request, $response = new Response());
-
- // Add a nonce and retry.
- $query['nonce'] = 'test';
- $request = new Request($query);
- $valid = $server->validateAuthorizeRequest($request, $response = new Response());
- $this->assertTrue($valid);
- }
-
- public function testHandleAuthorizeRequest()
- {
- // add the test parameters in memory
- $server = $this->getTestServer(array('allow_implicit' => true));
- $request = new Request(array(
- 'response_type' => 'id_token',
- 'redirect_uri' => 'http://adobe.com',
- 'client_id' => 'Test Client ID',
- 'scope' => 'openid email',
- 'state' => 'test',
- 'nonce' => 'test',
- ));
-
- $user_id = 'testuser';
- $server->handleAuthorizeRequest($request, $response = new Response(), true, $user_id);
-
- $this->assertEquals($response->getStatusCode(), 302);
- $location = $response->getHttpHeader('Location');
- $this->assertNotContains('error', $location);
-
- $parts = parse_url($location);
- $this->assertArrayHasKey('fragment', $parts);
- $this->assertFalse(isset($parts['query']));
-
- // assert fragment is in "application/x-www-form-urlencoded" format
- parse_str($parts['fragment'], $params);
- $this->assertNotNull($params);
- $this->assertArrayHasKey('id_token', $params);
- $this->assertArrayNotHasKey('access_token', $params);
- $this->validateIdToken($params['id_token']);
- }
-
- public function testPassInAuthTime()
- {
- $server = $this->getTestServer(array('allow_implicit' => true));
- $request = new Request(array(
- 'response_type' => 'id_token',
- 'redirect_uri' => 'http://adobe.com',
- 'client_id' => 'Test Client ID',
- 'scope' => 'openid email',
- 'state' => 'test',
- 'nonce' => 'test',
- ));
-
- // test with a scalar user id
- $user_id = 'testuser123';
- $server->handleAuthorizeRequest($request, $response = new Response(), true, $user_id);
-
- list($header, $payload, $signature) = $this->extractTokenDataFromResponse($response);
-
- $this->assertTrue(is_array($payload));
- $this->assertArrayHasKey('sub', $payload);
- $this->assertEquals($user_id, $payload['sub']);
- $this->assertArrayHasKey('auth_time', $payload);
-
- // test with an array of user info
- $userInfo = array(
- 'user_id' => 'testuser1234',
- 'auth_time' => date('Y-m-d H:i:s', strtotime('20 minutes ago')
- ));
-
- $server->handleAuthorizeRequest($request, $response = new Response(), true, $userInfo);
-
- list($header, $payload, $signature) = $this->extractTokenDataFromResponse($response);
-
- $this->assertTrue(is_array($payload));
- $this->assertArrayHasKey('sub', $payload);
- $this->assertEquals($userInfo['user_id'], $payload['sub']);
- $this->assertArrayHasKey('auth_time', $payload);
- $this->assertEquals($userInfo['auth_time'], $payload['auth_time']);
- }
-
- private function extractTokenDataFromResponse(Response $response)
- {
- $this->assertEquals($response->getStatusCode(), 302);
- $location = $response->getHttpHeader('Location');
- $this->assertNotContains('error', $location);
-
- $parts = parse_url($location);
- $this->assertArrayHasKey('fragment', $parts);
- $this->assertFalse(isset($parts['query']));
-
- parse_str($parts['fragment'], $params);
- $this->assertNotNull($params);
- $this->assertArrayHasKey('id_token', $params);
- $this->assertArrayNotHasKey('access_token', $params);
-
- list($headb64, $payloadb64, $signature) = explode('.', $params['id_token']);
-
- $jwt = new Jwt();
- $header = json_decode($jwt->urlSafeB64Decode($headb64), true);
- $payload = json_decode($jwt->urlSafeB64Decode($payloadb64), true);
-
- return array($header, $payload, $signature);
- }
-
- private function validateIdToken($id_token)
- {
- $parts = explode('.', $id_token);
- foreach ($parts as &$part) {
- // Each part is a base64url encoded json string.
- $part = str_replace(array('-', '_'), array('+', '/'), $part);
- $part = base64_decode($part);
- $part = json_decode($part, true);
- }
- list($header, $claims, $signature) = $parts;
-
- $this->assertArrayHasKey('iss', $claims);
- $this->assertArrayHasKey('sub', $claims);
- $this->assertArrayHasKey('aud', $claims);
- $this->assertArrayHasKey('iat', $claims);
- $this->assertArrayHasKey('exp', $claims);
- $this->assertArrayHasKey('auth_time', $claims);
- $this->assertArrayHasKey('nonce', $claims);
- $this->assertArrayHasKey('email', $claims);
- $this->assertArrayHasKey('email_verified', $claims);
-
- $this->assertEquals($claims['iss'], 'test');
- $this->assertEquals($claims['aud'], 'Test Client ID');
- $this->assertEquals($claims['nonce'], 'test');
- $this->assertEquals($claims['email'], 'testuser@test.com');
- $duration = $claims['exp'] - $claims['iat'];
- $this->assertEquals($duration, 3600);
- }
-
- private function getTestServer($config = array())
- {
- $config += array(
- 'use_openid_connect' => true,
- 'issuer' => 'test',
- 'id_lifetime' => 3600,
- );
-
- $memoryStorage = Bootstrap::getInstance()->getMemoryStorage();
- $memoryStorage->supportedScopes[] = 'email';
- $storage = array(
- 'client' => $memoryStorage,
- 'scope' => $memoryStorage,
- );
- $responseTypes = array(
- 'id_token' => new IdToken($memoryStorage, $memoryStorage, $config),
- );
-
- $server = new Server($storage, $config, array(), $responseTypes);
- $server->addGrantType(new ClientCredentials($memoryStorage));
-
- return $server;
- }
-}
diff --git a/library/oauth2/test/OAuth2/OpenID/ResponseType/IdTokenTokenTest.php b/library/oauth2/test/OAuth2/OpenID/ResponseType/IdTokenTokenTest.php
deleted file mode 100644
index bc564d37b..000000000
--- a/library/oauth2/test/OAuth2/OpenID/ResponseType/IdTokenTokenTest.php
+++ /dev/null
@@ -1,91 +0,0 @@
-<?php
-
-namespace OAuth2\OpenID\ResponseType;
-
-use OAuth2\Server;
-use OAuth2\Request;
-use OAuth2\Response;
-use OAuth2\Storage\Bootstrap;
-use OAuth2\GrantType\ClientCredentials;
-use OAuth2\ResponseType\AccessToken;
-
-class IdTokenTokenTest extends \PHPUnit_Framework_TestCase
-{
-
- public function testHandleAuthorizeRequest()
- {
- // add the test parameters in memory
- $server = $this->getTestServer(array('allow_implicit' => true));
-
- $request = new Request(array(
- 'response_type' => 'id_token token',
- 'redirect_uri' => 'http://adobe.com',
- 'client_id' => 'Test Client ID',
- 'scope' => 'openid',
- 'state' => 'test',
- 'nonce' => 'test',
- ));
-
- $server->handleAuthorizeRequest($request, $response = new Response(), true);
-
- $this->assertEquals($response->getStatusCode(), 302);
- $location = $response->getHttpHeader('Location');
- $this->assertNotContains('error', $location);
-
- $parts = parse_url($location);
- $this->assertArrayHasKey('fragment', $parts);
- $this->assertFalse(isset($parts['query']));
-
- // assert fragment is in "application/x-www-form-urlencoded" format
- parse_str($parts['fragment'], $params);
- $this->assertNotNull($params);
- $this->assertArrayHasKey('id_token', $params);
- $this->assertArrayHasKey('access_token', $params);
-
- // validate ID Token
- $parts = explode('.', $params['id_token']);
- foreach ($parts as &$part) {
- // Each part is a base64url encoded json string.
- $part = str_replace(array('-', '_'), array('+', '/'), $part);
- $part = base64_decode($part);
- $part = json_decode($part, true);
- }
- list($header, $claims, $signature) = $parts;
-
- $this->assertArrayHasKey('iss', $claims);
- $this->assertArrayHasKey('sub', $claims);
- $this->assertArrayHasKey('aud', $claims);
- $this->assertArrayHasKey('iat', $claims);
- $this->assertArrayHasKey('exp', $claims);
- $this->assertArrayHasKey('auth_time', $claims);
- $this->assertArrayHasKey('nonce', $claims);
- $this->assertArrayHasKey('at_hash', $claims);
-
- $this->assertEquals($claims['iss'], 'test');
- $this->assertEquals($claims['aud'], 'Test Client ID');
- $this->assertEquals($claims['nonce'], 'test');
- $duration = $claims['exp'] - $claims['iat'];
- $this->assertEquals($duration, 3600);
- }
-
- private function getTestServer($config = array())
- {
- $config += array(
- 'use_openid_connect' => true,
- 'issuer' => 'test',
- 'id_lifetime' => 3600,
- );
-
- $memoryStorage = Bootstrap::getInstance()->getMemoryStorage();
- $responseTypes = array(
- 'token' => $token = new AccessToken($memoryStorage, $memoryStorage),
- 'id_token' => $idToken = new IdToken($memoryStorage, $memoryStorage, $config),
- 'id_token token' => new IdTokenToken($token, $idToken),
- );
-
- $server = new Server($memoryStorage, $config, array(), $responseTypes);
- $server->addGrantType(new ClientCredentials($memoryStorage));
-
- return $server;
- }
-}
diff --git a/library/oauth2/test/OAuth2/OpenID/Storage/AuthorizationCodeTest.php b/library/oauth2/test/OAuth2/OpenID/Storage/AuthorizationCodeTest.php
deleted file mode 100644
index bdfb085e3..000000000
--- a/library/oauth2/test/OAuth2/OpenID/Storage/AuthorizationCodeTest.php
+++ /dev/null
@@ -1,95 +0,0 @@
-<?php
-
-namespace OAuth2\OpenID\Storage;
-
-use OAuth2\Storage\BaseTest;
-use OAuth2\Storage\NullStorage;
-
-class AuthorizationCodeTest extends BaseTest
-{
- /** @dataProvider provideStorage */
- public function testCreateAuthorizationCode($storage)
- {
- if ($storage instanceof NullStorage) {
- $this->markTestSkipped('Skipped Storage: ' . $storage->getMessage());
-
- return;
- }
-
- if (!$storage instanceof AuthorizationCodeInterface) {
- return;
- }
-
- // assert code we are about to add does not exist
- $code = $storage->getAuthorizationCode('new-openid-code');
- $this->assertFalse($code);
-
- // add new code
- $expires = time() + 20;
- $scope = null;
- $id_token = 'fake_id_token';
- $success = $storage->setAuthorizationCode('new-openid-code', 'client ID', 'SOMEUSERID', 'http://example.com', $expires, $scope, $id_token);
- $this->assertTrue($success);
-
- $code = $storage->getAuthorizationCode('new-openid-code');
- $this->assertNotNull($code);
- $this->assertArrayHasKey('authorization_code', $code);
- $this->assertArrayHasKey('client_id', $code);
- $this->assertArrayHasKey('user_id', $code);
- $this->assertArrayHasKey('redirect_uri', $code);
- $this->assertArrayHasKey('expires', $code);
- $this->assertEquals($code['authorization_code'], 'new-openid-code');
- $this->assertEquals($code['client_id'], 'client ID');
- $this->assertEquals($code['user_id'], 'SOMEUSERID');
- $this->assertEquals($code['redirect_uri'], 'http://example.com');
- $this->assertEquals($code['expires'], $expires);
- $this->assertEquals($code['id_token'], $id_token);
-
- // change existing code
- $expires = time() + 42;
- $new_id_token = 'fake_id_token-2';
- $success = $storage->setAuthorizationCode('new-openid-code', 'client ID2', 'SOMEOTHERID', 'http://example.org', $expires, $scope, $new_id_token);
- $this->assertTrue($success);
-
- $code = $storage->getAuthorizationCode('new-openid-code');
- $this->assertNotNull($code);
- $this->assertArrayHasKey('authorization_code', $code);
- $this->assertArrayHasKey('client_id', $code);
- $this->assertArrayHasKey('user_id', $code);
- $this->assertArrayHasKey('redirect_uri', $code);
- $this->assertArrayHasKey('expires', $code);
- $this->assertEquals($code['authorization_code'], 'new-openid-code');
- $this->assertEquals($code['client_id'], 'client ID2');
- $this->assertEquals($code['user_id'], 'SOMEOTHERID');
- $this->assertEquals($code['redirect_uri'], 'http://example.org');
- $this->assertEquals($code['expires'], $expires);
- $this->assertEquals($code['id_token'], $new_id_token);
- }
-
- /** @dataProvider provideStorage */
- public function testRemoveIdTokenFromAuthorizationCode($storage)
- {
- // add new code
- $expires = time() + 20;
- $scope = null;
- $id_token = 'fake_id_token_to_remove';
- $authcode = 'new-openid-code-'.rand();
- $success = $storage->setAuthorizationCode($authcode, 'client ID', 'SOMEUSERID', 'http://example.com', $expires, $scope, $id_token);
- $this->assertTrue($success);
-
- // verify params were set
- $code = $storage->getAuthorizationCode($authcode);
- $this->assertNotNull($code);
- $this->assertArrayHasKey('id_token', $code);
- $this->assertEquals($code['id_token'], $id_token);
-
- // remove the id_token
- $success = $storage->setAuthorizationCode($authcode, 'client ID', 'SOMEUSERID', 'http://example.com', $expires, $scope, null);
-
- // verify the "id_token" is now null
- $code = $storage->getAuthorizationCode($authcode);
- $this->assertNotNull($code);
- $this->assertArrayHasKey('id_token', $code);
- $this->assertEquals($code['id_token'], null);
- }
-}
diff --git a/library/oauth2/test/OAuth2/OpenID/Storage/UserClaimsTest.php b/library/oauth2/test/OAuth2/OpenID/Storage/UserClaimsTest.php
deleted file mode 100644
index 840f6c566..000000000
--- a/library/oauth2/test/OAuth2/OpenID/Storage/UserClaimsTest.php
+++ /dev/null
@@ -1,41 +0,0 @@
-<?php
-
-namespace OAuth2\OpenID\Storage;
-
-use OAuth2\Storage\BaseTest;
-use OAuth2\Storage\NullStorage;
-
-class UserClaimsTest extends BaseTest
-{
- /** @dataProvider provideStorage */
- public function testGetUserClaims($storage)
- {
- if ($storage instanceof NullStorage) {
- $this->markTestSkipped('Skipped Storage: ' . $storage->getMessage());
-
- return;
- }
-
- if (!$storage instanceof UserClaimsInterface) {
- // incompatible storage
- return;
- }
-
- // invalid user
- $claims = $storage->getUserClaims('fake-user', '');
- $this->assertFalse($claims);
-
- // valid user (no scope)
- $claims = $storage->getUserClaims('testuser', '');
-
- /* assert the decoded token is the same */
- $this->assertFalse(isset($claims['email']));
-
- // valid user
- $claims = $storage->getUserClaims('testuser', 'email');
-
- /* assert the decoded token is the same */
- $this->assertEquals($claims['email'], "testuser@test.com");
- $this->assertEquals($claims['email_verified'], true);
- }
-}
diff --git a/library/oauth2/test/OAuth2/RequestTest.php b/library/oauth2/test/OAuth2/RequestTest.php
deleted file mode 100644
index 10db3215c..000000000
--- a/library/oauth2/test/OAuth2/RequestTest.php
+++ /dev/null
@@ -1,98 +0,0 @@
-<?php
-
-namespace OAuth2;
-
-use OAuth2\Request\TestRequest;
-use OAuth2\Storage\Bootstrap;
-use OAuth2\GrantType\AuthorizationCode;
-
-class RequestTest extends \PHPUnit_Framework_TestCase
-{
- public function testRequestOverride()
- {
- $request = new TestRequest();
- $server = $this->getTestServer();
-
- // Smoke test for override request class
- // $server->handleTokenRequest($request, $response = new Response());
- // $this->assertInstanceOf('Response', $response);
- // $server->handleAuthorizeRequest($request, $response = new Response(), true);
- // $this->assertInstanceOf('Response', $response);
- // $response = $server->verifyResourceRequest($request, $response = new Response());
- // $this->assertTrue(is_bool($response));
-
- /*** make some valid requests ***/
-
- // Valid Token Request
- $request->setPost(array(
- 'grant_type' => 'authorization_code',
- 'client_id' => 'Test Client ID',
- 'client_secret' => 'TestSecret',
- 'code' => 'testcode',
- ));
- $server->handleTokenRequest($request, $response = new Response());
- $this->assertEquals($response->getStatusCode(), 200);
- $this->assertNull($response->getParameter('error'));
- $this->assertNotNUll($response->getParameter('access_token'));
- }
-
- public function testHeadersReturnsValueByKey()
- {
- $request = new Request(
- array(),
- array(),
- array(),
- array(),
- array(),
- array(),
- array(),
- array('AUTHORIZATION' => 'Basic secret')
- );
-
- $this->assertEquals('Basic secret', $request->headers('AUTHORIZATION'));
- }
-
- public function testHeadersReturnsDefaultIfHeaderNotPresent()
- {
- $request = new Request();
-
- $this->assertEquals('Bearer', $request->headers('AUTHORIZATION', 'Bearer'));
- }
-
- public function testHeadersIsCaseInsensitive()
- {
- $request = new Request(
- array(),
- array(),
- array(),
- array(),
- array(),
- array(),
- array(),
- array('AUTHORIZATION' => 'Basic secret')
- );
-
- $this->assertEquals('Basic secret', $request->headers('Authorization'));
- }
-
- public function testRequestReturnsPostParamIfNoQueryParamAvailable()
- {
- $request = new Request(
- array(),
- array('client_id' => 'correct')
- );
-
- $this->assertEquals('correct', $request->query('client_id', $request->request('client_id')));
- }
-
- private function getTestServer($config = array())
- {
- $storage = Bootstrap::getInstance()->getMemoryStorage();
- $server = new Server($storage, $config);
-
- // Add the two types supported for authorization grant
- $server->addGrantType(new AuthorizationCode($storage));
-
- return $server;
- }
-}
diff --git a/library/oauth2/test/OAuth2/ResponseTest.php b/library/oauth2/test/OAuth2/ResponseTest.php
deleted file mode 100644
index b8149005d..000000000
--- a/library/oauth2/test/OAuth2/ResponseTest.php
+++ /dev/null
@@ -1,17 +0,0 @@
-<?php
-
-namespace OAuth2;
-
-class ResponseTest extends \PHPUnit_Framework_TestCase
-{
- public function testRenderAsXml()
- {
- $response = new Response(array(
- 'foo' => 'bar',
- 'halland' => 'oates',
- ));
-
- $string = $response->getResponseBody('xml');
- $this->assertContains('<response><foo>bar</foo><halland>oates</halland></response>', $string);
- }
-}
diff --git a/library/oauth2/test/OAuth2/ResponseType/AccessTokenTest.php b/library/oauth2/test/OAuth2/ResponseType/AccessTokenTest.php
deleted file mode 100644
index 0ed1c82fc..000000000
--- a/library/oauth2/test/OAuth2/ResponseType/AccessTokenTest.php
+++ /dev/null
@@ -1,107 +0,0 @@
-<?php
-
-namespace OAuth2\ResponseType;
-
-use OAuth2\Server;
-use OAuth2\Storage\Memory;
-
-class AccessTokenTest extends \PHPUnit_Framework_TestCase
-{
- public function testRevokeAccessTokenWithTypeHint()
- {
- $tokenStorage = new Memory(array(
- 'access_tokens' => array(
- 'revoke' => array('mytoken'),
- ),
- ));
-
- $this->assertEquals(array('mytoken'), $tokenStorage->getAccessToken('revoke'));
- $accessToken = new AccessToken($tokenStorage);
- $accessToken->revokeToken('revoke', 'access_token');
- $this->assertFalse($tokenStorage->getAccessToken('revoke'));
- }
-
- public function testRevokeAccessTokenWithoutTypeHint()
- {
- $tokenStorage = new Memory(array(
- 'access_tokens' => array(
- 'revoke' => array('mytoken'),
- ),
- ));
-
- $this->assertEquals(array('mytoken'), $tokenStorage->getAccessToken('revoke'));
- $accessToken = new AccessToken($tokenStorage);
- $accessToken->revokeToken('revoke');
- $this->assertFalse($tokenStorage->getAccessToken('revoke'));
- }
-
- public function testRevokeRefreshTokenWithTypeHint()
- {
- $tokenStorage = new Memory(array(
- 'refresh_tokens' => array(
- 'revoke' => array('mytoken'),
- ),
- ));
-
- $this->assertEquals(array('mytoken'), $tokenStorage->getRefreshToken('revoke'));
- $accessToken = new AccessToken(new Memory, $tokenStorage);
- $accessToken->revokeToken('revoke', 'refresh_token');
- $this->assertFalse($tokenStorage->getRefreshToken('revoke'));
- }
-
- public function testRevokeRefreshTokenWithoutTypeHint()
- {
- $tokenStorage = new Memory(array(
- 'refresh_tokens' => array(
- 'revoke' => array('mytoken'),
- ),
- ));
-
- $this->assertEquals(array('mytoken'), $tokenStorage->getRefreshToken('revoke'));
- $accessToken = new AccessToken(new Memory, $tokenStorage);
- $accessToken->revokeToken('revoke');
- $this->assertFalse($tokenStorage->getRefreshToken('revoke'));
- }
-
- public function testRevokeAccessTokenWithRefreshTokenTypeHint()
- {
- $tokenStorage = new Memory(array(
- 'access_tokens' => array(
- 'revoke' => array('mytoken'),
- ),
- ));
-
- $this->assertEquals(array('mytoken'), $tokenStorage->getAccessToken('revoke'));
- $accessToken = new AccessToken($tokenStorage);
- $accessToken->revokeToken('revoke', 'refresh_token');
- $this->assertFalse($tokenStorage->getAccessToken('revoke'));
- }
-
- public function testRevokeAccessTokenWithBogusTypeHint()
- {
- $tokenStorage = new Memory(array(
- 'access_tokens' => array(
- 'revoke' => array('mytoken'),
- ),
- ));
-
- $this->assertEquals(array('mytoken'), $tokenStorage->getAccessToken('revoke'));
- $accessToken = new AccessToken($tokenStorage);
- $accessToken->revokeToken('revoke', 'foo');
- $this->assertFalse($tokenStorage->getAccessToken('revoke'));
- }
-
- public function testRevokeRefreshTokenWithBogusTypeHint()
- {
- $tokenStorage = new Memory(array(
- 'refresh_tokens' => array(
- 'revoke' => array('mytoken'),
- ),
- ));
-
- $this->assertEquals(array('mytoken'), $tokenStorage->getRefreshToken('revoke'));
- $accessToken = new AccessToken(new Memory, $tokenStorage);
- $accessToken->revokeToken('revoke', 'foo');
- $this->assertFalse($tokenStorage->getRefreshToken('revoke'));
- }
-}
diff --git a/library/oauth2/test/OAuth2/ResponseType/JwtAccessTokenTest.php b/library/oauth2/test/OAuth2/ResponseType/JwtAccessTokenTest.php
deleted file mode 100644
index 51b01a927..000000000
--- a/library/oauth2/test/OAuth2/ResponseType/JwtAccessTokenTest.php
+++ /dev/null
@@ -1,160 +0,0 @@
-<?php
-
-namespace OAuth2\ResponseType;
-
-use OAuth2\Server;
-use OAuth2\Response;
-use OAuth2\Request\TestRequest;
-use OAuth2\Storage\Bootstrap;
-use OAuth2\Storage\JwtAccessToken as JwtAccessTokenStorage;
-use OAuth2\GrantType\ClientCredentials;
-use OAuth2\GrantType\UserCredentials;
-use OAuth2\GrantType\RefreshToken;
-use OAuth2\Encryption\Jwt;
-
-class JwtAccessTokenTest extends \PHPUnit_Framework_TestCase
-{
- public function testCreateAccessToken()
- {
- $server = $this->getTestServer();
- $jwtResponseType = $server->getResponseType('token');
-
- $accessToken = $jwtResponseType->createAccessToken('Test Client ID', 123, 'test', false);
- $jwt = new Jwt;
- $decodedAccessToken = $jwt->decode($accessToken['access_token'], null, false);
-
- $this->assertArrayHasKey('id', $decodedAccessToken);
- $this->assertArrayHasKey('jti', $decodedAccessToken);
- $this->assertArrayHasKey('iss', $decodedAccessToken);
- $this->assertArrayHasKey('aud', $decodedAccessToken);
- $this->assertArrayHasKey('exp', $decodedAccessToken);
- $this->assertArrayHasKey('iat', $decodedAccessToken);
- $this->assertArrayHasKey('token_type', $decodedAccessToken);
- $this->assertArrayHasKey('scope', $decodedAccessToken);
-
- $this->assertEquals('https://api.example.com', $decodedAccessToken['iss']);
- $this->assertEquals('Test Client ID', $decodedAccessToken['aud']);
- $this->assertEquals(123, $decodedAccessToken['sub']);
- $delta = $decodedAccessToken['exp'] - $decodedAccessToken['iat'];
- $this->assertEquals(3600, $delta);
- $this->assertEquals($decodedAccessToken['id'], $decodedAccessToken['jti']);
- }
-
- public function testGrantJwtAccessToken()
- {
- // add the test parameters in memory
- $server = $this->getTestServer();
- $request = TestRequest::createPost(array(
- 'grant_type' => 'client_credentials', // valid grant type
- 'client_id' => 'Test Client ID', // valid client id
- 'client_secret' => 'TestSecret', // valid client secret
- ));
- $server->handleTokenRequest($request, $response = new Response());
-
- $this->assertNotNull($response->getParameter('access_token'));
- $this->assertEquals(2, substr_count($response->getParameter('access_token'), '.'));
- }
-
- public function testAccessResourceWithJwtAccessToken()
- {
- // add the test parameters in memory
- $server = $this->getTestServer();
- $request = TestRequest::createPost(array(
- 'grant_type' => 'client_credentials', // valid grant type
- 'client_id' => 'Test Client ID', // valid client id
- 'client_secret' => 'TestSecret', // valid client secret
- ));
- $server->handleTokenRequest($request, $response = new Response());
- $this->assertNotNull($JwtAccessToken = $response->getParameter('access_token'));
-
- // make a call to the resource server using the crypto token
- $request = TestRequest::createPost(array(
- 'access_token' => $JwtAccessToken,
- ));
-
- $this->assertTrue($server->verifyResourceRequest($request));
- }
-
- public function testAccessResourceWithJwtAccessTokenUsingSecondaryStorage()
- {
- // add the test parameters in memory
- $server = $this->getTestServer();
- $request = TestRequest::createPost(array(
- 'grant_type' => 'client_credentials', // valid grant type
- 'client_id' => 'Test Client ID', // valid client id
- 'client_secret' => 'TestSecret', // valid client secret
- ));
- $server->handleTokenRequest($request, $response = new Response());
- $this->assertNotNull($JwtAccessToken = $response->getParameter('access_token'));
-
- // make a call to the resource server using the crypto token
- $request = TestRequest::createPost(array(
- 'access_token' => $JwtAccessToken,
- ));
-
- // create a resource server with the "memory" storage from the grant server
- $resourceServer = new Server($server->getStorage('client_credentials'));
-
- $this->assertTrue($resourceServer->verifyResourceRequest($request));
- }
-
- public function testJwtAccessTokenWithRefreshToken()
- {
- $server = $this->getTestServer();
-
- // add "UserCredentials" grant type and "JwtAccessToken" response type
- // and ensure "JwtAccessToken" response type has "RefreshToken" storage
- $memoryStorage = Bootstrap::getInstance()->getMemoryStorage();
- $server->addGrantType(new UserCredentials($memoryStorage));
- $server->addGrantType(new RefreshToken($memoryStorage));
- $server->addResponseType(new JwtAccessToken($memoryStorage, $memoryStorage, $memoryStorage), 'token');
-
- $request = TestRequest::createPost(array(
- 'grant_type' => 'password', // valid grant type
- 'client_id' => 'Test Client ID', // valid client id
- 'client_secret' => 'TestSecret', // valid client secret
- 'username' => 'test-username', // valid username
- 'password' => 'testpass', // valid password
- ));
-
- // make the call to grant a crypto token
- $server->handleTokenRequest($request, $response = new Response());
- $this->assertNotNull($JwtAccessToken = $response->getParameter('access_token'));
- $this->assertNotNull($refreshToken = $response->getParameter('refresh_token'));
-
- // decode token and make sure refresh_token isn't set
- list($header, $payload, $signature) = explode('.', $JwtAccessToken);
- $decodedToken = json_decode(base64_decode($payload), true);
- $this->assertFalse(array_key_exists('refresh_token', $decodedToken));
-
- // use the refresh token to get another access token
- $request = TestRequest::createPost(array(
- 'grant_type' => 'refresh_token',
- 'client_id' => 'Test Client ID', // valid client id
- 'client_secret' => 'TestSecret', // valid client secret
- 'refresh_token' => $refreshToken,
- ));
-
- $server->handleTokenRequest($request, $response = new Response());
- $this->assertNotNull($response->getParameter('access_token'));
- }
-
- private function getTestServer()
- {
- $memoryStorage = Bootstrap::getInstance()->getMemoryStorage();
-
- $storage = array(
- 'access_token' => new JwtAccessTokenStorage($memoryStorage),
- 'client' => $memoryStorage,
- 'client_credentials' => $memoryStorage,
- );
- $server = new Server($storage);
- $server->addGrantType(new ClientCredentials($memoryStorage));
-
- // make the "token" response type a JwtAccessToken
- $config = array('issuer' => 'https://api.example.com');
- $server->addResponseType(new JwtAccessToken($memoryStorage, $memoryStorage, null, $config));
-
- return $server;
- }
-}
diff --git a/library/oauth2/test/OAuth2/ScopeTest.php b/library/oauth2/test/OAuth2/ScopeTest.php
deleted file mode 100644
index 99f9cf6eb..000000000
--- a/library/oauth2/test/OAuth2/ScopeTest.php
+++ /dev/null
@@ -1,42 +0,0 @@
-<?php
-
-namespace OAuth2;
-
-use OAuth2\Storage\Memory;
-
-class ScopeTest extends \PHPUnit_Framework_TestCase
-{
- public function testCheckScope()
- {
- $scopeUtil = new Scope();
-
- $this->assertFalse($scopeUtil->checkScope('invalid', 'list of scopes'));
- $this->assertTrue($scopeUtil->checkScope('valid', 'valid and-some other-scopes'));
- $this->assertTrue($scopeUtil->checkScope('valid another-valid', 'valid another-valid and-some other-scopes'));
- // all scopes must match
- $this->assertFalse($scopeUtil->checkScope('valid invalid', 'valid and-some other-scopes'));
- $this->assertFalse($scopeUtil->checkScope('valid valid2 invalid', 'valid valid2 and-some other-scopes'));
- }
-
- public function testScopeStorage()
- {
- $scopeUtil = new Scope();
- $this->assertEquals($scopeUtil->getDefaultScope(), null);
-
- $scopeUtil = new Scope(array(
- 'default_scope' => 'default',
- 'supported_scopes' => array('this', 'that', 'another'),
- ));
- $this->assertEquals($scopeUtil->getDefaultScope(), 'default');
- $this->assertTrue($scopeUtil->scopeExists('this that another', 'client_id'));
-
- $memoryStorage = new Memory(array(
- 'default_scope' => 'base',
- 'supported_scopes' => array('only-this-one'),
- ));
- $scopeUtil = new Scope($memoryStorage);
-
- $this->assertEquals($scopeUtil->getDefaultScope(), 'base');
- $this->assertTrue($scopeUtil->scopeExists('only-this-one', 'client_id'));
- }
-}
diff --git a/library/oauth2/test/OAuth2/ServerTest.php b/library/oauth2/test/OAuth2/ServerTest.php
deleted file mode 100644
index 747e120f5..000000000
--- a/library/oauth2/test/OAuth2/ServerTest.php
+++ /dev/null
@@ -1,684 +0,0 @@
-<?php
-
-namespace OAuth2;
-
-use OAuth2\Request\TestRequest;
-use OAuth2\ResponseType\AuthorizationCode;
-use OAuth2\Storage\Bootstrap;
-
-class ServerTest extends \PHPUnit_Framework_TestCase
-{
- /**
- * @expectedException LogicException OAuth2\Storage\ClientInterface
- **/
- public function testGetAuthorizeControllerWithNoClientStorageThrowsException()
- {
- // must set Client Storage
- $server = new Server();
- $server->getAuthorizeController();
- }
-
- /**
- * @expectedException LogicException OAuth2\Storage\AccessTokenInterface
- **/
- public function testGetAuthorizeControllerWithNoAccessTokenStorageThrowsException()
- {
- // must set AccessToken or AuthorizationCode
- $server = new Server();
- $server->addStorage($this->getMock('OAuth2\Storage\ClientInterface'));
- $server->getAuthorizeController();
- }
-
- public function testGetAuthorizeControllerWithClientStorageAndAccessTokenResponseType()
- {
- // must set AccessToken or AuthorizationCode
- $server = new Server();
- $server->addStorage($this->getMock('OAuth2\Storage\ClientInterface'));
- $server->addResponseType($this->getMock('OAuth2\ResponseType\AccessTokenInterface'));
-
- $this->assertNotNull($server->getAuthorizeController());
- }
-
- public function testGetAuthorizeControllerWithClientStorageAndAuthorizationCodeResponseType()
- {
- // must set AccessToken or AuthorizationCode
- $server = new Server();
- $server->addStorage($this->getMock('OAuth2\Storage\ClientInterface'));
- $server->addResponseType($this->getMock('OAuth2\ResponseType\AuthorizationCodeInterface'));
-
- $this->assertNotNull($server->getAuthorizeController());
- }
-
- /**
- * @expectedException LogicException allow_implicit
- **/
- public function testGetAuthorizeControllerWithClientStorageAndAccessTokenStorageThrowsException()
- {
- // must set AuthorizationCode or AccessToken / implicit
- $server = new Server();
- $server->addStorage($this->getMock('OAuth2\Storage\ClientInterface'));
- $server->addStorage($this->getMock('OAuth2\Storage\AccessTokenInterface'));
-
- $this->assertNotNull($server->getAuthorizeController());
- }
-
- public function testGetAuthorizeControllerWithClientStorageAndAccessTokenStorage()
- {
- // must set AuthorizationCode or AccessToken / implicit
- $server = new Server(array(), array('allow_implicit' => true));
- $server->addStorage($this->getMock('OAuth2\Storage\ClientInterface'));
- $server->addStorage($this->getMock('OAuth2\Storage\AccessTokenInterface'));
-
- $this->assertNotNull($server->getAuthorizeController());
- }
-
- public function testGetAuthorizeControllerWithClientStorageAndAuthorizationCodeStorage()
- {
- // must set AccessToken or AuthorizationCode
- $server = new Server();
- $server->addStorage($this->getMock('OAuth2\Storage\ClientInterface'));
- $server->addStorage($this->getMock('OAuth2\Storage\AuthorizationCodeInterface'));
-
- $this->assertNotNull($server->getAuthorizeController());
- }
-
- /**
- * @expectedException LogicException grant_types
- **/
- public function testGetTokenControllerWithGrantTypeStorageThrowsException()
- {
- $server = new Server();
- $server->getTokenController();
- }
-
- /**
- * @expectedException LogicException OAuth2\Storage\ClientCredentialsInterface
- **/
- public function testGetTokenControllerWithNoClientCredentialsStorageThrowsException()
- {
- $server = new Server();
- $server->addStorage($this->getMock('OAuth2\Storage\UserCredentialsInterface'));
- $server->getTokenController();
- }
-
- /**
- * @expectedException LogicException OAuth2\Storage\AccessTokenInterface
- **/
- public function testGetTokenControllerWithNoAccessTokenStorageThrowsException()
- {
- $server = new Server();
- $server->addStorage($this->getMock('OAuth2\Storage\ClientCredentialsInterface'));
- $server->getTokenController();
- }
-
- public function testGetTokenControllerWithAccessTokenAndClientCredentialsStorage()
- {
- $server = new Server();
- $server->addStorage($this->getMock('OAuth2\Storage\AccessTokenInterface'));
- $server->addStorage($this->getMock('OAuth2\Storage\ClientCredentialsInterface'));
- $server->getTokenController();
- }
-
- public function testGetTokenControllerAccessTokenStorageAndClientCredentialsStorageAndGrantTypes()
- {
- $server = new Server();
- $server->addStorage($this->getMock('OAuth2\Storage\AccessTokenInterface'));
- $server->addStorage($this->getMock('OAuth2\Storage\ClientCredentialsInterface'));
- $server->addGrantType($this->getMockBuilder('OAuth2\GrantType\AuthorizationCode')->disableOriginalConstructor()->getMock());
- $server->getTokenController();
- }
-
- /**
- * @expectedException LogicException OAuth2\Storage\AccessTokenInterface
- **/
- public function testGetResourceControllerWithNoAccessTokenStorageThrowsException()
- {
- $server = new Server();
- $server->getResourceController();
- }
-
- public function testGetResourceControllerWithAccessTokenStorage()
- {
- $server = new Server();
- $server->addStorage($this->getMock('OAuth2\Storage\AccessTokenInterface'));
- $server->getResourceController();
- }
-
- /**
- * @expectedException InvalidArgumentException OAuth2\Storage\AccessTokenInterface
- **/
- public function testAddingStorageWithInvalidClass()
- {
- $server = new Server();
- $server->addStorage(new \StdClass());
- }
-
- /**
- * @expectedException InvalidArgumentException access_token
- **/
- public function testAddingStorageWithInvalidKey()
- {
- $server = new Server();
- $server->addStorage($this->getMock('OAuth2\Storage\AccessTokenInterface'), 'nonexistant_storage');
- }
-
- /**
- * @expectedException InvalidArgumentException OAuth2\Storage\AuthorizationCodeInterface
- **/
- public function testAddingStorageWithInvalidKeyStorageCombination()
- {
- $server = new Server();
- $server->addStorage($this->getMock('OAuth2\Storage\AccessTokenInterface'), 'authorization_code');
- }
-
- public function testAddingStorageWithValidKeyOnlySetsThatKey()
- {
- $server = new Server();
- $server->addStorage($this->getMock('OAuth2\Storage\Memory'), 'access_token');
-
- $reflection = new \ReflectionClass($server);
- $prop = $reflection->getProperty('storages');
- $prop->setAccessible(true);
-
- $storages = $prop->getValue($server); // get the private "storages" property
-
- $this->assertEquals(1, count($storages));
- $this->assertTrue(isset($storages['access_token']));
- $this->assertFalse(isset($storages['authorization_code']));
- }
-
- public function testAddingClientStorageSetsClientCredentialsStorageByDefault()
- {
- $server = new Server();
- $memory = $this->getMock('OAuth2\Storage\Memory');
- $server->addStorage($memory, 'client');
-
- $client_credentials = $server->getStorage('client_credentials');
-
- $this->assertNotNull($client_credentials);
- $this->assertEquals($client_credentials, $memory);
- }
-
- public function testAddStorageWithNullValue()
- {
- $memory = $this->getMock('OAuth2\Storage\Memory');
- $server = new Server($memory);
- $server->addStorage(null, 'refresh_token');
-
- $client_credentials = $server->getStorage('client_credentials');
-
- $this->assertNotNull($client_credentials);
- $this->assertEquals($client_credentials, $memory);
-
- $refresh_token = $server->getStorage('refresh_token');
-
- $this->assertNull($refresh_token);
- }
-
- public function testNewServerWithNullStorageValue()
- {
- $memory = $this->getMock('OAuth2\Storage\Memory');
- $server = new Server(array(
- 'client_credentials' => $memory,
- 'refresh_token' => null,
- ));
-
- $client_credentials = $server->getStorage('client_credentials');
-
- $this->assertNotNull($client_credentials);
- $this->assertEquals($client_credentials, $memory);
-
- $refresh_token = $server->getStorage('refresh_token');
-
- $this->assertNull($refresh_token);
- }
-
- public function testAddingClientCredentialsStorageSetsClientStorageByDefault()
- {
- $server = new Server();
- $memory = $this->getMock('OAuth2\Storage\Memory');
- $server->addStorage($memory, 'client_credentials');
-
- $client = $server->getStorage('client');
-
- $this->assertNotNull($client);
- $this->assertEquals($client, $memory);
- }
-
- public function testSettingClientStorageByDefaultDoesNotOverrideSetStorage()
- {
- $server = new Server();
- $pdo = $this->getMockBuilder('OAuth2\Storage\Pdo')
- ->disableOriginalConstructor()->getMock();
-
- $memory = $this->getMock('OAuth2\Storage\Memory');
-
- $server->addStorage($pdo, 'client');
- $server->addStorage($memory, 'client_credentials');
-
- $client = $server->getStorage('client');
- $client_credentials = $server->getStorage('client_credentials');
-
- $this->assertEquals($client, $pdo);
- $this->assertEquals($client_credentials, $memory);
- }
-
- public function testAddingResponseType()
- {
- $storage = $this->getMock('OAuth2\Storage\Memory');
- $storage
- ->expects($this->any())
- ->method('getClientDetails')
- ->will($this->returnValue(array('client_id' => 'some_client')));
- $storage
- ->expects($this->any())
- ->method('checkRestrictedGrantType')
- ->will($this->returnValue(true));
-
- // add with the "code" key explicitly set
- $codeType = new AuthorizationCode($storage);
- $server = new Server();
- $server->addStorage($storage);
- $server->addResponseType($codeType);
- $request = new Request(array(
- 'response_type' => 'code',
- 'client_id' => 'some_client',
- 'redirect_uri' => 'http://example.com',
- 'state' => 'xyx',
- ));
- $server->handleAuthorizeRequest($request, $response = new Response(), true);
-
- // the response is successful
- $this->assertEquals($response->getStatusCode(), 302);
- $parts = parse_url($response->getHttpHeader('Location'));
- parse_str($parts['query'], $query);
- $this->assertTrue(isset($query['code']));
- $this->assertFalse(isset($query['error']));
-
- // add with the "code" key not set
- $codeType = new AuthorizationCode($storage);
- $server = new Server(array($storage), array(), array(), array($codeType));
- $request = new Request(array(
- 'response_type' => 'code',
- 'client_id' => 'some_client',
- 'redirect_uri' => 'http://example.com',
- 'state' => 'xyx',
- ));
- $server->handleAuthorizeRequest($request, $response = new Response(), true);
-
- // the response is successful
- $this->assertEquals($response->getStatusCode(), 302);
- $parts = parse_url($response->getHttpHeader('Location'));
- parse_str($parts['query'], $query);
- $this->assertTrue(isset($query['code']));
- $this->assertFalse(isset($query['error']));
- }
-
- public function testCustomClientAssertionType()
- {
- $request = TestRequest::createPost(array(
- 'grant_type' => 'authorization_code',
- 'client_id' =>'Test Client ID',
- 'code' => 'testcode',
- ));
- // verify the mock clientAssertionType was called as expected
- $clientAssertionType = $this->getMock('OAuth2\ClientAssertionType\ClientAssertionTypeInterface', array('validateRequest', 'getClientId'));
- $clientAssertionType
- ->expects($this->once())
- ->method('validateRequest')
- ->will($this->returnValue(true));
- $clientAssertionType
- ->expects($this->once())
- ->method('getClientId')
- ->will($this->returnValue('Test Client ID'));
-
- // create mock storage
- $storage = Bootstrap::getInstance()->getMemoryStorage();
- $server = new Server(array($storage), array(), array(), array(), null, null, $clientAssertionType);
- $server->handleTokenRequest($request, $response = new Response());
- }
-
- public function testHttpBasicConfig()
- {
- // create mock storage
- $storage = Bootstrap::getInstance()->getMemoryStorage();
- $server = new Server(array($storage), array(
- 'allow_credentials_in_request_body' => false,
- 'allow_public_clients' => false
- ));
- $server->getTokenController();
- $httpBasic = $server->getClientAssertionType();
-
- $reflection = new \ReflectionClass($httpBasic);
- $prop = $reflection->getProperty('config');
- $prop->setAccessible(true);
-
- $config = $prop->getValue($httpBasic); // get the private "config" property
-
- $this->assertEquals($config['allow_credentials_in_request_body'], false);
- $this->assertEquals($config['allow_public_clients'], false);
- }
-
- public function testRefreshTokenConfig()
- {
- // create mock storage
- $storage = Bootstrap::getInstance()->getMemoryStorage();
- $server1 = new Server(array($storage));
- $server2 = new Server(array($storage), array('always_issue_new_refresh_token' => true, 'unset_refresh_token_after_use' => false));
-
- $server1->getTokenController();
- $refreshToken1 = $server1->getGrantType('refresh_token');
-
- $server2->getTokenController();
- $refreshToken2 = $server2->getGrantType('refresh_token');
-
- $reflection1 = new \ReflectionClass($refreshToken1);
- $prop1 = $reflection1->getProperty('config');
- $prop1->setAccessible(true);
-
- $reflection2 = new \ReflectionClass($refreshToken2);
- $prop2 = $reflection2->getProperty('config');
- $prop2->setAccessible(true);
-
- // get the private "config" property
- $config1 = $prop1->getValue($refreshToken1);
- $config2 = $prop2->getValue($refreshToken2);
-
- $this->assertEquals($config1['always_issue_new_refresh_token'], false);
- $this->assertEquals($config2['always_issue_new_refresh_token'], true);
-
- $this->assertEquals($config1['unset_refresh_token_after_use'], true);
- $this->assertEquals($config2['unset_refresh_token_after_use'], false);
- }
-
- /**
- * Test setting "always_issue_new_refresh_token" on a server level
- *
- * @see test/OAuth2/GrantType/RefreshTokenTest::testValidRefreshTokenWithNewRefreshTokenInResponse
- **/
- public function testValidRefreshTokenWithNewRefreshTokenInResponse()
- {
- $storage = Bootstrap::getInstance()->getMemoryStorage();
- $server = new Server($storage, array('always_issue_new_refresh_token' => true));
-
- $request = TestRequest::createPost(array(
- 'grant_type' => 'refresh_token', // valid grant type
- 'client_id' => 'Test Client ID', // valid client id
- 'client_secret' => 'TestSecret', // valid client secret
- 'refresh_token' => 'test-refreshtoken', // valid refresh token
- ));
- $token = $server->grantAccessToken($request, new Response());
- $this->assertTrue(isset($token['refresh_token']), 'refresh token should always refresh');
-
- $refresh_token = $storage->getRefreshToken($token['refresh_token']);
- $this->assertNotNull($refresh_token);
- $this->assertEquals($refresh_token['refresh_token'], $token['refresh_token']);
- $this->assertEquals($refresh_token['client_id'], $request->request('client_id'));
- $this->assertTrue($token['refresh_token'] != 'test-refreshtoken', 'the refresh token returned is not the one used');
- $used_token = $storage->getRefreshToken('test-refreshtoken');
- $this->assertFalse($used_token, 'the refresh token used is no longer valid');
- }
-
- /**
- * @expectedException InvalidArgumentException OAuth2\ResponseType\AuthorizationCodeInterface
- **/
- public function testAddingUnknownResponseTypeThrowsException()
- {
- $server = new Server();
- $server->addResponseType($this->getMock('OAuth2\ResponseType\ResponseTypeInterface'));
- }
-
- /**
- * @expectedException LogicException OAuth2\Storage\PublicKeyInterface
- **/
- public function testUsingJwtAccessTokensWithoutPublicKeyStorageThrowsException()
- {
- $server = new Server(array(), array('use_jwt_access_tokens' => true));
- $server->addGrantType($this->getMock('OAuth2\GrantType\GrantTypeInterface'));
- $server->addStorage($this->getMock('OAuth2\Storage\ClientCredentialsInterface'));
- $server->addStorage($this->getMock('OAuth2\Storage\ClientCredentialsInterface'));
-
- $server->getTokenController();
- }
-
- public function testUsingJustJwtAccessTokenStorageWithResourceControllerIsOkay()
- {
- $pubkey = $this->getMock('OAuth2\Storage\PublicKeyInterface');
- $server = new Server(array($pubkey), array('use_jwt_access_tokens' => true));
-
- $this->assertNotNull($server->getResourceController());
- $this->assertInstanceOf('OAuth2\Storage\PublicKeyInterface', $server->getStorage('public_key'));
- }
-
- /**
- * @expectedException LogicException OAuth2\Storage\ClientInterface
- **/
- public function testUsingJustJwtAccessTokenStorageWithAuthorizeControllerThrowsException()
- {
- $pubkey = $this->getMock('OAuth2\Storage\PublicKeyInterface');
- $server = new Server(array($pubkey), array('use_jwt_access_tokens' => true));
- $this->assertNotNull($server->getAuthorizeController());
- }
-
- /**
- * @expectedException LogicException grant_types
- **/
- public function testUsingJustJwtAccessTokenStorageWithTokenControllerThrowsException()
- {
- $pubkey = $this->getMock('OAuth2\Storage\PublicKeyInterface');
- $server = new Server(array($pubkey), array('use_jwt_access_tokens' => true));
- $server->getTokenController();
- }
-
- public function testUsingJwtAccessTokenAndClientStorageWithAuthorizeControllerIsOkay()
- {
- $pubkey = $this->getMock('OAuth2\Storage\PublicKeyInterface');
- $client = $this->getMock('OAuth2\Storage\ClientInterface');
- $server = new Server(array($pubkey, $client), array('use_jwt_access_tokens' => true, 'allow_implicit' => true));
- $this->assertNotNull($server->getAuthorizeController());
-
- $this->assertInstanceOf('OAuth2\ResponseType\JwtAccessToken', $server->getResponseType('token'));
- }
-
- /**
- * @expectedException LogicException UserClaims
- **/
- public function testUsingOpenIDConnectWithoutUserClaimsThrowsException()
- {
- $client = $this->getMock('OAuth2\Storage\ClientInterface');
- $server = new Server($client, array('use_openid_connect' => true));
-
- $server->getAuthorizeController();
- }
-
- /**
- * @expectedException LogicException PublicKeyInterface
- **/
- public function testUsingOpenIDConnectWithoutPublicKeyThrowsException()
- {
- $client = $this->getMock('OAuth2\Storage\ClientInterface');
- $userclaims = $this->getMock('OAuth2\OPenID\Storage\UserClaimsInterface');
- $server = new Server(array($client, $userclaims), array('use_openid_connect' => true));
-
- $server->getAuthorizeController();
- }
-
- /**
- * @expectedException LogicException issuer
- **/
- public function testUsingOpenIDConnectWithoutIssuerThrowsException()
- {
- $client = $this->getMock('OAuth2\Storage\ClientInterface');
- $userclaims = $this->getMock('OAuth2\OpenID\Storage\UserClaimsInterface');
- $pubkey = $this->getMock('OAuth2\Storage\PublicKeyInterface');
- $server = new Server(array($client, $userclaims, $pubkey), array('use_openid_connect' => true));
-
- $server->getAuthorizeController();
- }
-
- public function testUsingOpenIDConnectWithIssuerPublicKeyAndUserClaimsIsOkay()
- {
- $client = $this->getMock('OAuth2\Storage\ClientInterface');
- $userclaims = $this->getMock('OAuth2\OpenID\Storage\UserClaimsInterface');
- $pubkey = $this->getMock('OAuth2\Storage\PublicKeyInterface');
- $server = new Server(array($client, $userclaims, $pubkey), array(
- 'use_openid_connect' => true,
- 'issuer' => 'someguy',
- ));
-
- $server->getAuthorizeController();
-
- $this->assertInstanceOf('OAuth2\OpenID\ResponseType\IdTokenInterface', $server->getResponseType('id_token'));
- $this->assertNull($server->getResponseType('id_token token'));
- }
-
- /**
- * @expectedException LogicException OAuth2\ResponseType\AccessTokenInterface
- **/
- public function testUsingOpenIDConnectWithAllowImplicitWithoutTokenStorageThrowsException()
- {
- $client = $this->getMock('OAuth2\Storage\ClientInterface');
- $userclaims = $this->getMock('OAuth2\OpenID\Storage\UserClaimsInterface');
- $pubkey = $this->getMock('OAuth2\Storage\PublicKeyInterface');
- $server = new Server(array($client, $userclaims, $pubkey), array(
- 'use_openid_connect' => true,
- 'issuer' => 'someguy',
- 'allow_implicit' => true,
- ));
-
- $server->getAuthorizeController();
- }
-
- public function testUsingOpenIDConnectWithAllowImplicitAndUseJwtAccessTokensIsOkay()
- {
- $client = $this->getMock('OAuth2\Storage\ClientInterface');
- $userclaims = $this->getMock('OAuth2\OpenID\Storage\UserClaimsInterface');
- $pubkey = $this->getMock('OAuth2\Storage\PublicKeyInterface');
- $server = new Server(array($client, $userclaims, $pubkey), array(
- 'use_openid_connect' => true,
- 'issuer' => 'someguy',
- 'allow_implicit' => true,
- 'use_jwt_access_tokens' => true,
- ));
-
- $server->getAuthorizeController();
-
- $this->assertInstanceOf('OAuth2\OpenID\ResponseType\IdTokenInterface', $server->getResponseType('id_token'));
- $this->assertInstanceOf('OAuth2\OpenID\ResponseType\IdTokenTokenInterface', $server->getResponseType('id_token token'));
- }
-
- public function testUsingOpenIDConnectWithAllowImplicitAndAccessTokenStorageIsOkay()
- {
- $client = $this->getMock('OAuth2\Storage\ClientInterface');
- $userclaims = $this->getMock('OAuth2\OpenID\Storage\UserClaimsInterface');
- $pubkey = $this->getMock('OAuth2\Storage\PublicKeyInterface');
- $token = $this->getMock('OAuth2\Storage\AccessTokenInterface');
- $server = new Server(array($client, $userclaims, $pubkey, $token), array(
- 'use_openid_connect' => true,
- 'issuer' => 'someguy',
- 'allow_implicit' => true,
- ));
-
- $server->getAuthorizeController();
-
- $this->assertInstanceOf('OAuth2\OpenID\ResponseType\IdTokenInterface', $server->getResponseType('id_token'));
- $this->assertInstanceOf('OAuth2\OpenID\ResponseType\IdTokenTokenInterface', $server->getResponseType('id_token token'));
- }
-
- public function testUsingOpenIDConnectWithAllowImplicitAndAccessTokenResponseTypeIsOkay()
- {
- $client = $this->getMock('OAuth2\Storage\ClientInterface');
- $userclaims = $this->getMock('OAuth2\OpenID\Storage\UserClaimsInterface');
- $pubkey = $this->getMock('OAuth2\Storage\PublicKeyInterface');
- // $token = $this->getMock('OAuth2\Storage\AccessTokenInterface');
- $server = new Server(array($client, $userclaims, $pubkey), array(
- 'use_openid_connect' => true,
- 'issuer' => 'someguy',
- 'allow_implicit' => true,
- ));
-
- $token = $this->getMock('OAuth2\ResponseType\AccessTokenInterface');
- $server->addResponseType($token, 'token');
-
- $server->getAuthorizeController();
-
- $this->assertInstanceOf('OAuth2\OpenID\ResponseType\IdTokenInterface', $server->getResponseType('id_token'));
- $this->assertInstanceOf('OAuth2\OpenID\ResponseType\IdTokenTokenInterface', $server->getResponseType('id_token token'));
- }
-
- /**
- * @expectedException LogicException OAuth2\OpenID\Storage\AuthorizationCodeInterface
- **/
- public function testUsingOpenIDConnectWithAuthorizationCodeStorageThrowsException()
- {
- $client = $this->getMock('OAuth2\Storage\ClientCredentialsInterface');
- $userclaims = $this->getMock('OAuth2\OpenID\Storage\UserClaimsInterface');
- $pubkey = $this->getMock('OAuth2\Storage\PublicKeyInterface');
- $token = $this->getMock('OAuth2\Storage\AccessTokenInterface');
- $authcode = $this->getMock('OAuth2\Storage\AuthorizationCodeInterface');
-
- $server = new Server(array($client, $userclaims, $pubkey, $token, $authcode), array(
- 'use_openid_connect' => true,
- 'issuer' => 'someguy'
- ));
-
- $server->getTokenController();
-
- $this->assertInstanceOf('OAuth2\OpenID\GrantType\AuthorizationCode', $server->getGrantType('authorization_code'));
- }
-
- public function testUsingOpenIDConnectWithOpenIDAuthorizationCodeStorageCreatesOpenIDAuthorizationCodeGrantType()
- {
- $client = $this->getMock('OAuth2\Storage\ClientCredentialsInterface');
- $userclaims = $this->getMock('OAuth2\OpenID\Storage\UserClaimsInterface');
- $pubkey = $this->getMock('OAuth2\Storage\PublicKeyInterface');
- $token = $this->getMock('OAuth2\Storage\AccessTokenInterface');
- $authcode = $this->getMock('OAuth2\OpenID\Storage\AuthorizationCodeInterface');
-
- $server = new Server(array($client, $userclaims, $pubkey, $token, $authcode), array(
- 'use_openid_connect' => true,
- 'issuer' => 'someguy'
- ));
-
- $server->getTokenController();
-
- $this->assertInstanceOf('OAuth2\OpenID\GrantType\AuthorizationCode', $server->getGrantType('authorization_code'));
- }
-
- public function testMultipleValuedResponseTypeOrderDoesntMatter()
- {
- $responseType = $this->getMock('OAuth2\OpenID\ResponseType\IdTokenTokenInterface');
- $server = new Server(array(), array(), array(), array(
- 'token id_token' => $responseType,
- ));
-
- $this->assertEquals($responseType, $server->getResponseType('id_token token'));
- }
-
- public function testAddGrantTypeWithoutKey()
- {
- $server = new Server();
- $server->addGrantType(new \OAuth2\GrantType\AuthorizationCode($this->getMock('OAuth2\Storage\AuthorizationCodeInterface')));
-
- $grantTypes = $server->getGrantTypes();
- $this->assertEquals('authorization_code', key($grantTypes));
- }
-
- public function testAddGrantTypeWithKey()
- {
- $server = new Server();
- $server->addGrantType(new \OAuth2\GrantType\AuthorizationCode($this->getMock('OAuth2\Storage\AuthorizationCodeInterface')), 'ac');
-
- $grantTypes = $server->getGrantTypes();
- $this->assertEquals('ac', key($grantTypes));
- }
-
- public function testAddGrantTypeWithKeyNotString()
- {
- $server = new Server();
- $server->addGrantType(new \OAuth2\GrantType\AuthorizationCode($this->getMock('OAuth2\Storage\AuthorizationCodeInterface')), 42);
-
- $grantTypes = $server->getGrantTypes();
- $this->assertEquals('authorization_code', key($grantTypes));
- }
-}
diff --git a/library/oauth2/test/OAuth2/Storage/AccessTokenTest.php b/library/oauth2/test/OAuth2/Storage/AccessTokenTest.php
deleted file mode 100644
index b34e0bfc0..000000000
--- a/library/oauth2/test/OAuth2/Storage/AccessTokenTest.php
+++ /dev/null
@@ -1,102 +0,0 @@
-<?php
-
-namespace OAuth2\Storage;
-
-class AccessTokenTest extends BaseTest
-{
- /** @dataProvider provideStorage */
- public function testSetAccessToken(AccessTokenInterface $storage)
- {
- if ($storage instanceof NullStorage) {
- $this->markTestSkipped('Skipped Storage: ' . $storage->getMessage());
-
- return;
- }
-
- // assert token we are about to add does not exist
- $token = $storage->getAccessToken('newtoken');
- $this->assertFalse($token);
-
- // add new token
- $expires = time() + 20;
- $success = $storage->setAccessToken('newtoken', 'client ID', 'SOMEUSERID', $expires);
- $this->assertTrue($success);
-
- $token = $storage->getAccessToken('newtoken');
- $this->assertNotNull($token);
- $this->assertArrayHasKey('access_token', $token);
- $this->assertArrayHasKey('client_id', $token);
- $this->assertArrayHasKey('user_id', $token);
- $this->assertArrayHasKey('expires', $token);
- $this->assertEquals($token['access_token'], 'newtoken');
- $this->assertEquals($token['client_id'], 'client ID');
- $this->assertEquals($token['user_id'], 'SOMEUSERID');
- $this->assertEquals($token['expires'], $expires);
-
- // change existing token
- $expires = time() + 42;
- $success = $storage->setAccessToken('newtoken', 'client ID2', 'SOMEOTHERID', $expires);
- $this->assertTrue($success);
-
- $token = $storage->getAccessToken('newtoken');
- $this->assertNotNull($token);
- $this->assertArrayHasKey('access_token', $token);
- $this->assertArrayHasKey('client_id', $token);
- $this->assertArrayHasKey('user_id', $token);
- $this->assertArrayHasKey('expires', $token);
- $this->assertEquals($token['access_token'], 'newtoken');
- $this->assertEquals($token['client_id'], 'client ID2');
- $this->assertEquals($token['user_id'], 'SOMEOTHERID');
- $this->assertEquals($token['expires'], $expires);
-
- // add token with scope having an empty string value
- $expires = time() + 42;
- $success = $storage->setAccessToken('newtoken', 'client ID', 'SOMEOTHERID', $expires, '');
- $this->assertTrue($success);
- }
-
- /** @dataProvider provideStorage */
- public function testUnsetAccessToken(AccessTokenInterface $storage)
- {
- if ($storage instanceof NullStorage || !method_exists($storage, 'unsetAccessToken')) {
- $this->markTestSkipped('Skipped Storage: ' . $storage->getMessage());
-
- return;
- }
-
- // assert token we are about to unset does not exist
- $token = $storage->getAccessToken('revokabletoken');
- $this->assertFalse($token);
-
- // add new token
- $expires = time() + 20;
- $success = $storage->setAccessToken('revokabletoken', 'client ID', 'SOMEUSERID', $expires);
- $this->assertTrue($success);
-
- // assert unsetAccessToken returns true
- $result = $storage->unsetAccessToken('revokabletoken');
- $this->assertTrue($result);
-
- // assert token we unset does not exist
- $token = $storage->getAccessToken('revokabletoken');
- $this->assertFalse($token);
- }
-
- /** @dataProvider provideStorage */
- public function testUnsetAccessTokenReturnsFalse(AccessTokenInterface $storage)
- {
- if ($storage instanceof NullStorage || !method_exists($storage, 'unsetAccessToken')) {
- $this->markTestSkipped('Skipped Storage: ' . $storage->getMessage());
-
- return;
- }
-
- // assert token we are about to unset does not exist
- $token = $storage->getAccessToken('nonexistanttoken');
- $this->assertFalse($token);
-
- // assert unsetAccessToken returns false
- $result = $storage->unsetAccessToken('nonexistanttoken');
- $this->assertFalse($result);
- }
-}
diff --git a/library/oauth2/test/OAuth2/Storage/AuthorizationCodeTest.php b/library/oauth2/test/OAuth2/Storage/AuthorizationCodeTest.php
deleted file mode 100644
index 2d901b501..000000000
--- a/library/oauth2/test/OAuth2/Storage/AuthorizationCodeTest.php
+++ /dev/null
@@ -1,106 +0,0 @@
-<?php
-
-namespace OAuth2\Storage;
-
-class AuthorizationCodeTest extends BaseTest
-{
- /** @dataProvider provideStorage */
- public function testGetAuthorizationCode(AuthorizationCodeInterface $storage)
- {
- if ($storage instanceof NullStorage) {
- $this->markTestSkipped('Skipped Storage: ' . $storage->getMessage());
-
- return;
- }
-
- // nonexistant client_id
- $details = $storage->getAuthorizationCode('faketoken');
- $this->assertFalse($details);
-
- // valid client_id
- $details = $storage->getAuthorizationCode('testtoken');
- $this->assertNotNull($details);
- }
-
- /** @dataProvider provideStorage */
- public function testSetAuthorizationCode(AuthorizationCodeInterface $storage)
- {
- if ($storage instanceof NullStorage) {
- $this->markTestSkipped('Skipped Storage: ' . $storage->getMessage());
-
- return;
- }
-
- // assert code we are about to add does not exist
- $code = $storage->getAuthorizationCode('newcode');
- $this->assertFalse($code);
-
- // add new code
- $expires = time() + 20;
- $success = $storage->setAuthorizationCode('newcode', 'client ID', 'SOMEUSERID', 'http://example.com', $expires);
- $this->assertTrue($success);
-
- $code = $storage->getAuthorizationCode('newcode');
- $this->assertNotNull($code);
- $this->assertArrayHasKey('authorization_code', $code);
- $this->assertArrayHasKey('client_id', $code);
- $this->assertArrayHasKey('user_id', $code);
- $this->assertArrayHasKey('redirect_uri', $code);
- $this->assertArrayHasKey('expires', $code);
- $this->assertEquals($code['authorization_code'], 'newcode');
- $this->assertEquals($code['client_id'], 'client ID');
- $this->assertEquals($code['user_id'], 'SOMEUSERID');
- $this->assertEquals($code['redirect_uri'], 'http://example.com');
- $this->assertEquals($code['expires'], $expires);
-
- // change existing code
- $expires = time() + 42;
- $success = $storage->setAuthorizationCode('newcode', 'client ID2', 'SOMEOTHERID', 'http://example.org', $expires);
- $this->assertTrue($success);
-
- $code = $storage->getAuthorizationCode('newcode');
- $this->assertNotNull($code);
- $this->assertArrayHasKey('authorization_code', $code);
- $this->assertArrayHasKey('client_id', $code);
- $this->assertArrayHasKey('user_id', $code);
- $this->assertArrayHasKey('redirect_uri', $code);
- $this->assertArrayHasKey('expires', $code);
- $this->assertEquals($code['authorization_code'], 'newcode');
- $this->assertEquals($code['client_id'], 'client ID2');
- $this->assertEquals($code['user_id'], 'SOMEOTHERID');
- $this->assertEquals($code['redirect_uri'], 'http://example.org');
- $this->assertEquals($code['expires'], $expires);
-
- // add new code with scope having an empty string value
- $expires = time() + 20;
- $success = $storage->setAuthorizationCode('newcode', 'client ID', 'SOMEUSERID', 'http://example.com', $expires, '');
- $this->assertTrue($success);
- }
-
- /** @dataProvider provideStorage */
- public function testExpireAccessToken(AccessTokenInterface $storage)
- {
- if ($storage instanceof NullStorage) {
- $this->markTestSkipped('Skipped Storage: ' . $storage->getMessage());
-
- return;
- }
-
- // create a valid code
- $expires = time() + 20;
- $success = $storage->setAuthorizationCode('code-to-expire', 'client ID', 'SOMEUSERID', 'http://example.com', time() + 20);
- $this->assertTrue($success);
-
- // verify the new code exists
- $code = $storage->getAuthorizationCode('code-to-expire');
- $this->assertNotNull($code);
-
- $this->assertArrayHasKey('authorization_code', $code);
- $this->assertEquals($code['authorization_code'], 'code-to-expire');
-
- // now expire the code and ensure it's no longer available
- $storage->expireAuthorizationCode('code-to-expire');
- $code = $storage->getAuthorizationCode('code-to-expire');
- $this->assertFalse($code);
- }
-}
diff --git a/library/oauth2/test/OAuth2/Storage/ClientCredentialsTest.php b/library/oauth2/test/OAuth2/Storage/ClientCredentialsTest.php
deleted file mode 100644
index 15289af30..000000000
--- a/library/oauth2/test/OAuth2/Storage/ClientCredentialsTest.php
+++ /dev/null
@@ -1,28 +0,0 @@
-<?php
-
-namespace OAuth2\Storage;
-
-class ClientCredentialsTest extends BaseTest
-{
- /** @dataProvider provideStorage */
- public function testCheckClientCredentials(ClientCredentialsInterface $storage)
- {
- if ($storage instanceof NullStorage) {
- $this->markTestSkipped('Skipped Storage: ' . $storage->getMessage());
-
- return;
- }
-
- // nonexistant client_id
- $pass = $storage->checkClientCredentials('fakeclient', 'testpass');
- $this->assertFalse($pass);
-
- // invalid password
- $pass = $storage->checkClientCredentials('oauth_test_client', 'invalidcredentials');
- $this->assertFalse($pass);
-
- // valid credentials
- $pass = $storage->checkClientCredentials('oauth_test_client', 'testpass');
- $this->assertTrue($pass);
- }
-}
diff --git a/library/oauth2/test/OAuth2/Storage/ClientTest.php b/library/oauth2/test/OAuth2/Storage/ClientTest.php
deleted file mode 100644
index 6a5cc0b49..000000000
--- a/library/oauth2/test/OAuth2/Storage/ClientTest.php
+++ /dev/null
@@ -1,110 +0,0 @@
-<?php
-
-namespace OAuth2\Storage;
-
-class ClientTest extends BaseTest
-{
- /** @dataProvider provideStorage */
- public function testGetClientDetails(ClientInterface $storage)
- {
- if ($storage instanceof NullStorage) {
- $this->markTestSkipped('Skipped Storage: ' . $storage->getMessage());
-
- return;
- }
-
- // nonexistant client_id
- $details = $storage->getClientDetails('fakeclient');
- $this->assertFalse($details);
-
- // valid client_id
- $details = $storage->getClientDetails('oauth_test_client');
- $this->assertNotNull($details);
- $this->assertArrayHasKey('client_id', $details);
- $this->assertArrayHasKey('client_secret', $details);
- $this->assertArrayHasKey('redirect_uri', $details);
- }
-
- /** @dataProvider provideStorage */
- public function testCheckRestrictedGrantType(ClientInterface $storage)
- {
- if ($storage instanceof NullStorage) {
- $this->markTestSkipped('Skipped Storage: ' . $storage->getMessage());
-
- return;
- }
-
- // Check invalid
- $pass = $storage->checkRestrictedGrantType('oauth_test_client', 'authorization_code');
- $this->assertFalse($pass);
-
- // Check valid
- $pass = $storage->checkRestrictedGrantType('oauth_test_client', 'implicit');
- $this->assertTrue($pass);
- }
-
- /** @dataProvider provideStorage */
- public function testGetAccessToken(ClientInterface $storage)
- {
- if ($storage instanceof NullStorage) {
- $this->markTestSkipped('Skipped Storage: ' . $storage->getMessage());
-
- return;
- }
-
- // nonexistant client_id
- $details = $storage->getAccessToken('faketoken');
- $this->assertFalse($details);
-
- // valid client_id
- $details = $storage->getAccessToken('testtoken');
- $this->assertNotNull($details);
- }
-
- /** @dataProvider provideStorage */
- public function testIsPublicClient(ClientInterface $storage)
- {
- if ($storage instanceof NullStorage) {
- $this->markTestSkipped('Skipped Storage: ' . $storage->getMessage());
-
- return;
- }
-
- $publicClientId = 'public-client-'.rand();
- $confidentialClientId = 'confidential-client-'.rand();
-
- // create a new client
- $success1 = $storage->setClientDetails($publicClientId, '');
- $success2 = $storage->setClientDetails($confidentialClientId, 'some-secret');
- $this->assertTrue($success1);
- $this->assertTrue($success2);
-
- // assert isPublicClient for both
- $this->assertTrue($storage->isPublicClient($publicClientId));
- $this->assertFalse($storage->isPublicClient($confidentialClientId));
- }
-
- /** @dataProvider provideStorage */
- public function testSaveClient(ClientInterface $storage)
- {
- if ($storage instanceof NullStorage) {
- $this->markTestSkipped('Skipped Storage: ' . $storage->getMessage());
-
- return;
- }
-
- $clientId = 'some-client-'.rand();
-
- // create a new client
- $success = $storage->setClientDetails($clientId, 'somesecret', 'http://test.com', 'client_credentials', 'clientscope1', 'brent@brentertainment.com');
- $this->assertTrue($success);
-
- // valid client_id
- $details = $storage->getClientDetails($clientId);
- $this->assertEquals($details['client_secret'], 'somesecret');
- $this->assertEquals($details['redirect_uri'], 'http://test.com');
- $this->assertEquals($details['grant_types'], 'client_credentials');
- $this->assertEquals($details['scope'], 'clientscope1');
- $this->assertEquals($details['user_id'], 'brent@brentertainment.com');
- }
-}
diff --git a/library/oauth2/test/OAuth2/Storage/DynamoDBTest.php b/library/oauth2/test/OAuth2/Storage/DynamoDBTest.php
deleted file mode 100644
index 2147f0914..000000000
--- a/library/oauth2/test/OAuth2/Storage/DynamoDBTest.php
+++ /dev/null
@@ -1,40 +0,0 @@
-<?php
-
-namespace OAuth2\Storage;
-
-class DynamoDBTest extends BaseTest
-{
- public function testGetDefaultScope()
- {
- $client = $this->getMockBuilder('\Aws\DynamoDb\DynamoDbClient')
- ->disableOriginalConstructor()
- ->setMethods(array('query'))
- ->getMock();
-
- $return = $this->getMockBuilder('\Guzzle\Service\Resource\Model')
- ->setMethods(array('count', 'toArray'))
- ->getMock();
-
- $data = array(
- 'Items' => array(),
- 'Count' => 0,
- 'ScannedCount'=> 0
- );
-
- $return->expects($this->once())
- ->method('count')
- ->will($this->returnValue(count($data)));
-
- $return->expects($this->once())
- ->method('toArray')
- ->will($this->returnValue($data));
-
- // should return null default scope if none is set in database
- $client->expects($this->once())
- ->method('query')
- ->will($this->returnValue($return));
-
- $storage = new DynamoDB($client);
- $this->assertNull($storage->getDefaultScope());
- }
-}
diff --git a/library/oauth2/test/OAuth2/Storage/JwtAccessTokenTest.php b/library/oauth2/test/OAuth2/Storage/JwtAccessTokenTest.php
deleted file mode 100644
index a6acbea1f..000000000
--- a/library/oauth2/test/OAuth2/Storage/JwtAccessTokenTest.php
+++ /dev/null
@@ -1,41 +0,0 @@
-<?php
-
-namespace OAuth2\Storage;
-
-use OAuth2\Encryption\Jwt;
-
-class JwtAccessTokenTest extends BaseTest
-{
- /** @dataProvider provideStorage */
- public function testSetAccessToken($storage)
- {
- if (!$storage instanceof PublicKey) {
- // incompatible storage
- return;
- }
-
- $crypto = new jwtAccessToken($storage);
-
- $publicKeyStorage = Bootstrap::getInstance()->getMemoryStorage();
- $encryptionUtil = new Jwt();
-
- $jwtAccessToken = array(
- 'access_token' => rand(),
- 'expires' => time() + 100,
- 'scope' => 'foo',
- );
-
- $token = $encryptionUtil->encode($jwtAccessToken, $storage->getPrivateKey(), $storage->getEncryptionAlgorithm());
-
- $this->assertNotNull($token);
-
- $tokenData = $crypto->getAccessToken($token);
-
- $this->assertTrue(is_array($tokenData));
-
- /* assert the decoded token is the same */
- $this->assertEquals($tokenData['access_token'], $jwtAccessToken['access_token']);
- $this->assertEquals($tokenData['expires'], $jwtAccessToken['expires']);
- $this->assertEquals($tokenData['scope'], $jwtAccessToken['scope']);
- }
-}
diff --git a/library/oauth2/test/OAuth2/Storage/JwtBearerTest.php b/library/oauth2/test/OAuth2/Storage/JwtBearerTest.php
deleted file mode 100644
index d0ab9b899..000000000
--- a/library/oauth2/test/OAuth2/Storage/JwtBearerTest.php
+++ /dev/null
@@ -1,25 +0,0 @@
-<?php
-
-namespace OAuth2\Storage;
-
-class JwtBearerTest extends BaseTest
-{
- /** @dataProvider provideStorage */
- public function testGetClientKey(JwtBearerInterface $storage)
- {
- if ($storage instanceof NullStorage) {
- $this->markTestSkipped('Skipped Storage: ' . $storage->getMessage());
-
- return;
- }
-
- // nonexistant client_id
- $key = $storage->getClientKey('this-is-not-real', 'nor-is-this');
- $this->assertFalse($key);
-
- // valid client_id and subject
- $key = $storage->getClientKey('oauth_test_client', 'test_subject');
- $this->assertNotNull($key);
- $this->assertEquals($key, Bootstrap::getInstance()->getTestPublicKey());
- }
-}
diff --git a/library/oauth2/test/OAuth2/Storage/PdoTest.php b/library/oauth2/test/OAuth2/Storage/PdoTest.php
deleted file mode 100644
index 57eb39072..000000000
--- a/library/oauth2/test/OAuth2/Storage/PdoTest.php
+++ /dev/null
@@ -1,39 +0,0 @@
-<?php
-
-namespace OAuth2\Storage;
-
-class PdoTest extends BaseTest
-{
- public function testCreatePdoStorageUsingPdoClass()
- {
- $pdo = new \PDO(sprintf('sqlite://%s', Bootstrap::getInstance()->getSqliteDir()));
- $storage = new Pdo($pdo);
-
- $this->assertNotNull($storage->getClientDetails('oauth_test_client'));
- }
-
- public function testCreatePdoStorageUsingDSN()
- {
- $dsn = sprintf('sqlite://%s', Bootstrap::getInstance()->getSqliteDir());
- $storage = new Pdo($dsn);
-
- $this->assertNotNull($storage->getClientDetails('oauth_test_client'));
- }
-
- public function testCreatePdoStorageUsingConfig()
- {
- $config = array('dsn' => sprintf('sqlite://%s', Bootstrap::getInstance()->getSqliteDir()));
- $storage = new Pdo($config);
-
- $this->assertNotNull($storage->getClientDetails('oauth_test_client'));
- }
-
- /**
- * @expectedException InvalidArgumentException dsn
- */
- public function testCreatePdoStorageWithoutDSNThrowsException()
- {
- $config = array('username' => 'brent', 'password' => 'brentisaballer');
- $storage = new Pdo($config);
- }
-}
diff --git a/library/oauth2/test/OAuth2/Storage/PublicKeyTest.php b/library/oauth2/test/OAuth2/Storage/PublicKeyTest.php
deleted file mode 100644
index f85195870..000000000
--- a/library/oauth2/test/OAuth2/Storage/PublicKeyTest.php
+++ /dev/null
@@ -1,29 +0,0 @@
-<?php
-
-namespace OAuth2\Storage;
-
-class PublicKeyTest extends BaseTest
-{
- /** @dataProvider provideStorage */
- public function testSetAccessToken($storage)
- {
- if ($storage instanceof NullStorage) {
- $this->markTestSkipped('Skipped Storage: ' . $storage->getMessage());
-
- return;
- }
-
- if (!$storage instanceof PublicKeyInterface) {
- // incompatible storage
- return;
- }
-
- $configDir = Bootstrap::getInstance()->getConfigDir();
- $globalPublicKey = file_get_contents($configDir.'/keys/id_rsa.pub');
- $globalPrivateKey = file_get_contents($configDir.'/keys/id_rsa');
-
- /* assert values from storage */
- $this->assertEquals($storage->getPublicKey(), $globalPublicKey);
- $this->assertEquals($storage->getPrivateKey(), $globalPrivateKey);
- }
-}
diff --git a/library/oauth2/test/OAuth2/Storage/RefreshTokenTest.php b/library/oauth2/test/OAuth2/Storage/RefreshTokenTest.php
deleted file mode 100644
index 314c93195..000000000
--- a/library/oauth2/test/OAuth2/Storage/RefreshTokenTest.php
+++ /dev/null
@@ -1,41 +0,0 @@
-<?php
-
-namespace OAuth2\Storage;
-
-class RefreshTokenTest extends BaseTest
-{
- /** @dataProvider provideStorage */
- public function testSetRefreshToken(RefreshTokenInterface $storage)
- {
- if ($storage instanceof NullStorage) {
- $this->markTestSkipped('Skipped Storage: ' . $storage->getMessage());
-
- return;
- }
-
- // assert token we are about to add does not exist
- $token = $storage->getRefreshToken('refreshtoken');
- $this->assertFalse($token);
-
- // add new token
- $expires = time() + 20;
- $success = $storage->setRefreshToken('refreshtoken', 'client ID', 'SOMEUSERID', $expires);
- $this->assertTrue($success);
-
- $token = $storage->getRefreshToken('refreshtoken');
- $this->assertNotNull($token);
- $this->assertArrayHasKey('refresh_token', $token);
- $this->assertArrayHasKey('client_id', $token);
- $this->assertArrayHasKey('user_id', $token);
- $this->assertArrayHasKey('expires', $token);
- $this->assertEquals($token['refresh_token'], 'refreshtoken');
- $this->assertEquals($token['client_id'], 'client ID');
- $this->assertEquals($token['user_id'], 'SOMEUSERID');
- $this->assertEquals($token['expires'], $expires);
-
- // add token with scope having an empty string value
- $expires = time() + 20;
- $success = $storage->setRefreshToken('refreshtoken2', 'client ID', 'SOMEUSERID', $expires, '');
- $this->assertTrue($success);
- }
-}
diff --git a/library/oauth2/test/OAuth2/Storage/ScopeTest.php b/library/oauth2/test/OAuth2/Storage/ScopeTest.php
deleted file mode 100644
index fd1edeb93..000000000
--- a/library/oauth2/test/OAuth2/Storage/ScopeTest.php
+++ /dev/null
@@ -1,53 +0,0 @@
-<?php
-
-namespace OAuth2\Storage;
-
-use OAuth2\Scope;
-
-class ScopeTest extends BaseTest
-{
- /** @dataProvider provideStorage */
- public function testScopeExists($storage)
- {
- if ($storage instanceof NullStorage) {
- $this->markTestSkipped('Skipped Storage: ' . $storage->getMessage());
-
- return;
- }
-
- if (!$storage instanceof ScopeInterface) {
- // incompatible storage
- return;
- }
-
- //Test getting scopes
- $scopeUtil = new Scope($storage);
- $this->assertTrue($scopeUtil->scopeExists('supportedscope1'));
- $this->assertTrue($scopeUtil->scopeExists('supportedscope1 supportedscope2 supportedscope3'));
- $this->assertFalse($scopeUtil->scopeExists('fakescope'));
- $this->assertFalse($scopeUtil->scopeExists('supportedscope1 supportedscope2 supportedscope3 fakescope'));
- }
-
- /** @dataProvider provideStorage */
- public function testGetDefaultScope($storage)
- {
- if ($storage instanceof NullStorage) {
- $this->markTestSkipped('Skipped Storage: ' . $storage->getMessage());
-
- return;
- }
-
- if (!$storage instanceof ScopeInterface) {
- // incompatible storage
- return;
- }
-
- // test getting default scope
- $scopeUtil = new Scope($storage);
- $expected = explode(' ', $scopeUtil->getDefaultScope());
- $actual = explode(' ', 'defaultscope1 defaultscope2');
- sort($expected);
- sort($actual);
- $this->assertEquals($expected, $actual);
- }
-}
diff --git a/library/oauth2/test/OAuth2/Storage/UserCredentialsTest.php b/library/oauth2/test/OAuth2/Storage/UserCredentialsTest.php
deleted file mode 100644
index 65655a6b2..000000000
--- a/library/oauth2/test/OAuth2/Storage/UserCredentialsTest.php
+++ /dev/null
@@ -1,40 +0,0 @@
-<?php
-
-namespace OAuth2\Storage;
-
-class UserCredentialsTest extends BaseTest
-{
- /** @dataProvider provideStorage */
- public function testCheckUserCredentials(UserCredentialsInterface $storage)
- {
- if ($storage instanceof NullStorage) {
- $this->markTestSkipped('Skipped Storage: ' . $storage->getMessage());
-
- return;
- }
-
- // create a new user for testing
- $success = $storage->setUser('testusername', 'testpass', 'Test', 'User');
- $this->assertTrue($success);
-
- // correct credentials
- $this->assertTrue($storage->checkUserCredentials('testusername', 'testpass'));
- // invalid password
- $this->assertFalse($storage->checkUserCredentials('testusername', 'fakepass'));
- // invalid username
- $this->assertFalse($storage->checkUserCredentials('fakeusername', 'testpass'));
-
- // invalid username
- $this->assertFalse($storage->getUserDetails('fakeusername'));
-
- // ensure all properties are set
- $user = $storage->getUserDetails('testusername');
- $this->assertTrue($user !== false);
- $this->assertArrayHasKey('user_id', $user);
- $this->assertArrayHasKey('first_name', $user);
- $this->assertArrayHasKey('last_name', $user);
- $this->assertEquals($user['user_id'], 'testusername');
- $this->assertEquals($user['first_name'], 'Test');
- $this->assertEquals($user['last_name'], 'User');
- }
-}
diff --git a/library/oauth2/test/OAuth2/TokenType/BearerTest.php b/library/oauth2/test/OAuth2/TokenType/BearerTest.php
deleted file mode 100644
index a2e000e22..000000000
--- a/library/oauth2/test/OAuth2/TokenType/BearerTest.php
+++ /dev/null
@@ -1,58 +0,0 @@
-<?php
-
-namespace OAuth2\TokenType;
-
-use OAuth2\Request\TestRequest;
-use OAuth2\Response;
-
-class BearerTest extends \PHPUnit_Framework_TestCase
-{
- public function testValidContentTypeWithCharset()
- {
- $bearer = new Bearer();
- $request = TestRequest::createPost(array(
- 'access_token' => 'ThisIsMyAccessToken'
- ));
- $request->server['CONTENT_TYPE'] = 'application/x-www-form-urlencoded; charset=UTF-8';
-
- $param = $bearer->getAccessTokenParameter($request, $response = new Response());
- $this->assertEquals($param, 'ThisIsMyAccessToken');
- }
-
- public function testInvalidContentType()
- {
- $bearer = new Bearer();
- $request = TestRequest::createPost(array(
- 'access_token' => 'ThisIsMyAccessToken'
- ));
- $request->server['CONTENT_TYPE'] = 'application/json; charset=UTF-8';
-
- $param = $bearer->getAccessTokenParameter($request, $response = new Response());
- $this->assertNull($param);
- $this->assertEquals($response->getStatusCode(), 400);
- $this->assertEquals($response->getParameter('error'), 'invalid_request');
- $this->assertEquals($response->getParameter('error_description'), 'The content type for POST requests must be "application/x-www-form-urlencoded"');
- }
-
- public function testValidRequestUsingAuthorizationHeader()
- {
- $bearer = new Bearer();
- $request = new TestRequest();
- $request->headers['AUTHORIZATION'] = 'Bearer MyToken';
- $request->server['CONTENT_TYPE'] = 'application/x-www-form-urlencoded; charset=UTF-8';
-
- $param = $bearer->getAccessTokenParameter($request, $response = new Response());
- $this->assertEquals('MyToken', $param);
- }
-
- public function testValidRequestUsingAuthorizationHeaderCaseInsensitive()
- {
- $bearer = new Bearer();
- $request = new TestRequest();
- $request->server['CONTENT_TYPE'] = 'application/x-www-form-urlencoded; charset=UTF-8';
- $request->headers['Authorization'] = 'Bearer MyToken';
-
- $param = $bearer->getAccessTokenParameter($request, $response = new Response());
- $this->assertEquals('MyToken', $param);
- }
-}
diff --git a/library/oauth2/test/bootstrap.php b/library/oauth2/test/bootstrap.php
deleted file mode 100644
index 0a4af0716..000000000
--- a/library/oauth2/test/bootstrap.php
+++ /dev/null
@@ -1,12 +0,0 @@
-<?php
-
-require_once(dirname(__FILE__).'/../src/OAuth2/Autoloader.php');
-OAuth2\Autoloader::register();
-
-// register test classes
-OAuth2\Autoloader::register(dirname(__FILE__).'/lib');
-
-// register vendors if possible
-if (file_exists(__DIR__.'/../vendor/autoload.php')) {
- require_once(__DIR__.'/../vendor/autoload.php');
-}
diff --git a/library/oauth2/test/cleanup.php b/library/oauth2/test/cleanup.php
deleted file mode 100644
index 8663a901b..000000000
--- a/library/oauth2/test/cleanup.php
+++ /dev/null
@@ -1,15 +0,0 @@
-<?php
-
-require_once(dirname(__FILE__).'/../src/OAuth2/Autoloader.php');
-OAuth2\Autoloader::register();
-
-// register test classes
-OAuth2\Autoloader::register(dirname(__FILE__).'/lib');
-
-// register vendors if possible
-if (file_exists(__DIR__.'/../vendor/autoload.php')) {
- require_once(__DIR__.'/../vendor/autoload.php');
-}
-
-// remove the dynamoDB database that was created for this build
-OAuth2\Storage\Bootstrap::getInstance()->cleanupTravisDynamoDb();
diff --git a/library/oauth2/test/config/keys/id_rsa b/library/oauth2/test/config/keys/id_rsa
deleted file mode 100644
index e8b9eff2d..000000000
--- a/library/oauth2/test/config/keys/id_rsa
+++ /dev/null
@@ -1,15 +0,0 @@
------BEGIN RSA PRIVATE KEY-----
-MIICXQIBAAKBgQC8fpi06NfVYHAOAnxNMVnTXr/ptsLsNjP+uAt2eO0cc5J9H5XV
-8lFVujOrRu/JWi1TDmAvOaf/6A3BphIA1Pwp0AAqlZdwizIum8j0KzpsGYH5qReN
-QDwF3oUSKMsQCCGCDHrDYifG/pRi9bN1ZVjEXPr35HJuBe+FQpZTs8DewwIDAQAB
-AoGARfNxNknmtx/n1bskZ/01iZRzAge6BLEE0LV6Q4gS7mkRZu/Oyiv39Sl5vUlA
-+WdGxLjkBwKNjxGN8Vxw9/ASd8rSsqeAUYIwAeifXrHhj5DBPQT/pDPkeFnp9B1w
-C6jo+3AbBQ4/b0ONSIEnCL2xGGglSIAxO17T1ViXp7lzXPECQQDe63nkRdWM0OCb
-oaHQPT3E26224maIstrGFUdt9yw3yJf4bOF7TtiPLlLuHsTTge3z+fG6ntC0xG56
-1cl37C3ZAkEA2HdVcRGugNp/qmVz4LJTpD+WZKi73PLAO47wDOrYh9Pn2I6fcEH0
-CPnggt1ko4ujvGzFTvRH64HXa6aPCv1j+wJBAMQMah3VQPNf/DlDVFEUmw9XeBZg
-VHaifX851aEjgXLp6qVj9IYCmLiLsAmVa9rr6P7p8asD418nZlaHUHE0eDkCQQCr
-uxis6GMx1Ka971jcJX2X696LoxXPd0KsvXySMupv79yagKPa8mgBiwPjrnK+EPVo
-cj6iochA/bSCshP/mwFrAkBHEKPi6V6gb94JinCT7x3weahbdp6bJ6/nzBH/p9VA
-HoT1JtwNFhGv9BCjmDydshQHfSWpY9NxlccBKL7ITm8R
------END RSA PRIVATE KEY----- \ No newline at end of file
diff --git a/library/oauth2/test/config/keys/id_rsa.pub b/library/oauth2/test/config/keys/id_rsa.pub
deleted file mode 100644
index 1ac15f5eb..000000000
--- a/library/oauth2/test/config/keys/id_rsa.pub
+++ /dev/null
@@ -1,16 +0,0 @@
------BEGIN CERTIFICATE-----
-MIICiDCCAfGgAwIBAgIBADANBgkqhkiG9w0BAQQFADA9MQswCQYDVQQGEwJVUzEL
-MAkGA1UECBMCVVQxITAfBgNVBAoTGFZpZ25ldHRlIENvcnBvcmF0aW9uIFNCWDAe
-Fw0xMTEwMTUwMzE4MjdaFw0zMTEwMTAwMzE4MjdaMD0xCzAJBgNVBAYTAlVTMQsw
-CQYDVQQIEwJVVDEhMB8GA1UEChMYVmlnbmV0dGUgQ29ycG9yYXRpb24gU0JYMIGf
-MA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC8fpi06NfVYHAOAnxNMVnTXr/ptsLs
-NjP+uAt2eO0cc5J9H5XV8lFVujOrRu/JWi1TDmAvOaf/6A3BphIA1Pwp0AAqlZdw
-izIum8j0KzpsGYH5qReNQDwF3oUSKMsQCCGCDHrDYifG/pRi9bN1ZVjEXPr35HJu
-Be+FQpZTs8DewwIDAQABo4GXMIGUMB0GA1UdDgQWBBRe8hrEXm+Yim4YlD5Nx+1K
-vCYs9DBlBgNVHSMEXjBcgBRe8hrEXm+Yim4YlD5Nx+1KvCYs9KFBpD8wPTELMAkG
-A1UEBhMCVVMxCzAJBgNVBAgTAlVUMSEwHwYDVQQKExhWaWduZXR0ZSBDb3Jwb3Jh
-dGlvbiBTQliCAQAwDAYDVR0TBAUwAwEB/zANBgkqhkiG9w0BAQQFAAOBgQBjhyRD
-lM7vnLn6drgQVftW5V9nDFAyPAuiGvMIKFSbiAf1PxXCRn5sfJquwWKsJUi4ZGNl
-aViXdFmN6/F13PSM+yg63tpKy0fYqMbTM+Oe5WuSHkSW1VuYNHV+24adgNk/FRDL
-FRrlM1f6s9VTLWvwGItjfrof0Ba8Uq7ZDSb9Xg==
------END CERTIFICATE----- \ No newline at end of file
diff --git a/library/oauth2/test/config/storage.json b/library/oauth2/test/config/storage.json
deleted file mode 100644
index a31d3bca2..000000000
--- a/library/oauth2/test/config/storage.json
+++ /dev/null
@@ -1,181 +0,0 @@
-{
- "authorization_codes": {
- "testcode": {
- "client_id": "Test Client ID",
- "user_id": "",
- "redirect_uri": "",
- "expires": "9999999999",
- "id_token": "IDTOKEN"
- },
- "testcode-with-scope": {
- "client_id": "Test Client ID",
- "user_id": "",
- "redirect_uri": "",
- "expires": "9999999999",
- "scope": "scope1 scope2"
- },
- "testcode-expired": {
- "client_id": "Test Client ID",
- "user_id": "",
- "redirect_uri": "",
- "expires": "1356998400"
- },
- "testcode-empty-secret": {
- "client_id": "Test Client ID Empty Secret",
- "user_id": "",
- "redirect_uri": "",
- "expires": "9999999999"
- },
- "testcode-openid": {
- "client_id": "Test Client ID",
- "user_id": "",
- "redirect_uri": "",
- "expires": "9999999999",
- "id_token": "test_id_token"
- }
- },
- "client_credentials" : {
- "Test Client ID": {
- "client_secret": "TestSecret"
- },
- "Test Client ID with Redirect Uri": {
- "client_secret": "TestSecret2",
- "redirect_uri": "http://brentertainment.com"
- },
- "Test Client ID with Buggy Redirect Uri": {
- "client_secret": "TestSecret2",
- "redirect_uri": " http://brentertainment.com"
- },
- "Test Client ID with Multiple Redirect Uris": {
- "client_secret": "TestSecret3",
- "redirect_uri": "http://brentertainment.com http://morehazards.com"
- },
- "Test Client ID with Redirect Uri Parts": {
- "client_secret": "TestSecret4",
- "redirect_uri": "http://user:pass@brentertainment.com:2222/authorize/cb?auth_type=oauth&test=true"
- },
- "Test Some Other Client": {
- "client_secret": "TestSecret3"
- },
- "Test Client ID Empty Secret": {
- "client_secret": ""
- },
- "Test Client ID For Password Grant": {
- "grant_types": "password",
- "client_secret": ""
- },
- "Client ID With User ID": {
- "client_secret": "TestSecret",
- "user_id": "brent@brentertainment.com"
- },
- "oauth_test_client": {
- "client_secret": "testpass",
- "grant_types": "implicit password"
- }
- },
- "user_credentials" : {
- "test-username": {
- "password": "testpass"
- },
- "testusername": {
- "password": "testpass"
- },
- "testuser": {
- "password": "password",
- "email": "testuser@test.com",
- "email_verified": true
- },
- "johndoe": {
- "password": "password"
- }
- },
- "refresh_tokens" : {
- "test-refreshtoken": {
- "refresh_token": "test-refreshtoken",
- "client_id": "Test Client ID",
- "user_id": "test-username",
- "expires": 0,
- "scope": null
- },
- "test-refreshtoken-with-scope": {
- "refresh_token": "test-refreshtoken",
- "client_id": "Test Client ID",
- "user_id": "test-username",
- "expires": 0,
- "scope": "scope1 scope2"
- }
- },
- "access_tokens" : {
- "accesstoken-expired": {
- "access_token": "accesstoken-expired",
- "client_id": "Test Client ID",
- "expires": 1234567,
- "scope": null
- },
- "accesstoken-scope": {
- "access_token": "accesstoken-scope",
- "client_id": "Test Client ID",
- "expires": 99999999900,
- "scope": "testscope"
- },
- "accesstoken-openid-connect": {
- "access_token": "accesstoken-openid-connect",
- "client_id": "Test Client ID",
- "user_id": "testuser",
- "expires": 99999999900,
- "scope": "openid email"
- },
- "accesstoken-malformed": {
- "access_token": "accesstoken-mallformed",
- "expires": 99999999900,
- "scope": "testscope"
- }
- },
- "jwt": {
- "Test Client ID": {
- "key": "-----BEGIN PUBLIC KEY-----\nMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC5/SxVlE8gnpFqCxgl2wjhzY7u\ncEi00s0kUg3xp7lVEvgLgYcAnHiWp+gtSjOFfH2zsvpiWm6Lz5f743j/FEzHIO1o\nwR0p4d9pOaJK07d01+RzoQLOIQAgXrr4T1CCWUesncwwPBVCyy2Mw3Nmhmr9MrF8\nUlvdRKBxriRnlP3qJQIDAQAB\n-----END PUBLIC KEY-----",
- "subject": "testuser@ourdomain.com"
- },
- "Test Client ID PHP-5.2": {
- "key": "mysecretkey",
- "subject": "testuser@ourdomain.com"
- },
- "Missing Key Client": {
- "key": null,
- "subject": "testuser@ourdomain.com"
- },
- "Missing Key Client PHP-5.2": {
- "key": null,
- "subject": "testuser@ourdomain.com"
- },
- "oauth_test_client": {
- "key": "-----BEGIN CERTIFICATE-----\nMIICiDCCAfGgAwIBAgIBADANBgkqhkiG9w0BAQQFADA9MQswCQYDVQQGEwJVUzEL\nMAkGA1UECBMCVVQxITAfBgNVBAoTGFZpZ25ldHRlIENvcnBvcmF0aW9uIFNCWDAe\nFw0xMTEwMTUwMzE4MjdaFw0zMTEwMTAwMzE4MjdaMD0xCzAJBgNVBAYTAlVTMQsw\nCQYDVQQIEwJVVDEhMB8GA1UEChMYVmlnbmV0dGUgQ29ycG9yYXRpb24gU0JYMIGf\nMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC8fpi06NfVYHAOAnxNMVnTXr/ptsLs\nNjP+uAt2eO0cc5J9H5XV8lFVujOrRu/JWi1TDmAvOaf/6A3BphIA1Pwp0AAqlZdw\nizIum8j0KzpsGYH5qReNQDwF3oUSKMsQCCGCDHrDYifG/pRi9bN1ZVjEXPr35HJu\nBe+FQpZTs8DewwIDAQABo4GXMIGUMB0GA1UdDgQWBBRe8hrEXm+Yim4YlD5Nx+1K\nvCYs9DBlBgNVHSMEXjBcgBRe8hrEXm+Yim4YlD5Nx+1KvCYs9KFBpD8wPTELMAkG\nA1UEBhMCVVMxCzAJBgNVBAgTAlVUMSEwHwYDVQQKExhWaWduZXR0ZSBDb3Jwb3Jh\ndGlvbiBTQliCAQAwDAYDVR0TBAUwAwEB/zANBgkqhkiG9w0BAQQFAAOBgQBjhyRD\nlM7vnLn6drgQVftW5V9nDFAyPAuiGvMIKFSbiAf1PxXCRn5sfJquwWKsJUi4ZGNl\naViXdFmN6/F13PSM+yg63tpKy0fYqMbTM+Oe5WuSHkSW1VuYNHV+24adgNk/FRDL\nFRrlM1f6s9VTLWvwGItjfrof0Ba8Uq7ZDSb9Xg==\n-----END CERTIFICATE-----",
- "subject": "test_subject"
- }
- },
- "jti": [
- {
- "issuer": "Test Client ID",
- "subject": "testuser@ourdomain.com",
- "audience": "http://myapp.com/oauth/auth",
- "expires": 99999999900,
- "jti": "used_jti"
- }
- ],
- "supported_scopes" : [
- "scope1",
- "scope2",
- "scope3",
- "clientscope1",
- "clientscope2",
- "clientscope3",
- "supportedscope1",
- "supportedscope2",
- "supportedscope3",
- "supportedscope4"
- ],
- "keys": {
- "public_key": "-----BEGIN CERTIFICATE-----\nMIICiDCCAfGgAwIBAgIBADANBgkqhkiG9w0BAQQFADA9MQswCQYDVQQGEwJVUzEL\nMAkGA1UECBMCVVQxITAfBgNVBAoTGFZpZ25ldHRlIENvcnBvcmF0aW9uIFNCWDAe\nFw0xMTEwMTUwMzE4MjdaFw0zMTEwMTAwMzE4MjdaMD0xCzAJBgNVBAYTAlVTMQsw\nCQYDVQQIEwJVVDEhMB8GA1UEChMYVmlnbmV0dGUgQ29ycG9yYXRpb24gU0JYMIGf\nMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC8fpi06NfVYHAOAnxNMVnTXr/ptsLs\nNjP+uAt2eO0cc5J9H5XV8lFVujOrRu/JWi1TDmAvOaf/6A3BphIA1Pwp0AAqlZdw\nizIum8j0KzpsGYH5qReNQDwF3oUSKMsQCCGCDHrDYifG/pRi9bN1ZVjEXPr35HJu\nBe+FQpZTs8DewwIDAQABo4GXMIGUMB0GA1UdDgQWBBRe8hrEXm+Yim4YlD5Nx+1K\nvCYs9DBlBgNVHSMEXjBcgBRe8hrEXm+Yim4YlD5Nx+1KvCYs9KFBpD8wPTELMAkG\nA1UEBhMCVVMxCzAJBgNVBAgTAlVUMSEwHwYDVQQKExhWaWduZXR0ZSBDb3Jwb3Jh\ndGlvbiBTQliCAQAwDAYDVR0TBAUwAwEB/zANBgkqhkiG9w0BAQQFAAOBgQBjhyRD\nlM7vnLn6drgQVftW5V9nDFAyPAuiGvMIKFSbiAf1PxXCRn5sfJquwWKsJUi4ZGNl\naViXdFmN6/F13PSM+yg63tpKy0fYqMbTM+Oe5WuSHkSW1VuYNHV+24adgNk/FRDL\nFRrlM1f6s9VTLWvwGItjfrof0Ba8Uq7ZDSb9Xg==\n-----END CERTIFICATE-----",
- "private_key": "-----BEGIN RSA PRIVATE KEY-----\nMIICXQIBAAKBgQC8fpi06NfVYHAOAnxNMVnTXr/ptsLsNjP+uAt2eO0cc5J9H5XV\n8lFVujOrRu/JWi1TDmAvOaf/6A3BphIA1Pwp0AAqlZdwizIum8j0KzpsGYH5qReN\nQDwF3oUSKMsQCCGCDHrDYifG/pRi9bN1ZVjEXPr35HJuBe+FQpZTs8DewwIDAQAB\nAoGARfNxNknmtx/n1bskZ/01iZRzAge6BLEE0LV6Q4gS7mkRZu/Oyiv39Sl5vUlA\n+WdGxLjkBwKNjxGN8Vxw9/ASd8rSsqeAUYIwAeifXrHhj5DBPQT/pDPkeFnp9B1w\nC6jo+3AbBQ4/b0ONSIEnCL2xGGglSIAxO17T1ViXp7lzXPECQQDe63nkRdWM0OCb\noaHQPT3E26224maIstrGFUdt9yw3yJf4bOF7TtiPLlLuHsTTge3z+fG6ntC0xG56\n1cl37C3ZAkEA2HdVcRGugNp/qmVz4LJTpD+WZKi73PLAO47wDOrYh9Pn2I6fcEH0\nCPnggt1ko4ujvGzFTvRH64HXa6aPCv1j+wJBAMQMah3VQPNf/DlDVFEUmw9XeBZg\nVHaifX851aEjgXLp6qVj9IYCmLiLsAmVa9rr6P7p8asD418nZlaHUHE0eDkCQQCr\nuxis6GMx1Ka971jcJX2X696LoxXPd0KsvXySMupv79yagKPa8mgBiwPjrnK+EPVo\ncj6iochA/bSCshP/mwFrAkBHEKPi6V6gb94JinCT7x3weahbdp6bJ6/nzBH/p9VA\nHoT1JtwNFhGv9BCjmDydshQHfSWpY9NxlccBKL7ITm8R\n-----END RSA PRIVATE KEY-----"
- }
-}
diff --git a/library/oauth2/test/lib/OAuth2/Request/TestRequest.php b/library/oauth2/test/lib/OAuth2/Request/TestRequest.php
deleted file mode 100644
index 7bbce28a4..000000000
--- a/library/oauth2/test/lib/OAuth2/Request/TestRequest.php
+++ /dev/null
@@ -1,61 +0,0 @@
-<?php
-
-namespace OAuth2\Request;
-
-use OAuth2\Request;
-use OAuth2\RequestInterface;
-
-/**
-*
-*/
-class TestRequest extends Request implements RequestInterface
-{
- public $query, $request, $server, $headers;
-
- public function __construct()
- {
- $this->query = $_GET;
- $this->request = $_POST;
- $this->server = $_SERVER;
- $this->headers = array();
- }
-
- public function query($name, $default = null)
- {
- return isset($this->query[$name]) ? $this->query[$name] : $default;
- }
-
- public function request($name, $default = null)
- {
- return isset($this->request[$name]) ? $this->request[$name] : $default;
- }
-
- public function server($name, $default = null)
- {
- return isset($this->server[$name]) ? $this->server[$name] : $default;
- }
-
- public function getAllQueryParameters()
- {
- return $this->query;
- }
-
- public function setQuery(array $query)
- {
- $this->query = $query;
- }
-
- public function setPost(array $params)
- {
- $this->server['REQUEST_METHOD'] = 'POST';
- $this->request = $params;
- }
-
- public static function createPost(array $params = array())
- {
- $request = new self();
- $request->setPost($params);
-
- return $request;
- }
-}
diff --git a/library/oauth2/test/lib/OAuth2/Storage/BaseTest.php b/library/oauth2/test/lib/OAuth2/Storage/BaseTest.php
deleted file mode 100755
index 921d52500..000000000
--- a/library/oauth2/test/lib/OAuth2/Storage/BaseTest.php
+++ /dev/null
@@ -1,34 +0,0 @@
-<?php
-
-namespace OAuth2\Storage;
-
-abstract class BaseTest extends \PHPUnit_Framework_TestCase
-{
- public function provideStorage()
- {
- $memory = Bootstrap::getInstance()->getMemoryStorage();
- $sqlite = Bootstrap::getInstance()->getSqlitePdo();
- $mysql = Bootstrap::getInstance()->getMysqlPdo();
- $postgres = Bootstrap::getInstance()->getPostgresPdo();
- $mongo = Bootstrap::getInstance()->getMongo();
- $redis = Bootstrap::getInstance()->getRedisStorage();
- $cassandra = Bootstrap::getInstance()->getCassandraStorage();
- $dynamodb = Bootstrap::getInstance()->getDynamoDbStorage();
- $couchbase = Bootstrap::getInstance()->getCouchbase();
-
- /* hack until we can fix "default_scope" dependencies in other tests */
- $memory->defaultScope = 'defaultscope1 defaultscope2';
-
- return array(
- array($memory),
- array($sqlite),
- array($mysql),
- array($postgres),
- array($mongo),
- array($redis),
- array($cassandra),
- array($dynamodb),
- array($couchbase),
- );
- }
-}
diff --git a/library/oauth2/test/lib/OAuth2/Storage/Bootstrap.php b/library/oauth2/test/lib/OAuth2/Storage/Bootstrap.php
deleted file mode 100755
index 4ac9022b1..000000000
--- a/library/oauth2/test/lib/OAuth2/Storage/Bootstrap.php
+++ /dev/null
@@ -1,888 +0,0 @@
-<?php
-
-namespace OAuth2\Storage;
-
-class Bootstrap
-{
- const DYNAMODB_PHP_VERSION = 'none';
-
- protected static $instance;
- private $mysql;
- private $sqlite;
- private $postgres;
- private $mongo;
- private $redis;
- private $cassandra;
- private $configDir;
- private $dynamodb;
- private $couchbase;
-
- public function __construct()
- {
- $this->configDir = __DIR__.'/../../../config';
- }
-
- public static function getInstance()
- {
- if (!self::$instance) {
- self::$instance = new self();
- }
-
- return self::$instance;
- }
-
- public function getSqlitePdo()
- {
- if (!$this->sqlite) {
- $this->removeSqliteDb();
- $pdo = new \PDO(sprintf('sqlite://%s', $this->getSqliteDir()));
- $pdo->setAttribute(\PDO::ATTR_ERRMODE, \PDO::ERRMODE_EXCEPTION);
- $this->createSqliteDb($pdo);
-
- $this->sqlite = new Pdo($pdo);
- }
-
- return $this->sqlite;
- }
-
- public function getPostgresPdo()
- {
- if (!$this->postgres) {
- if (in_array('pgsql', \PDO::getAvailableDrivers())) {
- $this->removePostgresDb();
- $this->createPostgresDb();
- if ($pdo = $this->getPostgresDriver()) {
- $pdo->setAttribute(\PDO::ATTR_ERRMODE, \PDO::ERRMODE_EXCEPTION);
- $this->populatePostgresDb($pdo);
- $this->postgres = new Pdo($pdo);
- }
- } else {
- $this->postgres = new NullStorage('Postgres', 'Missing postgres PDO extension.');
- }
- }
-
- return $this->postgres;
- }
-
- public function getPostgresDriver()
- {
- try {
- $pdo = new \PDO('pgsql:host=localhost;dbname=oauth2_server_php', 'postgres');
-
- return $pdo;
- } catch (\PDOException $e) {
- $this->postgres = new NullStorage('Postgres', $e->getMessage());
- }
- }
-
- public function getMemoryStorage()
- {
- return new Memory(json_decode(file_get_contents($this->configDir. '/storage.json'), true));
- }
-
- public function getRedisStorage()
- {
- if (!$this->redis) {
- if (class_exists('Predis\Client')) {
- $redis = new \Predis\Client();
- if ($this->testRedisConnection($redis)) {
- $redis->flushdb();
- $this->redis = new Redis($redis);
- $this->createRedisDb($this->redis);
- } else {
- $this->redis = new NullStorage('Redis', 'Unable to connect to redis server on port 6379');
- }
- } else {
- $this->redis = new NullStorage('Redis', 'Missing redis library. Please run "composer.phar require predis/predis:dev-master"');
- }
- }
-
- return $this->redis;
- }
-
- private function testRedisConnection(\Predis\Client $redis)
- {
- try {
- $redis->connect();
- } catch (\Predis\CommunicationException $exception) {
- // we were unable to connect to the redis server
- return false;
- }
-
- return true;
- }
-
- public function getMysqlPdo()
- {
- if (!$this->mysql) {
- $pdo = null;
- try {
- $pdo = new \PDO('mysql:host=localhost;', 'root');
- } catch (\PDOException $e) {
- $this->mysql = new NullStorage('MySQL', 'Unable to connect to MySQL on root@localhost');
- }
-
- if ($pdo) {
- $pdo->setAttribute(\PDO::ATTR_ERRMODE, \PDO::ERRMODE_EXCEPTION);
- $this->removeMysqlDb($pdo);
- $this->createMysqlDb($pdo);
-
- $this->mysql = new Pdo($pdo);
- }
- }
-
- return $this->mysql;
- }
-
- public function getMongo()
- {
- if (!$this->mongo) {
- $skipMongo = $this->getEnvVar('SKIP_MONGO_TESTS');
- if (!$skipMongo && class_exists('MongoClient')) {
- $mongo = new \MongoClient('mongodb://localhost:27017', array('connect' => false));
- if ($this->testMongoConnection($mongo)) {
- $db = $mongo->oauth2_server_php;
- $this->removeMongoDb($db);
- $this->createMongoDb($db);
-
- $this->mongo = new Mongo($db);
- } else {
- $this->mongo = new NullStorage('Mongo', 'Unable to connect to mongo server on "localhost:27017"');
- }
- } else {
- $this->mongo = new NullStorage('Mongo', 'Missing mongo php extension. Please install mongo.so');
- }
- }
-
- return $this->mongo;
- }
-
- private function testMongoConnection(\MongoClient $mongo)
- {
- try {
- $mongo->connect();
- } catch (\MongoConnectionException $e) {
- return false;
- }
-
- return true;
- }
-
- public function getCouchbase()
- {
- if (!$this->couchbase) {
- if ($this->getEnvVar('SKIP_COUCHBASE_TESTS')) {
- $this->couchbase = new NullStorage('Couchbase', 'Skipping Couchbase tests');
- } elseif (!class_exists('Couchbase')) {
- $this->couchbase = new NullStorage('Couchbase', 'Missing Couchbase php extension. Please install couchbase.so');
- } else {
- // round-about way to make sure couchbase is working
- // this is required because it throws a "floating point exception" otherwise
- $code = "new \Couchbase(array('localhost:8091'), '', '', 'auth', false);";
- $exec = sprintf('php -r "%s"', $code);
- $ret = exec($exec, $test, $var);
- if ($ret != 0) {
- $couchbase = new \Couchbase(array('localhost:8091'), '', '', 'auth', false);
- if ($this->testCouchbaseConnection($couchbase)) {
- $this->clearCouchbase($couchbase);
- $this->createCouchbaseDB($couchbase);
-
- $this->couchbase = new CouchbaseDB($couchbase);
- } else {
- $this->couchbase = new NullStorage('Couchbase', 'Unable to connect to Couchbase server on "localhost:8091"');
- }
- } else {
- $this->couchbase = new NullStorage('Couchbase', 'Error while trying to connect to Couchbase');
- }
- }
- }
-
- return $this->couchbase;
- }
-
- private function testCouchbaseConnection(\Couchbase $couchbase)
- {
- try {
- if (count($couchbase->getServers()) > 0) {
- return true;
- }
- } catch (\CouchbaseException $e) {
- return false;
- }
-
- return true;
- }
-
- public function getCassandraStorage()
- {
- if (!$this->cassandra) {
- if (class_exists('phpcassa\ColumnFamily')) {
- $cassandra = new \phpcassa\Connection\ConnectionPool('oauth2_test', array('127.0.0.1:9160'));
- if ($this->testCassandraConnection($cassandra)) {
- $this->removeCassandraDb();
- $this->cassandra = new Cassandra($cassandra);
- $this->createCassandraDb($this->cassandra);
- } else {
- $this->cassandra = new NullStorage('Cassandra', 'Unable to connect to cassandra server on "127.0.0.1:9160"');
- }
- } else {
- $this->cassandra = new NullStorage('Cassandra', 'Missing cassandra library. Please run "composer.phar require thobbs/phpcassa:dev-master"');
- }
- }
-
- return $this->cassandra;
- }
-
- private function testCassandraConnection(\phpcassa\Connection\ConnectionPool $cassandra)
- {
- try {
- new \phpcassa\SystemManager('localhost:9160');
- } catch (\Exception $e) {
- return false;
- }
-
- return true;
- }
-
- private function removeCassandraDb()
- {
- $sys = new \phpcassa\SystemManager('localhost:9160');
-
- try {
- $sys->drop_keyspace('oauth2_test');
- } catch (\cassandra\InvalidRequestException $e) {
-
- }
- }
-
- private function createCassandraDb(Cassandra $storage)
- {
- // create the cassandra keyspace and column family
- $sys = new \phpcassa\SystemManager('localhost:9160');
-
- $sys->create_keyspace('oauth2_test', array(
- "strategy_class" => \phpcassa\Schema\StrategyClass::SIMPLE_STRATEGY,
- "strategy_options" => array('replication_factor' => '1')
- ));
-
- $sys->create_column_family('oauth2_test', 'auth');
- $cassandra = new \phpcassa\Connection\ConnectionPool('oauth2_test', array('127.0.0.1:9160'));
- $cf = new \phpcassa\ColumnFamily($cassandra, 'auth');
-
- // populate the data
- $storage->setClientDetails("oauth_test_client", "testpass", "http://example.com", 'implicit password');
- $storage->setAccessToken("testtoken", "Some Client", '', time() + 1000);
- $storage->setAuthorizationCode("testcode", "Some Client", '', '', time() + 1000);
-
- $storage->setScope('supportedscope1 supportedscope2 supportedscope3 supportedscope4');
- $storage->setScope('defaultscope1 defaultscope2', null, 'default');
-
- $storage->setScope('clientscope1 clientscope2', 'Test Client ID');
- $storage->setScope('clientscope1 clientscope2', 'Test Client ID', 'default');
-
- $storage->setScope('clientscope1 clientscope2 clientscope3', 'Test Client ID 2');
- $storage->setScope('clientscope1 clientscope2', 'Test Client ID 2', 'default');
-
- $storage->setScope('clientscope1 clientscope2', 'Test Default Scope Client ID');
- $storage->setScope('clientscope1 clientscope2', 'Test Default Scope Client ID', 'default');
-
- $storage->setScope('clientscope1 clientscope2 clientscope3', 'Test Default Scope Client ID 2');
- $storage->setScope('clientscope3', 'Test Default Scope Client ID 2', 'default');
-
- $storage->setClientKey('oauth_test_client', $this->getTestPublicKey(), 'test_subject');
-
- $cf->insert("oauth_public_keys:ClientID_One", array('__data' => json_encode(array("public_key" => "client_1_public", "private_key" => "client_1_private", "encryption_algorithm" => "RS256"))));
- $cf->insert("oauth_public_keys:ClientID_Two", array('__data' => json_encode(array("public_key" => "client_2_public", "private_key" => "client_2_private", "encryption_algorithm" => "RS256"))));
- $cf->insert("oauth_public_keys:", array('__data' => json_encode(array("public_key" => $this->getTestPublicKey(), "private_key" => $this->getTestPrivateKey(), "encryption_algorithm" => "RS256"))));
-
- $cf->insert("oauth_users:testuser", array('__data' =>json_encode(array("password" => "password", "email" => "testuser@test.com", "email_verified" => true))));
-
- }
-
- private function createSqliteDb(\PDO $pdo)
- {
- $this->runPdoSql($pdo);
- }
-
- private function removeSqliteDb()
- {
- if (file_exists($this->getSqliteDir())) {
- unlink($this->getSqliteDir());
- }
- }
-
- private function createMysqlDb(\PDO $pdo)
- {
- $pdo->exec('CREATE DATABASE oauth2_server_php');
- $pdo->exec('USE oauth2_server_php');
- $this->runPdoSql($pdo);
- }
-
- private function removeMysqlDb(\PDO $pdo)
- {
- $pdo->exec('DROP DATABASE IF EXISTS oauth2_server_php');
- }
-
- private function createPostgresDb()
- {
- if (!`psql postgres -tAc "SELECT 1 FROM pg_roles WHERE rolname='postgres'"`) {
- `createuser -s -r postgres`;
- }
-
- `createdb -O postgres oauth2_server_php`;
- }
-
- private function populatePostgresDb(\PDO $pdo)
- {
- $this->runPdoSql($pdo);
- }
-
- private function removePostgresDb()
- {
- if (trim(`psql -l | grep oauth2_server_php | wc -l`)) {
- `dropdb oauth2_server_php`;
- }
- }
-
- public function runPdoSql(\PDO $pdo)
- {
- $storage = new Pdo($pdo);
- foreach (explode(';', $storage->getBuildSql()) as $statement) {
- $result = $pdo->exec($statement);
- }
-
- // set up scopes
- $sql = 'INSERT INTO oauth_scopes (scope) VALUES (?)';
- foreach (explode(' ', 'supportedscope1 supportedscope2 supportedscope3 supportedscope4 clientscope1 clientscope2 clientscope3') as $supportedScope) {
- $pdo->prepare($sql)->execute(array($supportedScope));
- }
-
- $sql = 'INSERT INTO oauth_scopes (scope, is_default) VALUES (?, ?)';
- foreach (array('defaultscope1', 'defaultscope2') as $defaultScope) {
- $pdo->prepare($sql)->execute(array($defaultScope, true));
- }
-
- // set up clients
- $sql = 'INSERT INTO oauth_clients (client_id, client_secret, scope, grant_types) VALUES (?, ?, ?, ?)';
- $pdo->prepare($sql)->execute(array('Test Client ID', 'TestSecret', 'clientscope1 clientscope2', null));
- $pdo->prepare($sql)->execute(array('Test Client ID 2', 'TestSecret', 'clientscope1 clientscope2 clientscope3', null));
- $pdo->prepare($sql)->execute(array('Test Default Scope Client ID', 'TestSecret', 'clientscope1 clientscope2', null));
- $pdo->prepare($sql)->execute(array('oauth_test_client', 'testpass', null, 'implicit password'));
-
- // set up misc
- $sql = 'INSERT INTO oauth_access_tokens (access_token, client_id, expires, user_id) VALUES (?, ?, ?, ?)';
- $pdo->prepare($sql)->execute(array('testtoken', 'Some Client', date('Y-m-d H:i:s', strtotime('+1 hour')), null));
- $pdo->prepare($sql)->execute(array('accesstoken-openid-connect', 'Some Client', date('Y-m-d H:i:s', strtotime('+1 hour')), 'testuser'));
-
- $sql = 'INSERT INTO oauth_authorization_codes (authorization_code, client_id, expires) VALUES (?, ?, ?)';
- $pdo->prepare($sql)->execute(array('testcode', 'Some Client', date('Y-m-d H:i:s', strtotime('+1 hour'))));
-
- $sql = 'INSERT INTO oauth_users (username, password, email, email_verified) VALUES (?, ?, ?, ?)';
- $pdo->prepare($sql)->execute(array('testuser', 'password', 'testuser@test.com', true));
-
- $sql = 'INSERT INTO oauth_public_keys (client_id, public_key, private_key, encryption_algorithm) VALUES (?, ?, ?, ?)';
- $pdo->prepare($sql)->execute(array('ClientID_One', 'client_1_public', 'client_1_private', 'RS256'));
- $pdo->prepare($sql)->execute(array('ClientID_Two', 'client_2_public', 'client_2_private', 'RS256'));
-
- $sql = 'INSERT INTO oauth_public_keys (client_id, public_key, private_key, encryption_algorithm) VALUES (?, ?, ?, ?)';
- $pdo->prepare($sql)->execute(array(null, $this->getTestPublicKey(), $this->getTestPrivateKey(), 'RS256'));
-
- $sql = 'INSERT INTO oauth_jwt (client_id, subject, public_key) VALUES (?, ?, ?)';
- $pdo->prepare($sql)->execute(array('oauth_test_client', 'test_subject', $this->getTestPublicKey()));
- }
-
- public function getSqliteDir()
- {
- return $this->configDir. '/test.sqlite';
- }
-
- public function getConfigDir()
- {
- return $this->configDir;
- }
-
- private function createCouchbaseDB(\Couchbase $db)
- {
- $db->set('oauth_clients-oauth_test_client',json_encode(array(
- 'client_id' => "oauth_test_client",
- 'client_secret' => "testpass",
- 'redirect_uri' => "http://example.com",
- 'grant_types' => 'implicit password'
- )));
-
- $db->set('oauth_access_tokens-testtoken',json_encode(array(
- 'access_token' => "testtoken",
- 'client_id' => "Some Client"
- )));
-
- $db->set('oauth_authorization_codes-testcode',json_encode(array(
- 'access_token' => "testcode",
- 'client_id' => "Some Client"
- )));
-
- $db->set('oauth_users-testuser',json_encode(array(
- 'username' => 'testuser',
- 'password' => 'password',
- 'email' => 'testuser@test.com',
- 'email_verified' => true,
- )));
-
- $db->set('oauth_jwt-oauth_test_client',json_encode(array(
- 'client_id' => 'oauth_test_client',
- 'key' => $this->getTestPublicKey(),
- 'subject' => 'test_subject',
- )));
- }
-
- private function clearCouchbase(\Couchbase $cb)
- {
- $cb->delete('oauth_authorization_codes-new-openid-code');
- $cb->delete('oauth_access_tokens-newtoken');
- $cb->delete('oauth_authorization_codes-newcode');
- $cb->delete('oauth_refresh_tokens-refreshtoken');
- }
-
- private function createMongoDb(\MongoDB $db)
- {
- $db->oauth_clients->insert(array(
- 'client_id' => "oauth_test_client",
- 'client_secret' => "testpass",
- 'redirect_uri' => "http://example.com",
- 'grant_types' => 'implicit password'
- ));
-
- $db->oauth_access_tokens->insert(array(
- 'access_token' => "testtoken",
- 'client_id' => "Some Client"
- ));
-
- $db->oauth_authorization_codes->insert(array(
- 'authorization_code' => "testcode",
- 'client_id' => "Some Client"
- ));
-
- $db->oauth_users->insert(array(
- 'username' => 'testuser',
- 'password' => 'password',
- 'email' => 'testuser@test.com',
- 'email_verified' => true,
- ));
-
- $db->oauth_jwt->insert(array(
- 'client_id' => 'oauth_test_client',
- 'key' => $this->getTestPublicKey(),
- 'subject' => 'test_subject',
- ));
- }
-
- private function createRedisDb(Redis $storage)
- {
- $storage->setClientDetails("oauth_test_client", "testpass", "http://example.com", 'implicit password');
- $storage->setAccessToken("testtoken", "Some Client", '', time() + 1000);
- $storage->setAuthorizationCode("testcode", "Some Client", '', '', time() + 1000);
- $storage->setUser("testuser", "password");
-
- $storage->setScope('supportedscope1 supportedscope2 supportedscope3 supportedscope4');
- $storage->setScope('defaultscope1 defaultscope2', null, 'default');
-
- $storage->setScope('clientscope1 clientscope2', 'Test Client ID');
- $storage->setScope('clientscope1 clientscope2', 'Test Client ID', 'default');
-
- $storage->setScope('clientscope1 clientscope2 clientscope3', 'Test Client ID 2');
- $storage->setScope('clientscope1 clientscope2', 'Test Client ID 2', 'default');
-
- $storage->setScope('clientscope1 clientscope2', 'Test Default Scope Client ID');
- $storage->setScope('clientscope1 clientscope2', 'Test Default Scope Client ID', 'default');
-
- $storage->setScope('clientscope1 clientscope2 clientscope3', 'Test Default Scope Client ID 2');
- $storage->setScope('clientscope3', 'Test Default Scope Client ID 2', 'default');
-
- $storage->setClientKey('oauth_test_client', $this->getTestPublicKey(), 'test_subject');
- }
-
- public function removeMongoDb(\MongoDB $db)
- {
- $db->drop();
- }
-
- public function getTestPublicKey()
- {
- return file_get_contents(__DIR__.'/../../../config/keys/id_rsa.pub');
- }
-
- private function getTestPrivateKey()
- {
- return file_get_contents(__DIR__.'/../../../config/keys/id_rsa');
- }
-
- public function getDynamoDbStorage()
- {
- if (!$this->dynamodb) {
- // only run once per travis build
- if (true == $this->getEnvVar('TRAVIS')) {
- if (self::DYNAMODB_PHP_VERSION != $this->getEnvVar('TRAVIS_PHP_VERSION')) {
- $this->dynamodb = new NullStorage('DynamoDb', 'Skipping for travis.ci - only run once per build');
-
- return;
- }
- }
- if (class_exists('\Aws\DynamoDb\DynamoDbClient')) {
- if ($client = $this->getDynamoDbClient()) {
- // travis runs a unique set of tables per build, to avoid conflict
- $prefix = '';
- if ($build_id = $this->getEnvVar('TRAVIS_JOB_NUMBER')) {
- $prefix = sprintf('build_%s_', $build_id);
- } else {
- if (!$this->deleteDynamoDb($client, $prefix, true)) {
- return $this->dynamodb = new NullStorage('DynamoDb', 'Timed out while waiting for DynamoDB deletion (30 seconds)');
- }
- }
- $this->createDynamoDb($client, $prefix);
- $this->populateDynamoDb($client, $prefix);
- $config = array(
- 'client_table' => $prefix.'oauth_clients',
- 'access_token_table' => $prefix.'oauth_access_tokens',
- 'refresh_token_table' => $prefix.'oauth_refresh_tokens',
- 'code_table' => $prefix.'oauth_authorization_codes',
- 'user_table' => $prefix.'oauth_users',
- 'jwt_table' => $prefix.'oauth_jwt',
- 'scope_table' => $prefix.'oauth_scopes',
- 'public_key_table' => $prefix.'oauth_public_keys',
- );
- $this->dynamodb = new DynamoDB($client, $config);
- } elseif (!$this->dynamodb) {
- $this->dynamodb = new NullStorage('DynamoDb', 'unable to connect to DynamoDB');
- }
- } else {
- $this->dynamodb = new NullStorage('DynamoDb', 'Missing DynamoDB library. Please run "composer.phar require aws/aws-sdk-php:dev-master');
- }
- }
-
- return $this->dynamodb;
- }
-
- private function getDynamoDbClient()
- {
- $config = array();
- // check for environment variables
- if (($key = $this->getEnvVar('AWS_ACCESS_KEY_ID')) && ($secret = $this->getEnvVar('AWS_SECRET_KEY'))) {
- $config['key'] = $key;
- $config['secret'] = $secret;
- } else {
- // fall back on ~/.aws/credentials file
- // @see http://docs.aws.amazon.com/aws-sdk-php/guide/latest/credentials.html#credential-profiles
- if (!file_exists($this->getEnvVar('HOME') . '/.aws/credentials')) {
- $this->dynamodb = new NullStorage('DynamoDb', 'No aws credentials file found, and no AWS_ACCESS_KEY_ID or AWS_SECRET_KEY environment variable set');
-
- return;
- }
-
- // set profile in AWS_PROFILE environment variable, defaults to "default"
- $config['profile'] = $this->getEnvVar('AWS_PROFILE', 'default');
- }
-
- // set region in AWS_REGION environment variable, defaults to "us-east-1"
- $config['region'] = $this->getEnvVar('AWS_REGION', \Aws\Common\Enum\Region::US_EAST_1);
-
- return \Aws\DynamoDb\DynamoDbClient::factory($config);
- }
-
- private function deleteDynamoDb(\Aws\DynamoDb\DynamoDbClient $client, $prefix = null, $waitForDeletion = false)
- {
- $tablesList = explode(' ', 'oauth_access_tokens oauth_authorization_codes oauth_clients oauth_jwt oauth_public_keys oauth_refresh_tokens oauth_scopes oauth_users');
- $nbTables = count($tablesList);
-
- // Delete all table.
- foreach ($tablesList as $key => $table) {
- try {
- $client->deleteTable(array('TableName' => $prefix.$table));
- } catch (\Aws\DynamoDb\Exception\DynamoDbException $e) {
- // Table does not exist : nothing to do
- }
- }
-
- // Wait for deleting
- if ($waitForDeletion) {
- $retries = 5;
- $nbTableDeleted = 0;
- while ($nbTableDeleted != $nbTables) {
- $nbTableDeleted = 0;
- foreach ($tablesList as $key => $table) {
- try {
- $result = $client->describeTable(array('TableName' => $prefix.$table));
- } catch (\Aws\DynamoDb\Exception\DynamoDbException $e) {
- // Table does not exist : nothing to do
- $nbTableDeleted++;
- }
- }
- if ($nbTableDeleted != $nbTables) {
- if ($retries < 0) {
- // we are tired of waiting
- return false;
- }
- sleep(5);
- echo "Sleeping 5 seconds for DynamoDB ($retries more retries)...\n";
- $retries--;
- }
- }
- }
-
- return true;
- }
-
- private function createDynamoDb(\Aws\DynamoDb\DynamoDbClient $client, $prefix = null)
- {
- $tablesList = explode(' ', 'oauth_access_tokens oauth_authorization_codes oauth_clients oauth_jwt oauth_public_keys oauth_refresh_tokens oauth_scopes oauth_users');
- $nbTables = count($tablesList);
- $client->createTable(array(
- 'TableName' => $prefix.'oauth_access_tokens',
- 'AttributeDefinitions' => array(
- array('AttributeName' => 'access_token','AttributeType' => 'S')
- ),
- 'KeySchema' => array(array('AttributeName' => 'access_token','KeyType' => 'HASH')),
- 'ProvisionedThroughput' => array('ReadCapacityUnits' => 1,'WriteCapacityUnits' => 1)
- ));
-
- $client->createTable(array(
- 'TableName' => $prefix.'oauth_authorization_codes',
- 'AttributeDefinitions' => array(
- array('AttributeName' => 'authorization_code','AttributeType' => 'S')
- ),
- 'KeySchema' => array(array('AttributeName' => 'authorization_code','KeyType' => 'HASH')),
- 'ProvisionedThroughput' => array('ReadCapacityUnits' => 1,'WriteCapacityUnits' => 1)
- ));
-
- $client->createTable(array(
- 'TableName' => $prefix.'oauth_clients',
- 'AttributeDefinitions' => array(
- array('AttributeName' => 'client_id','AttributeType' => 'S')
- ),
- 'KeySchema' => array(array('AttributeName' => 'client_id','KeyType' => 'HASH')),
- 'ProvisionedThroughput' => array('ReadCapacityUnits' => 1,'WriteCapacityUnits' => 1)
- ));
-
- $client->createTable(array(
- 'TableName' => $prefix.'oauth_jwt',
- 'AttributeDefinitions' => array(
- array('AttributeName' => 'client_id','AttributeType' => 'S'),
- array('AttributeName' => 'subject','AttributeType' => 'S')
- ),
- 'KeySchema' => array(
- array('AttributeName' => 'client_id','KeyType' => 'HASH'),
- array('AttributeName' => 'subject','KeyType' => 'RANGE')
- ),
- 'ProvisionedThroughput' => array('ReadCapacityUnits' => 1,'WriteCapacityUnits' => 1)
- ));
-
- $client->createTable(array(
- 'TableName' => $prefix.'oauth_public_keys',
- 'AttributeDefinitions' => array(
- array('AttributeName' => 'client_id','AttributeType' => 'S')
- ),
- 'KeySchema' => array(array('AttributeName' => 'client_id','KeyType' => 'HASH')),
- 'ProvisionedThroughput' => array('ReadCapacityUnits' => 1,'WriteCapacityUnits' => 1)
- ));
-
- $client->createTable(array(
- 'TableName' => $prefix.'oauth_refresh_tokens',
- 'AttributeDefinitions' => array(
- array('AttributeName' => 'refresh_token','AttributeType' => 'S')
- ),
- 'KeySchema' => array(array('AttributeName' => 'refresh_token','KeyType' => 'HASH')),
- 'ProvisionedThroughput' => array('ReadCapacityUnits' => 1,'WriteCapacityUnits' => 1)
- ));
-
- $client->createTable(array(
- 'TableName' => $prefix.'oauth_scopes',
- 'AttributeDefinitions' => array(
- array('AttributeName' => 'scope','AttributeType' => 'S'),
- array('AttributeName' => 'is_default','AttributeType' => 'S')
- ),
- 'KeySchema' => array(array('AttributeName' => 'scope','KeyType' => 'HASH')),
- 'GlobalSecondaryIndexes' => array(
- array(
- 'IndexName' => 'is_default-index',
- 'KeySchema' => array(array('AttributeName' => 'is_default', 'KeyType' => 'HASH')),
- 'Projection' => array('ProjectionType' => 'ALL'),
- 'ProvisionedThroughput' => array('ReadCapacityUnits' => 1,'WriteCapacityUnits' => 1)
- ),
- ),
- 'ProvisionedThroughput' => array('ReadCapacityUnits' => 1,'WriteCapacityUnits' => 1)
- ));
-
- $client->createTable(array(
- 'TableName' => $prefix.'oauth_users',
- 'AttributeDefinitions' => array(array('AttributeName' => 'username','AttributeType' => 'S')),
- 'KeySchema' => array(array('AttributeName' => 'username','KeyType' => 'HASH')),
- 'ProvisionedThroughput' => array('ReadCapacityUnits' => 1,'WriteCapacityUnits' => 1)
- ));
-
- // Wait for creation
- $nbTableCreated = 0;
- while ($nbTableCreated != $nbTables) {
- $nbTableCreated = 0;
- foreach ($tablesList as $key => $table) {
- try {
- $result = $client->describeTable(array('TableName' => $prefix.$table));
- if ($result['Table']['TableStatus'] == 'ACTIVE') {
- $nbTableCreated++;
- }
- } catch (\Aws\DynamoDb\Exception\DynamoDbException $e) {
- // Table does not exist : nothing to do
- $nbTableCreated++;
- }
- }
- if ($nbTableCreated != $nbTables) {
- sleep(1);
- }
- }
- }
-
- private function populateDynamoDb($client, $prefix = null)
- {
- // set up scopes
- foreach (explode(' ', 'supportedscope1 supportedscope2 supportedscope3 supportedscope4 clientscope1 clientscope2 clientscope3') as $supportedScope) {
- $client->putItem(array(
- 'TableName' => $prefix.'oauth_scopes',
- 'Item' => array('scope' => array('S' => $supportedScope))
- ));
- }
-
- foreach (array('defaultscope1', 'defaultscope2') as $defaultScope) {
- $client->putItem(array(
- 'TableName' => $prefix.'oauth_scopes',
- 'Item' => array('scope' => array('S' => $defaultScope), 'is_default' => array('S' => "true"))
- ));
- }
-
- $client->putItem(array(
- 'TableName' => $prefix.'oauth_clients',
- 'Item' => array(
- 'client_id' => array('S' => 'Test Client ID'),
- 'client_secret' => array('S' => 'TestSecret'),
- 'scope' => array('S' => 'clientscope1 clientscope2')
- )
- ));
-
- $client->putItem(array(
- 'TableName' => $prefix.'oauth_clients',
- 'Item' => array(
- 'client_id' => array('S' => 'Test Client ID 2'),
- 'client_secret' => array('S' => 'TestSecret'),
- 'scope' => array('S' => 'clientscope1 clientscope2 clientscope3')
- )
- ));
-
- $client->putItem(array(
- 'TableName' => $prefix.'oauth_clients',
- 'Item' => array(
- 'client_id' => array('S' => 'Test Default Scope Client ID'),
- 'client_secret' => array('S' => 'TestSecret'),
- 'scope' => array('S' => 'clientscope1 clientscope2')
- )
- ));
-
- $client->putItem(array(
- 'TableName' => $prefix.'oauth_clients',
- 'Item' => array(
- 'client_id' => array('S' => 'oauth_test_client'),
- 'client_secret' => array('S' => 'testpass'),
- 'grant_types' => array('S' => 'implicit password')
- )
- ));
-
- $client->putItem(array(
- 'TableName' => $prefix.'oauth_access_tokens',
- 'Item' => array(
- 'access_token' => array('S' => 'testtoken'),
- 'client_id' => array('S' => 'Some Client'),
- )
- ));
-
- $client->putItem(array(
- 'TableName' => $prefix.'oauth_access_tokens',
- 'Item' => array(
- 'access_token' => array('S' => 'accesstoken-openid-connect'),
- 'client_id' => array('S' => 'Some Client'),
- 'user_id' => array('S' => 'testuser'),
- )
- ));
-
- $client->putItem(array(
- 'TableName' => $prefix.'oauth_authorization_codes',
- 'Item' => array(
- 'authorization_code' => array('S' => 'testcode'),
- 'client_id' => array('S' => 'Some Client'),
- )
- ));
-
- $client->putItem(array(
- 'TableName' => $prefix.'oauth_users',
- 'Item' => array(
- 'username' => array('S' => 'testuser'),
- 'password' => array('S' => 'password'),
- 'email' => array('S' => 'testuser@test.com'),
- 'email_verified' => array('S' => 'true'),
- )
- ));
-
- $client->putItem(array(
- 'TableName' => $prefix.'oauth_public_keys',
- 'Item' => array(
- 'client_id' => array('S' => 'ClientID_One'),
- 'public_key' => array('S' => 'client_1_public'),
- 'private_key' => array('S' => 'client_1_private'),
- 'encryption_algorithm' => array('S' => 'RS256'),
- )
- ));
-
- $client->putItem(array(
- 'TableName' => $prefix.'oauth_public_keys',
- 'Item' => array(
- 'client_id' => array('S' => 'ClientID_Two'),
- 'public_key' => array('S' => 'client_2_public'),
- 'private_key' => array('S' => 'client_2_private'),
- 'encryption_algorithm' => array('S' => 'RS256'),
- )
- ));
-
- $client->putItem(array(
- 'TableName' => $prefix.'oauth_public_keys',
- 'Item' => array(
- 'client_id' => array('S' => '0'),
- 'public_key' => array('S' => $this->getTestPublicKey()),
- 'private_key' => array('S' => $this->getTestPrivateKey()),
- 'encryption_algorithm' => array('S' => 'RS256'),
- )
- ));
-
- $client->putItem(array(
- 'TableName' => $prefix.'oauth_jwt',
- 'Item' => array(
- 'client_id' => array('S' => 'oauth_test_client'),
- 'subject' => array('S' => 'test_subject'),
- 'public_key' => array('S' => $this->getTestPublicKey()),
- )
- ));
- }
-
- public function cleanupTravisDynamoDb($prefix = null)
- {
- if (is_null($prefix)) {
- // skip this when not applicable
- if (!$this->getEnvVar('TRAVIS') || self::DYNAMODB_PHP_VERSION != $this->getEnvVar('TRAVIS_PHP_VERSION')) {
- return;
- }
-
- $prefix = sprintf('build_%s_', $this->getEnvVar('TRAVIS_JOB_NUMBER'));
- }
-
- $client = $this->getDynamoDbClient();
- $this->deleteDynamoDb($client, $prefix);
- }
-
- private function getEnvVar($var, $default = null)
- {
- return isset($_SERVER[$var]) ? $_SERVER[$var] : (getenv($var) ?: $default);
- }
-}
diff --git a/library/oauth2/test/lib/OAuth2/Storage/NullStorage.php b/library/oauth2/test/lib/OAuth2/Storage/NullStorage.php
deleted file mode 100644
index 6caa62068..000000000
--- a/library/oauth2/test/lib/OAuth2/Storage/NullStorage.php
+++ /dev/null
@@ -1,32 +0,0 @@
-<?php
-
-namespace OAuth2\Storage;
-
-/**
-*
-*/
-class NullStorage extends Memory
-{
- private $name;
- private $description;
-
- public function __construct($name, $description = null)
- {
- $this->name = $name;
- $this->description = $description;
- }
-
- public function __toString()
- {
- return $this->name;
- }
-
- public function getMessage()
- {
- if ($this->description) {
- return $this->description;
- }
-
- return $this->name;
- }
-}
diff --git a/library/popper/popper.min.js b/library/popper/popper.min.js
new file mode 100644
index 000000000..ce33a863d
--- /dev/null
+++ b/library/popper/popper.min.js
@@ -0,0 +1,4 @@
+/*
+ Copyright (C) Federico Zivolo 2017
+ Distributed under the MIT License (license terms are at http://opensource.org/licenses/MIT).
+ */(function(e,t){'object'==typeof exports&&'undefined'!=typeof module?module.exports=t():'function'==typeof define&&define.amd?define(t):e.Popper=t()})(this,function(){'use strict';function e(e){return e&&'[object Function]'==={}.toString.call(e)}function t(e,t){if(1!==e.nodeType)return[];var o=window.getComputedStyle(e,null);return t?o[t]:o}function o(e){return'HTML'===e.nodeName?e:e.parentNode||e.host}function n(e){if(!e||-1!==['HTML','BODY','#document'].indexOf(e.nodeName))return window.document.body;var i=t(e),r=i.overflow,p=i.overflowX,s=i.overflowY;return /(auto|scroll)/.test(r+s+p)?e:n(o(e))}function r(e){var o=e&&e.offsetParent,i=o&&o.nodeName;return i&&'BODY'!==i&&'HTML'!==i?-1!==['TD','TABLE'].indexOf(o.nodeName)&&'static'===t(o,'position')?r(o):o:window.document.documentElement}function p(e){var t=e.nodeName;return'BODY'!==t&&('HTML'===t||r(e.firstElementChild)===e)}function s(e){return null===e.parentNode?e:s(e.parentNode)}function d(e,t){if(!e||!e.nodeType||!t||!t.nodeType)return window.document.documentElement;var o=e.compareDocumentPosition(t)&Node.DOCUMENT_POSITION_FOLLOWING,i=o?e:t,n=o?t:e,a=document.createRange();a.setStart(i,0),a.setEnd(n,0);var f=a.commonAncestorContainer;if(e!==f&&t!==f||i.contains(n))return p(f)?f:r(f);var l=s(e);return l.host?d(l.host,t):d(e,s(t).host)}function a(e){var t=1<arguments.length&&void 0!==arguments[1]?arguments[1]:'top',o='top'===t?'scrollTop':'scrollLeft',i=e.nodeName;if('BODY'===i||'HTML'===i){var n=window.document.documentElement,r=window.document.scrollingElement||n;return r[o]}return e[o]}function f(e,t){var o=2<arguments.length&&void 0!==arguments[2]&&arguments[2],i=a(t,'top'),n=a(t,'left'),r=o?-1:1;return e.top+=i*r,e.bottom+=i*r,e.left+=n*r,e.right+=n*r,e}function l(e,t){var o='x'===t?'Left':'Top',i='Left'==o?'Right':'Bottom';return+e['border'+o+'Width'].split('px')[0]+ +e['border'+i+'Width'].split('px')[0]}function m(e,t,o,i){return _(t['offset'+e],o['client'+e],o['offset'+e],ie()?o['offset'+e]+i['margin'+('Height'===e?'Top':'Left')]+i['margin'+('Height'===e?'Bottom':'Right')]:0)}function h(){var e=window.document.body,t=window.document.documentElement,o=ie()&&window.getComputedStyle(t);return{height:m('Height',e,t,o),width:m('Width',e,t,o)}}function c(e){return se({},e,{right:e.left+e.width,bottom:e.top+e.height})}function g(e){var o={};if(ie())try{o=e.getBoundingClientRect();var i=a(e,'top'),n=a(e,'left');o.top+=i,o.left+=n,o.bottom+=i,o.right+=n}catch(e){}else o=e.getBoundingClientRect();var r={left:o.left,top:o.top,width:o.right-o.left,height:o.bottom-o.top},p='HTML'===e.nodeName?h():{},s=p.width||e.clientWidth||r.right-r.left,d=p.height||e.clientHeight||r.bottom-r.top,f=e.offsetWidth-s,m=e.offsetHeight-d;if(f||m){var g=t(e);f-=l(g,'x'),m-=l(g,'y'),r.width-=f,r.height-=m}return c(r)}function u(e,o){var i=ie(),r='HTML'===o.nodeName,p=g(e),s=g(o),d=n(e),a=t(o),l=+a.borderTopWidth.split('px')[0],m=+a.borderLeftWidth.split('px')[0],h=c({top:p.top-s.top-l,left:p.left-s.left-m,width:p.width,height:p.height});if(h.marginTop=0,h.marginLeft=0,!i&&r){var u=+a.marginTop.split('px')[0],b=+a.marginLeft.split('px')[0];h.top-=l-u,h.bottom-=l-u,h.left-=m-b,h.right-=m-b,h.marginTop=u,h.marginLeft=b}return(i?o.contains(d):o===d&&'BODY'!==d.nodeName)&&(h=f(h,o)),h}function b(e){var t=window.document.documentElement,o=u(e,t),i=_(t.clientWidth,window.innerWidth||0),n=_(t.clientHeight,window.innerHeight||0),r=a(t),p=a(t,'left'),s={top:r-o.top+o.marginTop,left:p-o.left+o.marginLeft,width:i,height:n};return c(s)}function y(e){var i=e.nodeName;return'BODY'===i||'HTML'===i?!1:'fixed'===t(e,'position')||y(o(e))}function w(e,t,i,r){var p={top:0,left:0},s=d(e,t);if('viewport'===r)p=b(s);else{var a;'scrollParent'===r?(a=n(o(e)),'BODY'===a.nodeName&&(a=window.document.documentElement)):'window'===r?a=window.document.documentElement:a=r;var f=u(a,s);if('HTML'===a.nodeName&&!y(s)){var l=h(),m=l.height,c=l.width;p.top+=f.top-f.marginTop,p.bottom=m+f.top,p.left+=f.left-f.marginLeft,p.right=c+f.left}else p=f}return p.left+=i,p.top+=i,p.right-=i,p.bottom-=i,p}function v(e){var t=e.width,o=e.height;return t*o}function E(e,t,o,i,n){var r=5<arguments.length&&void 0!==arguments[5]?arguments[5]:0;if(-1===e.indexOf('auto'))return e;var p=w(o,i,r,n),s={top:{width:p.width,height:t.top-p.top},right:{width:p.right-t.right,height:p.height},bottom:{width:p.width,height:p.bottom-t.bottom},left:{width:t.left-p.left,height:p.height}},d=Object.keys(s).map(function(e){return se({key:e},s[e],{area:v(s[e])})}).sort(function(e,t){return t.area-e.area}),a=d.filter(function(e){var t=e.width,i=e.height;return t>=o.clientWidth&&i>=o.clientHeight}),f=0<a.length?a[0].key:d[0].key,l=e.split('-')[1];return f+(l?'-'+l:'')}function x(e,t,o){var i=d(t,o);return u(o,i)}function O(e){var t=window.getComputedStyle(e),o=parseFloat(t.marginTop)+parseFloat(t.marginBottom),i=parseFloat(t.marginLeft)+parseFloat(t.marginRight),n={width:e.offsetWidth+i,height:e.offsetHeight+o};return n}function L(e){var t={left:'right',right:'left',bottom:'top',top:'bottom'};return e.replace(/left|right|bottom|top/g,function(e){return t[e]})}function S(e,t,o){o=o.split('-')[0];var i=O(e),n={width:i.width,height:i.height},r=-1!==['right','left'].indexOf(o),p=r?'top':'left',s=r?'left':'top',d=r?'height':'width',a=r?'width':'height';return n[p]=t[p]+t[d]/2-i[d]/2,n[s]=o===s?t[s]-i[a]:t[L(s)],n}function T(e,t){return Array.prototype.find?e.find(t):e.filter(t)[0]}function C(e,t,o){if(Array.prototype.findIndex)return e.findIndex(function(e){return e[t]===o});var i=T(e,function(e){return e[t]===o});return e.indexOf(i)}function N(t,o,i){var n=void 0===i?t:t.slice(0,C(t,'name',i));return n.forEach(function(t){t.function&&console.warn('`modifier.function` is deprecated, use `modifier.fn`!');var i=t.function||t.fn;t.enabled&&e(i)&&(o.offsets.popper=c(o.offsets.popper),o.offsets.reference=c(o.offsets.reference),o=i(o,t))}),o}function k(){if(!this.state.isDestroyed){var e={instance:this,styles:{},attributes:{},flipped:!1,offsets:{}};e.offsets.reference=x(this.state,this.popper,this.reference),e.placement=E(this.options.placement,e.offsets.reference,this.popper,this.reference,this.options.modifiers.flip.boundariesElement,this.options.modifiers.flip.padding),e.originalPlacement=e.placement,e.offsets.popper=S(this.popper,e.offsets.reference,e.placement),e.offsets.popper.position='absolute',e=N(this.modifiers,e),this.state.isCreated?this.options.onUpdate(e):(this.state.isCreated=!0,this.options.onCreate(e))}}function W(e,t){return e.some(function(e){var o=e.name,i=e.enabled;return i&&o===t})}function B(e){for(var t=[!1,'ms','Webkit','Moz','O'],o=e.charAt(0).toUpperCase()+e.slice(1),n=0;n<t.length-1;n++){var i=t[n],r=i?''+i+o:e;if('undefined'!=typeof window.document.body.style[r])return r}return null}function D(){return this.state.isDestroyed=!0,W(this.modifiers,'applyStyle')&&(this.popper.removeAttribute('x-placement'),this.popper.style.left='',this.popper.style.position='',this.popper.style.top='',this.popper.style[B('transform')]=''),this.disableEventListeners(),this.options.removeOnDestroy&&this.popper.parentNode.removeChild(this.popper),this}function H(e,t,o,i){var r='BODY'===e.nodeName,p=r?window:e;p.addEventListener(t,o,{passive:!0}),r||H(n(p.parentNode),t,o,i),i.push(p)}function P(e,t,o,i){o.updateBound=i,window.addEventListener('resize',o.updateBound,{passive:!0});var r=n(e);return H(r,'scroll',o.updateBound,o.scrollParents),o.scrollElement=r,o.eventsEnabled=!0,o}function A(){this.state.eventsEnabled||(this.state=P(this.reference,this.options,this.state,this.scheduleUpdate))}function M(e,t){return window.removeEventListener('resize',t.updateBound),t.scrollParents.forEach(function(e){e.removeEventListener('scroll',t.updateBound)}),t.updateBound=null,t.scrollParents=[],t.scrollElement=null,t.eventsEnabled=!1,t}function I(){this.state.eventsEnabled&&(window.cancelAnimationFrame(this.scheduleUpdate),this.state=M(this.reference,this.state))}function R(e){return''!==e&&!isNaN(parseFloat(e))&&isFinite(e)}function U(e,t){Object.keys(t).forEach(function(o){var i='';-1!==['width','height','top','right','bottom','left'].indexOf(o)&&R(t[o])&&(i='px'),e.style[o]=t[o]+i})}function Y(e,t){Object.keys(t).forEach(function(o){var i=t[o];!1===i?e.removeAttribute(o):e.setAttribute(o,t[o])})}function F(e,t,o){var i=T(e,function(e){var o=e.name;return o===t}),n=!!i&&e.some(function(e){return e.name===o&&e.enabled&&e.order<i.order});if(!n){var r='`'+t+'`';console.warn('`'+o+'`'+' modifier is required by '+r+' modifier in order to work, be sure to include it before '+r+'!')}return n}function j(e){return'end'===e?'start':'start'===e?'end':e}function K(e){var t=1<arguments.length&&void 0!==arguments[1]&&arguments[1],o=ae.indexOf(e),i=ae.slice(o+1).concat(ae.slice(0,o));return t?i.reverse():i}function q(e,t,o,i){var n=e.match(/((?:\-|\+)?\d*\.?\d*)(.*)/),r=+n[1],p=n[2];if(!r)return e;if(0===p.indexOf('%')){var s;switch(p){case'%p':s=o;break;case'%':case'%r':default:s=i;}var d=c(s);return d[t]/100*r}if('vh'===p||'vw'===p){var a;return a='vh'===p?_(document.documentElement.clientHeight,window.innerHeight||0):_(document.documentElement.clientWidth,window.innerWidth||0),a/100*r}return r}function G(e,t,o,i){var n=[0,0],r=-1!==['right','left'].indexOf(i),p=e.split(/(\+|\-)/).map(function(e){return e.trim()}),s=p.indexOf(T(p,function(e){return-1!==e.search(/,|\s/)}));p[s]&&-1===p[s].indexOf(',')&&console.warn('Offsets separated by white space(s) are deprecated, use a comma (,) instead.');var d=/\s*,\s*|\s+/,a=-1===s?[p]:[p.slice(0,s).concat([p[s].split(d)[0]]),[p[s].split(d)[1]].concat(p.slice(s+1))];return a=a.map(function(e,i){var n=(1===i?!r:r)?'height':'width',p=!1;return e.reduce(function(e,t){return''===e[e.length-1]&&-1!==['+','-'].indexOf(t)?(e[e.length-1]=t,p=!0,e):p?(e[e.length-1]+=t,p=!1,e):e.concat(t)},[]).map(function(e){return q(e,n,t,o)})}),a.forEach(function(e,t){e.forEach(function(o,i){R(o)&&(n[t]+=o*('-'===e[i-1]?-1:1))})}),n}for(var z=Math.min,V=Math.floor,_=Math.max,X=['native code','[object MutationObserverConstructor]'],Q=function(e){return X.some(function(t){return-1<(e||'').toString().indexOf(t)})},J='undefined'!=typeof window,Z=['Edge','Trident','Firefox'],$=0,ee=0;ee<Z.length;ee+=1)if(J&&0<=navigator.userAgent.indexOf(Z[ee])){$=1;break}var i,te=J&&Q(window.MutationObserver),oe=te?function(e){var t=!1,o=0,i=document.createElement('span'),n=new MutationObserver(function(){e(),t=!1});return n.observe(i,{attributes:!0}),function(){t||(t=!0,i.setAttribute('x-index',o),++o)}}:function(e){var t=!1;return function(){t||(t=!0,setTimeout(function(){t=!1,e()},$))}},ie=function(){return void 0==i&&(i=-1!==navigator.appVersion.indexOf('MSIE 10')),i},ne=function(e,t){if(!(e instanceof t))throw new TypeError('Cannot call a class as a function')},re=function(){function e(e,t){for(var o,n=0;n<t.length;n++)o=t[n],o.enumerable=o.enumerable||!1,o.configurable=!0,'value'in o&&(o.writable=!0),Object.defineProperty(e,o.key,o)}return function(t,o,i){return o&&e(t.prototype,o),i&&e(t,i),t}}(),pe=function(e,t,o){return t in e?Object.defineProperty(e,t,{value:o,enumerable:!0,configurable:!0,writable:!0}):e[t]=o,e},se=Object.assign||function(e){for(var t,o=1;o<arguments.length;o++)for(var i in t=arguments[o],t)Object.prototype.hasOwnProperty.call(t,i)&&(e[i]=t[i]);return e},de=['auto-start','auto','auto-end','top-start','top','top-end','right-start','right','right-end','bottom-end','bottom','bottom-start','left-end','left','left-start'],ae=de.slice(3),fe={FLIP:'flip',CLOCKWISE:'clockwise',COUNTERCLOCKWISE:'counterclockwise'},le=function(){function t(o,i){var n=this,r=2<arguments.length&&void 0!==arguments[2]?arguments[2]:{};ne(this,t),this.scheduleUpdate=function(){return requestAnimationFrame(n.update)},this.update=oe(this.update.bind(this)),this.options=se({},t.Defaults,r),this.state={isDestroyed:!1,isCreated:!1,scrollParents:[]},this.reference=o.jquery?o[0]:o,this.popper=i.jquery?i[0]:i,this.options.modifiers={},Object.keys(se({},t.Defaults.modifiers,r.modifiers)).forEach(function(e){n.options.modifiers[e]=se({},t.Defaults.modifiers[e]||{},r.modifiers?r.modifiers[e]:{})}),this.modifiers=Object.keys(this.options.modifiers).map(function(e){return se({name:e},n.options.modifiers[e])}).sort(function(e,t){return e.order-t.order}),this.modifiers.forEach(function(t){t.enabled&&e(t.onLoad)&&t.onLoad(n.reference,n.popper,n.options,t,n.state)}),this.update();var p=this.options.eventsEnabled;p&&this.enableEventListeners(),this.state.eventsEnabled=p}return re(t,[{key:'update',value:function(){return k.call(this)}},{key:'destroy',value:function(){return D.call(this)}},{key:'enableEventListeners',value:function(){return A.call(this)}},{key:'disableEventListeners',value:function(){return I.call(this)}}]),t}();return le.Utils=('undefined'==typeof window?global:window).PopperUtils,le.placements=de,le.Defaults={placement:'bottom',eventsEnabled:!0,removeOnDestroy:!1,onCreate:function(){},onUpdate:function(){},modifiers:{shift:{order:100,enabled:!0,fn:function(e){var t=e.placement,o=t.split('-')[0],i=t.split('-')[1];if(i){var n=e.offsets,r=n.reference,p=n.popper,s=-1!==['bottom','top'].indexOf(o),d=s?'left':'top',a=s?'width':'height',f={start:pe({},d,r[d]),end:pe({},d,r[d]+r[a]-p[a])};e.offsets.popper=se({},p,f[i])}return e}},offset:{order:200,enabled:!0,fn:function(e,t){var o,i=t.offset,n=e.placement,r=e.offsets,p=r.popper,s=r.reference,d=n.split('-')[0];return o=R(+i)?[+i,0]:G(i,p,s,d),'left'===d?(p.top+=o[0],p.left-=o[1]):'right'===d?(p.top+=o[0],p.left+=o[1]):'top'===d?(p.left+=o[0],p.top-=o[1]):'bottom'===d&&(p.left+=o[0],p.top+=o[1]),e.popper=p,e},offset:0},preventOverflow:{order:300,enabled:!0,fn:function(e,t){var o=t.boundariesElement||r(e.instance.popper);e.instance.reference===o&&(o=r(o));var i=w(e.instance.popper,e.instance.reference,t.padding,o);t.boundaries=i;var n=t.priority,p=e.offsets.popper,s={primary:function(e){var o=p[e];return p[e]<i[e]&&!t.escapeWithReference&&(o=_(p[e],i[e])),pe({},e,o)},secondary:function(e){var o='right'===e?'left':'top',n=p[o];return p[e]>i[e]&&!t.escapeWithReference&&(n=z(p[o],i[e]-('right'===e?p.width:p.height))),pe({},o,n)}};return n.forEach(function(e){var t=-1===['left','top'].indexOf(e)?'secondary':'primary';p=se({},p,s[t](e))}),e.offsets.popper=p,e},priority:['left','right','top','bottom'],padding:5,boundariesElement:'scrollParent'},keepTogether:{order:400,enabled:!0,fn:function(e){var t=e.offsets,o=t.popper,i=t.reference,n=e.placement.split('-')[0],r=V,p=-1!==['top','bottom'].indexOf(n),s=p?'right':'bottom',d=p?'left':'top',a=p?'width':'height';return o[s]<r(i[d])&&(e.offsets.popper[d]=r(i[d])-o[a]),o[d]>r(i[s])&&(e.offsets.popper[d]=r(i[s])),e}},arrow:{order:500,enabled:!0,fn:function(e,t){if(!F(e.instance.modifiers,'arrow','keepTogether'))return e;var o=t.element;if('string'==typeof o){if(o=e.instance.popper.querySelector(o),!o)return e;}else if(!e.instance.popper.contains(o))return console.warn('WARNING: `arrow.element` must be child of its popper element!'),e;var i=e.placement.split('-')[0],n=e.offsets,r=n.popper,p=n.reference,s=-1!==['left','right'].indexOf(i),d=s?'height':'width',a=s?'top':'left',f=s?'left':'top',l=s?'bottom':'right',m=O(o)[d];p[l]-m<r[a]&&(e.offsets.popper[a]-=r[a]-(p[l]-m)),p[a]+m>r[l]&&(e.offsets.popper[a]+=p[a]+m-r[l]);var h=p[a]+p[d]/2-m/2,g=h-c(e.offsets.popper)[a];return g=_(z(r[d]-m,g),0),e.arrowElement=o,e.offsets.arrow={},e.offsets.arrow[a]=Math.round(g),e.offsets.arrow[f]='',e},element:'[x-arrow]'},flip:{order:600,enabled:!0,fn:function(e,t){if(W(e.instance.modifiers,'inner'))return e;if(e.flipped&&e.placement===e.originalPlacement)return e;var o=w(e.instance.popper,e.instance.reference,t.padding,t.boundariesElement),i=e.placement.split('-')[0],n=L(i),r=e.placement.split('-')[1]||'',p=[];switch(t.behavior){case fe.FLIP:p=[i,n];break;case fe.CLOCKWISE:p=K(i);break;case fe.COUNTERCLOCKWISE:p=K(i,!0);break;default:p=t.behavior;}return p.forEach(function(s,d){if(i!==s||p.length===d+1)return e;i=e.placement.split('-')[0],n=L(i);var a=e.offsets.popper,f=e.offsets.reference,l=V,m='left'===i&&l(a.right)>l(f.left)||'right'===i&&l(a.left)<l(f.right)||'top'===i&&l(a.bottom)>l(f.top)||'bottom'===i&&l(a.top)<l(f.bottom),h=l(a.left)<l(o.left),c=l(a.right)>l(o.right),g=l(a.top)<l(o.top),u=l(a.bottom)>l(o.bottom),b='left'===i&&h||'right'===i&&c||'top'===i&&g||'bottom'===i&&u,y=-1!==['top','bottom'].indexOf(i),w=!!t.flipVariations&&(y&&'start'===r&&h||y&&'end'===r&&c||!y&&'start'===r&&g||!y&&'end'===r&&u);(m||b||w)&&(e.flipped=!0,(m||b)&&(i=p[d+1]),w&&(r=j(r)),e.placement=i+(r?'-'+r:''),e.offsets.popper=se({},e.offsets.popper,S(e.instance.popper,e.offsets.reference,e.placement)),e=N(e.instance.modifiers,e,'flip'))}),e},behavior:'flip',padding:5,boundariesElement:'viewport'},inner:{order:700,enabled:!1,fn:function(e){var t=e.placement,o=t.split('-')[0],i=e.offsets,n=i.popper,r=i.reference,p=-1!==['left','right'].indexOf(o),s=-1===['top','left'].indexOf(o);return n[p?'left':'top']=r[t]-(s?n[p?'width':'height']:0),e.placement=L(t),e.offsets.popper=c(n),e}},hide:{order:800,enabled:!0,fn:function(e){if(!F(e.instance.modifiers,'hide','preventOverflow'))return e;var t=e.offsets.reference,o=T(e.instance.modifiers,function(e){return'preventOverflow'===e.name}).boundaries;if(t.bottom<o.top||t.left>o.right||t.top>o.bottom||t.right<o.left){if(!0===e.hide)return e;e.hide=!0,e.attributes['x-out-of-boundaries']=''}else{if(!1===e.hide)return e;e.hide=!1,e.attributes['x-out-of-boundaries']=!1}return e}},computeStyle:{order:850,enabled:!0,fn:function(e,t){var o=t.x,i=t.y,n=e.offsets.popper,p=T(e.instance.modifiers,function(e){return'applyStyle'===e.name}).gpuAcceleration;void 0!==p&&console.warn('WARNING: `gpuAcceleration` option moved to `computeStyle` modifier and will not be supported in future versions of Popper.js!');var s,d,a=void 0===p?t.gpuAcceleration:p,f=r(e.instance.popper),l=g(f),m={position:n.position},h={left:V(n.left),top:V(n.top),bottom:V(n.bottom),right:V(n.right)},c='bottom'===o?'top':'bottom',u='right'===i?'left':'right',b=B('transform');if(d='bottom'==c?-l.height+h.bottom:h.top,s='right'==u?-l.width+h.right:h.left,a&&b)m[b]='translate3d('+s+'px, '+d+'px, 0)',m[c]=0,m[u]=0,m.willChange='transform';else{var y='bottom'==c?-1:1,w='right'==u?-1:1;m[c]=d*y,m[u]=s*w,m.willChange=c+', '+u}var v={"x-placement":e.placement};return e.attributes=se({},v,e.attributes),e.styles=se({},m,e.styles),e},gpuAcceleration:!0,x:'bottom',y:'right'},applyStyle:{order:900,enabled:!0,fn:function(e){return U(e.instance.popper,e.styles),Y(e.instance.popper,e.attributes),e.offsets.arrow&&U(e.arrowElement,e.offsets.arrow),e},onLoad:function(e,t,o,i,n){var r=x(n,t,e),p=E(o.placement,r,t,e,o.modifiers.flip.boundariesElement,o.modifiers.flip.padding);return t.setAttribute('x-placement',p),U(t,{position:'absolute'}),o},gpuAcceleration:void 0}}},le});
diff --git a/tests/travis/prepare_mysql.sh b/tests/travis/prepare_mysql.sh
index b3d84253c..095ad7e25 100755
--- a/tests/travis/prepare_mysql.sh
+++ b/tests/travis/prepare_mysql.sh
@@ -27,22 +27,27 @@ set -e
echo "Preparing for MySQL ..."
+if [[ "$MYSQL_VERSION" == "5.7" ]]; then
+ echo "Using MySQL 5.7 in Docker container, need to use TCP"
+ export PROTO="--protocol=TCP"
+fi
+
# Print out some MySQL information
mysql --version
-mysql -e "SELECT VERSION();"
-mysql -e "SHOW VARIABLES LIKE 'max_allowed_packet';"
-mysql -e "SHOW VARIABLES LIKE 'collation_%';"
-mysql -e "SHOW VARIABLES LIKE 'character_set%';"
-mysql -e "SELECT @@sql_mode;"
+mysql $PROTO -e "SELECT VERSION();"
+mysql $PROTO -e "SHOW VARIABLES LIKE 'max_allowed_packet';"
+mysql $PROTO -e "SHOW VARIABLES LIKE 'collation_%';"
+mysql $PROTO -e "SHOW VARIABLES LIKE 'character_set%';"
+mysql $PROTO -e "SELECT @@sql_mode;"
# Create Hubzilla database
-mysql -u root -e "CREATE DATABASE IF NOT EXISTS hubzilla;";
-mysql -u root -e "CREATE USER 'hubzilla'@'localhost' IDENTIFIED BY 'hubzilla';"
-mysql -u root -e "GRANT ALL ON hubzilla.* TO 'hubzilla'@'localhost';"
+mysql $PROTO -u root -e "CREATE DATABASE IF NOT EXISTS hubzilla;";
+mysql $PROTO -u root -e "CREATE USER 'hubzilla'@'localhost' IDENTIFIED BY 'hubzilla';"
+mysql $PROTO -u root -e "GRANT ALL ON hubzilla.* TO 'hubzilla'@'localhost';"
# Import table structure
-mysql -u root hubzilla < ./install/schema_mysql.sql
+mysql $PROTO -u root hubzilla < ./install/schema_mysql.sql
# Show databases and tables
-mysql -u root -e "SHOW DATABASES;"
-mysql -u root -e "USE hubzilla; SHOW TABLES;"
+mysql $PROTO -u root -e "SHOW DATABASES;"
+mysql $PROTO -u root -e "USE hubzilla; SHOW TABLES;"
diff --git a/tests/unit/Access/PermissionsTest.php b/tests/unit/Access/PermissionsTest.php
new file mode 100644
index 000000000..93c641fb1
--- /dev/null
+++ b/tests/unit/Access/PermissionsTest.php
@@ -0,0 +1,148 @@
+<?php
+/*
+ * Copyright (c) 2017 Hubzilla
+ *
+ * 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.
+ */
+
+namespace Zotlabs\Tests\Unit\Access;
+
+use Zotlabs\Tests\Unit\UnitTestCase;
+use Zotlabs\Access\Permissions;
+
+/**
+ * @brief Unit Test case for Permissions class.
+ *
+ * @covers Zotlabs\Access\Permissions
+ */
+class PermissionsTest extends UnitTestCase {
+
+ /**
+ * @dataProvider FilledPermsProvider
+ */
+ public function testFilledPerms($permarr, $expected) {
+ $this->markTestIncomplete(
+ 'Need to mock static function Permissions::Perms() ...'
+ );
+ //$this->assertEquals($expected, Permissions::FilledPerms($permarr));
+
+/* $perms = $this->getMockBuilder(Permissions::class)
+ ->setMethods(['Perms'])
+ ->getMock();
+ $perms->expects($this->once())
+ ->method('Perms');
+ // still calls the static self::Perms()
+ $perms->FilledPerms($permarr);
+*/
+ }
+ public function FilledPermsProvider() {
+ return [
+ 'empty' => [
+ [],
+ ['perm1' => 0, 'perm2' => 0]
+ ],
+ 'valild' => [
+ [['perm1' => 1]],
+ ['perm1' => 1, 'perm2' => 0]
+ ]
+ ];
+ }
+/* public function testFilledPermsNull() {
+ // need to mock global function btlogger();
+ Permissions::FilledPerms(null);
+ }
+*/
+ /**
+ * @dataProvider OPermsProvider
+ *
+ * @param array $permarr
+ * @param array $expected
+ */
+ public function testOPerms($permarr, $expected) {
+ $this->assertEquals($expected, Permissions::OPerms($permarr));
+ }
+ /**
+ * @return Associative array with test values for OPerms()
+ * * \e array Array to test
+ * * \e array Expect array
+ */
+ public function OPermsProvider() {
+ return [
+ 'empty' => [
+ [],
+ []
+ ],
+ 'valid' => [
+ ['perm1' => 1, 'perm2' => 0],
+ [['name' => 'perm1', 'value' => 1], ['name' => 'perm2', 'value' => 0]]
+ ],
+ 'null array' => [
+ null,
+ []
+ ]
+ ];
+ }
+
+
+ /**
+ * @dataProvider permsCompareProvider
+ *
+ * @param array $p1
+ * @param array $p2
+ * @param boolean $expectedresult
+ */
+ public function testPermsCompare($p1, $p2, $expectedresult) {
+ $this->assertEquals($expectedresult, Permissions::PermsCompare($p1, $p2));
+ }
+ /**
+ * @return Associative array with test values for PermsCompare()
+ * * \e array 1st array
+ * * \e array 2nd array
+ * * \e boolean expected result for the test
+ */
+ public function permsCompareProvider() {
+ return [
+ 'equal' => [
+ ['perm1' => 1, 'perm2' => 0],
+ ['perm1' => 1, 'perm2' => 0],
+ true
+ ],
+ 'different values' => [
+ ['perm1' => 1, 'perm2' => 0],
+ ['perm1' => 0, 'perm2' => 1],
+ false
+ ],
+ 'different order' => [
+ ['perm1' => 1, 'perm2' => 0],
+ ['perm2' => 0, 'perm1' => 1],
+ true
+ ],
+ 'partial first in second' => [
+ ['perm1' => 1],
+ ['perm1' => 1, 'perm2' => 0],
+ true
+ ],
+ 'partial second in first' => [
+ ['perm1' => 1, 'perm2' => 0],
+ ['perm1' => 1],
+ false
+ ]
+ ];
+ }
+} \ No newline at end of file
diff --git a/tests/unit/includes/MarkdownTest.php b/tests/unit/includes/MarkdownTest.php
new file mode 100644
index 000000000..3026c633a
--- /dev/null
+++ b/tests/unit/includes/MarkdownTest.php
@@ -0,0 +1,149 @@
+<?php
+/*
+ * Copyright (c) 2017 Hubzilla
+*
+* 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.
+*/
+
+namespace Zotlabs\Tests\Unit\includes;
+
+use Zotlabs\Tests\Unit\UnitTestCase;
+use phpmock\phpunit\PHPMock;
+
+require_once 'include/markdown.php';
+
+/**
+ * @brief Unit Test case for markdown functions.
+ */
+class MarkdownTest extends UnitTestCase {
+ use PHPMock;
+
+ /**
+ * @covers ::html2markdown
+ * @dataProvider html2markdownProvider
+ */
+ public function testHtml2markdown($html, $markdown) {
+ $this->assertEquals($markdown, html2markdown($html));
+ }
+
+ public function html2markdownProvider() {
+ return [
+ 'empty text' => [
+ '',
+ ''
+ ],
+ 'space and nbsp only' => [
+ ' &nbsp;',
+ ''
+ ],
+ 'strong, b, em, i, bib' => [
+ '<strong>strong</strong> <b>bold</b> <em>em</em> <i>italic</i> <b>bo<i>italic</i>ld</b>',
+ '**strong** **bold** _em_ _italic_ **bo_italic_ld**'
+ ],
+ 'empty tags' => [
+ 'text1 <b></b> text2 <i></i>',
+ 'text1 text2'
+ ],
+ 'HTML entities, lt does not work' => [
+ '& gt > lt <',
+ '& gt > lt'
+ ],
+ 'escaped HTML entities' => [
+ '&amp; lt &lt; gt &gt;',
+ '& lt < gt >'
+ ],
+ 'our escaped HTML entities' => [
+ '&_lt_; &_gt_; &_amp_;',
+ '&\_lt\_; &\_gt\_; &\_amp\_;'
+ ],
+ 'linebreak' => [
+ "line1<br>line2\nline3",
+ "line1 \nline2 line3"
+ ],
+ 'headlines' => [
+ '<h1>header1</h1><h3>Header 3</h3>',
+ "header1\n=======\n\n### Header 3"
+ ],
+ 'unordered list' => [
+ '<ul><li>Item 1</li><li>Item 2</li><li>Item <b>3</b></li></ul>',
+ "- Item 1\n- Item 2\n- Item **3**"
+ ],
+ 'ordered list' => [
+ '<ol><li>Item 1</li><li>Item 2</li><li>Item <b>3</b></li></ol>',
+ "1. Item 1\n2. Item 2\n3. Item **3**"
+ ],
+ 'nested lists' => [
+ '<ul><li>Item 1<ol><li>Item 1a</li><li>Item <b>1b</b></ol></li><li>Item 2</li></ul>',
+ "- Item 1\n 1. Item 1a\n 2. Item **1b**\n- Item 2"
+ ],
+ 'img' => [
+ '<img src="/path/to/img.png" alt="alt text" title="title text">',
+ '![alt text](/path/to/img.png "title text")'
+ ],
+ 'link' => [
+ '<a href="http://hubzilla.org" title="Hubzilla">link</a>',
+ '[link](http://hubzilla.org "Hubzilla")'
+ ],
+ 'img link' => [
+ '<a href="http://hubzilla.org" title="Hubzilla"><img src="/img/hubzilla.png" alt="alt img text" title="img title"></a>',
+ '[![alt img text](/img/hubzilla.png "img title")](http://hubzilla.org "Hubzilla")'
+ ],
+ 'script' => [
+ "<script>alert('test');</script>",
+ "<script>alert('test');</script>"
+ ],
+ 'blockquote, issue #793' => [
+ '<blockquote>something</blockquote>blah',
+ "> something\n\nblah"
+ ],
+ 'code' => [
+ '<code>&lt;p&gt;HTML text&lt;/p&gt;</code>',
+ '`<p>HTML text</p>`'
+ ],
+ 'pre' => [
+ '<pre> line with spaces </pre>',
+ '` line with spaces `'
+ ],
+ 'div p' => [
+ '<div>div</div><div><p>p</p></div>',
+ "<div>div</div><div>p\n\n</div>"
+ ]
+ ];
+ }
+
+ /*public function testHtml2markdownException() {
+ //$this->expectException(\InvalidArgumentException::class);
+ // need to stub logger() for this to work
+ $this->assertEquals('', html2markdown('<<invalid'));
+ }*/
+
+/* public function testBB2diasporaMardown() {
+ //stub bbcode() and return our HTML, we just need to test the HTML2Markdown library.
+ $html1 = 'test<b>bold</b><br><i>i</i><ul><li>li1</li><li>li2</li></ul><br>';
+ $bb1 = 'test';
+
+ // php-mock can not mock global functions which is called by a global function.
+ // If the calling function is in a namespace it does work.
+ $bbc = $this->getFunctionMock(__NAMESPACE__, "bbcode");
+ $bbc->expects($this->once())->willReturn('test<b>bold</b><br><i>i</i><ul><li>li1</li><li>li2</li></ul><br>');
+
+ $this->assertEquals($bb1, bb2diaspora($html1));
+ }
+*/
+} \ No newline at end of file
diff --git a/tests/unit/includes/TextTest.php b/tests/unit/includes/TextTest.php
index e2c7cbb9a..acc490001 100644
--- a/tests/unit/includes/TextTest.php
+++ b/tests/unit/includes/TextTest.php
@@ -11,17 +11,6 @@ use Zotlabs\Tests\Unit\UnitTestCase;
*/
class TextTest extends UnitTestCase {
- public function testGoodEmail() {
- $this->assertTrue(valid_email_regex('ken@spaz.org'));
- $this->assertTrue(valid_email_regex('ken@restivo.org'));
- $this->assertTrue(valid_email_regex('nobody@hubzilla.org'));
- $this->assertTrue(valid_email_regex('foo+nobody@hubzilla.org'));
- }
-
- public function testBadEmail() {
- $this->assertFalse(valid_email_regex('nobody!uses!these!any.more'));
- $this->assertFalse(valid_email_regex('foo@bar@hubzilla.org'));
- }
public function testPurifyHTML() {
// linebreaks
@@ -46,6 +35,9 @@ empty line above';
$this->assertEquals('<ul><li>item1</li></ul>', purify_html('<ul data-accordion-menu-unknown><li>item1</li></ul>'));
}
+ /**
+ * @covers ::purify_html
+ */
public function testPurifyHTML_html() {
$this->assertEquals('<div id="id01"><p class="class01">ids und classes</p></div>', purify_html('<div id="id01"><p class="class01">ids und classes</p></div>'));
$this->assertEquals('<div><p>close missing tags</p></div>', purify_html('<div><p>close missing tags'));
@@ -59,6 +51,9 @@ empty line above';
$this->assertEquals('', purify_html('<iframe width="560" height="315" src="https://www.youtube.com/embed/kiNGx5oL7hk" frameborder="0" allowfullscreen></iframe>'));
}
+ /**
+ * @covers ::purify_html
+ */
public function testPurifyHTML_js() {
$this->assertEquals('<div></div>', purify_html('<div><img src="javascript:evil();" onload="evil();"></div>'));
$this->assertEquals('<a href="#">link</a>', purify_html('<a href="#" onclick="alert(\'xss\')">link</a>'));
@@ -66,6 +61,9 @@ empty line above';
$this->assertEquals('', purify_html('<script>alter("42")</script>'));
}
+ /**
+ * @covers ::purify_html
+ */
public function testPurifyHTML_css() {
$this->assertEquals('<p style="color:#FF0000;background-color:#fff;">red</p>', purify_html('<p style="color:red; background-color:#fff">red</p>'));
$this->assertEquals('<p>invalid color</p>', purify_html('<p style="color:invalid; background-color:#jjkkmm">invalid color</p>'));
diff --git a/util/hmessages.po b/util/hmessages.po
index 1a9559509..2fa62031d 100644
--- a/util/hmessages.po
+++ b/util/hmessages.po
@@ -6,9 +6,9 @@
#, fuzzy
msgid ""
msgstr ""
-"Project-Id-Version: 2.3.5\n"
+"Project-Id-Version: 2.6RC\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2017-05-01 15:36+0200\n"
+"POT-Creation-Date: 2017-08-01 11:59+0200\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
@@ -17,163 +17,147 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-#: ../../Zotlabs/Access/Permissions.php:46
+#: ../../Zotlabs/Access/Permissions.php:53
msgid "Can view my channel stream and posts"
msgstr ""
-#: ../../Zotlabs/Access/Permissions.php:47 ../../include/permissions.php:42
+#: ../../Zotlabs/Access/Permissions.php:54
msgid "Can send me their channel stream and posts"
msgstr ""
-#: ../../Zotlabs/Access/Permissions.php:48 ../../include/permissions.php:36
+#: ../../Zotlabs/Access/Permissions.php:55
msgid "Can view my default channel profile"
msgstr ""
-#: ../../Zotlabs/Access/Permissions.php:49 ../../include/permissions.php:37
+#: ../../Zotlabs/Access/Permissions.php:56
msgid "Can view my connections"
msgstr ""
-#: ../../Zotlabs/Access/Permissions.php:50 ../../include/permissions.php:38
+#: ../../Zotlabs/Access/Permissions.php:57
msgid "Can view my file storage and photos"
msgstr ""
-#: ../../Zotlabs/Access/Permissions.php:51
+#: ../../Zotlabs/Access/Permissions.php:58
msgid "Can upload/modify my file storage and photos"
msgstr ""
-#: ../../Zotlabs/Access/Permissions.php:52
+#: ../../Zotlabs/Access/Permissions.php:59
msgid "Can view my channel webpages"
msgstr ""
-#: ../../Zotlabs/Access/Permissions.php:53
+#: ../../Zotlabs/Access/Permissions.php:60
msgid "Can view my wiki pages"
msgstr ""
-#: ../../Zotlabs/Access/Permissions.php:54
+#: ../../Zotlabs/Access/Permissions.php:61
msgid "Can create/edit my channel webpages"
msgstr ""
-#: ../../Zotlabs/Access/Permissions.php:55
+#: ../../Zotlabs/Access/Permissions.php:62
msgid "Can write to my wiki pages"
msgstr ""
-#: ../../Zotlabs/Access/Permissions.php:56
+#: ../../Zotlabs/Access/Permissions.php:63
msgid "Can post on my channel (wall) page"
msgstr ""
-#: ../../Zotlabs/Access/Permissions.php:57 ../../include/permissions.php:44
+#: ../../Zotlabs/Access/Permissions.php:64
msgid "Can comment on or like my posts"
msgstr ""
-#: ../../Zotlabs/Access/Permissions.php:58 ../../include/permissions.php:45
+#: ../../Zotlabs/Access/Permissions.php:65
msgid "Can send me private mail messages"
msgstr ""
-#: ../../Zotlabs/Access/Permissions.php:59
+#: ../../Zotlabs/Access/Permissions.php:66
msgid "Can like/dislike profiles and profile things"
msgstr ""
-#: ../../Zotlabs/Access/Permissions.php:60
+#: ../../Zotlabs/Access/Permissions.php:67
msgid "Can forward to all my channel connections via @+ mentions in posts"
msgstr ""
-#: ../../Zotlabs/Access/Permissions.php:61
+#: ../../Zotlabs/Access/Permissions.php:68
msgid "Can chat with me"
msgstr ""
-#: ../../Zotlabs/Access/Permissions.php:62 ../../include/permissions.php:53
+#: ../../Zotlabs/Access/Permissions.php:69
msgid "Can source my public posts in derived channels"
msgstr ""
-#: ../../Zotlabs/Access/Permissions.php:63
+#: ../../Zotlabs/Access/Permissions.php:70
msgid "Can administer my channel"
msgstr ""
#: ../../Zotlabs/Access/PermissionRoles.php:248
-#: ../../include/permissions.php:946
msgid "Social Networking"
msgstr ""
#: ../../Zotlabs/Access/PermissionRoles.php:249
-#: ../../include/permissions.php:946
msgid "Social - Mostly Public"
msgstr ""
#: ../../Zotlabs/Access/PermissionRoles.php:250
-#: ../../include/permissions.php:946
msgid "Social - Restricted"
msgstr ""
#: ../../Zotlabs/Access/PermissionRoles.php:251
-#: ../../include/permissions.php:946
msgid "Social - Private"
msgstr ""
#: ../../Zotlabs/Access/PermissionRoles.php:254
-#: ../../include/permissions.php:947
msgid "Community Forum"
msgstr ""
#: ../../Zotlabs/Access/PermissionRoles.php:255
-#: ../../include/permissions.php:947
msgid "Forum - Mostly Public"
msgstr ""
#: ../../Zotlabs/Access/PermissionRoles.php:256
-#: ../../include/permissions.php:947
msgid "Forum - Restricted"
msgstr ""
#: ../../Zotlabs/Access/PermissionRoles.php:257
-#: ../../include/permissions.php:947
msgid "Forum - Private"
msgstr ""
#: ../../Zotlabs/Access/PermissionRoles.php:260
-#: ../../include/permissions.php:948
msgid "Feed Republish"
msgstr ""
#: ../../Zotlabs/Access/PermissionRoles.php:261
-#: ../../include/permissions.php:948
msgid "Feed - Mostly Public"
msgstr ""
#: ../../Zotlabs/Access/PermissionRoles.php:262
-#: ../../include/permissions.php:948
msgid "Feed - Restricted"
msgstr ""
#: ../../Zotlabs/Access/PermissionRoles.php:265
-#: ../../include/permissions.php:949
msgid "Special Purpose"
msgstr ""
#: ../../Zotlabs/Access/PermissionRoles.php:266
-#: ../../include/permissions.php:949
msgid "Special - Celebrity/Soapbox"
msgstr ""
#: ../../Zotlabs/Access/PermissionRoles.php:267
-#: ../../include/permissions.php:949
msgid "Special - Group Repository"
msgstr ""
#: ../../Zotlabs/Access/PermissionRoles.php:270
-#: ../../Zotlabs/Module/New_channel.php:132
+#: ../../Zotlabs/Module/Cdav.php:1123 ../../Zotlabs/Module/New_channel.php:132
#: ../../Zotlabs/Module/Settings/Channel.php:463
-#: ../../Zotlabs/Module/Connedit.php:914 ../../Zotlabs/Module/Profiles.php:798
-#: ../../Zotlabs/Module/Register.php:213 ../../addon/cdav/Mod_Cdav.php:1148
-#: ../../addon/cdav/cdav.php:277 ../../addon/cdav/cdav.php:284
-#: ../../include/selectors.php:49 ../../include/selectors.php:66
-#: ../../include/selectors.php:104 ../../include/selectors.php:140
-#: ../../include/permissions.php:950 ../../include/connections.php:675
-#: ../../include/connections.php:682
+#: ../../Zotlabs/Module/Connedit.php:931 ../../Zotlabs/Module/Profiles.php:798
+#: ../../Zotlabs/Module/Register.php:213 ../../include/selectors.php:49
+#: ../../include/selectors.php:66 ../../include/selectors.php:104
+#: ../../include/selectors.php:140 ../../include/event.php:1297
+#: ../../include/event.php:1304 ../../include/connections.php:681
+#: ../../include/connections.php:688
msgid "Other"
msgstr ""
#: ../../Zotlabs/Access/PermissionRoles.php:271
-#: ../../include/permissions.php:950
msgid "Custom/Expert Mode"
msgstr ""
@@ -182,7 +166,7 @@ msgstr ""
#: ../../Zotlabs/Module/Hcard.php:12 ../../Zotlabs/Module/Editblock.php:31
#: ../../Zotlabs/Module/Profile.php:20 ../../Zotlabs/Module/Layouts.php:31
#: ../../Zotlabs/Module/Editwebpage.php:32 ../../Zotlabs/Module/Webpages.php:33
-#: ../../Zotlabs/Module/Filestorage.php:59 ../../include/channel.php:945
+#: ../../Zotlabs/Module/Filestorage.php:51 ../../include/channel.php:960
msgid "Requested profile is not available."
msgstr ""
@@ -196,57 +180,57 @@ msgstr ""
#: ../../Zotlabs/Module/Appman.php:82 ../../Zotlabs/Module/Regmod.php:21
#: ../../Zotlabs/Module/New_channel.php:77
#: ../../Zotlabs/Module/New_channel.php:104
-#: ../../Zotlabs/Module/Sharedwithme.php:11 ../../Zotlabs/Module/Setup.php:212
+#: ../../Zotlabs/Module/Sharedwithme.php:16 ../../Zotlabs/Module/Setup.php:209
+#: ../../Zotlabs/Module/Moderate.php:13
#: ../../Zotlabs/Module/Achievements.php:34 ../../Zotlabs/Module/Thing.php:274
#: ../../Zotlabs/Module/Thing.php:294 ../../Zotlabs/Module/Thing.php:335
#: ../../Zotlabs/Module/Api.php:24 ../../Zotlabs/Module/Editblock.php:67
-#: ../../Zotlabs/Module/Profile.php:83 ../../Zotlabs/Module/Profile.php:100
+#: ../../Zotlabs/Module/Profile.php:85 ../../Zotlabs/Module/Profile.php:102
#: ../../Zotlabs/Module/Mood.php:116 ../../Zotlabs/Module/Connections.php:29
-#: ../../Zotlabs/Module/Viewsrc.php:19 ../../Zotlabs/Module/Bookmarks.php:61
+#: ../../Zotlabs/Module/Viewsrc.php:19 ../../Zotlabs/Module/Bookmarks.php:64
#: ../../Zotlabs/Module/Photos.php:69 ../../Zotlabs/Module/Wiki.php:50
-#: ../../Zotlabs/Module/Wiki.php:216 ../../Zotlabs/Module/Wiki.php:315
-#: ../../Zotlabs/Module/Pdledit.php:29 ../../Zotlabs/Module/Poke.php:137
+#: ../../Zotlabs/Module/Wiki.php:235 ../../Zotlabs/Module/Wiki.php:341
+#: ../../Zotlabs/Module/Pdledit.php:29 ../../Zotlabs/Module/Poke.php:149
#: ../../Zotlabs/Module/Profile_photo.php:280
#: ../../Zotlabs/Module/Profile_photo.php:293
-#: ../../Zotlabs/Module/Authtest.php:16 ../../Zotlabs/Module/Item.php:221
-#: ../../Zotlabs/Module/Item.php:231 ../../Zotlabs/Module/Item.php:1038
-#: ../../Zotlabs/Module/Page.php:35 ../../Zotlabs/Module/Page.php:91
-#: ../../Zotlabs/Module/Connedit.php:385 ../../Zotlabs/Module/Chat.php:98
-#: ../../Zotlabs/Module/Chat.php:103 ../../Zotlabs/Module/Menu.php:78
-#: ../../Zotlabs/Module/Layouts.php:71 ../../Zotlabs/Module/Layouts.php:78
-#: ../../Zotlabs/Module/Layouts.php:89 ../../Zotlabs/Module/Group.php:13
-#: ../../Zotlabs/Module/Profiles.php:198 ../../Zotlabs/Module/Profiles.php:635
+#: ../../Zotlabs/Module/Authtest.php:16 ../../Zotlabs/Module/Item.php:223
+#: ../../Zotlabs/Module/Item.php:240 ../../Zotlabs/Module/Item.php:250
+#: ../../Zotlabs/Module/Item.php:1076 ../../Zotlabs/Module/Page.php:34
+#: ../../Zotlabs/Module/Page.php:125 ../../Zotlabs/Module/Connedit.php:385
+#: ../../Zotlabs/Module/Chat.php:100 ../../Zotlabs/Module/Chat.php:105
+#: ../../Zotlabs/Module/Menu.php:78 ../../Zotlabs/Module/Layouts.php:71
+#: ../../Zotlabs/Module/Layouts.php:78 ../../Zotlabs/Module/Layouts.php:89
+#: ../../Zotlabs/Module/Group.php:13 ../../Zotlabs/Module/Profiles.php:198
+#: ../../Zotlabs/Module/Profiles.php:635
#: ../../Zotlabs/Module/Editwebpage.php:68
#: ../../Zotlabs/Module/Editwebpage.php:89
#: ../../Zotlabs/Module/Editwebpage.php:107
#: ../../Zotlabs/Module/Editwebpage.php:121 ../../Zotlabs/Module/Manage.php:10
-#: ../../Zotlabs/Module/Webpages.php:116 ../../Zotlabs/Module/Block.php:26
-#: ../../Zotlabs/Module/Block.php:76 ../../Zotlabs/Module/Editpost.php:17
+#: ../../Zotlabs/Module/Webpages.php:118 ../../Zotlabs/Module/Block.php:24
+#: ../../Zotlabs/Module/Block.php:74 ../../Zotlabs/Module/Editpost.php:17
#: ../../Zotlabs/Module/Sources.php:74 ../../Zotlabs/Module/Like.php:181
#: ../../Zotlabs/Module/Suggest.php:28 ../../Zotlabs/Module/Message.php:18
-#: ../../Zotlabs/Module/Mail.php:164 ../../Zotlabs/Module/Register.php:77
+#: ../../Zotlabs/Module/Mail.php:146 ../../Zotlabs/Module/Register.php:77
#: ../../Zotlabs/Module/Cover_photo.php:281
#: ../../Zotlabs/Module/Cover_photo.php:294 ../../Zotlabs/Module/Network.php:15
-#: ../../Zotlabs/Module/Filestorage.php:23
-#: ../../Zotlabs/Module/Filestorage.php:78
-#: ../../Zotlabs/Module/Filestorage.php:93
-#: ../../Zotlabs/Module/Filestorage.php:120 ../../Zotlabs/Module/Common.php:39
+#: ../../Zotlabs/Module/Filestorage.php:15
+#: ../../Zotlabs/Module/Filestorage.php:70
+#: ../../Zotlabs/Module/Filestorage.php:85
+#: ../../Zotlabs/Module/Filestorage.php:112 ../../Zotlabs/Module/Common.php:39
#: ../../Zotlabs/Module/Viewconnections.php:28
#: ../../Zotlabs/Module/Viewconnections.php:33
#: ../../Zotlabs/Module/Service_limits.php:11 ../../Zotlabs/Module/Rate.php:113
#: ../../Zotlabs/Module/Notifications.php:11 ../../Zotlabs/Lib/Chatroom.php:137
#: ../../Zotlabs/Web/WebServer.php:131 ../../addon/keepout/keepout.php:36
#: ../../addon/openid/Mod_Id.php:53 ../../addon/gitwiki/Mod_Gitwiki.php:196
-#: ../../addon/gitwiki/Mod_Gitwiki.php:292
-#: ../../addon/diaspora_reconnect/diaspora_reconnect.php:58
-#: ../../addon/pumpio/pumpio.php:40 ../../include/attach.php:144
-#: ../../include/attach.php:191 ../../include/attach.php:255
-#: ../../include/attach.php:269 ../../include/attach.php:276
-#: ../../include/attach.php:344 ../../include/attach.php:358
-#: ../../include/attach.php:365 ../../include/attach.php:442
-#: ../../include/attach.php:909 ../../include/attach.php:983
-#: ../../include/attach.php:1148 ../../include/items.php:3470
-#: ../../include/photos.php:27
+#: ../../addon/gitwiki/Mod_Gitwiki.php:292 ../../addon/pumpio/pumpio.php:40
+#: ../../include/attach.php:144 ../../include/attach.php:191
+#: ../../include/attach.php:255 ../../include/attach.php:269
+#: ../../include/attach.php:276 ../../include/attach.php:344
+#: ../../include/attach.php:358 ../../include/attach.php:365
+#: ../../include/attach.php:442 ../../include/attach.php:911
+#: ../../include/attach.php:985 ../../include/attach.php:1150
+#: ../../include/items.php:3440 ../../include/photos.php:28
msgid "Permission denied."
msgstr ""
@@ -255,7 +239,7 @@ msgstr ""
msgid "Block Name"
msgstr ""
-#: ../../Zotlabs/Module/Blocks.php:154 ../../include/text.php:2267
+#: ../../Zotlabs/Module/Blocks.php:154 ../../include/text.php:2280
msgid "Blocks"
msgstr ""
@@ -264,24 +248,22 @@ msgid "Block Title"
msgstr ""
#: ../../Zotlabs/Module/Blocks.php:157 ../../Zotlabs/Module/Menu.php:114
-#: ../../Zotlabs/Module/Layouts.php:191 ../../Zotlabs/Module/Webpages.php:256
-#: ../../include/page_widgets.php:47
+#: ../../Zotlabs/Module/Layouts.php:191 ../../Zotlabs/Module/Webpages.php:251
msgid "Created"
msgstr ""
#: ../../Zotlabs/Module/Blocks.php:158 ../../Zotlabs/Module/Menu.php:115
-#: ../../Zotlabs/Module/Layouts.php:192 ../../Zotlabs/Module/Webpages.php:257
-#: ../../include/page_widgets.php:48
+#: ../../Zotlabs/Module/Layouts.php:192 ../../Zotlabs/Module/Webpages.php:252
msgid "Edited"
msgstr ""
-#: ../../Zotlabs/Module/Blocks.php:159 ../../Zotlabs/Module/New_channel.php:147
-#: ../../Zotlabs/Module/Connedit.php:917 ../../Zotlabs/Module/Menu.php:118
+#: ../../Zotlabs/Module/Blocks.php:159 ../../Zotlabs/Module/Cdav.php:1126
+#: ../../Zotlabs/Module/New_channel.php:147
+#: ../../Zotlabs/Module/Connedit.php:934 ../../Zotlabs/Module/Menu.php:118
#: ../../Zotlabs/Module/Layouts.php:185 ../../Zotlabs/Module/Profiles.php:801
-#: ../../Zotlabs/Module/Webpages.php:244 ../../Zotlabs/Storage/Browser.php:228
-#: ../../Zotlabs/Storage/Browser.php:332 ../../addon/cdav/Mod_Cdav.php:1151
-#: ../../addon/cdav/include/widgets.php:127
-#: ../../addon/cdav/include/widgets.php:164
+#: ../../Zotlabs/Module/Webpages.php:239 ../../Zotlabs/Storage/Browser.php:229
+#: ../../Zotlabs/Storage/Browser.php:335 ../../Zotlabs/Widget/Cdav.php:127
+#: ../../Zotlabs/Widget/Cdav.php:164
msgid "Create"
msgstr ""
@@ -289,51 +271,49 @@ msgstr ""
#: ../../Zotlabs/Module/Admin/Profs.php:154
#: ../../Zotlabs/Module/Settings/Oauth.php:149
#: ../../Zotlabs/Module/Thing.php:260 ../../Zotlabs/Module/Editblock.php:114
-#: ../../Zotlabs/Module/Connections.php:296
-#: ../../Zotlabs/Module/Connections.php:316 ../../Zotlabs/Module/Wiki.php:165
-#: ../../Zotlabs/Module/Wiki.php:275 ../../Zotlabs/Module/Menu.php:112
+#: ../../Zotlabs/Module/Connections.php:260
+#: ../../Zotlabs/Module/Connections.php:297
+#: ../../Zotlabs/Module/Connections.php:317 ../../Zotlabs/Module/Wiki.php:167
+#: ../../Zotlabs/Module/Wiki.php:300 ../../Zotlabs/Module/Menu.php:112
#: ../../Zotlabs/Module/Layouts.php:193
#: ../../Zotlabs/Module/Editwebpage.php:142
-#: ../../Zotlabs/Module/Webpages.php:245 ../../Zotlabs/Module/Editpost.php:80
-#: ../../Zotlabs/Lib/Apps.php:367 ../../Zotlabs/Lib/ThreadItem.php:107
-#: ../../Zotlabs/Storage/Browser.php:238
-#: ../../addon/cdav/include/widgets.php:125
-#: ../../addon/cdav/include/widgets.php:161
-#: ../../addon/gitwiki/Mod_Gitwiki.php:151
-#: ../../addon/gitwiki/Mod_Gitwiki.php:252 ../../include/channel.php:1044
-#: ../../include/channel.php:1048 ../../include/menu.php:113
-#: ../../include/page_widgets.php:9 ../../include/page_widgets.php:39
+#: ../../Zotlabs/Module/Webpages.php:240 ../../Zotlabs/Module/Editpost.php:85
+#: ../../Zotlabs/Lib/Apps.php:368 ../../Zotlabs/Lib/ThreadItem.php:107
+#: ../../Zotlabs/Storage/Browser.php:239 ../../Zotlabs/Widget/Cdav.php:125
+#: ../../Zotlabs/Widget/Cdav.php:161 ../../addon/gitwiki/Mod_Gitwiki.php:151
+#: ../../addon/gitwiki/Mod_Gitwiki.php:252 ../../include/channel.php:1059
+#: ../../include/channel.php:1063 ../../include/menu.php:113
msgid "Edit"
msgstr ""
-#: ../../Zotlabs/Module/Blocks.php:161 ../../Zotlabs/Module/Photos.php:1042
-#: ../../Zotlabs/Module/Layouts.php:194 ../../Zotlabs/Module/Webpages.php:246
-#: ../../addon/cdav/include/widgets.php:123 ../../include/conversation.php:1311
+#: ../../Zotlabs/Module/Blocks.php:161 ../../Zotlabs/Module/Photos.php:1044
+#: ../../Zotlabs/Module/Layouts.php:194 ../../Zotlabs/Module/Webpages.php:241
+#: ../../Zotlabs/Widget/Cdav.php:123 ../../include/conversation.php:1308
msgid "Share"
msgstr ""
#: ../../Zotlabs/Module/Blocks.php:162 ../../Zotlabs/Module/Editlayout.php:138
+#: ../../Zotlabs/Module/Cdav.php:838 ../../Zotlabs/Module/Cdav.php:1128
#: ../../Zotlabs/Module/Admin/Accounts.php:173
#: ../../Zotlabs/Module/Admin/Channels.php:149
#: ../../Zotlabs/Module/Admin/Profs.php:155
#: ../../Zotlabs/Module/Settings/Oauth.php:150
#: ../../Zotlabs/Module/Thing.php:261 ../../Zotlabs/Module/Editblock.php:139
-#: ../../Zotlabs/Module/Connections.php:267
-#: ../../Zotlabs/Module/Photos.php:1143 ../../Zotlabs/Module/Connedit.php:650
-#: ../../Zotlabs/Module/Connedit.php:919 ../../Zotlabs/Module/Group.php:177
+#: ../../Zotlabs/Module/Connections.php:268
+#: ../../Zotlabs/Module/Photos.php:1145 ../../Zotlabs/Module/Connedit.php:650
+#: ../../Zotlabs/Module/Connedit.php:936 ../../Zotlabs/Module/Group.php:179
#: ../../Zotlabs/Module/Profiles.php:803
#: ../../Zotlabs/Module/Editwebpage.php:167
-#: ../../Zotlabs/Module/Webpages.php:247 ../../Zotlabs/Lib/Apps.php:368
-#: ../../Zotlabs/Lib/ThreadItem.php:127 ../../Zotlabs/Storage/Browser.php:239
-#: ../../addon/cdav/Mod_Cdav.php:864 ../../addon/cdav/Mod_Cdav.php:1153
-#: ../../include/conversation.php:654
+#: ../../Zotlabs/Module/Webpages.php:242 ../../Zotlabs/Lib/Apps.php:369
+#: ../../Zotlabs/Lib/ThreadItem.php:127 ../../Zotlabs/Storage/Browser.php:240
+#: ../../include/conversation.php:649 ../../include/conversation.php:686
msgid "Delete"
msgstr ""
#: ../../Zotlabs/Module/Blocks.php:166 ../../Zotlabs/Module/Events.php:694
-#: ../../Zotlabs/Module/Wiki.php:167 ../../Zotlabs/Module/Layouts.php:198
-#: ../../Zotlabs/Module/Webpages.php:251 ../../Zotlabs/Module/Pubsites.php:59
-#: ../../addon/gitwiki/Mod_Gitwiki.php:153 ../../include/page_widgets.php:42
+#: ../../Zotlabs/Module/Wiki.php:169 ../../Zotlabs/Module/Layouts.php:198
+#: ../../Zotlabs/Module/Webpages.php:246 ../../Zotlabs/Module/Pubsites.php:59
+#: ../../addon/gitwiki/Mod_Gitwiki.php:153
msgid "View"
msgstr ""
@@ -366,58 +346,62 @@ msgid_plural "%d messages sent."
msgstr[0] ""
msgstr[1] ""
-#: ../../Zotlabs/Module/Invite.php:105
+#: ../../Zotlabs/Module/Invite.php:98 ../../Zotlabs/Lib/Apps.php:242
+msgid "Invite"
+msgstr ""
+
+#: ../../Zotlabs/Module/Invite.php:107
msgid "You have no more invitations available"
msgstr ""
-#: ../../Zotlabs/Module/Invite.php:136
+#: ../../Zotlabs/Module/Invite.php:138
msgid "Send invitations"
msgstr ""
-#: ../../Zotlabs/Module/Invite.php:137
+#: ../../Zotlabs/Module/Invite.php:139
msgid "Enter email addresses, one per line:"
msgstr ""
-#: ../../Zotlabs/Module/Invite.php:138 ../../Zotlabs/Module/Mail.php:303
+#: ../../Zotlabs/Module/Invite.php:140 ../../Zotlabs/Module/Mail.php:285
msgid "Your message:"
msgstr ""
-#: ../../Zotlabs/Module/Invite.php:139
+#: ../../Zotlabs/Module/Invite.php:141
msgid "Please join my community on $Projectname."
msgstr ""
-#: ../../Zotlabs/Module/Invite.php:141
+#: ../../Zotlabs/Module/Invite.php:143
msgid "You will need to supply this invitation code:"
msgstr ""
-#: ../../Zotlabs/Module/Invite.php:142
+#: ../../Zotlabs/Module/Invite.php:144
msgid "1. Register at any $Projectname location (they are all inter-connected)"
msgstr ""
-#: ../../Zotlabs/Module/Invite.php:144
+#: ../../Zotlabs/Module/Invite.php:146
msgid "2. Enter my $Projectname network address into the site searchbar."
msgstr ""
-#: ../../Zotlabs/Module/Invite.php:145
+#: ../../Zotlabs/Module/Invite.php:147
msgid "or visit"
msgstr ""
-#: ../../Zotlabs/Module/Invite.php:147
+#: ../../Zotlabs/Module/Invite.php:149
msgid "3. Click [Connect]"
msgstr ""
-#: ../../Zotlabs/Module/Invite.php:149 ../../Zotlabs/Module/Locs.php:121
+#: ../../Zotlabs/Module/Invite.php:151 ../../Zotlabs/Module/Locs.php:121
#: ../../Zotlabs/Module/Mitem.php:243 ../../Zotlabs/Module/Events.php:493
-#: ../../Zotlabs/Module/Appman.php:134
-#: ../../Zotlabs/Module/Import_items.php:129 ../../Zotlabs/Module/Setup.php:309
-#: ../../Zotlabs/Module/Setup.php:357 ../../Zotlabs/Module/Connect.php:98
+#: ../../Zotlabs/Module/Appman.php:148
+#: ../../Zotlabs/Module/Import_items.php:129 ../../Zotlabs/Module/Setup.php:308
+#: ../../Zotlabs/Module/Setup.php:349 ../../Zotlabs/Module/Connect.php:98
#: ../../Zotlabs/Module/Admin/Features.php:66
#: ../../Zotlabs/Module/Admin/Plugins.php:438
#: ../../Zotlabs/Module/Admin/Accounts.php:166
#: ../../Zotlabs/Module/Admin/Logs.php:84
#: ../../Zotlabs/Module/Admin/Channels.php:147
#: ../../Zotlabs/Module/Admin/Themes.php:158
-#: ../../Zotlabs/Module/Admin/Site.php:279
+#: ../../Zotlabs/Module/Admin/Site.php:271
#: ../../Zotlabs/Module/Admin/Profs.php:157
#: ../../Zotlabs/Module/Admin/Account_edit.php:74
#: ../../Zotlabs/Module/Admin/Security.php:104
@@ -426,25 +410,25 @@ msgstr ""
#: ../../Zotlabs/Module/Settings/Features.php:47
#: ../../Zotlabs/Module/Settings/Tokens.php:168
#: ../../Zotlabs/Module/Settings/Account.php:118
-#: ../../Zotlabs/Module/Settings/Featured.php:50
+#: ../../Zotlabs/Module/Settings/Featured.php:52
#: ../../Zotlabs/Module/Settings/Display.php:203
#: ../../Zotlabs/Module/Settings/Oauth.php:87
#: ../../Zotlabs/Module/Thing.php:320 ../../Zotlabs/Module/Thing.php:370
-#: ../../Zotlabs/Module/Import.php:514 ../../Zotlabs/Module/Cal.php:343
-#: ../../Zotlabs/Module/Mood.php:139 ../../Zotlabs/Module/Photos.php:657
-#: ../../Zotlabs/Module/Photos.php:1022 ../../Zotlabs/Module/Photos.php:1062
-#: ../../Zotlabs/Module/Photos.php:1180 ../../Zotlabs/Module/Wiki.php:169
-#: ../../Zotlabs/Module/Pdledit.php:74 ../../Zotlabs/Module/Poke.php:186
-#: ../../Zotlabs/Module/Connedit.php:882 ../../Zotlabs/Module/Chat.php:194
-#: ../../Zotlabs/Module/Chat.php:240 ../../Zotlabs/Module/Pconfig.php:107
-#: ../../Zotlabs/Module/Group.php:85 ../../Zotlabs/Module/Profiles.php:726
+#: ../../Zotlabs/Module/Import.php:518 ../../Zotlabs/Module/Cal.php:343
+#: ../../Zotlabs/Module/Mood.php:139 ../../Zotlabs/Module/Photos.php:659
+#: ../../Zotlabs/Module/Photos.php:1024 ../../Zotlabs/Module/Photos.php:1064
+#: ../../Zotlabs/Module/Photos.php:1182 ../../Zotlabs/Module/Wiki.php:171
+#: ../../Zotlabs/Module/Pdledit.php:74 ../../Zotlabs/Module/Poke.php:200
+#: ../../Zotlabs/Module/Connedit.php:899 ../../Zotlabs/Module/Chat.php:196
+#: ../../Zotlabs/Module/Chat.php:242 ../../Zotlabs/Module/Pconfig.php:107
+#: ../../Zotlabs/Module/Group.php:87 ../../Zotlabs/Module/Profiles.php:726
#: ../../Zotlabs/Module/Sources.php:114 ../../Zotlabs/Module/Sources.php:149
-#: ../../Zotlabs/Module/Xchan.php:15 ../../Zotlabs/Module/Mail.php:449
-#: ../../Zotlabs/Module/Filestorage.php:165 ../../Zotlabs/Module/Rate.php:166
-#: ../../Zotlabs/Lib/ThreadItem.php:732 ../../Zotlabs/Widget/Eventstools.php:16
-#: ../../view/theme/redbasic/php/config.php:84
-#: ../../addon/skeleton/skeleton.php:65 ../../addon/gnusoc/gnusoc.php:134
-#: ../../addon/cdav/cdav.php:246 ../../addon/planets/planets.php:157
+#: ../../Zotlabs/Module/Xchan.php:15 ../../Zotlabs/Module/Mail.php:431
+#: ../../Zotlabs/Module/Filestorage.php:157 ../../Zotlabs/Module/Rate.php:166
+#: ../../Zotlabs/Lib/ThreadItem.php:730 ../../Zotlabs/Widget/Eventstools.php:16
+#: ../../view/theme/redbasic/php/config.php:95
+#: ../../addon/skeleton/skeleton.php:65 ../../addon/gnusoc/gnusoc.php:226
+#: ../../addon/planets/planets.php:153
#: ../../addon/openclipatar/openclipatar.php:53
#: ../../addon/wppost/wppost.php:113 ../../addon/nsfw/nsfw.php:92
#: ../../addon/ijpost/ijpost.php:89 ../../addon/dwpost/dwpost.php:89
@@ -452,7 +436,7 @@ msgstr ""
#: ../../addon/likebanner/likebanner.php:57
#: ../../addon/redphotos/redphotos.php:136 ../../addon/irc/irc.php:53
#: ../../addon/ljpost/ljpost.php:86 ../../addon/startpage/startpage.php:113
-#: ../../addon/diaspora/diaspora.php:712
+#: ../../addon/diaspora/diaspora.php:759
#: ../../addon/gitwiki/Mod_Gitwiki.php:155
#: ../../addon/rainbowtag/rainbowtag.php:85 ../../addon/visage/visage.php:170
#: ../../addon/nsabait/nsabait.php:161 ../../addon/mailtest/mailtest.php:100
@@ -468,8 +452,9 @@ msgstr ""
#: ../../addon/statusnet/statusnet.php:432
#: ../../addon/statusnet/statusnet.php:899 ../../addon/twitter/twitter.php:217
#: ../../addon/twitter/twitter.php:259
-#: ../../addon/smileybutton/smileybutton.php:281 ../../addon/piwik/piwik.php:95
-#: ../../addon/pageheader/pageheader.php:48 ../../addon/xmpp/xmpp.php:69
+#: ../../addon/smileybutton/smileybutton.php:219 ../../addon/piwik/piwik.php:95
+#: ../../addon/pageheader/pageheader.php:48
+#: ../../addon/authchoose/authchoose.php:71 ../../addon/xmpp/xmpp.php:69
#: ../../addon/pumpio/pumpio.php:237 ../../addon/redfiles/redfiles.php:124
#: ../../addon/hubwall/hubwall.php:95 ../../include/js_strings.php:22
msgid "Submit"
@@ -495,11 +480,11 @@ msgid "Edit Layout"
msgstr ""
#: ../../Zotlabs/Module/Profperm.php:28 ../../Zotlabs/Module/Subthread.php:62
-#: ../../Zotlabs/Module/Import_items.php:120 ../../Zotlabs/Module/Group.php:72
+#: ../../Zotlabs/Module/Import_items.php:120 ../../Zotlabs/Module/Group.php:74
#: ../../Zotlabs/Module/Dreport.php:10 ../../Zotlabs/Module/Dreport.php:68
#: ../../Zotlabs/Module/Like.php:283 ../../Zotlabs/Web/WebServer.php:130
#: ../../addon/redphotos/redphotos.php:119 ../../addon/frphotos/frphotos.php:81
-#: ../../addon/redfiles/redfiles.php:109 ../../include/items.php:327
+#: ../../addon/redfiles/redfiles.php:109 ../../include/items.php:340
msgid "Permission denied"
msgstr ""
@@ -511,7 +496,7 @@ msgstr ""
msgid "Profile Visibility Editor"
msgstr ""
-#: ../../Zotlabs/Module/Profperm.php:113 ../../include/channel.php:1362
+#: ../../Zotlabs/Module/Profperm.php:113 ../../include/channel.php:1383
msgid "Profile"
msgstr ""
@@ -524,10 +509,290 @@ msgid "Visible To"
msgstr ""
#: ../../Zotlabs/Module/Profperm.php:140
-#: ../../Zotlabs/Module/Connections.php:141
+#: ../../Zotlabs/Module/Connections.php:140
msgid "All Connections"
msgstr ""
+#: ../../Zotlabs/Module/Cdav.php:726
+msgid "INVALID EVENT DISMISSED!"
+msgstr ""
+
+#: ../../Zotlabs/Module/Cdav.php:727
+msgid "Summary: "
+msgstr ""
+
+#: ../../Zotlabs/Module/Cdav.php:727 ../../Zotlabs/Module/Cdav.php:728
+#: ../../Zotlabs/Module/Cdav.php:735 ../../Zotlabs/Module/Embedphotos.php:146
+#: ../../Zotlabs/Module/Photos.php:759 ../../Zotlabs/Module/Photos.php:1215
+#: ../../Zotlabs/Lib/Apps.php:696 ../../Zotlabs/Lib/Apps.php:774
+#: ../../Zotlabs/Storage/Browser.php:164 ../../Zotlabs/Widget/Portfolio.php:86
+#: ../../Zotlabs/Widget/Album.php:84 ../../include/conversation.php:1107
+msgid "Unknown"
+msgstr ""
+
+#: ../../Zotlabs/Module/Cdav.php:728
+msgid "Date: "
+msgstr ""
+
+#: ../../Zotlabs/Module/Cdav.php:729 ../../Zotlabs/Module/Cdav.php:736
+msgid "Reason: "
+msgstr ""
+
+#: ../../Zotlabs/Module/Cdav.php:734
+msgid "INVALID CARD DISMISSED!"
+msgstr ""
+
+#: ../../Zotlabs/Module/Cdav.php:735
+msgid "Name: "
+msgstr ""
+
+#: ../../Zotlabs/Module/Cdav.php:768
+msgid "CalDAV"
+msgstr ""
+
+#: ../../Zotlabs/Module/Cdav.php:809 ../../Zotlabs/Module/Events.php:460
+msgid "Event title"
+msgstr ""
+
+#: ../../Zotlabs/Module/Cdav.php:810 ../../Zotlabs/Module/Events.php:466
+msgid "Start date and time"
+msgstr ""
+
+#: ../../Zotlabs/Module/Cdav.php:810 ../../Zotlabs/Module/Cdav.php:811
+msgid "Example: YYYY-MM-DD HH:mm"
+msgstr ""
+
+#: ../../Zotlabs/Module/Cdav.php:811
+msgid "End date and time"
+msgstr ""
+
+#: ../../Zotlabs/Module/Cdav.php:812 ../../Zotlabs/Module/Events.php:473
+#: ../../Zotlabs/Module/Appman.php:138 ../../Zotlabs/Module/Rbmark.php:101
+#: ../../addon/rendezvous/rendezvous.php:173
+msgid "Description"
+msgstr ""
+
+#: ../../Zotlabs/Module/Cdav.php:813 ../../Zotlabs/Module/Locs.php:117
+#: ../../Zotlabs/Module/Events.php:475 ../../Zotlabs/Module/Profiles.php:509
+#: ../../Zotlabs/Module/Profiles.php:737 ../../Zotlabs/Module/Pubsites.php:51
+#: ../../include/js_strings.php:25
+msgid "Location"
+msgstr ""
+
+#: ../../Zotlabs/Module/Cdav.php:820 ../../Zotlabs/Module/Events.php:689
+#: ../../Zotlabs/Module/Events.php:698 ../../Zotlabs/Module/Cal.php:337
+#: ../../Zotlabs/Module/Cal.php:344 ../../Zotlabs/Module/Photos.php:913
+msgid "Previous"
+msgstr ""
+
+#: ../../Zotlabs/Module/Cdav.php:821 ../../Zotlabs/Module/Events.php:690
+#: ../../Zotlabs/Module/Events.php:699 ../../Zotlabs/Module/Setup.php:263
+#: ../../Zotlabs/Module/Cal.php:338 ../../Zotlabs/Module/Cal.php:345
+#: ../../Zotlabs/Module/Photos.php:922
+msgid "Next"
+msgstr ""
+
+#: ../../Zotlabs/Module/Cdav.php:822 ../../Zotlabs/Module/Events.php:700
+#: ../../Zotlabs/Module/Cal.php:346
+msgid "Today"
+msgstr ""
+
+#: ../../Zotlabs/Module/Cdav.php:823 ../../Zotlabs/Module/Events.php:695
+msgid "Month"
+msgstr ""
+
+#: ../../Zotlabs/Module/Cdav.php:824 ../../Zotlabs/Module/Events.php:696
+msgid "Week"
+msgstr ""
+
+#: ../../Zotlabs/Module/Cdav.php:825 ../../Zotlabs/Module/Events.php:697
+msgid "Day"
+msgstr ""
+
+#: ../../Zotlabs/Module/Cdav.php:826
+msgid "List month"
+msgstr ""
+
+#: ../../Zotlabs/Module/Cdav.php:827
+msgid "List week"
+msgstr ""
+
+#: ../../Zotlabs/Module/Cdav.php:828
+msgid "List day"
+msgstr ""
+
+#: ../../Zotlabs/Module/Cdav.php:835
+msgid "More"
+msgstr ""
+
+#: ../../Zotlabs/Module/Cdav.php:836
+msgid "Less"
+msgstr ""
+
+#: ../../Zotlabs/Module/Cdav.php:837
+msgid "Select calendar"
+msgstr ""
+
+#: ../../Zotlabs/Module/Cdav.php:839
+msgid "Delete all"
+msgstr ""
+
+#: ../../Zotlabs/Module/Cdav.php:840 ../../Zotlabs/Module/Cdav.php:1129
+#: ../../Zotlabs/Module/Admin/Plugins.php:423
+#: ../../Zotlabs/Module/Settings/Oauth.php:88
+#: ../../Zotlabs/Module/Settings/Oauth.php:114
+#: ../../Zotlabs/Module/Wiki.php:290 ../../Zotlabs/Module/Wiki.php:316
+#: ../../Zotlabs/Module/Connedit.php:937 ../../Zotlabs/Module/Fbrowser.php:66
+#: ../../Zotlabs/Module/Fbrowser.php:88 ../../Zotlabs/Module/Profiles.php:804
+#: ../../Zotlabs/Module/Filer.php:55 ../../Zotlabs/Module/Tagrm.php:15
+#: ../../Zotlabs/Module/Tagrm.php:138 ../../addon/js_upload/js_upload.php:46
+#: ../../addon/gitwiki/Mod_Gitwiki.php:244
+#: ../../addon/gitwiki/Mod_Gitwiki.php:267 ../../include/conversation.php:1324
+#: ../../include/conversation.php:1373
+msgid "Cancel"
+msgstr ""
+
+#: ../../Zotlabs/Module/Cdav.php:841
+msgid "Sorry! Editing of recurrent events is not yet implemented."
+msgstr ""
+
+#: ../../Zotlabs/Module/Cdav.php:969
+msgid "CardDAV"
+msgstr ""
+
+#: ../../Zotlabs/Module/Cdav.php:1111 ../../Zotlabs/Module/Sharedwithme.php:105
+#: ../../Zotlabs/Module/Admin/Channels.php:159
+#: ../../Zotlabs/Module/Settings/Oauth.php:89
+#: ../../Zotlabs/Module/Settings/Oauth.php:115
+#: ../../Zotlabs/Module/Wiki.php:174 ../../Zotlabs/Module/Connedit.php:919
+#: ../../Zotlabs/Module/Chat.php:251 ../../Zotlabs/Lib/NativeWikiPage.php:539
+#: ../../Zotlabs/Storage/Browser.php:234
+#: ../../Zotlabs/Widget/Wiki_page_history.php:22
+#: ../../addon/rendezvous/rendezvous.php:172
+#: ../../addon/gitwiki/Mod_Gitwiki.php:158
+msgid "Name"
+msgstr ""
+
+#: ../../Zotlabs/Module/Cdav.php:1112 ../../Zotlabs/Module/Connedit.php:920
+msgid "Organisation"
+msgstr ""
+
+#: ../../Zotlabs/Module/Cdav.php:1113 ../../Zotlabs/Module/Connedit.php:921
+msgid "Title"
+msgstr ""
+
+#: ../../Zotlabs/Module/Cdav.php:1114 ../../Zotlabs/Module/Connedit.php:922
+#: ../../Zotlabs/Module/Profiles.php:789
+msgid "Phone"
+msgstr ""
+
+#: ../../Zotlabs/Module/Cdav.php:1115
+#: ../../Zotlabs/Module/Admin/Accounts.php:169
+#: ../../Zotlabs/Module/Admin/Accounts.php:181
+#: ../../Zotlabs/Module/Connedit.php:923 ../../Zotlabs/Module/Profiles.php:790
+#: ../../addon/openid/MysqlProvider.php:56
+#: ../../addon/openid/MysqlProvider.php:57 ../../addon/rtof/rtof.php:93
+#: ../../addon/redred/redred.php:107 ../../include/network.php:1696
+msgid "Email"
+msgstr ""
+
+#: ../../Zotlabs/Module/Cdav.php:1116 ../../Zotlabs/Module/Connedit.php:924
+#: ../../Zotlabs/Module/Profiles.php:791
+msgid "Instant messenger"
+msgstr ""
+
+#: ../../Zotlabs/Module/Cdav.php:1117 ../../Zotlabs/Module/Connedit.php:925
+#: ../../Zotlabs/Module/Profiles.php:792
+msgid "Website"
+msgstr ""
+
+#: ../../Zotlabs/Module/Cdav.php:1118 ../../Zotlabs/Module/Locs.php:118
+#: ../../Zotlabs/Module/Admin/Channels.php:160
+#: ../../Zotlabs/Module/Connedit.php:926 ../../Zotlabs/Module/Profiles.php:502
+#: ../../Zotlabs/Module/Profiles.php:793
+msgid "Address"
+msgstr ""
+
+#: ../../Zotlabs/Module/Cdav.php:1119 ../../Zotlabs/Module/Connedit.php:927
+#: ../../Zotlabs/Module/Profiles.php:794
+msgid "Note"
+msgstr ""
+
+#: ../../Zotlabs/Module/Cdav.php:1120 ../../Zotlabs/Module/Connedit.php:928
+#: ../../Zotlabs/Module/Profiles.php:795 ../../include/event.php:1290
+#: ../../include/connections.php:674
+msgid "Mobile"
+msgstr ""
+
+#: ../../Zotlabs/Module/Cdav.php:1121 ../../Zotlabs/Module/Connedit.php:929
+#: ../../Zotlabs/Module/Profiles.php:796 ../../include/event.php:1291
+#: ../../include/connections.php:675
+msgid "Home"
+msgstr ""
+
+#: ../../Zotlabs/Module/Cdav.php:1122 ../../Zotlabs/Module/Connedit.php:930
+#: ../../Zotlabs/Module/Profiles.php:797 ../../include/event.php:1294
+#: ../../include/connections.php:678
+msgid "Work"
+msgstr ""
+
+#: ../../Zotlabs/Module/Cdav.php:1124 ../../Zotlabs/Module/Connedit.php:932
+#: ../../Zotlabs/Module/Profiles.php:799
+#: ../../addon/jappixmini/jappixmini.php:368
+msgid "Add Contact"
+msgstr ""
+
+#: ../../Zotlabs/Module/Cdav.php:1125 ../../Zotlabs/Module/Connedit.php:933
+#: ../../Zotlabs/Module/Profiles.php:800
+msgid "Add Field"
+msgstr ""
+
+#: ../../Zotlabs/Module/Cdav.php:1127
+#: ../../Zotlabs/Module/Admin/Plugins.php:453
+#: ../../Zotlabs/Module/Settings/Oauth.php:42
+#: ../../Zotlabs/Module/Settings/Oauth.php:113
+#: ../../Zotlabs/Module/Connedit.php:935 ../../Zotlabs/Module/Profiles.php:802
+#: ../../Zotlabs/Lib/Apps.php:359
+msgid "Update"
+msgstr ""
+
+#: ../../Zotlabs/Module/Cdav.php:1130 ../../Zotlabs/Module/Connedit.php:938
+msgid "P.O. Box"
+msgstr ""
+
+#: ../../Zotlabs/Module/Cdav.php:1131 ../../Zotlabs/Module/Connedit.php:939
+msgid "Additional"
+msgstr ""
+
+#: ../../Zotlabs/Module/Cdav.php:1132 ../../Zotlabs/Module/Connedit.php:940
+msgid "Street"
+msgstr ""
+
+#: ../../Zotlabs/Module/Cdav.php:1133 ../../Zotlabs/Module/Connedit.php:941
+msgid "Locality"
+msgstr ""
+
+#: ../../Zotlabs/Module/Cdav.php:1134 ../../Zotlabs/Module/Connedit.php:942
+msgid "Region"
+msgstr ""
+
+#: ../../Zotlabs/Module/Cdav.php:1135 ../../Zotlabs/Module/Connedit.php:943
+msgid "ZIP Code"
+msgstr ""
+
+#: ../../Zotlabs/Module/Cdav.php:1136 ../../Zotlabs/Module/Connedit.php:944
+#: ../../Zotlabs/Module/Profiles.php:760
+msgid "Country"
+msgstr ""
+
+#: ../../Zotlabs/Module/Cdav.php:1183
+msgid "Default Calendar"
+msgstr ""
+
+#: ../../Zotlabs/Module/Cdav.php:1193
+msgid "Default Addressbook"
+msgstr ""
+
#: ../../Zotlabs/Module/Regdir.php:49 ../../Zotlabs/Module/Dirsearch.php:25
msgid "This site is not a directory server"
msgstr ""
@@ -537,20 +802,30 @@ msgstr ""
msgid "You must be logged in to see this page."
msgstr ""
-#: ../../Zotlabs/Module/Channel.php:47 ../../Zotlabs/Module/Hcard.php:35
-#: ../../Zotlabs/Module/Profile.php:43
+#: ../../Zotlabs/Module/Channel.php:47 ../../Zotlabs/Module/Hcard.php:37
+#: ../../Zotlabs/Module/Profile.php:45
msgid "Posts and comments"
msgstr ""
-#: ../../Zotlabs/Module/Channel.php:54 ../../Zotlabs/Module/Hcard.php:42
-#: ../../Zotlabs/Module/Profile.php:50
+#: ../../Zotlabs/Module/Channel.php:54 ../../Zotlabs/Module/Hcard.php:44
+#: ../../Zotlabs/Module/Profile.php:52
msgid "Only posts"
msgstr ""
+#: ../../Zotlabs/Module/Channel.php:97 ../../Zotlabs/Lib/Apps.php:228
+#: ../../include/nav.php:175
+msgid "Channel Home"
+msgstr ""
+
#: ../../Zotlabs/Module/Channel.php:112
msgid "Insufficient permissions. Request redirected to profile page."
msgstr ""
+#: ../../Zotlabs/Module/Lang.php:8 ../../Zotlabs/Lib/Apps.php:244
+#: ../../addon/openid/MysqlProvider.php:69
+msgid "Language"
+msgstr ""
+
#: ../../Zotlabs/Module/Uexport.php:57 ../../Zotlabs/Module/Uexport.php:58
msgid "Export Channel"
msgstr ""
@@ -616,19 +891,20 @@ msgstr ""
msgid "Public access denied."
msgstr ""
-#: ../../Zotlabs/Module/Search.php:44 ../../Zotlabs/Module/Connections.php:312
-#: ../../Zotlabs/Lib/Apps.php:237 ../../Zotlabs/Widget/Sitesearch.php:31
-#: ../../include/text.php:1027 ../../include/text.php:1039
-#: ../../include/acl_selectors.php:213 ../../include/nav.php:164
+#: ../../Zotlabs/Module/Search.php:25 ../../Zotlabs/Module/Search.php:44
+#: ../../Zotlabs/Module/Connections.php:313 ../../Zotlabs/Lib/Apps.php:238
+#: ../../Zotlabs/Widget/Sitesearch.php:31 ../../include/text.php:1021
+#: ../../include/text.php:1033 ../../include/acl_selectors.php:213
+#: ../../include/nav.php:160
msgid "Search"
msgstr ""
-#: ../../Zotlabs/Module/Search.php:224
+#: ../../Zotlabs/Module/Search.php:225
#, php-format
msgid "Items tagged with: %s"
msgstr ""
-#: ../../Zotlabs/Module/Search.php:226
+#: ../../Zotlabs/Module/Search.php:227
#, php-format
msgid "Search results for: %s"
msgstr ""
@@ -659,21 +935,7 @@ msgstr ""
msgid "Manage Channel Locations"
msgstr ""
-#: ../../Zotlabs/Module/Locs.php:117 ../../Zotlabs/Module/Events.php:475
-#: ../../Zotlabs/Module/Profiles.php:509 ../../Zotlabs/Module/Profiles.php:737
-#: ../../Zotlabs/Module/Pubsites.php:51 ../../addon/cdav/Mod_Cdav.php:839
-#: ../../include/js_strings.php:25
-msgid "Location"
-msgstr ""
-
-#: ../../Zotlabs/Module/Locs.php:118
-#: ../../Zotlabs/Module/Admin/Channels.php:160
-#: ../../Zotlabs/Module/Connedit.php:909 ../../Zotlabs/Module/Profiles.php:502
-#: ../../Zotlabs/Module/Profiles.php:793 ../../addon/cdav/Mod_Cdav.php:1143
-msgid "Address"
-msgstr ""
-
-#: ../../Zotlabs/Module/Locs.php:119
+#: ../../Zotlabs/Module/Locs.php:119 ../../Zotlabs/Module/Admin.php:111
msgid "Primary"
msgstr ""
@@ -699,6 +961,14 @@ msgstr ""
msgid "Use this form to drop the location if the hub is no longer operating."
msgstr ""
+#: ../../Zotlabs/Module/Apporder.php:34
+msgid "Change Order of Navigation Apps"
+msgstr ""
+
+#: ../../Zotlabs/Module/Apporder.php:35
+msgid "Use arrows to move the corresponding app up or down in the display list"
+msgstr ""
+
#: ../../Zotlabs/Module/Mitem.php:28 ../../Zotlabs/Module/Menu.php:144
msgid "Menu not found."
msgstr ""
@@ -725,7 +995,7 @@ msgid "Menu Item Permissions"
msgstr ""
#: ../../Zotlabs/Module/Mitem.php:154 ../../Zotlabs/Module/Mitem.php:231
-#: ../../Zotlabs/Module/Settings/Channel.php:510
+#: ../../Zotlabs/Module/Settings/Channel.php:509
msgid "(click to open/close)"
msgstr ""
@@ -748,18 +1018,18 @@ msgstr ""
#: ../../Zotlabs/Module/Mitem.php:162 ../../Zotlabs/Module/Mitem.php:163
#: ../../Zotlabs/Module/Mitem.php:240 ../../Zotlabs/Module/Mitem.php:241
#: ../../Zotlabs/Module/Events.php:470 ../../Zotlabs/Module/Events.php:471
-#: ../../Zotlabs/Module/Removeme.php:63 ../../Zotlabs/Module/Admin/Site.php:237
+#: ../../Zotlabs/Module/Removeme.php:63 ../../Zotlabs/Module/Admin/Site.php:235
#: ../../Zotlabs/Module/Settings/Channel.php:294
#: ../../Zotlabs/Module/Settings/Display.php:103
-#: ../../Zotlabs/Module/Api.php:97 ../../Zotlabs/Module/Photos.php:642
-#: ../../Zotlabs/Module/Wiki.php:180 ../../Zotlabs/Module/Connedit.php:392
+#: ../../Zotlabs/Module/Api.php:97 ../../Zotlabs/Module/Photos.php:644
+#: ../../Zotlabs/Module/Wiki.php:182 ../../Zotlabs/Module/Connedit.php:392
#: ../../Zotlabs/Module/Connedit.php:775 ../../Zotlabs/Module/Menu.php:100
#: ../../Zotlabs/Module/Menu.php:157 ../../Zotlabs/Module/Profiles.php:681
-#: ../../Zotlabs/Module/Filestorage.php:160
-#: ../../Zotlabs/Module/Filestorage.php:168 ../../boot.php:1633
-#: ../../view/theme/redbasic/php/config.php:89
-#: ../../view/theme/redbasic/php/config.php:104 ../../addon/cdav/cdav.php:234
-#: ../../addon/planets/planets.php:153 ../../addon/wppost/wppost.php:82
+#: ../../Zotlabs/Module/Filestorage.php:152
+#: ../../Zotlabs/Module/Filestorage.php:160 ../../boot.php:1602
+#: ../../view/theme/redbasic/php/config.php:100
+#: ../../view/theme/redbasic/php/config.php:115
+#: ../../addon/planets/planets.php:149 ../../addon/wppost/wppost.php:82
#: ../../addon/wppost/wppost.php:105 ../../addon/wppost/wppost.php:109
#: ../../addon/nsfw/nsfw.php:84 ../../addon/ijpost/ijpost.php:73
#: ../../addon/ijpost/ijpost.php:85 ../../addon/dwpost/dwpost.php:73
@@ -782,8 +1052,9 @@ msgstr ""
#: ../../addon/statusnet/statusnet.php:415
#: ../../addon/statusnet/statusnet.php:424 ../../addon/twitter/twitter.php:242
#: ../../addon/twitter/twitter.php:246 ../../addon/twitter/twitter.php:255
-#: ../../addon/smileybutton/smileybutton.php:273
-#: ../../addon/smileybutton/smileybutton.php:277 ../../addon/xmpp/xmpp.php:53
+#: ../../addon/smileybutton/smileybutton.php:211
+#: ../../addon/smileybutton/smileybutton.php:215
+#: ../../addon/authchoose/authchoose.php:67 ../../addon/xmpp/xmpp.php:53
#: ../../addon/pumpio/pumpio.php:219 ../../addon/pumpio/pumpio.php:223
#: ../../addon/pumpio/pumpio.php:227 ../../addon/pumpio/pumpio.php:231
#: ../../include/dir_fns.php:143 ../../include/dir_fns.php:144
@@ -794,18 +1065,18 @@ msgstr ""
#: ../../Zotlabs/Module/Mitem.php:162 ../../Zotlabs/Module/Mitem.php:163
#: ../../Zotlabs/Module/Mitem.php:240 ../../Zotlabs/Module/Mitem.php:241
#: ../../Zotlabs/Module/Events.php:470 ../../Zotlabs/Module/Events.php:471
-#: ../../Zotlabs/Module/Removeme.php:63 ../../Zotlabs/Module/Admin/Site.php:239
+#: ../../Zotlabs/Module/Removeme.php:63 ../../Zotlabs/Module/Admin/Site.php:237
#: ../../Zotlabs/Module/Settings/Channel.php:294
#: ../../Zotlabs/Module/Settings/Display.php:103
-#: ../../Zotlabs/Module/Api.php:96 ../../Zotlabs/Module/Photos.php:642
-#: ../../Zotlabs/Module/Wiki.php:180 ../../Zotlabs/Module/Connedit.php:392
+#: ../../Zotlabs/Module/Api.php:96 ../../Zotlabs/Module/Photos.php:644
+#: ../../Zotlabs/Module/Wiki.php:182 ../../Zotlabs/Module/Connedit.php:392
#: ../../Zotlabs/Module/Menu.php:100 ../../Zotlabs/Module/Menu.php:157
#: ../../Zotlabs/Module/Profiles.php:681
-#: ../../Zotlabs/Module/Filestorage.php:160
-#: ../../Zotlabs/Module/Filestorage.php:168 ../../boot.php:1633
-#: ../../view/theme/redbasic/php/config.php:89
-#: ../../view/theme/redbasic/php/config.php:104 ../../addon/cdav/cdav.php:234
-#: ../../addon/planets/planets.php:153 ../../addon/wppost/wppost.php:82
+#: ../../Zotlabs/Module/Filestorage.php:152
+#: ../../Zotlabs/Module/Filestorage.php:160 ../../boot.php:1602
+#: ../../view/theme/redbasic/php/config.php:100
+#: ../../view/theme/redbasic/php/config.php:115
+#: ../../addon/planets/planets.php:149 ../../addon/wppost/wppost.php:82
#: ../../addon/wppost/wppost.php:105 ../../addon/wppost/wppost.php:109
#: ../../addon/nsfw/nsfw.php:84 ../../addon/ijpost/ijpost.php:73
#: ../../addon/ijpost/ijpost.php:85 ../../addon/dwpost/dwpost.php:73
@@ -828,8 +1099,9 @@ msgstr ""
#: ../../addon/statusnet/statusnet.php:415
#: ../../addon/statusnet/statusnet.php:424 ../../addon/twitter/twitter.php:242
#: ../../addon/twitter/twitter.php:246 ../../addon/twitter/twitter.php:255
-#: ../../addon/smileybutton/smileybutton.php:273
-#: ../../addon/smileybutton/smileybutton.php:277 ../../addon/xmpp/xmpp.php:53
+#: ../../addon/smileybutton/smileybutton.php:211
+#: ../../addon/smileybutton/smileybutton.php:215
+#: ../../addon/authchoose/authchoose.php:67 ../../addon/xmpp/xmpp.php:53
#: ../../addon/pumpio/pumpio.php:219 ../../addon/pumpio/pumpio.php:223
#: ../../addon/pumpio/pumpio.php:227 ../../addon/pumpio/pumpio.php:231
#: ../../include/dir_fns.php:143 ../../include/dir_fns.php:144
@@ -944,20 +1216,23 @@ msgstr ""
#: ../../Zotlabs/Module/Events.php:260 ../../Zotlabs/Module/Tagger.php:51
#: ../../Zotlabs/Module/Like.php:372 ../../include/conversation.php:119
-#: ../../include/text.php:1940 ../../include/event.php:1141
+#: ../../include/text.php:1933 ../../include/event.php:1145
msgid "event"
msgstr ""
-#: ../../Zotlabs/Module/Events.php:460
-msgid "Edit event title"
+#: ../../Zotlabs/Module/Events.php:275 ../../Zotlabs/Lib/Apps.php:231
+#: ../../include/conversation.php:1799 ../../include/conversation.php:1802
+#: ../../include/nav.php:195 ../../include/nav.php:391
+#: ../../include/nav.php:394
+msgid "Events"
msgstr ""
-#: ../../Zotlabs/Module/Events.php:460 ../../addon/cdav/Mod_Cdav.php:835
-msgid "Event title"
+#: ../../Zotlabs/Module/Events.php:460
+msgid "Edit event title"
msgstr ""
#: ../../Zotlabs/Module/Events.php:460 ../../Zotlabs/Module/Events.php:465
-#: ../../Zotlabs/Module/Appman.php:122 ../../Zotlabs/Module/Appman.php:123
+#: ../../Zotlabs/Module/Appman.php:136 ../../Zotlabs/Module/Appman.php:137
#: ../../Zotlabs/Module/Profiles.php:748 ../../Zotlabs/Module/Profiles.php:752
#: ../../include/datetime.php:259
msgid "Required"
@@ -979,10 +1254,6 @@ msgstr ""
msgid "Edit start date and time"
msgstr ""
-#: ../../Zotlabs/Module/Events.php:466 ../../addon/cdav/Mod_Cdav.php:836
-msgid "Start date and time"
-msgstr ""
-
#: ../../Zotlabs/Module/Events.php:467 ../../Zotlabs/Module/Events.php:470
msgid "Finish date and time are not known or not relevant"
msgstr ""
@@ -1009,23 +1280,17 @@ msgstr ""
msgid "Edit Description"
msgstr ""
-#: ../../Zotlabs/Module/Events.php:473 ../../Zotlabs/Module/Appman.php:124
-#: ../../Zotlabs/Module/Rbmark.php:101
-#: ../../addon/rendezvous/rendezvous.php:173 ../../addon/cdav/Mod_Cdav.php:838
-msgid "Description"
-msgstr ""
-
#: ../../Zotlabs/Module/Events.php:475
msgid "Edit Location"
msgstr ""
-#: ../../Zotlabs/Module/Events.php:478 ../../Zotlabs/Module/Photos.php:1063
-#: ../../Zotlabs/Module/Webpages.php:252 ../../Zotlabs/Lib/ThreadItem.php:741
-#: ../../include/conversation.php:1280 ../../include/page_widgets.php:43
+#: ../../Zotlabs/Module/Events.php:478 ../../Zotlabs/Module/Photos.php:1065
+#: ../../Zotlabs/Module/Webpages.php:247 ../../Zotlabs/Lib/ThreadItem.php:739
+#: ../../include/conversation.php:1277
msgid "Preview"
msgstr ""
-#: ../../Zotlabs/Module/Events.php:479 ../../include/conversation.php:1343
+#: ../../Zotlabs/Module/Events.php:479 ../../include/conversation.php:1340
msgid "Permission settings"
msgstr ""
@@ -1050,7 +1315,7 @@ msgid "Delete event"
msgstr ""
#: ../../Zotlabs/Module/Events.php:660 ../../Zotlabs/Module/Cal.php:313
-#: ../../include/text.php:1759
+#: ../../include/text.php:1752
msgid "Link to Source"
msgstr ""
@@ -1066,41 +1331,11 @@ msgstr ""
msgid "Create Event"
msgstr ""
-#: ../../Zotlabs/Module/Events.php:689 ../../Zotlabs/Module/Events.php:698
-#: ../../Zotlabs/Module/Cal.php:337 ../../Zotlabs/Module/Cal.php:344
-#: ../../Zotlabs/Module/Photos.php:911 ../../addon/cdav/Mod_Cdav.php:846
-msgid "Previous"
-msgstr ""
-
-#: ../../Zotlabs/Module/Events.php:690 ../../Zotlabs/Module/Events.php:699
-#: ../../Zotlabs/Module/Setup.php:264 ../../Zotlabs/Module/Cal.php:338
-#: ../../Zotlabs/Module/Cal.php:345 ../../Zotlabs/Module/Photos.php:920
-#: ../../addon/cdav/Mod_Cdav.php:847
-msgid "Next"
-msgstr ""
-
#: ../../Zotlabs/Module/Events.php:691 ../../Zotlabs/Module/Cal.php:339
-#: ../../include/channel.php:1365
+#: ../../include/channel.php:1386
msgid "Export"
msgstr ""
-#: ../../Zotlabs/Module/Events.php:695 ../../addon/cdav/Mod_Cdav.php:849
-msgid "Month"
-msgstr ""
-
-#: ../../Zotlabs/Module/Events.php:696 ../../addon/cdav/Mod_Cdav.php:850
-msgid "Week"
-msgstr ""
-
-#: ../../Zotlabs/Module/Events.php:697 ../../addon/cdav/Mod_Cdav.php:851
-msgid "Day"
-msgstr ""
-
-#: ../../Zotlabs/Module/Events.php:700 ../../Zotlabs/Module/Cal.php:346
-#: ../../addon/cdav/Mod_Cdav.php:848
-msgid "Today"
-msgstr ""
-
#: ../../Zotlabs/Module/Events.php:731
msgid "Event removed"
msgstr ""
@@ -1117,47 +1352,47 @@ msgstr ""
msgid "Malformed app."
msgstr ""
-#: ../../Zotlabs/Module/Appman.php:111
+#: ../../Zotlabs/Module/Appman.php:125
msgid "Embed code"
msgstr ""
-#: ../../Zotlabs/Module/Appman.php:117
+#: ../../Zotlabs/Module/Appman.php:131
msgid "Edit App"
msgstr ""
-#: ../../Zotlabs/Module/Appman.php:117
+#: ../../Zotlabs/Module/Appman.php:131
msgid "Create App"
msgstr ""
-#: ../../Zotlabs/Module/Appman.php:122
+#: ../../Zotlabs/Module/Appman.php:136
msgid "Name of app"
msgstr ""
-#: ../../Zotlabs/Module/Appman.php:123
+#: ../../Zotlabs/Module/Appman.php:137
msgid "Location (URL) of app"
msgstr ""
-#: ../../Zotlabs/Module/Appman.php:125
+#: ../../Zotlabs/Module/Appman.php:139
msgid "Photo icon URL"
msgstr ""
-#: ../../Zotlabs/Module/Appman.php:125
+#: ../../Zotlabs/Module/Appman.php:139
msgid "80 x 80 pixels - optional"
msgstr ""
-#: ../../Zotlabs/Module/Appman.php:126
+#: ../../Zotlabs/Module/Appman.php:140
msgid "Categories (optional, comma separated list)"
msgstr ""
-#: ../../Zotlabs/Module/Appman.php:127
+#: ../../Zotlabs/Module/Appman.php:141
msgid "Version ID"
msgstr ""
-#: ../../Zotlabs/Module/Appman.php:128
+#: ../../Zotlabs/Module/Appman.php:142
msgid "Price of app"
msgstr ""
-#: ../../Zotlabs/Module/Appman.php:129
+#: ../../Zotlabs/Module/Appman.php:143
msgid "Location (URL) to purchase app"
msgstr ""
@@ -1172,14 +1407,14 @@ msgstr ""
#: ../../Zotlabs/Module/Subthread.php:87 ../../Zotlabs/Module/Tagger.php:47
#: ../../Zotlabs/Module/Like.php:370
#: ../../addon/redphotos/redphotohelper.php:71
-#: ../../addon/diaspora/inbound.php:1783 ../../include/conversation.php:116
-#: ../../include/text.php:1937
+#: ../../addon/diaspora/Receiver.php:1370 ../../include/conversation.php:116
+#: ../../include/text.php:1930
msgid "photo"
msgstr ""
#: ../../Zotlabs/Module/Subthread.php:87 ../../Zotlabs/Module/Like.php:370
-#: ../../addon/diaspora/inbound.php:1783 ../../include/conversation.php:144
-#: ../../include/text.php:1943
+#: ../../addon/diaspora/Receiver.php:1370 ../../include/conversation.php:144
+#: ../../include/text.php:1936
msgid "status"
msgstr ""
@@ -1224,11 +1459,11 @@ msgid "Use this form to import existing posts and content from an export file."
msgstr ""
#: ../../Zotlabs/Module/Import_items.php:127
-#: ../../Zotlabs/Module/Import.php:501
+#: ../../Zotlabs/Module/Import.php:505
msgid "File to Upload"
msgstr ""
-#: ../../Zotlabs/Module/New_channel.php:121 ../../Zotlabs/Module/Manage.php:136
+#: ../../Zotlabs/Module/New_channel.php:121 ../../Zotlabs/Module/Manage.php:138
#, php-format
msgid "You have created %1$.0f of %2$.0f allowed channels."
msgstr ""
@@ -1329,455 +1564,434 @@ msgid ""
msgstr ""
#: ../../Zotlabs/Module/Removeme.php:64
-#: ../../Zotlabs/Module/Settings/Channel.php:575
+#: ../../Zotlabs/Module/Settings/Channel.php:574
msgid "Remove Channel"
msgstr ""
-#: ../../Zotlabs/Module/Sharedwithme.php:99
+#: ../../Zotlabs/Module/Sharedwithme.php:104
msgid "Files: shared with me"
msgstr ""
-#: ../../Zotlabs/Module/Sharedwithme.php:100
-#: ../../Zotlabs/Module/Admin/Channels.php:159
-#: ../../Zotlabs/Module/Settings/Oauth.php:89
-#: ../../Zotlabs/Module/Settings/Oauth.php:115
-#: ../../Zotlabs/Module/Wiki.php:172 ../../Zotlabs/Module/Connedit.php:902
-#: ../../Zotlabs/Module/Chat.php:249 ../../Zotlabs/Lib/NativeWikiPage.php:539
-#: ../../Zotlabs/Storage/Browser.php:233
-#: ../../Zotlabs/Widget/Wiki_page_history.php:22
-#: ../../addon/rendezvous/rendezvous.php:172 ../../addon/cdav/Mod_Cdav.php:1136
-#: ../../addon/gitwiki/Mod_Gitwiki.php:158
-msgid "Name"
-msgstr ""
-
-#: ../../Zotlabs/Module/Sharedwithme.php:101
+#: ../../Zotlabs/Module/Sharedwithme.php:106
msgid "NEW"
msgstr ""
-#: ../../Zotlabs/Module/Sharedwithme.php:102
-#: ../../Zotlabs/Storage/Browser.php:235 ../../include/text.php:1409
+#: ../../Zotlabs/Module/Sharedwithme.php:107
+#: ../../Zotlabs/Storage/Browser.php:236 ../../include/text.php:1386
msgid "Size"
msgstr ""
-#: ../../Zotlabs/Module/Sharedwithme.php:103
-#: ../../Zotlabs/Storage/Browser.php:236
+#: ../../Zotlabs/Module/Sharedwithme.php:108
+#: ../../Zotlabs/Storage/Browser.php:237
msgid "Last Modified"
msgstr ""
-#: ../../Zotlabs/Module/Sharedwithme.php:104
+#: ../../Zotlabs/Module/Sharedwithme.php:109
msgid "Remove all files"
msgstr ""
-#: ../../Zotlabs/Module/Sharedwithme.php:105
+#: ../../Zotlabs/Module/Sharedwithme.php:110
msgid "Remove this file"
msgstr ""
-#: ../../Zotlabs/Module/Setup.php:176
+#: ../../Zotlabs/Module/Setup.php:170
msgid "$Projectname Server - Setup"
msgstr ""
-#: ../../Zotlabs/Module/Setup.php:180
+#: ../../Zotlabs/Module/Setup.php:174
msgid "Could not connect to database."
msgstr ""
-#: ../../Zotlabs/Module/Setup.php:184
+#: ../../Zotlabs/Module/Setup.php:178
msgid ""
"Could not connect to specified site URL. Possible SSL certificate or DNS "
"issue."
msgstr ""
-#: ../../Zotlabs/Module/Setup.php:191
+#: ../../Zotlabs/Module/Setup.php:185
msgid "Could not create table."
msgstr ""
-#: ../../Zotlabs/Module/Setup.php:196
+#: ../../Zotlabs/Module/Setup.php:191
msgid "Your site database has been installed."
msgstr ""
-#: ../../Zotlabs/Module/Setup.php:200
+#: ../../Zotlabs/Module/Setup.php:197
msgid ""
"You may need to import the file \"install/schema_xxx.sql\" manually using a "
"database client."
msgstr ""
-#: ../../Zotlabs/Module/Setup.php:201 ../../Zotlabs/Module/Setup.php:263
-#: ../../Zotlabs/Module/Setup.php:748
+#: ../../Zotlabs/Module/Setup.php:198 ../../Zotlabs/Module/Setup.php:262
+#: ../../Zotlabs/Module/Setup.php:745
msgid "Please see the file \"install/INSTALL.txt\"."
msgstr ""
-#: ../../Zotlabs/Module/Setup.php:260
+#: ../../Zotlabs/Module/Setup.php:259
msgid "System check"
msgstr ""
-#: ../../Zotlabs/Module/Setup.php:265
+#: ../../Zotlabs/Module/Setup.php:264
msgid "Check again"
msgstr ""
-#: ../../Zotlabs/Module/Setup.php:287
+#: ../../Zotlabs/Module/Setup.php:286
msgid "Database connection"
msgstr ""
-#: ../../Zotlabs/Module/Setup.php:288
+#: ../../Zotlabs/Module/Setup.php:287
msgid ""
"In order to install $Projectname we need to know how to connect to your "
"database."
msgstr ""
-#: ../../Zotlabs/Module/Setup.php:289
+#: ../../Zotlabs/Module/Setup.php:288
msgid ""
"Please contact your hosting provider or site administrator if you have "
"questions about these settings."
msgstr ""
-#: ../../Zotlabs/Module/Setup.php:290
+#: ../../Zotlabs/Module/Setup.php:289
msgid ""
"The database you specify below should already exist. If it does not, please "
"create it before continuing."
msgstr ""
-#: ../../Zotlabs/Module/Setup.php:294
+#: ../../Zotlabs/Module/Setup.php:293
msgid "Database Server Name"
msgstr ""
-#: ../../Zotlabs/Module/Setup.php:294
+#: ../../Zotlabs/Module/Setup.php:293
msgid "Default is 127.0.0.1"
msgstr ""
-#: ../../Zotlabs/Module/Setup.php:295
+#: ../../Zotlabs/Module/Setup.php:294
msgid "Database Port"
msgstr ""
-#: ../../Zotlabs/Module/Setup.php:295
+#: ../../Zotlabs/Module/Setup.php:294
msgid "Communication port number - use 0 for default"
msgstr ""
-#: ../../Zotlabs/Module/Setup.php:296
+#: ../../Zotlabs/Module/Setup.php:295
msgid "Database Login Name"
msgstr ""
-#: ../../Zotlabs/Module/Setup.php:297
+#: ../../Zotlabs/Module/Setup.php:296
msgid "Database Login Password"
msgstr ""
-#: ../../Zotlabs/Module/Setup.php:298
+#: ../../Zotlabs/Module/Setup.php:297
msgid "Database Name"
msgstr ""
-#: ../../Zotlabs/Module/Setup.php:299
+#: ../../Zotlabs/Module/Setup.php:298
msgid "Database Type"
msgstr ""
-#: ../../Zotlabs/Module/Setup.php:301 ../../Zotlabs/Module/Setup.php:347
+#: ../../Zotlabs/Module/Setup.php:300 ../../Zotlabs/Module/Setup.php:341
msgid "Site administrator email address"
msgstr ""
-#: ../../Zotlabs/Module/Setup.php:301 ../../Zotlabs/Module/Setup.php:347
+#: ../../Zotlabs/Module/Setup.php:300 ../../Zotlabs/Module/Setup.php:341
msgid ""
"Your account email address must match this in order to use the web admin "
"panel."
msgstr ""
-#: ../../Zotlabs/Module/Setup.php:302 ../../Zotlabs/Module/Setup.php:349
+#: ../../Zotlabs/Module/Setup.php:301 ../../Zotlabs/Module/Setup.php:343
msgid "Website URL"
msgstr ""
-#: ../../Zotlabs/Module/Setup.php:302 ../../Zotlabs/Module/Setup.php:349
+#: ../../Zotlabs/Module/Setup.php:301 ../../Zotlabs/Module/Setup.php:343
msgid "Please use SSL (https) URL if available."
msgstr ""
-#: ../../Zotlabs/Module/Setup.php:303 ../../Zotlabs/Module/Setup.php:353
+#: ../../Zotlabs/Module/Setup.php:302 ../../Zotlabs/Module/Setup.php:345
msgid "Please select a default timezone for your website"
msgstr ""
-#: ../../Zotlabs/Module/Setup.php:328 ../../Zotlabs/Module/Admin/Site.php:258
-msgid "Basic/Minimal Social Networking"
-msgstr ""
-
-#: ../../Zotlabs/Module/Setup.php:329 ../../Zotlabs/Module/Admin/Site.php:259
-msgid "Standard Configuration (default)"
-msgstr ""
-
-#: ../../Zotlabs/Module/Setup.php:330 ../../Zotlabs/Module/Admin/Site.php:260
-msgid "Professional"
-msgstr ""
-
-#: ../../Zotlabs/Module/Setup.php:336
+#: ../../Zotlabs/Module/Setup.php:330
msgid "Site settings"
msgstr ""
-#: ../../Zotlabs/Module/Setup.php:351 ../../Zotlabs/Module/Admin/Site.php:289
-msgid "Server Configuration/Role"
-msgstr ""
-
-#: ../../Zotlabs/Module/Setup.php:392
+#: ../../Zotlabs/Module/Setup.php:384
msgid "PHP version 5.5 or greater is required."
msgstr ""
-#: ../../Zotlabs/Module/Setup.php:393
+#: ../../Zotlabs/Module/Setup.php:385
msgid "PHP version"
msgstr ""
-#: ../../Zotlabs/Module/Setup.php:409
+#: ../../Zotlabs/Module/Setup.php:401
msgid "Could not find a command line version of PHP in the web server PATH."
msgstr ""
-#: ../../Zotlabs/Module/Setup.php:410
+#: ../../Zotlabs/Module/Setup.php:402
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 ""
-#: ../../Zotlabs/Module/Setup.php:414
+#: ../../Zotlabs/Module/Setup.php:406
msgid "PHP executable path"
msgstr ""
-#: ../../Zotlabs/Module/Setup.php:414
+#: ../../Zotlabs/Module/Setup.php:406
msgid ""
"Enter full path to php executable. You can leave this blank to continue the "
"installation."
msgstr ""
-#: ../../Zotlabs/Module/Setup.php:419
+#: ../../Zotlabs/Module/Setup.php:411
msgid "Command line PHP"
msgstr ""
-#: ../../Zotlabs/Module/Setup.php:429
+#: ../../Zotlabs/Module/Setup.php:421
msgid ""
"Unable to check command line PHP, as shell_exec() is disabled. This is "
"required."
msgstr ""
-#: ../../Zotlabs/Module/Setup.php:432
+#: ../../Zotlabs/Module/Setup.php:424
msgid ""
"The command line version of PHP on your system does not have "
"\"register_argc_argv\" enabled."
msgstr ""
-#: ../../Zotlabs/Module/Setup.php:433
+#: ../../Zotlabs/Module/Setup.php:425
msgid "This is required for message delivery to work."
msgstr ""
-#: ../../Zotlabs/Module/Setup.php:436
+#: ../../Zotlabs/Module/Setup.php:428
msgid "PHP register_argc_argv"
msgstr ""
-#: ../../Zotlabs/Module/Setup.php:454
+#: ../../Zotlabs/Module/Setup.php:446
#, php-format
msgid ""
"Your max allowed total upload size is set to %s. Maximum size of one file to "
"upload is set to %s. You are allowed to upload up to %d files at once."
msgstr ""
-#: ../../Zotlabs/Module/Setup.php:459
+#: ../../Zotlabs/Module/Setup.php:451
msgid "You can adjust these settings in the server php.ini file."
msgstr ""
-#: ../../Zotlabs/Module/Setup.php:461
+#: ../../Zotlabs/Module/Setup.php:453
msgid "PHP upload limits"
msgstr ""
-#: ../../Zotlabs/Module/Setup.php:484
+#: ../../Zotlabs/Module/Setup.php:476
msgid ""
"Error: the \"openssl_pkey_new\" function on this system is not able to "
"generate encryption keys"
msgstr ""
-#: ../../Zotlabs/Module/Setup.php:485
+#: ../../Zotlabs/Module/Setup.php:477
msgid ""
"If running under Windows, please see \"http://www.php.net/manual/en/openssl."
"installation.php\"."
msgstr ""
-#: ../../Zotlabs/Module/Setup.php:488
+#: ../../Zotlabs/Module/Setup.php:480
msgid "Generate encryption keys"
msgstr ""
-#: ../../Zotlabs/Module/Setup.php:505
+#: ../../Zotlabs/Module/Setup.php:497
msgid "libCurl PHP module"
msgstr ""
-#: ../../Zotlabs/Module/Setup.php:506
+#: ../../Zotlabs/Module/Setup.php:498
msgid "GD graphics PHP module"
msgstr ""
-#: ../../Zotlabs/Module/Setup.php:507
+#: ../../Zotlabs/Module/Setup.php:499
msgid "OpenSSL PHP module"
msgstr ""
-#: ../../Zotlabs/Module/Setup.php:508
+#: ../../Zotlabs/Module/Setup.php:500
msgid "PDO database PHP module"
msgstr ""
-#: ../../Zotlabs/Module/Setup.php:509
+#: ../../Zotlabs/Module/Setup.php:501
msgid "mb_string PHP module"
msgstr ""
-#: ../../Zotlabs/Module/Setup.php:510
+#: ../../Zotlabs/Module/Setup.php:502
msgid "xml PHP module"
msgstr ""
-#: ../../Zotlabs/Module/Setup.php:514 ../../Zotlabs/Module/Setup.php:516
+#: ../../Zotlabs/Module/Setup.php:503
+msgid "zip PHP module"
+msgstr ""
+
+#: ../../Zotlabs/Module/Setup.php:507 ../../Zotlabs/Module/Setup.php:509
msgid "Apache mod_rewrite module"
msgstr ""
-#: ../../Zotlabs/Module/Setup.php:514
+#: ../../Zotlabs/Module/Setup.php:507
msgid ""
"Error: Apache webserver mod-rewrite module is required but not installed."
msgstr ""
-#: ../../Zotlabs/Module/Setup.php:520 ../../Zotlabs/Module/Setup.php:523
+#: ../../Zotlabs/Module/Setup.php:513 ../../Zotlabs/Module/Setup.php:516
msgid "exec"
msgstr ""
-#: ../../Zotlabs/Module/Setup.php:520
+#: ../../Zotlabs/Module/Setup.php:513
msgid ""
"Error: exec is required but is either not installed or has been disabled in "
"php.ini"
msgstr ""
-#: ../../Zotlabs/Module/Setup.php:526 ../../Zotlabs/Module/Setup.php:529
+#: ../../Zotlabs/Module/Setup.php:519 ../../Zotlabs/Module/Setup.php:522
msgid "shell_exec"
msgstr ""
-#: ../../Zotlabs/Module/Setup.php:526
+#: ../../Zotlabs/Module/Setup.php:519
msgid ""
"Error: shell_exec is required but is either not installed or has been "
"disabled in php.ini"
msgstr ""
-#: ../../Zotlabs/Module/Setup.php:534
+#: ../../Zotlabs/Module/Setup.php:527
msgid "Error: libCURL PHP module required but not installed."
msgstr ""
-#: ../../Zotlabs/Module/Setup.php:538
+#: ../../Zotlabs/Module/Setup.php:531
msgid ""
"Error: GD graphics PHP module with JPEG support required but not installed."
msgstr ""
-#: ../../Zotlabs/Module/Setup.php:542
+#: ../../Zotlabs/Module/Setup.php:535
msgid "Error: openssl PHP module required but not installed."
msgstr ""
-#: ../../Zotlabs/Module/Setup.php:546
+#: ../../Zotlabs/Module/Setup.php:539
msgid "Error: PDO database PHP module required but not installed."
msgstr ""
-#: ../../Zotlabs/Module/Setup.php:550
+#: ../../Zotlabs/Module/Setup.php:543
msgid "Error: mb_string PHP module required but not installed."
msgstr ""
-#: ../../Zotlabs/Module/Setup.php:554
+#: ../../Zotlabs/Module/Setup.php:547
msgid "Error: xml PHP module required for DAV but not installed."
msgstr ""
-#: ../../Zotlabs/Module/Setup.php:572
+#: ../../Zotlabs/Module/Setup.php:551
+msgid "Error: zip PHP module required but not installed."
+msgstr ""
+
+#: ../../Zotlabs/Module/Setup.php:569
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 ""
-#: ../../Zotlabs/Module/Setup.php:573
+#: ../../Zotlabs/Module/Setup.php:570
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 ""
-#: ../../Zotlabs/Module/Setup.php:574
+#: ../../Zotlabs/Module/Setup.php:571
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 ""
-#: ../../Zotlabs/Module/Setup.php:575
+#: ../../Zotlabs/Module/Setup.php:572
msgid ""
"You can alternatively skip this procedure and perform a manual installation. "
"Please see the file \"install/INSTALL.txt\" for instructions."
msgstr ""
-#: ../../Zotlabs/Module/Setup.php:578
+#: ../../Zotlabs/Module/Setup.php:575
msgid ".htconfig.php is writable"
msgstr ""
-#: ../../Zotlabs/Module/Setup.php:592
+#: ../../Zotlabs/Module/Setup.php:589
msgid ""
"This software uses the Smarty3 template engine to render its web views. "
"Smarty3 compiles templates to PHP to speed up rendering."
msgstr ""
-#: ../../Zotlabs/Module/Setup.php:593
+#: ../../Zotlabs/Module/Setup.php:590
#, php-format
msgid ""
"In order to store these compiled templates, the web server needs to have "
"write access to the directory %s under the top level web folder."
msgstr ""
-#: ../../Zotlabs/Module/Setup.php:594 ../../Zotlabs/Module/Setup.php:615
+#: ../../Zotlabs/Module/Setup.php:591 ../../Zotlabs/Module/Setup.php:612
msgid ""
"Please ensure that the user that your web server runs as (e.g. www-data) has "
"write access to this folder."
msgstr ""
-#: ../../Zotlabs/Module/Setup.php:595
+#: ../../Zotlabs/Module/Setup.php:592
#, php-format
msgid ""
"Note: as a security measure, you should give the web server write access to "
"%s only--not the template files (.tpl) that it contains."
msgstr ""
-#: ../../Zotlabs/Module/Setup.php:598
+#: ../../Zotlabs/Module/Setup.php:595
#, php-format
msgid "%s is writable"
msgstr ""
-#: ../../Zotlabs/Module/Setup.php:614
+#: ../../Zotlabs/Module/Setup.php:611
msgid ""
"This software uses the store directory to save uploaded files. The web "
"server needs to have write access to the store directory under the top level "
"web folder"
msgstr ""
-#: ../../Zotlabs/Module/Setup.php:618
+#: ../../Zotlabs/Module/Setup.php:615
msgid "store is writable"
msgstr ""
-#: ../../Zotlabs/Module/Setup.php:650
+#: ../../Zotlabs/Module/Setup.php:647
msgid ""
"SSL certificate cannot be validated. Fix certificate or disable https access "
"to this site."
msgstr ""
-#: ../../Zotlabs/Module/Setup.php:651
+#: ../../Zotlabs/Module/Setup.php:648
msgid ""
"If you have https access to your website or allow connections to TCP port "
"443 (the https: port), you MUST use a browser-valid certificate. You MUST "
"NOT use self-signed certificates!"
msgstr ""
-#: ../../Zotlabs/Module/Setup.php:652
+#: ../../Zotlabs/Module/Setup.php:649
msgid ""
"This restriction is incorporated because public posts from you may for "
"example contain references to images on your own hub."
msgstr ""
-#: ../../Zotlabs/Module/Setup.php:653
+#: ../../Zotlabs/Module/Setup.php:650
msgid ""
"If your certificate is not recognized, members of other sites (who may "
"themselves have valid certificates) will get a warning message on their own "
"site complaining about security issues."
msgstr ""
-#: ../../Zotlabs/Module/Setup.php:654
+#: ../../Zotlabs/Module/Setup.php:651
msgid ""
"This can cause usability issues elsewhere (not just on your own site) so we "
"must insist on this requirement."
msgstr ""
-#: ../../Zotlabs/Module/Setup.php:655
+#: ../../Zotlabs/Module/Setup.php:652
msgid ""
"Providers are available that issue free certificates which are browser-valid."
msgstr ""
-#: ../../Zotlabs/Module/Setup.php:657
+#: ../../Zotlabs/Module/Setup.php:654
msgid ""
"If you are confident that the certificate is valid and signed by a trusted "
"authority, check to see if you have failed to install an intermediate cert. "
@@ -1785,37 +1999,36 @@ msgid ""
"server communications."
msgstr ""
-#: ../../Zotlabs/Module/Setup.php:659
+#: ../../Zotlabs/Module/Setup.php:656
msgid "SSL certificate validation"
msgstr ""
-#: ../../Zotlabs/Module/Setup.php:665
+#: ../../Zotlabs/Module/Setup.php:662
msgid ""
"Url rewrite in .htaccess is not working. Check your server configuration."
"Test: "
msgstr ""
-#: ../../Zotlabs/Module/Setup.php:668
+#: ../../Zotlabs/Module/Setup.php:665
msgid "Url rewrite is working"
msgstr ""
-#: ../../Zotlabs/Module/Setup.php:682
+#: ../../Zotlabs/Module/Setup.php:679
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 ""
-#: ../../Zotlabs/Module/Setup.php:706 ../../addon/rendezvous/rendezvous.php:401
-#: ../../addon/cdav/cdav.php:41
+#: ../../Zotlabs/Module/Setup.php:703 ../../addon/rendezvous/rendezvous.php:401
msgid "Errors encountered creating database tables."
msgstr ""
-#: ../../Zotlabs/Module/Setup.php:746
-msgid "<h1>What next</h1>"
+#: ../../Zotlabs/Module/Setup.php:743
+msgid "<h1>What next?</h1>"
msgstr ""
-#: ../../Zotlabs/Module/Setup.php:747
+#: ../../Zotlabs/Module/Setup.php:744
msgid ""
"IMPORTANT: You will need to [manually] setup a scheduled task for the poller."
msgstr ""
@@ -1955,8 +2168,8 @@ msgstr ""
#: ../../Zotlabs/Module/Admin/Plugins.php:259
#: ../../Zotlabs/Module/Admin/Themes.php:72 ../../Zotlabs/Module/Thing.php:89
#: ../../Zotlabs/Module/Viewsrc.php:25 ../../Zotlabs/Module/Display.php:35
-#: ../../Zotlabs/Module/Filestorage.php:32 ../../Zotlabs/Module/Admin.php:60
-#: ../../include/items.php:3391
+#: ../../Zotlabs/Module/Filestorage.php:24 ../../Zotlabs/Module/Admin.php:62
+#: ../../include/items.php:3361
msgid "Item not found."
msgstr ""
@@ -1987,9 +2200,9 @@ msgstr ""
#: ../../Zotlabs/Module/Admin/Channels.php:145
#: ../../Zotlabs/Module/Admin/Themes.php:122
#: ../../Zotlabs/Module/Admin/Themes.php:156
-#: ../../Zotlabs/Module/Admin/Site.php:277
+#: ../../Zotlabs/Module/Admin/Site.php:269
#: ../../Zotlabs/Module/Admin/Security.php:86
-#: ../../Zotlabs/Module/Admin.php:137
+#: ../../Zotlabs/Module/Admin.php:136
msgid "Administration"
msgstr ""
@@ -2004,8 +2217,8 @@ msgid "Toggle"
msgstr ""
#: ../../Zotlabs/Module/Admin/Plugins.php:344
-#: ../../Zotlabs/Module/Admin/Themes.php:125 ../../Zotlabs/Lib/Apps.php:223
-#: ../../Zotlabs/Widget/Settings_menu.php:131 ../../include/nav.php:207
+#: ../../Zotlabs/Module/Admin/Themes.php:125 ../../Zotlabs/Lib/Apps.php:224
+#: ../../Zotlabs/Widget/Settings_menu.php:133 ../../include/nav.php:201
msgid "Settings"
msgstr ""
@@ -2068,25 +2281,10 @@ msgstr ""
msgid "Install new repo"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Plugins.php:422 ../../Zotlabs/Lib/Apps.php:358
+#: ../../Zotlabs/Module/Admin/Plugins.php:422 ../../Zotlabs/Lib/Apps.php:359
msgid "Install"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Plugins.php:423
-#: ../../Zotlabs/Module/Settings/Oauth.php:88
-#: ../../Zotlabs/Module/Settings/Oauth.php:114
-#: ../../Zotlabs/Module/Wiki.php:265 ../../Zotlabs/Module/Wiki.php:290
-#: ../../Zotlabs/Module/Connedit.php:920 ../../Zotlabs/Module/Fbrowser.php:66
-#: ../../Zotlabs/Module/Fbrowser.php:88 ../../Zotlabs/Module/Profiles.php:804
-#: ../../Zotlabs/Module/Filer.php:55 ../../Zotlabs/Module/Tagrm.php:15
-#: ../../Zotlabs/Module/Tagrm.php:138 ../../addon/cdav/Mod_Cdav.php:866
-#: ../../addon/cdav/Mod_Cdav.php:1154 ../../addon/js_upload/js_upload.php:46
-#: ../../addon/gitwiki/Mod_Gitwiki.php:244
-#: ../../addon/gitwiki/Mod_Gitwiki.php:267 ../../include/conversation.php:1327
-#: ../../include/conversation.php:1376
-msgid "Cancel"
-msgstr ""
-
#: ../../Zotlabs/Module/Admin/Plugins.php:445
msgid "Manage Repos"
msgstr ""
@@ -2099,20 +2297,12 @@ msgstr ""
msgid "Install a New Plugin Repository"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Plugins.php:453
-#: ../../Zotlabs/Module/Settings/Oauth.php:42
-#: ../../Zotlabs/Module/Settings/Oauth.php:113
-#: ../../Zotlabs/Module/Connedit.php:918 ../../Zotlabs/Module/Profiles.php:802
-#: ../../Zotlabs/Lib/Apps.php:358 ../../addon/cdav/Mod_Cdav.php:1152
-msgid "Update"
-msgstr ""
-
#: ../../Zotlabs/Module/Admin/Plugins.php:454
msgid "Switch branch"
msgstr ""
#: ../../Zotlabs/Module/Admin/Plugins.php:455
-#: ../../Zotlabs/Module/Photos.php:960 ../../Zotlabs/Module/Tagrm.php:137
+#: ../../Zotlabs/Module/Photos.php:962 ../../Zotlabs/Module/Tagrm.php:137
#: ../../addon/superblock/superblock.php:116
msgid "Remove"
msgstr ""
@@ -2152,7 +2342,7 @@ msgstr ""
#: ../../Zotlabs/Module/Admin/Accounts.php:165
#: ../../Zotlabs/Module/Admin/Accounts.php:178
-#: ../../Zotlabs/Widget/Admin.php:23
+#: ../../Zotlabs/Module/Admin.php:96 ../../Zotlabs/Widget/Admin.php:23
msgid "Accounts"
msgstr ""
@@ -2169,21 +2359,12 @@ msgstr ""
msgid "Request date"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Accounts.php:169
-#: ../../Zotlabs/Module/Admin/Accounts.php:181
-#: ../../Zotlabs/Module/Connedit.php:906 ../../Zotlabs/Module/Profiles.php:790
-#: ../../addon/cdav/Mod_Cdav.php:1140 ../../addon/openid/MysqlProvider.php:56
-#: ../../addon/openid/MysqlProvider.php:57 ../../addon/rtof/rtof.php:93
-#: ../../addon/redred/redred.php:107 ../../include/network.php:2315
-msgid "Email"
-msgstr ""
-
#: ../../Zotlabs/Module/Admin/Accounts.php:170
msgid "No registrations."
msgstr ""
#: ../../Zotlabs/Module/Admin/Accounts.php:171
-#: ../../Zotlabs/Module/Connections.php:281
+#: ../../Zotlabs/Module/Connections.php:282 ../../include/conversation.php:685
msgid "Approve"
msgstr ""
@@ -2205,7 +2386,7 @@ msgstr ""
msgid "ID"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Accounts.php:182 ../../include/group.php:287
+#: ../../Zotlabs/Module/Admin/Accounts.php:182 ../../include/group.php:288
msgid "All Channels"
msgstr ""
@@ -2319,7 +2500,7 @@ msgid "Channel '%s' code disallowed"
msgstr ""
#: ../../Zotlabs/Module/Admin/Channels.php:146
-#: ../../Zotlabs/Widget/Admin.php:24
+#: ../../Zotlabs/Module/Admin.php:110 ../../Zotlabs/Widget/Admin.php:24
msgid "Channels"
msgstr ""
@@ -2340,7 +2521,7 @@ msgid "Disallow Code"
msgstr ""
#: ../../Zotlabs/Module/Admin/Channels.php:154
-#: ../../include/conversation.php:1760 ../../include/nav.php:369
+#: ../../include/conversation.php:1757 ../../include/nav.php:349
msgid "Channel"
msgstr ""
@@ -2385,378 +2566,379 @@ msgstr ""
msgid "[Unsupported]"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Site.php:144
+#: ../../Zotlabs/Module/Admin/Site.php:142
msgid "Site settings updated."
msgstr ""
-#: ../../Zotlabs/Module/Admin/Site.php:170 ../../include/text.php:2915
+#: ../../Zotlabs/Module/Admin/Site.php:168
+#: ../../view/theme/redbasic/php/config.php:15 ../../include/text.php:2928
msgid "Default"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Site.php:181
+#: ../../Zotlabs/Module/Admin/Site.php:179
#: ../../Zotlabs/Module/Settings/Display.php:137
#, php-format
msgid "%s - (Incompatible)"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Site.php:188
+#: ../../Zotlabs/Module/Admin/Site.php:186
#: ../../Zotlabs/Module/Settings/Display.php:151
msgid "mobile"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Site.php:190
+#: ../../Zotlabs/Module/Admin/Site.php:188
msgid "experimental"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Site.php:192
+#: ../../Zotlabs/Module/Admin/Site.php:190
msgid "unsupported"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Site.php:238
+#: ../../Zotlabs/Module/Admin/Site.php:236
msgid "Yes - with approval"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Site.php:244
+#: ../../Zotlabs/Module/Admin/Site.php:242
msgid "My site is not a public server"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Site.php:245
+#: ../../Zotlabs/Module/Admin/Site.php:243
msgid "My site has paid access only"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Site.php:246
+#: ../../Zotlabs/Module/Admin/Site.php:244
msgid "My site has free access only"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Site.php:247
+#: ../../Zotlabs/Module/Admin/Site.php:245
msgid "My site offers free accounts with optional paid upgrades"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Site.php:264 ../../Zotlabs/Lib/Techlevels.php:10
+#: ../../Zotlabs/Module/Admin/Site.php:256
msgid "Beginner/Basic"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Site.php:265 ../../Zotlabs/Lib/Techlevels.php:11
+#: ../../Zotlabs/Module/Admin/Site.php:257
msgid "Novice - not skilled but willing to learn"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Site.php:266 ../../Zotlabs/Lib/Techlevels.php:12
+#: ../../Zotlabs/Module/Admin/Site.php:258
msgid "Intermediate - somewhat comfortable"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Site.php:267 ../../Zotlabs/Lib/Techlevels.php:13
+#: ../../Zotlabs/Module/Admin/Site.php:259
msgid "Advanced - very comfortable"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Site.php:268 ../../Zotlabs/Lib/Techlevels.php:14
+#: ../../Zotlabs/Module/Admin/Site.php:260
msgid "Expert - I can write computer code"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Site.php:269 ../../Zotlabs/Lib/Techlevels.php:15
+#: ../../Zotlabs/Module/Admin/Site.php:261
msgid "Wizard - I probably know more than you do"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Site.php:278 ../../Zotlabs/Widget/Admin.php:22
+#: ../../Zotlabs/Module/Admin/Site.php:270 ../../Zotlabs/Widget/Admin.php:22
msgid "Site"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Site.php:280
-#: ../../Zotlabs/Module/Register.php:253
+#: ../../Zotlabs/Module/Admin/Site.php:272
+#: ../../Zotlabs/Module/Register.php:251
msgid "Registration"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Site.php:281
+#: ../../Zotlabs/Module/Admin/Site.php:273
msgid "File upload"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Site.php:282
+#: ../../Zotlabs/Module/Admin/Site.php:274
msgid "Policies"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Site.php:283 ../../include/contact_widgets.php:16
+#: ../../Zotlabs/Module/Admin/Site.php:275 ../../include/contact_widgets.php:16
msgid "Advanced"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Site.php:287
+#: ../../Zotlabs/Module/Admin/Site.php:279
#: ../../addon/statusnet/statusnet.php:890
msgid "Site name"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Site.php:291
+#: ../../Zotlabs/Module/Admin/Site.php:281
msgid "Site default technical skill level"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Site.php:291
+#: ../../Zotlabs/Module/Admin/Site.php:281
msgid "Used to provide a member experience matched to technical comfort level"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Site.php:293
+#: ../../Zotlabs/Module/Admin/Site.php:283
msgid "Lock the technical skill level setting"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Site.php:293
+#: ../../Zotlabs/Module/Admin/Site.php:283
msgid "Members can set their own technical comfort level by default"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Site.php:295
+#: ../../Zotlabs/Module/Admin/Site.php:285
msgid "Banner/Logo"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Site.php:296
+#: ../../Zotlabs/Module/Admin/Site.php:286
msgid "Administrator Information"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Site.php:296
+#: ../../Zotlabs/Module/Admin/Site.php:286
msgid ""
"Contact information for site administrators. Displayed on siteinfo page. "
"BBCode can be used here"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Site.php:297 ../../Zotlabs/Module/Siteinfo.php:23
+#: ../../Zotlabs/Module/Admin/Site.php:287 ../../Zotlabs/Module/Siteinfo.php:22
msgid "Site Information"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Site.php:297
+#: ../../Zotlabs/Module/Admin/Site.php:287
msgid ""
"Publicly visible description of this site. Displayed on siteinfo page. "
"BBCode can be used here"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Site.php:298
+#: ../../Zotlabs/Module/Admin/Site.php:288
msgid "System language"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Site.php:299
+#: ../../Zotlabs/Module/Admin/Site.php:289
msgid "System theme"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Site.php:299
+#: ../../Zotlabs/Module/Admin/Site.php:289
msgid ""
"Default system theme - may be over-ridden by user profiles - <a href='#' "
"id='cnftheme'>change theme settings</a>"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Site.php:300
+#: ../../Zotlabs/Module/Admin/Site.php:290
msgid "Mobile system theme"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Site.php:300
+#: ../../Zotlabs/Module/Admin/Site.php:290
msgid "Theme for mobile devices"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Site.php:302
+#: ../../Zotlabs/Module/Admin/Site.php:292
msgid "Allow Feeds as Connections"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Site.php:302
+#: ../../Zotlabs/Module/Admin/Site.php:292
msgid "(Heavy system resource usage)"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Site.php:303
+#: ../../Zotlabs/Module/Admin/Site.php:293
msgid "Maximum image size"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Site.php:303
+#: ../../Zotlabs/Module/Admin/Site.php:293
msgid ""
"Maximum size in bytes of uploaded images. Default is 0, which means no "
"limits."
msgstr ""
-#: ../../Zotlabs/Module/Admin/Site.php:304
+#: ../../Zotlabs/Module/Admin/Site.php:294
msgid "Does this site allow new member registration?"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Site.php:305
+#: ../../Zotlabs/Module/Admin/Site.php:295
msgid "Invitation only"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Site.php:305
+#: ../../Zotlabs/Module/Admin/Site.php:295
msgid ""
"Only allow new member registrations with an invitation code. Above register "
"policy must be set to Yes."
msgstr ""
-#: ../../Zotlabs/Module/Admin/Site.php:306
+#: ../../Zotlabs/Module/Admin/Site.php:296
msgid "Which best describes the types of account offered by this hub?"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Site.php:307
+#: ../../Zotlabs/Module/Admin/Site.php:297
msgid "Register text"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Site.php:307
+#: ../../Zotlabs/Module/Admin/Site.php:297
msgid "Will be displayed prominently on the registration page."
msgstr ""
-#: ../../Zotlabs/Module/Admin/Site.php:308
+#: ../../Zotlabs/Module/Admin/Site.php:298
msgid "Site homepage to show visitors (default: login box)"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Site.php:308
+#: ../../Zotlabs/Module/Admin/Site.php:298
msgid ""
"example: 'public' to show public stream, 'page/sys/home' to show a system "
"webpage called 'home' or 'include:home.html' to include a file."
msgstr ""
-#: ../../Zotlabs/Module/Admin/Site.php:309
+#: ../../Zotlabs/Module/Admin/Site.php:299
msgid "Preserve site homepage URL"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Site.php:309
+#: ../../Zotlabs/Module/Admin/Site.php:299
msgid ""
"Present the site homepage in a frame at the original location instead of "
"redirecting"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Site.php:310
+#: ../../Zotlabs/Module/Admin/Site.php:300
msgid "Accounts abandoned after x days"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Site.php:310
+#: ../../Zotlabs/Module/Admin/Site.php:300
msgid ""
"Will not waste system resources polling external sites for abandonded "
"accounts. Enter 0 for no time limit."
msgstr ""
-#: ../../Zotlabs/Module/Admin/Site.php:311
+#: ../../Zotlabs/Module/Admin/Site.php:301
msgid "Allowed friend domains"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Site.php:311
+#: ../../Zotlabs/Module/Admin/Site.php:301
msgid ""
"Comma separated list of domains which are allowed to establish friendships "
"with this site. Wildcards are accepted. Empty to allow any domains"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Site.php:312
+#: ../../Zotlabs/Module/Admin/Site.php:302
msgid "Verify Email Addresses"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Site.php:312
+#: ../../Zotlabs/Module/Admin/Site.php:302
msgid ""
"Check to verify email addresses used in account registration (recommended)."
msgstr ""
-#: ../../Zotlabs/Module/Admin/Site.php:313
+#: ../../Zotlabs/Module/Admin/Site.php:303
msgid "Force publish"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Site.php:313
+#: ../../Zotlabs/Module/Admin/Site.php:303
msgid ""
"Check to force all profiles on this site to be listed in the site directory."
msgstr ""
-#: ../../Zotlabs/Module/Admin/Site.php:314
+#: ../../Zotlabs/Module/Admin/Site.php:304
msgid "Import Public Streams"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Site.php:314
+#: ../../Zotlabs/Module/Admin/Site.php:304
msgid ""
"Import and allow access to public content pulled from other sites. Warning: "
"this content is unmoderated."
msgstr ""
-#: ../../Zotlabs/Module/Admin/Site.php:315
+#: ../../Zotlabs/Module/Admin/Site.php:305
msgid "Login on Homepage"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Site.php:315
+#: ../../Zotlabs/Module/Admin/Site.php:305
msgid ""
"Present a login box to visitors on the home page if no other content has "
"been configured."
msgstr ""
-#: ../../Zotlabs/Module/Admin/Site.php:316
+#: ../../Zotlabs/Module/Admin/Site.php:306
msgid "Enable context help"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Site.php:316
+#: ../../Zotlabs/Module/Admin/Site.php:306
msgid ""
"Display contextual help for the current page when the help button is pressed."
msgstr ""
-#: ../../Zotlabs/Module/Admin/Site.php:318
+#: ../../Zotlabs/Module/Admin/Site.php:308
msgid "Reply-to email address for system generated email."
msgstr ""
-#: ../../Zotlabs/Module/Admin/Site.php:319
+#: ../../Zotlabs/Module/Admin/Site.php:309
msgid "Sender (From) email address for system generated email."
msgstr ""
-#: ../../Zotlabs/Module/Admin/Site.php:320
+#: ../../Zotlabs/Module/Admin/Site.php:310
msgid "Name of email sender for system generated email."
msgstr ""
-#: ../../Zotlabs/Module/Admin/Site.php:322
+#: ../../Zotlabs/Module/Admin/Site.php:312
msgid "Directory Server URL"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Site.php:322
+#: ../../Zotlabs/Module/Admin/Site.php:312
msgid "Default directory server"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Site.php:324
+#: ../../Zotlabs/Module/Admin/Site.php:314
msgid "Proxy user"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Site.php:325
+#: ../../Zotlabs/Module/Admin/Site.php:315
msgid "Proxy URL"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Site.php:326
+#: ../../Zotlabs/Module/Admin/Site.php:316
msgid "Network timeout"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Site.php:326
+#: ../../Zotlabs/Module/Admin/Site.php:316
msgid "Value is in seconds. Set to 0 for unlimited (not recommended)."
msgstr ""
-#: ../../Zotlabs/Module/Admin/Site.php:327
+#: ../../Zotlabs/Module/Admin/Site.php:317
msgid "Delivery interval"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Site.php:327
+#: ../../Zotlabs/Module/Admin/Site.php:317
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 ""
-#: ../../Zotlabs/Module/Admin/Site.php:328
+#: ../../Zotlabs/Module/Admin/Site.php:318
msgid "Deliveries per process"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Site.php:328
+#: ../../Zotlabs/Module/Admin/Site.php:318
msgid ""
"Number of deliveries to attempt in a single operating system process. Adjust "
"if necessary to tune system performance. Recommend: 1-5."
msgstr ""
-#: ../../Zotlabs/Module/Admin/Site.php:329
+#: ../../Zotlabs/Module/Admin/Site.php:319
msgid "Poll interval"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Site.php:329
+#: ../../Zotlabs/Module/Admin/Site.php:319
msgid ""
"Delay background polling processes by this many seconds to reduce system "
"load. If 0, use delivery interval."
msgstr ""
-#: ../../Zotlabs/Module/Admin/Site.php:330
+#: ../../Zotlabs/Module/Admin/Site.php:320
msgid "Maximum Load Average"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Site.php:330
+#: ../../Zotlabs/Module/Admin/Site.php:320
msgid ""
"Maximum system load before delivery and poll processes are deferred - "
"default 50."
msgstr ""
-#: ../../Zotlabs/Module/Admin/Site.php:331
+#: ../../Zotlabs/Module/Admin/Site.php:321
msgid "Expiration period in days for imported (grid/network) content"
msgstr ""
-#: ../../Zotlabs/Module/Admin/Site.php:331
+#: ../../Zotlabs/Module/Admin/Site.php:321
msgid "0 for no expiration of imported content"
msgstr ""
@@ -2802,8 +2984,8 @@ msgstr ""
#: ../../Zotlabs/Module/Admin/Profs.php:74
#: ../../Zotlabs/Module/Admin/Profs.php:94 ../../Zotlabs/Module/Rbmark.php:32
#: ../../Zotlabs/Module/Rbmark.php:104 ../../Zotlabs/Module/Filer.php:53
-#: ../../Zotlabs/Widget/Notes.php:18 ../../include/text.php:1028
-#: ../../include/text.php:1040
+#: ../../Zotlabs/Widget/Notes.php:18 ../../include/text.php:1022
+#: ../../include/text.php:1034
msgid "Save"
msgstr ""
@@ -3005,6 +3187,14 @@ msgctxt "acl"
msgid "Profile"
msgstr ""
+#: ../../Zotlabs/Module/Moderate.php:37
+msgid "Comment approved"
+msgstr ""
+
+#: ../../Zotlabs/Module/Moderate.php:41
+msgid "Comment deleted"
+msgstr ""
+
#: ../../Zotlabs/Module/Settings/Permcats.php:37
msgid "Permission category saved."
msgstr ""
@@ -3025,25 +3215,25 @@ msgstr ""
#: ../../Zotlabs/Module/Settings/Permcats.php:103
#: ../../Zotlabs/Module/Settings/Tokens.php:161
-#: ../../Zotlabs/Module/Connedit.php:886
+#: ../../Zotlabs/Module/Connedit.php:903
msgid "My Settings"
msgstr ""
#: ../../Zotlabs/Module/Settings/Permcats.php:105
#: ../../Zotlabs/Module/Settings/Tokens.php:163
-#: ../../Zotlabs/Module/Connedit.php:881
+#: ../../Zotlabs/Module/Connedit.php:898
msgid "inherited"
msgstr ""
#: ../../Zotlabs/Module/Settings/Permcats.php:108
#: ../../Zotlabs/Module/Settings/Tokens.php:166
-#: ../../Zotlabs/Module/Connedit.php:888
+#: ../../Zotlabs/Module/Connedit.php:905
msgid "Individual Permissions"
msgstr ""
#: ../../Zotlabs/Module/Settings/Permcats.php:109
#: ../../Zotlabs/Module/Settings/Tokens.php:167
-#: ../../Zotlabs/Module/Connedit.php:889
+#: ../../Zotlabs/Module/Connedit.php:906
msgid ""
"Some permissions may be inherited from your channel's <a href=\"settings"
"\"><strong>privacy settings</strong></a>, which have higher priority than "
@@ -3056,8 +3246,8 @@ msgstr ""
#: ../../Zotlabs/Module/Settings/Channel.php:70
#: ../../Zotlabs/Module/Settings/Channel.php:81
#: ../../Zotlabs/Module/Connedit.php:707 ../../Zotlabs/Widget/Affinity.php:28
-#: ../../include/selectors.php:123 ../../include/channel.php:406
-#: ../../include/channel.php:407 ../../include/channel.php:414
+#: ../../include/selectors.php:123 ../../include/channel.php:408
+#: ../../include/channel.php:409 ../../include/channel.php:416
msgid "Friends"
msgstr ""
@@ -3132,7 +3322,7 @@ msgstr ""
msgid "Basic Settings"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Channel.php:482 ../../include/channel.php:1250
+#: ../../Zotlabs/Module/Settings/Channel.php:482 ../../include/channel.php:1271
msgid "Full Name:"
msgstr ""
@@ -3171,278 +3361,278 @@ msgstr ""
msgid "Security and Privacy Settings"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Channel.php:493
+#: ../../Zotlabs/Module/Settings/Channel.php:492
msgid "Your permissions are already configured. Click to view/adjust"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Channel.php:495
+#: ../../Zotlabs/Module/Settings/Channel.php:494
msgid "Hide my online presence"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Channel.php:495
+#: ../../Zotlabs/Module/Settings/Channel.php:494
msgid "Prevents displaying in your profile that you are online"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Channel.php:497
+#: ../../Zotlabs/Module/Settings/Channel.php:496
msgid "Simple Privacy Settings:"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Channel.php:498
+#: ../../Zotlabs/Module/Settings/Channel.php:497
msgid ""
"Very Public - <em>extremely permissive (should be used with caution)</em>"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Channel.php:499
+#: ../../Zotlabs/Module/Settings/Channel.php:498
msgid ""
"Typical - <em>default public, privacy when desired (similar to social "
"network permissions but with improved privacy)</em>"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Channel.php:500
+#: ../../Zotlabs/Module/Settings/Channel.php:499
msgid "Private - <em>default private, never open or public</em>"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Channel.php:501
+#: ../../Zotlabs/Module/Settings/Channel.php:500
msgid "Blocked - <em>default blocked to/from everybody</em>"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Channel.php:503
+#: ../../Zotlabs/Module/Settings/Channel.php:502
msgid "Allow others to tag your posts"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Channel.php:503
+#: ../../Zotlabs/Module/Settings/Channel.php:502
msgid ""
"Often used by the community to retro-actively flag inappropriate content"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Channel.php:505
+#: ../../Zotlabs/Module/Settings/Channel.php:504
msgid "Channel Permission Limits"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Channel.php:507
+#: ../../Zotlabs/Module/Settings/Channel.php:506
msgid "Expire other channel content after this many days"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Channel.php:507
+#: ../../Zotlabs/Module/Settings/Channel.php:506
msgid "0 or blank to use the website limit."
msgstr ""
-#: ../../Zotlabs/Module/Settings/Channel.php:507
+#: ../../Zotlabs/Module/Settings/Channel.php:506
#, php-format
msgid "This website expires after %d days."
msgstr ""
-#: ../../Zotlabs/Module/Settings/Channel.php:507
+#: ../../Zotlabs/Module/Settings/Channel.php:506
msgid "This website does not expire imported content."
msgstr ""
-#: ../../Zotlabs/Module/Settings/Channel.php:507
+#: ../../Zotlabs/Module/Settings/Channel.php:506
msgid "The website limit takes precedence if lower than your limit."
msgstr ""
-#: ../../Zotlabs/Module/Settings/Channel.php:508
+#: ../../Zotlabs/Module/Settings/Channel.php:507
msgid "Maximum Friend Requests/Day:"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Channel.php:508
+#: ../../Zotlabs/Module/Settings/Channel.php:507
msgid "May reduce spam activity"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Channel.php:509
+#: ../../Zotlabs/Module/Settings/Channel.php:508
msgid "Default Access Control List (ACL)"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Channel.php:511
+#: ../../Zotlabs/Module/Settings/Channel.php:510
msgid "Use my default audience setting for the type of object published"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Channel.php:518
+#: ../../Zotlabs/Module/Settings/Channel.php:517
msgid "Channel permissions category:"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Channel.php:519
+#: ../../Zotlabs/Module/Settings/Channel.php:518
msgid "Default Permissions Group"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Channel.php:525
+#: ../../Zotlabs/Module/Settings/Channel.php:524
msgid "Maximum private messages per day from unknown people:"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Channel.php:525
+#: ../../Zotlabs/Module/Settings/Channel.php:524
msgid "Useful to reduce spamming"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Channel.php:528
+#: ../../Zotlabs/Module/Settings/Channel.php:527
msgid "Notification Settings"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Channel.php:529
+#: ../../Zotlabs/Module/Settings/Channel.php:528
msgid "By default post a status message when:"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Channel.php:530
+#: ../../Zotlabs/Module/Settings/Channel.php:529
msgid "accepting a friend request"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Channel.php:531
+#: ../../Zotlabs/Module/Settings/Channel.php:530
msgid "joining a forum/community"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Channel.php:532
+#: ../../Zotlabs/Module/Settings/Channel.php:531
msgid "making an <em>interesting</em> profile change"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Channel.php:533
+#: ../../Zotlabs/Module/Settings/Channel.php:532
msgid "Send a notification email when:"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Channel.php:534
+#: ../../Zotlabs/Module/Settings/Channel.php:533
msgid "You receive a connection request"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Channel.php:535
+#: ../../Zotlabs/Module/Settings/Channel.php:534
msgid "Your connections are confirmed"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Channel.php:536
+#: ../../Zotlabs/Module/Settings/Channel.php:535
msgid "Someone writes on your profile wall"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Channel.php:537
+#: ../../Zotlabs/Module/Settings/Channel.php:536
msgid "Someone writes a followup comment"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Channel.php:538
+#: ../../Zotlabs/Module/Settings/Channel.php:537
msgid "You receive a private message"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Channel.php:539
+#: ../../Zotlabs/Module/Settings/Channel.php:538
msgid "You receive a friend suggestion"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Channel.php:540
+#: ../../Zotlabs/Module/Settings/Channel.php:539
msgid "You are tagged in a post"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Channel.php:541
+#: ../../Zotlabs/Module/Settings/Channel.php:540
msgid "You are poked/prodded/etc. in a post"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Channel.php:543
+#: ../../Zotlabs/Module/Settings/Channel.php:542
msgid "Someone likes your post/comment"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Channel.php:546
+#: ../../Zotlabs/Module/Settings/Channel.php:545
msgid "Show visual notifications including:"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Channel.php:548
+#: ../../Zotlabs/Module/Settings/Channel.php:547
msgid "Unseen grid activity"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Channel.php:549
+#: ../../Zotlabs/Module/Settings/Channel.php:548
msgid "Unseen channel activity"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Channel.php:550
+#: ../../Zotlabs/Module/Settings/Channel.php:549
msgid "Unseen private messages"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Channel.php:550
+#: ../../Zotlabs/Module/Settings/Channel.php:549
+#: ../../Zotlabs/Module/Settings/Channel.php:554
#: ../../Zotlabs/Module/Settings/Channel.php:555
#: ../../Zotlabs/Module/Settings/Channel.php:556
-#: ../../Zotlabs/Module/Settings/Channel.php:557
#: ../../addon/jappixmini/jappixmini.php:343
msgid "Recommended"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Channel.php:551
+#: ../../Zotlabs/Module/Settings/Channel.php:550
msgid "Upcoming events"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Channel.php:552
+#: ../../Zotlabs/Module/Settings/Channel.php:551
msgid "Events today"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Channel.php:553
+#: ../../Zotlabs/Module/Settings/Channel.php:552
msgid "Upcoming birthdays"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Channel.php:553
+#: ../../Zotlabs/Module/Settings/Channel.php:552
msgid "Not available in all themes"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Channel.php:554
+#: ../../Zotlabs/Module/Settings/Channel.php:553
msgid "System (personal) notifications"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Channel.php:555
+#: ../../Zotlabs/Module/Settings/Channel.php:554
msgid "System info messages"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Channel.php:556
+#: ../../Zotlabs/Module/Settings/Channel.php:555
msgid "System critical alerts"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Channel.php:557
+#: ../../Zotlabs/Module/Settings/Channel.php:556
msgid "New connections"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Channel.php:558
+#: ../../Zotlabs/Module/Settings/Channel.php:557
msgid "System Registrations"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Channel.php:559
+#: ../../Zotlabs/Module/Settings/Channel.php:558
msgid ""
"Also show new wall posts, private messages and connections under Notices"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Channel.php:561
+#: ../../Zotlabs/Module/Settings/Channel.php:560
msgid "Notify me of events this many days in advance"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Channel.php:561
+#: ../../Zotlabs/Module/Settings/Channel.php:560
msgid "Must be greater than 0"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Channel.php:567
+#: ../../Zotlabs/Module/Settings/Channel.php:566
msgid "Advanced Account/Page Type Settings"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Channel.php:568
+#: ../../Zotlabs/Module/Settings/Channel.php:567
msgid "Change the behaviour of this account for special situations"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Channel.php:570
+#: ../../Zotlabs/Module/Settings/Channel.php:569
msgid "Miscellaneous Settings"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Channel.php:571
+#: ../../Zotlabs/Module/Settings/Channel.php:570
msgid "Default photo upload folder"
msgstr ""
+#: ../../Zotlabs/Module/Settings/Channel.php:570
#: ../../Zotlabs/Module/Settings/Channel.php:571
-#: ../../Zotlabs/Module/Settings/Channel.php:572
msgid "%Y - current year, %m - current month"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Channel.php:572
+#: ../../Zotlabs/Module/Settings/Channel.php:571
msgid "Default file upload folder"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Channel.php:574
+#: ../../Zotlabs/Module/Settings/Channel.php:573
msgid "Personal menu to display in your channel pages"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Channel.php:576
+#: ../../Zotlabs/Module/Settings/Channel.php:575
msgid "Remove this channel."
msgstr ""
-#: ../../Zotlabs/Module/Settings/Channel.php:577
+#: ../../Zotlabs/Module/Settings/Channel.php:576
msgid "Firefox Share $Projectname provider"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Channel.php:578
+#: ../../Zotlabs/Module/Settings/Channel.php:577
msgid "Start calendar week on Monday"
msgstr ""
@@ -3478,7 +3668,7 @@ msgid ""
msgstr ""
#: ../../Zotlabs/Module/Settings/Tokens.php:150
-#: ../../Zotlabs/Widget/Settings_menu.php:90
+#: ../../Zotlabs/Widget/Settings_menu.php:92
msgid "Guest Access Tokens"
msgstr ""
@@ -3495,7 +3685,7 @@ msgid "Expires (yyyy-mm-dd)"
msgstr ""
#: ../../Zotlabs/Module/Settings/Tokens.php:160
-#: ../../Zotlabs/Module/Connedit.php:885
+#: ../../Zotlabs/Module/Connedit.php:902
msgid "Their Settings"
msgstr ""
@@ -3572,27 +3762,27 @@ msgstr ""
msgid "Remove this account including all its channels"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Featured.php:20
+#: ../../Zotlabs/Module/Settings/Featured.php:21
msgid "Affinity Slider settings updated."
msgstr ""
-#: ../../Zotlabs/Module/Settings/Featured.php:34
+#: ../../Zotlabs/Module/Settings/Featured.php:36
msgid "No feature settings configured"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Featured.php:41
+#: ../../Zotlabs/Module/Settings/Featured.php:43
msgid "Default maximum affinity level"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Featured.php:46
+#: ../../Zotlabs/Module/Settings/Featured.php:48
msgid "Default minimum affinity level"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Featured.php:50
+#: ../../Zotlabs/Module/Settings/Featured.php:52
msgid "Affinity Slider Settings"
msgstr ""
-#: ../../Zotlabs/Module/Settings/Featured.php:60
+#: ../../Zotlabs/Module/Settings/Featured.php:62
msgid "Feature/Addon Settings"
msgstr ""
@@ -3784,32 +3974,24 @@ msgstr ""
msgid "Remove authorization"
msgstr ""
-#: ../../Zotlabs/Module/Embedphotos.php:140 ../../Zotlabs/Module/Photos.php:751
-#: ../../Zotlabs/Module/Photos.php:1290 ../../Zotlabs/Widget/Album.php:78
+#: ../../Zotlabs/Module/Embedphotos.php:140 ../../Zotlabs/Module/Photos.php:753
+#: ../../Zotlabs/Module/Photos.php:1292 ../../Zotlabs/Widget/Portfolio.php:78
+#: ../../Zotlabs/Widget/Album.php:78
msgid "View Photo"
msgstr ""
-#: ../../Zotlabs/Module/Embedphotos.php:146 ../../Zotlabs/Module/Photos.php:757
-#: ../../Zotlabs/Module/Photos.php:1213 ../../Zotlabs/Lib/Apps.php:571
-#: ../../Zotlabs/Lib/Apps.php:649 ../../Zotlabs/Storage/Browser.php:163
-#: ../../Zotlabs/Widget/Album.php:84 ../../addon/cdav/Mod_Cdav.php:745
-#: ../../addon/cdav/Mod_Cdav.php:746 ../../addon/cdav/Mod_Cdav.php:753
-#: ../../include/conversation.php:1110
-msgid "Unknown"
-msgstr ""
-
-#: ../../Zotlabs/Module/Embedphotos.php:156 ../../Zotlabs/Module/Photos.php:782
-#: ../../Zotlabs/Widget/Album.php:95
+#: ../../Zotlabs/Module/Embedphotos.php:156 ../../Zotlabs/Module/Photos.php:784
+#: ../../Zotlabs/Widget/Portfolio.php:97 ../../Zotlabs/Widget/Album.php:95
msgid "Edit Album"
msgstr ""
-#: ../../Zotlabs/Module/Embedphotos.php:158 ../../Zotlabs/Module/Photos.php:784
-#: ../../Zotlabs/Module/Photos.php:1321
+#: ../../Zotlabs/Module/Embedphotos.php:158 ../../Zotlabs/Module/Photos.php:786
+#: ../../Zotlabs/Module/Photos.php:1323
#: ../../Zotlabs/Module/Profile_photo.php:423
#: ../../Zotlabs/Module/Cover_photo.php:361
-#: ../../Zotlabs/Storage/Browser.php:229 ../../Zotlabs/Storage/Browser.php:334
-#: ../../Zotlabs/Widget/Album.php:97 ../../addon/cdav/include/widgets.php:132
-#: ../../addon/cdav/include/widgets.php:168
+#: ../../Zotlabs/Storage/Browser.php:230 ../../Zotlabs/Storage/Browser.php:337
+#: ../../Zotlabs/Widget/Cdav.php:132 ../../Zotlabs/Widget/Cdav.php:168
+#: ../../Zotlabs/Widget/Portfolio.php:99 ../../Zotlabs/Widget/Album.php:97
msgid "Upload"
msgstr ""
@@ -3871,9 +4053,9 @@ msgid "URL for photo of thing (optional)"
msgstr ""
#: ../../Zotlabs/Module/Thing.php:313 ../../Zotlabs/Module/Thing.php:363
-#: ../../Zotlabs/Module/Photos.php:647 ../../Zotlabs/Module/Photos.php:1011
-#: ../../Zotlabs/Module/Connedit.php:672 ../../Zotlabs/Module/Chat.php:233
-#: ../../Zotlabs/Module/Filestorage.php:152 ../../include/acl_selectors.php:218
+#: ../../Zotlabs/Module/Photos.php:649 ../../Zotlabs/Module/Photos.php:1013
+#: ../../Zotlabs/Module/Connedit.php:672 ../../Zotlabs/Module/Chat.php:235
+#: ../../Zotlabs/Module/Filestorage.php:144 ../../include/acl_selectors.php:218
msgid "Permissions"
msgstr ""
@@ -3893,52 +4075,52 @@ msgstr ""
msgid "Channel added."
msgstr ""
-#: ../../Zotlabs/Module/Import.php:144
+#: ../../Zotlabs/Module/Import.php:143
#, php-format
msgid "Your service plan only allows %d channels."
msgstr ""
-#: ../../Zotlabs/Module/Import.php:158
+#: ../../Zotlabs/Module/Import.php:157
msgid "No channel. Import failed."
msgstr ""
-#: ../../Zotlabs/Module/Import.php:466
+#: ../../Zotlabs/Module/Import.php:470
#: ../../addon/diaspora/import_diaspora.php:142
msgid "Import completed."
msgstr ""
-#: ../../Zotlabs/Module/Import.php:494
+#: ../../Zotlabs/Module/Import.php:498
msgid "You must be logged in to use this feature."
msgstr ""
-#: ../../Zotlabs/Module/Import.php:499
+#: ../../Zotlabs/Module/Import.php:503
msgid "Import Channel"
msgstr ""
-#: ../../Zotlabs/Module/Import.php:500
+#: ../../Zotlabs/Module/Import.php:504
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."
msgstr ""
-#: ../../Zotlabs/Module/Import.php:502
+#: ../../Zotlabs/Module/Import.php:506
msgid "Or provide the old server/hub details"
msgstr ""
-#: ../../Zotlabs/Module/Import.php:503
+#: ../../Zotlabs/Module/Import.php:507
msgid "Your old identity address (xyz@example.com)"
msgstr ""
-#: ../../Zotlabs/Module/Import.php:504
+#: ../../Zotlabs/Module/Import.php:508
msgid "Your old login email address"
msgstr ""
-#: ../../Zotlabs/Module/Import.php:505
+#: ../../Zotlabs/Module/Import.php:509
msgid "Your old login password"
msgstr ""
-#: ../../Zotlabs/Module/Import.php:506
+#: ../../Zotlabs/Module/Import.php:510
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 "
@@ -3946,19 +4128,19 @@ msgid ""
"location for files, photos, and media."
msgstr ""
-#: ../../Zotlabs/Module/Import.php:507
+#: ../../Zotlabs/Module/Import.php:511
msgid "Make this hub my primary location"
msgstr ""
-#: ../../Zotlabs/Module/Import.php:508
+#: ../../Zotlabs/Module/Import.php:512
msgid "Move this channel (disable all previous locations)"
msgstr ""
-#: ../../Zotlabs/Module/Import.php:509
+#: ../../Zotlabs/Module/Import.php:513
msgid "Import a few months of posts if possible (limited by available memory"
msgstr ""
-#: ../../Zotlabs/Module/Import.php:510
+#: ../../Zotlabs/Module/Import.php:514
msgid ""
"This process may take several minutes to complete. Please submit the form "
"only once and leave this page open until finished."
@@ -3968,21 +4150,21 @@ msgstr ""
msgid "Authentication failed."
msgstr ""
-#: ../../Zotlabs/Module/Rmagic.php:75 ../../include/channel.php:1984
+#: ../../Zotlabs/Module/Rmagic.php:75 ../../include/channel.php:2000
msgid "Remote Authentication"
msgstr ""
-#: ../../Zotlabs/Module/Rmagic.php:76 ../../include/channel.php:1985
+#: ../../Zotlabs/Module/Rmagic.php:76 ../../include/channel.php:2001
msgid "Enter your channel address (e.g. channel@example.com)"
msgstr ""
-#: ../../Zotlabs/Module/Rmagic.php:77 ../../include/channel.php:1986
+#: ../../Zotlabs/Module/Rmagic.php:77 ../../include/channel.php:2002
msgid "Authenticate"
msgstr ""
#: ../../Zotlabs/Module/Cal.php:62 ../../Zotlabs/Module/Chanview.php:96
-#: ../../Zotlabs/Module/Page.php:56 ../../Zotlabs/Module/Wall_upload.php:31
-#: ../../Zotlabs/Module/Block.php:43
+#: ../../Zotlabs/Module/Page.php:75 ../../Zotlabs/Module/Wall_upload.php:31
+#: ../../Zotlabs/Module/Block.php:41
msgid "Channel not found."
msgstr ""
@@ -3990,7 +4172,7 @@ msgstr ""
msgid "Permissions denied."
msgstr ""
-#: ../../Zotlabs/Module/Cal.php:342 ../../include/text.php:2291
+#: ../../Zotlabs/Module/Cal.php:342 ../../include/text.php:2304
msgid "Import"
msgstr ""
@@ -4016,13 +4198,13 @@ msgstr ""
msgid "Item not available."
msgstr ""
-#: ../../Zotlabs/Module/Editblock.php:116 ../../Zotlabs/Module/Chat.php:205
-#: ../../Zotlabs/Module/Editwebpage.php:143 ../../Zotlabs/Module/Mail.php:306
-#: ../../Zotlabs/Module/Mail.php:448 ../../include/conversation.php:1228
+#: ../../Zotlabs/Module/Editblock.php:116 ../../Zotlabs/Module/Chat.php:207
+#: ../../Zotlabs/Module/Editwebpage.php:143 ../../Zotlabs/Module/Mail.php:288
+#: ../../Zotlabs/Module/Mail.php:430 ../../include/conversation.php:1225
msgid "Insert web link"
msgstr ""
-#: ../../Zotlabs/Module/Editblock.php:129 ../../include/conversation.php:1339
+#: ../../Zotlabs/Module/Editblock.php:129 ../../include/conversation.php:1336
msgid "Title (optional)"
msgstr ""
@@ -4030,11 +4212,11 @@ msgstr ""
msgid "Edit Block"
msgstr ""
-#: ../../Zotlabs/Module/Profile.php:91
+#: ../../Zotlabs/Module/Profile.php:93
msgid "vcard"
msgstr ""
-#: ../../Zotlabs/Module/Apps.php:45
+#: ../../Zotlabs/Module/Apps.php:45 ../../Zotlabs/Lib/Apps.php:212
msgid "Apps"
msgstr ""
@@ -4052,7 +4234,8 @@ msgctxt "mood"
msgid "%1$s is %2$s"
msgstr ""
-#: ../../Zotlabs/Module/Mood.php:135 ../../Zotlabs/Lib/Apps.php:234
+#: ../../Zotlabs/Module/Mood.php:120 ../../Zotlabs/Module/Mood.php:135
+#: ../../Zotlabs/Lib/Apps.php:235
msgid "Mood"
msgstr ""
@@ -4060,74 +4243,87 @@ msgstr ""
msgid "Set your current mood and tell your friends"
msgstr ""
-#: ../../Zotlabs/Module/Connections.php:52
-#: ../../Zotlabs/Module/Connections.php:157
-#: ../../Zotlabs/Module/Connections.php:246
-msgid "Blocked"
+#: ../../Zotlabs/Module/Connections.php:33
+#: ../../Zotlabs/Module/Connections.php:309 ../../Zotlabs/Lib/Apps.php:217
+#: ../../include/text.php:951 ../../include/nav.php:180
+msgid "Connections"
msgstr ""
-#: ../../Zotlabs/Module/Connections.php:57
-#: ../../Zotlabs/Module/Connections.php:164
+#: ../../Zotlabs/Module/Connections.php:54
+#: ../../Zotlabs/Module/Connections.php:156
#: ../../Zotlabs/Module/Connections.php:245
-msgid "Ignored"
+msgid "Blocked"
msgstr ""
-#: ../../Zotlabs/Module/Connections.php:62
-#: ../../Zotlabs/Module/Connections.php:178
+#: ../../Zotlabs/Module/Connections.php:59
+#: ../../Zotlabs/Module/Connections.php:163
#: ../../Zotlabs/Module/Connections.php:244
-msgid "Hidden"
+msgid "Ignored"
msgstr ""
-#: ../../Zotlabs/Module/Connections.php:67
-#: ../../Zotlabs/Module/Connections.php:171
+#: ../../Zotlabs/Module/Connections.php:64
+#: ../../Zotlabs/Module/Connections.php:177
#: ../../Zotlabs/Module/Connections.php:243
-msgid "Archived"
+msgid "Hidden"
msgstr ""
-#: ../../Zotlabs/Module/Connections.php:72
-#: ../../Zotlabs/Module/Connections.php:82 ../../Zotlabs/Module/Menu.php:116
-#: ../../include/conversation.php:1666
+#: ../../Zotlabs/Module/Connections.php:69
+#: ../../Zotlabs/Module/Connections.php:170
+msgid "Archived/Unreachable"
+msgstr ""
+
+#: ../../Zotlabs/Module/Connections.php:74
+#: ../../Zotlabs/Module/Connections.php:83 ../../Zotlabs/Module/Menu.php:116
+#: ../../include/conversation.php:1663
msgid "New"
msgstr ""
#: ../../Zotlabs/Module/Connections.php:88
-#: ../../Zotlabs/Module/Connections.php:103
+#: ../../Zotlabs/Module/Connections.php:102
#: ../../Zotlabs/Module/Connedit.php:709 ../../Zotlabs/Widget/Affinity.php:30
msgid "All"
msgstr ""
-#: ../../Zotlabs/Module/Connections.php:134
+#: ../../Zotlabs/Module/Connections.php:133
msgid "New Connections"
msgstr ""
-#: ../../Zotlabs/Module/Connections.php:137
+#: ../../Zotlabs/Module/Connections.php:136
msgid "Show pending (new) connections"
msgstr ""
-#: ../../Zotlabs/Module/Connections.php:144
+#: ../../Zotlabs/Module/Connections.php:143
msgid "Show all connections"
msgstr ""
-#: ../../Zotlabs/Module/Connections.php:160
+#: ../../Zotlabs/Module/Connections.php:159
msgid "Only show blocked connections"
msgstr ""
-#: ../../Zotlabs/Module/Connections.php:167
+#: ../../Zotlabs/Module/Connections.php:166
msgid "Only show ignored connections"
msgstr ""
-#: ../../Zotlabs/Module/Connections.php:174
-msgid "Only show archived connections"
+#: ../../Zotlabs/Module/Connections.php:173
+msgid "Only show archived/unreachable connections"
msgstr ""
-#: ../../Zotlabs/Module/Connections.php:181
+#: ../../Zotlabs/Module/Connections.php:180
msgid "Only show hidden connections"
msgstr ""
-#: ../../Zotlabs/Module/Connections.php:242
+#: ../../Zotlabs/Module/Connections.php:241
msgid "Pending approval"
msgstr ""
+#: ../../Zotlabs/Module/Connections.php:242
+msgid "Archived"
+msgstr ""
+
+#: ../../Zotlabs/Module/Connections.php:246
+msgid "Not connected at this location"
+msgstr ""
+
#: ../../Zotlabs/Module/Connections.php:258
#, php-format
msgid "%1$s [%2$s]"
@@ -4137,61 +4333,56 @@ msgstr ""
msgid "Edit connection"
msgstr ""
-#: ../../Zotlabs/Module/Connections.php:260
+#: ../../Zotlabs/Module/Connections.php:261
msgid "Delete connection"
msgstr ""
-#: ../../Zotlabs/Module/Connections.php:269
+#: ../../Zotlabs/Module/Connections.php:270
msgid "Channel address"
msgstr ""
-#: ../../Zotlabs/Module/Connections.php:271
+#: ../../Zotlabs/Module/Connections.php:272
msgid "Network"
msgstr ""
-#: ../../Zotlabs/Module/Connections.php:274
+#: ../../Zotlabs/Module/Connections.php:275
msgid "Call"
msgstr ""
-#: ../../Zotlabs/Module/Connections.php:276
+#: ../../Zotlabs/Module/Connections.php:277
msgid "Status"
msgstr ""
-#: ../../Zotlabs/Module/Connections.php:278
+#: ../../Zotlabs/Module/Connections.php:279
msgid "Connected"
msgstr ""
-#: ../../Zotlabs/Module/Connections.php:280
+#: ../../Zotlabs/Module/Connections.php:281
msgid "Approve connection"
msgstr ""
-#: ../../Zotlabs/Module/Connections.php:282
+#: ../../Zotlabs/Module/Connections.php:283
msgid "Ignore connection"
msgstr ""
-#: ../../Zotlabs/Module/Connections.php:283
+#: ../../Zotlabs/Module/Connections.php:284
#: ../../Zotlabs/Module/Connedit.php:626
msgid "Ignore"
msgstr ""
-#: ../../Zotlabs/Module/Connections.php:284
+#: ../../Zotlabs/Module/Connections.php:285
msgid "Recent activity"
msgstr ""
-#: ../../Zotlabs/Module/Connections.php:308 ../../Zotlabs/Lib/Apps.php:216
-#: ../../include/text.php:957 ../../include/nav.php:185
-msgid "Connections"
-msgstr ""
-
-#: ../../Zotlabs/Module/Connections.php:313
+#: ../../Zotlabs/Module/Connections.php:314
msgid "Search your connections"
msgstr ""
-#: ../../Zotlabs/Module/Connections.php:314
+#: ../../Zotlabs/Module/Connections.php:315
msgid "Connections search"
msgstr ""
-#: ../../Zotlabs/Module/Connections.php:315
+#: ../../Zotlabs/Module/Connections.php:316
#: ../../Zotlabs/Module/Directory.php:391
#: ../../Zotlabs/Module/Directory.php:396 ../../include/contact_widgets.php:23
msgid "Find"
@@ -4205,15 +4396,19 @@ msgstr ""
msgid "Source of Item"
msgstr ""
-#: ../../Zotlabs/Module/Bookmarks.php:53
+#: ../../Zotlabs/Module/Bookmarks.php:11 ../../Zotlabs/Lib/Apps.php:215
+msgid "View Bookmarks"
+msgstr ""
+
+#: ../../Zotlabs/Module/Bookmarks.php:56
msgid "Bookmark added"
msgstr ""
-#: ../../Zotlabs/Module/Bookmarks.php:76
+#: ../../Zotlabs/Module/Bookmarks.php:79
msgid "My Bookmarks"
msgstr ""
-#: ../../Zotlabs/Module/Bookmarks.php:87
+#: ../../Zotlabs/Module/Bookmarks.php:90
msgid "My Connections Bookmarks"
msgstr ""
@@ -4257,7 +4452,7 @@ msgstr ""
msgid "Delete Album"
msgstr ""
-#: ../../Zotlabs/Module/Photos.php:174 ../../Zotlabs/Module/Photos.php:1023
+#: ../../Zotlabs/Module/Photos.php:174 ../../Zotlabs/Module/Photos.php:1025
msgid "Delete Photo"
msgstr ""
@@ -4269,226 +4464,232 @@ msgstr ""
msgid "Access to this item is restricted."
msgstr ""
-#: ../../Zotlabs/Module/Photos.php:591
+#: ../../Zotlabs/Module/Photos.php:558 ../../Zotlabs/Module/Fbrowser.php:29
+#: ../../Zotlabs/Lib/Apps.php:230 ../../include/conversation.php:1780
+#: ../../include/nav.php:372
+msgid "Photos"
+msgstr ""
+
+#: ../../Zotlabs/Module/Photos.php:593
#, php-format
msgid "%1$.2f MB of %2$.2f MB photo storage used."
msgstr ""
-#: ../../Zotlabs/Module/Photos.php:594
+#: ../../Zotlabs/Module/Photos.php:596
#, php-format
msgid "%1$.2f MB photo storage used."
msgstr ""
-#: ../../Zotlabs/Module/Photos.php:636
+#: ../../Zotlabs/Module/Photos.php:638
msgid "Upload Photos"
msgstr ""
-#: ../../Zotlabs/Module/Photos.php:640
+#: ../../Zotlabs/Module/Photos.php:642
msgid "Enter an album name"
msgstr ""
-#: ../../Zotlabs/Module/Photos.php:641
+#: ../../Zotlabs/Module/Photos.php:643
msgid "or select an existing album (doubleclick)"
msgstr ""
-#: ../../Zotlabs/Module/Photos.php:642
+#: ../../Zotlabs/Module/Photos.php:644
msgid "Create a status post for this upload"
msgstr ""
-#: ../../Zotlabs/Module/Photos.php:643
+#: ../../Zotlabs/Module/Photos.php:645
msgid "Caption (optional):"
msgstr ""
-#: ../../Zotlabs/Module/Photos.php:644
+#: ../../Zotlabs/Module/Photos.php:646
msgid "Description (optional):"
msgstr ""
-#: ../../Zotlabs/Module/Photos.php:725
+#: ../../Zotlabs/Module/Photos.php:727
msgid "Show Newest First"
msgstr ""
-#: ../../Zotlabs/Module/Photos.php:727
+#: ../../Zotlabs/Module/Photos.php:729
msgid "Show Oldest First"
msgstr ""
-#: ../../Zotlabs/Module/Photos.php:832
+#: ../../Zotlabs/Module/Photos.php:834
msgid "Permission denied. Access to this item may be restricted."
msgstr ""
-#: ../../Zotlabs/Module/Photos.php:834
+#: ../../Zotlabs/Module/Photos.php:836
msgid "Photo not available"
msgstr ""
-#: ../../Zotlabs/Module/Photos.php:892
+#: ../../Zotlabs/Module/Photos.php:894
msgid "Use as profile photo"
msgstr ""
-#: ../../Zotlabs/Module/Photos.php:893
+#: ../../Zotlabs/Module/Photos.php:895
msgid "Use as cover photo"
msgstr ""
-#: ../../Zotlabs/Module/Photos.php:900
+#: ../../Zotlabs/Module/Photos.php:902
msgid "Private Photo"
msgstr ""
-#: ../../Zotlabs/Module/Photos.php:915
+#: ../../Zotlabs/Module/Photos.php:917
msgid "View Full Size"
msgstr ""
-#: ../../Zotlabs/Module/Photos.php:997
+#: ../../Zotlabs/Module/Photos.php:999
msgid "Edit photo"
msgstr ""
-#: ../../Zotlabs/Module/Photos.php:999
+#: ../../Zotlabs/Module/Photos.php:1001
msgid "Rotate CW (right)"
msgstr ""
-#: ../../Zotlabs/Module/Photos.php:1000
+#: ../../Zotlabs/Module/Photos.php:1002
msgid "Rotate CCW (left)"
msgstr ""
-#: ../../Zotlabs/Module/Photos.php:1003
+#: ../../Zotlabs/Module/Photos.php:1005
msgid "Move photo to album"
msgstr ""
-#: ../../Zotlabs/Module/Photos.php:1004
+#: ../../Zotlabs/Module/Photos.php:1006
msgid "Enter a new album name"
msgstr ""
-#: ../../Zotlabs/Module/Photos.php:1005
+#: ../../Zotlabs/Module/Photos.php:1007
msgid "or select an existing one (doubleclick)"
msgstr ""
-#: ../../Zotlabs/Module/Photos.php:1008
+#: ../../Zotlabs/Module/Photos.php:1010
msgid "Caption"
msgstr ""
-#: ../../Zotlabs/Module/Photos.php:1010
+#: ../../Zotlabs/Module/Photos.php:1012
msgid "Add a Tag"
msgstr ""
-#: ../../Zotlabs/Module/Photos.php:1018
+#: ../../Zotlabs/Module/Photos.php:1020
msgid "Example: @bob, @Barbara_Jensen, @jim@example.com"
msgstr ""
-#: ../../Zotlabs/Module/Photos.php:1021
+#: ../../Zotlabs/Module/Photos.php:1023
msgid "Flag as adult in album view"
msgstr ""
-#: ../../Zotlabs/Module/Photos.php:1040 ../../Zotlabs/Lib/ThreadItem.php:269
+#: ../../Zotlabs/Module/Photos.php:1042 ../../Zotlabs/Lib/ThreadItem.php:267
msgid "I like this (toggle)"
msgstr ""
-#: ../../Zotlabs/Module/Photos.php:1041 ../../Zotlabs/Lib/ThreadItem.php:270
+#: ../../Zotlabs/Module/Photos.php:1043 ../../Zotlabs/Lib/ThreadItem.php:268
msgid "I don't like this (toggle)"
msgstr ""
-#: ../../Zotlabs/Module/Photos.php:1043 ../../Zotlabs/Lib/ThreadItem.php:412
-#: ../../include/conversation.php:739
+#: ../../Zotlabs/Module/Photos.php:1045 ../../Zotlabs/Lib/ThreadItem.php:410
+#: ../../include/conversation.php:736
msgid "Please wait"
msgstr ""
-#: ../../Zotlabs/Module/Photos.php:1059 ../../Zotlabs/Module/Photos.php:1177
-#: ../../Zotlabs/Lib/ThreadItem.php:729
+#: ../../Zotlabs/Module/Photos.php:1061 ../../Zotlabs/Module/Photos.php:1179
+#: ../../Zotlabs/Lib/ThreadItem.php:727
msgid "This is you"
msgstr ""
-#: ../../Zotlabs/Module/Photos.php:1061 ../../Zotlabs/Module/Photos.php:1179
-#: ../../Zotlabs/Lib/ThreadItem.php:731 ../../include/js_strings.php:6
+#: ../../Zotlabs/Module/Photos.php:1063 ../../Zotlabs/Module/Photos.php:1181
+#: ../../Zotlabs/Lib/ThreadItem.php:729 ../../include/js_strings.php:6
msgid "Comment"
msgstr ""
-#: ../../Zotlabs/Module/Photos.php:1077 ../../include/conversation.php:574
+#: ../../Zotlabs/Module/Photos.php:1079 ../../include/conversation.php:569
msgctxt "title"
msgid "Likes"
msgstr ""
-#: ../../Zotlabs/Module/Photos.php:1077 ../../include/conversation.php:574
+#: ../../Zotlabs/Module/Photos.php:1079 ../../include/conversation.php:569
msgctxt "title"
msgid "Dislikes"
msgstr ""
-#: ../../Zotlabs/Module/Photos.php:1078 ../../include/conversation.php:575
+#: ../../Zotlabs/Module/Photos.php:1080 ../../include/conversation.php:570
msgctxt "title"
msgid "Agree"
msgstr ""
-#: ../../Zotlabs/Module/Photos.php:1078 ../../include/conversation.php:575
+#: ../../Zotlabs/Module/Photos.php:1080 ../../include/conversation.php:570
msgctxt "title"
msgid "Disagree"
msgstr ""
-#: ../../Zotlabs/Module/Photos.php:1078 ../../include/conversation.php:575
+#: ../../Zotlabs/Module/Photos.php:1080 ../../include/conversation.php:570
msgctxt "title"
msgid "Abstain"
msgstr ""
-#: ../../Zotlabs/Module/Photos.php:1079 ../../include/conversation.php:576
+#: ../../Zotlabs/Module/Photos.php:1081 ../../include/conversation.php:571
msgctxt "title"
msgid "Attending"
msgstr ""
-#: ../../Zotlabs/Module/Photos.php:1079 ../../include/conversation.php:576
+#: ../../Zotlabs/Module/Photos.php:1081 ../../include/conversation.php:571
msgctxt "title"
msgid "Not attending"
msgstr ""
-#: ../../Zotlabs/Module/Photos.php:1079 ../../include/conversation.php:576
+#: ../../Zotlabs/Module/Photos.php:1081 ../../include/conversation.php:571
msgctxt "title"
msgid "Might attend"
msgstr ""
-#: ../../Zotlabs/Module/Photos.php:1096 ../../Zotlabs/Module/Photos.php:1108
+#: ../../Zotlabs/Module/Photos.php:1098 ../../Zotlabs/Module/Photos.php:1110
#: ../../Zotlabs/Lib/ThreadItem.php:187 ../../Zotlabs/Lib/ThreadItem.php:199
msgid "View all"
msgstr ""
-#: ../../Zotlabs/Module/Photos.php:1100 ../../Zotlabs/Lib/ThreadItem.php:191
-#: ../../include/conversation.php:1907 ../../include/channel.php:1268
-#: ../../include/taxonomy.php:403
+#: ../../Zotlabs/Module/Photos.php:1102 ../../Zotlabs/Lib/ThreadItem.php:191
+#: ../../include/conversation.php:1904 ../../include/channel.php:1289
+#: ../../include/taxonomy.php:442
msgctxt "noun"
msgid "Like"
msgid_plural "Likes"
msgstr[0] ""
msgstr[1] ""
-#: ../../Zotlabs/Module/Photos.php:1105 ../../Zotlabs/Lib/ThreadItem.php:196
-#: ../../include/conversation.php:1910
+#: ../../Zotlabs/Module/Photos.php:1107 ../../Zotlabs/Lib/ThreadItem.php:196
+#: ../../include/conversation.php:1907
msgctxt "noun"
msgid "Dislike"
msgid_plural "Dislikes"
msgstr[0] ""
msgstr[1] ""
-#: ../../Zotlabs/Module/Photos.php:1205
+#: ../../Zotlabs/Module/Photos.php:1207
msgid "Photo Tools"
msgstr ""
-#: ../../Zotlabs/Module/Photos.php:1214
+#: ../../Zotlabs/Module/Photos.php:1216
msgid "In This Photo:"
msgstr ""
-#: ../../Zotlabs/Module/Photos.php:1219
+#: ../../Zotlabs/Module/Photos.php:1221
msgid "Map"
msgstr ""
-#: ../../Zotlabs/Module/Photos.php:1227 ../../Zotlabs/Lib/ThreadItem.php:401
+#: ../../Zotlabs/Module/Photos.php:1229 ../../Zotlabs/Lib/ThreadItem.php:399
msgctxt "noun"
msgid "Likes"
msgstr ""
-#: ../../Zotlabs/Module/Photos.php:1228 ../../Zotlabs/Lib/ThreadItem.php:402
+#: ../../Zotlabs/Module/Photos.php:1230 ../../Zotlabs/Lib/ThreadItem.php:400
msgctxt "noun"
msgid "Dislikes"
msgstr ""
-#: ../../Zotlabs/Module/Photos.php:1233 ../../Zotlabs/Lib/ThreadItem.php:407
+#: ../../Zotlabs/Module/Photos.php:1235 ../../Zotlabs/Lib/ThreadItem.php:405
#: ../../include/acl_selectors.php:220
msgid "Close"
msgstr ""
-#: ../../Zotlabs/Module/Photos.php:1305 ../../Zotlabs/Module/Photos.php:1318
-#: ../../Zotlabs/Module/Photos.php:1319 ../../include/photos.php:529
+#: ../../Zotlabs/Module/Photos.php:1307 ../../Zotlabs/Module/Photos.php:1320
+#: ../../Zotlabs/Module/Photos.php:1321 ../../include/photos.php:526
msgid "Recent Photos"
msgstr ""
@@ -4504,163 +4705,169 @@ msgstr ""
msgid "Invalid channel"
msgstr ""
-#: ../../Zotlabs/Module/Wiki.php:160 ../../addon/gitwiki/Mod_Gitwiki.php:146
-#: ../../include/conversation.php:1854 ../../include/nav.php:462
+#: ../../Zotlabs/Module/Wiki.php:79 ../../Zotlabs/Lib/Apps.php:227
+#: ../../include/conversation.php:1854 ../../include/features.php:95
+#: ../../include/nav.php:445
+msgid "Wiki"
+msgstr ""
+
+#: ../../Zotlabs/Module/Wiki.php:162 ../../addon/gitwiki/Mod_Gitwiki.php:146
+#: ../../include/conversation.php:1851 ../../include/nav.php:442
msgid "Wikis"
msgstr ""
-#: ../../Zotlabs/Module/Wiki.php:166 ../../addon/gitwiki/Mod_Gitwiki.php:152
+#: ../../Zotlabs/Module/Wiki.php:168 ../../addon/gitwiki/Mod_Gitwiki.php:152
msgid "Download"
msgstr ""
-#: ../../Zotlabs/Module/Wiki.php:168 ../../Zotlabs/Module/Chat.php:254
-#: ../../Zotlabs/Module/Profiles.php:834 ../../Zotlabs/Module/Manage.php:143
+#: ../../Zotlabs/Module/Wiki.php:170 ../../Zotlabs/Module/Chat.php:256
+#: ../../Zotlabs/Module/Profiles.php:834 ../../Zotlabs/Module/Manage.php:145
#: ../../addon/gitwiki/Mod_Gitwiki.php:154
msgid "Create New"
msgstr ""
-#: ../../Zotlabs/Module/Wiki.php:170 ../../addon/gitwiki/Mod_Gitwiki.php:156
+#: ../../Zotlabs/Module/Wiki.php:172 ../../addon/gitwiki/Mod_Gitwiki.php:156
msgid "Wiki name"
msgstr ""
-#: ../../Zotlabs/Module/Wiki.php:171 ../../addon/gitwiki/Mod_Gitwiki.php:157
+#: ../../Zotlabs/Module/Wiki.php:173 ../../addon/gitwiki/Mod_Gitwiki.php:157
msgid "Content type"
msgstr ""
-#: ../../Zotlabs/Module/Wiki.php:173 ../../Zotlabs/Storage/Browser.php:234
+#: ../../Zotlabs/Module/Wiki.php:175 ../../Zotlabs/Storage/Browser.php:235
#: ../../addon/gitwiki/Mod_Gitwiki.php:159
msgid "Type"
msgstr ""
-#: ../../Zotlabs/Module/Wiki.php:180 ../../addon/gitwiki/Mod_Gitwiki.php:166
+#: ../../Zotlabs/Module/Wiki.php:182 ../../addon/gitwiki/Mod_Gitwiki.php:166
msgid "Create a status post for this wiki"
msgstr ""
-#: ../../Zotlabs/Module/Wiki.php:205 ../../addon/gitwiki/Mod_Gitwiki.php:185
+#: ../../Zotlabs/Module/Wiki.php:224 ../../addon/gitwiki/Mod_Gitwiki.php:185
msgid "Wiki not found"
msgstr ""
-#: ../../Zotlabs/Module/Wiki.php:229 ../../addon/gitwiki/Mod_Gitwiki.php:210
+#: ../../Zotlabs/Module/Wiki.php:248 ../../addon/gitwiki/Mod_Gitwiki.php:210
msgid "Rename page"
msgstr ""
-#: ../../Zotlabs/Module/Wiki.php:233 ../../addon/gitwiki/Mod_Gitwiki.php:214
+#: ../../Zotlabs/Module/Wiki.php:258 ../../addon/gitwiki/Mod_Gitwiki.php:214
msgid "Error retrieving page content"
msgstr ""
-#: ../../Zotlabs/Module/Wiki.php:239
+#: ../../Zotlabs/Module/Wiki.php:264
msgid "New page"
msgstr ""
-#: ../../Zotlabs/Module/Wiki.php:263 ../../addon/gitwiki/Mod_Gitwiki.php:242
+#: ../../Zotlabs/Module/Wiki.php:288 ../../addon/gitwiki/Mod_Gitwiki.php:242
msgid "Revision Comparison"
msgstr ""
-#: ../../Zotlabs/Module/Wiki.php:264 ../../addon/gitwiki/Mod_Gitwiki.php:243
+#: ../../Zotlabs/Module/Wiki.php:289 ../../addon/gitwiki/Mod_Gitwiki.php:243
msgid "Revert"
msgstr ""
-#: ../../Zotlabs/Module/Wiki.php:268
+#: ../../Zotlabs/Module/Wiki.php:293
msgid "Short description of your changes (optional)"
msgstr ""
-#: ../../Zotlabs/Module/Wiki.php:275 ../../addon/gitwiki/Mod_Gitwiki.php:252
+#: ../../Zotlabs/Module/Wiki.php:300 ../../addon/gitwiki/Mod_Gitwiki.php:252
msgid "Source"
msgstr ""
-#: ../../Zotlabs/Module/Wiki.php:283 ../../addon/gitwiki/Mod_Gitwiki.php:260
+#: ../../Zotlabs/Module/Wiki.php:309 ../../addon/gitwiki/Mod_Gitwiki.php:260
msgid "New page name"
msgstr ""
-#: ../../Zotlabs/Module/Wiki.php:288 ../../addon/gitwiki/Mod_Gitwiki.php:265
-#: ../../include/conversation.php:1232
+#: ../../Zotlabs/Module/Wiki.php:314 ../../addon/gitwiki/Mod_Gitwiki.php:265
+#: ../../include/conversation.php:1229
msgid "Embed image from photo albums"
msgstr ""
-#: ../../Zotlabs/Module/Wiki.php:289 ../../addon/gitwiki/Mod_Gitwiki.php:266
-#: ../../include/conversation.php:1326
+#: ../../Zotlabs/Module/Wiki.php:315 ../../addon/gitwiki/Mod_Gitwiki.php:266
+#: ../../include/conversation.php:1323
msgid "Embed an image from your albums"
msgstr ""
-#: ../../Zotlabs/Module/Wiki.php:291 ../../addon/gitwiki/Mod_Gitwiki.php:268
-#: ../../include/conversation.php:1328 ../../include/conversation.php:1375
+#: ../../Zotlabs/Module/Wiki.php:317 ../../addon/gitwiki/Mod_Gitwiki.php:268
+#: ../../include/conversation.php:1325 ../../include/conversation.php:1372
msgid "OK"
msgstr ""
-#: ../../Zotlabs/Module/Wiki.php:292 ../../addon/gitwiki/Mod_Gitwiki.php:269
-#: ../../include/conversation.php:1268
+#: ../../Zotlabs/Module/Wiki.php:318 ../../addon/gitwiki/Mod_Gitwiki.php:269
+#: ../../include/conversation.php:1265
msgid "Choose images to embed"
msgstr ""
-#: ../../Zotlabs/Module/Wiki.php:293 ../../addon/gitwiki/Mod_Gitwiki.php:270
-#: ../../include/conversation.php:1269
+#: ../../Zotlabs/Module/Wiki.php:319 ../../addon/gitwiki/Mod_Gitwiki.php:270
+#: ../../include/conversation.php:1266
msgid "Choose an album"
msgstr ""
-#: ../../Zotlabs/Module/Wiki.php:294 ../../addon/gitwiki/Mod_Gitwiki.php:271
+#: ../../Zotlabs/Module/Wiki.php:320 ../../addon/gitwiki/Mod_Gitwiki.php:271
msgid "Choose a different album"
msgstr ""
-#: ../../Zotlabs/Module/Wiki.php:295 ../../addon/gitwiki/Mod_Gitwiki.php:272
-#: ../../include/conversation.php:1271
+#: ../../Zotlabs/Module/Wiki.php:321 ../../addon/gitwiki/Mod_Gitwiki.php:272
+#: ../../include/conversation.php:1268
msgid "Error getting album list"
msgstr ""
-#: ../../Zotlabs/Module/Wiki.php:296 ../../addon/gitwiki/Mod_Gitwiki.php:273
-#: ../../include/conversation.php:1272
+#: ../../Zotlabs/Module/Wiki.php:322 ../../addon/gitwiki/Mod_Gitwiki.php:273
+#: ../../include/conversation.php:1269
msgid "Error getting photo link"
msgstr ""
-#: ../../Zotlabs/Module/Wiki.php:297 ../../addon/gitwiki/Mod_Gitwiki.php:274
-#: ../../include/conversation.php:1273
+#: ../../Zotlabs/Module/Wiki.php:323 ../../addon/gitwiki/Mod_Gitwiki.php:274
+#: ../../include/conversation.php:1270
msgid "Error getting album"
msgstr ""
-#: ../../Zotlabs/Module/Wiki.php:364 ../../addon/gitwiki/Mod_Gitwiki.php:337
+#: ../../Zotlabs/Module/Wiki.php:391 ../../addon/gitwiki/Mod_Gitwiki.php:337
msgid "Error creating wiki. Invalid name."
msgstr ""
-#: ../../Zotlabs/Module/Wiki.php:371
+#: ../../Zotlabs/Module/Wiki.php:398
msgid "A wiki with this name already exists."
msgstr ""
-#: ../../Zotlabs/Module/Wiki.php:384 ../../addon/gitwiki/Mod_Gitwiki.php:348
+#: ../../Zotlabs/Module/Wiki.php:411 ../../addon/gitwiki/Mod_Gitwiki.php:348
msgid "Wiki created, but error creating Home page."
msgstr ""
-#: ../../Zotlabs/Module/Wiki.php:391 ../../addon/gitwiki/Mod_Gitwiki.php:353
+#: ../../Zotlabs/Module/Wiki.php:418 ../../addon/gitwiki/Mod_Gitwiki.php:353
msgid "Error creating wiki"
msgstr ""
-#: ../../Zotlabs/Module/Wiki.php:403
+#: ../../Zotlabs/Module/Wiki.php:430
msgid "Wiki delete permission denied."
msgstr ""
-#: ../../Zotlabs/Module/Wiki.php:413
+#: ../../Zotlabs/Module/Wiki.php:440
msgid "Error deleting wiki"
msgstr ""
-#: ../../Zotlabs/Module/Wiki.php:439 ../../addon/gitwiki/Mod_Gitwiki.php:400
+#: ../../Zotlabs/Module/Wiki.php:466 ../../addon/gitwiki/Mod_Gitwiki.php:400
msgid "New page created"
msgstr ""
-#: ../../Zotlabs/Module/Wiki.php:558
+#: ../../Zotlabs/Module/Wiki.php:587
msgid "Cannot delete Home"
msgstr ""
-#: ../../Zotlabs/Module/Wiki.php:622
+#: ../../Zotlabs/Module/Wiki.php:651
msgid "Current Revision"
msgstr ""
-#: ../../Zotlabs/Module/Wiki.php:622
+#: ../../Zotlabs/Module/Wiki.php:651
msgid "Selected Revision"
msgstr ""
-#: ../../Zotlabs/Module/Wiki.php:672
+#: ../../Zotlabs/Module/Wiki.php:701
msgid "You must be authenticated."
msgstr ""
-#: ../../Zotlabs/Module/Chanview.php:134
+#: ../../Zotlabs/Module/Chanview.php:139
msgid "toggle full screen mode"
msgstr ""
@@ -4668,7 +4875,7 @@ msgstr ""
msgid "Layout updated."
msgstr ""
-#: ../../Zotlabs/Module/Pdledit.php:34 ../../Zotlabs/Module/Chat.php:217
+#: ../../Zotlabs/Module/Pdledit.php:34 ../../Zotlabs/Module/Chat.php:219
msgid "Feature disabled."
msgstr ""
@@ -4688,32 +4895,32 @@ msgstr ""
msgid "Layout Help"
msgstr ""
-#: ../../Zotlabs/Module/Poke.php:168 ../../Zotlabs/Lib/Apps.php:235
-#: ../../include/conversation.php:1042
+#: ../../Zotlabs/Module/Poke.php:153 ../../Zotlabs/Module/Poke.php:182
+#: ../../Zotlabs/Lib/Apps.php:236 ../../include/conversation.php:1039
msgid "Poke"
msgstr ""
-#: ../../Zotlabs/Module/Poke.php:169
+#: ../../Zotlabs/Module/Poke.php:183
msgid "Poke somebody"
msgstr ""
-#: ../../Zotlabs/Module/Poke.php:172
+#: ../../Zotlabs/Module/Poke.php:186
msgid "Poke/Prod"
msgstr ""
-#: ../../Zotlabs/Module/Poke.php:173
+#: ../../Zotlabs/Module/Poke.php:187
msgid "Poke, prod or do other things to somebody"
msgstr ""
-#: ../../Zotlabs/Module/Poke.php:180
+#: ../../Zotlabs/Module/Poke.php:194
msgid "Recipient"
msgstr ""
-#: ../../Zotlabs/Module/Poke.php:181
+#: ../../Zotlabs/Module/Poke.php:195
msgid "Choose what you wish to do to recipient"
msgstr ""
-#: ../../Zotlabs/Module/Poke.php:184 ../../Zotlabs/Module/Poke.php:185
+#: ../../Zotlabs/Module/Poke.php:198 ../../Zotlabs/Module/Poke.php:199
msgid "Make this post private"
msgstr ""
@@ -4724,7 +4931,7 @@ msgstr ""
#: ../../Zotlabs/Module/Profile_photo.php:115
#: ../../Zotlabs/Module/Profile_photo.php:226
-#: ../../include/photo/photo_driver.php:647
+#: ../../include/photo/photo_driver.php:658
msgid "Profile Photos"
msgstr ""
@@ -4741,7 +4948,7 @@ msgid ""
msgstr ""
#: ../../Zotlabs/Module/Profile_photo.php:203
-#: ../../Zotlabs/Module/Cover_photo.php:173 ../../include/photos.php:149
+#: ../../Zotlabs/Module/Cover_photo.php:173 ../../include/photos.php:145
msgid "Unable to process image"
msgstr ""
@@ -4823,28 +5030,32 @@ msgstr ""
msgid "Unable to locate original post."
msgstr ""
-#: ../../Zotlabs/Module/Item.php:451
+#: ../../Zotlabs/Module/Item.php:470
msgid "Empty post discarded."
msgstr ""
-#: ../../Zotlabs/Module/Item.php:825
+#: ../../Zotlabs/Module/Item.php:844
msgid "Duplicate post suppressed."
msgstr ""
-#: ../../Zotlabs/Module/Item.php:955
+#: ../../Zotlabs/Module/Item.php:989
msgid "System error. Post not saved."
msgstr ""
-#: ../../Zotlabs/Module/Item.php:1085
+#: ../../Zotlabs/Module/Item.php:1025
+msgid "Your comment is awaiting approval."
+msgstr ""
+
+#: ../../Zotlabs/Module/Item.php:1123
msgid "Unable to obtain post information from database."
msgstr ""
-#: ../../Zotlabs/Module/Item.php:1092
+#: ../../Zotlabs/Module/Item.php:1130
#, php-format
msgid "You have reached your limit of %1$.0f top level posts."
msgstr ""
-#: ../../Zotlabs/Module/Item.php:1099
+#: ../../Zotlabs/Module/Item.php:1137
#, php-format
msgid "You have reached your limit of %1$.0f webpages."
msgstr ""
@@ -4869,18 +5080,18 @@ msgstr ""
msgid "posted an event"
msgstr ""
-#: ../../Zotlabs/Module/Page.php:40 ../../Zotlabs/Module/Block.php:31
+#: ../../Zotlabs/Module/Page.php:39 ../../Zotlabs/Module/Block.php:29
msgid "Invalid item."
msgstr ""
-#: ../../Zotlabs/Module/Page.php:94 ../../Zotlabs/Module/Block.php:79
+#: ../../Zotlabs/Module/Page.php:128 ../../Zotlabs/Module/Block.php:77
#: ../../Zotlabs/Module/Display.php:122
#: ../../Zotlabs/Lib/NativeWikiPage.php:500 ../../Zotlabs/Web/Router.php:146
#: ../../include/help.php:68
msgid "Page not found."
msgstr ""
-#: ../../Zotlabs/Module/Page.php:131
+#: ../../Zotlabs/Module/Page.php:165
msgid ""
"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod "
"tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, "
@@ -4928,9 +5139,9 @@ msgstr ""
msgid "Connection has been removed."
msgstr ""
-#: ../../Zotlabs/Module/Connedit.php:590 ../../Zotlabs/Lib/Apps.php:228
+#: ../../Zotlabs/Module/Connedit.php:590 ../../Zotlabs/Lib/Apps.php:229
#: ../../addon/openclipatar/openclipatar.php:57
-#: ../../include/conversation.php:982 ../../include/nav.php:106
+#: ../../include/conversation.php:979 ../../include/nav.php:102
msgid "View Profile"
msgstr ""
@@ -5084,101 +5295,119 @@ msgstr ""
msgid "none"
msgstr ""
-#: ../../Zotlabs/Module/Connedit.php:847
-#: ../../Zotlabs/Widget/Settings_menu.php:107
+#: ../../Zotlabs/Module/Connedit.php:851
+msgid "This connection is unreachable from this location."
+msgstr ""
+
+#: ../../Zotlabs/Module/Connedit.php:852
+msgid "This connection may be unreachable from other channel locations."
+msgstr ""
+
+#: ../../Zotlabs/Module/Connedit.php:854
+msgid "Location independence is not supported by their network."
+msgstr ""
+
+#: ../../Zotlabs/Module/Connedit.php:860
+msgid ""
+"This connection is unreachable from this location. Location independence is "
+"not supported by their network."
+msgstr ""
+
+#: ../../Zotlabs/Module/Connedit.php:863
+#: ../../Zotlabs/Widget/Settings_menu.php:109
msgid "Connection Default Permissions"
msgstr ""
-#: ../../Zotlabs/Module/Connedit.php:847 ../../include/items.php:3955
+#: ../../Zotlabs/Module/Connedit.php:863 ../../include/items.php:3925
#, php-format
msgid "Connection: %s"
msgstr ""
-#: ../../Zotlabs/Module/Connedit.php:848
+#: ../../Zotlabs/Module/Connedit.php:864
msgid "Apply these permissions automatically"
msgstr ""
-#: ../../Zotlabs/Module/Connedit.php:848
+#: ../../Zotlabs/Module/Connedit.php:864
msgid "Connection requests will be approved without your interaction"
msgstr ""
-#: ../../Zotlabs/Module/Connedit.php:849
+#: ../../Zotlabs/Module/Connedit.php:865
msgid "Permission role"
msgstr ""
-#: ../../Zotlabs/Module/Connedit.php:850
+#: ../../Zotlabs/Module/Connedit.php:866
msgid "Add permission role"
msgstr ""
-#: ../../Zotlabs/Module/Connedit.php:856
+#: ../../Zotlabs/Module/Connedit.php:872
msgid "This connection's primary address is"
msgstr ""
-#: ../../Zotlabs/Module/Connedit.php:857
+#: ../../Zotlabs/Module/Connedit.php:873
msgid "Available locations:"
msgstr ""
-#: ../../Zotlabs/Module/Connedit.php:861
+#: ../../Zotlabs/Module/Connedit.php:878
msgid ""
"The permissions indicated on this page will be applied to all new "
"connections."
msgstr ""
-#: ../../Zotlabs/Module/Connedit.php:862
+#: ../../Zotlabs/Module/Connedit.php:879
msgid "Connection Tools"
msgstr ""
-#: ../../Zotlabs/Module/Connedit.php:864
+#: ../../Zotlabs/Module/Connedit.php:881
msgid "Slide to adjust your degree of friendship"
msgstr ""
-#: ../../Zotlabs/Module/Connedit.php:865 ../../Zotlabs/Module/Rate.php:155
+#: ../../Zotlabs/Module/Connedit.php:882 ../../Zotlabs/Module/Rate.php:155
#: ../../include/js_strings.php:20
msgid "Rating"
msgstr ""
-#: ../../Zotlabs/Module/Connedit.php:866
+#: ../../Zotlabs/Module/Connedit.php:883
msgid "Slide to adjust your rating"
msgstr ""
-#: ../../Zotlabs/Module/Connedit.php:867 ../../Zotlabs/Module/Connedit.php:872
+#: ../../Zotlabs/Module/Connedit.php:884 ../../Zotlabs/Module/Connedit.php:889
msgid "Optionally explain your rating"
msgstr ""
-#: ../../Zotlabs/Module/Connedit.php:869
+#: ../../Zotlabs/Module/Connedit.php:886
msgid "Custom Filter"
msgstr ""
-#: ../../Zotlabs/Module/Connedit.php:870
+#: ../../Zotlabs/Module/Connedit.php:887
msgid "Only import posts with this text"
msgstr ""
-#: ../../Zotlabs/Module/Connedit.php:870 ../../Zotlabs/Module/Connedit.php:871
+#: ../../Zotlabs/Module/Connedit.php:887 ../../Zotlabs/Module/Connedit.php:888
msgid ""
"words one per line or #tags or /patterns/ or lang=xx, leave blank to import "
"all posts"
msgstr ""
-#: ../../Zotlabs/Module/Connedit.php:871
+#: ../../Zotlabs/Module/Connedit.php:888
msgid "Do not import posts with this text"
msgstr ""
-#: ../../Zotlabs/Module/Connedit.php:873
+#: ../../Zotlabs/Module/Connedit.php:890
msgid "This information is public!"
msgstr ""
-#: ../../Zotlabs/Module/Connedit.php:878
+#: ../../Zotlabs/Module/Connedit.php:895
msgid "Connection Pending Approval"
msgstr ""
-#: ../../Zotlabs/Module/Connedit.php:883
+#: ../../Zotlabs/Module/Connedit.php:900
#, php-format
msgid ""
"Please choose the profile you would like to display to %s when viewing your "
"profile securely."
msgstr ""
-#: ../../Zotlabs/Module/Connedit.php:890
+#: ../../Zotlabs/Module/Connedit.php:907
msgid ""
"Some permissions may be inherited from your channel's <a href=\"settings"
"\"><strong>privacy settings</strong></a>, which have higher priority than "
@@ -5186,172 +5415,85 @@ msgid ""
"any impact unless the inherited setting changes."
msgstr ""
-#: ../../Zotlabs/Module/Connedit.php:891
+#: ../../Zotlabs/Module/Connedit.php:908
msgid "Last update:"
msgstr ""
-#: ../../Zotlabs/Module/Connedit.php:900
+#: ../../Zotlabs/Module/Connedit.php:917
msgid "Details"
msgstr ""
-#: ../../Zotlabs/Module/Connedit.php:903 ../../addon/cdav/Mod_Cdav.php:1137
-msgid "Organisation"
-msgstr ""
-
-#: ../../Zotlabs/Module/Connedit.php:904 ../../addon/cdav/Mod_Cdav.php:1138
-#: ../../include/page_widgets.php:46
-msgid "Title"
-msgstr ""
-
-#: ../../Zotlabs/Module/Connedit.php:905 ../../Zotlabs/Module/Profiles.php:789
-#: ../../addon/cdav/Mod_Cdav.php:1139
-msgid "Phone"
-msgstr ""
-
-#: ../../Zotlabs/Module/Connedit.php:907 ../../Zotlabs/Module/Profiles.php:791
-#: ../../addon/cdav/Mod_Cdav.php:1141
-msgid "Instant messenger"
-msgstr ""
-
-#: ../../Zotlabs/Module/Connedit.php:908 ../../Zotlabs/Module/Profiles.php:792
-#: ../../addon/cdav/Mod_Cdav.php:1142
-msgid "Website"
-msgstr ""
-
-#: ../../Zotlabs/Module/Connedit.php:910 ../../Zotlabs/Module/Profiles.php:794
-#: ../../addon/cdav/Mod_Cdav.php:1144
-msgid "Note"
-msgstr ""
-
-#: ../../Zotlabs/Module/Connedit.php:911 ../../Zotlabs/Module/Profiles.php:795
-#: ../../addon/cdav/Mod_Cdav.php:1145 ../../addon/cdav/cdav.php:270
-#: ../../include/connections.php:668
-msgid "Mobile"
-msgstr ""
-
-#: ../../Zotlabs/Module/Connedit.php:912 ../../Zotlabs/Module/Profiles.php:796
-#: ../../addon/cdav/Mod_Cdav.php:1146 ../../addon/cdav/cdav.php:271
-#: ../../include/connections.php:669
-msgid "Home"
-msgstr ""
-
-#: ../../Zotlabs/Module/Connedit.php:913 ../../Zotlabs/Module/Profiles.php:797
-#: ../../addon/cdav/Mod_Cdav.php:1147 ../../addon/cdav/cdav.php:274
-#: ../../include/connections.php:672
-msgid "Work"
-msgstr ""
-
-#: ../../Zotlabs/Module/Connedit.php:915 ../../Zotlabs/Module/Profiles.php:799
-#: ../../addon/cdav/Mod_Cdav.php:1149 ../../addon/jappixmini/jappixmini.php:368
-msgid "Add Contact"
-msgstr ""
-
-#: ../../Zotlabs/Module/Connedit.php:916 ../../Zotlabs/Module/Profiles.php:800
-#: ../../addon/cdav/Mod_Cdav.php:1150
-msgid "Add Field"
-msgstr ""
-
-#: ../../Zotlabs/Module/Connedit.php:921 ../../addon/cdav/Mod_Cdav.php:1155
-msgid "P.O. Box"
-msgstr ""
-
-#: ../../Zotlabs/Module/Connedit.php:922 ../../addon/cdav/Mod_Cdav.php:1156
-msgid "Additional"
-msgstr ""
-
-#: ../../Zotlabs/Module/Connedit.php:923 ../../addon/cdav/Mod_Cdav.php:1157
-msgid "Street"
-msgstr ""
-
-#: ../../Zotlabs/Module/Connedit.php:924 ../../addon/cdav/Mod_Cdav.php:1158
-msgid "Locality"
-msgstr ""
-
-#: ../../Zotlabs/Module/Connedit.php:925 ../../addon/cdav/Mod_Cdav.php:1159
-msgid "Region"
-msgstr ""
-
-#: ../../Zotlabs/Module/Connedit.php:926 ../../addon/cdav/Mod_Cdav.php:1160
-msgid "ZIP Code"
-msgstr ""
-
-#: ../../Zotlabs/Module/Connedit.php:927 ../../Zotlabs/Module/Profiles.php:760
-#: ../../addon/cdav/Mod_Cdav.php:1161
-msgid "Country"
+#: ../../Zotlabs/Module/Chat.php:94 ../../Zotlabs/Lib/Apps.php:216
+msgid "My Chatrooms"
msgstr ""
-#: ../../Zotlabs/Module/Chat.php:179
+#: ../../Zotlabs/Module/Chat.php:181
msgid "Room not found"
msgstr ""
-#: ../../Zotlabs/Module/Chat.php:195
+#: ../../Zotlabs/Module/Chat.php:197
msgid "Leave Room"
msgstr ""
-#: ../../Zotlabs/Module/Chat.php:196
+#: ../../Zotlabs/Module/Chat.php:198
msgid "Delete Room"
msgstr ""
-#: ../../Zotlabs/Module/Chat.php:197
+#: ../../Zotlabs/Module/Chat.php:199
msgid "I am away right now"
msgstr ""
-#: ../../Zotlabs/Module/Chat.php:198
+#: ../../Zotlabs/Module/Chat.php:200
msgid "I am online"
msgstr ""
-#: ../../Zotlabs/Module/Chat.php:200
+#: ../../Zotlabs/Module/Chat.php:202
msgid "Bookmark this room"
msgstr ""
-#: ../../Zotlabs/Module/Chat.php:203 ../../Zotlabs/Module/Mail.php:259
-#: ../../Zotlabs/Module/Mail.php:380 ../../include/conversation.php:1263
+#: ../../Zotlabs/Module/Chat.php:205 ../../Zotlabs/Module/Mail.php:241
+#: ../../Zotlabs/Module/Mail.php:362 ../../include/conversation.php:1260
msgid "Please enter a link URL:"
msgstr ""
-#: ../../Zotlabs/Module/Chat.php:204 ../../Zotlabs/Module/Mail.php:312
-#: ../../Zotlabs/Module/Mail.php:454 ../../Zotlabs/Lib/ThreadItem.php:744
-#: ../../include/conversation.php:1373
+#: ../../Zotlabs/Module/Chat.php:206 ../../Zotlabs/Module/Mail.php:294
+#: ../../Zotlabs/Module/Mail.php:436 ../../Zotlabs/Lib/ThreadItem.php:742
+#: ../../include/conversation.php:1370
msgid "Encrypt text"
msgstr ""
-#: ../../Zotlabs/Module/Chat.php:230
+#: ../../Zotlabs/Module/Chat.php:232
msgid "New Chatroom"
msgstr ""
-#: ../../Zotlabs/Module/Chat.php:231
+#: ../../Zotlabs/Module/Chat.php:233
msgid "Chatroom name"
msgstr ""
-#: ../../Zotlabs/Module/Chat.php:232
+#: ../../Zotlabs/Module/Chat.php:234
msgid "Expiration of chats (minutes)"
msgstr ""
-#: ../../Zotlabs/Module/Chat.php:248
+#: ../../Zotlabs/Module/Chat.php:250
#, php-format
msgid "%1$s's Chatrooms"
msgstr ""
-#: ../../Zotlabs/Module/Chat.php:253
+#: ../../Zotlabs/Module/Chat.php:255
msgid "No chatrooms available"
msgstr ""
-#: ../../Zotlabs/Module/Chat.php:257
+#: ../../Zotlabs/Module/Chat.php:259
msgid "Expiration"
msgstr ""
-#: ../../Zotlabs/Module/Chat.php:258
+#: ../../Zotlabs/Module/Chat.php:260
msgid "min"
msgstr ""
-#: ../../Zotlabs/Module/Fbrowser.php:29 ../../Zotlabs/Lib/Apps.php:229
-#: ../../include/conversation.php:1783 ../../include/nav.php:392
-msgid "Photos"
-msgstr ""
-
-#: ../../Zotlabs/Module/Fbrowser.php:85 ../../Zotlabs/Lib/Apps.php:224
-#: ../../Zotlabs/Storage/Browser.php:224 ../../include/conversation.php:1791
-#: ../../include/nav.php:400
+#: ../../Zotlabs/Module/Fbrowser.php:85 ../../Zotlabs/Lib/Apps.php:225
+#: ../../Zotlabs/Storage/Browser.php:225 ../../Zotlabs/Storage/Browser.php:247
+#: ../../include/conversation.php:1788 ../../include/nav.php:380
msgid "Files"
msgstr ""
@@ -5391,7 +5533,7 @@ msgstr ""
msgid "Submit and proceed"
msgstr ""
-#: ../../Zotlabs/Module/Menu.php:107 ../../include/text.php:2268
+#: ../../Zotlabs/Module/Menu.php:107 ../../include/text.php:2281
msgid "Menus"
msgstr ""
@@ -5443,13 +5585,14 @@ msgstr ""
msgid "Allow bookmarks"
msgstr ""
-#: ../../Zotlabs/Module/Layouts.php:184 ../../include/text.php:2269
+#: ../../Zotlabs/Module/Layouts.php:184 ../../include/text.php:2282
msgid "Layouts"
msgstr ""
-#: ../../Zotlabs/Module/Layouts.php:186 ../../Zotlabs/Lib/Apps.php:232
-#: ../../include/nav.php:161 ../../include/nav.php:268
-#: ../../include/help.php:55 ../../include/help.php:61
+#: ../../Zotlabs/Module/Layouts.php:186 ../../Zotlabs/Module/Help.php:18
+#: ../../Zotlabs/Lib/Apps.php:233 ../../include/nav.php:157
+#: ../../include/nav.php:258 ../../include/help.php:55
+#: ../../include/help.php:61
msgid "Help"
msgstr ""
@@ -5465,12 +5608,13 @@ msgstr ""
msgid "Download PDL file"
msgstr ""
-#: ../../Zotlabs/Module/Tagger.php:55 ../../include/bbcode.php:274
+#: ../../Zotlabs/Module/Tagger.php:55 ../../include/markdown.php:141
+#: ../../include/bbcode.php:334
msgid "post"
msgstr ""
#: ../../Zotlabs/Module/Tagger.php:57 ../../include/conversation.php:146
-#: ../../include/text.php:1945
+#: ../../include/text.php:1938
msgid "comment"
msgstr ""
@@ -5502,8 +5646,8 @@ msgstr ""
msgid "Could not create privacy group."
msgstr ""
-#: ../../Zotlabs/Module/Group.php:42 ../../Zotlabs/Module/Group.php:141
-#: ../../include/items.php:3922
+#: ../../Zotlabs/Module/Group.php:42 ../../Zotlabs/Module/Group.php:143
+#: ../../include/items.php:3892
msgid "Privacy group not found."
msgstr ""
@@ -5511,39 +5655,39 @@ msgstr ""
msgid "Privacy group updated."
msgstr ""
-#: ../../Zotlabs/Module/Group.php:90
+#: ../../Zotlabs/Module/Group.php:92
msgid "Create a group of channels."
msgstr ""
-#: ../../Zotlabs/Module/Group.php:91 ../../Zotlabs/Module/Group.php:184
+#: ../../Zotlabs/Module/Group.php:93 ../../Zotlabs/Module/Group.php:186
msgid "Privacy group name: "
msgstr ""
-#: ../../Zotlabs/Module/Group.php:93 ../../Zotlabs/Module/Group.php:187
+#: ../../Zotlabs/Module/Group.php:95 ../../Zotlabs/Module/Group.php:189
msgid "Members are visible to other channels"
msgstr ""
-#: ../../Zotlabs/Module/Group.php:111
+#: ../../Zotlabs/Module/Group.php:113
msgid "Privacy group removed."
msgstr ""
-#: ../../Zotlabs/Module/Group.php:113
+#: ../../Zotlabs/Module/Group.php:115
msgid "Unable to remove privacy group."
msgstr ""
-#: ../../Zotlabs/Module/Group.php:183
+#: ../../Zotlabs/Module/Group.php:185
msgid "Privacy group editor"
msgstr ""
-#: ../../Zotlabs/Module/Group.php:197 ../../Zotlabs/Module/Help.php:81
+#: ../../Zotlabs/Module/Group.php:199 ../../Zotlabs/Module/Help.php:81
msgid "Members"
msgstr ""
-#: ../../Zotlabs/Module/Group.php:199
+#: ../../Zotlabs/Module/Group.php:201
msgid "All Connected Channels"
msgstr ""
-#: ../../Zotlabs/Module/Group.php:231
+#: ../../Zotlabs/Module/Group.php:233
msgid "Click on a channel to add or remove."
msgstr ""
@@ -5638,7 +5782,7 @@ msgid "View this profile"
msgstr ""
#: ../../Zotlabs/Module/Profiles.php:728 ../../Zotlabs/Module/Profiles.php:827
-#: ../../include/channel.php:1066
+#: ../../include/channel.php:1081
msgid "Edit visibility"
msgstr ""
@@ -5650,7 +5794,7 @@ msgstr ""
msgid "Change cover photo"
msgstr ""
-#: ../../Zotlabs/Module/Profiles.php:731 ../../include/channel.php:1037
+#: ../../Zotlabs/Module/Profiles.php:731 ../../include/channel.php:1052
msgid "Change profile photo"
msgstr ""
@@ -5670,7 +5814,7 @@ msgstr ""
msgid "Add profile things"
msgstr ""
-#: ../../Zotlabs/Module/Profiles.php:736 ../../include/conversation.php:1657
+#: ../../Zotlabs/Module/Profiles.php:736 ../../include/conversation.php:1654
msgid "Personal"
msgstr ""
@@ -5815,12 +5959,12 @@ msgstr ""
msgid "Communications"
msgstr ""
-#: ../../Zotlabs/Module/Profiles.php:823 ../../include/channel.php:1062
+#: ../../Zotlabs/Module/Profiles.php:823 ../../include/channel.php:1077
msgid "Profile Image"
msgstr ""
-#: ../../Zotlabs/Module/Profiles.php:833 ../../include/channel.php:1044
-#: ../../include/nav.php:109
+#: ../../Zotlabs/Module/Profiles.php:833 ../../include/channel.php:1059
+#: ../../include/nav.php:105
msgid "Edit Profiles"
msgstr ""
@@ -5832,42 +5976,42 @@ msgstr ""
msgid "Edit Webpage"
msgstr ""
-#: ../../Zotlabs/Module/Manage.php:143
+#: ../../Zotlabs/Module/Manage.php:145
msgid "Create a new channel"
msgstr ""
-#: ../../Zotlabs/Module/Manage.php:168 ../../Zotlabs/Lib/Apps.php:221
-#: ../../include/nav.php:205
+#: ../../Zotlabs/Module/Manage.php:170 ../../Zotlabs/Lib/Apps.php:222
+#: ../../include/nav.php:199
msgid "Channel Manager"
msgstr ""
-#: ../../Zotlabs/Module/Manage.php:169
+#: ../../Zotlabs/Module/Manage.php:171
msgid "Current Channel"
msgstr ""
-#: ../../Zotlabs/Module/Manage.php:171
+#: ../../Zotlabs/Module/Manage.php:173
msgid "Switch to one of your channels by selecting it."
msgstr ""
-#: ../../Zotlabs/Module/Manage.php:172
+#: ../../Zotlabs/Module/Manage.php:174
msgid "Default Channel"
msgstr ""
-#: ../../Zotlabs/Module/Manage.php:173
+#: ../../Zotlabs/Module/Manage.php:175
msgid "Make Default"
msgstr ""
-#: ../../Zotlabs/Module/Manage.php:176
+#: ../../Zotlabs/Module/Manage.php:178
#, php-format
msgid "%d new messages"
msgstr ""
-#: ../../Zotlabs/Module/Manage.php:177
+#: ../../Zotlabs/Module/Manage.php:179
#, php-format
msgid "%d new introductions"
msgstr ""
-#: ../../Zotlabs/Module/Manage.php:179
+#: ../../Zotlabs/Module/Manage.php:181
msgid "Delegated Channel"
msgstr ""
@@ -5875,45 +6019,45 @@ msgstr ""
msgid "This directory server requires an access token"
msgstr ""
-#: ../../Zotlabs/Module/Siteinfo.php:20
+#: ../../Zotlabs/Module/Siteinfo.php:19
msgid "About this site"
msgstr ""
-#: ../../Zotlabs/Module/Siteinfo.php:21
+#: ../../Zotlabs/Module/Siteinfo.php:20
msgid "Site Name"
msgstr ""
-#: ../../Zotlabs/Module/Siteinfo.php:25 ../../include/network.php:2025
+#: ../../Zotlabs/Module/Siteinfo.php:24
msgid "Administrator"
msgstr ""
-#: ../../Zotlabs/Module/Siteinfo.php:27 ../../Zotlabs/Module/Register.php:221
+#: ../../Zotlabs/Module/Siteinfo.php:26 ../../Zotlabs/Module/Register.php:221
msgid "Terms of Service"
msgstr ""
-#: ../../Zotlabs/Module/Siteinfo.php:28
+#: ../../Zotlabs/Module/Siteinfo.php:27
msgid "Software and Project information"
msgstr ""
-#: ../../Zotlabs/Module/Siteinfo.php:29
+#: ../../Zotlabs/Module/Siteinfo.php:28
msgid "This site is powered by $Projectname"
msgstr ""
-#: ../../Zotlabs/Module/Siteinfo.php:30
+#: ../../Zotlabs/Module/Siteinfo.php:29
msgid ""
"Federated and decentralised networking and identity services provided by Zot"
msgstr ""
-#: ../../Zotlabs/Module/Siteinfo.php:32
+#: ../../Zotlabs/Module/Siteinfo.php:31
#, php-format
msgid "Version %s"
msgstr ""
-#: ../../Zotlabs/Module/Siteinfo.php:33
+#: ../../Zotlabs/Module/Siteinfo.php:32
msgid "Project homepage"
msgstr ""
-#: ../../Zotlabs/Module/Siteinfo.php:34
+#: ../../Zotlabs/Module/Siteinfo.php:33
msgid "Developer homepage"
msgstr ""
@@ -5922,7 +6066,7 @@ msgid "No ratings"
msgstr ""
#: ../../Zotlabs/Module/Ratings.php:97 ../../Zotlabs/Module/Pubsites.php:35
-#: ../../include/conversation.php:1032
+#: ../../include/conversation.php:1029
msgid "Ratings"
msgstr ""
@@ -5938,64 +6082,65 @@ msgstr ""
msgid "Description: "
msgstr ""
-#: ../../Zotlabs/Module/Webpages.php:52
+#: ../../Zotlabs/Module/Webpages.php:38 ../../Zotlabs/Module/Webpages.php:237
+#: ../../Zotlabs/Lib/Apps.php:226 ../../include/conversation.php:1838
+#: ../../include/nav.php:429
+msgid "Webpages"
+msgstr ""
+
+#: ../../Zotlabs/Module/Webpages.php:54
msgid "Import Webpage Elements"
msgstr ""
-#: ../../Zotlabs/Module/Webpages.php:53
+#: ../../Zotlabs/Module/Webpages.php:55
msgid "Import selected"
msgstr ""
-#: ../../Zotlabs/Module/Webpages.php:76
+#: ../../Zotlabs/Module/Webpages.php:78
msgid "Export Webpage Elements"
msgstr ""
-#: ../../Zotlabs/Module/Webpages.php:77
+#: ../../Zotlabs/Module/Webpages.php:79
msgid "Export selected"
msgstr ""
-#: ../../Zotlabs/Module/Webpages.php:242 ../../Zotlabs/Lib/Apps.php:225
-#: ../../include/conversation.php:1841 ../../include/nav.php:449
-msgid "Webpages"
-msgstr ""
-
-#: ../../Zotlabs/Module/Webpages.php:253 ../../include/page_widgets.php:44
+#: ../../Zotlabs/Module/Webpages.php:248
msgid "Actions"
msgstr ""
-#: ../../Zotlabs/Module/Webpages.php:254 ../../include/page_widgets.php:45
+#: ../../Zotlabs/Module/Webpages.php:249
msgid "Page Link"
msgstr ""
-#: ../../Zotlabs/Module/Webpages.php:255
+#: ../../Zotlabs/Module/Webpages.php:250
msgid "Page Title"
msgstr ""
-#: ../../Zotlabs/Module/Webpages.php:285
+#: ../../Zotlabs/Module/Webpages.php:280
msgid "Invalid file type."
msgstr ""
-#: ../../Zotlabs/Module/Webpages.php:297
+#: ../../Zotlabs/Module/Webpages.php:292
msgid "Error opening zip file"
msgstr ""
-#: ../../Zotlabs/Module/Webpages.php:308
+#: ../../Zotlabs/Module/Webpages.php:303
msgid "Invalid folder path."
msgstr ""
-#: ../../Zotlabs/Module/Webpages.php:335
+#: ../../Zotlabs/Module/Webpages.php:330
msgid "No webpage elements detected."
msgstr ""
-#: ../../Zotlabs/Module/Webpages.php:410
+#: ../../Zotlabs/Module/Webpages.php:405
msgid "Import complete."
msgstr ""
-#: ../../Zotlabs/Module/Editpost.php:38
+#: ../../Zotlabs/Module/Editpost.php:38 ../../Zotlabs/Module/Editpost.php:43
msgid "Item is not editable"
msgstr ""
-#: ../../Zotlabs/Module/Editpost.php:103 ../../Zotlabs/Module/Rpost.php:138
+#: ../../Zotlabs/Module/Editpost.php:108 ../../Zotlabs/Module/Rpost.php:140
msgid "Edit post"
msgstr ""
@@ -6081,7 +6226,7 @@ msgid "*"
msgstr ""
#: ../../Zotlabs/Module/Sources.php:96
-#: ../../Zotlabs/Widget/Settings_menu.php:123 ../../include/features.php:213
+#: ../../Zotlabs/Widget/Settings_menu.php:125 ../../include/features.php:209
msgid "Channel Sources"
msgstr ""
@@ -6137,6 +6282,10 @@ msgstr ""
msgid "Unable to remove source."
msgstr ""
+#: ../../Zotlabs/Module/Rpost.php:63 ../../Zotlabs/Lib/Apps.php:245
+msgid "Post"
+msgstr ""
+
#: ../../Zotlabs/Module/Like.php:19
msgid "Like/Dislike"
msgstr ""
@@ -6172,55 +6321,59 @@ msgstr ""
msgid "Previous action reversed."
msgstr ""
-#: ../../Zotlabs/Module/Like.php:419 ../../addon/diaspora/inbound.php:1812
+#: ../../Zotlabs/Module/Like.php:423 ../../addon/diaspora/Receiver.php:1399
#: ../../include/conversation.php:160
#, php-format
msgid "%1$s likes %2$s's %3$s"
msgstr ""
-#: ../../Zotlabs/Module/Like.php:421 ../../include/conversation.php:163
+#: ../../Zotlabs/Module/Like.php:425 ../../include/conversation.php:163
#, php-format
msgid "%1$s doesn't like %2$s's %3$s"
msgstr ""
-#: ../../Zotlabs/Module/Like.php:423
+#: ../../Zotlabs/Module/Like.php:427
#, php-format
msgid "%1$s agrees with %2$s's %3$s"
msgstr ""
-#: ../../Zotlabs/Module/Like.php:425
+#: ../../Zotlabs/Module/Like.php:429
#, php-format
msgid "%1$s doesn't agree with %2$s's %3$s"
msgstr ""
-#: ../../Zotlabs/Module/Like.php:427
+#: ../../Zotlabs/Module/Like.php:431
#, php-format
msgid "%1$s abstains from a decision on %2$s's %3$s"
msgstr ""
-#: ../../Zotlabs/Module/Like.php:429
+#: ../../Zotlabs/Module/Like.php:433
#, php-format
msgid "%1$s is attending %2$s's %3$s"
msgstr ""
-#: ../../Zotlabs/Module/Like.php:431
+#: ../../Zotlabs/Module/Like.php:435
#, php-format
msgid "%1$s is not attending %2$s's %3$s"
msgstr ""
-#: ../../Zotlabs/Module/Like.php:433
+#: ../../Zotlabs/Module/Like.php:437
#, php-format
msgid "%1$s may attend %2$s's %3$s"
msgstr ""
-#: ../../Zotlabs/Module/Like.php:538
+#: ../../Zotlabs/Module/Like.php:547
msgid "Action completed."
msgstr ""
-#: ../../Zotlabs/Module/Like.php:539
+#: ../../Zotlabs/Module/Like.php:548
msgid "Thank you."
msgstr ""
+#: ../../Zotlabs/Module/Directory.php:80 ../../Zotlabs/Lib/Apps.php:232
+msgid "Directory"
+msgstr ""
+
#: ../../Zotlabs/Module/Directory.php:245
#, php-format
msgid "%d rating"
@@ -6240,13 +6393,12 @@ msgstr ""
msgid "Homepage: "
msgstr ""
-#: ../../Zotlabs/Module/Directory.php:309 ../../include/channel.php:1293
+#: ../../Zotlabs/Module/Directory.php:309 ../../include/channel.php:1314
msgid "Age:"
msgstr ""
-#: ../../Zotlabs/Module/Directory.php:314 ../../include/markdown.php:560
-#: ../../include/channel.php:1134 ../../include/event.php:52
-#: ../../include/event.php:84
+#: ../../Zotlabs/Module/Directory.php:314 ../../include/channel.php:1149
+#: ../../include/event.php:52 ../../include/event.php:84
msgid "Location:"
msgstr ""
@@ -6254,18 +6406,18 @@ msgstr ""
msgid "Description:"
msgstr ""
-#: ../../Zotlabs/Module/Directory.php:325 ../../include/channel.php:1309
+#: ../../Zotlabs/Module/Directory.php:325 ../../include/channel.php:1330
msgid "Hometown:"
msgstr ""
-#: ../../Zotlabs/Module/Directory.php:327 ../../include/channel.php:1317
+#: ../../Zotlabs/Module/Directory.php:327 ../../include/channel.php:1338
msgid "About:"
msgstr ""
-#: ../../Zotlabs/Module/Directory.php:328 ../../Zotlabs/Module/Suggest.php:54
+#: ../../Zotlabs/Module/Directory.php:328 ../../Zotlabs/Module/Suggest.php:56
#: ../../Zotlabs/Widget/Follow.php:32 ../../Zotlabs/Widget/Suggestions.php:44
-#: ../../include/conversation.php:1002 ../../include/channel.php:1119
-#: ../../include/connections.php:110
+#: ../../include/conversation.php:999 ../../include/channel.php:1134
+#: ../../include/connections.php:111
msgid "Connect"
msgstr ""
@@ -6297,7 +6449,7 @@ msgstr ""
msgid "Finding:"
msgstr ""
-#: ../../Zotlabs/Module/Directory.php:395 ../../Zotlabs/Module/Suggest.php:62
+#: ../../Zotlabs/Module/Directory.php:395 ../../Zotlabs/Module/Suggest.php:64
#: ../../include/contact_widgets.php:24
msgid "Channel Suggestions"
msgstr ""
@@ -6342,13 +6494,18 @@ msgstr ""
msgid "Lookup xchan beginning with (or webbie): "
msgstr ""
-#: ../../Zotlabs/Module/Suggest.php:37
+#: ../../Zotlabs/Module/Suggest.php:32 ../../Zotlabs/Lib/Apps.php:220
+#: ../../include/features.php:333
+msgid "Suggest Channels"
+msgstr ""
+
+#: ../../Zotlabs/Module/Suggest.php:39
msgid ""
"No suggestions available. If this is a new site, please try again in 24 "
"hours."
msgstr ""
-#: ../../Zotlabs/Module/Suggest.php:56 ../../Zotlabs/Widget/Suggestions.php:46
+#: ../../Zotlabs/Module/Suggest.php:58 ../../Zotlabs/Widget/Suggestions.php:46
msgid "Ignore/Hide"
msgstr ""
@@ -6360,103 +6517,108 @@ msgstr ""
msgid "Post successful."
msgstr ""
-#: ../../Zotlabs/Module/Mail.php:65
+#: ../../Zotlabs/Module/Mail.php:73
msgid "Unable to lookup recipient."
msgstr ""
-#: ../../Zotlabs/Module/Mail.php:72
+#: ../../Zotlabs/Module/Mail.php:80
msgid "Unable to communicate with requested channel."
msgstr ""
-#: ../../Zotlabs/Module/Mail.php:79
+#: ../../Zotlabs/Module/Mail.php:87
msgid "Cannot verify requested channel."
msgstr ""
-#: ../../Zotlabs/Module/Mail.php:97
+#: ../../Zotlabs/Module/Mail.php:105
msgid "Selected channel has private message restrictions. Send failed."
msgstr ""
-#: ../../Zotlabs/Module/Mail.php:178
+#: ../../Zotlabs/Module/Mail.php:143 ../../Zotlabs/Lib/Apps.php:234
+#: ../../include/nav.php:187
+msgid "Mail"
+msgstr ""
+
+#: ../../Zotlabs/Module/Mail.php:160
msgid "Messages"
msgstr ""
-#: ../../Zotlabs/Module/Mail.php:191
+#: ../../Zotlabs/Module/Mail.php:173
msgid "message"
msgstr ""
-#: ../../Zotlabs/Module/Mail.php:232
+#: ../../Zotlabs/Module/Mail.php:214
msgid "Message recalled."
msgstr ""
-#: ../../Zotlabs/Module/Mail.php:245
+#: ../../Zotlabs/Module/Mail.php:227
msgid "Conversation removed."
msgstr ""
-#: ../../Zotlabs/Module/Mail.php:260 ../../Zotlabs/Module/Mail.php:381
+#: ../../Zotlabs/Module/Mail.php:242 ../../Zotlabs/Module/Mail.php:363
msgid "Expires YYYY-MM-DD HH:MM"
msgstr ""
-#: ../../Zotlabs/Module/Mail.php:288
+#: ../../Zotlabs/Module/Mail.php:270
msgid "Requested channel is not in this network"
msgstr ""
-#: ../../Zotlabs/Module/Mail.php:296
+#: ../../Zotlabs/Module/Mail.php:278
msgid "Send Private Message"
msgstr ""
-#: ../../Zotlabs/Module/Mail.php:297 ../../Zotlabs/Module/Mail.php:439
+#: ../../Zotlabs/Module/Mail.php:279 ../../Zotlabs/Module/Mail.php:421
msgid "To:"
msgstr ""
-#: ../../Zotlabs/Module/Mail.php:300 ../../Zotlabs/Module/Mail.php:441
+#: ../../Zotlabs/Module/Mail.php:282 ../../Zotlabs/Module/Mail.php:423
msgid "Subject:"
msgstr ""
-#: ../../Zotlabs/Module/Mail.php:305 ../../Zotlabs/Module/Mail.php:447
-#: ../../include/conversation.php:1323
+#: ../../Zotlabs/Module/Mail.php:287 ../../Zotlabs/Module/Mail.php:429
+#: ../../include/conversation.php:1320
msgid "Attach file"
msgstr ""
-#: ../../Zotlabs/Module/Mail.php:307
+#: ../../Zotlabs/Module/Mail.php:289
msgid "Send"
msgstr ""
-#: ../../Zotlabs/Module/Mail.php:310 ../../Zotlabs/Module/Mail.php:452
-#: ../../include/conversation.php:1368
+#: ../../Zotlabs/Module/Mail.php:292 ../../Zotlabs/Module/Mail.php:434
+#: ../../include/conversation.php:1365
msgid "Set expiration date"
msgstr ""
-#: ../../Zotlabs/Module/Mail.php:411
+#: ../../Zotlabs/Module/Mail.php:393
msgid "Delete message"
msgstr ""
-#: ../../Zotlabs/Module/Mail.php:412
+#: ../../Zotlabs/Module/Mail.php:394
msgid "Delivery report"
msgstr ""
-#: ../../Zotlabs/Module/Mail.php:413
+#: ../../Zotlabs/Module/Mail.php:395
msgid "Recall message"
msgstr ""
-#: ../../Zotlabs/Module/Mail.php:415
+#: ../../Zotlabs/Module/Mail.php:397
msgid "Message has been recalled."
msgstr ""
-#: ../../Zotlabs/Module/Mail.php:432
+#: ../../Zotlabs/Module/Mail.php:414
msgid "Delete Conversation"
msgstr ""
-#: ../../Zotlabs/Module/Mail.php:434
+#: ../../Zotlabs/Module/Mail.php:416
msgid ""
"No secure communications available. You <strong>may</strong> be able to "
"respond from the sender's profile page."
msgstr ""
-#: ../../Zotlabs/Module/Mail.php:438
+#: ../../Zotlabs/Module/Mail.php:420
msgid "Send Reply"
msgstr ""
-#: ../../Zotlabs/Module/Mail.php:443
+#: ../../Zotlabs/Module/Mail.php:425
#, php-format
msgid "Your message for %s (%s):"
msgstr ""
@@ -6498,19 +6660,19 @@ msgstr ""
msgid "Rate"
msgstr ""
-#: ../../Zotlabs/Module/Impel.php:41 ../../include/bbcode.php:203
+#: ../../Zotlabs/Module/Impel.php:41 ../../include/bbcode.php:263
msgid "webpage"
msgstr ""
-#: ../../Zotlabs/Module/Impel.php:46 ../../include/bbcode.php:209
+#: ../../Zotlabs/Module/Impel.php:46 ../../include/bbcode.php:269
msgid "block"
msgstr ""
-#: ../../Zotlabs/Module/Impel.php:51 ../../include/bbcode.php:206
+#: ../../Zotlabs/Module/Impel.php:51 ../../include/bbcode.php:266
msgid "layout"
msgstr ""
-#: ../../Zotlabs/Module/Impel.php:58 ../../include/bbcode.php:212
+#: ../../Zotlabs/Module/Impel.php:58 ../../include/bbcode.php:272
msgid "menu"
msgstr ""
@@ -6552,7 +6714,11 @@ msgstr ""
msgid "Save to Folder"
msgstr ""
-#: ../../Zotlabs/Module/Probe.php:28 ../../Zotlabs/Module/Probe.php:32
+#: ../../Zotlabs/Module/Probe.php:11 ../../Zotlabs/Lib/Apps.php:219
+msgid "Remote Diagnostics"
+msgstr ""
+
+#: ../../Zotlabs/Module/Probe.php:30 ../../Zotlabs/Module/Probe.php:34
#, php-format
msgid "Fetching URL returns error: %1$s"
msgstr ""
@@ -6635,16 +6801,16 @@ msgstr ""
msgid "yes"
msgstr ""
-#: ../../Zotlabs/Module/Register.php:258
+#: ../../Zotlabs/Module/Register.php:256
msgid "Membership on this site is by invitation only."
msgstr ""
-#: ../../Zotlabs/Module/Register.php:270 ../../boot.php:1610
-#: ../../include/nav.php:149
+#: ../../Zotlabs/Module/Register.php:268 ../../boot.php:1579
+#: ../../include/nav.php:145
msgid "Register"
msgstr ""
-#: ../../Zotlabs/Module/Register.php:271
+#: ../../Zotlabs/Module/Register.php:269
msgid ""
"This site may require email verification after submitting this form. If you "
"are returned to a login page, please check your email for instructions."
@@ -6655,30 +6821,30 @@ msgstr ""
msgid "Cover Photos"
msgstr ""
-#: ../../Zotlabs/Module/Cover_photo.php:237 ../../include/items.php:4303
+#: ../../Zotlabs/Module/Cover_photo.php:237 ../../include/items.php:4273
msgid "female"
msgstr ""
-#: ../../Zotlabs/Module/Cover_photo.php:238 ../../include/items.php:4304
+#: ../../Zotlabs/Module/Cover_photo.php:238 ../../include/items.php:4274
#, php-format
msgid "%1$s updated her %2$s"
msgstr ""
-#: ../../Zotlabs/Module/Cover_photo.php:239 ../../include/items.php:4305
+#: ../../Zotlabs/Module/Cover_photo.php:239 ../../include/items.php:4275
msgid "male"
msgstr ""
-#: ../../Zotlabs/Module/Cover_photo.php:240 ../../include/items.php:4306
+#: ../../Zotlabs/Module/Cover_photo.php:240 ../../include/items.php:4276
#, php-format
msgid "%1$s updated his %2$s"
msgstr ""
-#: ../../Zotlabs/Module/Cover_photo.php:242 ../../include/items.php:4308
+#: ../../Zotlabs/Module/Cover_photo.php:242 ../../include/items.php:4278
#, php-format
msgid "%1$s updated their %2$s"
msgstr ""
-#: ../../Zotlabs/Module/Cover_photo.php:244 ../../include/channel.php:1759
+#: ../../Zotlabs/Module/Cover_photo.php:244 ../../include/channel.php:1776
msgid "cover photo"
msgstr ""
@@ -6690,8 +6856,8 @@ msgstr ""
msgid "Documentation Search"
msgstr ""
-#: ../../Zotlabs/Module/Help.php:80 ../../include/conversation.php:1773
-#: ../../include/nav.php:382
+#: ../../Zotlabs/Module/Help.php:80 ../../include/conversation.php:1770
+#: ../../include/nav.php:362
msgid "About"
msgstr ""
@@ -6743,6 +6909,10 @@ msgstr ""
msgid "Search Results For:"
msgstr ""
+#: ../../Zotlabs/Module/Network.php:157 ../../Zotlabs/Lib/Apps.php:223
+msgid "Activity"
+msgstr ""
+
#: ../../Zotlabs/Module/Network.php:221
msgid "Privacy group is empty"
msgstr ""
@@ -6777,47 +6947,47 @@ msgstr ""
msgid "Welcome to %s"
msgstr ""
-#: ../../Zotlabs/Module/Filestorage.php:87
+#: ../../Zotlabs/Module/Filestorage.php:79
msgid "Permission Denied."
msgstr ""
-#: ../../Zotlabs/Module/Filestorage.php:103
+#: ../../Zotlabs/Module/Filestorage.php:95
msgid "File not found."
msgstr ""
-#: ../../Zotlabs/Module/Filestorage.php:146
+#: ../../Zotlabs/Module/Filestorage.php:138
msgid "Edit file permissions"
msgstr ""
-#: ../../Zotlabs/Module/Filestorage.php:159
+#: ../../Zotlabs/Module/Filestorage.php:151
msgid "Set/edit permissions"
msgstr ""
-#: ../../Zotlabs/Module/Filestorage.php:160
+#: ../../Zotlabs/Module/Filestorage.php:152
msgid "Include all files and sub folders"
msgstr ""
-#: ../../Zotlabs/Module/Filestorage.php:161
+#: ../../Zotlabs/Module/Filestorage.php:153
msgid "Return to file list"
msgstr ""
-#: ../../Zotlabs/Module/Filestorage.php:163
+#: ../../Zotlabs/Module/Filestorage.php:155
msgid "Copy/paste this code to attach file to a post"
msgstr ""
-#: ../../Zotlabs/Module/Filestorage.php:164
+#: ../../Zotlabs/Module/Filestorage.php:156
msgid "Copy/paste this URL to link file from a web page"
msgstr ""
-#: ../../Zotlabs/Module/Filestorage.php:166
+#: ../../Zotlabs/Module/Filestorage.php:158
msgid "Share this file"
msgstr ""
-#: ../../Zotlabs/Module/Filestorage.php:167
+#: ../../Zotlabs/Module/Filestorage.php:159
msgid "Show URL to this file"
msgstr ""
-#: ../../Zotlabs/Module/Filestorage.php:168
+#: ../../Zotlabs/Module/Filestorage.php:160
msgid "Notify your contacts about this file"
msgstr ""
@@ -6846,71 +7016,59 @@ msgstr ""
msgid "View Connections"
msgstr ""
-#: ../../Zotlabs/Module/Admin.php:94
-msgid "# Accounts"
-msgstr ""
-
-#: ../../Zotlabs/Module/Admin.php:95
-msgid "# blocked accounts"
-msgstr ""
-
-#: ../../Zotlabs/Module/Admin.php:96
-msgid "# expired accounts"
-msgstr ""
-
#: ../../Zotlabs/Module/Admin.php:97
-msgid "# expiring accounts"
+msgid "Blocked accounts"
msgstr ""
-#: ../../Zotlabs/Module/Admin.php:108
-msgid "# Channels"
+#: ../../Zotlabs/Module/Admin.php:98
+msgid "Expired accounts"
msgstr ""
-#: ../../Zotlabs/Module/Admin.php:109
-msgid "# primary"
+#: ../../Zotlabs/Module/Admin.php:99
+msgid "Expiring accounts"
msgstr ""
-#: ../../Zotlabs/Module/Admin.php:110
-msgid "# clones"
+#: ../../Zotlabs/Module/Admin.php:112
+msgid "Clones"
msgstr ""
-#: ../../Zotlabs/Module/Admin.php:116
+#: ../../Zotlabs/Module/Admin.php:118
msgid "Message queues"
msgstr ""
-#: ../../Zotlabs/Module/Admin.php:133
+#: ../../Zotlabs/Module/Admin.php:132
msgid "Your software should be updated"
msgstr ""
-#: ../../Zotlabs/Module/Admin.php:138
+#: ../../Zotlabs/Module/Admin.php:137
msgid "Summary"
msgstr ""
-#: ../../Zotlabs/Module/Admin.php:141
+#: ../../Zotlabs/Module/Admin.php:140
msgid "Registered accounts"
msgstr ""
-#: ../../Zotlabs/Module/Admin.php:142
+#: ../../Zotlabs/Module/Admin.php:141
msgid "Pending registrations"
msgstr ""
-#: ../../Zotlabs/Module/Admin.php:143
+#: ../../Zotlabs/Module/Admin.php:142
msgid "Registered channels"
msgstr ""
-#: ../../Zotlabs/Module/Admin.php:144
+#: ../../Zotlabs/Module/Admin.php:143
msgid "Active plugins"
msgstr ""
-#: ../../Zotlabs/Module/Admin.php:145
+#: ../../Zotlabs/Module/Admin.php:144
msgid "Version"
msgstr ""
-#: ../../Zotlabs/Module/Admin.php:146
+#: ../../Zotlabs/Module/Admin.php:145
msgid "Repository version (master)"
msgstr ""
-#: ../../Zotlabs/Module/Admin.php:147
+#: ../../Zotlabs/Module/Admin.php:146
msgid "Repository version (dev)"
msgstr ""
@@ -6959,7 +7117,7 @@ msgid ""
"Password reset failed."
msgstr ""
-#: ../../Zotlabs/Module/Lostpass.php:91 ../../boot.php:1637
+#: ../../Zotlabs/Module/Lostpass.php:91 ../../boot.php:1606
msgid "Password Reset"
msgstr ""
@@ -7008,120 +7166,90 @@ msgstr ""
msgid "Reset"
msgstr ""
-#: ../../Zotlabs/Module/Notifications.php:43 ../../include/nav.php:190
-msgid "Mark all system notifications seen"
-msgstr ""
-
-#: ../../Zotlabs/Lib/Apps.php:212
-msgid "Site Admin"
-msgstr ""
-
-#: ../../Zotlabs/Lib/Apps.php:213 ../../addon/buglink/buglink.php:16
-msgid "Report Bug"
-msgstr ""
-
-#: ../../Zotlabs/Lib/Apps.php:214
-msgid "View Bookmarks"
-msgstr ""
-
-#: ../../Zotlabs/Lib/Apps.php:215
-msgid "My Chatrooms"
+#: ../../Zotlabs/Module/Notifications.php:43
+#: ../../Zotlabs/Lib/ThreadItem.php:392
+msgid "Mark all seen"
msgstr ""
-#: ../../Zotlabs/Lib/Apps.php:217
-msgid "Firefox Share"
+#: ../../Zotlabs/Lib/Techlevels.php:10
+msgid "0. Beginner/Basic"
msgstr ""
-#: ../../Zotlabs/Lib/Apps.php:218
-msgid "Remote Diagnostics"
+#: ../../Zotlabs/Lib/Techlevels.php:11
+msgid "1. Novice - not skilled but willing to learn"
msgstr ""
-#: ../../Zotlabs/Lib/Apps.php:219 ../../include/features.php:337
-msgid "Suggest Channels"
+#: ../../Zotlabs/Lib/Techlevels.php:12
+msgid "2. Intermediate - somewhat comfortable"
msgstr ""
-#: ../../Zotlabs/Lib/Apps.php:220 ../../boot.php:1629 ../../include/nav.php:117
-msgid "Login"
+#: ../../Zotlabs/Lib/Techlevels.php:13
+msgid "3. Advanced - very comfortable"
msgstr ""
-#: ../../Zotlabs/Lib/Apps.php:222
-msgid "Activity"
+#: ../../Zotlabs/Lib/Techlevels.php:14
+msgid "4. Expert - I can write computer code"
msgstr ""
-#: ../../Zotlabs/Lib/Apps.php:226 ../../include/conversation.php:1857
-#: ../../include/features.php:99 ../../include/nav.php:465
-msgid "Wiki"
+#: ../../Zotlabs/Lib/Techlevels.php:15
+msgid "5. Wizard - I probably know more than you do"
msgstr ""
-#: ../../Zotlabs/Lib/Apps.php:227 ../../include/nav.php:180
-msgid "Channel Home"
+#: ../../Zotlabs/Lib/Apps.php:213
+msgid "Site Admin"
msgstr ""
-#: ../../Zotlabs/Lib/Apps.php:230 ../../include/conversation.php:1802
-#: ../../include/conversation.php:1805 ../../include/nav.php:200
-#: ../../include/nav.php:411 ../../include/nav.php:414
-msgid "Events"
+#: ../../Zotlabs/Lib/Apps.php:214 ../../addon/buglink/buglink.php:16
+msgid "Report Bug"
msgstr ""
-#: ../../Zotlabs/Lib/Apps.php:231
-msgid "Directory"
+#: ../../Zotlabs/Lib/Apps.php:218
+msgid "Firefox Share"
msgstr ""
-#: ../../Zotlabs/Lib/Apps.php:233 ../../include/nav.php:192
-msgid "Mail"
+#: ../../Zotlabs/Lib/Apps.php:221 ../../boot.php:1598 ../../include/nav.php:113
+msgid "Login"
msgstr ""
-#: ../../Zotlabs/Lib/Apps.php:236
+#: ../../Zotlabs/Lib/Apps.php:237
msgid "Chat"
msgstr ""
-#: ../../Zotlabs/Lib/Apps.php:238
-msgid "Probe"
-msgstr ""
-
#: ../../Zotlabs/Lib/Apps.php:239
-msgid "Suggest"
+msgid "Probe"
msgstr ""
#: ../../Zotlabs/Lib/Apps.php:240
-msgid "Random Channel"
+msgid "Suggest"
msgstr ""
#: ../../Zotlabs/Lib/Apps.php:241
-msgid "Invite"
+msgid "Random Channel"
msgstr ""
-#: ../../Zotlabs/Lib/Apps.php:242 ../../Zotlabs/Widget/Admin.php:26
+#: ../../Zotlabs/Lib/Apps.php:243 ../../Zotlabs/Widget/Admin.php:26
msgid "Features"
msgstr ""
-#: ../../Zotlabs/Lib/Apps.php:243 ../../addon/openid/MysqlProvider.php:69
-msgid "Language"
-msgstr ""
-
-#: ../../Zotlabs/Lib/Apps.php:244
-msgid "Post"
-msgstr ""
-
-#: ../../Zotlabs/Lib/Apps.php:245 ../../addon/openid/MysqlProvider.php:58
+#: ../../Zotlabs/Lib/Apps.php:246 ../../addon/openid/MysqlProvider.php:58
#: ../../addon/openid/MysqlProvider.php:59
#: ../../addon/openid/MysqlProvider.php:60
msgid "Profile Photo"
msgstr ""
-#: ../../Zotlabs/Lib/Apps.php:365
+#: ../../Zotlabs/Lib/Apps.php:366
msgid "Purchase"
msgstr ""
-#: ../../Zotlabs/Lib/Apps.php:369
+#: ../../Zotlabs/Lib/Apps.php:370
msgid "Undelete"
msgstr ""
-#: ../../Zotlabs/Lib/Apps.php:374
+#: ../../Zotlabs/Lib/Apps.php:376
msgid "Add to app-tray"
msgstr ""
-#: ../../Zotlabs/Lib/Apps.php:375
+#: ../../Zotlabs/Lib/Apps.php:377
msgid "Remove from app-tray"
msgstr ""
@@ -7209,8 +7337,8 @@ msgid "Message"
msgstr ""
#: ../../Zotlabs/Lib/NativeWikiPage.php:578
-#: ../../addon/gitwiki/gitwiki_backend.php:579 ../../include/bbcode.php:610
-#: ../../include/bbcode.php:756
+#: ../../addon/gitwiki/gitwiki_backend.php:579 ../../include/bbcode.php:667
+#: ../../include/bbcode.php:813
msgid "Different viewers will see this text differently"
msgstr ""
@@ -7297,21 +7425,20 @@ msgstr ""
msgid "Room is full"
msgstr ""
-#: ../../Zotlabs/Lib/Enotify.php:60 ../../include/network.php:1977
+#: ../../Zotlabs/Lib/Enotify.php:60
msgid "$Projectname Notification"
msgstr ""
-#: ../../Zotlabs/Lib/Enotify.php:61 ../../addon/diaspora/util.php:218
-#: ../../addon/diaspora/util.php:231 ../../addon/diaspora/p.php:46
-#: ../../include/network.php:1978
+#: ../../Zotlabs/Lib/Enotify.php:61 ../../addon/diaspora/util.php:283
+#: ../../addon/diaspora/util.php:296 ../../addon/diaspora/p.php:46
msgid "$projectname"
msgstr ""
-#: ../../Zotlabs/Lib/Enotify.php:63 ../../include/network.php:1980
+#: ../../Zotlabs/Lib/Enotify.php:63
msgid "Thank You,"
msgstr ""
-#: ../../Zotlabs/Lib/Enotify.php:65 ../../include/network.php:1982
+#: ../../Zotlabs/Lib/Enotify.php:65
#, php-format
msgid "%s Administrator"
msgstr ""
@@ -7345,175 +7472,185 @@ msgstr ""
msgid "Please visit %s to view and/or reply to your private messages."
msgstr ""
-#: ../../Zotlabs/Lib/Enotify.php:183
+#: ../../Zotlabs/Lib/Enotify.php:184
#, php-format
msgid "%1$s, %2$s commented on [zrl=%3$s]a %4$s[/zrl]"
msgstr ""
-#: ../../Zotlabs/Lib/Enotify.php:191
+#: ../../Zotlabs/Lib/Enotify.php:192
#, php-format
msgid "%1$s, %2$s commented on [zrl=%3$s]%4$s's %5$s[/zrl]"
msgstr ""
-#: ../../Zotlabs/Lib/Enotify.php:200
+#: ../../Zotlabs/Lib/Enotify.php:201
#, php-format
msgid "%1$s, %2$s commented on [zrl=%3$s]your %4$s[/zrl]"
msgstr ""
-#: ../../Zotlabs/Lib/Enotify.php:211
+#: ../../Zotlabs/Lib/Enotify.php:213
+#, php-format
+msgid "[$Projectname:Notify] Moderated Comment to conversation #%1$d by %2$s"
+msgstr ""
+
+#: ../../Zotlabs/Lib/Enotify.php:215
#, php-format
msgid "[$Projectname:Notify] Comment to conversation #%1$d by %2$s"
msgstr ""
-#: ../../Zotlabs/Lib/Enotify.php:212
+#: ../../Zotlabs/Lib/Enotify.php:216
#, php-format
msgid "%1$s, %2$s commented on an item/conversation you have been following."
msgstr ""
-#: ../../Zotlabs/Lib/Enotify.php:215 ../../Zotlabs/Lib/Enotify.php:292
-#: ../../Zotlabs/Lib/Enotify.php:309 ../../Zotlabs/Lib/Enotify.php:335
-#: ../../Zotlabs/Lib/Enotify.php:353 ../../Zotlabs/Lib/Enotify.php:367
+#: ../../Zotlabs/Lib/Enotify.php:219 ../../Zotlabs/Lib/Enotify.php:301
+#: ../../Zotlabs/Lib/Enotify.php:318 ../../Zotlabs/Lib/Enotify.php:344
+#: ../../Zotlabs/Lib/Enotify.php:362 ../../Zotlabs/Lib/Enotify.php:376
#, php-format
msgid "Please visit %s to view and/or reply to the conversation."
msgstr ""
-#: ../../Zotlabs/Lib/Enotify.php:273
+#: ../../Zotlabs/Lib/Enotify.php:223 ../../Zotlabs/Lib/Enotify.php:224
+#, php-format
+msgid "Please visit %s to approve or reject this comment."
+msgstr ""
+
+#: ../../Zotlabs/Lib/Enotify.php:282
#, php-format
msgid "%1$s, %2$s liked [zrl=%3$s]your %4$s[/zrl]"
msgstr ""
-#: ../../Zotlabs/Lib/Enotify.php:288
+#: ../../Zotlabs/Lib/Enotify.php:297
#, php-format
msgid "[$Projectname:Notify] Like received to conversation #%1$d by %2$s"
msgstr ""
-#: ../../Zotlabs/Lib/Enotify.php:289
+#: ../../Zotlabs/Lib/Enotify.php:298
#, php-format
msgid "%1$s, %2$s liked an item/conversation you created."
msgstr ""
-#: ../../Zotlabs/Lib/Enotify.php:300
+#: ../../Zotlabs/Lib/Enotify.php:309
#, php-format
msgid "[$Projectname:Notify] %s posted to your profile wall"
msgstr ""
-#: ../../Zotlabs/Lib/Enotify.php:302
+#: ../../Zotlabs/Lib/Enotify.php:311
#, php-format
msgid "%1$s, %2$s posted to your profile wall at %3$s"
msgstr ""
-#: ../../Zotlabs/Lib/Enotify.php:304
+#: ../../Zotlabs/Lib/Enotify.php:313
#, php-format
msgid "%1$s, %2$s posted to [zrl=%3$s]your wall[/zrl]"
msgstr ""
-#: ../../Zotlabs/Lib/Enotify.php:328
+#: ../../Zotlabs/Lib/Enotify.php:337
#, php-format
msgid "[$Projectname:Notify] %s tagged you"
msgstr ""
-#: ../../Zotlabs/Lib/Enotify.php:329
+#: ../../Zotlabs/Lib/Enotify.php:338
#, php-format
msgid "%1$s, %2$s tagged you at %3$s"
msgstr ""
-#: ../../Zotlabs/Lib/Enotify.php:330
+#: ../../Zotlabs/Lib/Enotify.php:339
#, php-format
msgid "%1$s, %2$s [zrl=%3$s]tagged you[/zrl]."
msgstr ""
-#: ../../Zotlabs/Lib/Enotify.php:342
+#: ../../Zotlabs/Lib/Enotify.php:351
#, php-format
msgid "[$Projectname:Notify] %1$s poked you"
msgstr ""
-#: ../../Zotlabs/Lib/Enotify.php:343
+#: ../../Zotlabs/Lib/Enotify.php:352
#, php-format
msgid "%1$s, %2$s poked you at %3$s"
msgstr ""
-#: ../../Zotlabs/Lib/Enotify.php:344
+#: ../../Zotlabs/Lib/Enotify.php:353
#, php-format
msgid "%1$s, %2$s [zrl=%2$s]poked you[/zrl]."
msgstr ""
-#: ../../Zotlabs/Lib/Enotify.php:360
+#: ../../Zotlabs/Lib/Enotify.php:369
#, php-format
msgid "[$Projectname:Notify] %s tagged your post"
msgstr ""
-#: ../../Zotlabs/Lib/Enotify.php:361
+#: ../../Zotlabs/Lib/Enotify.php:370
#, php-format
msgid "%1$s, %2$s tagged your post at %3$s"
msgstr ""
-#: ../../Zotlabs/Lib/Enotify.php:362
+#: ../../Zotlabs/Lib/Enotify.php:371
#, php-format
msgid "%1$s, %2$s tagged [zrl=%3$s]your post[/zrl]"
msgstr ""
-#: ../../Zotlabs/Lib/Enotify.php:374
+#: ../../Zotlabs/Lib/Enotify.php:383
msgid "[$Projectname:Notify] Introduction received"
msgstr ""
-#: ../../Zotlabs/Lib/Enotify.php:375
+#: ../../Zotlabs/Lib/Enotify.php:384
#, php-format
msgid "%1$s, you've received an new connection request from '%2$s' at %3$s"
msgstr ""
-#: ../../Zotlabs/Lib/Enotify.php:376
+#: ../../Zotlabs/Lib/Enotify.php:385
#, php-format
msgid ""
"%1$s, you've received [zrl=%2$s]a new connection request[/zrl] from %3$s."
msgstr ""
-#: ../../Zotlabs/Lib/Enotify.php:380 ../../Zotlabs/Lib/Enotify.php:399
+#: ../../Zotlabs/Lib/Enotify.php:389 ../../Zotlabs/Lib/Enotify.php:408
#, php-format
msgid "You may visit their profile at %s"
msgstr ""
-#: ../../Zotlabs/Lib/Enotify.php:382
+#: ../../Zotlabs/Lib/Enotify.php:391
#, php-format
msgid "Please visit %s to approve or reject the connection request."
msgstr ""
-#: ../../Zotlabs/Lib/Enotify.php:389
+#: ../../Zotlabs/Lib/Enotify.php:398
msgid "[$Projectname:Notify] Friend suggestion received"
msgstr ""
-#: ../../Zotlabs/Lib/Enotify.php:390
+#: ../../Zotlabs/Lib/Enotify.php:399
#, php-format
msgid "%1$s, you've received a friend suggestion from '%2$s' at %3$s"
msgstr ""
-#: ../../Zotlabs/Lib/Enotify.php:391
+#: ../../Zotlabs/Lib/Enotify.php:400
#, php-format
msgid ""
"%1$s, you've received [zrl=%2$s]a friend suggestion[/zrl] for %3$s from %4$s."
msgstr ""
-#: ../../Zotlabs/Lib/Enotify.php:397
+#: ../../Zotlabs/Lib/Enotify.php:406
msgid "Name:"
msgstr ""
-#: ../../Zotlabs/Lib/Enotify.php:398
+#: ../../Zotlabs/Lib/Enotify.php:407
msgid "Photo:"
msgstr ""
-#: ../../Zotlabs/Lib/Enotify.php:401
+#: ../../Zotlabs/Lib/Enotify.php:410
#, php-format
msgid "Please visit %s to approve or reject the suggestion."
msgstr ""
-#: ../../Zotlabs/Lib/Enotify.php:620
+#: ../../Zotlabs/Lib/Enotify.php:629
msgid "[$Projectname:Notify]"
msgstr ""
-#: ../../Zotlabs/Lib/Enotify.php:780
+#: ../../Zotlabs/Lib/Enotify.php:789
msgid "created a new post"
msgstr ""
-#: ../../Zotlabs/Lib/Enotify.php:781
+#: ../../Zotlabs/Lib/Enotify.php:790
#, php-format
msgid "commented on %s's post"
msgstr ""
@@ -7522,21 +7659,21 @@ msgstr ""
msgid "Wiki files deleted successfully"
msgstr ""
-#: ../../Zotlabs/Lib/DB_Upgrade.php:93
+#: ../../Zotlabs/Lib/DB_Upgrade.php:95
#, php-format
msgid "Update Error at %s"
msgstr ""
-#: ../../Zotlabs/Lib/DB_Upgrade.php:99
+#: ../../Zotlabs/Lib/DB_Upgrade.php:101
#, php-format
msgid "Update %s failed. See error logs."
msgstr ""
-#: ../../Zotlabs/Lib/ThreadItem.php:96 ../../include/conversation.php:661
+#: ../../Zotlabs/Lib/ThreadItem.php:96 ../../include/conversation.php:656
msgid "Private Message"
msgstr ""
-#: ../../Zotlabs/Lib/ThreadItem.php:133 ../../include/conversation.php:653
+#: ../../Zotlabs/Lib/ThreadItem.php:133 ../../include/conversation.php:648
msgid "Select"
msgstr ""
@@ -7580,11 +7717,11 @@ msgstr ""
msgid "starred"
msgstr ""
-#: ../../Zotlabs/Lib/ThreadItem.php:240 ../../include/conversation.php:668
+#: ../../Zotlabs/Lib/ThreadItem.php:240 ../../include/conversation.php:663
msgid "Message signature validated"
msgstr ""
-#: ../../Zotlabs/Lib/ThreadItem.php:241 ../../include/conversation.php:669
+#: ../../Zotlabs/Lib/ThreadItem.php:241 ../../include/conversation.php:664
msgid "Message signature incorrect"
msgstr ""
@@ -7592,135 +7729,143 @@ msgstr ""
msgid "Add Tag"
msgstr ""
-#: ../../Zotlabs/Lib/ThreadItem.php:269 ../../include/taxonomy.php:316
+#: ../../Zotlabs/Lib/ThreadItem.php:267 ../../include/taxonomy.php:355
msgid "like"
msgstr ""
-#: ../../Zotlabs/Lib/ThreadItem.php:270 ../../include/taxonomy.php:317
+#: ../../Zotlabs/Lib/ThreadItem.php:268 ../../include/taxonomy.php:356
msgid "dislike"
msgstr ""
-#: ../../Zotlabs/Lib/ThreadItem.php:274
+#: ../../Zotlabs/Lib/ThreadItem.php:272
msgid "Share This"
msgstr ""
-#: ../../Zotlabs/Lib/ThreadItem.php:274
+#: ../../Zotlabs/Lib/ThreadItem.php:272
msgid "share"
msgstr ""
-#: ../../Zotlabs/Lib/ThreadItem.php:283
+#: ../../Zotlabs/Lib/ThreadItem.php:281
msgid "Delivery Report"
msgstr ""
-#: ../../Zotlabs/Lib/ThreadItem.php:301
+#: ../../Zotlabs/Lib/ThreadItem.php:299
#, php-format
msgid "%d comment"
msgid_plural "%d comments"
msgstr[0] ""
msgstr[1] ""
-#: ../../Zotlabs/Lib/ThreadItem.php:330 ../../Zotlabs/Lib/ThreadItem.php:331
+#: ../../Zotlabs/Lib/ThreadItem.php:328 ../../Zotlabs/Lib/ThreadItem.php:329
#, php-format
msgid "View %s's profile - %s"
msgstr ""
-#: ../../Zotlabs/Lib/ThreadItem.php:334
+#: ../../Zotlabs/Lib/ThreadItem.php:332
msgid "to"
msgstr ""
-#: ../../Zotlabs/Lib/ThreadItem.php:335
+#: ../../Zotlabs/Lib/ThreadItem.php:333
msgid "via"
msgstr ""
-#: ../../Zotlabs/Lib/ThreadItem.php:336
+#: ../../Zotlabs/Lib/ThreadItem.php:334
msgid "Wall-to-Wall"
msgstr ""
-#: ../../Zotlabs/Lib/ThreadItem.php:337
+#: ../../Zotlabs/Lib/ThreadItem.php:335
msgid "via Wall-To-Wall:"
msgstr ""
-#: ../../Zotlabs/Lib/ThreadItem.php:350 ../../include/conversation.php:718
+#: ../../Zotlabs/Lib/ThreadItem.php:348 ../../include/conversation.php:715
#, php-format
msgid "from %s"
msgstr ""
-#: ../../Zotlabs/Lib/ThreadItem.php:353 ../../include/conversation.php:721
+#: ../../Zotlabs/Lib/ThreadItem.php:351 ../../include/conversation.php:718
#, php-format
msgid "last edited: %s"
msgstr ""
-#: ../../Zotlabs/Lib/ThreadItem.php:354 ../../include/conversation.php:722
+#: ../../Zotlabs/Lib/ThreadItem.php:352 ../../include/conversation.php:719
#, php-format
msgid "Expires: %s"
msgstr ""
-#: ../../Zotlabs/Lib/ThreadItem.php:360
+#: ../../Zotlabs/Lib/ThreadItem.php:358
msgid "Attend"
msgstr ""
-#: ../../Zotlabs/Lib/ThreadItem.php:361
+#: ../../Zotlabs/Lib/ThreadItem.php:359
msgid "Attendance Options"
msgstr ""
-#: ../../Zotlabs/Lib/ThreadItem.php:362
+#: ../../Zotlabs/Lib/ThreadItem.php:360
msgid "Vote"
msgstr ""
-#: ../../Zotlabs/Lib/ThreadItem.php:363
+#: ../../Zotlabs/Lib/ThreadItem.php:361
msgid "Voting Options"
msgstr ""
-#: ../../Zotlabs/Lib/ThreadItem.php:384
+#: ../../Zotlabs/Lib/ThreadItem.php:382
#: ../../addon/bookmarker/bookmarker.php:38
msgid "Save Bookmarks"
msgstr ""
-#: ../../Zotlabs/Lib/ThreadItem.php:385
+#: ../../Zotlabs/Lib/ThreadItem.php:383
msgid "Add to Calendar"
msgstr ""
-#: ../../Zotlabs/Lib/ThreadItem.php:394
-msgid "Mark all seen"
-msgstr ""
-
-#: ../../Zotlabs/Lib/ThreadItem.php:443 ../../include/js_strings.php:7
+#: ../../Zotlabs/Lib/ThreadItem.php:441 ../../include/js_strings.php:7
#, php-format
msgid "%s show all"
msgstr ""
-#: ../../Zotlabs/Lib/ThreadItem.php:733 ../../include/conversation.php:1318
+#: ../../Zotlabs/Lib/ThreadItem.php:731 ../../include/conversation.php:1315
msgid "Bold"
msgstr ""
-#: ../../Zotlabs/Lib/ThreadItem.php:734 ../../include/conversation.php:1319
+#: ../../Zotlabs/Lib/ThreadItem.php:732 ../../include/conversation.php:1316
msgid "Italic"
msgstr ""
-#: ../../Zotlabs/Lib/ThreadItem.php:735 ../../include/conversation.php:1320
+#: ../../Zotlabs/Lib/ThreadItem.php:733 ../../include/conversation.php:1317
msgid "Underline"
msgstr ""
-#: ../../Zotlabs/Lib/ThreadItem.php:736 ../../include/conversation.php:1321
+#: ../../Zotlabs/Lib/ThreadItem.php:734 ../../include/conversation.php:1318
msgid "Quote"
msgstr ""
-#: ../../Zotlabs/Lib/ThreadItem.php:737 ../../include/conversation.php:1322
+#: ../../Zotlabs/Lib/ThreadItem.php:735 ../../include/conversation.php:1319
msgid "Code"
msgstr ""
-#: ../../Zotlabs/Lib/ThreadItem.php:738
+#: ../../Zotlabs/Lib/ThreadItem.php:736
msgid "Image"
msgstr ""
-#: ../../Zotlabs/Lib/ThreadItem.php:739
+#: ../../Zotlabs/Lib/ThreadItem.php:737
msgid "Insert Link"
msgstr ""
-#: ../../Zotlabs/Lib/ThreadItem.php:740
+#: ../../Zotlabs/Lib/ThreadItem.php:738
msgid "Video"
msgstr ""
+#: ../../Zotlabs/Lib/ThreadItem.php:747
+msgid "Your full name (required)"
+msgstr ""
+
+#: ../../Zotlabs/Lib/ThreadItem.php:748
+msgid "Your email address (required)"
+msgstr ""
+
+#: ../../Zotlabs/Lib/ThreadItem.php:749
+msgid "Your website URL (optional)"
+msgstr ""
+
#: ../../Zotlabs/Zot/Auth.php:138
msgid ""
"Remote authentication blocked. You are logged into this site locally. Please "
@@ -7733,72 +7878,72 @@ msgstr ""
msgid "Welcome %s. Remote authentication successful."
msgstr ""
-#: ../../Zotlabs/Storage/Browser.php:106 ../../Zotlabs/Storage/Browser.php:237
+#: ../../Zotlabs/Storage/Browser.php:107 ../../Zotlabs/Storage/Browser.php:238
msgid "parent"
msgstr ""
-#: ../../Zotlabs/Storage/Browser.php:130 ../../include/text.php:2679
+#: ../../Zotlabs/Storage/Browser.php:131 ../../include/text.php:2692
msgid "Collection"
msgstr ""
-#: ../../Zotlabs/Storage/Browser.php:133
+#: ../../Zotlabs/Storage/Browser.php:134
msgid "Principal"
msgstr ""
-#: ../../Zotlabs/Storage/Browser.php:136
+#: ../../Zotlabs/Storage/Browser.php:137
msgid "Addressbook"
msgstr ""
-#: ../../Zotlabs/Storage/Browser.php:139
+#: ../../Zotlabs/Storage/Browser.php:140
msgid "Calendar"
msgstr ""
-#: ../../Zotlabs/Storage/Browser.php:142
+#: ../../Zotlabs/Storage/Browser.php:143
msgid "Schedule Inbox"
msgstr ""
-#: ../../Zotlabs/Storage/Browser.php:145
+#: ../../Zotlabs/Storage/Browser.php:146
msgid "Schedule Outbox"
msgstr ""
-#: ../../Zotlabs/Storage/Browser.php:225
+#: ../../Zotlabs/Storage/Browser.php:226
msgid "Total"
msgstr ""
-#: ../../Zotlabs/Storage/Browser.php:227
+#: ../../Zotlabs/Storage/Browser.php:228
msgid "Shared"
msgstr ""
-#: ../../Zotlabs/Storage/Browser.php:301
+#: ../../Zotlabs/Storage/Browser.php:304
#, php-format
msgid "You are using %1$s of your available file storage."
msgstr ""
-#: ../../Zotlabs/Storage/Browser.php:306
+#: ../../Zotlabs/Storage/Browser.php:309
#, php-format
msgid "You are using %1$s of %2$s available file storage. (%3$s&#37;)"
msgstr ""
-#: ../../Zotlabs/Storage/Browser.php:317
+#: ../../Zotlabs/Storage/Browser.php:320
msgid "WARNING:"
msgstr ""
-#: ../../Zotlabs/Storage/Browser.php:327
+#: ../../Zotlabs/Storage/Browser.php:330
msgid ""
"Please use DAV to upload large (video, audio) files.<br>See <a class=\"zrl\" "
"href=\"help/member/member_guide#Cloud_Desktop_Clients\">Cloud Desktop "
"Clients</a>"
msgstr ""
-#: ../../Zotlabs/Storage/Browser.php:331
+#: ../../Zotlabs/Storage/Browser.php:334
msgid "Create new folder"
msgstr ""
-#: ../../Zotlabs/Storage/Browser.php:333
+#: ../../Zotlabs/Storage/Browser.php:336
msgid "Upload file"
msgstr ""
-#: ../../Zotlabs/Storage/Browser.php:347
+#: ../../Zotlabs/Storage/Browser.php:350
msgid "Drop files here to immediately upload"
msgstr ""
@@ -7806,9 +7951,85 @@ msgstr ""
msgid "Forums"
msgstr ""
+#: ../../Zotlabs/Widget/Cdav.php:37
+msgid "Select Channel"
+msgstr ""
+
+#: ../../Zotlabs/Widget/Cdav.php:42
+msgid "Read-write"
+msgstr ""
+
+#: ../../Zotlabs/Widget/Cdav.php:43
+msgid "Read-only"
+msgstr ""
+
+#: ../../Zotlabs/Widget/Cdav.php:116
+msgid "My Calendars"
+msgstr ""
+
+#: ../../Zotlabs/Widget/Cdav.php:118
+msgid "Shared Calendars"
+msgstr ""
+
+#: ../../Zotlabs/Widget/Cdav.php:122
+msgid "Share this calendar"
+msgstr ""
+
+#: ../../Zotlabs/Widget/Cdav.php:124
+msgid "Calendar name and color"
+msgstr ""
+
+#: ../../Zotlabs/Widget/Cdav.php:126
+msgid "Create new calendar"
+msgstr ""
+
+#: ../../Zotlabs/Widget/Cdav.php:128
+msgid "Calendar Name"
+msgstr ""
+
+#: ../../Zotlabs/Widget/Cdav.php:129
+msgid "Calendar Tools"
+msgstr ""
+
+#: ../../Zotlabs/Widget/Cdav.php:130
+msgid "Import calendar"
+msgstr ""
+
+#: ../../Zotlabs/Widget/Cdav.php:131
+msgid "Select a calendar to import to"
+msgstr ""
+
+#: ../../Zotlabs/Widget/Cdav.php:158
+msgid "Addressbooks"
+msgstr ""
+
+#: ../../Zotlabs/Widget/Cdav.php:160
+msgid "Addressbook name"
+msgstr ""
+
+#: ../../Zotlabs/Widget/Cdav.php:162
+msgid "Create new addressbook"
+msgstr ""
+
+#: ../../Zotlabs/Widget/Cdav.php:163
+msgid "Addressbook Name"
+msgstr ""
+
+#: ../../Zotlabs/Widget/Cdav.php:165
+msgid "Addressbook Tools"
+msgstr ""
+
+#: ../../Zotlabs/Widget/Cdav.php:166
+msgid "Import addressbook"
+msgstr ""
+
+#: ../../Zotlabs/Widget/Cdav.php:167
+msgid "Select an addressbook to import to"
+msgstr ""
+
#: ../../Zotlabs/Widget/Appcategories.php:39
#: ../../Zotlabs/Widget/Tagcloud.php:25 ../../include/contact_widgets.php:91
-#: ../../include/taxonomy.php:188 ../../include/taxonomy.php:270
+#: ../../include/taxonomy.php:227 ../../include/taxonomy.php:309
msgid "Categories"
msgstr ""
@@ -7841,21 +8062,21 @@ msgstr ""
msgid "Combined View"
msgstr ""
-#: ../../Zotlabs/Widget/Mailmenu.php:20 ../../include/nav.php:195
+#: ../../Zotlabs/Widget/Mailmenu.php:20 ../../include/nav.php:190
msgid "Inbox"
msgstr ""
-#: ../../Zotlabs/Widget/Mailmenu.php:25 ../../include/nav.php:196
+#: ../../Zotlabs/Widget/Mailmenu.php:25 ../../include/nav.php:191
msgid "Outbox"
msgstr ""
-#: ../../Zotlabs/Widget/Mailmenu.php:30 ../../include/nav.php:197
+#: ../../Zotlabs/Widget/Mailmenu.php:30 ../../include/nav.php:192
msgid "New Message"
msgstr ""
#: ../../Zotlabs/Widget/Chatroom_list.php:16
-#: ../../include/conversation.php:1816 ../../include/conversation.php:1819
-#: ../../include/nav.php:425 ../../include/nav.php:428
+#: ../../include/conversation.php:1813 ../../include/conversation.php:1816
+#: ../../include/nav.php:405 ../../include/nav.php:408
msgid "Chatrooms"
msgstr ""
@@ -7906,23 +8127,22 @@ msgid "Archives"
msgstr ""
#: ../../Zotlabs/Widget/Conversations.php:17
-#: ../../Zotlabs/Widget/Conversations.php:29
-msgid "Conversations"
+msgid "Received Messages"
msgstr ""
#: ../../Zotlabs/Widget/Conversations.php:21
-msgid "Received Messages"
+msgid "Sent Messages"
msgstr ""
#: ../../Zotlabs/Widget/Conversations.php:25
-msgid "Sent Messages"
+msgid "Conversations"
msgstr ""
-#: ../../Zotlabs/Widget/Conversations.php:39
+#: ../../Zotlabs/Widget/Conversations.php:35
msgid "No messages."
msgstr ""
-#: ../../Zotlabs/Widget/Conversations.php:57
+#: ../../Zotlabs/Widget/Conversations.php:55
msgid "Delete conversation"
msgstr ""
@@ -7938,11 +8158,11 @@ msgstr ""
msgid "Remove term"
msgstr ""
-#: ../../Zotlabs/Widget/Savedsearch.php:83 ../../include/features.php:301
+#: ../../Zotlabs/Widget/Savedsearch.php:83 ../../include/features.php:297
msgid "Saved Searches"
msgstr ""
-#: ../../Zotlabs/Widget/Savedsearch.php:84 ../../include/group.php:336
+#: ../../Zotlabs/Widget/Savedsearch.php:84 ../../include/group.php:337
msgid "add"
msgstr ""
@@ -7950,15 +8170,15 @@ msgstr ""
msgid "Notes"
msgstr ""
-#: ../../Zotlabs/Widget/Wiki_pages.php:54 ../../addon/gitwiki/gitwiki.php:76
+#: ../../Zotlabs/Widget/Wiki_pages.php:52 ../../addon/gitwiki/gitwiki.php:76
msgid "Wiki Pages"
msgstr ""
-#: ../../Zotlabs/Widget/Wiki_pages.php:60 ../../addon/gitwiki/gitwiki.php:81
+#: ../../Zotlabs/Widget/Wiki_pages.php:58 ../../addon/gitwiki/gitwiki.php:81
msgid "Add new page"
msgstr ""
-#: ../../Zotlabs/Widget/Wiki_pages.php:61 ../../addon/gitwiki/gitwiki.php:82
+#: ../../Zotlabs/Widget/Wiki_pages.php:59 ../../addon/gitwiki/gitwiki.php:82
msgid "Page name"
msgstr ""
@@ -7979,7 +8199,7 @@ msgid "See more..."
msgstr ""
#: ../../Zotlabs/Widget/Filer.php:28 ../../include/contact_widgets.php:53
-#: ../../include/features.php:390
+#: ../../include/features.php:386
msgid "Saved Folders"
msgstr ""
@@ -7999,7 +8219,7 @@ msgstr ""
msgid "DB updates"
msgstr ""
-#: ../../Zotlabs/Widget/Admin.php:55 ../../include/nav.php:215
+#: ../../Zotlabs/Widget/Admin.php:55 ../../include/nav.php:209
msgid "Admin"
msgstr ""
@@ -8035,15 +8255,15 @@ msgstr ""
msgid "Export channel"
msgstr ""
-#: ../../Zotlabs/Widget/Settings_menu.php:83
+#: ../../Zotlabs/Widget/Settings_menu.php:84
msgid "Connected apps"
msgstr ""
-#: ../../Zotlabs/Widget/Settings_menu.php:98 ../../include/features.php:153
+#: ../../Zotlabs/Widget/Settings_menu.php:100 ../../include/features.php:149
msgid "Permission Groups"
msgstr ""
-#: ../../Zotlabs/Widget/Settings_menu.php:115
+#: ../../Zotlabs/Widget/Settings_menu.php:117
msgid "Premium Channel Settings"
msgstr ""
@@ -8055,156 +8275,147 @@ msgstr ""
msgid "Source channel not found."
msgstr ""
-#: ../../boot.php:1162 ../../addon/opensearch/opensearch.php:26
-#, php-format
-msgctxt "opensearch"
-msgid "Search %1$s (%2$s)"
-msgstr ""
-
-#: ../../boot.php:1162 ../../addon/opensearch/opensearch.php:28
-msgctxt "opensearch"
-msgid "$Projectname"
-msgstr ""
-
-#: ../../boot.php:1609
+#: ../../boot.php:1578
msgid "Create an account to access services and applications"
msgstr ""
-#: ../../boot.php:1628 ../../include/nav.php:103 ../../include/nav.php:127
+#: ../../boot.php:1597 ../../include/nav.php:99 ../../include/nav.php:123
+#: ../../include/nav.php:140
msgid "Logout"
msgstr ""
-#: ../../boot.php:1631
+#: ../../boot.php:1600
msgid "Login/Email"
msgstr ""
-#: ../../boot.php:1632
+#: ../../boot.php:1601
msgid "Password"
msgstr ""
-#: ../../boot.php:1633
+#: ../../boot.php:1602
msgid "Remember me"
msgstr ""
-#: ../../boot.php:1636
+#: ../../boot.php:1605
msgid "Forgot your password?"
msgstr ""
-#: ../../boot.php:2174
+#: ../../boot.php:2143
msgid "toggle mobile"
msgstr ""
-#: ../../boot.php:2327
+#: ../../boot.php:2296
#, php-format
msgid "[$Projectname] Website SSL error for %s"
msgstr ""
-#: ../../boot.php:2332
+#: ../../boot.php:2301
msgid "Website SSL certificate is not valid. Please correct."
msgstr ""
-#: ../../boot.php:2450
+#: ../../boot.php:2420
#, php-format
msgid "[$Projectname] Cron tasks not running on %s"
msgstr ""
-#: ../../boot.php:2455
+#: ../../boot.php:2425
msgid "Cron/Scheduled tasks not running."
msgstr ""
-#: ../../boot.php:2456 ../../include/datetime.php:286
+#: ../../boot.php:2426 ../../include/datetime.php:286
msgid "never"
msgstr ""
-#: ../../view/theme/redbasic/php/config.php:9
+#: ../../view/theme/redbasic/php/config.php:16
+#: ../../view/theme/redbasic/php/config.php:19
msgid "Focus (Hubzilla default)"
msgstr ""
-#: ../../view/theme/redbasic/php/config.php:88
+#: ../../view/theme/redbasic/php/config.php:99
msgid "Theme settings"
msgstr ""
-#: ../../view/theme/redbasic/php/config.php:89
+#: ../../view/theme/redbasic/php/config.php:100
msgid "Narrow navbar"
msgstr ""
-#: ../../view/theme/redbasic/php/config.php:90
+#: ../../view/theme/redbasic/php/config.php:101
msgid "Navigation bar background color"
msgstr ""
-#: ../../view/theme/redbasic/php/config.php:91
+#: ../../view/theme/redbasic/php/config.php:102
msgid "Navigation bar icon color "
msgstr ""
-#: ../../view/theme/redbasic/php/config.php:92
+#: ../../view/theme/redbasic/php/config.php:103
msgid "Navigation bar active icon color "
msgstr ""
-#: ../../view/theme/redbasic/php/config.php:93
+#: ../../view/theme/redbasic/php/config.php:104
msgid "Link color"
msgstr ""
-#: ../../view/theme/redbasic/php/config.php:94
+#: ../../view/theme/redbasic/php/config.php:105
msgid "Set font-color for banner"
msgstr ""
-#: ../../view/theme/redbasic/php/config.php:95
+#: ../../view/theme/redbasic/php/config.php:106
msgid "Set the background color"
msgstr ""
-#: ../../view/theme/redbasic/php/config.php:96
+#: ../../view/theme/redbasic/php/config.php:107
msgid "Set the background image"
msgstr ""
-#: ../../view/theme/redbasic/php/config.php:97
+#: ../../view/theme/redbasic/php/config.php:108
msgid "Set the background color of items"
msgstr ""
-#: ../../view/theme/redbasic/php/config.php:98
+#: ../../view/theme/redbasic/php/config.php:109
msgid "Set the background color of comments"
msgstr ""
-#: ../../view/theme/redbasic/php/config.php:99
+#: ../../view/theme/redbasic/php/config.php:110
msgid "Set font-size for the entire application"
msgstr ""
-#: ../../view/theme/redbasic/php/config.php:99
+#: ../../view/theme/redbasic/php/config.php:110
msgid "Examples: 1rem, 100%, 16px"
msgstr ""
-#: ../../view/theme/redbasic/php/config.php:100
+#: ../../view/theme/redbasic/php/config.php:111
msgid "Set font-color for posts and comments"
msgstr ""
-#: ../../view/theme/redbasic/php/config.php:101
+#: ../../view/theme/redbasic/php/config.php:112
msgid "Set radius of corners"
msgstr ""
-#: ../../view/theme/redbasic/php/config.php:101
+#: ../../view/theme/redbasic/php/config.php:112
msgid "Example: 4px"
msgstr ""
-#: ../../view/theme/redbasic/php/config.php:102
+#: ../../view/theme/redbasic/php/config.php:113
msgid "Set shadow depth of photos"
msgstr ""
-#: ../../view/theme/redbasic/php/config.php:103
+#: ../../view/theme/redbasic/php/config.php:114
msgid "Set maximum width of content region in pixel"
msgstr ""
-#: ../../view/theme/redbasic/php/config.php:103
+#: ../../view/theme/redbasic/php/config.php:114
msgid "Leave empty for default width"
msgstr ""
-#: ../../view/theme/redbasic/php/config.php:104
+#: ../../view/theme/redbasic/php/config.php:115
msgid "Left align page content"
msgstr ""
-#: ../../view/theme/redbasic/php/config.php:105
+#: ../../view/theme/redbasic/php/config.php:116
msgid "Set size of conversation author photo"
msgstr ""
-#: ../../view/theme/redbasic/php/config.php:106
+#: ../../view/theme/redbasic/php/config.php:117
msgid "Set size of followup author photos"
msgstr ""
@@ -8345,232 +8556,43 @@ msgstr ""
msgid "Skeleton Settings"
msgstr ""
-#: ../../addon/gnusoc/gnusoc.php:119
+#: ../../addon/gnusoc/gnusoc.php:200
msgid "GNU-Social Protocol Settings updated."
msgstr ""
-#: ../../addon/gnusoc/gnusoc.php:130
+#: ../../addon/gnusoc/gnusoc.php:219
+msgid ""
+"The GNU-Social protocol does not support location independence. Connections "
+"you make within that network may be unreachable from alternate channel "
+"locations."
+msgstr ""
+
+#: ../../addon/gnusoc/gnusoc.php:222
msgid "Enable the GNU-Social protocol for this channel"
msgstr ""
-#: ../../addon/gnusoc/gnusoc.php:134
+#: ../../addon/gnusoc/gnusoc.php:226
msgid "GNU-Social Protocol Settings"
msgstr ""
-#: ../../addon/gnusoc/gnusoc.php:324
+#: ../../addon/gnusoc/gnusoc.php:417
msgid "Follow"
msgstr ""
-#: ../../addon/gnusoc/gnusoc.php:327
+#: ../../addon/gnusoc/gnusoc.php:420
#, php-format
msgid "%1$s is now following %2$s"
msgstr ""
-#: ../../addon/cdav/Mod_Cdav.php:744
-msgid "INVALID EVENT DISMISSED!"
-msgstr ""
-
-#: ../../addon/cdav/Mod_Cdav.php:745
-msgid "Summary: "
-msgstr ""
-
-#: ../../addon/cdav/Mod_Cdav.php:746
-msgid "Date: "
-msgstr ""
-
-#: ../../addon/cdav/Mod_Cdav.php:747 ../../addon/cdav/Mod_Cdav.php:754
-msgid "Reason: "
-msgstr ""
-
-#: ../../addon/cdav/Mod_Cdav.php:752
-msgid "INVALID CARD DISMISSED!"
-msgstr ""
-
-#: ../../addon/cdav/Mod_Cdav.php:753
-msgid "Name: "
-msgstr ""
-
-#: ../../addon/cdav/Mod_Cdav.php:770
-msgid ""
-"You have to enable this plugin in Feature/Addon Settings > CalDAV/CardDAV "
-"Settings before you can use it."
-msgstr ""
-
-#: ../../addon/cdav/Mod_Cdav.php:836 ../../addon/cdav/Mod_Cdav.php:837
-msgid "Example: YYYY-MM-DD HH:mm"
-msgstr ""
-
-#: ../../addon/cdav/Mod_Cdav.php:837
-msgid "End date and time"
-msgstr ""
-
-#: ../../addon/cdav/Mod_Cdav.php:852
-msgid "List month"
-msgstr ""
-
-#: ../../addon/cdav/Mod_Cdav.php:853
-msgid "List week"
-msgstr ""
-
-#: ../../addon/cdav/Mod_Cdav.php:854
-msgid "List day"
-msgstr ""
-
-#: ../../addon/cdav/Mod_Cdav.php:861
-msgid "More"
-msgstr ""
-
-#: ../../addon/cdav/Mod_Cdav.php:862
-msgid "Less"
-msgstr ""
-
-#: ../../addon/cdav/Mod_Cdav.php:863
-msgid "Select calendar"
-msgstr ""
-
-#: ../../addon/cdav/Mod_Cdav.php:865
-msgid "Delete all"
-msgstr ""
-
-#: ../../addon/cdav/Mod_Cdav.php:867
-msgid "Sorry! Editing of recurrent events is not yet implemented."
-msgstr ""
-
-#: ../../addon/cdav/cdav.php:36
-msgid "Errors encountered creating database table: "
-msgstr ""
-
-#: ../../addon/cdav/cdav.php:197
-msgid "Default Calendar"
-msgstr ""
-
-#: ../../addon/cdav/cdav.php:206
-msgid "Default Addressbook"
-msgstr ""
-
-#: ../../addon/cdav/cdav.php:215
-msgid "CalDAV/CardDAV Settings saved."
-msgstr ""
-
-#: ../../addon/cdav/cdav.php:234
-msgid "Enable CalDAV/CardDAV Server for this channel"
-msgstr ""
-
-#: ../../addon/cdav/cdav.php:237
-#, php-format
-msgid "Your CalDAV resources are located at %s "
-msgstr ""
-
-#: ../../addon/cdav/cdav.php:240
-#, php-format
-msgid "Your CardDAV resources are located at %s "
-msgstr ""
-
-#: ../../addon/cdav/cdav.php:246
-msgid "CalDAV/CardDAV Settings"
-msgstr ""
-
-#: ../../addon/cdav/cdav.php:272 ../../include/connections.php:670
-msgid "Home, Voice"
-msgstr ""
-
-#: ../../addon/cdav/cdav.php:273 ../../include/connections.php:671
-msgid "Home, Fax"
-msgstr ""
-
-#: ../../addon/cdav/cdav.php:275 ../../include/connections.php:673
-msgid "Work, Voice"
-msgstr ""
-
-#: ../../addon/cdav/cdav.php:276 ../../include/connections.php:674
-msgid "Work, Fax"
-msgstr ""
-
-#: ../../addon/cdav/include/widgets.php:37
-msgid "Select Channel"
-msgstr ""
-
-#: ../../addon/cdav/include/widgets.php:42
-msgid "Read-write"
-msgstr ""
-
-#: ../../addon/cdav/include/widgets.php:43
-msgid "Read-only"
-msgstr ""
-
-#: ../../addon/cdav/include/widgets.php:116
-msgid "My Calendars"
-msgstr ""
-
-#: ../../addon/cdav/include/widgets.php:118
-msgid "Shared Calendars"
-msgstr ""
-
-#: ../../addon/cdav/include/widgets.php:122
-msgid "Share this calendar"
-msgstr ""
-
-#: ../../addon/cdav/include/widgets.php:124
-msgid "Calendar name and color"
-msgstr ""
-
-#: ../../addon/cdav/include/widgets.php:126
-msgid "Create new calendar"
-msgstr ""
-
-#: ../../addon/cdav/include/widgets.php:128
-msgid "Calendar Name"
-msgstr ""
-
-#: ../../addon/cdav/include/widgets.php:129
-msgid "Calendar Tools"
-msgstr ""
-
-#: ../../addon/cdav/include/widgets.php:130
-msgid "Import calendar"
-msgstr ""
-
-#: ../../addon/cdav/include/widgets.php:131
-msgid "Select a calendar to import to"
-msgstr ""
-
-#: ../../addon/cdav/include/widgets.php:158
-msgid "Addressbooks"
-msgstr ""
-
-#: ../../addon/cdav/include/widgets.php:160
-msgid "Addressbook name"
-msgstr ""
-
-#: ../../addon/cdav/include/widgets.php:162
-msgid "Create new addressbook"
-msgstr ""
-
-#: ../../addon/cdav/include/widgets.php:163
-msgid "Addressbook Name"
-msgstr ""
-
-#: ../../addon/cdav/include/widgets.php:165
-msgid "Addressbook Tools"
-msgstr ""
-
-#: ../../addon/cdav/include/widgets.php:166
-msgid "Import addressbook"
-msgstr ""
-
-#: ../../addon/cdav/include/widgets.php:167
-msgid "Select an addressbook to import to"
-msgstr ""
-
#: ../../addon/planets/planets.php:121
msgid "Planets Settings updated."
msgstr ""
-#: ../../addon/planets/planets.php:153
+#: ../../addon/planets/planets.php:149
msgid "Enable Planets Plugin"
msgstr ""
-#: ../../addon/planets/planets.php:157
+#: ../../addon/planets/planets.php:153
msgid "Planets Settings"
msgstr ""
@@ -8603,8 +8625,8 @@ msgstr ""
msgid "Page to load after image selection."
msgstr ""
-#: ../../addon/openclipatar/openclipatar.php:58 ../../include/channel.php:1048
-#: ../../include/nav.php:111
+#: ../../addon/openclipatar/openclipatar.php:58 ../../include/channel.php:1063
+#: ../../include/nav.php:107
msgid "Edit Profile"
msgstr ""
@@ -9143,12 +9165,12 @@ msgid "Login failed."
msgstr ""
#: ../../addon/openid/Mod_Id.php:85 ../../include/selectors.php:49
-#: ../../include/selectors.php:66
+#: ../../include/selectors.php:66 ../../include/channel.php:1230
msgid "Male"
msgstr ""
#: ../../addon/openid/Mod_Id.php:87 ../../include/selectors.php:49
-#: ../../include/selectors.php:66
+#: ../../include/selectors.php:66 ../../include/channel.php:1228
msgid "Female"
msgstr ""
@@ -9335,27 +9357,38 @@ msgstr ""
msgid "declared undying love for"
msgstr ""
-#: ../../addon/diaspora/diaspora.php:675
+#: ../../addon/diaspora/diaspora.php:715
msgid "Diaspora Protocol Settings updated."
msgstr ""
-#: ../../addon/diaspora/diaspora.php:694
+#: ../../addon/diaspora/diaspora.php:734
+msgid ""
+"The Diaspora protocol does not support location independence. Connections "
+"you make within that network may be unreachable from alternate channel "
+"locations."
+msgstr ""
+
+#: ../../addon/diaspora/diaspora.php:737
msgid "Enable the Diaspora protocol for this channel"
msgstr ""
-#: ../../addon/diaspora/diaspora.php:698
+#: ../../addon/diaspora/diaspora.php:741
msgid "Allow any Diaspora member to comment on your public posts"
msgstr ""
-#: ../../addon/diaspora/diaspora.php:702
+#: ../../addon/diaspora/diaspora.php:745
msgid "Prevent your hashtags from being redirected to other sites"
msgstr ""
-#: ../../addon/diaspora/diaspora.php:707
+#: ../../addon/diaspora/diaspora.php:749
+msgid "Sign and forward posts and comments with no existing Diaspora signature"
+msgstr ""
+
+#: ../../addon/diaspora/diaspora.php:754
msgid "Followed hashtags (comma separated, do not include the #)"
msgstr ""
-#: ../../addon/diaspora/diaspora.php:712
+#: ../../addon/diaspora/diaspora.php:759
msgid "Diaspora Protocol Settings"
msgstr ""
@@ -9481,25 +9514,6 @@ msgstr ""
msgid "Message subject"
msgstr ""
-#: ../../addon/diaspora_reconnect/diaspora_reconnect.php:44
-#, php-format
-msgid "Reconnecting %d connections"
-msgstr ""
-
-#: ../../addon/diaspora_reconnect/diaspora_reconnect.php:63
-msgid "Diaspora Reconnect"
-msgstr ""
-
-#: ../../addon/diaspora_reconnect/diaspora_reconnect.php:65
-msgid ""
-"Use this form to re-establish Diaspora connections which were initially made "
-"from a different hub."
-msgstr ""
-
-#: ../../addon/diaspora_reconnect/diaspora_reconnect.php:70
-msgid "Reconnect"
-msgstr ""
-
#: ../../addon/openstreetmap/openstreetmap.php:146
msgid "View Larger"
msgstr ""
@@ -9585,8 +9599,8 @@ msgstr ""
msgid "Hubzilla to Friendica Post Settings"
msgstr ""
-#: ../../addon/jappixmini/jappixmini.php:305 ../../include/channel.php:1139
-#: ../../include/channel.php:1296
+#: ../../addon/jappixmini/jappixmini.php:305 ../../include/channel.php:1154
+#: ../../include/channel.php:1317
msgid "Status:"
msgstr ""
@@ -10140,7 +10154,7 @@ msgstr ""
msgid "Error creating new game."
msgstr ""
-#: ../../addon/chess/chess.php:381 ../../include/channel.php:899
+#: ../../addon/chess/chess.php:381 ../../include/channel.php:914
msgid "Requested channel is not available."
msgstr ""
@@ -10215,15 +10229,15 @@ msgstr ""
msgid "Twitter Post Settings"
msgstr ""
-#: ../../addon/smileybutton/smileybutton.php:273
+#: ../../addon/smileybutton/smileybutton.php:211
msgid "Deactivate the feature"
msgstr ""
-#: ../../addon/smileybutton/smileybutton.php:277
+#: ../../addon/smileybutton/smileybutton.php:215
msgid "Hide the button and show the smilies directly."
msgstr ""
-#: ../../addon/smileybutton/smileybutton.php:281
+#: ../../addon/smileybutton/smileybutton.php:219
msgid "Smileybutton Settings"
msgstr ""
@@ -10505,6 +10519,22 @@ msgstr ""
msgid "pageheader Settings saved."
msgstr ""
+#: ../../addon/authchoose/authchoose.php:67
+msgid "Only authenticate automatically to sites of your friends"
+msgstr ""
+
+#: ../../addon/authchoose/authchoose.php:67
+msgid "By default you are automatically authenticated anywhere in the network"
+msgstr ""
+
+#: ../../addon/authchoose/authchoose.php:71
+msgid "Authchoose Settings"
+msgstr ""
+
+#: ../../addon/authchoose/authchoose.php:85
+msgid "Atuhchoose Settings updated."
+msgstr ""
+
#: ../../addon/moremoods/moremoods.php:19
msgid "lonely"
msgstr ""
@@ -10700,6 +10730,17 @@ msgstr ""
msgid "Authentication successful but rejected: account creation is disabled."
msgstr ""
+#: ../../addon/opensearch/opensearch.php:26
+#, php-format
+msgctxt "opensearch"
+msgid "Search %1$s (%2$s)"
+msgstr ""
+
+#: ../../addon/opensearch/opensearch.php:28
+msgctxt "opensearch"
+msgid "$Projectname"
+msgstr ""
+
#: ../../addon/opensearch/opensearch.php:43
msgid "Search $Projectname"
msgstr ""
@@ -10798,11 +10839,11 @@ msgstr ""
msgid "Hermaphrodite"
msgstr ""
-#: ../../include/selectors.php:49
+#: ../../include/selectors.php:49 ../../include/channel.php:1234
msgid "Neuter"
msgstr ""
-#: ../../include/selectors.php:49
+#: ../../include/selectors.php:49 ../../include/channel.php:1236
msgid "Non-specific"
msgstr ""
@@ -10992,340 +11033,288 @@ msgstr ""
msgid "%1$s poked %2$s"
msgstr ""
-#: ../../include/conversation.php:239 ../../include/text.php:1115
-#: ../../include/text.php:1120
+#: ../../include/conversation.php:239 ../../include/text.php:1096
+#: ../../include/text.php:1101
msgid "poked"
msgstr ""
-#: ../../include/conversation.php:691
+#: ../../include/conversation.php:688
#, php-format
msgid "View %s's profile @ %s"
msgstr ""
-#: ../../include/conversation.php:711
+#: ../../include/conversation.php:708
msgid "Categories:"
msgstr ""
-#: ../../include/conversation.php:712
+#: ../../include/conversation.php:709
msgid "Filed under:"
msgstr ""
-#: ../../include/conversation.php:737
+#: ../../include/conversation.php:734
msgid "View in context"
msgstr ""
-#: ../../include/conversation.php:834
+#: ../../include/conversation.php:831
msgid "remove"
msgstr ""
-#: ../../include/conversation.php:838 ../../include/nav.php:272
+#: ../../include/conversation.php:835 ../../include/nav.php:262
msgid "Loading..."
msgstr ""
-#: ../../include/conversation.php:839
+#: ../../include/conversation.php:836
msgid "Delete Selected Items"
msgstr ""
-#: ../../include/conversation.php:882
+#: ../../include/conversation.php:879
msgid "View Source"
msgstr ""
-#: ../../include/conversation.php:892
+#: ../../include/conversation.php:889
msgid "Follow Thread"
msgstr ""
-#: ../../include/conversation.php:901
+#: ../../include/conversation.php:898
msgid "Unfollow Thread"
msgstr ""
-#: ../../include/conversation.php:992
+#: ../../include/conversation.php:989
msgid "Activity/Posts"
msgstr ""
-#: ../../include/conversation.php:1012
+#: ../../include/conversation.php:1009
msgid "Edit Connection"
msgstr ""
-#: ../../include/conversation.php:1022
+#: ../../include/conversation.php:1019
msgid "Message"
msgstr ""
-#: ../../include/conversation.php:1156
+#: ../../include/conversation.php:1153
#, php-format
msgid "%s likes this."
msgstr ""
-#: ../../include/conversation.php:1156
+#: ../../include/conversation.php:1153
#, php-format
msgid "%s doesn't like this."
msgstr ""
-#: ../../include/conversation.php:1160
+#: ../../include/conversation.php:1157
#, 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] ""
-#: ../../include/conversation.php:1162
+#: ../../include/conversation.php:1159
#, 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] ""
-#: ../../include/conversation.php:1168
+#: ../../include/conversation.php:1165
msgid "and"
msgstr ""
-#: ../../include/conversation.php:1171
+#: ../../include/conversation.php:1168
#, php-format
msgid ", and %d other people"
msgid_plural ", and %d other people"
msgstr[0] ""
msgstr[1] ""
-#: ../../include/conversation.php:1172
+#: ../../include/conversation.php:1169
#, php-format
msgid "%s like this."
msgstr ""
-#: ../../include/conversation.php:1172
+#: ../../include/conversation.php:1169
#, php-format
msgid "%s don't like this."
msgstr ""
-#: ../../include/conversation.php:1215
+#: ../../include/conversation.php:1212
msgid "Set your location"
msgstr ""
-#: ../../include/conversation.php:1216
+#: ../../include/conversation.php:1213
msgid "Clear browser location"
msgstr ""
-#: ../../include/conversation.php:1264
+#: ../../include/conversation.php:1261
msgid "Tag term:"
msgstr ""
-#: ../../include/conversation.php:1265
+#: ../../include/conversation.php:1262
msgid "Where are you right now?"
msgstr ""
-#: ../../include/conversation.php:1270
+#: ../../include/conversation.php:1267
msgid "Choose a different album..."
msgstr ""
-#: ../../include/conversation.php:1274
+#: ../../include/conversation.php:1271
msgid "Comments enabled"
msgstr ""
-#: ../../include/conversation.php:1275
+#: ../../include/conversation.php:1272
msgid "Comments disabled"
msgstr ""
-#: ../../include/conversation.php:1313
+#: ../../include/conversation.php:1310
msgid "Page link name"
msgstr ""
-#: ../../include/conversation.php:1316
+#: ../../include/conversation.php:1313
msgid "Post as"
msgstr ""
-#: ../../include/conversation.php:1330
+#: ../../include/conversation.php:1327
msgid "Toggle voting"
msgstr ""
-#: ../../include/conversation.php:1333
+#: ../../include/conversation.php:1330
msgid "Disable comments"
msgstr ""
-#: ../../include/conversation.php:1334
+#: ../../include/conversation.php:1331
msgid "Toggle comments"
msgstr ""
-#: ../../include/conversation.php:1342
+#: ../../include/conversation.php:1339
msgid "Categories (optional, comma-separated list)"
msgstr ""
-#: ../../include/conversation.php:1365
+#: ../../include/conversation.php:1362
msgid "Other networks and post services"
msgstr ""
-#: ../../include/conversation.php:1371
+#: ../../include/conversation.php:1368
msgid "Set publish date"
msgstr ""
-#: ../../include/conversation.php:1634
+#: ../../include/conversation.php:1631
msgid "Discover"
msgstr ""
-#: ../../include/conversation.php:1637
+#: ../../include/conversation.php:1634
msgid "Imported public streams"
msgstr ""
-#: ../../include/conversation.php:1642
+#: ../../include/conversation.php:1639
msgid "Commented Order"
msgstr ""
-#: ../../include/conversation.php:1645
+#: ../../include/conversation.php:1642
msgid "Sort by Comment Date"
msgstr ""
-#: ../../include/conversation.php:1649
+#: ../../include/conversation.php:1646
msgid "Posted Order"
msgstr ""
-#: ../../include/conversation.php:1652
+#: ../../include/conversation.php:1649
msgid "Sort by Post Date"
msgstr ""
-#: ../../include/conversation.php:1660
+#: ../../include/conversation.php:1657
msgid "Posts that mention or involve you"
msgstr ""
-#: ../../include/conversation.php:1669
+#: ../../include/conversation.php:1666
msgid "Activity Stream - by date"
msgstr ""
-#: ../../include/conversation.php:1675
+#: ../../include/conversation.php:1672
msgid "Starred"
msgstr ""
-#: ../../include/conversation.php:1678
+#: ../../include/conversation.php:1675
msgid "Favourite Posts"
msgstr ""
-#: ../../include/conversation.php:1685
+#: ../../include/conversation.php:1682
msgid "Spam"
msgstr ""
-#: ../../include/conversation.php:1688
+#: ../../include/conversation.php:1685
msgid "Posts flagged as SPAM"
msgstr ""
-#: ../../include/conversation.php:1763 ../../include/nav.php:372
+#: ../../include/conversation.php:1760 ../../include/nav.php:352
msgid "Status Messages and Posts"
msgstr ""
-#: ../../include/conversation.php:1776 ../../include/nav.php:385
+#: ../../include/conversation.php:1773 ../../include/nav.php:365
msgid "Profile Details"
msgstr ""
-#: ../../include/conversation.php:1786 ../../include/nav.php:395
-#: ../../include/photos.php:528
+#: ../../include/conversation.php:1783 ../../include/nav.php:375
+#: ../../include/photos.php:525
msgid "Photo Albums"
msgstr ""
-#: ../../include/conversation.php:1794 ../../include/nav.php:403
+#: ../../include/conversation.php:1791 ../../include/nav.php:383
msgid "Files and Storage"
msgstr ""
-#: ../../include/conversation.php:1830 ../../include/nav.php:438
+#: ../../include/conversation.php:1827 ../../include/nav.php:418
msgid "Bookmarks"
msgstr ""
-#: ../../include/conversation.php:1833 ../../include/nav.php:441
+#: ../../include/conversation.php:1830 ../../include/nav.php:421
msgid "Saved Bookmarks"
msgstr ""
-#: ../../include/conversation.php:1844 ../../include/nav.php:452
+#: ../../include/conversation.php:1841 ../../include/nav.php:432
msgid "View Webpages"
msgstr ""
-#: ../../include/conversation.php:1913
+#: ../../include/conversation.php:1910
msgctxt "noun"
msgid "Attending"
msgid_plural "Attending"
msgstr[0] ""
msgstr[1] ""
-#: ../../include/conversation.php:1916
+#: ../../include/conversation.php:1913
msgctxt "noun"
msgid "Not Attending"
msgid_plural "Not Attending"
msgstr[0] ""
msgstr[1] ""
-#: ../../include/conversation.php:1919
+#: ../../include/conversation.php:1916
msgctxt "noun"
msgid "Undecided"
msgid_plural "Undecided"
msgstr[0] ""
msgstr[1] ""
-#: ../../include/conversation.php:1922
+#: ../../include/conversation.php:1919
msgctxt "noun"
msgid "Agree"
msgid_plural "Agrees"
msgstr[0] ""
msgstr[1] ""
-#: ../../include/conversation.php:1925
+#: ../../include/conversation.php:1922
msgctxt "noun"
msgid "Disagree"
msgid_plural "Disagrees"
msgstr[0] ""
msgstr[1] ""
-#: ../../include/conversation.php:1928
+#: ../../include/conversation.php:1925
msgctxt "noun"
msgid "Abstain"
msgid_plural "Abstains"
msgstr[0] ""
msgstr[1] ""
-#: ../../include/permissions.php:35
-msgid "Can view my normal stream and posts"
-msgstr ""
-
-#: ../../include/permissions.php:39
-msgid "Can view my webpages"
-msgstr ""
-
-#: ../../include/permissions.php:43
-msgid "Can post on my channel page (\"wall\")"
-msgstr ""
-
-#: ../../include/permissions.php:46
-msgid "Can like/dislike stuff"
-msgstr ""
-
-#: ../../include/permissions.php:46
-msgid "Profiles and things other than posts/comments"
-msgstr ""
-
-#: ../../include/permissions.php:48
-msgid "Can forward to all my channel contacts via post @mentions"
-msgstr ""
-
-#: ../../include/permissions.php:48
-msgid "Advanced - useful for creating group forum channels"
-msgstr ""
-
-#: ../../include/permissions.php:49
-msgid "Can chat with me (when available)"
-msgstr ""
-
-#: ../../include/permissions.php:50
-msgid "Can write to my file storage and photos"
-msgstr ""
-
-#: ../../include/permissions.php:51
-msgid "Can edit my webpages"
-msgstr ""
-
-#: ../../include/permissions.php:53
-msgid "Somewhat advanced - very useful in open communities"
-msgstr ""
-
-#: ../../include/permissions.php:55
-msgid "Can administer my channel resources"
-msgstr ""
-
-#: ../../include/permissions.php:55
-msgid "Extremely advanced. Leave this alone unless you know what you are doing"
-msgstr ""
-
#: ../../include/dir_fns.php:141
msgid "Directory Options"
msgstr ""
@@ -11380,320 +11369,328 @@ msgstr ""
msgid "newer"
msgstr ""
-#: ../../include/text.php:945
+#: ../../include/text.php:939
msgid "No connections"
msgstr ""
-#: ../../include/text.php:970
+#: ../../include/text.php:964
#, php-format
msgid "View all %s connections"
msgstr ""
-#: ../../include/text.php:1115 ../../include/text.php:1120
+#: ../../include/text.php:1096 ../../include/text.php:1101
msgid "poke"
msgstr ""
-#: ../../include/text.php:1121
+#: ../../include/text.php:1102
msgid "ping"
msgstr ""
-#: ../../include/text.php:1121
+#: ../../include/text.php:1102
msgid "pinged"
msgstr ""
-#: ../../include/text.php:1122
+#: ../../include/text.php:1103
msgid "prod"
msgstr ""
-#: ../../include/text.php:1122
+#: ../../include/text.php:1103
msgid "prodded"
msgstr ""
-#: ../../include/text.php:1123
+#: ../../include/text.php:1104
msgid "slap"
msgstr ""
-#: ../../include/text.php:1123
+#: ../../include/text.php:1104
msgid "slapped"
msgstr ""
-#: ../../include/text.php:1124
+#: ../../include/text.php:1105
msgid "finger"
msgstr ""
-#: ../../include/text.php:1124
+#: ../../include/text.php:1105
msgid "fingered"
msgstr ""
-#: ../../include/text.php:1125
+#: ../../include/text.php:1106
msgid "rebuff"
msgstr ""
-#: ../../include/text.php:1125
+#: ../../include/text.php:1106
msgid "rebuffed"
msgstr ""
-#: ../../include/text.php:1137
+#: ../../include/text.php:1118
msgid "happy"
msgstr ""
-#: ../../include/text.php:1138
+#: ../../include/text.php:1119
msgid "sad"
msgstr ""
-#: ../../include/text.php:1139
+#: ../../include/text.php:1120
msgid "mellow"
msgstr ""
-#: ../../include/text.php:1140
+#: ../../include/text.php:1121
msgid "tired"
msgstr ""
-#: ../../include/text.php:1141
+#: ../../include/text.php:1122
msgid "perky"
msgstr ""
-#: ../../include/text.php:1142
+#: ../../include/text.php:1123
msgid "angry"
msgstr ""
-#: ../../include/text.php:1143
+#: ../../include/text.php:1124
msgid "stupefied"
msgstr ""
-#: ../../include/text.php:1144
+#: ../../include/text.php:1125
msgid "puzzled"
msgstr ""
-#: ../../include/text.php:1145
+#: ../../include/text.php:1126
msgid "interested"
msgstr ""
-#: ../../include/text.php:1146
+#: ../../include/text.php:1127
msgid "bitter"
msgstr ""
-#: ../../include/text.php:1147
+#: ../../include/text.php:1128
msgid "cheerful"
msgstr ""
-#: ../../include/text.php:1148
+#: ../../include/text.php:1129
msgid "alive"
msgstr ""
-#: ../../include/text.php:1149
+#: ../../include/text.php:1130
msgid "annoyed"
msgstr ""
-#: ../../include/text.php:1150
+#: ../../include/text.php:1131
msgid "anxious"
msgstr ""
-#: ../../include/text.php:1151
+#: ../../include/text.php:1132
msgid "cranky"
msgstr ""
-#: ../../include/text.php:1152
+#: ../../include/text.php:1133
msgid "disturbed"
msgstr ""
-#: ../../include/text.php:1153
+#: ../../include/text.php:1134
msgid "frustrated"
msgstr ""
-#: ../../include/text.php:1154
+#: ../../include/text.php:1135
msgid "depressed"
msgstr ""
-#: ../../include/text.php:1155
+#: ../../include/text.php:1136
msgid "motivated"
msgstr ""
-#: ../../include/text.php:1156
+#: ../../include/text.php:1137
msgid "relaxed"
msgstr ""
-#: ../../include/text.php:1157
+#: ../../include/text.php:1138
msgid "surprised"
msgstr ""
-#: ../../include/text.php:1335 ../../include/js_strings.php:70
+#: ../../include/text.php:1312 ../../include/js_strings.php:70
msgid "Monday"
msgstr ""
-#: ../../include/text.php:1335 ../../include/js_strings.php:71
+#: ../../include/text.php:1312 ../../include/js_strings.php:71
msgid "Tuesday"
msgstr ""
-#: ../../include/text.php:1335 ../../include/js_strings.php:72
+#: ../../include/text.php:1312 ../../include/js_strings.php:72
msgid "Wednesday"
msgstr ""
-#: ../../include/text.php:1335 ../../include/js_strings.php:73
+#: ../../include/text.php:1312 ../../include/js_strings.php:73
msgid "Thursday"
msgstr ""
-#: ../../include/text.php:1335 ../../include/js_strings.php:74
+#: ../../include/text.php:1312 ../../include/js_strings.php:74
msgid "Friday"
msgstr ""
-#: ../../include/text.php:1335 ../../include/js_strings.php:75
+#: ../../include/text.php:1312 ../../include/js_strings.php:75
msgid "Saturday"
msgstr ""
-#: ../../include/text.php:1335 ../../include/js_strings.php:69
+#: ../../include/text.php:1312 ../../include/js_strings.php:69
msgid "Sunday"
msgstr ""
-#: ../../include/text.php:1339 ../../include/js_strings.php:45
+#: ../../include/text.php:1316 ../../include/js_strings.php:45
msgid "January"
msgstr ""
-#: ../../include/text.php:1339 ../../include/js_strings.php:46
+#: ../../include/text.php:1316 ../../include/js_strings.php:46
msgid "February"
msgstr ""
-#: ../../include/text.php:1339 ../../include/js_strings.php:47
+#: ../../include/text.php:1316 ../../include/js_strings.php:47
msgid "March"
msgstr ""
-#: ../../include/text.php:1339 ../../include/js_strings.php:48
+#: ../../include/text.php:1316 ../../include/js_strings.php:48
msgid "April"
msgstr ""
-#: ../../include/text.php:1339
+#: ../../include/text.php:1316
msgid "May"
msgstr ""
-#: ../../include/text.php:1339 ../../include/js_strings.php:50
+#: ../../include/text.php:1316 ../../include/js_strings.php:50
msgid "June"
msgstr ""
-#: ../../include/text.php:1339 ../../include/js_strings.php:51
+#: ../../include/text.php:1316 ../../include/js_strings.php:51
msgid "July"
msgstr ""
-#: ../../include/text.php:1339 ../../include/js_strings.php:52
+#: ../../include/text.php:1316 ../../include/js_strings.php:52
msgid "August"
msgstr ""
-#: ../../include/text.php:1339 ../../include/js_strings.php:53
+#: ../../include/text.php:1316 ../../include/js_strings.php:53
msgid "September"
msgstr ""
-#: ../../include/text.php:1339 ../../include/js_strings.php:54
+#: ../../include/text.php:1316 ../../include/js_strings.php:54
msgid "October"
msgstr ""
-#: ../../include/text.php:1339 ../../include/js_strings.php:55
+#: ../../include/text.php:1316 ../../include/js_strings.php:55
msgid "November"
msgstr ""
-#: ../../include/text.php:1339 ../../include/js_strings.php:56
+#: ../../include/text.php:1316 ../../include/js_strings.php:56
msgid "December"
msgstr ""
-#: ../../include/text.php:1403 ../../include/text.php:1407
+#: ../../include/text.php:1380 ../../include/text.php:1384
msgid "Unknown Attachment"
msgstr ""
-#: ../../include/text.php:1409
+#: ../../include/text.php:1386 ../../include/feedutils.php:780
msgid "unknown"
msgstr ""
-#: ../../include/text.php:1445
+#: ../../include/text.php:1422
msgid "remove category"
msgstr ""
-#: ../../include/text.php:1519
+#: ../../include/text.php:1496
msgid "remove from file"
msgstr ""
-#: ../../include/text.php:1781 ../../include/language.php:367
+#: ../../include/text.php:1615 ../../include/message.php:12
+msgid "Download binary/encrypted content"
+msgstr ""
+
+#: ../../include/text.php:1774 ../../include/language.php:367
msgid "default"
msgstr ""
-#: ../../include/text.php:1789
+#: ../../include/text.php:1782
msgid "Page layout"
msgstr ""
-#: ../../include/text.php:1789
+#: ../../include/text.php:1782
msgid "You can create your own with the layouts tool"
msgstr ""
-#: ../../include/text.php:1817
+#: ../../include/text.php:1810
msgid "Page content type"
msgstr ""
-#: ../../include/text.php:1950
+#: ../../include/text.php:1943
msgid "activity"
msgstr ""
-#: ../../include/text.php:2264
+#: ../../include/text.php:2006
+msgid "a-z, 0-9, -, _, and . only"
+msgstr ""
+
+#: ../../include/text.php:2277
msgid "Design Tools"
msgstr ""
-#: ../../include/text.php:2270
+#: ../../include/text.php:2283
msgid "Pages"
msgstr ""
-#: ../../include/text.php:2292
+#: ../../include/text.php:2305
msgid "Import website..."
msgstr ""
-#: ../../include/text.php:2293
+#: ../../include/text.php:2306
msgid "Select folder to import"
msgstr ""
-#: ../../include/text.php:2294
+#: ../../include/text.php:2307
msgid "Import from a zipped folder:"
msgstr ""
-#: ../../include/text.php:2295
+#: ../../include/text.php:2308
msgid "Import from cloud files:"
msgstr ""
-#: ../../include/text.php:2296
+#: ../../include/text.php:2309
msgid "/cloud/channel/path/to/folder"
msgstr ""
-#: ../../include/text.php:2297
+#: ../../include/text.php:2310
msgid "Enter path to website files"
msgstr ""
-#: ../../include/text.php:2298
+#: ../../include/text.php:2311
msgid "Select folder"
msgstr ""
-#: ../../include/text.php:2299
+#: ../../include/text.php:2312
msgid "Export website..."
msgstr ""
-#: ../../include/text.php:2300
+#: ../../include/text.php:2313
msgid "Export to a zip file"
msgstr ""
-#: ../../include/text.php:2301
+#: ../../include/text.php:2314
msgid "website.zip"
msgstr ""
-#: ../../include/text.php:2302
+#: ../../include/text.php:2315
msgid "Enter a name for the zip file."
msgstr ""
-#: ../../include/text.php:2303
+#: ../../include/text.php:2316
msgid "Export to cloud files"
msgstr ""
-#: ../../include/text.php:2304
+#: ../../include/text.php:2317
msgid "/path/to/export/folder"
msgstr ""
-#: ../../include/text.php:2305
+#: ../../include/text.php:2318
msgid "Enter a path to a cloud files destination."
msgstr ""
-#: ../../include/text.php:2306
+#: ../../include/text.php:2319
msgid "Specify folder"
msgstr ""
@@ -11743,27 +11740,9 @@ msgstr[1] ""
msgid "show more"
msgstr ""
-#: ../../include/markdown.php:444
-msgid "Attachments:"
-msgstr ""
-
-#: ../../include/markdown.php:538 ../../include/event.php:22
-#: ../../include/event.php:69
-msgid "l F d, Y \\@ g:i A"
-msgstr ""
-
-#: ../../include/markdown.php:540
-msgid "$Projectname event notification:"
-msgstr ""
-
-#: ../../include/markdown.php:544 ../../include/event.php:30
-#: ../../include/event.php:73
-msgid "Starts:"
-msgstr ""
-
-#: ../../include/markdown.php:552 ../../include/event.php:40
-#: ../../include/event.php:77
-msgid "Finishes:"
+#: ../../include/markdown.php:139 ../../include/bbcode.php:332
+#, php-format
+msgid "%1$s wrote the following %2$s %3$s"
msgstr ""
#: ../../include/follow.php:26
@@ -11790,7 +11769,7 @@ msgstr ""
msgid "Channel discovery failed."
msgstr ""
-#: ../../include/follow.php:202
+#: ../../include/follow.php:186
msgid "Cannot connect to yourself."
msgstr ""
@@ -12041,19 +12020,19 @@ msgctxt "calendar"
msgid "All day"
msgstr ""
-#: ../../include/message.php:30
+#: ../../include/message.php:40
msgid "Unable to determine sender."
msgstr ""
-#: ../../include/message.php:69
+#: ../../include/message.php:79
msgid "No recipient provided."
msgstr ""
-#: ../../include/message.php:74
+#: ../../include/message.php:84
msgid "[no subject]"
msgstr ""
-#: ../../include/message.php:227
+#: ../../include/message.php:214
msgid "Stored post could not be verified."
msgstr ""
@@ -12096,49 +12075,49 @@ msgstr ""
msgid "Cannot locate file to revise/update"
msgstr ""
-#: ../../include/attach.php:671
+#: ../../include/attach.php:673
#, php-format
msgid "File exceeds size limit of %d"
msgstr ""
-#: ../../include/attach.php:685
+#: ../../include/attach.php:687
#, php-format
msgid "You have reached your limit of %1$.0f Mbytes attachment storage."
msgstr ""
-#: ../../include/attach.php:855
+#: ../../include/attach.php:857
msgid "File upload failed. Possible system limit or action terminated."
msgstr ""
-#: ../../include/attach.php:868
+#: ../../include/attach.php:870
msgid "Stored file could not be verified. Upload failed."
msgstr ""
-#: ../../include/attach.php:923 ../../include/attach.php:939
+#: ../../include/attach.php:925 ../../include/attach.php:941
msgid "Path not available."
msgstr ""
-#: ../../include/attach.php:988 ../../include/attach.php:1153
+#: ../../include/attach.php:990 ../../include/attach.php:1155
msgid "Empty pathname"
msgstr ""
-#: ../../include/attach.php:1014
+#: ../../include/attach.php:1016
msgid "duplicate filename or path"
msgstr ""
-#: ../../include/attach.php:1039
+#: ../../include/attach.php:1041
msgid "Path not found."
msgstr ""
-#: ../../include/attach.php:1107
+#: ../../include/attach.php:1109
msgid "mkdir failed."
msgstr ""
-#: ../../include/attach.php:1111
+#: ../../include/attach.php:1113
msgid "database storage failed."
msgstr ""
-#: ../../include/attach.php:1159
+#: ../../include/attach.php:1161
msgid "Empty path"
msgstr ""
@@ -12146,77 +12125,77 @@ msgstr ""
msgid "guest:"
msgstr ""
-#: ../../include/security.php:532
+#: ../../include/security.php:531
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 ""
-#: ../../include/items.php:869 ../../include/items.php:916
+#: ../../include/items.php:851 ../../include/items.php:903
msgid "(Unknown)"
msgstr ""
-#: ../../include/items.php:1110
+#: ../../include/items.php:1087
msgid "Visible to anybody on the internet."
msgstr ""
-#: ../../include/items.php:1112
+#: ../../include/items.php:1089
msgid "Visible to you only."
msgstr ""
-#: ../../include/items.php:1114
+#: ../../include/items.php:1091
msgid "Visible to anybody in this network."
msgstr ""
-#: ../../include/items.php:1116
+#: ../../include/items.php:1093
msgid "Visible to anybody authenticated."
msgstr ""
-#: ../../include/items.php:1118
+#: ../../include/items.php:1095
#, php-format
msgid "Visible to anybody on %s."
msgstr ""
-#: ../../include/items.php:1120
+#: ../../include/items.php:1097
msgid "Visible to all connections."
msgstr ""
-#: ../../include/items.php:1122
+#: ../../include/items.php:1099
msgid "Visible to approved connections."
msgstr ""
-#: ../../include/items.php:1124
+#: ../../include/items.php:1101
msgid "Visible to specific connections."
msgstr ""
-#: ../../include/items.php:3938
+#: ../../include/items.php:3908
msgid "Privacy group is empty."
msgstr ""
-#: ../../include/items.php:3945
+#: ../../include/items.php:3915
#, php-format
msgid "Privacy group: %s"
msgstr ""
-#: ../../include/items.php:3957
+#: ../../include/items.php:3927
msgid "Connection not found."
msgstr ""
-#: ../../include/items.php:4310
+#: ../../include/items.php:4280
msgid "profile photo"
msgstr ""
-#: ../../include/items.php:4506
+#: ../../include/items.php:4473
#, php-format
msgid "[Edited %s]"
msgstr ""
-#: ../../include/items.php:4506
+#: ../../include/items.php:4473
msgctxt "edit_activity"
msgid "Post"
msgstr ""
-#: ../../include/items.php:4506
+#: ../../include/items.php:4473
msgctxt "edit_activity"
msgid "Comment"
msgstr ""
@@ -12225,229 +12204,253 @@ msgstr ""
msgid "Unable to obtain identity information from database"
msgstr ""
-#: ../../include/channel.php:67
+#: ../../include/channel.php:68
msgid "Empty name"
msgstr ""
-#: ../../include/channel.php:70
+#: ../../include/channel.php:71
msgid "Name too long"
msgstr ""
-#: ../../include/channel.php:181
+#: ../../include/channel.php:182
msgid "No account identifier"
msgstr ""
-#: ../../include/channel.php:193
+#: ../../include/channel.php:194
msgid "Nickname is required."
msgstr ""
-#: ../../include/channel.php:207
+#: ../../include/channel.php:208
msgid "Reserved nickname. Please choose another."
msgstr ""
-#: ../../include/channel.php:212
+#: ../../include/channel.php:213
msgid ""
"Nickname has unsupported characters or is already being used on this site."
msgstr ""
-#: ../../include/channel.php:270
+#: ../../include/channel.php:272
msgid "Unable to retrieve created identity"
msgstr ""
-#: ../../include/channel.php:342
+#: ../../include/channel.php:344
msgid "Default Profile"
msgstr ""
-#: ../../include/channel.php:1045
+#: ../../include/channel.php:1060
msgid "Create New Profile"
msgstr ""
-#: ../../include/channel.php:1065
+#: ../../include/channel.php:1080
msgid "Visible to everybody"
msgstr ""
-#: ../../include/channel.php:1138 ../../include/channel.php:1252
+#: ../../include/channel.php:1153 ../../include/channel.php:1273
msgid "Gender:"
msgstr ""
-#: ../../include/channel.php:1140 ../../include/channel.php:1307
+#: ../../include/channel.php:1155 ../../include/channel.php:1328
msgid "Homepage:"
msgstr ""
-#: ../../include/channel.php:1141
+#: ../../include/channel.php:1156
msgid "Online Now"
msgstr ""
-#: ../../include/channel.php:1257
+#: ../../include/channel.php:1232
+msgid "Trans"
+msgstr ""
+
+#: ../../include/channel.php:1278
msgid "Like this channel"
msgstr ""
-#: ../../include/channel.php:1281
+#: ../../include/channel.php:1302
msgid "j F, Y"
msgstr ""
-#: ../../include/channel.php:1282
+#: ../../include/channel.php:1303
msgid "j F"
msgstr ""
-#: ../../include/channel.php:1289
+#: ../../include/channel.php:1310
msgid "Birthday:"
msgstr ""
-#: ../../include/channel.php:1302
+#: ../../include/channel.php:1323
#, php-format
msgid "for %1$d %2$s"
msgstr ""
-#: ../../include/channel.php:1305
+#: ../../include/channel.php:1326
msgid "Sexual Preference:"
msgstr ""
-#: ../../include/channel.php:1311
+#: ../../include/channel.php:1332
msgid "Tags:"
msgstr ""
-#: ../../include/channel.php:1313
+#: ../../include/channel.php:1334
msgid "Political Views:"
msgstr ""
-#: ../../include/channel.php:1315
+#: ../../include/channel.php:1336
msgid "Religion:"
msgstr ""
-#: ../../include/channel.php:1319
+#: ../../include/channel.php:1340
msgid "Hobbies/Interests:"
msgstr ""
-#: ../../include/channel.php:1321
+#: ../../include/channel.php:1342
msgid "Likes:"
msgstr ""
-#: ../../include/channel.php:1323
+#: ../../include/channel.php:1344
msgid "Dislikes:"
msgstr ""
-#: ../../include/channel.php:1325
+#: ../../include/channel.php:1346
msgid "Contact information and Social Networks:"
msgstr ""
-#: ../../include/channel.php:1327
+#: ../../include/channel.php:1348
msgid "My other channels:"
msgstr ""
-#: ../../include/channel.php:1329
+#: ../../include/channel.php:1350
msgid "Musical interests:"
msgstr ""
-#: ../../include/channel.php:1331
+#: ../../include/channel.php:1352
msgid "Books, literature:"
msgstr ""
-#: ../../include/channel.php:1333
+#: ../../include/channel.php:1354
msgid "Television:"
msgstr ""
-#: ../../include/channel.php:1335
+#: ../../include/channel.php:1356
msgid "Film/dance/culture/entertainment:"
msgstr ""
-#: ../../include/channel.php:1337
+#: ../../include/channel.php:1358
msgid "Love/Romance:"
msgstr ""
-#: ../../include/channel.php:1339
+#: ../../include/channel.php:1360
msgid "Work/employment:"
msgstr ""
-#: ../../include/channel.php:1341
+#: ../../include/channel.php:1362
msgid "School/education:"
msgstr ""
-#: ../../include/channel.php:1364
+#: ../../include/channel.php:1385
msgid "Like this thing"
msgstr ""
-#: ../../include/channel.php:2139
+#: ../../include/channel.php:2154
#, php-format
msgid "User '%s' deleted"
msgstr ""
-#: ../../include/event.php:1004
+#: ../../include/event.php:22 ../../include/event.php:69
+msgid "l F d, Y \\@ g:i A"
+msgstr ""
+
+#: ../../include/event.php:30 ../../include/event.php:73
+msgid "Starts:"
+msgstr ""
+
+#: ../../include/event.php:40 ../../include/event.php:77
+msgid "Finishes:"
+msgstr ""
+
+#: ../../include/event.php:1008
msgid "This event has been added to your calendar."
msgstr ""
-#: ../../include/event.php:1204
+#: ../../include/event.php:1208
msgid "Not specified"
msgstr ""
-#: ../../include/event.php:1205
+#: ../../include/event.php:1209
msgid "Needs Action"
msgstr ""
-#: ../../include/event.php:1206
+#: ../../include/event.php:1210
msgid "Completed"
msgstr ""
-#: ../../include/event.php:1207
+#: ../../include/event.php:1211
msgid "In Process"
msgstr ""
-#: ../../include/event.php:1208
+#: ../../include/event.php:1212
msgid "Cancelled"
msgstr ""
-#: ../../include/network.php:776
-msgid "view full size"
+#: ../../include/event.php:1292 ../../include/connections.php:676
+msgid "Home, Voice"
+msgstr ""
+
+#: ../../include/event.php:1293 ../../include/connections.php:677
+msgid "Home, Fax"
+msgstr ""
+
+#: ../../include/event.php:1295 ../../include/connections.php:679
+msgid "Work, Voice"
+msgstr ""
+
+#: ../../include/event.php:1296 ../../include/connections.php:680
+msgid "Work, Fax"
msgstr ""
-#: ../../include/network.php:2042
-msgid "No Subject"
+#: ../../include/network.php:751
+msgid "view full size"
msgstr ""
-#: ../../include/network.php:2310 ../../include/network.php:2311
+#: ../../include/network.php:1691 ../../include/network.php:1692
msgid "Friendica"
msgstr ""
-#: ../../include/network.php:2312
+#: ../../include/network.php:1693
msgid "OStatus"
msgstr ""
-#: ../../include/network.php:2313
+#: ../../include/network.php:1694
msgid "GNU-Social"
msgstr ""
-#: ../../include/network.php:2314
+#: ../../include/network.php:1695
msgid "RSS/Atom"
msgstr ""
-#: ../../include/network.php:2316
+#: ../../include/network.php:1697
msgid "Diaspora"
msgstr ""
-#: ../../include/network.php:2317
+#: ../../include/network.php:1698
msgid "Facebook"
msgstr ""
-#: ../../include/network.php:2318
+#: ../../include/network.php:1699
msgid "Zot"
msgstr ""
-#: ../../include/network.php:2319
+#: ../../include/network.php:1700
msgid "LinkedIn"
msgstr ""
-#: ../../include/network.php:2320
+#: ../../include/network.php:1701
msgid "XMPP/IM"
msgstr ""
-#: ../../include/network.php:2321
+#: ../../include/network.php:1702
msgid "MySpace"
msgstr ""
-#: ../../include/page_widgets.php:7
-msgid "New Page"
-msgstr ""
-
#: ../../include/language.php:380
msgid "Select an alternate language"
msgstr ""
@@ -12481,404 +12484,399 @@ msgid ""
"permissions set who is allowed to view the post."
msgstr ""
-#: ../../include/dba/dba_driver.php:189
+#: ../../include/dba/dba_driver.php:190
#, php-format
msgid "Cannot locate DNS info for database server '%s'"
msgstr ""
-#: ../../include/bbcode.php:134 ../../include/bbcode.php:1040
-#: ../../include/bbcode.php:1043 ../../include/bbcode.php:1048
-#: ../../include/bbcode.php:1051 ../../include/bbcode.php:1054
-#: ../../include/bbcode.php:1057 ../../include/bbcode.php:1062
-#: ../../include/bbcode.php:1065 ../../include/bbcode.php:1070
-#: ../../include/bbcode.php:1073 ../../include/bbcode.php:1076
-#: ../../include/bbcode.php:1079
+#: ../../include/bbcode.php:194 ../../include/bbcode.php:1097
+#: ../../include/bbcode.php:1100 ../../include/bbcode.php:1105
+#: ../../include/bbcode.php:1108 ../../include/bbcode.php:1111
+#: ../../include/bbcode.php:1114 ../../include/bbcode.php:1119
+#: ../../include/bbcode.php:1122 ../../include/bbcode.php:1127
+#: ../../include/bbcode.php:1130 ../../include/bbcode.php:1133
+#: ../../include/bbcode.php:1136
msgid "Image/photo"
msgstr ""
-#: ../../include/bbcode.php:173 ../../include/bbcode.php:1090
+#: ../../include/bbcode.php:233 ../../include/bbcode.php:1147
msgid "Encrypted content"
msgstr ""
-#: ../../include/bbcode.php:189
+#: ../../include/bbcode.php:249
#, php-format
msgid "Install %s element: "
msgstr ""
-#: ../../include/bbcode.php:193
+#: ../../include/bbcode.php:253
#, php-format
msgid ""
"This post contains an installable %s element, however you lack permissions "
"to install it on this site."
msgstr ""
-#: ../../include/bbcode.php:272
-#, php-format
-msgid "%1$s wrote the following %2$s %3$s"
-msgstr ""
-
-#: ../../include/bbcode.php:349 ../../include/bbcode.php:357
+#: ../../include/bbcode.php:409 ../../include/bbcode.php:417
msgid "Click to open/close"
msgstr ""
-#: ../../include/bbcode.php:357
+#: ../../include/bbcode.php:417
msgid "spoiler"
msgstr ""
-#: ../../include/bbcode.php:1028
+#: ../../include/bbcode.php:1085
msgid "$1 wrote:"
msgstr ""
-#: ../../include/oembed.php:315
+#: ../../include/oembed.php:317
msgid " by "
msgstr ""
-#: ../../include/oembed.php:316
+#: ../../include/oembed.php:318
msgid " on "
msgstr ""
-#: ../../include/oembed.php:345
+#: ../../include/oembed.php:347
msgid "Embedded content"
msgstr ""
-#: ../../include/oembed.php:354
+#: ../../include/oembed.php:356
msgid "Embedding disabled"
msgstr ""
-#: ../../include/features.php:58
+#: ../../include/features.php:54
msgid "General Features"
msgstr ""
-#: ../../include/features.php:63
+#: ../../include/features.php:59
msgid "Multiple Profiles"
msgstr ""
-#: ../../include/features.php:64
+#: ../../include/features.php:60
msgid "Ability to create multiple profiles"
msgstr ""
-#: ../../include/features.php:72
+#: ../../include/features.php:68
msgid "Advanced Profiles"
msgstr ""
-#: ../../include/features.php:73
+#: ../../include/features.php:69
msgid "Additional profile sections and selections"
msgstr ""
-#: ../../include/features.php:81
+#: ../../include/features.php:77
msgid "Profile Import/Export"
msgstr ""
-#: ../../include/features.php:82
+#: ../../include/features.php:78
msgid "Save and load profile details across sites/channels"
msgstr ""
-#: ../../include/features.php:90
+#: ../../include/features.php:86
msgid "Web Pages"
msgstr ""
-#: ../../include/features.php:91
+#: ../../include/features.php:87
msgid "Provide managed web pages on your channel"
msgstr ""
-#: ../../include/features.php:100
+#: ../../include/features.php:96
msgid "Provide a wiki for your channel"
msgstr ""
-#: ../../include/features.php:117
+#: ../../include/features.php:113
msgid "Private Notes"
msgstr ""
-#: ../../include/features.php:118
+#: ../../include/features.php:114
msgid "Enables a tool to store notes and reminders (note: not encrypted)"
msgstr ""
-#: ../../include/features.php:126
+#: ../../include/features.php:122
msgid "Navigation Channel Select"
msgstr ""
-#: ../../include/features.php:127
+#: ../../include/features.php:123
msgid "Change channels directly from within the navigation dropdown menu"
msgstr ""
-#: ../../include/features.php:135
+#: ../../include/features.php:131
msgid "Photo Location"
msgstr ""
-#: ../../include/features.php:136
+#: ../../include/features.php:132
msgid "If location data is available on uploaded photos, link this to a map."
msgstr ""
-#: ../../include/features.php:144
+#: ../../include/features.php:140
msgid "Access Controlled Chatrooms"
msgstr ""
-#: ../../include/features.php:145
+#: ../../include/features.php:141
msgid "Provide chatrooms and chat services with access control."
msgstr ""
-#: ../../include/features.php:154
+#: ../../include/features.php:150
msgid "Provide alternate connection permission roles."
msgstr ""
-#: ../../include/features.php:162
+#: ../../include/features.php:158
msgid "Smart Birthdays"
msgstr ""
-#: ../../include/features.php:163
+#: ../../include/features.php:159
msgid ""
"Make birthday events timezone aware in case your friends are scattered "
"across the planet."
msgstr ""
-#: ../../include/features.php:171
+#: ../../include/features.php:167
msgid "Event Timezone Selection"
msgstr ""
-#: ../../include/features.php:172
+#: ../../include/features.php:168
msgid "Allow event creation in timezones other than your own."
msgstr ""
-#: ../../include/features.php:180
+#: ../../include/features.php:176
msgid "Advanced Directory Search"
msgstr ""
-#: ../../include/features.php:181
+#: ../../include/features.php:177
msgid "Allows creation of complex directory search queries"
msgstr ""
-#: ../../include/features.php:189
+#: ../../include/features.php:185
msgid "Advanced Theme and Layout Settings"
msgstr ""
-#: ../../include/features.php:190
+#: ../../include/features.php:186
msgid "Allows fine tuning of themes and page layouts"
msgstr ""
-#: ../../include/features.php:200
+#: ../../include/features.php:196
msgid "Post Composition Features"
msgstr ""
-#: ../../include/features.php:204
+#: ../../include/features.php:200
msgid "Large Photos"
msgstr ""
-#: ../../include/features.php:205
+#: ../../include/features.php:201
msgid ""
"Include large (1024px) photo thumbnails in posts. If not enabled, use small "
"(640px) photo thumbnails"
msgstr ""
-#: ../../include/features.php:214
+#: ../../include/features.php:210
msgid "Automatically import channel content from other channels or feeds"
msgstr ""
-#: ../../include/features.php:222
+#: ../../include/features.php:218
msgid "Even More Encryption"
msgstr ""
-#: ../../include/features.php:223
+#: ../../include/features.php:219
msgid ""
"Allow optional encryption of content end-to-end with a shared secret key"
msgstr ""
-#: ../../include/features.php:231
+#: ../../include/features.php:227
msgid "Enable Voting Tools"
msgstr ""
-#: ../../include/features.php:232
+#: ../../include/features.php:228
msgid "Provide a class of post which others can vote on"
msgstr ""
-#: ../../include/features.php:240
+#: ../../include/features.php:236
msgid "Disable Comments"
msgstr ""
-#: ../../include/features.php:241
+#: ../../include/features.php:237
msgid "Provide the option to disable comments for a post"
msgstr ""
-#: ../../include/features.php:249
+#: ../../include/features.php:245
msgid "Delayed Posting"
msgstr ""
-#: ../../include/features.php:250
+#: ../../include/features.php:246
msgid "Allow posts to be published at a later date"
msgstr ""
-#: ../../include/features.php:258
+#: ../../include/features.php:254
msgid "Content Expiration"
msgstr ""
-#: ../../include/features.php:259
+#: ../../include/features.php:255
msgid "Remove posts/comments and/or private messages at a future time"
msgstr ""
-#: ../../include/features.php:267
+#: ../../include/features.php:263
msgid "Suppress Duplicate Posts/Comments"
msgstr ""
-#: ../../include/features.php:268
+#: ../../include/features.php:264
msgid ""
"Prevent posts with identical content to be published with less than two "
"minutes in between submissions."
msgstr ""
-#: ../../include/features.php:279
+#: ../../include/features.php:275
msgid "Network and Stream Filtering"
msgstr ""
-#: ../../include/features.php:283
+#: ../../include/features.php:279
msgid "Search by Date"
msgstr ""
-#: ../../include/features.php:284
+#: ../../include/features.php:280
msgid "Ability to select posts by date ranges"
msgstr ""
-#: ../../include/features.php:292 ../../include/group.php:331
+#: ../../include/features.php:288 ../../include/group.php:332
msgid "Privacy Groups"
msgstr ""
-#: ../../include/features.php:293
+#: ../../include/features.php:289
msgid "Enable management and selection of privacy groups"
msgstr ""
-#: ../../include/features.php:302
+#: ../../include/features.php:298
msgid "Save search terms for re-use"
msgstr ""
-#: ../../include/features.php:310
+#: ../../include/features.php:306
msgid "Network Personal Tab"
msgstr ""
-#: ../../include/features.php:311
+#: ../../include/features.php:307
msgid "Enable tab to display only Network posts that you've interacted on"
msgstr ""
-#: ../../include/features.php:319
+#: ../../include/features.php:315
msgid "Network New Tab"
msgstr ""
-#: ../../include/features.php:320
+#: ../../include/features.php:316
msgid "Enable tab to display all new Network activity"
msgstr ""
-#: ../../include/features.php:328
+#: ../../include/features.php:324
msgid "Affinity Tool"
msgstr ""
-#: ../../include/features.php:329
+#: ../../include/features.php:325
msgid "Filter stream activity by depth of relationships"
msgstr ""
-#: ../../include/features.php:338
+#: ../../include/features.php:334
msgid "Show friend and connection suggestions"
msgstr ""
-#: ../../include/features.php:346
+#: ../../include/features.php:342
msgid "Connection Filtering"
msgstr ""
-#: ../../include/features.php:347
+#: ../../include/features.php:343
msgid "Filter incoming posts from connections based on keywords/content"
msgstr ""
-#: ../../include/features.php:359
+#: ../../include/features.php:355
msgid "Post/Comment Tools"
msgstr ""
-#: ../../include/features.php:363
+#: ../../include/features.php:359
msgid "Community Tagging"
msgstr ""
-#: ../../include/features.php:364
+#: ../../include/features.php:360
msgid "Ability to tag existing posts"
msgstr ""
-#: ../../include/features.php:372
+#: ../../include/features.php:368
msgid "Post Categories"
msgstr ""
-#: ../../include/features.php:373
+#: ../../include/features.php:369
msgid "Add categories to your posts"
msgstr ""
-#: ../../include/features.php:381
+#: ../../include/features.php:377
msgid "Emoji Reactions"
msgstr ""
-#: ../../include/features.php:382
+#: ../../include/features.php:378
msgid "Add emoji reaction ability to posts"
msgstr ""
-#: ../../include/features.php:391
+#: ../../include/features.php:387
msgid "Ability to file posts under folders"
msgstr ""
-#: ../../include/features.php:399
+#: ../../include/features.php:395
msgid "Dislike Posts"
msgstr ""
-#: ../../include/features.php:400
+#: ../../include/features.php:396
msgid "Ability to dislike posts/comments"
msgstr ""
-#: ../../include/features.php:408
+#: ../../include/features.php:404
msgid "Star Posts"
msgstr ""
-#: ../../include/features.php:409
+#: ../../include/features.php:405
msgid "Ability to mark special posts with a star indicator"
msgstr ""
-#: ../../include/features.php:417
+#: ../../include/features.php:413
msgid "Tag Cloud"
msgstr ""
-#: ../../include/features.php:418
+#: ../../include/features.php:414
msgid "Provide a personal tag cloud on your channel page"
msgstr ""
-#: ../../include/features.php:430
+#: ../../include/features.php:425
msgid "Premium Channel"
msgstr ""
-#: ../../include/features.php:431
+#: ../../include/features.php:426
msgid ""
"Allows you to set restrictions and terms on those that connect with your "
"channel"
msgstr ""
-#: ../../include/taxonomy.php:228 ../../include/taxonomy.php:249
+#: ../../include/taxonomy.php:267 ../../include/taxonomy.php:288
msgid "Tags"
msgstr ""
-#: ../../include/taxonomy.php:293
+#: ../../include/taxonomy.php:332
msgid "Keywords"
msgstr ""
-#: ../../include/taxonomy.php:314
+#: ../../include/taxonomy.php:353
msgid "have"
msgstr ""
-#: ../../include/taxonomy.php:314
+#: ../../include/taxonomy.php:353
msgid "has"
msgstr ""
-#: ../../include/taxonomy.php:315
+#: ../../include/taxonomy.php:354
msgid "want"
msgstr ""
-#: ../../include/taxonomy.php:315
+#: ../../include/taxonomy.php:354
msgid "wants"
msgstr ""
-#: ../../include/taxonomy.php:316
+#: ../../include/taxonomy.php:355
msgid "likes"
msgstr ""
-#: ../../include/taxonomy.php:317
+#: ../../include/taxonomy.php:356
msgid "dislikes"
msgstr ""
@@ -12902,51 +12900,51 @@ msgstr ""
msgid "Invitation could not be verified."
msgstr ""
-#: ../../include/account.php:130
+#: ../../include/account.php:157
msgid "Please enter the required information."
msgstr ""
-#: ../../include/account.php:198
+#: ../../include/account.php:224
msgid "Failed to store account information."
msgstr ""
-#: ../../include/account.php:263
+#: ../../include/account.php:291
#, php-format
msgid "Registration confirmation for %s"
msgstr ""
-#: ../../include/account.php:330
+#: ../../include/account.php:360
#, php-format
msgid "Registration request at %s"
msgstr ""
-#: ../../include/account.php:352
+#: ../../include/account.php:382
msgid "your registration password"
msgstr ""
-#: ../../include/account.php:358 ../../include/account.php:420
+#: ../../include/account.php:388 ../../include/account.php:450
#, php-format
msgid "Registration details for %s"
msgstr ""
-#: ../../include/account.php:431
+#: ../../include/account.php:461
msgid "Account approved."
msgstr ""
-#: ../../include/account.php:471
+#: ../../include/account.php:501
#, php-format
msgid "Registration revoked for %s"
msgstr ""
-#: ../../include/account.php:756 ../../include/account.php:758
+#: ../../include/account.php:780 ../../include/account.php:782
msgid "Click here to upgrade."
msgstr ""
-#: ../../include/account.php:764
+#: ../../include/account.php:788
msgid "This action exceeds the limits set by your subscription plan."
msgstr ""
-#: ../../include/account.php:769
+#: ../../include/account.php:793
msgid "This action is not available under your subscription plan."
msgstr ""
@@ -13031,166 +13029,178 @@ msgstr ""
msgid "Happy Birthday %1$s"
msgstr ""
-#: ../../include/nav.php:92
+#: ../../include/nav.php:90
msgid "Remote authentication"
msgstr ""
-#: ../../include/nav.php:92
+#: ../../include/nav.php:90
msgid "Click to authenticate to your home hub"
msgstr ""
-#: ../../include/nav.php:103 ../../include/nav.php:127
+#: ../../include/nav.php:99 ../../include/nav.php:123
msgid "End this session"
msgstr ""
-#: ../../include/nav.php:106
+#: ../../include/nav.php:102
msgid "Your profile page"
msgstr ""
-#: ../../include/nav.php:109
+#: ../../include/nav.php:105
msgid "Manage/Edit profiles"
msgstr ""
-#: ../../include/nav.php:111
+#: ../../include/nav.php:107
msgid "Edit your profile"
msgstr ""
-#: ../../include/nav.php:117
+#: ../../include/nav.php:113
msgid "Sign in"
msgstr ""
-#: ../../include/nav.php:142
+#: ../../include/nav.php:138
msgid "Take me home"
msgstr ""
-#: ../../include/nav.php:144
+#: ../../include/nav.php:140
msgid "Log me out of this site"
msgstr ""
-#: ../../include/nav.php:149
+#: ../../include/nav.php:145
msgid "Create an account"
msgstr ""
-#: ../../include/nav.php:161
+#: ../../include/nav.php:157
msgid "Help and documentation"
msgstr ""
-#: ../../include/nav.php:164
+#: ../../include/nav.php:160
msgid "Search site @name, #tag, ?docs, content"
msgstr ""
-#: ../../include/nav.php:176
+#: ../../include/nav.php:171
msgid "Grid"
msgstr ""
-#: ../../include/nav.php:176
+#: ../../include/nav.php:171
msgid "Your grid"
msgstr ""
-#: ../../include/nav.php:177
+#: ../../include/nav.php:172
msgid "View your network/grid"
msgstr ""
-#: ../../include/nav.php:178
+#: ../../include/nav.php:173
msgid "Mark all grid notifications seen"
msgstr ""
-#: ../../include/nav.php:180
+#: ../../include/nav.php:175
msgid "Channel home"
msgstr ""
-#: ../../include/nav.php:181
+#: ../../include/nav.php:176
msgid "View your channel home"
msgstr ""
-#: ../../include/nav.php:182
+#: ../../include/nav.php:177
msgid "Mark all channel notifications seen"
msgstr ""
-#: ../../include/nav.php:188
+#: ../../include/nav.php:183
msgid "Notices"
msgstr ""
-#: ../../include/nav.php:188
+#: ../../include/nav.php:183
msgid "Notifications"
msgstr ""
-#: ../../include/nav.php:189
+#: ../../include/nav.php:184
msgid "View all notifications"
msgstr ""
-#: ../../include/nav.php:192
+#: ../../include/nav.php:185
+msgid "Mark all system notifications seen"
+msgstr ""
+
+#: ../../include/nav.php:187
msgid "Private mail"
msgstr ""
-#: ../../include/nav.php:193
+#: ../../include/nav.php:188
msgid "View your private messages"
msgstr ""
-#: ../../include/nav.php:194
+#: ../../include/nav.php:189
msgid "Mark all private messages seen"
msgstr ""
-#: ../../include/nav.php:200
+#: ../../include/nav.php:195
msgid "Event Calendar"
msgstr ""
-#: ../../include/nav.php:201
+#: ../../include/nav.php:196
msgid "View events"
msgstr ""
-#: ../../include/nav.php:202
+#: ../../include/nav.php:197
msgid "Mark all events seen"
msgstr ""
-#: ../../include/nav.php:205
+#: ../../include/nav.php:199
msgid "Manage Your Channels"
msgstr ""
-#: ../../include/nav.php:207
+#: ../../include/nav.php:201
msgid "Account/Channel Settings"
msgstr ""
-#: ../../include/nav.php:215
+#: ../../include/nav.php:209
msgid "Site Setup and Configuration"
msgstr ""
-#: ../../include/nav.php:277
+#: ../../include/nav.php:268
msgid "@name, #tag, ?doc, content"
msgstr ""
-#: ../../include/nav.php:278
+#: ../../include/nav.php:269
msgid "Please wait..."
msgstr ""
-#: ../../include/nav.php:280
+#: ../../include/nav.php:272
msgid "Add Apps"
msgstr ""
-#: ../../include/photos.php:115
+#: ../../include/nav.php:273
+msgid "Arrange Apps"
+msgstr ""
+
+#: ../../include/nav.php:274
+msgid "Toggle System Apps"
+msgstr ""
+
+#: ../../include/photos.php:111
#, php-format
msgid "Image exceeds website size limit of %lu bytes"
msgstr ""
-#: ../../include/photos.php:122
+#: ../../include/photos.php:118
msgid "Image file is empty."
msgstr ""
-#: ../../include/photos.php:261
+#: ../../include/photos.php:257
msgid "Photo storage failed."
msgstr ""
-#: ../../include/photos.php:301
+#: ../../include/photos.php:297
msgid "a new photo"
msgstr ""
-#: ../../include/photos.php:305
+#: ../../include/photos.php:301
#, php-format
msgctxt "photo_upload"
msgid "%1$s posted %2$s to %3$s"
msgstr ""
-#: ../../include/photos.php:533
+#: ../../include/photos.php:530
msgid "Upload New Photos"
msgstr ""
@@ -13202,12 +13212,12 @@ msgstr ""
msgid "Unable to verify channel signature"
msgstr ""
-#: ../../include/zot.php:2313
+#: ../../include/zot.php:2320
#, php-format
msgid "Unable to verify site signature for %s"
msgstr ""
-#: ../../include/zot.php:3764
+#: ../../include/zot.php:3780
msgid "invalid target signature"
msgstr ""
@@ -13222,27 +13232,27 @@ msgstr ""
msgid "Add new connections to this privacy group"
msgstr ""
-#: ../../include/group.php:309
+#: ../../include/group.php:310
msgid "edit"
msgstr ""
-#: ../../include/group.php:332
+#: ../../include/group.php:333
msgid "Edit group"
msgstr ""
-#: ../../include/group.php:333
+#: ../../include/group.php:334
msgid "Add privacy group"
msgstr ""
-#: ../../include/group.php:334
+#: ../../include/group.php:335
msgid "Channels not in any privacy group"
msgstr ""
-#: ../../include/connections.php:127
+#: ../../include/connections.php:128
msgid "New window"
msgstr ""
-#: ../../include/connections.php:128
+#: ../../include/connections.php:129
msgid "Open the selected location in a different window or browser tab"
msgstr ""
diff --git a/util/typo.php b/util/typo.php
index a8d363340..e25e57601 100644
--- a/util/typo.php
+++ b/util/typo.php
@@ -12,7 +12,6 @@
App::init();
-// $a = new App();
echo "Directory: include\n";
$files = glob('include/*.php');
diff --git a/vendor/bin/html-to-markdown b/vendor/bin/html-to-markdown
new file mode 120000
index 000000000..6f8d9d2b1
--- /dev/null
+++ b/vendor/bin/html-to-markdown
@@ -0,0 +1 @@
+../league/html-to-markdown/bin/html-to-markdown \ No newline at end of file
diff --git a/vendor/composer/autoload_classmap.php b/vendor/composer/autoload_classmap.php
index 5899fb9ed..f650246d3 100644
--- a/vendor/composer/autoload_classmap.php
+++ b/vendor/composer/autoload_classmap.php
@@ -241,9 +241,29 @@ return array(
'HTMLPurifier_VarParser_Native' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/VarParser/Native.php',
'HTMLPurifier_Zipper' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier/Zipper.php',
'Hubzilla\\Import\\Import' => $baseDir . '/include/Import/Importer.php',
- 'Markdownify\\Converter' => $vendorDir . '/pixel418/markdownify/src/Converter.php',
- 'Markdownify\\ConverterExtra' => $vendorDir . '/pixel418/markdownify/src/ConverterExtra.php',
- 'Markdownify\\Parser' => $vendorDir . '/pixel418/markdownify/src/Parser.php',
+ 'League\\HTMLToMarkdown\\Configuration' => $vendorDir . '/league/html-to-markdown/src/Configuration.php',
+ 'League\\HTMLToMarkdown\\ConfigurationAwareInterface' => $vendorDir . '/league/html-to-markdown/src/ConfigurationAwareInterface.php',
+ 'League\\HTMLToMarkdown\\Converter\\BlockquoteConverter' => $vendorDir . '/league/html-to-markdown/src/Converter/BlockquoteConverter.php',
+ 'League\\HTMLToMarkdown\\Converter\\CodeConverter' => $vendorDir . '/league/html-to-markdown/src/Converter/CodeConverter.php',
+ 'League\\HTMLToMarkdown\\Converter\\CommentConverter' => $vendorDir . '/league/html-to-markdown/src/Converter/CommentConverter.php',
+ 'League\\HTMLToMarkdown\\Converter\\ConverterInterface' => $vendorDir . '/league/html-to-markdown/src/Converter/ConverterInterface.php',
+ 'League\\HTMLToMarkdown\\Converter\\DefaultConverter' => $vendorDir . '/league/html-to-markdown/src/Converter/DefaultConverter.php',
+ 'League\\HTMLToMarkdown\\Converter\\DivConverter' => $vendorDir . '/league/html-to-markdown/src/Converter/DivConverter.php',
+ 'League\\HTMLToMarkdown\\Converter\\EmphasisConverter' => $vendorDir . '/league/html-to-markdown/src/Converter/EmphasisConverter.php',
+ 'League\\HTMLToMarkdown\\Converter\\HardBreakConverter' => $vendorDir . '/league/html-to-markdown/src/Converter/HardBreakConverter.php',
+ 'League\\HTMLToMarkdown\\Converter\\HeaderConverter' => $vendorDir . '/league/html-to-markdown/src/Converter/HeaderConverter.php',
+ 'League\\HTMLToMarkdown\\Converter\\HorizontalRuleConverter' => $vendorDir . '/league/html-to-markdown/src/Converter/HorizontalRuleConverter.php',
+ 'League\\HTMLToMarkdown\\Converter\\ImageConverter' => $vendorDir . '/league/html-to-markdown/src/Converter/ImageConverter.php',
+ 'League\\HTMLToMarkdown\\Converter\\LinkConverter' => $vendorDir . '/league/html-to-markdown/src/Converter/LinkConverter.php',
+ 'League\\HTMLToMarkdown\\Converter\\ListBlockConverter' => $vendorDir . '/league/html-to-markdown/src/Converter/ListBlockConverter.php',
+ 'League\\HTMLToMarkdown\\Converter\\ListItemConverter' => $vendorDir . '/league/html-to-markdown/src/Converter/ListItemConverter.php',
+ 'League\\HTMLToMarkdown\\Converter\\ParagraphConverter' => $vendorDir . '/league/html-to-markdown/src/Converter/ParagraphConverter.php',
+ 'League\\HTMLToMarkdown\\Converter\\PreformattedConverter' => $vendorDir . '/league/html-to-markdown/src/Converter/PreformattedConverter.php',
+ 'League\\HTMLToMarkdown\\Converter\\TextConverter' => $vendorDir . '/league/html-to-markdown/src/Converter/TextConverter.php',
+ 'League\\HTMLToMarkdown\\Element' => $vendorDir . '/league/html-to-markdown/src/Element.php',
+ 'League\\HTMLToMarkdown\\ElementInterface' => $vendorDir . '/league/html-to-markdown/src/ElementInterface.php',
+ 'League\\HTMLToMarkdown\\Environment' => $vendorDir . '/league/html-to-markdown/src/Environment.php',
+ 'League\\HTMLToMarkdown\\HtmlConverter' => $vendorDir . '/league/html-to-markdown/src/HtmlConverter.php',
'Michelf\\Markdown' => $vendorDir . '/michelf/php-markdown/Michelf/Markdown.php',
'Michelf\\MarkdownExtra' => $vendorDir . '/michelf/php-markdown/Michelf/MarkdownExtra.php',
'Michelf\\MarkdownInterface' => $vendorDir . '/michelf/php-markdown/Michelf/MarkdownInterface.php',
@@ -573,6 +593,7 @@ return array(
'Sabre\\HTTP\\URLUtil' => $vendorDir . '/sabre/http/lib/URLUtil.php',
'Sabre\\HTTP\\Util' => $vendorDir . '/sabre/http/lib/Util.php',
'Sabre\\HTTP\\Version' => $vendorDir . '/sabre/http/lib/Version.php',
+ 'Sabre\\Uri\\InvalidUriException' => $vendorDir . '/sabre/uri/lib/InvalidUriException.php',
'Sabre\\Uri\\Version' => $vendorDir . '/sabre/uri/lib/Version.php',
'Sabre\\VObject\\BirthdayCalendarGenerator' => $vendorDir . '/sabre/vobject/lib/BirthdayCalendarGenerator.php',
'Sabre\\VObject\\Cli' => $vendorDir . '/sabre/vobject/lib/Cli.php',
@@ -727,6 +748,7 @@ return array(
'Zotlabs\\Identity\\ProfilePhoto\\ProfilePhoto' => $baseDir . '/Zotlabs/Identity/ProfilePhoto.php',
'Zotlabs\\Lib\\AConfig' => $baseDir . '/Zotlabs/Lib/AConfig.php',
'Zotlabs\\Lib\\AbConfig' => $baseDir . '/Zotlabs/Lib/AbConfig.php',
+ 'Zotlabs\\Lib\\ActivityStreams2' => $baseDir . '/Zotlabs/Lib/ActivityStreams2.php',
'Zotlabs\\Lib\\Api_router' => $baseDir . '/Zotlabs/Lib/Api_router.php',
'Zotlabs\\Lib\\Apps' => $baseDir . '/Zotlabs/Lib/Apps.php',
'Zotlabs\\Lib\\Cache' => $baseDir . '/Zotlabs/Lib/Cache.php',
@@ -765,16 +787,20 @@ return array(
'Zotlabs\\Module\\Admin\\Security' => $baseDir . '/Zotlabs/Module/Admin/Security.php',
'Zotlabs\\Module\\Admin\\Site' => $baseDir . '/Zotlabs/Module/Admin/Site.php',
'Zotlabs\\Module\\Admin\\Themes' => $baseDir . '/Zotlabs/Module/Admin/Themes.php',
+ 'Zotlabs\\Module\\Ap_probe' => $baseDir . '/Zotlabs/Module/Ap_probe.php',
'Zotlabs\\Module\\Api' => $baseDir . '/Zotlabs/Module/Api.php',
'Zotlabs\\Module\\Appman' => $baseDir . '/Zotlabs/Module/Appman.php',
+ 'Zotlabs\\Module\\Apporder' => $baseDir . '/Zotlabs/Module/Apporder.php',
'Zotlabs\\Module\\Apps' => $baseDir . '/Zotlabs/Module/Apps.php',
'Zotlabs\\Module\\Attach' => $baseDir . '/Zotlabs/Module/Attach.php',
+ 'Zotlabs\\Module\\Authorize' => $baseDir . '/Zotlabs/Module/Authorize.php',
'Zotlabs\\Module\\Authtest' => $baseDir . '/Zotlabs/Module/Authtest.php',
'Zotlabs\\Module\\Block' => $baseDir . '/Zotlabs/Module/Block.php',
'Zotlabs\\Module\\Blocks' => $baseDir . '/Zotlabs/Module/Blocks.php',
'Zotlabs\\Module\\Bookmarks' => $baseDir . '/Zotlabs/Module/Bookmarks.php',
'Zotlabs\\Module\\Branchtopic' => $baseDir . '/Zotlabs/Module/Branchtopic.php',
'Zotlabs\\Module\\Cal' => $baseDir . '/Zotlabs/Module/Cal.php',
+ 'Zotlabs\\Module\\Cdav' => $baseDir . '/Zotlabs/Module/Cdav.php',
'Zotlabs\\Module\\Channel' => $baseDir . '/Zotlabs/Module/Channel.php',
'Zotlabs\\Module\\Chanview' => $baseDir . '/Zotlabs/Module/Chanview.php',
'Zotlabs\\Module\\Chat' => $baseDir . '/Zotlabs/Module/Chat.php',
@@ -830,6 +856,7 @@ return array(
'Zotlabs\\Module\\Menu' => $baseDir . '/Zotlabs/Module/Menu.php',
'Zotlabs\\Module\\Message' => $baseDir . '/Zotlabs/Module/Message.php',
'Zotlabs\\Module\\Mitem' => $baseDir . '/Zotlabs/Module/Mitem.php',
+ 'Zotlabs\\Module\\Moderate' => $baseDir . '/Zotlabs/Module/Moderate.php',
'Zotlabs\\Module\\Mood' => $baseDir . '/Zotlabs/Module/Mood.php',
'Zotlabs\\Module\\Network' => $baseDir . '/Zotlabs/Module/Network.php',
'Zotlabs\\Module\\New_channel' => $baseDir . '/Zotlabs/Module/New_channel.php',
@@ -891,7 +918,6 @@ return array(
'Zotlabs\\Module\\Share' => $baseDir . '/Zotlabs/Module/Share.php',
'Zotlabs\\Module\\Sharedwithme' => $baseDir . '/Zotlabs/Module/Sharedwithme.php',
'Zotlabs\\Module\\Siteinfo' => $baseDir . '/Zotlabs/Module/Siteinfo.php',
- 'Zotlabs\\Module\\Siteinfo_json' => $baseDir . '/Zotlabs/Module/Siteinfo_json.php',
'Zotlabs\\Module\\Sitelist' => $baseDir . '/Zotlabs/Module/Sitelist.php',
'Zotlabs\\Module\\Smilies' => $baseDir . '/Zotlabs/Module/Smilies.php',
'Zotlabs\\Module\\Snap' => $baseDir . '/Zotlabs/Module/Snap.php',
@@ -907,6 +933,7 @@ return array(
'Zotlabs\\Module\\Thing' => $baseDir . '/Zotlabs/Module/Thing.php',
'Zotlabs\\Module\\Toggle_mobile' => $baseDir . '/Zotlabs/Module/Toggle_mobile.php',
'Zotlabs\\Module\\Toggle_safesearch' => $baseDir . '/Zotlabs/Module/Toggle_safesearch.php',
+ 'Zotlabs\\Module\\Token' => $baseDir . '/Zotlabs/Module/Token.php',
'Zotlabs\\Module\\Uexport' => $baseDir . '/Zotlabs/Module/Uexport.php',
'Zotlabs\\Module\\Update_channel' => $baseDir . '/Zotlabs/Module/Update_channel.php',
'Zotlabs\\Module\\Update_display' => $baseDir . '/Zotlabs/Module/Update_display.php',
@@ -963,6 +990,7 @@ return array(
'Zotlabs\\Widget\\Bookmarkedchats' => $baseDir . '/Zotlabs/Widget/Bookmarkedchats.php',
'Zotlabs\\Widget\\Catcloud_wall' => $baseDir . '/Zotlabs/Widget/Catcloud_wall.php',
'Zotlabs\\Widget\\Categories' => $baseDir . '/Zotlabs/Widget/Categories.php',
+ 'Zotlabs\\Widget\\Cdav' => $baseDir . '/Zotlabs/Widget/Cdav.php',
'Zotlabs\\Widget\\Chatroom_list' => $baseDir . '/Zotlabs/Widget/Chatroom_list.php',
'Zotlabs\\Widget\\Chatroom_members' => $baseDir . '/Zotlabs/Widget/Chatroom_members.php',
'Zotlabs\\Widget\\Clock' => $baseDir . '/Zotlabs/Widget/Clock.php',
@@ -986,6 +1014,7 @@ return array(
'Zotlabs\\Widget\\Photo' => $baseDir . '/Zotlabs/Widget/Photo.php',
'Zotlabs\\Widget\\Photo_albums' => $baseDir . '/Zotlabs/Widget/Photo_albums.php',
'Zotlabs\\Widget\\Photo_rand' => $baseDir . '/Zotlabs/Widget/Photo_rand.php',
+ 'Zotlabs\\Widget\\Portfolio' => $baseDir . '/Zotlabs/Widget/Portfolio.php',
'Zotlabs\\Widget\\Profile' => $baseDir . '/Zotlabs/Widget/Profile.php',
'Zotlabs\\Widget\\Pubsites' => $baseDir . '/Zotlabs/Widget/Pubsites.php',
'Zotlabs\\Widget\\Random_block' => $baseDir . '/Zotlabs/Widget/Random_block.php',
diff --git a/vendor/composer/autoload_psr4.php b/vendor/composer/autoload_psr4.php
index 00a183cc1..48bc1158a 100644
--- a/vendor/composer/autoload_psr4.php
+++ b/vendor/composer/autoload_psr4.php
@@ -7,7 +7,6 @@ $baseDir = dirname($vendorDir);
return array(
'Zotlabs\\' => array($baseDir . '/Zotlabs'),
- 'Test\\Markdownify\\' => array($vendorDir . '/pixel418/markdownify/test'),
'Sabre\\Xml\\' => array($vendorDir . '/sabre/xml/lib'),
'Sabre\\VObject\\' => array($vendorDir . '/sabre/vobject/lib'),
'Sabre\\Uri\\' => array($vendorDir . '/sabre/uri/lib'),
@@ -18,6 +17,6 @@ return array(
'Sabre\\CardDAV\\' => array($vendorDir . '/sabre/dav/lib/CardDAV'),
'Sabre\\CalDAV\\' => array($vendorDir . '/sabre/dav/lib/CalDAV'),
'Psr\\Log\\' => array($vendorDir . '/psr/log/Psr/Log'),
- 'Markdownify\\' => array($vendorDir . '/pixel418/markdownify/src'),
+ 'League\\HTMLToMarkdown\\' => array($vendorDir . '/league/html-to-markdown/src'),
'Hubzilla\\' => array($baseDir . '/include'),
);
diff --git a/vendor/composer/autoload_static.php b/vendor/composer/autoload_static.php
index 53b9b20c3..bd3e9a87c 100644
--- a/vendor/composer/autoload_static.php
+++ b/vendor/composer/autoload_static.php
@@ -22,10 +22,6 @@ class ComposerStaticInit7b34d7e50a62201ec5d5e526a5b8b35d
array (
'Zotlabs\\' => 8,
),
- 'T' =>
- array (
- 'Test\\Markdownify\\' => 17,
- ),
'S' =>
array (
'Sabre\\Xml\\' => 10,
@@ -42,9 +38,9 @@ class ComposerStaticInit7b34d7e50a62201ec5d5e526a5b8b35d
array (
'Psr\\Log\\' => 8,
),
- 'M' =>
+ 'L' =>
array (
- 'Markdownify\\' => 12,
+ 'League\\HTMLToMarkdown\\' => 22,
),
'H' =>
array (
@@ -57,10 +53,6 @@ class ComposerStaticInit7b34d7e50a62201ec5d5e526a5b8b35d
array (
0 => __DIR__ . '/../..' . '/Zotlabs',
),
- 'Test\\Markdownify\\' =>
- array (
- 0 => __DIR__ . '/..' . '/pixel418/markdownify/test',
- ),
'Sabre\\Xml\\' =>
array (
0 => __DIR__ . '/..' . '/sabre/xml/lib',
@@ -101,9 +93,9 @@ class ComposerStaticInit7b34d7e50a62201ec5d5e526a5b8b35d
array (
0 => __DIR__ . '/..' . '/psr/log/Psr/Log',
),
- 'Markdownify\\' =>
+ 'League\\HTMLToMarkdown\\' =>
array (
- 0 => __DIR__ . '/..' . '/pixel418/markdownify/src',
+ 0 => __DIR__ . '/..' . '/league/html-to-markdown/src',
),
'Hubzilla\\' =>
array (
@@ -378,9 +370,29 @@ class ComposerStaticInit7b34d7e50a62201ec5d5e526a5b8b35d
'HTMLPurifier_VarParser_Native' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/VarParser/Native.php',
'HTMLPurifier_Zipper' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier/Zipper.php',
'Hubzilla\\Import\\Import' => __DIR__ . '/../..' . '/include/Import/Importer.php',
- 'Markdownify\\Converter' => __DIR__ . '/..' . '/pixel418/markdownify/src/Converter.php',
- 'Markdownify\\ConverterExtra' => __DIR__ . '/..' . '/pixel418/markdownify/src/ConverterExtra.php',
- 'Markdownify\\Parser' => __DIR__ . '/..' . '/pixel418/markdownify/src/Parser.php',
+ 'League\\HTMLToMarkdown\\Configuration' => __DIR__ . '/..' . '/league/html-to-markdown/src/Configuration.php',
+ 'League\\HTMLToMarkdown\\ConfigurationAwareInterface' => __DIR__ . '/..' . '/league/html-to-markdown/src/ConfigurationAwareInterface.php',
+ 'League\\HTMLToMarkdown\\Converter\\BlockquoteConverter' => __DIR__ . '/..' . '/league/html-to-markdown/src/Converter/BlockquoteConverter.php',
+ 'League\\HTMLToMarkdown\\Converter\\CodeConverter' => __DIR__ . '/..' . '/league/html-to-markdown/src/Converter/CodeConverter.php',
+ 'League\\HTMLToMarkdown\\Converter\\CommentConverter' => __DIR__ . '/..' . '/league/html-to-markdown/src/Converter/CommentConverter.php',
+ 'League\\HTMLToMarkdown\\Converter\\ConverterInterface' => __DIR__ . '/..' . '/league/html-to-markdown/src/Converter/ConverterInterface.php',
+ 'League\\HTMLToMarkdown\\Converter\\DefaultConverter' => __DIR__ . '/..' . '/league/html-to-markdown/src/Converter/DefaultConverter.php',
+ 'League\\HTMLToMarkdown\\Converter\\DivConverter' => __DIR__ . '/..' . '/league/html-to-markdown/src/Converter/DivConverter.php',
+ 'League\\HTMLToMarkdown\\Converter\\EmphasisConverter' => __DIR__ . '/..' . '/league/html-to-markdown/src/Converter/EmphasisConverter.php',
+ 'League\\HTMLToMarkdown\\Converter\\HardBreakConverter' => __DIR__ . '/..' . '/league/html-to-markdown/src/Converter/HardBreakConverter.php',
+ 'League\\HTMLToMarkdown\\Converter\\HeaderConverter' => __DIR__ . '/..' . '/league/html-to-markdown/src/Converter/HeaderConverter.php',
+ 'League\\HTMLToMarkdown\\Converter\\HorizontalRuleConverter' => __DIR__ . '/..' . '/league/html-to-markdown/src/Converter/HorizontalRuleConverter.php',
+ 'League\\HTMLToMarkdown\\Converter\\ImageConverter' => __DIR__ . '/..' . '/league/html-to-markdown/src/Converter/ImageConverter.php',
+ 'League\\HTMLToMarkdown\\Converter\\LinkConverter' => __DIR__ . '/..' . '/league/html-to-markdown/src/Converter/LinkConverter.php',
+ 'League\\HTMLToMarkdown\\Converter\\ListBlockConverter' => __DIR__ . '/..' . '/league/html-to-markdown/src/Converter/ListBlockConverter.php',
+ 'League\\HTMLToMarkdown\\Converter\\ListItemConverter' => __DIR__ . '/..' . '/league/html-to-markdown/src/Converter/ListItemConverter.php',
+ 'League\\HTMLToMarkdown\\Converter\\ParagraphConverter' => __DIR__ . '/..' . '/league/html-to-markdown/src/Converter/ParagraphConverter.php',
+ 'League\\HTMLToMarkdown\\Converter\\PreformattedConverter' => __DIR__ . '/..' . '/league/html-to-markdown/src/Converter/PreformattedConverter.php',
+ 'League\\HTMLToMarkdown\\Converter\\TextConverter' => __DIR__ . '/..' . '/league/html-to-markdown/src/Converter/TextConverter.php',
+ 'League\\HTMLToMarkdown\\Element' => __DIR__ . '/..' . '/league/html-to-markdown/src/Element.php',
+ 'League\\HTMLToMarkdown\\ElementInterface' => __DIR__ . '/..' . '/league/html-to-markdown/src/ElementInterface.php',
+ 'League\\HTMLToMarkdown\\Environment' => __DIR__ . '/..' . '/league/html-to-markdown/src/Environment.php',
+ 'League\\HTMLToMarkdown\\HtmlConverter' => __DIR__ . '/..' . '/league/html-to-markdown/src/HtmlConverter.php',
'Michelf\\Markdown' => __DIR__ . '/..' . '/michelf/php-markdown/Michelf/Markdown.php',
'Michelf\\MarkdownExtra' => __DIR__ . '/..' . '/michelf/php-markdown/Michelf/MarkdownExtra.php',
'Michelf\\MarkdownInterface' => __DIR__ . '/..' . '/michelf/php-markdown/Michelf/MarkdownInterface.php',
@@ -710,6 +722,7 @@ class ComposerStaticInit7b34d7e50a62201ec5d5e526a5b8b35d
'Sabre\\HTTP\\URLUtil' => __DIR__ . '/..' . '/sabre/http/lib/URLUtil.php',
'Sabre\\HTTP\\Util' => __DIR__ . '/..' . '/sabre/http/lib/Util.php',
'Sabre\\HTTP\\Version' => __DIR__ . '/..' . '/sabre/http/lib/Version.php',
+ 'Sabre\\Uri\\InvalidUriException' => __DIR__ . '/..' . '/sabre/uri/lib/InvalidUriException.php',
'Sabre\\Uri\\Version' => __DIR__ . '/..' . '/sabre/uri/lib/Version.php',
'Sabre\\VObject\\BirthdayCalendarGenerator' => __DIR__ . '/..' . '/sabre/vobject/lib/BirthdayCalendarGenerator.php',
'Sabre\\VObject\\Cli' => __DIR__ . '/..' . '/sabre/vobject/lib/Cli.php',
@@ -864,6 +877,7 @@ class ComposerStaticInit7b34d7e50a62201ec5d5e526a5b8b35d
'Zotlabs\\Identity\\ProfilePhoto\\ProfilePhoto' => __DIR__ . '/../..' . '/Zotlabs/Identity/ProfilePhoto.php',
'Zotlabs\\Lib\\AConfig' => __DIR__ . '/../..' . '/Zotlabs/Lib/AConfig.php',
'Zotlabs\\Lib\\AbConfig' => __DIR__ . '/../..' . '/Zotlabs/Lib/AbConfig.php',
+ 'Zotlabs\\Lib\\ActivityStreams2' => __DIR__ . '/../..' . '/Zotlabs/Lib/ActivityStreams2.php',
'Zotlabs\\Lib\\Api_router' => __DIR__ . '/../..' . '/Zotlabs/Lib/Api_router.php',
'Zotlabs\\Lib\\Apps' => __DIR__ . '/../..' . '/Zotlabs/Lib/Apps.php',
'Zotlabs\\Lib\\Cache' => __DIR__ . '/../..' . '/Zotlabs/Lib/Cache.php',
@@ -902,16 +916,20 @@ class ComposerStaticInit7b34d7e50a62201ec5d5e526a5b8b35d
'Zotlabs\\Module\\Admin\\Security' => __DIR__ . '/../..' . '/Zotlabs/Module/Admin/Security.php',
'Zotlabs\\Module\\Admin\\Site' => __DIR__ . '/../..' . '/Zotlabs/Module/Admin/Site.php',
'Zotlabs\\Module\\Admin\\Themes' => __DIR__ . '/../..' . '/Zotlabs/Module/Admin/Themes.php',
+ 'Zotlabs\\Module\\Ap_probe' => __DIR__ . '/../..' . '/Zotlabs/Module/Ap_probe.php',
'Zotlabs\\Module\\Api' => __DIR__ . '/../..' . '/Zotlabs/Module/Api.php',
'Zotlabs\\Module\\Appman' => __DIR__ . '/../..' . '/Zotlabs/Module/Appman.php',
+ 'Zotlabs\\Module\\Apporder' => __DIR__ . '/../..' . '/Zotlabs/Module/Apporder.php',
'Zotlabs\\Module\\Apps' => __DIR__ . '/../..' . '/Zotlabs/Module/Apps.php',
'Zotlabs\\Module\\Attach' => __DIR__ . '/../..' . '/Zotlabs/Module/Attach.php',
+ 'Zotlabs\\Module\\Authorize' => __DIR__ . '/../..' . '/Zotlabs/Module/Authorize.php',
'Zotlabs\\Module\\Authtest' => __DIR__ . '/../..' . '/Zotlabs/Module/Authtest.php',
'Zotlabs\\Module\\Block' => __DIR__ . '/../..' . '/Zotlabs/Module/Block.php',
'Zotlabs\\Module\\Blocks' => __DIR__ . '/../..' . '/Zotlabs/Module/Blocks.php',
'Zotlabs\\Module\\Bookmarks' => __DIR__ . '/../..' . '/Zotlabs/Module/Bookmarks.php',
'Zotlabs\\Module\\Branchtopic' => __DIR__ . '/../..' . '/Zotlabs/Module/Branchtopic.php',
'Zotlabs\\Module\\Cal' => __DIR__ . '/../..' . '/Zotlabs/Module/Cal.php',
+ 'Zotlabs\\Module\\Cdav' => __DIR__ . '/../..' . '/Zotlabs/Module/Cdav.php',
'Zotlabs\\Module\\Channel' => __DIR__ . '/../..' . '/Zotlabs/Module/Channel.php',
'Zotlabs\\Module\\Chanview' => __DIR__ . '/../..' . '/Zotlabs/Module/Chanview.php',
'Zotlabs\\Module\\Chat' => __DIR__ . '/../..' . '/Zotlabs/Module/Chat.php',
@@ -967,6 +985,7 @@ class ComposerStaticInit7b34d7e50a62201ec5d5e526a5b8b35d
'Zotlabs\\Module\\Menu' => __DIR__ . '/../..' . '/Zotlabs/Module/Menu.php',
'Zotlabs\\Module\\Message' => __DIR__ . '/../..' . '/Zotlabs/Module/Message.php',
'Zotlabs\\Module\\Mitem' => __DIR__ . '/../..' . '/Zotlabs/Module/Mitem.php',
+ 'Zotlabs\\Module\\Moderate' => __DIR__ . '/../..' . '/Zotlabs/Module/Moderate.php',
'Zotlabs\\Module\\Mood' => __DIR__ . '/../..' . '/Zotlabs/Module/Mood.php',
'Zotlabs\\Module\\Network' => __DIR__ . '/../..' . '/Zotlabs/Module/Network.php',
'Zotlabs\\Module\\New_channel' => __DIR__ . '/../..' . '/Zotlabs/Module/New_channel.php',
@@ -1028,7 +1047,6 @@ class ComposerStaticInit7b34d7e50a62201ec5d5e526a5b8b35d
'Zotlabs\\Module\\Share' => __DIR__ . '/../..' . '/Zotlabs/Module/Share.php',
'Zotlabs\\Module\\Sharedwithme' => __DIR__ . '/../..' . '/Zotlabs/Module/Sharedwithme.php',
'Zotlabs\\Module\\Siteinfo' => __DIR__ . '/../..' . '/Zotlabs/Module/Siteinfo.php',
- 'Zotlabs\\Module\\Siteinfo_json' => __DIR__ . '/../..' . '/Zotlabs/Module/Siteinfo_json.php',
'Zotlabs\\Module\\Sitelist' => __DIR__ . '/../..' . '/Zotlabs/Module/Sitelist.php',
'Zotlabs\\Module\\Smilies' => __DIR__ . '/../..' . '/Zotlabs/Module/Smilies.php',
'Zotlabs\\Module\\Snap' => __DIR__ . '/../..' . '/Zotlabs/Module/Snap.php',
@@ -1044,6 +1062,7 @@ class ComposerStaticInit7b34d7e50a62201ec5d5e526a5b8b35d
'Zotlabs\\Module\\Thing' => __DIR__ . '/../..' . '/Zotlabs/Module/Thing.php',
'Zotlabs\\Module\\Toggle_mobile' => __DIR__ . '/../..' . '/Zotlabs/Module/Toggle_mobile.php',
'Zotlabs\\Module\\Toggle_safesearch' => __DIR__ . '/../..' . '/Zotlabs/Module/Toggle_safesearch.php',
+ 'Zotlabs\\Module\\Token' => __DIR__ . '/../..' . '/Zotlabs/Module/Token.php',
'Zotlabs\\Module\\Uexport' => __DIR__ . '/../..' . '/Zotlabs/Module/Uexport.php',
'Zotlabs\\Module\\Update_channel' => __DIR__ . '/../..' . '/Zotlabs/Module/Update_channel.php',
'Zotlabs\\Module\\Update_display' => __DIR__ . '/../..' . '/Zotlabs/Module/Update_display.php',
@@ -1100,6 +1119,7 @@ class ComposerStaticInit7b34d7e50a62201ec5d5e526a5b8b35d
'Zotlabs\\Widget\\Bookmarkedchats' => __DIR__ . '/../..' . '/Zotlabs/Widget/Bookmarkedchats.php',
'Zotlabs\\Widget\\Catcloud_wall' => __DIR__ . '/../..' . '/Zotlabs/Widget/Catcloud_wall.php',
'Zotlabs\\Widget\\Categories' => __DIR__ . '/../..' . '/Zotlabs/Widget/Categories.php',
+ 'Zotlabs\\Widget\\Cdav' => __DIR__ . '/../..' . '/Zotlabs/Widget/Cdav.php',
'Zotlabs\\Widget\\Chatroom_list' => __DIR__ . '/../..' . '/Zotlabs/Widget/Chatroom_list.php',
'Zotlabs\\Widget\\Chatroom_members' => __DIR__ . '/../..' . '/Zotlabs/Widget/Chatroom_members.php',
'Zotlabs\\Widget\\Clock' => __DIR__ . '/../..' . '/Zotlabs/Widget/Clock.php',
@@ -1123,6 +1143,7 @@ class ComposerStaticInit7b34d7e50a62201ec5d5e526a5b8b35d
'Zotlabs\\Widget\\Photo' => __DIR__ . '/../..' . '/Zotlabs/Widget/Photo.php',
'Zotlabs\\Widget\\Photo_albums' => __DIR__ . '/../..' . '/Zotlabs/Widget/Photo_albums.php',
'Zotlabs\\Widget\\Photo_rand' => __DIR__ . '/../..' . '/Zotlabs/Widget/Photo_rand.php',
+ 'Zotlabs\\Widget\\Portfolio' => __DIR__ . '/../..' . '/Zotlabs/Widget/Portfolio.php',
'Zotlabs\\Widget\\Profile' => __DIR__ . '/../..' . '/Zotlabs/Widget/Profile.php',
'Zotlabs\\Widget\\Pubsites' => __DIR__ . '/../..' . '/Zotlabs/Widget/Pubsites.php',
'Zotlabs\\Widget\\Random_block' => __DIR__ . '/../..' . '/Zotlabs/Widget/Random_block.php',
diff --git a/vendor/composer/installed.json b/vendor/composer/installed.json
index 7e4f0bb29..4fa452db0 100644
--- a/vendor/composer/installed.json
+++ b/vendor/composer/installed.json
@@ -1,36 +1,38 @@
[
{
- "name": "sabre/uri",
- "version": "1.1.0",
- "version_normalized": "1.1.0.0",
+ "name": "sabre/event",
+ "version": "3.0.0",
+ "version_normalized": "3.0.0.0",
"source": {
"type": "git",
- "url": "https://github.com/fruux/sabre-uri.git",
- "reference": "9012116434d84ef6e5e37a89dfdbfbe2204a8704"
+ "url": "https://github.com/fruux/sabre-event.git",
+ "reference": "831d586f5a442dceacdcf5e9c4c36a4db99a3534"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/fruux/sabre-uri/zipball/9012116434d84ef6e5e37a89dfdbfbe2204a8704",
- "reference": "9012116434d84ef6e5e37a89dfdbfbe2204a8704",
+ "url": "https://api.github.com/repos/fruux/sabre-event/zipball/831d586f5a442dceacdcf5e9c4c36a4db99a3534",
+ "reference": "831d586f5a442dceacdcf5e9c4c36a4db99a3534",
"shasum": ""
},
"require": {
- "php": ">=5.4.7"
+ "php": ">=5.5"
},
"require-dev": {
"phpunit/phpunit": "*",
- "sabre/cs": "~0.0.1"
+ "sabre/cs": "~0.0.4"
},
- "time": "2016-03-08T02:29:27+00:00",
+ "time": "2015-11-05T20:14:39+00:00",
"type": "library",
"installation-source": "dist",
"autoload": {
- "files": [
- "lib/functions.php"
- ],
"psr-4": {
- "Sabre\\Uri\\": "lib/"
- }
+ "Sabre\\Event\\": "lib/"
+ },
+ "files": [
+ "lib/coroutine.php",
+ "lib/Loop/functions.php",
+ "lib/Promise/functions.php"
+ ]
},
"notification-url": "https://packagist.org/downloads/",
"license": [
@@ -44,57 +46,56 @@
"role": "Developer"
}
],
- "description": "Functions for making sense out of URIs.",
- "homepage": "http://sabre.io/uri/",
+ "description": "sabre/event is a library for lightweight event-based programming",
+ "homepage": "http://sabre.io/event/",
"keywords": [
- "rfc3986",
- "uri",
- "url"
+ "EventEmitter",
+ "async",
+ "events",
+ "hooks",
+ "plugin",
+ "promise",
+ "signal"
]
},
{
- "name": "sabre/vobject",
- "version": "4.1.1",
- "version_normalized": "4.1.1.0",
+ "name": "sabre/xml",
+ "version": "1.5.0",
+ "version_normalized": "1.5.0.0",
"source": {
"type": "git",
- "url": "https://github.com/fruux/sabre-vobject.git",
- "reference": "a3a59b06947f122af2d45d52b72172cdc1efd68f"
+ "url": "https://github.com/fruux/sabre-xml.git",
+ "reference": "59b20e5bbace9912607481634f97d05a776ffca7"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/fruux/sabre-vobject/zipball/a3a59b06947f122af2d45d52b72172cdc1efd68f",
- "reference": "a3a59b06947f122af2d45d52b72172cdc1efd68f",
+ "url": "https://api.github.com/repos/fruux/sabre-xml/zipball/59b20e5bbace9912607481634f97d05a776ffca7",
+ "reference": "59b20e5bbace9912607481634f97d05a776ffca7",
"shasum": ""
},
"require": {
- "ext-mbstring": "*",
- "php": ">=5.5",
- "sabre/xml": "~1.1"
+ "ext-dom": "*",
+ "ext-xmlreader": "*",
+ "ext-xmlwriter": "*",
+ "lib-libxml": ">=2.6.20",
+ "php": ">=5.5.5",
+ "sabre/uri": ">=1.0,<3.0.0"
},
"require-dev": {
"phpunit/phpunit": "*",
- "sabre/cs": "~0.0.3"
- },
- "suggest": {
- "hoa/bench": "If you would like to run the benchmark scripts"
+ "sabre/cs": "~1.0.0"
},
- "time": "2016-07-15T19:52:17+00:00",
- "bin": [
- "bin/vobject",
- "bin/generate_vcards"
- ],
+ "time": "2016-10-09T22:57:52+00:00",
"type": "library",
- "extra": {
- "branch-alias": {
- "dev-master": "4.0.x-dev"
- }
- },
"installation-source": "dist",
"autoload": {
"psr-4": {
- "Sabre\\VObject\\": "lib/"
- }
+ "Sabre\\Xml\\": "lib/"
+ },
+ "files": [
+ "lib/Deserializer/functions.php",
+ "lib/Serializer/functions.php"
+ ]
},
"notification-url": "https://packagist.org/downloads/",
"license": [
@@ -108,83 +109,99 @@
"role": "Developer"
},
{
- "name": "Dominik Tobschall",
- "email": "dominik@fruux.com",
- "homepage": "http://tobschall.de/",
- "role": "Developer"
- },
- {
- "name": "Ivan Enderlin",
- "email": "ivan.enderlin@hoa-project.net",
- "homepage": "http://mnt.io/",
+ "name": "Markus Staab",
+ "email": "markus.staab@redaxo.de",
"role": "Developer"
}
],
- "description": "The VObject library for PHP allows you to easily parse and manipulate iCalendar and vCard objects",
- "homepage": "http://sabre.io/vobject/",
+ "description": "sabre/xml is an XML library that you may not hate.",
+ "homepage": "https://sabre.io/xml/",
"keywords": [
- "availability",
- "freebusy",
- "iCalendar",
- "ical",
- "ics",
- "jCal",
- "jCard",
- "recurrence",
- "rfc2425",
- "rfc2426",
- "rfc2739",
- "rfc4770",
- "rfc5545",
- "rfc5546",
- "rfc6321",
- "rfc6350",
- "rfc6351",
- "rfc6474",
- "rfc6638",
- "rfc6715",
- "rfc6868",
- "vCalendar",
- "vCard",
- "vcf",
- "xCal",
- "xCard"
+ "XMLReader",
+ "XMLWriter",
+ "dom",
+ "xml"
]
},
{
- "name": "sabre/event",
- "version": "3.0.0",
- "version_normalized": "3.0.0.0",
+ "name": "psr/log",
+ "version": "1.0.2",
+ "version_normalized": "1.0.2.0",
"source": {
"type": "git",
- "url": "https://github.com/fruux/sabre-event.git",
- "reference": "831d586f5a442dceacdcf5e9c4c36a4db99a3534"
+ "url": "https://github.com/php-fig/log.git",
+ "reference": "4ebe3a8bf773a19edfe0a84b6585ba3d401b724d"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/fruux/sabre-event/zipball/831d586f5a442dceacdcf5e9c4c36a4db99a3534",
- "reference": "831d586f5a442dceacdcf5e9c4c36a4db99a3534",
+ "url": "https://api.github.com/repos/php-fig/log/zipball/4ebe3a8bf773a19edfe0a84b6585ba3d401b724d",
+ "reference": "4ebe3a8bf773a19edfe0a84b6585ba3d401b724d",
"shasum": ""
},
"require": {
- "php": ">=5.5"
- },
- "require-dev": {
- "phpunit/phpunit": "*",
- "sabre/cs": "~0.0.4"
+ "php": ">=5.3.0"
},
- "time": "2015-11-05T20:14:39+00:00",
+ "time": "2016-10-10T12:19:37+00:00",
"type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.0.x-dev"
+ }
+ },
"installation-source": "dist",
"autoload": {
"psr-4": {
- "Sabre\\Event\\": "lib/"
- },
- "files": [
- "lib/coroutine.php",
- "lib/Loop/functions.php",
- "lib/Promise/functions.php"
- ]
+ "Psr\\Log\\": "Psr/Log/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "PHP-FIG",
+ "homepage": "http://www.php-fig.org/"
+ }
+ ],
+ "description": "Common interface for logging libraries",
+ "homepage": "https://github.com/php-fig/log",
+ "keywords": [
+ "log",
+ "psr",
+ "psr-3"
+ ]
+ },
+ {
+ "name": "michelf/php-markdown",
+ "version": "1.7.0",
+ "version_normalized": "1.7.0.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/michelf/php-markdown.git",
+ "reference": "1f51cc520948f66cd2af8cbc45a5ee175e774220"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/michelf/php-markdown/zipball/1f51cc520948f66cd2af8cbc45a5ee175e774220",
+ "reference": "1f51cc520948f66cd2af8cbc45a5ee175e774220",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.0"
+ },
+ "time": "2016-10-29T18:58:20+00:00",
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-lib": "1.4.x-dev"
+ }
+ },
+ "installation-source": "dist",
+ "autoload": {
+ "psr-0": {
+ "Michelf": ""
+ }
},
"notification-url": "https://packagist.org/downloads/",
"license": [
@@ -192,94 +209,158 @@
],
"authors": [
{
- "name": "Evert Pot",
- "email": "me@evertpot.com",
- "homepage": "http://evertpot.com/",
+ "name": "Michel Fortin",
+ "email": "michel.fortin@michelf.ca",
+ "homepage": "https://michelf.ca/",
"role": "Developer"
+ },
+ {
+ "name": "John Gruber",
+ "homepage": "https://daringfireball.net/"
}
],
- "description": "sabre/event is a library for lightweight event-based programming",
- "homepage": "http://sabre.io/event/",
+ "description": "PHP Markdown",
+ "homepage": "https://michelf.ca/projects/php-markdown/",
"keywords": [
- "EventEmitter",
- "async",
- "events",
- "hooks",
- "plugin",
- "promise",
- "signal"
+ "markdown"
]
},
{
- "name": "sabre/http",
- "version": "4.2.1",
- "version_normalized": "4.2.1.0",
+ "name": "bshaffer/oauth2-server-php",
+ "version": "v1.9.0",
+ "version_normalized": "1.9.0.0",
"source": {
"type": "git",
- "url": "https://github.com/fruux/sabre-http.git",
- "reference": "2e93bc8321524c67be4ca5b8415daebd4c8bf85e"
+ "url": "https://github.com/bshaffer/oauth2-server-php.git",
+ "reference": "8856aed1a98d6da596ae3f9b8095b5c7a1581697"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/fruux/sabre-http/zipball/2e93bc8321524c67be4ca5b8415daebd4c8bf85e",
- "reference": "2e93bc8321524c67be4ca5b8415daebd4c8bf85e",
+ "url": "https://api.github.com/repos/bshaffer/oauth2-server-php/zipball/8856aed1a98d6da596ae3f9b8095b5c7a1581697",
+ "reference": "8856aed1a98d6da596ae3f9b8095b5c7a1581697",
"shasum": ""
},
"require": {
- "ext-mbstring": "*",
- "php": ">=5.4",
- "sabre/event": ">=1.0.0,<4.0.0",
- "sabre/uri": "~1.0"
+ "php": ">=5.3.9"
},
"require-dev": {
- "phpunit/phpunit": "~4.3",
- "sabre/cs": "~0.0.1"
+ "aws/aws-sdk-php": "~2.8",
+ "firebase/php-jwt": "~2.2",
+ "mongodb/mongodb": "^1.1",
+ "predis/predis": "dev-master",
+ "thobbs/phpcassa": "dev-master"
},
"suggest": {
- "ext-curl": " to make http requests with the Client class"
+ "aws/aws-sdk-php": "~2.8 is required to use DynamoDB storage",
+ "firebase/php-jwt": "~1.1 is required to use MondoDB storage",
+ "predis/predis": "Required to use Redis storage",
+ "thobbs/phpcassa": "Required to use Cassandra storage"
},
- "time": "2016-01-06T23:00:08+00:00",
+ "time": "2017-01-06T23:20:00+00:00",
"type": "library",
"installation-source": "dist",
"autoload": {
- "files": [
- "lib/functions.php"
- ],
- "psr-4": {
- "Sabre\\HTTP\\": "lib/"
+ "psr-0": {
+ "OAuth2": "src/"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Brent Shaffer",
+ "email": "bshafs@gmail.com",
+ "homepage": "http://brentertainment.com"
+ }
+ ],
+ "description": "OAuth2 Server for PHP",
+ "homepage": "http://github.com/bshaffer/oauth2-server-php",
+ "keywords": [
+ "auth",
+ "oauth",
+ "oauth2"
+ ]
+ },
+ {
+ "name": "simplepie/simplepie",
+ "version": "1.5",
+ "version_normalized": "1.5.0.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/simplepie/simplepie.git",
+ "reference": "5de5551953f95feef12cf355a7a26a70f94aa3ab"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/simplepie/simplepie/zipball/5de5551953f95feef12cf355a7a26a70f94aa3ab",
+ "reference": "5de5551953f95feef12cf355a7a26a70f94aa3ab",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "~4 || ~5"
+ },
+ "suggest": {
+ "mf2/mf2": "Microformat module that allows for parsing HTML for microformats"
+ },
+ "time": "2017-04-17T07:29:31+00:00",
+ "type": "library",
+ "installation-source": "source",
+ "autoload": {
+ "psr-0": {
+ "SimplePie": "library"
+ }
+ },
+ "license": [
"BSD-3-Clause"
],
"authors": [
{
- "name": "Evert Pot",
- "email": "me@evertpot.com",
- "homepage": "http://evertpot.com/",
+ "name": "Ryan Parman",
+ "homepage": "http://ryanparman.com/",
+ "role": "Creator, alumnus developer"
+ },
+ {
+ "name": "Geoffrey Sneddon",
+ "homepage": "http://gsnedders.com/",
+ "role": "Alumnus developer"
+ },
+ {
+ "name": "Ryan McCue",
+ "email": "me@ryanmccue.info",
+ "homepage": "http://ryanmccue.info/",
"role": "Developer"
}
],
- "description": "The sabre/http library provides utilities for dealing with http requests and responses. ",
- "homepage": "https://github.com/fruux/sabre-http",
+ "description": "A simple Atom/RSS parsing library for PHP",
+ "homepage": "http://simplepie.org/",
"keywords": [
- "http"
- ]
+ "atom",
+ "feeds",
+ "rss"
+ ],
+ "support": {
+ "source": "https://github.com/simplepie/simplepie/tree/1.5",
+ "issues": "https://github.com/simplepie/simplepie/issues"
+ }
},
{
"name": "sabre/dav",
- "version": "3.2.0",
- "version_normalized": "3.2.0.0",
+ "version": "3.2.2",
+ "version_normalized": "3.2.2.0",
"source": {
"type": "git",
"url": "https://github.com/fruux/sabre-dav.git",
- "reference": "5b9737cc2f0182e368d14c80df7f6b2d77dc1457"
+ "reference": "e987775e619728f12205606c9cc3ee565ffb1516"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/fruux/sabre-dav/zipball/5b9737cc2f0182e368d14c80df7f6b2d77dc1457",
- "reference": "5b9737cc2f0182e368d14c80df7f6b2d77dc1457",
+ "url": "https://api.github.com/repos/fruux/sabre-dav/zipball/e987775e619728f12205606c9cc3ee565ffb1516",
+ "reference": "e987775e619728f12205606c9cc3ee565ffb1516",
"shasum": ""
},
"require": {
@@ -303,14 +384,14 @@
"require-dev": {
"evert/phpdoc-md": "~0.1.0",
"monolog/monolog": "^1.18",
- "phpunit/phpunit": "> 4.8, <=6.0.0",
- "sabre/cs": "~0.0.5"
+ "phpunit/phpunit": "> 4.8, <6.0.0",
+ "sabre/cs": "^1.0.0"
},
"suggest": {
"ext-curl": "*",
"ext-pdo": "*"
},
- "time": "2016-06-28T02:44:05+00:00",
+ "time": "2017-02-15T03:06:08+00:00",
"bin": [
"bin/sabredav",
"bin/naturalselection"
@@ -353,99 +434,44 @@
]
},
{
- "name": "sabre/xml",
- "version": "1.5.0",
- "version_normalized": "1.5.0.0",
+ "name": "league/html-to-markdown",
+ "version": "4.4.1",
+ "version_normalized": "4.4.1.0",
"source": {
"type": "git",
- "url": "https://github.com/fruux/sabre-xml.git",
- "reference": "59b20e5bbace9912607481634f97d05a776ffca7"
+ "url": "https://github.com/thephpleague/html-to-markdown.git",
+ "reference": "82ea375b5b2b1da1da222644c0565c695bf88186"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/fruux/sabre-xml/zipball/59b20e5bbace9912607481634f97d05a776ffca7",
- "reference": "59b20e5bbace9912607481634f97d05a776ffca7",
+ "url": "https://api.github.com/repos/thephpleague/html-to-markdown/zipball/82ea375b5b2b1da1da222644c0565c695bf88186",
+ "reference": "82ea375b5b2b1da1da222644c0565c695bf88186",
"shasum": ""
},
"require": {
"ext-dom": "*",
- "ext-xmlreader": "*",
- "ext-xmlwriter": "*",
- "lib-libxml": ">=2.6.20",
- "php": ">=5.5.5",
- "sabre/uri": ">=1.0,<3.0.0"
+ "ext-xml": "*",
+ "php": ">=5.3.3"
},
"require-dev": {
- "phpunit/phpunit": "*",
- "sabre/cs": "~1.0.0"
- },
- "time": "2016-10-09T22:57:52+00:00",
- "type": "library",
- "installation-source": "dist",
- "autoload": {
- "psr-4": {
- "Sabre\\Xml\\": "lib/"
- },
- "files": [
- "lib/Deserializer/functions.php",
- "lib/Serializer/functions.php"
- ]
+ "mikehaertl/php-shellcommand": "~1.1.0",
+ "phpunit/phpunit": "4.*",
+ "scrutinizer/ocular": "~1.1"
},
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "BSD-3-Clause"
- ],
- "authors": [
- {
- "name": "Evert Pot",
- "email": "me@evertpot.com",
- "homepage": "http://evertpot.com/",
- "role": "Developer"
- },
- {
- "name": "Markus Staab",
- "email": "markus.staab@redaxo.de",
- "role": "Developer"
- }
+ "time": "2017-03-16T00:45:59+00:00",
+ "bin": [
+ "bin/html-to-markdown"
],
- "description": "sabre/xml is an XML library that you may not hate.",
- "homepage": "https://sabre.io/xml/",
- "keywords": [
- "XMLReader",
- "XMLWriter",
- "dom",
- "xml"
- ]
- },
- {
- "name": "psr/log",
- "version": "1.0.2",
- "version_normalized": "1.0.2.0",
- "source": {
- "type": "git",
- "url": "https://github.com/php-fig/log.git",
- "reference": "4ebe3a8bf773a19edfe0a84b6585ba3d401b724d"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/php-fig/log/zipball/4ebe3a8bf773a19edfe0a84b6585ba3d401b724d",
- "reference": "4ebe3a8bf773a19edfe0a84b6585ba3d401b724d",
- "shasum": ""
- },
- "require": {
- "php": ">=5.3.0"
- },
- "time": "2016-10-10T12:19:37+00:00",
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "1.0.x-dev"
+ "dev-master": "4.5-dev"
}
},
"installation-source": "dist",
"autoload": {
"psr-4": {
- "Psr\\Log\\": "Psr/Log/"
+ "League\\HTMLToMarkdown\\": "src/"
}
},
"notification-url": "https://packagist.org/downloads/",
@@ -454,200 +480,190 @@
],
"authors": [
{
- "name": "PHP-FIG",
- "homepage": "http://www.php-fig.org/"
- }
- ],
- "description": "Common interface for logging libraries",
- "homepage": "https://github.com/php-fig/log",
- "keywords": [
- "log",
- "psr",
- "psr-3"
- ]
- },
- {
- "name": "michelf/php-markdown",
- "version": "1.7.0",
- "version_normalized": "1.7.0.0",
- "source": {
- "type": "git",
- "url": "https://github.com/michelf/php-markdown.git",
- "reference": "1f51cc520948f66cd2af8cbc45a5ee175e774220"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/michelf/php-markdown/zipball/1f51cc520948f66cd2af8cbc45a5ee175e774220",
- "reference": "1f51cc520948f66cd2af8cbc45a5ee175e774220",
- "shasum": ""
- },
- "require": {
- "php": ">=5.3.0"
- },
- "time": "2016-10-29T18:58:20+00:00",
- "type": "library",
- "extra": {
- "branch-alias": {
- "dev-lib": "1.4.x-dev"
- }
- },
- "installation-source": "dist",
- "autoload": {
- "psr-0": {
- "Michelf": ""
- }
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "BSD-3-Clause"
- ],
- "authors": [
- {
- "name": "Michel Fortin",
- "email": "michel.fortin@michelf.ca",
- "homepage": "https://michelf.ca/",
- "role": "Developer"
+ "name": "Colin O'Dell",
+ "email": "colinodell@gmail.com",
+ "homepage": "http://www.colinodell.com",
+ "role": "Lead Developer"
},
{
- "name": "John Gruber",
- "homepage": "https://daringfireball.net/"
+ "name": "Nick Cernis",
+ "email": "nick@cern.is",
+ "homepage": "http://modernnerd.net",
+ "role": "Original Author"
}
],
- "description": "PHP Markdown",
- "homepage": "https://michelf.ca/projects/php-markdown/",
+ "description": "An HTML-to-markdown conversion helper for PHP",
+ "homepage": "https://github.com/thephpleague/html-to-markdown",
"keywords": [
+ "html",
"markdown"
]
},
{
- "name": "pixel418/markdownify",
- "version": "v2.2.1",
- "version_normalized": "2.2.1.0",
+ "name": "sabre/uri",
+ "version": "1.2.1",
+ "version_normalized": "1.2.1.0",
"source": {
"type": "git",
- "url": "https://github.com/Elephant418/Markdownify.git",
- "reference": "0160677f04c784550dd10fd72fdf3994967db848"
+ "url": "https://github.com/fruux/sabre-uri.git",
+ "reference": "ada354d83579565949d80b2e15593c2371225e61"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/Elephant418/Markdownify/zipball/0160677f04c784550dd10fd72fdf3994967db848",
- "reference": "0160677f04c784550dd10fd72fdf3994967db848",
+ "url": "https://api.github.com/repos/fruux/sabre-uri/zipball/ada354d83579565949d80b2e15593c2371225e61",
+ "reference": "ada354d83579565949d80b2e15593c2371225e61",
"shasum": ""
},
"require": {
- "php": ">=5.3.0"
+ "php": ">=5.4.7"
},
"require-dev": {
- "phpunit/phpunit": "^4.8"
+ "phpunit/phpunit": ">=4.0,<6.0",
+ "sabre/cs": "~1.0.0"
},
- "time": "2016-09-21T13:01:43+00:00",
- "type": "lib",
+ "time": "2017-02-20T19:59:28+00:00",
+ "type": "library",
"installation-source": "dist",
"autoload": {
+ "files": [
+ "lib/functions.php"
+ ],
"psr-4": {
- "Markdownify\\": "src",
- "Test\\Markdownify\\": "test"
+ "Sabre\\Uri\\": "lib/"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
- "LGPL"
+ "BSD-3-Clause"
],
"authors": [
{
- "name": "Peter Kruithof",
- "email": "pkruithof@gmail.com",
- "homepage": "http://pkruithof.tumblr.com/"
- },
- {
- "name": "Milian Wolff",
- "email": "mail@milianw.de",
- "homepage": "http://milianw.de"
- },
- {
- "name": "Thomas Zilliox",
- "email": "hello@tzi.fr",
- "homepage": "http://tzi.fr"
+ "name": "Evert Pot",
+ "email": "me@evertpot.com",
+ "homepage": "http://evertpot.com/",
+ "role": "Developer"
}
],
- "description": "The HTML to Markdown converter for PHP ",
- "homepage": "https://github.com/elephant418/Markdownify",
+ "description": "Functions for making sense out of URIs.",
+ "homepage": "http://sabre.io/uri/",
"keywords": [
- "markdown",
- "markdownify"
+ "rfc3986",
+ "uri",
+ "url"
]
},
{
- "name": "bshaffer/oauth2-server-php",
- "version": "v1.9.0",
- "version_normalized": "1.9.0.0",
+ "name": "sabre/vobject",
+ "version": "4.1.2",
+ "version_normalized": "4.1.2.0",
"source": {
"type": "git",
- "url": "https://github.com/bshaffer/oauth2-server-php.git",
- "reference": "8856aed1a98d6da596ae3f9b8095b5c7a1581697"
+ "url": "https://github.com/fruux/sabre-vobject.git",
+ "reference": "d0fde2fafa2a3dad1f559c2d1c2591d4fd75ae3c"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/bshaffer/oauth2-server-php/zipball/8856aed1a98d6da596ae3f9b8095b5c7a1581697",
- "reference": "8856aed1a98d6da596ae3f9b8095b5c7a1581697",
+ "url": "https://api.github.com/repos/fruux/sabre-vobject/zipball/d0fde2fafa2a3dad1f559c2d1c2591d4fd75ae3c",
+ "reference": "d0fde2fafa2a3dad1f559c2d1c2591d4fd75ae3c",
"shasum": ""
},
"require": {
- "php": ">=5.3.9"
+ "ext-mbstring": "*",
+ "php": ">=5.5",
+ "sabre/xml": ">=1.5 <3.0"
},
"require-dev": {
- "aws/aws-sdk-php": "~2.8",
- "firebase/php-jwt": "~2.2",
- "mongodb/mongodb": "^1.1",
- "predis/predis": "dev-master",
- "thobbs/phpcassa": "dev-master"
+ "phpunit/phpunit": "*",
+ "sabre/cs": "^1.0.0"
},
"suggest": {
- "aws/aws-sdk-php": "~2.8 is required to use DynamoDB storage",
- "firebase/php-jwt": "~1.1 is required to use MondoDB storage",
- "predis/predis": "Required to use Redis storage",
- "thobbs/phpcassa": "Required to use Cassandra storage"
+ "hoa/bench": "If you would like to run the benchmark scripts"
},
- "time": "2017-01-06T23:20:00+00:00",
+ "time": "2016-12-06T04:14:09+00:00",
+ "bin": [
+ "bin/vobject",
+ "bin/generate_vcards"
+ ],
"type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "4.0.x-dev"
+ }
+ },
"installation-source": "dist",
"autoload": {
- "psr-0": {
- "OAuth2": "src/"
+ "psr-4": {
+ "Sabre\\VObject\\": "lib/"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
- "MIT"
+ "BSD-3-Clause"
],
"authors": [
{
- "name": "Brent Shaffer",
- "email": "bshafs@gmail.com",
- "homepage": "http://brentertainment.com"
+ "name": "Evert Pot",
+ "email": "me@evertpot.com",
+ "homepage": "http://evertpot.com/",
+ "role": "Developer"
+ },
+ {
+ "name": "Dominik Tobschall",
+ "email": "dominik@fruux.com",
+ "homepage": "http://tobschall.de/",
+ "role": "Developer"
+ },
+ {
+ "name": "Ivan Enderlin",
+ "email": "ivan.enderlin@hoa-project.net",
+ "homepage": "http://mnt.io/",
+ "role": "Developer"
}
],
- "description": "OAuth2 Server for PHP",
- "homepage": "http://github.com/bshaffer/oauth2-server-php",
+ "description": "The VObject library for PHP allows you to easily parse and manipulate iCalendar and vCard objects",
+ "homepage": "http://sabre.io/vobject/",
"keywords": [
- "auth",
- "oauth",
- "oauth2"
+ "availability",
+ "freebusy",
+ "iCalendar",
+ "ical",
+ "ics",
+ "jCal",
+ "jCard",
+ "recurrence",
+ "rfc2425",
+ "rfc2426",
+ "rfc2739",
+ "rfc4770",
+ "rfc5545",
+ "rfc5546",
+ "rfc6321",
+ "rfc6350",
+ "rfc6351",
+ "rfc6474",
+ "rfc6638",
+ "rfc6715",
+ "rfc6868",
+ "vCalendar",
+ "vCard",
+ "vcf",
+ "xCal",
+ "xCard"
]
},
{
"name": "ezyang/htmlpurifier",
- "version": "v4.9.2",
- "version_normalized": "4.9.2.0",
+ "version": "v4.9.3",
+ "version_normalized": "4.9.3.0",
"source": {
"type": "git",
"url": "https://github.com/ezyang/htmlpurifier.git",
- "reference": "6d50e5282afdfdfc3e0ff6d192aff56c5629b3d4"
+ "reference": "95e1bae3182efc0f3422896a3236e991049dac69"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/ezyang/htmlpurifier/zipball/6d50e5282afdfdfc3e0ff6d192aff56c5629b3d4",
- "reference": "6d50e5282afdfdfc3e0ff6d192aff56c5629b3d4",
+ "url": "https://api.github.com/repos/ezyang/htmlpurifier/zipball/95e1bae3182efc0f3422896a3236e991049dac69",
+ "reference": "95e1bae3182efc0f3422896a3236e991049dac69",
"shasum": ""
},
"require": {
@@ -656,7 +672,7 @@
"require-dev": {
"simpletest/simpletest": "^1.1"
},
- "time": "2017-03-13T06:30:53+00:00",
+ "time": "2017-06-03T02:28:16+00:00",
"type": "library",
"installation-source": "dist",
"autoload": {
@@ -685,68 +701,61 @@
]
},
{
- "name": "simplepie/simplepie",
- "version": "1.5",
- "version_normalized": "1.5.0.0",
+ "name": "sabre/http",
+ "version": "4.2.3",
+ "version_normalized": "4.2.3.0",
"source": {
"type": "git",
- "url": "https://github.com/simplepie/simplepie.git",
- "reference": "5de5551953f95feef12cf355a7a26a70f94aa3ab"
+ "url": "https://github.com/fruux/sabre-http.git",
+ "reference": "0295f9a3ee39be97e0898592fc19e42421e0cd93"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/simplepie/simplepie/zipball/5de5551953f95feef12cf355a7a26a70f94aa3ab",
- "reference": "5de5551953f95feef12cf355a7a26a70f94aa3ab",
+ "url": "https://api.github.com/repos/fruux/sabre-http/zipball/0295f9a3ee39be97e0898592fc19e42421e0cd93",
+ "reference": "0295f9a3ee39be97e0898592fc19e42421e0cd93",
"shasum": ""
},
"require": {
- "php": ">=5.3.0"
+ "ext-ctype": "*",
+ "ext-mbstring": "*",
+ "php": ">=5.4",
+ "sabre/event": ">=1.0.0,<4.0.0",
+ "sabre/uri": "~1.0"
},
"require-dev": {
- "phpunit/phpunit": "~4 || ~5"
+ "phpunit/phpunit": "~4.3",
+ "sabre/cs": "~0.0.1"
},
"suggest": {
- "mf2/mf2": "Microformat module that allows for parsing HTML for microformats"
+ "ext-curl": " to make http requests with the Client class"
},
- "time": "2017-04-17T07:29:31+00:00",
+ "time": "2017-06-12T07:53:04+00:00",
"type": "library",
- "installation-source": "source",
+ "installation-source": "dist",
"autoload": {
- "psr-0": {
- "SimplePie": "library"
+ "files": [
+ "lib/functions.php"
+ ],
+ "psr-4": {
+ "Sabre\\HTTP\\": "lib/"
}
},
+ "notification-url": "https://packagist.org/downloads/",
"license": [
"BSD-3-Clause"
],
"authors": [
{
- "name": "Ryan Parman",
- "homepage": "http://ryanparman.com/",
- "role": "Creator, alumnus developer"
- },
- {
- "name": "Geoffrey Sneddon",
- "homepage": "http://gsnedders.com/",
- "role": "Alumnus developer"
- },
- {
- "name": "Ryan McCue",
- "email": "me@ryanmccue.info",
- "homepage": "http://ryanmccue.info/",
+ "name": "Evert Pot",
+ "email": "me@evertpot.com",
+ "homepage": "http://evertpot.com/",
"role": "Developer"
}
],
- "description": "A simple Atom/RSS parsing library for PHP",
- "homepage": "http://simplepie.org/",
+ "description": "The sabre/http library provides utilities for dealing with http requests and responses. ",
+ "homepage": "https://github.com/fruux/sabre-http",
"keywords": [
- "atom",
- "feeds",
- "rss"
- ],
- "support": {
- "source": "https://github.com/simplepie/simplepie/tree/1.5",
- "issues": "https://github.com/simplepie/simplepie/issues"
- }
+ "http"
+ ]
}
]
diff --git a/vendor/ezyang/htmlpurifier/NEWS b/vendor/ezyang/htmlpurifier/NEWS
index 82ebedf3e..fd5d56cf0 100644
--- a/vendor/ezyang/htmlpurifier/NEWS
+++ b/vendor/ezyang/htmlpurifier/NEWS
@@ -9,6 +9,14 @@ NEWS ( CHANGELOG and HISTORY ) HTMLPurifier
. Internal change
==========================
+4.9.3, released 2017-06-02
+- Workaround PHP 7.1 infinite loop when opcode cache is enabled.
+ Thanks @Xiphin (#134, #135)
+- Don't use autoloader when testing for DOMDocument. Hypothetically,
+ this could cause your install to start using DirectLex if you had
+ previously been monkeypatching in a custom, autoloaded implementation
+ of DOMDocument. Don't do that. Thanks @Izumi-kun (#130)
+
4.9.2, released 2017-03-12
- Fixes PHP 5.3 compatibility
- Fix breakage when decoding decimal entities. Thanks @rybakit (#129)
diff --git a/vendor/ezyang/htmlpurifier/VERSION b/vendor/ezyang/htmlpurifier/VERSION
index b550c72a1..e94f14fa9 100644
--- a/vendor/ezyang/htmlpurifier/VERSION
+++ b/vendor/ezyang/htmlpurifier/VERSION
@@ -1 +1 @@
-4.9.2 \ No newline at end of file
+4.9.3 \ No newline at end of file
diff --git a/vendor/ezyang/htmlpurifier/WHATSNEW b/vendor/ezyang/htmlpurifier/WHATSNEW
index b435e664b..810086f27 100644
--- a/vendor/ezyang/htmlpurifier/WHATSNEW
+++ b/vendor/ezyang/htmlpurifier/WHATSNEW
@@ -7,6 +7,7 @@ entity decoding (we won't accidentally encode entities that occur
in URLs) and rel="noopener" on links with target attributes,
to prevent them from overwriting the original frame.
-4.9.0 was skipped due to a packaging problem; 4.9.2 fixes two
-major regressions in PHP 5.3 support and entity decoding; no
-other functional changes were applied.
+4.9.3 works around an infinite loop bug in PHP 7.1 with the opcode
+cache (and has one other, minor bugfix, avoiding using autoloading
+when testing for DOMDocument presence). If these bugs do not
+affect you, you do not need to upgrade.
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier.includes.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier.includes.php
index 7779fe34d..e8bce5c85 100644
--- a/vendor/ezyang/htmlpurifier/library/HTMLPurifier.includes.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier.includes.php
@@ -7,7 +7,7 @@
* primary concern and you are using an opcode cache. PLEASE DO NOT EDIT THIS
* FILE, changes will be overwritten the next time the script is run.
*
- * @version 4.9.2
+ * @version 4.9.3
*
* @warning
* You must *not* include any other HTML Purifier files before this file,
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier.php
index 9c539e225..b4605ebc6 100644
--- a/vendor/ezyang/htmlpurifier/library/HTMLPurifier.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier.php
@@ -19,7 +19,7 @@
*/
/*
- HTML Purifier 4.9.2 - Standards Compliant HTML Filtering
+ HTML Purifier 4.9.3 - Standards Compliant HTML Filtering
Copyright (C) 2006-2008 Edward Z. Yang
This library is free software; you can redistribute it and/or
@@ -58,12 +58,12 @@ class HTMLPurifier
* Version of HTML Purifier.
* @type string
*/
- public $version = '4.9.2';
+ public $version = '4.9.3';
/**
* Constant with version of HTML Purifier.
*/
- const VERSION = '4.9.2';
+ const VERSION = '4.9.3';
/**
* Global configuration object.
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ChildDef/List.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ChildDef/List.php
index 5a53a4b49..4fc70e0ef 100644
--- a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ChildDef/List.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ChildDef/List.php
@@ -50,7 +50,7 @@ class HTMLPurifier_ChildDef_List extends HTMLPurifier_ChildDef
// a little sanity check to make sure it's not ALL whitespace
$all_whitespace = true;
- $current_li = false;
+ $current_li = null;
foreach ($children as $node) {
if (!empty($node->is_whitespace)) {
@@ -71,7 +71,7 @@ class HTMLPurifier_ChildDef_List extends HTMLPurifier_ChildDef
// to handle non-list elements; non-list elements should
// not be appended to an existing li; only li created
// for non-list. This distinction is not currently made.
- if ($current_li === false) {
+ if ($current_li === null) {
$current_li = new HTMLPurifier_Node_Element('li');
$result[] = $current_li;
}
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Config.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Config.php
index 69e6d2765..3648364b3 100644
--- a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Config.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Config.php
@@ -21,7 +21,7 @@ class HTMLPurifier_Config
* HTML Purifier's version
* @type string
*/
- public $version = '4.9.2';
+ public $version = '4.9.3';
/**
* Whether or not to automatically finalize
@@ -333,7 +333,7 @@ class HTMLPurifier_Config
}
// Raw type might be negative when using the fully optimized form
- // of stdclass, which indicates allow_null == true
+ // of stdClass, which indicates allow_null == true
$rtype = is_int($def) ? $def : $def->type;
if ($rtype < 0) {
$type = -$rtype;
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema.php
index bfbb0f92f..655c0e97a 100644
--- a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/ConfigSchema.php
@@ -24,11 +24,11 @@ class HTMLPurifier_ConfigSchema
*
* array(
* 'Namespace' => array(
- * 'Directive' => new stdclass(),
+ * 'Directive' => new stdClass(),
* )
* )
*
- * The stdclass may have the following properties:
+ * The stdClass may have the following properties:
*
* - If isAlias isn't set:
* - type: Integer type of directive, see HTMLPurifier_VarParser for definitions
@@ -39,8 +39,8 @@ class HTMLPurifier_ConfigSchema
* - namespace: Namespace this directive aliases to
* - name: Directive name this directive aliases to
*
- * In certain degenerate cases, stdclass will actually be an integer. In
- * that case, the value is equivalent to an stdclass with the type
+ * In certain degenerate cases, stdClass will actually be an integer. In
+ * that case, the value is equivalent to an stdClass with the type
* property set to the integer. If the integer is negative, type is
* equal to the absolute value of integer, and allow_null is true.
*
@@ -105,7 +105,7 @@ class HTMLPurifier_ConfigSchema
*/
public function add($key, $default, $type, $allow_null)
{
- $obj = new stdclass();
+ $obj = new stdClass();
$obj->type = is_int($type) ? $type : HTMLPurifier_VarParser::$types[$type];
if ($allow_null) {
$obj->allow_null = true;
@@ -152,14 +152,14 @@ class HTMLPurifier_ConfigSchema
*/
public function addAlias($key, $new_key)
{
- $obj = new stdclass;
+ $obj = new stdClass;
$obj->key = $new_key;
$obj->isAlias = true;
$this->info[$key] = $obj;
}
/**
- * Replaces any stdclass that only has the type property with type integer.
+ * Replaces any stdClass that only has the type property with type integer.
*/
public function postProcess()
{
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Generator.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Generator.php
index 6fb568714..eb56e2dfa 100644
--- a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Generator.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Generator.php
@@ -146,7 +146,7 @@ class HTMLPurifier_Generator
$attr = $this->generateAttributes($token->attr, $token->name);
if ($this->_flashCompat) {
if ($token->name == "object") {
- $flash = new stdclass();
+ $flash = new stdClass();
$flash->attr = $token->attr;
$flash->param = array();
$this->_flashStack[] = $flash;
diff --git a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Lexer.php b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Lexer.php
index 99b3c7df0..e9da3ed5e 100644
--- a/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Lexer.php
+++ b/vendor/ezyang/htmlpurifier/library/HTMLPurifier/Lexer.php
@@ -96,7 +96,7 @@ class HTMLPurifier_Lexer
break;
}
- if (class_exists('DOMDocument') &&
+ if (class_exists('DOMDocument', false) &&
method_exists('DOMDocument', 'loadHTML') &&
!extension_loaded('domxml')
) {
diff --git a/vendor/league/html-to-markdown/CHANGELOG.md b/vendor/league/html-to-markdown/CHANGELOG.md
new file mode 100644
index 000000000..067864412
--- /dev/null
+++ b/vendor/league/html-to-markdown/CHANGELOG.md
@@ -0,0 +1,214 @@
+# Change Log
+All notable changes to this project will be documented in this file.
+Updates should follow the [Keep a CHANGELOG](http://keepachangelog.com/) principles.
+
+## [Unreleased][unreleased]
+
+## [4.4.1]
+
+### Fixed
+ - Fixed autolinking of invalid URLs (#129)
+
+## [4.4.0]
+
+### Added
+ - Added `hard_break` configuration option (#112, #115)
+ - The `HtmlConverter` can now be instantiated with an `Environment` (#118)
+
+### Fixed
+ - Fixed handling of paragraphs in list item elements (#47, #110)
+ - Fixed phantom spaces when newlines follow `br` elements (#116, #117)
+ - Fixed link converter not sanitizing inner spaces properly (#119, #120)
+
+## [4.3.1]
+### Changed
+ - Revised the sanitization implementation (#109)
+
+### Fixed
+ - Fixed tag-like content not being escaped (#67, #109)
+ - Fixed thematic break-like content not being escaped (#65, #109)
+ - Fixed codefence-like content not being escaped (#64, #109)
+
+## [4.3.0]
+### Added
+ - Added full support for PHP 7.0 and 7.1
+
+### Changed
+ - Changed `<pre>` and `<pre><code>` conversions to use backticks instead of indendation (#102)
+
+### Fixed
+ - Fixed issue where specified code language was not preserved (#70, #102)
+ - Fixed issue where `<code>` tags nested in `<pre>` was not converted properly (#70, #102)
+ - Fixed header-like content not being escaped (#76, #105)
+ - Fixed blockquote-like content not being escaped (#77, #103)
+ - Fixed ordered list-like content not being escaped (#73, #106)
+ - Fixed unordered list-like content not being escaped (#71, #107)
+
+## [4.2.2]
+### Fixed
+ - Fixed sanitization bug which sometimes removes desired content (#63, #101)
+
+## [4.2.1]
+### Fixed
+ - Fixed path to autoload.php when used as a library (#98)
+ - Fixed edge case for tags containing only whitespace (#99)
+
+### Removed
+ - Removed double HTML entity decoding, as this is not desireable (#60)
+
+## [4.2.0]
+
+### Added
+ - Added the ability to invoke HtmlConverter objects as functions (#85)
+
+### Fixed
+ - Fixed improper handling of nested list items (#19 and #84)
+ - Fixed preceeding or trailing spaces within emphasis tags (#83)
+
+## [4.1.1]
+
+### Fixed
+ - Fixed conversion of empty paragraphs (#78)
+ - Fixed `preg_replace` so it wouldn't break UTF-8 characters (#79)
+
+## [4.1.0]
+
+### Added
+ - Added `bin/html-to-markdown` script
+
+### Changed
+ - Changed default italic character to `_` (#58)
+
+## [4.0.1]
+
+### Fixed
+ - Added escaping to avoid * and _ in a text being rendered as emphasis (#48)
+
+### Removed
+ - Removed the demo (#51)
+ - `.styleci.yml` and `CONTRIBUTING.md` are no longer included in distributions (#50)
+
+## [4.0.0]
+
+This release changes the visibility of several methods/properties. #42 and #43 brought to light that some visiblities were
+not ideally set, so this releases fixes that. Moving forwards this should reduce the chance of introducing BC-breaking changes.
+
+### Added
+ - Added new `HtmlConverter::getEnvironment()` method to expose the `Environment` (#42, #43)
+
+### Changed
+ - Changed `Environment::addConverter()` from `protected` to `public`, enabling custom converters to be added (#42, #43)
+ - Changed `HtmlConverter::createDOMDocument()` from `protected` to `private`
+ - Changed `Element::nextCached` from `protected` to `private`
+ - Made the `Environment` class `final`
+
+## [3.1.1]
+### Fixed
+ - Empty HTML strings now result in empty Markdown documents (#40, #41)
+
+## [3.1.0]
+### Added
+ - Added new `equals` method to `Element` to check for equality
+
+### Changes
+ - Use Linux line endings consistently instead of plaform-specific line endings (#36)
+
+### Fixed
+ - Cleaned up code style
+
+## [3.0.0]
+### Changed
+ - Changed namespace to `League\HTMLToMarkdown`
+ - Changed packagist name to `league/html-to-markdown`
+ - Re-organized code into several separate classes
+ - `<a>` tags with identical href and inner text are now rendered using angular bracket syntax (#31)
+ - `<div>` elements are now treated as block-level elements (#33)
+
+## [2.2.2]
+### Added
+ - Added support for PHP 5.6 and HHVM
+ - Enabled testing against PHP 7 nightlies
+ - Added this CHANGELOG.md
+
+### Fixed
+ - Fixed whitespace preservation between inline elements (#9 and #10)
+
+## [2.2.1]
+### Fixed
+ - Preserve placeholder links (#22)
+
+## [2.2.0]
+### Added
+ - Added CircleCI config
+
+### Changed
+ - `<pre>` blocks are now treated as code elements
+
+### Removed
+ - Dropped support for PHP 5.2
+ - Removed incorrect README comment regarding `#text` nodes (#17)
+
+## [2.1.2]
+### Added
+ - Added the ability to blacklist/remove specific node types (#11)
+
+### Changed
+ - Line breaks are now placed after divs instead of before them
+ - Newlines inside of link texts are now removed
+ - Updated the minimum PHPUnit version to 4.*
+
+## [2.1.1]
+### Added
+ - Added options to customize emphasis characters
+
+## [2.1.0]
+### Added
+ - Added option to strip HTML tags without Markdown equivalents
+ - Added `convert()` method for converter reuse
+ - Added ability to set options after instance construction
+ - Documented the required PHP extensions (#4)
+
+### Changed
+ - ATX style now used for h1 and h2 tags inside blockquotes
+
+### Fixed
+ - Newlines inside blockquotes are now started with a bracket
+ - Fixed some incorrect docblocks
+ - `__toString()` now returns an empty string if input is empty
+ - Convert head tag if body tag is empty (#7)
+ - Preserve special characters inside tags without md equivalents (#6)
+
+
+## [2.0.1]
+### Fixed
+ - Fixed first line indentation for multi-line code blocks
+ - Fixed consecutive anchors get separating spaces stripped (#3)
+
+## [2.0.0]
+### Added
+ - Initial release
+
+[unreleased]: https://github.com/thephpleague/html-to-markdown/compare/4.4.1...master
+[4.4.1]: https://github.com/thephpleague/html-to-markdown/compare/4.4.0...4.4.1
+[4.4.0]: https://github.com/thephpleague/html-to-markdown/compare/4.3.1...4.4.0
+[4.3.1]: https://github.com/thephpleague/html-to-markdown/compare/4.3.0...4.3.1
+[4.3.0]: https://github.com/thephpleague/html-to-markdown/compare/4.2.2...4.3.0
+[4.2.2]: https://github.com/thephpleague/html-to-markdown/compare/4.2.1...4.2.2
+[4.2.1]: https://github.com/thephpleague/html-to-markdown/compare/4.2.0...4.2.1
+[4.2.0]: https://github.com/thephpleague/html-to-markdown/compare/4.1.1...4.2.0
+[4.1.1]: https://github.com/thephpleague/html-to-markdown/compare/4.1.0...4.1.1
+[4.1.0]: https://github.com/thephpleague/html-to-markdown/compare/4.0.1...4.1.0
+[4.0.1]: https://github.com/thephpleague/html-to-markdown/compare/4.0.0...4.0.1
+[4.0.0]: https://github.com/thephpleague/html-to-markdown/compare/3.1.1...4.0.0
+[3.1.1]: https://github.com/thephpleague/html-to-markdown/compare/3.1.0...3.1.1
+[3.1.0]: https://github.com/thephpleague/html-to-markdown/compare/3.0.0...3.1.0
+[3.0.0]: https://github.com/thephpleague/html-to-markdown/compare/2.2.2...3.0.0
+[2.2.2]: https://github.com/thephpleague/html-to-markdown/compare/2.2.1...2.2.2
+[2.2.1]: https://github.com/thephpleague/html-to-markdown/compare/2.2.0...2.2.1
+[2.2.0]: https://github.com/thephpleague/html-to-markdown/compare/2.1.2...2.2.0
+[2.1.2]: https://github.com/thephpleague/html-to-markdown/compare/2.1.1...2.1.2
+[2.1.1]: https://github.com/thephpleague/html-to-markdown/compare/2.1.0...2.1.1
+[2.1.0]: https://github.com/thephpleague/html-to-markdown/compare/2.0.1...2.1.0
+[2.0.1]: https://github.com/thephpleague/html-to-markdown/compare/2.0.0...2.0.1
+[2.0.0]: https://github.com/thephpleague/html-to-markdown/compare/775f91e...2.0.0
+
diff --git a/vendor/league/html-to-markdown/CONDUCT.md b/vendor/league/html-to-markdown/CONDUCT.md
new file mode 100644
index 000000000..01b8644f1
--- /dev/null
+++ b/vendor/league/html-to-markdown/CONDUCT.md
@@ -0,0 +1,22 @@
+# Contributor Code of Conduct
+
+As contributors and maintainers of this project, and in the interest of fostering an open and welcoming community, we pledge to respect all people who contribute through reporting issues, posting feature requests, updating documentation, submitting pull requests or patches, and other activities.
+
+We are committed to making participation in this project a harassment-free experience for everyone, regardless of level of experience, gender, gender identity and expression, sexual orientation, disability, personal appearance, body size, race, ethnicity, age, religion, or nationality.
+
+Examples of unacceptable behavior by participants include:
+
+* The use of sexualized language or imagery
+* Personal attacks
+* Trolling or insulting/derogatory comments
+* Public or private harassment
+* Publishing other's private information, such as physical or electronic addresses, without explicit permission
+* Other unethical or unprofessional conduct.
+
+Project maintainers have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct. By adopting this Code of Conduct, project maintainers commit themselves to fairly and consistently applying these principles to every aspect of managing this project. Project maintainers who do not follow or enforce the Code of Conduct may be permanently removed from the project team.
+
+This code of conduct applies both within project spaces and in public spaces when an individual is representing the project or its community.
+
+Instances of abusive, harassing, or otherwise unacceptable behavior may be reported by opening an issue or contacting one or more of the project maintainers.
+
+This Code of Conduct is adapted from the [Contributor Covenant](http://contributor-covenant.org), version 1.2.0, available at [http://contributor-covenant.org/version/1/2/0/](http://contributor-covenant.org/version/1/2/0/)
diff --git a/vendor/league/html-to-markdown/LICENSE b/vendor/league/html-to-markdown/LICENSE
new file mode 100644
index 000000000..6c04a59dd
--- /dev/null
+++ b/vendor/league/html-to-markdown/LICENSE
@@ -0,0 +1,22 @@
+The MIT License (MIT)
+
+Copyright (c) 2015 Colin O'Dell
+
+Originally created by Nick Cernis
+
+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. \ No newline at end of file
diff --git a/vendor/league/html-to-markdown/README.md b/vendor/league/html-to-markdown/README.md
new file mode 100644
index 000000000..8d75649d6
--- /dev/null
+++ b/vendor/league/html-to-markdown/README.md
@@ -0,0 +1,196 @@
+HTML To Markdown for PHP
+========================
+
+[![Join the chat at https://gitter.im/thephpleague/html-to-markdown](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/thephpleague/html-to-markdown?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)
+
+[![Latest Version](https://img.shields.io/packagist/v/league/html-to-markdown.svg?style=flat-square)](https://packagist.org/packages/league/html-to-markdown)
+[![Software License](http://img.shields.io/badge/license-MIT-brightgreen.svg?style=flat-square)](LICENSE)
+[![Build Status](https://img.shields.io/travis/thephpleague/html-to-markdown/master.svg?style=flat-square)](https://travis-ci.org/thephpleague/html-to-markdown)
+[![Coverage Status](https://img.shields.io/scrutinizer/coverage/g/thephpleague/html-to-markdown.svg?style=flat-square)](https://scrutinizer-ci.com/g/thephpleague/html-to-markdown/code-structure)
+[![Quality Score](https://img.shields.io/scrutinizer/g/thephpleague/html-to-markdown.svg?style=flat-square)](https://scrutinizer-ci.com/g/thephpleague/html-to-markdown)
+[![Total Downloads](https://img.shields.io/packagist/dt/league/html-to-markdown.svg?style=flat-square)](https://packagist.org/packages/league/html-to-markdown)
+
+Library which converts HTML to [Markdown](http://daringfireball.net/projects/markdown/) for your sanity and convenience.
+
+
+**Requires**: PHP 5.3+
+
+**Lead Developer**: [@colinodell](http://twitter.com/colinodell)
+
+**Original Author**: [@nickcernis](http://twitter.com/nickcernis)
+
+
+### Why convert HTML to Markdown?
+
+*"What alchemy is this?"* you mutter. *"I can see why you'd convert [Markdown to HTML](https://github.com/thephpleague/commonmark),"* you continue, already labouring the question somewhat, *"but why go the other way?"*
+
+Typically you would convert HTML to Markdown if:
+
+1. You have an existing HTML document that needs to be edited by people with good taste.
+2. You want to store new content in HTML format but edit it as Markdown.
+3. You want to convert HTML email to plain text email.
+4. You know a guy who's been converting HTML to Markdown for years, and now he can speak Elvish. You'd quite like to be able to speak Elvish.
+5. You just really like Markdown.
+
+### How to use it
+
+Require the library by issuing this command:
+
+```bash
+composer require league/html-to-markdown
+```
+
+Add `require 'vendor/autoload.php';` to the top of your script.
+
+Next, create a new HtmlConverter instance, passing in your valid HTML code to its `convert()` function:
+
+```php
+use League\HTMLToMarkdown\HtmlConverter;
+
+$converter = new HtmlConverter();
+
+$html = "<h3>Quick, to the Batpoles!</h3>";
+$markdown = $converter->convert($html);
+```
+
+The `$markdown` variable now contains the Markdown version of your HTML as a string:
+
+```php
+echo $markdown; // ==> ### Quick, to the Batpoles!
+```
+
+The included `demo` directory contains an HTML->Markdown conversion form to try out.
+
+### Conversion options
+
+By default, HTML To Markdown preserves HTML tags without Markdown equivalents, like `<span>` and `<div>`.
+
+To strip HTML tags that don't have a Markdown equivalent while preserving the content inside them, set `strip_tags` to true, like this:
+
+```php
+$converter = new HtmlConverter(array('strip_tags' => true));
+
+$html = '<span>Turnips!</span>';
+$markdown = $converter->convert($html); // $markdown now contains "Turnips!"
+```
+
+Or more explicitly, like this:
+
+```php
+$converter = new HtmlConverter();
+$converter->getConfig()->setOption('strip_tags', true);
+
+$html = '<span>Turnips!</span>';
+$markdown = $converter->convert($html); // $markdown now contains "Turnips!"
+```
+
+Note that only the tags themselves are stripped, not the content they hold.
+
+To strip tags and their content, pass a space-separated list of tags in `remove_nodes`, like this:
+
+```php
+$converter = new HtmlConverter(array('remove_nodes' => 'span div'));
+
+$html = '<span>Turnips!</span><div>Monkeys!</div>';
+$markdown = $converter->convert($html); // $markdown now contains ""
+```
+
+### Style options
+
+Bold and italic tags are converted using the asterisk syntax by default. Change this to the underlined syntax using the `bold_style` and `italic_style` options.
+
+```php
+$converter = new HtmlConverter();
+$converter->getConfig()->setOption('italic_style', '_');
+$converter->getConfig()->setOption('bold_style', '__');
+
+$html = '<em>Italic</em> and a <strong>bold</strong>';
+$markdown = $converter->convert($html); // $markdown now contains "_Italic_ and a __bold__"
+```
+
+### Line break options
+
+By default, `br` tags are converted to two spaces followed by a newline character as per [traditional Markdown](https://daringfireball.net/projects/markdown/syntax#p). Set `hard_break` to `true` to omit the two spaces, as per GitHub Flavored Markdown (GFM).
+
+```php
+$converter = new HtmlConverter();
+$html = '<p>test<br>line break</p>';
+
+$converter->getConfig()->setOption('hard_break', true);
+$markdown = $converter->convert($html); // $markdown now contains "test\nline break"
+
+$converter->getConfig()->setOption('hard_break', false); // default
+$markdown = $converter->convert($html); // $markdown now contains "test \nline break"
+```
+
+### Passing custom Environment object
+
+You can pass current `Environment` object to customize i.e. which converters should be used.
+
+```php
+$environment = new Environment(array(
+ // your configuration here
+));
+$environment->addConverter(new HeaderConverter()); // optionally - add converter manually
+
+$converter = new HtmlConverter($environment);
+
+$html = '<h3>Header</h3>
+<img src="" />
+';
+$markdown = $converter->convert($html); // $markdown now contains "### Header" and "<img src="" />"
+```
+
+### Limitations
+
+- Markdown Extra, MultiMarkdown and other variants aren't supported – just Markdown.
+
+### Known issues
+
+- Nested lists and lists containing multiple paragraphs aren't converted correctly.
+- Lists inside blockquotes aren't converted correctly.
+- Any reported [open issues here](https://github.com/thephpleague/html-to-markdown/issues?state=open).
+
+[Report your issue or request a feature here.](https://github.com/thephpleague/html-to-markdown/issues/new) Issues with patches or failing tests are especially welcome.
+
+### Style notes
+
+- Setext (underlined) headers are the default for H1 and H2. If you prefer the ATX style for H1 and H2 (# Header 1 and ## Header 2), set `header_style` to 'atx' in the options array when you instantiate the object:
+
+ `$converter = new HtmlConverter(array('header_style'=>'atx'));`
+
+ Headers of H3 priority and lower always use atx style.
+
+- Links and images are referenced inline. Footnote references (where image src and anchor href attributes are listed in the footnotes) are not used.
+- Blockquotes aren't line wrapped – it makes the converted Markdown easier to edit.
+
+### Dependencies
+
+HTML To Markdown requires PHP's [xml](http://www.php.net/manual/en/xml.installation.php), [lib-xml](http://www.php.net/manual/en/libxml.installation.php), and [dom](http://www.php.net/manual/en/dom.installation.php) extensions, all of which are enabled by default on most distributions.
+
+Errors such as "Fatal error: Class 'DOMDocument' not found" on distributions such as CentOS that disable PHP's xml extension can be resolved by installing php-xml.
+
+### Contributors
+
+Many thanks to all [contributors](https://github.com/thephpleague/html-to-markdown/graphs/contributors) so far. Further improvements and feature suggestions are very welcome.
+
+### How it works
+
+HTML To Markdown creates a DOMDocument from the supplied HTML, walks through the tree, and converts each node to a text node containing the equivalent markdown, starting from the most deeply nested node and working inwards towards the root node.
+
+### To-do
+
+- Support for nested lists and lists inside blockquotes.
+- Offer an option to preserve tags as HTML if they contain attributes that can't be represented with Markdown (e.g. `style`).
+
+### Trying to convert Markdown to HTML?
+
+Use one of these great libraries:
+
+ - [league/commonmark](https://github.com/thephpleague/commonmark) (recommended)
+ - [cebe/markdown](https://github.com/cebe/markdown)
+ - [PHP Markdown](https://michelf.ca/projects/php-markdown/)
+ - [Parsedown](https://github.com/erusev/parsedown)
+
+No guarantees about the Elvish, though.
+
diff --git a/vendor/league/html-to-markdown/bin/html-to-markdown b/vendor/league/html-to-markdown/bin/html-to-markdown
new file mode 100755
index 000000000..2815a7cef
--- /dev/null
+++ b/vendor/league/html-to-markdown/bin/html-to-markdown
@@ -0,0 +1,108 @@
+#!/usr/bin/env php
+<?php
+
+requireAutoloader();
+
+ini_set('display_errors', 'stderr');
+
+foreach ($argv as $i => $arg) {
+ if ($i === 0) {
+ continue;
+ }
+
+ if (substr($arg, 0, 1) === '-') {
+ switch ($arg) {
+ case '-h':
+ case '--help':
+ echo getHelpText();
+ exit(0);
+ default:
+ fail('Unknown option: ' . $arg);
+ }
+ } else {
+ $src = $argv[1];
+ }
+}
+
+if (isset($src)) {
+ if (!file_exists($src)) {
+ fail('File not found: ' . $src);
+ }
+
+ $html = file_get_contents($src);
+} else {
+ $stdin = fopen('php://stdin', 'r');
+ stream_set_blocking($stdin, false);
+ $html = stream_get_contents($stdin);
+ fclose($stdin);
+
+ if (empty($html)) {
+ fail(getHelpText());
+ }
+}
+
+
+$converter = new League\HTMLToMarkdown\HtmlConverter();
+echo $converter->convert($html);
+
+/**
+ * Get help and usage info
+ *
+ * @return string
+ */
+function getHelpText()
+{
+ return <<<HELP
+HTML To Markdown
+
+Usage: html-to-markdown [OPTIONS] [FILE]
+
+ -h, --help Shows help and usage information
+
+ If no file is given, input will be read from STDIN
+
+Examples:
+
+ Converting a file named document.html:
+
+ html-to-markdown document.html
+
+ Converting a file and saving its output:
+
+ html-to-markdown document.html > output.md
+
+ Converting from STDIN:
+
+ echo -e '<h1>Hello World!</h1>' | html-to-markdown
+
+ Converting from STDIN and saving the output:
+
+ echo -e '<h1>Hello World!</h1>' | html-to-markdown > output.md
+
+HELP;
+}
+
+/**
+ * @param string $message Error message
+ */
+function fail($message)
+{
+ fwrite(STDERR, $message . "\n");
+ exit(1);
+}
+
+function requireAutoloader()
+{
+ $autoloadPaths = array(
+ // Local package usage
+ __DIR__ . '/../vendor/autoload.php',
+ // Package was included as a library
+ __DIR__ . '/../../../autoload.php',
+ );
+ foreach ($autoloadPaths as $path) {
+ if (file_exists($path)) {
+ require_once $path;
+ break;
+ }
+ }
+}
diff --git a/vendor/league/html-to-markdown/composer.json b/vendor/league/html-to-markdown/composer.json
new file mode 100644
index 000000000..58764bcb5
--- /dev/null
+++ b/vendor/league/html-to-markdown/composer.json
@@ -0,0 +1,48 @@
+{
+ "name": "league/html-to-markdown",
+ "type": "library",
+ "description": "An HTML-to-markdown conversion helper for PHP",
+ "keywords": ["markdown", "html"],
+ "homepage": "https://github.com/thephpleague/html-to-markdown",
+ "license": "MIT",
+ "authors": [
+ {
+ "name": "Colin O'Dell",
+ "email": "colinodell@gmail.com",
+ "homepage": "http://www.colinodell.com",
+ "role": "Lead Developer"
+ },
+ {
+ "name": "Nick Cernis",
+ "email": "nick@cern.is",
+ "homepage": "http://modernnerd.net",
+ "role": "Original Author"
+ }
+ ],
+ "autoload": {
+ "psr-4": {
+ "League\\HTMLToMarkdown\\": "src/"
+ }
+ },
+ "autoload-dev": {
+ "psr-4": {
+ "League\\HTMLToMarkdown\\Test\\": "tests"
+ }
+ },
+ "require": {
+ "php": ">=5.3.3",
+ "ext-dom": "*",
+ "ext-xml": "*"
+ },
+ "require-dev": {
+ "mikehaertl/php-shellcommand": "~1.1.0",
+ "phpunit/phpunit": "4.*",
+ "scrutinizer/ocular": "~1.1"
+ },
+ "bin": ["bin/html-to-markdown"],
+ "extra": {
+ "branch-alias": {
+ "dev-master": "4.5-dev"
+ }
+ }
+}
diff --git a/vendor/league/html-to-markdown/src/Configuration.php b/vendor/league/html-to-markdown/src/Configuration.php
new file mode 100644
index 000000000..2943383aa
--- /dev/null
+++ b/vendor/league/html-to-markdown/src/Configuration.php
@@ -0,0 +1,60 @@
+<?php
+
+namespace League\HTMLToMarkdown;
+
+class Configuration
+{
+ protected $config;
+
+ /**
+ * @param array $config
+ */
+ public function __construct(array $config = array())
+ {
+ $this->config = $config;
+ }
+
+ /**
+ * @param array $config
+ */
+ public function merge(array $config = array())
+ {
+ $this->config = array_replace_recursive($this->config, $config);
+ }
+
+ /**
+ * @param array $config
+ */
+ public function replace(array $config = array())
+ {
+ $this->config = $config;
+ }
+
+ /**
+ * @param string $key
+ * @param mixed $value
+ */
+ public function setOption($key, $value)
+ {
+ $this->config[$key] = $value;
+ }
+
+ /**
+ * @param string|null $key
+ * @param mixed|null $default
+ *
+ * @return mixed|null
+ */
+ public function getOption($key = null, $default = null)
+ {
+ if ($key === null) {
+ return $this->config;
+ }
+
+ if (!isset($this->config[$key])) {
+ return $default;
+ }
+
+ return $this->config[$key];
+ }
+}
diff --git a/vendor/league/html-to-markdown/src/ConfigurationAwareInterface.php b/vendor/league/html-to-markdown/src/ConfigurationAwareInterface.php
new file mode 100644
index 000000000..8aca530be
--- /dev/null
+++ b/vendor/league/html-to-markdown/src/ConfigurationAwareInterface.php
@@ -0,0 +1,11 @@
+<?php
+
+namespace League\HTMLToMarkdown;
+
+interface ConfigurationAwareInterface
+{
+ /**
+ * @param Configuration $config
+ */
+ public function setConfig(Configuration $config);
+}
diff --git a/vendor/league/html-to-markdown/src/Converter/BlockquoteConverter.php b/vendor/league/html-to-markdown/src/Converter/BlockquoteConverter.php
new file mode 100644
index 000000000..eb2d09d17
--- /dev/null
+++ b/vendor/league/html-to-markdown/src/Converter/BlockquoteConverter.php
@@ -0,0 +1,44 @@
+<?php
+
+namespace League\HTMLToMarkdown\Converter;
+
+use League\HTMLToMarkdown\ElementInterface;
+
+class BlockquoteConverter implements ConverterInterface
+{
+ /**
+ * @param ElementInterface $element
+ *
+ * @return string
+ */
+ public function convert(ElementInterface $element)
+ {
+ // Contents should have already been converted to Markdown by this point,
+ // so we just need to add '>' symbols to each line.
+
+ $markdown = '';
+
+ $quote_content = trim($element->getValue());
+
+ $lines = preg_split('/\r\n|\r|\n/', $quote_content);
+
+ $total_lines = count($lines);
+
+ foreach ($lines as $i => $line) {
+ $markdown .= '> ' . $line . "\n";
+ if ($i + 1 === $total_lines) {
+ $markdown .= "\n";
+ }
+ }
+
+ return $markdown;
+ }
+
+ /**
+ * @return string[]
+ */
+ public function getSupportedTags()
+ {
+ return array('blockquote');
+ }
+}
diff --git a/vendor/league/html-to-markdown/src/Converter/CodeConverter.php b/vendor/league/html-to-markdown/src/Converter/CodeConverter.php
new file mode 100644
index 000000000..c8ec2c005
--- /dev/null
+++ b/vendor/league/html-to-markdown/src/Converter/CodeConverter.php
@@ -0,0 +1,62 @@
+<?php
+
+namespace League\HTMLToMarkdown\Converter;
+
+use League\HTMLToMarkdown\ElementInterface;
+
+class CodeConverter implements ConverterInterface
+{
+ /**
+ * @param ElementInterface $element
+ *
+ * @return string
+ */
+ public function convert(ElementInterface $element)
+ {
+ $language = null;
+
+ // Checking for language class on the code block
+ $classes = $element->getAttribute('class');
+
+ if ($classes) {
+ // Since tags can have more than one class, we need to find the one that starts with 'language-'
+ $classes = explode(' ', $classes);
+ foreach ($classes as $class) {
+ if (strpos($class, 'language-') !== false) {
+ // Found one, save it as the selected language and stop looping over the classes.
+ // The space after the language avoids gluing the actual code with the language tag
+ $language = str_replace('language-', '', $class) . ' ';
+ break;
+ }
+ }
+ }
+
+ $markdown = '';
+ $code = html_entity_decode($element->getChildrenAsString());
+
+ // In order to remove the code tags we need to search for them and, in the case of the opening tag
+ // use a regular expression to find the tag and the other attributes it might have
+ $code = preg_replace('/<code\b[^>]*>/', '', $code);
+ $code = str_replace('</code>', '', $code);
+
+ // Checking if the code has multiple lines
+ $lines = preg_split('/\r\n|\r|\n/', $code);
+ if (count($lines) > 1) {
+ // Multiple lines detected, adding three backticks and newlines
+ $markdown .= '```' . $language . "\n" . $code . "\n" . '```';
+ } else {
+ // One line of code, wrapping it on one backtick.
+ $markdown .= '`' . $language . $code . '`';
+ }
+
+ return $markdown;
+ }
+
+ /**
+ * @return string[]
+ */
+ public function getSupportedTags()
+ {
+ return array('code');
+ }
+}
diff --git a/vendor/league/html-to-markdown/src/Converter/CommentConverter.php b/vendor/league/html-to-markdown/src/Converter/CommentConverter.php
new file mode 100644
index 000000000..55038b254
--- /dev/null
+++ b/vendor/league/html-to-markdown/src/Converter/CommentConverter.php
@@ -0,0 +1,26 @@
+<?php
+
+namespace League\HTMLToMarkdown\Converter;
+
+use League\HTMLToMarkdown\ElementInterface;
+
+class CommentConverter implements ConverterInterface
+{
+ /**
+ * @param ElementInterface $element
+ *
+ * @return string
+ */
+ public function convert(ElementInterface $element)
+ {
+ return '';
+ }
+
+ /**
+ * @return string[]
+ */
+ public function getSupportedTags()
+ {
+ return array('#comment');
+ }
+}
diff --git a/vendor/league/html-to-markdown/src/Converter/ConverterInterface.php b/vendor/league/html-to-markdown/src/Converter/ConverterInterface.php
new file mode 100644
index 000000000..8530559a0
--- /dev/null
+++ b/vendor/league/html-to-markdown/src/Converter/ConverterInterface.php
@@ -0,0 +1,20 @@
+<?php
+
+namespace League\HTMLToMarkdown\Converter;
+
+use League\HTMLToMarkdown\ElementInterface;
+
+interface ConverterInterface
+{
+ /**
+ * @param ElementInterface $element
+ *
+ * @return string
+ */
+ public function convert(ElementInterface $element);
+
+ /**
+ * @return string[]
+ */
+ public function getSupportedTags();
+}
diff --git a/vendor/league/html-to-markdown/src/Converter/DefaultConverter.php b/vendor/league/html-to-markdown/src/Converter/DefaultConverter.php
new file mode 100644
index 000000000..964a71093
--- /dev/null
+++ b/vendor/league/html-to-markdown/src/Converter/DefaultConverter.php
@@ -0,0 +1,50 @@
+<?php
+
+namespace League\HTMLToMarkdown\Converter;
+
+use League\HTMLToMarkdown\Configuration;
+use League\HTMLToMarkdown\ConfigurationAwareInterface;
+use League\HTMLToMarkdown\ElementInterface;
+
+class DefaultConverter implements ConverterInterface, ConfigurationAwareInterface
+{
+ const DEFAULT_CONVERTER = '_default';
+
+ /**
+ * @var Configuration
+ */
+ protected $config;
+
+ /**
+ * @param Configuration $config
+ */
+ public function setConfig(Configuration $config)
+ {
+ $this->config = $config;
+ }
+
+ /**
+ * @param ElementInterface $element
+ *
+ * @return string
+ */
+ public function convert(ElementInterface $element)
+ {
+ // If strip_tags is false (the default), preserve tags that don't have Markdown equivalents,
+ // such as <span> nodes on their own. C14N() canonicalizes the node to a string.
+ // See: http://www.php.net/manual/en/domnode.c14n.php
+ if ($this->config->getOption('strip_tags', false)) {
+ return $element->getValue();
+ }
+
+ return html_entity_decode($element->getChildrenAsString());
+ }
+
+ /**
+ * @return string[]
+ */
+ public function getSupportedTags()
+ {
+ return array(self::DEFAULT_CONVERTER);
+ }
+}
diff --git a/vendor/league/html-to-markdown/src/Converter/DivConverter.php b/vendor/league/html-to-markdown/src/Converter/DivConverter.php
new file mode 100644
index 000000000..656a0ba4d
--- /dev/null
+++ b/vendor/league/html-to-markdown/src/Converter/DivConverter.php
@@ -0,0 +1,45 @@
+<?php
+
+namespace League\HTMLToMarkdown\Converter;
+
+use League\HTMLToMarkdown\Configuration;
+use League\HTMLToMarkdown\ConfigurationAwareInterface;
+use League\HTMLToMarkdown\ElementInterface;
+
+class DivConverter implements ConverterInterface, ConfigurationAwareInterface
+{
+ /**
+ * @var Configuration
+ */
+ protected $config;
+
+ /**
+ * @param Configuration $config
+ */
+ public function setConfig(Configuration $config)
+ {
+ $this->config = $config;
+ }
+
+ /**
+ * @param ElementInterface $element
+ *
+ * @return string
+ */
+ public function convert(ElementInterface $element)
+ {
+ if ($this->config->getOption('strip_tags', false)) {
+ return $element->getValue() . "\n\n";
+ }
+
+ return html_entity_decode($element->getChildrenAsString());
+ }
+
+ /**
+ * @return string[]
+ */
+ public function getSupportedTags()
+ {
+ return array('div');
+ }
+}
diff --git a/vendor/league/html-to-markdown/src/Converter/EmphasisConverter.php b/vendor/league/html-to-markdown/src/Converter/EmphasisConverter.php
new file mode 100644
index 000000000..67250769b
--- /dev/null
+++ b/vendor/league/html-to-markdown/src/Converter/EmphasisConverter.php
@@ -0,0 +1,57 @@
+<?php
+
+namespace League\HTMLToMarkdown\Converter;
+
+use League\HTMLToMarkdown\Configuration;
+use League\HTMLToMarkdown\ConfigurationAwareInterface;
+use League\HTMLToMarkdown\ElementInterface;
+
+class EmphasisConverter implements ConverterInterface, ConfigurationAwareInterface
+{
+ /**
+ * @var Configuration
+ */
+ protected $config;
+
+ /**
+ * @param Configuration $config
+ */
+ public function setConfig(Configuration $config)
+ {
+ $this->config = $config;
+ }
+
+ /**
+ * @param ElementInterface $element
+ *
+ * @return string
+ */
+ public function convert(ElementInterface $element)
+ {
+ $tag = $element->getTagName();
+ $value = $element->getValue();
+
+ if (!trim($value)) {
+ return '';
+ }
+
+ if ($tag === 'i' || $tag === 'em') {
+ $style = $this->config->getOption('italic_style');
+ } else {
+ $style = $this->config->getOption('bold_style');
+ }
+
+ $prefix = ltrim($value) !== $value ? ' ' : '';
+ $suffix = rtrim($value) !== $value ? ' ' : '';
+
+ return $prefix . $style . trim($value) . $style . $suffix;
+ }
+
+ /**
+ * @return string[]
+ */
+ public function getSupportedTags()
+ {
+ return array('em', 'i', 'strong', 'b');
+ }
+}
diff --git a/vendor/league/html-to-markdown/src/Converter/HardBreakConverter.php b/vendor/league/html-to-markdown/src/Converter/HardBreakConverter.php
new file mode 100644
index 000000000..37cd44e73
--- /dev/null
+++ b/vendor/league/html-to-markdown/src/Converter/HardBreakConverter.php
@@ -0,0 +1,41 @@
+<?php
+
+namespace League\HTMLToMarkdown\Converter;
+
+use League\HTMLToMarkdown\Configuration;
+use League\HTMLToMarkdown\ConfigurationAwareInterface;
+use League\HTMLToMarkdown\ElementInterface;
+
+class HardBreakConverter implements ConverterInterface, ConfigurationAwareInterface
+{
+ /**
+ * @var Configuration
+ */
+ protected $config;
+
+ /**
+ * @param Configuration $config
+ */
+ public function setConfig(Configuration $config)
+ {
+ $this->config = $config;
+ }
+
+ /**
+ * @param ElementInterface $element
+ *
+ * @return string
+ */
+ public function convert(ElementInterface $element)
+ {
+ return $this->config->getOption('hard_break') ? "\n" : " \n";
+ }
+
+ /**
+ * @return string[]
+ */
+ public function getSupportedTags()
+ {
+ return array('br');
+ }
+}
diff --git a/vendor/league/html-to-markdown/src/Converter/HeaderConverter.php b/vendor/league/html-to-markdown/src/Converter/HeaderConverter.php
new file mode 100644
index 000000000..d117e7d36
--- /dev/null
+++ b/vendor/league/html-to-markdown/src/Converter/HeaderConverter.php
@@ -0,0 +1,78 @@
+<?php
+
+namespace League\HTMLToMarkdown\Converter;
+
+use League\HTMLToMarkdown\Configuration;
+use League\HTMLToMarkdown\ConfigurationAwareInterface;
+use League\HTMLToMarkdown\ElementInterface;
+
+class HeaderConverter implements ConverterInterface, ConfigurationAwareInterface
+{
+ const STYLE_ATX = 'atx';
+ const STYLE_SETEXT = 'setext';
+
+ /**
+ * @var Configuration
+ */
+ protected $config;
+
+ /**
+ * @param Configuration $config
+ */
+ public function setConfig(Configuration $config)
+ {
+ $this->config = $config;
+ }
+
+ /**
+ * @param ElementInterface $element
+ *
+ * @return string
+ */
+ public function convert(ElementInterface $element)
+ {
+ $level = (int) substr($element->getTagName(), 1, 1);
+ $style = $this->config->getOption('header_style', self::STYLE_SETEXT);
+
+ if (($level === 1 || $level === 2) && !$element->isDescendantOf('blockquote') && $style === self::STYLE_SETEXT) {
+ return $this->createSetextHeader($level, $element->getValue());
+ }
+
+ return $this->createAtxHeader($level, $element->getValue());
+ }
+
+ /**
+ * @return string[]
+ */
+ public function getSupportedTags()
+ {
+ return array('h1', 'h2', 'h3', 'h4', 'h5', 'h6');
+ }
+
+ /**
+ * @param int $level
+ * @param string $content
+ *
+ * @return string
+ */
+ private function createSetextHeader($level, $content)
+ {
+ $length = function_exists('mb_strlen') ? mb_strlen($content, 'utf-8') : strlen($content);
+ $underline = ($level === 1) ? '=' : '-';
+
+ return $content . "\n" . str_repeat($underline, $length) . "\n\n";
+ }
+
+ /**
+ * @param int $level
+ * @param string $content
+ *
+ * @return string
+ */
+ private function createAtxHeader($level, $content)
+ {
+ $prefix = str_repeat('#', $level) . ' ';
+
+ return $prefix . $content . "\n\n";
+ }
+}
diff --git a/vendor/league/html-to-markdown/src/Converter/HorizontalRuleConverter.php b/vendor/league/html-to-markdown/src/Converter/HorizontalRuleConverter.php
new file mode 100644
index 000000000..8f54f9397
--- /dev/null
+++ b/vendor/league/html-to-markdown/src/Converter/HorizontalRuleConverter.php
@@ -0,0 +1,26 @@
+<?php
+
+namespace League\HTMLToMarkdown\Converter;
+
+use League\HTMLToMarkdown\ElementInterface;
+
+class HorizontalRuleConverter implements ConverterInterface
+{
+ /**
+ * @param ElementInterface $element
+ *
+ * @return string
+ */
+ public function convert(ElementInterface $element)
+ {
+ return "- - - - - -\n\n";
+ }
+
+ /**
+ * @return string[]
+ */
+ public function getSupportedTags()
+ {
+ return array('hr');
+ }
+}
diff --git a/vendor/league/html-to-markdown/src/Converter/ImageConverter.php b/vendor/league/html-to-markdown/src/Converter/ImageConverter.php
new file mode 100644
index 000000000..657c769c2
--- /dev/null
+++ b/vendor/league/html-to-markdown/src/Converter/ImageConverter.php
@@ -0,0 +1,35 @@
+<?php
+
+namespace League\HTMLToMarkdown\Converter;
+
+use League\HTMLToMarkdown\ElementInterface;
+
+class ImageConverter implements ConverterInterface
+{
+ /**
+ * @param ElementInterface $element
+ *
+ * @return string
+ */
+ public function convert(ElementInterface $element)
+ {
+ $src = $element->getAttribute('src');
+ $alt = $element->getAttribute('alt');
+ $title = $element->getAttribute('title');
+
+ if ($title !== '') {
+ // No newlines added. <img> should be in a block-level element.
+ return '![' . $alt . '](' . $src . ' "' . $title . '")';
+ }
+
+ return '![' . $alt . '](' . $src . ')';
+ }
+
+ /**
+ * @return string[]
+ */
+ public function getSupportedTags()
+ {
+ return array('img');
+ }
+}
diff --git a/vendor/league/html-to-markdown/src/Converter/LinkConverter.php b/vendor/league/html-to-markdown/src/Converter/LinkConverter.php
new file mode 100644
index 000000000..f0765f38b
--- /dev/null
+++ b/vendor/league/html-to-markdown/src/Converter/LinkConverter.php
@@ -0,0 +1,52 @@
+<?php
+
+namespace League\HTMLToMarkdown\Converter;
+
+use League\HTMLToMarkdown\ElementInterface;
+
+class LinkConverter implements ConverterInterface
+{
+ /**
+ * @param ElementInterface $element
+ *
+ * @return string
+ */
+ public function convert(ElementInterface $element)
+ {
+ $href = $element->getAttribute('href');
+ $title = $element->getAttribute('title');
+ $text = trim($element->getValue());
+
+ if ($title !== '') {
+ $markdown = '[' . $text . '](' . $href . ' "' . $title . '")';
+ } elseif ($href === $text && $this->isValidAutolink($href)) {
+ $markdown = '<' . $href . '>';
+ } else {
+ $markdown = '[' . $text . '](' . $href . ')';
+ }
+
+ if (!$href) {
+ $markdown = html_entity_decode($element->getChildrenAsString());
+ }
+
+ return $markdown;
+ }
+
+ /**
+ * @return string[]
+ */
+ public function getSupportedTags()
+ {
+ return array('a');
+ }
+
+ /**
+ * @param string $href
+ *
+ * @return bool
+ */
+ private function isValidAutolink($href)
+ {
+ return preg_match('/^[A-Za-z][A-Za-z0-9.+-]{1,31}:[^<>\x00-\x20]*/i', $href) === 1;
+ }
+}
diff --git a/vendor/league/html-to-markdown/src/Converter/ListBlockConverter.php b/vendor/league/html-to-markdown/src/Converter/ListBlockConverter.php
new file mode 100644
index 000000000..07a4c85a9
--- /dev/null
+++ b/vendor/league/html-to-markdown/src/Converter/ListBlockConverter.php
@@ -0,0 +1,26 @@
+<?php
+
+namespace League\HTMLToMarkdown\Converter;
+
+use League\HTMLToMarkdown\ElementInterface;
+
+class ListBlockConverter implements ConverterInterface
+{
+ /**
+ * @param ElementInterface $element
+ *
+ * @return string
+ */
+ public function convert(ElementInterface $element)
+ {
+ return $element->getValue() . "\n";
+ }
+
+ /**
+ * @return string[]
+ */
+ public function getSupportedTags()
+ {
+ return array('ol', 'ul');
+ }
+}
diff --git a/vendor/league/html-to-markdown/src/Converter/ListItemConverter.php b/vendor/league/html-to-markdown/src/Converter/ListItemConverter.php
new file mode 100644
index 000000000..dafec077c
--- /dev/null
+++ b/vendor/league/html-to-markdown/src/Converter/ListItemConverter.php
@@ -0,0 +1,47 @@
+<?php
+
+namespace League\HTMLToMarkdown\Converter;
+
+use League\HTMLToMarkdown\ElementInterface;
+
+class ListItemConverter implements ConverterInterface
+{
+ /**
+ * @param ElementInterface $element
+ *
+ * @return string
+ */
+ public function convert(ElementInterface $element)
+ {
+ // If parent is an ol, use numbers, otherwise, use dashes
+ $list_type = $element->getParent()->getTagName();
+
+ // Add spaces to start for nested list items
+ $level = $element->getListItemLevel($element);
+
+ $prefixForParagraph = str_repeat(' ', $level + 1);
+ $value = trim(implode("\n" . $prefixForParagraph, explode("\n", trim($element->getValue()))));
+
+ // If list item is the first in a nested list, add a newline before it
+ $prefix = '';
+ if ($level > 0 && $element->getSiblingPosition() === 1) {
+ $prefix = "\n";
+ }
+
+ if ($list_type === 'ul') {
+ return $prefix . '- ' . $value . "\n";
+ }
+
+ $number = $element->getSiblingPosition();
+
+ return $prefix . $number . '. ' . $value . "\n";
+ }
+
+ /**
+ * @return string[]
+ */
+ public function getSupportedTags()
+ {
+ return array('li');
+ }
+}
diff --git a/vendor/league/html-to-markdown/src/Converter/ParagraphConverter.php b/vendor/league/html-to-markdown/src/Converter/ParagraphConverter.php
new file mode 100644
index 000000000..cf852bfcf
--- /dev/null
+++ b/vendor/league/html-to-markdown/src/Converter/ParagraphConverter.php
@@ -0,0 +1,124 @@
+<?php
+
+namespace League\HTMLToMarkdown\Converter;
+
+use League\HTMLToMarkdown\ElementInterface;
+
+class ParagraphConverter implements ConverterInterface
+{
+ /**
+ * @param ElementInterface $element
+ *
+ * @return string
+ */
+ public function convert(ElementInterface $element)
+ {
+ $value = $element->getValue();
+
+ $markdown = '';
+
+ $lines = preg_split('/\r\n|\r|\n/', $value);
+ foreach ($lines as $line) {
+ /*
+ * Some special characters need to be escaped based on the position that they appear
+ * The following function will deal with those special cases.
+ */
+ $markdown .= $this->escapeSpecialCharacters($line);
+ $markdown .= "\n";
+ }
+
+ return trim($markdown) !== '' ? rtrim($markdown) . "\n\n" : '';
+ }
+
+ /**
+ * @return string[]
+ */
+ public function getSupportedTags()
+ {
+ return array('p');
+ }
+
+ /**
+ * @param string $line
+ *
+ * @return string
+ */
+ private function escapeSpecialCharacters($line)
+ {
+ $line = $this->escapeFirstCharacters($line);
+ $line = $this->escapeOtherCharacters($line);
+ $line = $this->escapeOtherCharactersRegex($line);
+
+ return $line;
+ }
+
+ /**
+ * @param string $line
+ *
+ * @return string
+ */
+ private function escapeFirstCharacters($line)
+ {
+ $escapable = array(
+ '>',
+ '- ',
+ '+ ',
+ '--',
+ '~~~',
+ '---',
+ '- - -'
+ );
+
+ foreach ($escapable as $i) {
+ if (strpos(ltrim($line), $i) === 0) {
+ // Found a character that must be escaped, adding a backslash before
+ return '\\' . ltrim($line);
+ }
+ }
+
+ return $line;
+ }
+
+ /**
+ * @param string $line
+ *
+ * @return string
+ */
+ private function escapeOtherCharacters($line)
+ {
+ $escapable = array(
+ '<!--'
+ );
+
+ foreach ($escapable as $i) {
+ if (strpos($line, $i) !== false) {
+ // Found an escapable character, escaping it
+ $line = substr_replace($line, '\\', strpos($line, $i), 0);
+ }
+ }
+
+ return $line;
+ }
+
+ /**
+ * @param string $line
+ *
+ * @return string
+ */
+ private function escapeOtherCharactersRegex($line)
+ {
+ $regExs = array(
+ // Match numbers ending on ')' or '.' that are at the beginning of the line.
+ '/^[0-9]+(?=\)|\.)/'
+ );
+
+ foreach ($regExs as $i) {
+ if (preg_match($i, $line, $match)) {
+ // Matched an escapable character, adding a backslash on the string before the offending character
+ $line = substr_replace($line, '\\', strlen($match[0]), 0);
+ }
+ }
+
+ return $line;
+ }
+}
diff --git a/vendor/league/html-to-markdown/src/Converter/PreformattedConverter.php b/vendor/league/html-to-markdown/src/Converter/PreformattedConverter.php
new file mode 100644
index 000000000..7a4ec3357
--- /dev/null
+++ b/vendor/league/html-to-markdown/src/Converter/PreformattedConverter.php
@@ -0,0 +1,59 @@
+<?php
+
+namespace League\HTMLToMarkdown\Converter;
+
+use League\HTMLToMarkdown\ElementInterface;
+
+class PreformattedConverter implements ConverterInterface
+{
+ /**
+ * @param ElementInterface $element
+ *
+ * @return string
+ */
+ public function convert(ElementInterface $element)
+ {
+ $markdown = '';
+
+ $pre_content = html_entity_decode($element->getChildrenAsString());
+ $pre_content = str_replace(array('<pre>', '</pre>'), '', $pre_content);
+
+ /*
+ * Checking for the code tag.
+ * Usually pre tags are used along with code tags. This conditional will check for already converted code tags,
+ * which use backticks, and if those backticks are at the beginning and at the end of the string it means
+ * there's no more information to convert.
+ */
+
+ $firstBacktick = strpos(trim($pre_content), '`');
+ $lastBacktick = strrpos(trim($pre_content), '`');
+ if ($firstBacktick === 0 && $lastBacktick === strlen(trim($pre_content)) - 1) {
+ return $pre_content;
+ }
+
+ // If the execution reaches this point it means it's just a pre tag, with no code tag nested
+
+ // Normalizing new lines
+ $pre_content = preg_replace('/\r\n|\r|\n/', PHP_EOL, $pre_content);
+
+ // Checking if the string has multiple lines
+ $lines = preg_split('/\r\n|\r|\n/', $pre_content);
+ if (count($lines) > 1) {
+ // Multiple lines detected, adding three backticks and newlines
+ $markdown .= '```' . "\n" . $pre_content . "\n" . '```';
+ } else {
+ // One line of code, wrapping it on one backtick.
+ $markdown .= '`' . $pre_content . '`';
+ }
+
+ return $markdown;
+ }
+
+ /**
+ * @return string[]
+ */
+ public function getSupportedTags()
+ {
+ return array('pre');
+ }
+}
diff --git a/vendor/league/html-to-markdown/src/Converter/TextConverter.php b/vendor/league/html-to-markdown/src/Converter/TextConverter.php
new file mode 100644
index 000000000..d6d91e16f
--- /dev/null
+++ b/vendor/league/html-to-markdown/src/Converter/TextConverter.php
@@ -0,0 +1,46 @@
+<?php
+
+namespace League\HTMLToMarkdown\Converter;
+
+use League\HTMLToMarkdown\ElementInterface;
+
+class TextConverter implements ConverterInterface
+{
+ /**
+ * @param ElementInterface $element
+ *
+ * @return string
+ */
+ public function convert(ElementInterface $element)
+ {
+ $markdown = $element->getValue();
+
+ // Remove leftover \n at the beginning of the line
+ $markdown = ltrim($markdown, "\n");
+
+ // Replace sequences of invisible characters with spaces
+ $markdown = preg_replace('~\s+~u', ' ', $markdown);
+
+ // Escape the following characters: '*', '_', '[', ']' and '\'
+ $markdown = preg_replace('~([*_\\[\\]\\\\])~u', '\\\\$1', $markdown);
+
+ $markdown = preg_replace('~^#~u', '\\\\#', $markdown);
+
+ if ($markdown === ' ') {
+ $next = $element->getNext();
+ if (!$next || $next->isBlock()) {
+ $markdown = '';
+ }
+ }
+
+ return $markdown;
+ }
+
+ /**
+ * @return string[]
+ */
+ public function getSupportedTags()
+ {
+ return array('#text');
+ }
+}
diff --git a/vendor/league/html-to-markdown/src/Element.php b/vendor/league/html-to-markdown/src/Element.php
new file mode 100644
index 000000000..e1e9d1a09
--- /dev/null
+++ b/vendor/league/html-to-markdown/src/Element.php
@@ -0,0 +1,257 @@
+<?php
+
+namespace League\HTMLToMarkdown;
+
+class Element implements ElementInterface
+{
+ /**
+ * @var \DOMNode
+ */
+ protected $node;
+
+ /**
+ * @var ElementInterface|null
+ */
+ private $nextCached;
+
+ public function __construct(\DOMNode $node)
+ {
+ $this->node = $node;
+ }
+
+ /**
+ * @return bool
+ */
+ public function isBlock()
+ {
+ switch ($this->getTagName()) {
+ case 'blockquote':
+ case 'body':
+ case 'code':
+ case 'div':
+ case 'h1':
+ case 'h2':
+ case 'h3':
+ case 'h4':
+ case 'h5':
+ case 'h6':
+ case 'hr':
+ case 'html':
+ case 'li':
+ case 'p':
+ case 'ol':
+ case 'ul':
+ return true;
+ default:
+ return false;
+ }
+ }
+
+ /**
+ * @return bool
+ */
+ public function isText()
+ {
+ return $this->getTagName() === '#text';
+ }
+
+ /**
+ * @return bool
+ */
+ public function isWhitespace()
+ {
+ return $this->getTagName() === '#text' && trim($this->getValue()) === '';
+ }
+
+ /**
+ * @return string
+ */
+ public function getTagName()
+ {
+ return $this->node->nodeName;
+ }
+
+ /**
+ * @return string
+ */
+ public function getValue()
+ {
+ return $this->node->nodeValue;
+ }
+
+ /**
+ * @return ElementInterface|null
+ */
+ public function getParent()
+ {
+ return new static($this->node->parentNode) ?: null;
+ }
+
+ /**
+ * @return bool
+ */
+ public function hasChildren()
+ {
+ return $this->node->hasChildNodes();
+ }
+
+ /**
+ * @return ElementInterface[]
+ */
+ public function getChildren()
+ {
+ $ret = array();
+ /** @var \DOMNode $node */
+ foreach ($this->node->childNodes as $node) {
+ $ret[] = new static($node);
+ }
+
+ return $ret;
+ }
+
+ /**
+ * @return ElementInterface|null
+ */
+ public function getNext()
+ {
+ if ($this->nextCached === null) {
+ $nextNode = $this->getNextNode($this->node);
+ if ($nextNode !== null) {
+ $this->nextCached = new static($nextNode);
+ }
+ }
+
+ return $this->nextCached;
+ }
+
+ /**
+ * @param \DomNode $node
+ * @param bool $checkChildren
+ *
+ * @return \DomNode|null
+ */
+ private function getNextNode($node, $checkChildren = true)
+ {
+ if ($checkChildren && $node->firstChild) {
+ return $node->firstChild;
+ }
+
+ if ($node->nextSibling) {
+ return $node->nextSibling;
+ }
+
+ if ($node->parentNode) {
+ return $this->getNextNode($node->parentNode, false);
+ }
+ }
+
+ /**
+ * @param string[]|string $tagNames
+ *
+ * @return bool
+ */
+ public function isDescendantOf($tagNames)
+ {
+ if (!is_array($tagNames)) {
+ $tagNames = array($tagNames);
+ }
+
+ for ($p = $this->node->parentNode; $p !== false; $p = $p->parentNode) {
+ if (is_null($p)) {
+ return false;
+ }
+
+ if (in_array($p->nodeName, $tagNames)) {
+ return true;
+ }
+ }
+
+ return false;
+ }
+
+ /**
+ * @param string $markdown
+ */
+ public function setFinalMarkdown($markdown)
+ {
+ $markdown_node = $this->node->ownerDocument->createTextNode($markdown);
+ $this->node->parentNode->replaceChild($markdown_node, $this->node);
+ }
+
+ /**
+ * @return string
+ */
+ public function getChildrenAsString()
+ {
+ return $this->node->C14N();
+ }
+
+ /**
+ * @return int
+ */
+ public function getSiblingPosition()
+ {
+ $position = 0;
+
+ // Loop through all nodes and find the given $node
+ foreach ($this->getParent()->getChildren() as $current_node) {
+ if (!$current_node->isWhitespace()) {
+ $position++;
+ }
+
+ // TODO: Need a less-buggy way of comparing these
+ // Perhaps we can somehow ensure that we always have the exact same object and use === instead?
+ if ($this->equals($current_node)) {
+ break;
+ }
+ }
+
+ return $position;
+ }
+
+ /**
+ * @return int
+ */
+ public function getListItemLevel()
+ {
+ $level = 0;
+ $parent = $this->getParent();
+
+ while ($parent !== null && $parent->node->parentNode) {
+ if ($parent->getTagName() === 'li') {
+ $level++;
+ }
+ $parent = $parent->getParent();
+ }
+
+ return $level;
+ }
+
+ /**
+ * @param string $name
+ *
+ * @return string
+ */
+ public function getAttribute($name)
+ {
+ if ($this->node instanceof \DOMElement) {
+ return $this->node->getAttribute($name);
+ }
+
+ return '';
+ }
+
+ /**
+ * @param ElementInterface $element
+ *
+ * @return bool
+ */
+ public function equals(ElementInterface $element)
+ {
+ if ($element instanceof self) {
+ return $element->node === $this->node;
+ }
+
+ return $element === $this;
+ }
+}
diff --git a/vendor/league/html-to-markdown/src/ElementInterface.php b/vendor/league/html-to-markdown/src/ElementInterface.php
new file mode 100644
index 000000000..138ddf286
--- /dev/null
+++ b/vendor/league/html-to-markdown/src/ElementInterface.php
@@ -0,0 +1,80 @@
+<?php
+
+namespace League\HTMLToMarkdown;
+
+interface ElementInterface
+{
+ /**
+ * @return bool
+ */
+ public function isBlock();
+
+ /**
+ * @return bool
+ */
+ public function isText();
+
+ /**
+ * @return bool
+ */
+ public function isWhitespace();
+
+ /**
+ * @return string
+ */
+ public function getTagName();
+
+ /**
+ * @return string
+ */
+ public function getValue();
+
+ /**
+ * @return ElementInterface|null
+ */
+ public function getParent();
+
+ /**
+ * @param string|string[] $tagNames
+ *
+ * @return bool
+ */
+ public function isDescendantOf($tagNames);
+
+ /**
+ * @return bool
+ */
+ public function hasChildren();
+
+ /**
+ * @return ElementInterface[]
+ */
+ public function getChildren();
+
+ /**
+ * @return ElementInterface|null
+ */
+ public function getNext();
+
+ /**
+ * @return int
+ */
+ public function getSiblingPosition();
+
+ /**
+ * @return string
+ */
+ public function getChildrenAsString();
+
+ /**
+ * @param string $markdown
+ */
+ public function setFinalMarkdown($markdown);
+
+ /**
+ * @param string $name
+ *
+ * @return string
+ */
+ public function getAttribute($name);
+}
diff --git a/vendor/league/html-to-markdown/src/Environment.php b/vendor/league/html-to-markdown/src/Environment.php
new file mode 100644
index 000000000..560cfe613
--- /dev/null
+++ b/vendor/league/html-to-markdown/src/Environment.php
@@ -0,0 +1,104 @@
+<?php
+
+namespace League\HTMLToMarkdown;
+
+use League\HTMLToMarkdown\Converter\BlockquoteConverter;
+use League\HTMLToMarkdown\Converter\CodeConverter;
+use League\HTMLToMarkdown\Converter\CommentConverter;
+use League\HTMLToMarkdown\Converter\ConverterInterface;
+use League\HTMLToMarkdown\Converter\DefaultConverter;
+use League\HTMLToMarkdown\Converter\DivConverter;
+use League\HTMLToMarkdown\Converter\EmphasisConverter;
+use League\HTMLToMarkdown\Converter\HardBreakConverter;
+use League\HTMLToMarkdown\Converter\HeaderConverter;
+use League\HTMLToMarkdown\Converter\HorizontalRuleConverter;
+use League\HTMLToMarkdown\Converter\ImageConverter;
+use League\HTMLToMarkdown\Converter\LinkConverter;
+use League\HTMLToMarkdown\Converter\ListBlockConverter;
+use League\HTMLToMarkdown\Converter\ListItemConverter;
+use League\HTMLToMarkdown\Converter\ParagraphConverter;
+use League\HTMLToMarkdown\Converter\PreformattedConverter;
+use League\HTMLToMarkdown\Converter\TextConverter;
+
+final class Environment
+{
+ /**
+ * @var Configuration
+ */
+ protected $config;
+
+ /**
+ * @var ConverterInterface[]
+ */
+ protected $converters = array();
+
+ public function __construct(array $config = array())
+ {
+ $this->config = new Configuration($config);
+ $this->addConverter(new DefaultConverter());
+ }
+
+ /**
+ * @return Configuration
+ */
+ public function getConfig()
+ {
+ return $this->config;
+ }
+
+ /**
+ * @param ConverterInterface $converter
+ */
+ public function addConverter(ConverterInterface $converter)
+ {
+ if ($converter instanceof ConfigurationAwareInterface) {
+ $converter->setConfig($this->config);
+ }
+
+ foreach ($converter->getSupportedTags() as $tag) {
+ $this->converters[$tag] = $converter;
+ }
+ }
+
+ /**
+ * @param string $tag
+ *
+ * @return ConverterInterface
+ */
+ public function getConverterByTag($tag)
+ {
+ if (isset($this->converters[$tag])) {
+ return $this->converters[$tag];
+ }
+
+ return $this->converters[DefaultConverter::DEFAULT_CONVERTER];
+ }
+
+ /**
+ * @param array $config
+ *
+ * @return Environment
+ */
+ public static function createDefaultEnvironment(array $config = array())
+ {
+ $environment = new static($config);
+
+ $environment->addConverter(new BlockquoteConverter());
+ $environment->addConverter(new CodeConverter());
+ $environment->addConverter(new CommentConverter());
+ $environment->addConverter(new DivConverter());
+ $environment->addConverter(new EmphasisConverter());
+ $environment->addConverter(new HardBreakConverter());
+ $environment->addConverter(new HeaderConverter());
+ $environment->addConverter(new HorizontalRuleConverter());
+ $environment->addConverter(new ImageConverter());
+ $environment->addConverter(new LinkConverter());
+ $environment->addConverter(new ListBlockConverter());
+ $environment->addConverter(new ListItemConverter());
+ $environment->addConverter(new ParagraphConverter());
+ $environment->addConverter(new PreformattedConverter());
+ $environment->addConverter(new TextConverter());
+
+ return $environment;
+ }
+}
diff --git a/vendor/league/html-to-markdown/src/HtmlConverter.php b/vendor/league/html-to-markdown/src/HtmlConverter.php
new file mode 100644
index 000000000..db3c29e1c
--- /dev/null
+++ b/vendor/league/html-to-markdown/src/HtmlConverter.php
@@ -0,0 +1,231 @@
+<?php
+
+namespace League\HTMLToMarkdown;
+
+/**
+ * Class HtmlConverter
+ *
+ * A helper class to convert HTML to Markdown.
+ *
+ * @author Colin O'Dell <colinodell@gmail.com>
+ * @author Nick Cernis <nick@cern.is>
+ *
+ * @link https://github.com/thephpleague/html-to-markdown/ Latest version on GitHub.
+ *
+ * @license http://www.opensource.org/licenses/mit-license.php MIT
+ */
+class HtmlConverter
+{
+ /**
+ * @var Environment
+ */
+ protected $environment;
+
+ /**
+ * Constructor
+ *
+ * @param Environment|array $options Environment object or configuration options
+ */
+ public function __construct($options = array())
+ {
+ if ($options instanceof Environment) {
+ $this->environment = $options;
+ } elseif (is_array($options)) {
+ $defaults = array(
+ 'header_style' => 'setext', // Set to 'atx' to output H1 and H2 headers as # Header1 and ## Header2
+ 'suppress_errors' => true, // Set to false to show warnings when loading malformed HTML
+ 'strip_tags' => false, // Set to true to strip tags that don't have markdown equivalents. N.B. Strips tags, not their content. Useful to clean MS Word HTML output.
+ 'bold_style' => '**', // Set to '__' if you prefer the underlined style
+ 'italic_style' => '_', // Set to '*' if you prefer the asterisk style
+ 'remove_nodes' => '', // space-separated list of dom nodes that should be removed. example: 'meta style script'
+ 'hard_break' => false,// Set to true to turn <br> into `\n` instead of ` \n`
+ );
+
+ $this->environment = Environment::createDefaultEnvironment($defaults);
+
+ $this->environment->getConfig()->merge($options);
+ }
+ }
+
+ /**
+ * @return Environment
+ */
+ public function getEnvironment()
+ {
+ return $this->environment;
+ }
+
+ /**
+ * @return Configuration
+ */
+ public function getConfig()
+ {
+ return $this->environment->getConfig();
+ }
+
+ /**
+ * Convert
+ *
+ * @see HtmlConverter::convert
+ *
+ * @param string $html
+ *
+ * @return string The Markdown version of the html
+ */
+ public function __invoke($html)
+ {
+ return $this->convert($html);
+ }
+
+ /**
+ * Convert
+ *
+ * Loads HTML and passes to getMarkdown()
+ *
+ * @param string $html
+ *
+ * @throws \InvalidArgumentException
+ *
+ * @return string The Markdown version of the html
+ */
+ public function convert($html)
+ {
+ if (trim($html) === '') {
+ return '';
+ }
+
+ $document = $this->createDOMDocument($html);
+
+ // Work on the entire DOM tree (including head and body)
+ if (!($root = $document->getElementsByTagName('html')->item(0))) {
+ throw new \InvalidArgumentException('Invalid HTML was provided');
+ }
+
+ $rootElement = new Element($root);
+ $this->convertChildren($rootElement);
+
+ // Store the now-modified DOMDocument as a string
+ $markdown = $document->saveHTML();
+
+ return $this->sanitize($markdown);
+ }
+
+ /**
+ * @param string $html
+ *
+ * @return \DOMDocument
+ */
+ private function createDOMDocument($html)
+ {
+ $document = new \DOMDocument();
+
+ if ($this->getConfig()->getOption('suppress_errors')) {
+ // Suppress conversion errors (from http://bit.ly/pCCRSX)
+ libxml_use_internal_errors(true);
+ }
+
+ // Hack to load utf-8 HTML (from http://bit.ly/pVDyCt)
+ $document->loadHTML('<?xml encoding="UTF-8">' . $html);
+ $document->encoding = 'UTF-8';
+
+ if ($this->getConfig()->getOption('suppress_errors')) {
+ libxml_clear_errors();
+ }
+
+ return $document;
+ }
+
+ /**
+ * Convert Children
+ *
+ * Recursive function to drill into the DOM and convert each node into Markdown from the inside out.
+ *
+ * Finds children of each node and convert those to #text nodes containing their Markdown equivalent,
+ * starting with the innermost element and working up to the outermost element.
+ *
+ * @param ElementInterface $element
+ */
+ private function convertChildren(ElementInterface $element)
+ {
+ // Don't convert HTML code inside <code> and <pre> blocks to Markdown - that should stay as HTML
+ // except if the current node is a code tag, which needs to be converted by the CodeConverter.
+ if ($element->isDescendantOf(array('pre', 'code')) && $element->getTagName() !== 'code') {
+ return;
+ }
+
+ // If the node has children, convert those to Markdown first
+ if ($element->hasChildren()) {
+ foreach ($element->getChildren() as $child) {
+ $this->convertChildren($child);
+ }
+ }
+
+ // Now that child nodes have been converted, convert the original node
+ $markdown = $this->convertToMarkdown($element);
+
+ // Create a DOM text node containing the Markdown equivalent of the original node
+
+ // Replace the old $node e.g. '<h3>Title</h3>' with the new $markdown_node e.g. '### Title'
+ $element->setFinalMarkdown($markdown);
+ }
+
+ /**
+ * Convert to Markdown
+ *
+ * Converts an individual node into a #text node containing a string of its Markdown equivalent.
+ *
+ * Example: An <h3> node with text content of 'Title' becomes a text node with content of '### Title'
+ *
+ * @param ElementInterface $element
+ *
+ * @return string The converted HTML as Markdown
+ */
+ protected function convertToMarkdown(ElementInterface $element)
+ {
+ $tag = $element->getTagName();
+
+ // Strip nodes named in remove_nodes
+ $tags_to_remove = explode(' ', $this->getConfig()->getOption('remove_nodes'));
+ if (in_array($tag, $tags_to_remove)) {
+ return false;
+ }
+
+ $converter = $this->environment->getConverterByTag($tag);
+
+ return $converter->convert($element);
+ }
+
+ /**
+ * @param string $markdown
+ *
+ * @return string
+ */
+ protected function sanitize($markdown)
+ {
+ $markdown = html_entity_decode($markdown, ENT_QUOTES, 'UTF-8');
+ $markdown = preg_replace('/<!DOCTYPE [^>]+>/', '', $markdown); // Strip doctype declaration
+ $markdown = trim($markdown); // Remove blank spaces at the beggining of the html
+
+ /*
+ * Removing unwanted tags. Tags should be added to the array in the order they are expected.
+ * XML, html and body opening tags should be in that order. Same case with closing tags
+ */
+ $unwanted = array('<?xml encoding="UTF-8">', '<html>', '</html>', '<body>', '</body>', '<head>', '</head>', '&#xD;');
+
+ foreach ($unwanted as $tag) {
+ if (strpos($tag, '/') === false) {
+ // Opening tags
+ if (strpos($markdown, $tag) === 0) {
+ $markdown = substr($markdown, strlen($tag));
+ }
+ } else {
+ // Closing tags
+ if (strpos($markdown, $tag) === strlen($markdown) - strlen($tag)) {
+ $markdown = substr($markdown, 0, -strlen($tag));
+ }
+ }
+ }
+
+ return trim($markdown, "\n\r\0\x0B");
+ }
+}
diff --git a/vendor/pixel418/markdownify/CHANGELOG.md b/vendor/pixel418/markdownify/CHANGELOG.md
deleted file mode 100644
index a0900fdf5..000000000
--- a/vendor/pixel418/markdownify/CHANGELOG.md
+++ /dev/null
@@ -1,76 +0,0 @@
-CHANGELOG
-==============
-
-
-21/09/2016 v2.2.1
---------------
-
- * Fix: Moving trailing whitespace from inline elements outside of the element
- * Feature: Use PSR-4
- * Feature: PHP 7.0 support in continuous integration
- * Doc: Update of the README
-
-
-07/09/2016 v2.2.0
---------------
-
- * Fix: Reset state between each parsing
-
-
-19/02/2016 v2.1.11
---------------
-
- * Fix: Empty table cell conversion
-
-
-10/02/2016 v2.1.10
---------------
-
- * Fix: Handle nested table.
-
-
-01/04/2015 v2.1.9
---------------
-
- * Fix: Handle HTML breaks & spaces in a less destructive way.
-
-
-26/03/2015 v2.1.8
---------------
-
- * Fix: Use alternative italic character
- * Fix: Handle HTML breaks inside another tag
- * Fix: Handle HTML spaces around tags
-
-
-07/11/2014 v2.1.7
---------------
-
- * Change composer name to "elephant418/markdownify"
-
-
-14/07/2014 v2.1.6
---------------
-
- * Fix: Simulate a paragraph for inline text preceding block element
- * Fix: Nested lists
- * Fix: setKeepHTML method
- * Feature: PHP 5.5 & 5.6 support in continuous integration
-
-
-16/03/2014 v2.1.5
---------------
-
-Add display settings
-
- * Test: Add tests for footnotes after every paragraph or not
- * Feature: Allow to display link reference in paragraph, without footnotes
-
-
-27/02/2014 v2.1.4
---------------
-
-Improve how ConverterExtra handle id & class attributes:
-
- * Feature: Allow id & class attributes on links
- * Feature: Allow class attributes on headings \ No newline at end of file
diff --git a/vendor/pixel418/markdownify/LICENSE b/vendor/pixel418/markdownify/LICENSE
deleted file mode 100644
index 5ab7695ab..000000000
--- a/vendor/pixel418/markdownify/LICENSE
+++ /dev/null
@@ -1,504 +0,0 @@
- GNU LESSER GENERAL PUBLIC LICENSE
- Version 2.1, February 1999
-
- Copyright (C) 1991, 1999 Free Software Foundation, Inc.
- 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- Everyone is permitted to copy and distribute verbatim copies
- of this license document, but changing it is not allowed.
-
-[This is the first released version of the Lesser GPL. It also counts
- as the successor of the GNU Library Public License, version 2, hence
- the version number 2.1.]
-
- Preamble
-
- The licenses for most software are designed to take away your
-freedom to share and change it. By contrast, the GNU General Public
-Licenses are intended to guarantee your freedom to share and change
-free software--to make sure the software is free for all its users.
-
- This license, the Lesser General Public License, applies to some
-specially designated software packages--typically libraries--of the
-Free Software Foundation and other authors who decide to use it. You
-can use it too, but we suggest you first think carefully about whether
-this license or the ordinary General Public License is the better
-strategy to use in any particular case, based on the explanations below.
-
- When we speak of free software, we are referring to freedom of use,
-not price. Our General Public Licenses are designed to make sure that
-you have the freedom to distribute copies of free software (and charge
-for this service if you wish); that you receive source code or can get
-it if you want it; that you can change the software and use pieces of
-it in new free programs; and that you are informed that you can do
-these things.
-
- To protect your rights, we need to make restrictions that forbid
-distributors to deny you these rights or to ask you to surrender these
-rights. These restrictions translate to certain responsibilities for
-you if you distribute copies of the library or if you modify it.
-
- For example, if you distribute copies of the library, whether gratis
-or for a fee, you must give the recipients all the rights that we gave
-you. You must make sure that they, too, receive or can get the source
-code. If you link other code with the library, you must provide
-complete object files to the recipients, so that they can relink them
-with the library after making changes to the library and recompiling
-it. And you must show them these terms so they know their rights.
-
- We protect your rights with a two-step method: (1) we copyright the
-library, and (2) we offer you this license, which gives you legal
-permission to copy, distribute and/or modify the library.
-
- To protect each distributor, we want to make it very clear that
-there is no warranty for the free library. Also, if the library is
-modified by someone else and passed on, the recipients should know
-that what they have is not the original version, so that the original
-author's reputation will not be affected by problems that might be
-introduced by others.
-
- Finally, software patents pose a constant threat to the existence of
-any free program. We wish to make sure that a company cannot
-effectively restrict the users of a free program by obtaining a
-restrictive license from a patent holder. Therefore, we insist that
-any patent license obtained for a version of the library must be
-consistent with the full freedom of use specified in this license.
-
- Most GNU software, including some libraries, is covered by the
-ordinary GNU General Public License. This license, the GNU Lesser
-General Public License, applies to certain designated libraries, and
-is quite different from the ordinary General Public License. We use
-this license for certain libraries in order to permit linking those
-libraries into non-free programs.
-
- When a program is linked with a library, whether statically or using
-a shared library, the combination of the two is legally speaking a
-combined work, a derivative of the original library. The ordinary
-General Public License therefore permits such linking only if the
-entire combination fits its criteria of freedom. The Lesser General
-Public License permits more lax criteria for linking other code with
-the library.
-
- We call this license the "Lesser" General Public License because it
-does Less to protect the user's freedom than the ordinary General
-Public License. It also provides other free software developers Less
-of an advantage over competing non-free programs. These disadvantages
-are the reason we use the ordinary General Public License for many
-libraries. However, the Lesser license provides advantages in certain
-special circumstances.
-
- For example, on rare occasions, there may be a special need to
-encourage the widest possible use of a certain library, so that it becomes
-a de-facto standard. To achieve this, non-free programs must be
-allowed to use the library. A more frequent case is that a free
-library does the same job as widely used non-free libraries. In this
-case, there is little to gain by limiting the free library to free
-software only, so we use the Lesser General Public License.
-
- In other cases, permission to use a particular library in non-free
-programs enables a greater number of people to use a large body of
-free software. For example, permission to use the GNU C Library in
-non-free programs enables many more people to use the whole GNU
-operating system, as well as its variant, the GNU/Linux operating
-system.
-
- Although the Lesser General Public License is Less protective of the
-users' freedom, it does ensure that the user of a program that is
-linked with the Library has the freedom and the wherewithal to run
-that program using a modified version of the Library.
-
- The precise terms and conditions for copying, distribution and
-modification follow. Pay close attention to the difference between a
-"work based on the library" and a "work that uses the library". The
-former contains code derived from the library, whereas the latter must
-be combined with the library in order to run.
-
- GNU LESSER GENERAL PUBLIC LICENSE
- TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
-
- 0. This License Agreement applies to any software library or other
-program which contains a notice placed by the copyright holder or
-other authorized party saying it may be distributed under the terms of
-this Lesser General Public License (also called "this License").
-Each licensee is addressed as "you".
-
- A "library" means a collection of software functions and/or data
-prepared so as to be conveniently linked with application programs
-(which use some of those functions and data) to form executables.
-
- The "Library", below, refers to any such software library or work
-which has been distributed under these terms. A "work based on the
-Library" means either the Library or any derivative work under
-copyright law: that is to say, a work containing the Library or a
-portion of it, either verbatim or with modifications and/or translated
-straightforwardly into another language. (Hereinafter, translation is
-included without limitation in the term "modification".)
-
- "Source code" for a work means the preferred form of the work for
-making modifications to it. For a library, complete source code means
-all the source code for all modules it contains, plus any associated
-interface definition files, plus the scripts used to control compilation
-and installation of the library.
-
- Activities other than copying, distribution and modification are not
-covered by this License; they are outside its scope. The act of
-running a program using the Library is not restricted, and output from
-such a program is covered only if its contents constitute a work based
-on the Library (independent of the use of the Library in a tool for
-writing it). Whether that is true depends on what the Library does
-and what the program that uses the Library does.
-
- 1. You may copy and distribute verbatim copies of the Library's
-complete source code as you receive it, in any medium, provided that
-you conspicuously and appropriately publish on each copy an
-appropriate copyright notice and disclaimer of warranty; keep intact
-all the notices that refer to this License and to the absence of any
-warranty; and distribute a copy of this License along with the
-Library.
-
- You may charge a fee for the physical act of transferring a copy,
-and you may at your option offer warranty protection in exchange for a
-fee.
-
- 2. You may modify your copy or copies of the Library or any portion
-of it, thus forming a work based on the Library, and copy and
-distribute such modifications or work under the terms of Section 1
-above, provided that you also meet all of these conditions:
-
- a) The modified work must itself be a software library.
-
- b) You must cause the files modified to carry prominent notices
- stating that you changed the files and the date of any change.
-
- c) You must cause the whole of the work to be licensed at no
- charge to all third parties under the terms of this License.
-
- d) If a facility in the modified Library refers to a function or a
- table of data to be supplied by an application program that uses
- the facility, other than as an argument passed when the facility
- is invoked, then you must make a good faith effort to ensure that,
- in the event an application does not supply such function or
- table, the facility still operates, and performs whatever part of
- its purpose remains meaningful.
-
- (For example, a function in a library to compute square roots has
- a purpose that is entirely well-defined independent of the
- application. Therefore, Subsection 2d requires that any
- application-supplied function or table used by this function must
- be optional: if the application does not supply it, the square
- root function must still compute square roots.)
-
-These requirements apply to the modified work as a whole. If
-identifiable sections of that work are not derived from the Library,
-and can be reasonably considered independent and separate works in
-themselves, then this License, and its terms, do not apply to those
-sections when you distribute them as separate works. But when you
-distribute the same sections as part of a whole which is a work based
-on the Library, the distribution of the whole must be on the terms of
-this License, whose permissions for other licensees extend to the
-entire whole, and thus to each and every part regardless of who wrote
-it.
-
-Thus, it is not the intent of this section to claim rights or contest
-your rights to work written entirely by you; rather, the intent is to
-exercise the right to control the distribution of derivative or
-collective works based on the Library.
-
-In addition, mere aggregation of another work not based on the Library
-with the Library (or with a work based on the Library) on a volume of
-a storage or distribution medium does not bring the other work under
-the scope of this License.
-
- 3. You may opt to apply the terms of the ordinary GNU General Public
-License instead of this License to a given copy of the Library. To do
-this, you must alter all the notices that refer to this License, so
-that they refer to the ordinary GNU General Public License, version 2,
-instead of to this License. (If a newer version than version 2 of the
-ordinary GNU General Public License has appeared, then you can specify
-that version instead if you wish.) Do not make any other change in
-these notices.
-
- Once this change is made in a given copy, it is irreversible for
-that copy, so the ordinary GNU General Public License applies to all
-subsequent copies and derivative works made from that copy.
-
- This option is useful when you wish to copy part of the code of
-the Library into a program that is not a library.
-
- 4. You may copy and distribute the Library (or a portion or
-derivative of it, under Section 2) in object code or executable form
-under the terms of Sections 1 and 2 above provided that you accompany
-it with the complete corresponding machine-readable source code, which
-must be distributed under the terms of Sections 1 and 2 above on a
-medium customarily used for software interchange.
-
- If distribution of object code is made by offering access to copy
-from a designated place, then offering equivalent access to copy the
-source code from the same place satisfies the requirement to
-distribute the source code, even though third parties are not
-compelled to copy the source along with the object code.
-
- 5. A program that contains no derivative of any portion of the
-Library, but is designed to work with the Library by being compiled or
-linked with it, is called a "work that uses the Library". Such a
-work, in isolation, is not a derivative work of the Library, and
-therefore falls outside the scope of this License.
-
- However, linking a "work that uses the Library" with the Library
-creates an executable that is a derivative of the Library (because it
-contains portions of the Library), rather than a "work that uses the
-library". The executable is therefore covered by this License.
-Section 6 states terms for distribution of such executables.
-
- When a "work that uses the Library" uses material from a header file
-that is part of the Library, the object code for the work may be a
-derivative work of the Library even though the source code is not.
-Whether this is true is especially significant if the work can be
-linked without the Library, or if the work is itself a library. The
-threshold for this to be true is not precisely defined by law.
-
- If such an object file uses only numerical parameters, data
-structure layouts and accessors, and small macros and small inline
-functions (ten lines or less in length), then the use of the object
-file is unrestricted, regardless of whether it is legally a derivative
-work. (Executables containing this object code plus portions of the
-Library will still fall under Section 6.)
-
- Otherwise, if the work is a derivative of the Library, you may
-distribute the object code for the work under the terms of Section 6.
-Any executables containing that work also fall under Section 6,
-whether or not they are linked directly with the Library itself.
-
- 6. As an exception to the Sections above, you may also combine or
-link a "work that uses the Library" with the Library to produce a
-work containing portions of the Library, and distribute that work
-under terms of your choice, provided that the terms permit
-modification of the work for the customer's own use and reverse
-engineering for debugging such modifications.
-
- You must give prominent notice with each copy of the work that the
-Library is used in it and that the Library and its use are covered by
-this License. You must supply a copy of this License. If the work
-during execution displays copyright notices, you must include the
-copyright notice for the Library among them, as well as a reference
-directing the user to the copy of this License. Also, you must do one
-of these things:
-
- a) Accompany the work with the complete corresponding
- machine-readable source code for the Library including whatever
- changes were used in the work (which must be distributed under
- Sections 1 and 2 above); and, if the work is an executable linked
- with the Library, with the complete machine-readable "work that
- uses the Library", as object code and/or source code, so that the
- user can modify the Library and then relink to produce a modified
- executable containing the modified Library. (It is understood
- that the user who changes the contents of definitions files in the
- Library will not necessarily be able to recompile the application
- to use the modified definitions.)
-
- b) Use a suitable shared library mechanism for linking with the
- Library. A suitable mechanism is one that (1) uses at run time a
- copy of the library already present on the user's computer system,
- rather than copying library functions into the executable, and (2)
- will operate properly with a modified version of the library, if
- the user installs one, as long as the modified version is
- interface-compatible with the version that the work was made with.
-
- c) Accompany the work with a written offer, valid for at
- least three years, to give the same user the materials
- specified in Subsection 6a, above, for a charge no more
- than the cost of performing this distribution.
-
- d) If distribution of the work is made by offering access to copy
- from a designated place, offer equivalent access to copy the above
- specified materials from the same place.
-
- e) Verify that the user has already received a copy of these
- materials or that you have already sent this user a copy.
-
- For an executable, the required form of the "work that uses the
-Library" must include any data and utility programs needed for
-reproducing the executable from it. However, as a special exception,
-the materials to be distributed need not include anything that is
-normally distributed (in either source or binary form) with the major
-components (compiler, kernel, and so on) of the operating system on
-which the executable runs, unless that component itself accompanies
-the executable.
-
- It may happen that this requirement contradicts the license
-restrictions of other proprietary libraries that do not normally
-accompany the operating system. Such a contradiction means you cannot
-use both them and the Library together in an executable that you
-distribute.
-
- 7. 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 not covered by this License, and distribute such a combined
-library, provided that the separate distribution of the work based on
-the Library and of the other library facilities is otherwise
-permitted, and provided that you do these two things:
-
- a) Accompany the combined library with a copy of the same work
- based on the Library, uncombined with any other library
- facilities. This must be distributed under the terms of the
- Sections above.
-
- b) Give prominent notice with the combined library of the fact
- that part of it is a work based on the Library, and explaining
- where to find the accompanying uncombined form of the same work.
-
- 8. You may not copy, modify, sublicense, link with, or distribute
-the Library except as expressly provided under this License. Any
-attempt otherwise to copy, modify, sublicense, link with, or
-distribute the Library is void, and will automatically terminate your
-rights under this License. However, parties who have received copies,
-or rights, from you under this License will not have their licenses
-terminated so long as such parties remain in full compliance.
-
- 9. You are not required to accept this License, since you have not
-signed it. However, nothing else grants you permission to modify or
-distribute the Library or its derivative works. These actions are
-prohibited by law if you do not accept this License. Therefore, by
-modifying or distributing the Library (or any work based on the
-Library), you indicate your acceptance of this License to do so, and
-all its terms and conditions for copying, distributing or modifying
-the Library or works based on it.
-
- 10. Each time you redistribute the Library (or any work based on the
-Library), the recipient automatically receives a license from the
-original licensor to copy, distribute, link with or modify the Library
-subject to these terms and conditions. You may not impose any further
-restrictions on the recipients' exercise of the rights granted herein.
-You are not responsible for enforcing compliance by third parties with
-this License.
-
- 11. If, as a consequence of a court judgment or allegation of patent
-infringement or for any other reason (not limited to patent issues),
-conditions are imposed on you (whether by court order, agreement or
-otherwise) that contradict the conditions of this License, they do not
-excuse you from the conditions of this License. If you cannot
-distribute so as to satisfy simultaneously your obligations under this
-License and any other pertinent obligations, then as a consequence you
-may not distribute the Library at all. For example, if a patent
-license would not permit royalty-free redistribution of the Library by
-all those who receive copies directly or indirectly through you, then
-the only way you could satisfy both it and this License would be to
-refrain entirely from distribution of the Library.
-
-If any portion of this section is held invalid or unenforceable under any
-particular circumstance, the balance of the section is intended to apply,
-and the section as a whole is intended to apply in other circumstances.
-
-It is not the purpose of this section to induce you to infringe any
-patents or other property right claims or to contest validity of any
-such claims; this section has the sole purpose of protecting the
-integrity of the free software distribution system which is
-implemented by public license practices. Many people have made
-generous contributions to the wide range of software distributed
-through that system in reliance on consistent application of that
-system; it is up to the author/donor to decide if he or she is willing
-to distribute software through any other system and a licensee cannot
-impose that choice.
-
-This section is intended to make thoroughly clear what is believed to
-be a consequence of the rest of this License.
-
- 12. If the distribution and/or use of the Library is restricted in
-certain countries either by patents or by copyrighted interfaces, the
-original copyright holder who places the Library under this License may add
-an explicit geographical distribution limitation excluding those countries,
-so that distribution is permitted only in or among countries not thus
-excluded. In such case, this License incorporates the limitation as if
-written in the body of this License.
-
- 13. The Free Software Foundation may publish revised and/or new
-versions of the 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
-specifies a version number of this License which applies to it and
-"any later version", you have the option of following the terms and
-conditions either of that version or of any later version published by
-the Free Software Foundation. If the Library does not specify a
-license version number, you may choose any version ever published by
-the Free Software Foundation.
-
- 14. If you wish to incorporate parts of the Library into other free
-programs whose distribution conditions are incompatible with these,
-write to the author to ask for permission. For software which is
-copyrighted by the Free Software Foundation, write to the Free
-Software Foundation; we sometimes make exceptions for this. Our
-decision will be guided by the two goals of preserving the free status
-of all derivatives of our free software and of promoting the sharing
-and reuse of software generally.
-
- NO WARRANTY
-
- 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO
-WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.
-EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR
-OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY
-KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE
-IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
-PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE
-LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME
-THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
-
- 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
-WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY
-AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU
-FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR
-CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE
-LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING
-RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
-FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF
-SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
-DAMAGES.
-
- END OF TERMS AND CONDITIONS
-
- How to Apply These Terms to Your New Libraries
-
- If you develop a new library, and you want it to be of the greatest
-possible use to the public, we recommend making it free software that
-everyone can redistribute and change. You can do so by permitting
-redistribution under these terms (or, alternatively, under the terms of the
-ordinary General Public License).
-
- To apply these terms, attach the following notices to the library. It is
-safest to attach them to the start of each source file to most effectively
-convey the exclusion of warranty; and each file should have at least the
-"copyright" line and a pointer to where the full notice is found.
-
- <one line to give the library's name and a brief idea of what it does.>
- Copyright (C) <year> <name of author>
-
- 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 2.1 of the License, or (at your option) 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 Street, Fifth Floor, Boston, MA 02110-1301 USA
-
-Also add information on how to contact you by electronic and paper mail.
-
-You should also get your employer (if you work as a programmer) or your
-school, if any, to sign a "copyright disclaimer" for the library, if
-necessary. Here is a sample; alter the names:
-
- Yoyodyne, Inc., hereby disclaims all copyright interest in the
- library `Frob' (a library for tweaking knobs) written by James Random Hacker.
-
- <signature of Ty Coon>, 1 April 1990
- Ty Coon, President of Vice
-
-That's all there is to it!
-
-
diff --git a/vendor/pixel418/markdownify/README.md b/vendor/pixel418/markdownify/README.md
deleted file mode 100644
index 8855b0d05..000000000
--- a/vendor/pixel418/markdownify/README.md
+++ /dev/null
@@ -1,63 +0,0 @@
-# Markdownify
-
-[![Build Status](https://travis-ci.org/Elephant418/Markdownify.png?branch=master)](https://travis-ci.org/Elephant418/Markdownify?branch=master)
-[![Total Downloads](https://poser.pugx.org/pixel418/markdownify/downloads)](https://packagist.org/packages/pixel418/markdownify)
-[![License LGPL](https://poser.pugx.org/pixel418/markdownify/license)](https://opensource.org/licenses/lgpl-2.1.php)
-
-The HTML to Markdown converter for PHP
-
-[Code example](#code-example) | [How to Install](#how-to-install) | [How to Contribute](#how-to-contribute) | [Author & Community](#author--community)
-
-
-
-Code example
---------
-
-### Markdown
-
-```php
-$converter = new Markdownify\Converter;
-$converter->parseString('<h1>Heading</h1>');
-// Returns: # Heading
-```
-
-### Markdown Extra [as defined by @michelf](http://michelf.ca/projects/php-markdown/extra/)
-
-```php
-$converter = new Markdownify\ConverterExtra;
-$converter->parseString('<h1 id="md">Heading</h1>');
-// Returns: # Heading {#md}
-```
-
-
-
-How to Install
---------
-
-This library package requires `PHP 5.3` or later.<br>
-Install [Composer](http://getcomposer.org/doc/01-basic-usage.md#installation) and run the following command to get the latest version:
-
-```sh
-composer require pixel418/markdownify
-```
-
-
-
-How to Contribute
---------
-
-1. Fork the Markdownify repository
-2. Create a new branch for each feature or improvement
-3. Send a pull request from each feature branch to the **v2.x** branch
-
-If you don't know much about pull request, you can read [the Github article](https://help.github.com/articles/using-pull-requests)
-
-
-
-Author & Community
---------
-
-Markdownify is under [LGPL License](http://opensource.org/licenses/LGPL-2.1)<br>
-It was created by [Milian Wolff](http://milianw.de)<br>
-It was converted to a Symfony Bundle by [Peter Kruithof](https://github.com/pkruithof)<br>
-It is maintained by [Thomas ZILLIOX](http://tzi.fr)
diff --git a/vendor/pixel418/markdownify/composer.json b/vendor/pixel418/markdownify/composer.json
deleted file mode 100644
index 71d9f3565..000000000
--- a/vendor/pixel418/markdownify/composer.json
+++ /dev/null
@@ -1,38 +0,0 @@
-{
- "name": "pixel418/markdownify",
- "type": "lib",
- "description": "The HTML to Markdown converter for PHP ",
- "keywords": ["markdown", "markdownify"],
- "license": "LGPL",
- "homepage": "https://github.com/elephant418/Markdownify",
- "authors": [
- {
- "name": "Milian Wolff",
- "email": "mail@milianw.de",
- "homepage": "http://milianw.de"
-
- },
- {
- "name": "Peter Kruithof",
- "email": "pkruithof@gmail.com",
- "homepage": "http://pkruithof.tumblr.com/"
- },
- {
- "name": "Thomas Zilliox",
- "email": "hello@tzi.fr",
- "homepage": "http://tzi.fr"
- }
- ],
- "require": {
- "php": ">=5.3.0"
- },
- "require-dev": {
- "phpunit/phpunit": "^4.8"
- },
- "autoload": {
- "psr-4": {
- "Markdownify\\": "src",
- "Test\\Markdownify\\": "test"
- }
- }
-}
diff --git a/vendor/pixel418/markdownify/src/Converter.php b/vendor/pixel418/markdownify/src/Converter.php
deleted file mode 100644
index 77c62dc7e..000000000
--- a/vendor/pixel418/markdownify/src/Converter.php
+++ /dev/null
@@ -1,1400 +0,0 @@
-<?php
-
-/* This file is part of the Markdownify project, which is under LGPL license */
-
-namespace Markdownify;
-
-/**
- * default configuration
- */
-define('MDFY_BODYWIDTH', false);
-define('MDFY_KEEPHTML', true);
-
-/**
- * HTML to Markdown converter class
- */
-class Converter
-{
- /**
- * html parser object
- *
- * @var parseHTML
- */
- protected $parser;
-
- /**
- * markdown output
- *
- * @var string
- */
- protected $output;
-
- /**
- * stack with tags which where not converted to html
- *
- * @var array<string>
- */
- protected $notConverted = array();
-
- /**
- * skip conversion to markdown
- *
- * @var bool
- */
- protected $skipConversion = false;
-
- /* options */
-
- /**
- * keep html tags which cannot be converted to markdown
- *
- * @var bool
- */
- protected $keepHTML = false;
-
- /**
- * wrap output, set to 0 to skip wrapping
- *
- * @var int
- */
- protected $bodyWidth = 0;
-
- /**
- * minimum body width
- *
- * @var int
- */
- protected $minBodyWidth = 25;
-
- /**
- * position where the link reference will be displayed
- *
- *
- * @var int
- */
- protected $linkPosition;
- const LINK_AFTER_CONTENT = 0;
- const LINK_AFTER_PARAGRAPH = 1;
- const LINK_IN_PARAGRAPH = 2;
-
- /**
- * stores current buffers
- *
- * @var array<string>
- */
- protected $buffer = array();
-
- /**
- * stores current buffers
- *
- * @var array<string>
- */
- protected $footnotes = array();
-
- /**
- * tags with elements which can be handled by markdown
- *
- * @var array<string>
- */
- protected $isMarkdownable = array(
- 'p' => array(),
- 'ul' => array(),
- 'ol' => array(),
- 'li' => array(),
- 'br' => array(),
- 'blockquote' => array(),
- 'code' => array(),
- 'pre' => array(),
- 'a' => array(
- 'href' => 'required',
- 'title' => 'optional',
- ),
- 'strong' => array(),
- 'b' => array(),
- 'em' => array(),
- 'i' => array(),
- 'img' => array(
- 'src' => 'required',
- 'alt' => 'optional',
- 'title' => 'optional',
- ),
- 'h1' => array(),
- 'h2' => array(),
- 'h3' => array(),
- 'h4' => array(),
- 'h5' => array(),
- 'h6' => array(),
- 'hr' => array(),
- );
-
- /**
- * html tags to be ignored (contents will be parsed)
- *
- * @var array<string>
- */
- protected $ignore = array(
- 'html',
- 'body',
- );
-
- /**
- * html tags to be dropped (contents will not be parsed!)
- *
- * @var array<string>
- */
- protected $drop = array(
- 'script',
- 'head',
- 'style',
- 'form',
- 'area',
- 'object',
- 'param',
- 'iframe',
- );
-
- /**
- * html block tags that allow inline & block children
- *
- * @var array<string>
- */
- protected $allowMixedChildren = array(
- 'li'
- );
-
- /**
- * Markdown indents which could be wrapped
- * @note: use strings in regex format
- *
- * @var array<string>
- */
- protected $wrappableIndents = array(
- '\* ', // ul
- '\d. ', // ol
- '\d\d. ', // ol
- '> ', // blockquote
- '', // p
- );
-
- /**
- * list of chars which have to be escaped in normal text
- * @note: use strings in regex format
- *
- * @var array
- *
- * TODO: what's with block chars / sequences at the beginning of a block?
- */
- protected $escapeInText = array(
- '\*\*([^*]+)\*\*' => '\*\*$1\*\*', // strong
- '\*([^*]+)\*' => '\*$1\*', // em
- '__(?! |_)(.+)(?!<_| )__' => '\_\_$1\_\_', // strong
- '_(?! |_)(.+)(?!<_| )_' => '\_$1\_', // em
- '([-*_])([ ]{0,2}\1){2,}' => '\\\\$0', // hr
- '`' => '\`', // code
- '\[(.+)\](\s*\()' => '\[$1\]$2', // links: [text] (url) => [text\] (url)
- '\[(.+)\](\s*)\[(.*)\]' => '\[$1\]$2\[$3\]', // links: [text][id] => [text\][id\]
- '^#(#{0,5}) ' => '\#$1 ', // header
- );
-
- /**
- * wether last processed node was a block tag or not
- *
- * @var bool
- */
- protected $lastWasBlockTag = false;
-
- /**
- * name of last closed tag
- *
- * @var string
- */
- protected $lastClosedTag = '';
-
- /**
- * number of line breaks before next inline output
- */
- protected $lineBreaks = 0;
-
- /**
- * node stack, e.g. for <a> and <abbr> tags
- *
- * @var array<array>
- */
- protected $stack = array();
-
- /**
- * current indentation
- *
- * @var string
- */
- protected $indent = '';
-
- /**
- * constructor, set options, setup parser
- *
- * @param int $linkPosition define the position of links
- * @param int $bodyWidth whether or not to wrap the output to the given width
- * defaults to false
- * @param bool $keepHTML whether to keep non markdownable HTML or to discard it
- * defaults to true (HTML will be kept)
- * @return void
- */
- public function __construct($linkPosition = self::LINK_AFTER_CONTENT, $bodyWidth = MDFY_BODYWIDTH, $keepHTML = MDFY_KEEPHTML)
- {
- $this->linkPosition = $linkPosition;
- $this->keepHTML = $keepHTML;
-
- if ($bodyWidth > $this->minBodyWidth) {
- $this->bodyWidth = intval($bodyWidth);
- } else {
- $this->bodyWidth = false;
- }
-
- $this->parser = new Parser;
- $this->parser->noTagsInCode = true;
-
- // we don't have to do this every time
- $search = array();
- $replace = array();
- foreach ($this->escapeInText as $s => $r) {
- array_push($search, '@(?<!\\\)' . $s . '@U');
- array_push($replace, $r);
- }
- $this->escapeInText = array(
- 'search' => $search,
- 'replace' => $replace
- );
- }
-
- /**
- * parse a HTML string
- *
- * @param string $html
- * @return string markdown formatted
- */
- public function parseString($html)
- {
- $this->resetState();
-
- $this->parser->html = $html;
- $this->parse();
-
- return $this->output;
- }
-
- /**
- * set the position where the link reference will be displayed
- *
- * @param int $linkPosition
- * @return void
- */
- public function setLinkPosition($linkPosition)
- {
- $this->linkPosition = $linkPosition;
- }
-
- /**
- * set keep HTML tags which cannot be converted to markdown
- *
- * @param bool $linkPosition
- * @return void
- */
- public function setKeepHTML($keepHTML)
- {
- $this->keepHTML = $keepHTML;
- }
-
- /**
- * iterate through the nodes and decide what we
- * shall do with the current node
- *
- * @param void
- * @return void
- */
- protected function parse()
- {
- $this->output = '';
- // drop tags
- $this->parser->html = preg_replace('#<(' . implode('|', $this->drop) . ')[^>]*>.*</\\1>#sU', '', $this->parser->html);
- while ($this->parser->nextNode()) {
- switch ($this->parser->nodeType) {
- case 'doctype':
- break;
- case 'pi':
- case 'comment':
- if ($this->keepHTML) {
- $this->flushLinebreaks();
- $this->out($this->parser->node);
- $this->setLineBreaks(2);
- }
- // else drop
- break;
- case 'text':
- $this->handleText();
- break;
- case 'tag':
- if (in_array($this->parser->tagName, $this->ignore)) {
- break;
- }
- // If the previous tag was not a block element, we simulate a paragraph tag
- if ($this->parser->isBlockElement && $this->parser->isNextToInlineContext && !in_array($this->parent(), $this->allowMixedChildren)) {
- $this->setLineBreaks(2);
- }
- if ($this->parser->isStartTag) {
- $this->flushLinebreaks();
- }
- if ($this->skipConversion) {
- $this->isMarkdownable(); // update notConverted
- $this->handleTagToText();
- continue;
- }
-
- // block elements
- if (!$this->parser->keepWhitespace && $this->parser->isBlockElement) {
- $this->fixBlockElementSpacing();
- }
-
- // inline elements
- if (!$this->parser->keepWhitespace && $this->parser->isInlineContext) {
- $this->fixInlineElementSpacing();
- }
-
- if ($this->isMarkdownable()) {
- if ($this->parser->isBlockElement && $this->parser->isStartTag && !$this->lastWasBlockTag && !empty($this->output)) {
- if (!empty($this->buffer)) {
- $str =& $this->buffer[count($this->buffer) - 1];
- } else {
- $str =& $this->output;
- }
- if (substr($str, -strlen($this->indent) - 1) != "\n" . $this->indent) {
- $str .= "\n" . $this->indent;
- }
- }
- $func = 'handleTag_' . $this->parser->tagName;
- $this->$func();
- if ($this->linkPosition == self::LINK_AFTER_PARAGRAPH && $this->parser->isBlockElement && !$this->parser->isStartTag && empty($this->parser->openTags)) {
- $this->flushFootnotes();
- }
- if (!$this->parser->isStartTag) {
- $this->lastClosedTag = $this->parser->tagName;
- }
- } else {
- $this->handleTagToText();
- $this->lastClosedTag = '';
- }
- break;
- default:
- trigger_error('invalid node type', E_USER_ERROR);
- break;
- }
- $this->lastWasBlockTag = $this->parser->nodeType == 'tag' && $this->parser->isStartTag && $this->parser->isBlockElement;
- }
- if (!empty($this->buffer)) {
- // trigger_error('buffer was not flushed, this is a bug. please report!', E_USER_WARNING);
- while (!empty($this->buffer)) {
- $this->out($this->unbuffer());
- }
- }
- // cleanup
- $this->output = rtrim(str_replace('&amp;', '&', str_replace('&lt;', '<', str_replace('&gt;', '>', $this->output))));
- // end parsing, flush stacked tags
- $this->flushFootnotes();
- $this->stack = array();
- }
-
- /**
- * check if current tag can be converted to Markdown
- *
- * @param void
- * @return bool
- */
- protected function isMarkdownable()
- {
- if (!isset($this->isMarkdownable[$this->parser->tagName])) {
- // simply not markdownable
-
- return false;
- }
- if ($this->parser->isStartTag) {
- $return = true;
- if ($this->keepHTML) {
- $diff = array_diff(array_keys($this->parser->tagAttributes), array_keys($this->isMarkdownable[$this->parser->tagName]));
- if (!empty($diff)) {
- // non markdownable attributes given
- $return = false;
- }
- }
- if ($return) {
- foreach ($this->isMarkdownable[$this->parser->tagName] as $attr => $type) {
- if ($type == 'required' && !isset($this->parser->tagAttributes[$attr])) {
- // required markdown attribute not given
- $return = false;
- break;
- }
- }
- }
- if (!$return) {
- array_push($this->notConverted, $this->parser->tagName . '::' . implode('/', $this->parser->openTags));
- }
-
- return $return;
- } else {
- if (!empty($this->notConverted) && end($this->notConverted) === $this->parser->tagName . '::' . implode('/', $this->parser->openTags)) {
- array_pop($this->notConverted);
-
- return false;
- }
-
- return true;
- }
- }
-
- /**
- * output footnotes
- *
- * @param void
- * @return void
- */
- protected function flushFootnotes()
- {
- $out = false;
- foreach ($this->footnotes as $k => $tag) {
- if (!isset($tag['unstacked'])) {
- if (!$out) {
- $out = true;
- $this->out("\n\n", true);
- } else {
- $this->out("\n", true);
- }
- $this->out(' [' . $tag['linkID'] . ']: ' . $this->getLinkReference($tag), true);
- $tag['unstacked'] = true;
- $this->footnotes[$k] = $tag;
- }
- }
- }
-
- /**
- * return formated link reference
- *
- * @param array $tag
- * @return string link reference
- */
- protected function getLinkReference($tag)
- {
- return $tag['href'] . (isset($tag['title']) ? ' "' . $tag['title'] . '"' : '');
- }
-
- /**
- * flush enqued linebreaks
- *
- * @param void
- * @return void
- */
- protected function flushLinebreaks()
- {
- if ($this->lineBreaks && !empty($this->output)) {
- $this->out(str_repeat("\n" . $this->indent, $this->lineBreaks), true);
- }
- $this->lineBreaks = 0;
- }
-
- /**
- * handle non Markdownable tags
- *
- * @param void
- * @return void
- */
- protected function handleTagToText()
- {
- if (!$this->keepHTML) {
- if (!$this->parser->isStartTag && $this->parser->isBlockElement) {
- $this->setLineBreaks(2);
- }
- } else {
- // dont convert to markdown inside this tag
- /** TODO: markdown extra **/
- if (!$this->parser->isEmptyTag) {
- if ($this->parser->isStartTag) {
- if (!$this->skipConversion) {
- $this->skipConversion = $this->parser->tagName . '::' . implode('/', $this->parser->openTags);
- }
- } else {
- if ($this->skipConversion == $this->parser->tagName . '::' . implode('/', $this->parser->openTags)) {
- $this->skipConversion = false;
- }
- }
- }
-
- if ($this->parser->isBlockElement) {
- if ($this->parser->isStartTag) {
- // looks like ins or del are block elements now
- if (in_array($this->parent(), array('ins', 'del'))) {
- $this->out("\n", true);
- $this->indent(' ');
- }
- // don't indent inside <pre> tags
- if ($this->parser->tagName == 'pre') {
- $this->out($this->parser->node);
- static $indent;
- $indent = $this->indent;
- $this->indent = '';
- } else {
- $this->out($this->parser->node . "\n" . $this->indent);
- if (!$this->parser->isEmptyTag) {
- $this->indent(' ');
- } else {
- $this->setLineBreaks(1);
- }
- $this->parser->html = ltrim($this->parser->html);
- }
- } else {
- if (!$this->parser->keepWhitespace) {
- $this->output = rtrim($this->output);
- }
- if ($this->parser->tagName != 'pre') {
- $this->indent(' ');
- $this->out("\n" . $this->indent . $this->parser->node);
- } else {
- // reset indentation
- $this->out($this->parser->node);
- static $indent;
- $this->indent = $indent;
- }
-
- if (in_array($this->parent(), array('ins', 'del'))) {
- // ins or del was block element
- $this->out("\n");
- $this->indent(' ');
- }
- if ($this->parser->tagName == 'li') {
- $this->setLineBreaks(1);
- } else {
- $this->setLineBreaks(2);
- }
- }
- } else {
- $this->out($this->parser->node);
- }
- if (in_array($this->parser->tagName, array('code', 'pre'))) {
- if ($this->parser->isStartTag) {
- $this->buffer();
- } else {
- // add stuff so cleanup just reverses this
- $this->out(str_replace('&lt;', '&amp;lt;', str_replace('&gt;', '&amp;gt;', $this->unbuffer())));
- }
- }
- }
- }
-
- /**
- * handle plain text
- *
- * @param void
- * @return void
- */
- protected function handleText()
- {
- if ($this->hasParent('pre') && strpos($this->parser->node, "\n") !== false) {
- $this->parser->node = str_replace("\n", "\n" . $this->indent, $this->parser->node);
- }
- if (!$this->hasParent('code') && !$this->hasParent('pre')) {
- // entity decode
- $this->parser->node = $this->decode($this->parser->node);
- if (!$this->skipConversion) {
- // escape some chars in normal Text
- $this->parser->node = preg_replace($this->escapeInText['search'], $this->escapeInText['replace'], $this->parser->node);
- }
- } else {
- $this->parser->node = str_replace(array('&quot;', '&apos'), array('"', '\''), $this->parser->node);
- }
- $this->out($this->parser->node);
- $this->lastClosedTag = '';
- }
-
- /**
- * handle <em> and <i> tags
- *
- * @param void
- * @return void
- */
- protected function handleTag_em()
- {
- $this->out('_', true);
- }
-
- protected function handleTag_i()
- {
- $this->handleTag_em();
- }
-
- /**
- * handle <strong> and <b> tags
- *
- * @param void
- * @return void
- */
- protected function handleTag_strong()
- {
- $this->out('**', true);
- }
-
- protected function handleTag_b()
- {
- $this->handleTag_strong();
- }
-
- /**
- * handle <h1> tags
- *
- * @param void
- * @return void
- */
- protected function handleTag_h1()
- {
- $this->handleHeader(1);
- }
-
- /**
- * handle <h2> tags
- *
- * @param void
- * @return void
- */
- protected function handleTag_h2()
- {
- $this->handleHeader(2);
- }
-
- /**
- * handle <h3> tags
- *
- * @param void
- * @return void
- */
- protected function handleTag_h3()
- {
- $this->handleHeader(3);
- }
-
- /**
- * handle <h4> tags
- *
- * @param void
- * @return void
- */
- protected function handleTag_h4()
- {
- $this->handleHeader(4);
- }
-
- /**
- * handle <h5> tags
- *
- * @param void
- * @return void
- */
- protected function handleTag_h5()
- {
- $this->handleHeader(5);
- }
-
- /**
- * handle <h6> tags
- *
- * @param void
- * @return void
- */
- protected function handleTag_h6()
- {
- $this->handleHeader(6);
- }
-
- /**
- * handle header tags (<h1> - <h6>)
- *
- * @param int $level 1-6
- * @return void
- */
- protected function handleHeader($level)
- {
- if ($this->parser->isStartTag) {
- $this->out(str_repeat('#', $level) . ' ', true);
- } else {
- $this->setLineBreaks(2);
- }
- }
-
- /**
- * handle <p> tags
- *
- * @param void
- * @return void
- */
- protected function handleTag_p()
- {
- if (!$this->parser->isStartTag) {
- $this->setLineBreaks(2);
- }
- }
-
- /**
- * handle <a> tags
- *
- * @param void
- * @return void
- */
- protected function handleTag_a()
- {
- if ($this->parser->isStartTag) {
- $this->buffer();
- $this->handleTag_a_parser();
- $this->stack();
- } else {
- $tag = $this->unstack();
- $buffer = $this->unbuffer();
- $this->handleTag_a_converter($tag, $buffer);
- $this->out($this->handleTag_a_converter($tag, $buffer), true);
- }
- }
-
- /**
- * handle <a> tags parsing
- *
- * @param void
- * @return void
- */
- protected function handleTag_a_parser()
- {
- if (isset($this->parser->tagAttributes['title'])) {
- $this->parser->tagAttributes['title'] = $this->decode($this->parser->tagAttributes['title']);
- } else {
- $this->parser->tagAttributes['title'] = null;
- }
- $this->parser->tagAttributes['href'] = $this->decode(trim($this->parser->tagAttributes['href']));
- }
-
- /**
- * handle <a> tags conversion
- *
- * @param array $tag
- * @param string $buffer
- * @return string The markdownified link
- */
- protected function handleTag_a_converter($tag, $buffer)
- {
- if (empty($tag['href']) && empty($tag['title'])) {
- // empty links... testcase mania, who would possibly do anything like that?!
- return '[' . $buffer . ']()';
- }
-
- if ($buffer == $tag['href'] && empty($tag['title'])) {
- // <http://example.com>
- return '<' . $buffer . '>';
- }
-
- $bufferDecoded = $this->decode(trim($buffer));
- if (substr($tag['href'], 0, 7) == 'mailto:' && 'mailto:' . $bufferDecoded == $tag['href']) {
- if (is_null($tag['title'])) {
- // <mail@example.com>
- return '<' . $bufferDecoded . '>';
- }
- // [mail@example.com][1]
- // ...
- // [1]: mailto:mail@example.com Title
- $tag['href'] = 'mailto:' . $bufferDecoded;
- }
-
- if ($this->linkPosition == self::LINK_IN_PARAGRAPH) {
- return '[' . $buffer . '](' . $this->getLinkReference($tag) . ')';
- }
-
- // [This link][id]
- foreach ($this->footnotes as $tag2) {
- if ($tag2['href'] == $tag['href'] && $tag2['title'] === $tag['title']) {
- $tag['linkID'] = $tag2['linkID'];
- break;
- }
- }
- if (!isset($tag['linkID'])) {
- $tag['linkID'] = count($this->footnotes) + 1;
- array_push($this->footnotes, $tag);
- }
-
- return '[' . $buffer . '][' . $tag['linkID'] . ']';
- }
-
- /**
- * handle <img /> tags
- *
- * @param void
- * @return void
- */
- protected function handleTag_img()
- {
- if (!$this->parser->isStartTag) {
- return; // just to be sure this is really an empty tag...
- }
-
- if (isset($this->parser->tagAttributes['title'])) {
- $this->parser->tagAttributes['title'] = $this->decode($this->parser->tagAttributes['title']);
- } else {
- $this->parser->tagAttributes['title'] = null;
- }
- if (isset($this->parser->tagAttributes['alt'])) {
- $this->parser->tagAttributes['alt'] = $this->decode($this->parser->tagAttributes['alt']);
- } else {
- $this->parser->tagAttributes['alt'] = null;
- }
-
- if (empty($this->parser->tagAttributes['src'])) {
- // support for "empty" images... dunno if this is really needed
- // but there are some test cases which do that...
- if (!empty($this->parser->tagAttributes['title'])) {
- $this->parser->tagAttributes['title'] = ' ' . $this->parser->tagAttributes['title'] . ' ';
- }
- $this->out('![' . $this->parser->tagAttributes['alt'] . '](' . $this->parser->tagAttributes['title'] . ')', true);
-
- return;
- } else {
- $this->parser->tagAttributes['src'] = $this->decode($this->parser->tagAttributes['src']);
- }
-
- $out = '![' . $this->parser->tagAttributes['alt'] . ']';
- if ($this->linkPosition == self::LINK_IN_PARAGRAPH) {
- $out .= '(' . $this->parser->tagAttributes['src'];
- if ($this->parser->tagAttributes['title']) {
- $out .= ' "' . $this->parser->tagAttributes['title'] . '"';
- }
- $out .= ')';
- $this->out($out, true);
- return;
- }
-
- // ![This image][id]
- $link_id = false;
- if (!empty($this->footnotes)) {
- foreach ($this->footnotes as $tag) {
- if ($tag['href'] == $this->parser->tagAttributes['src']
- && $tag['title'] === $this->parser->tagAttributes['title']
- ) {
- $link_id = $tag['linkID'];
- break;
- }
- }
- }
- if (!$link_id) {
- $link_id = count($this->footnotes) + 1;
- $tag = array(
- 'href' => $this->parser->tagAttributes['src'],
- 'linkID' => $link_id,
- 'title' => $this->parser->tagAttributes['title']
- );
- array_push($this->footnotes, $tag);
- }
- $out .= '[' . $link_id . ']';
-
- $this->out($out, true);
- }
-
- /**
- * handle <code> tags
- *
- * @param void
- * @return void
- */
- protected function handleTag_code()
- {
- if ($this->hasParent('pre')) {
- // ignore code blocks inside <pre>
-
- return;
- }
- if ($this->parser->isStartTag) {
- $this->buffer();
- } else {
- $buffer = $this->unbuffer();
- // use as many backticks as needed
- preg_match_all('#`+#', $buffer, $matches);
- if (!empty($matches[0])) {
- rsort($matches[0]);
-
- $ticks = '`';
- while (true) {
- if (!in_array($ticks, $matches[0])) {
- break;
- }
- $ticks .= '`';
- }
- } else {
- $ticks = '`';
- }
- if ($buffer[0] == '`' || substr($buffer, -1) == '`') {
- $buffer = ' ' . $buffer . ' ';
- }
- $this->out($ticks . $buffer . $ticks, true);
- }
- }
-
- /**
- * handle <pre> tags
- *
- * @param void
- * @return void
- */
- protected function handleTag_pre()
- {
- if ($this->keepHTML && $this->parser->isStartTag) {
- // check if a simple <code> follows
- if (!preg_match('#^\s*<code\s*>#Us', $this->parser->html)) {
- // this is no standard markdown code block
- $this->handleTagToText();
-
- return;
- }
- }
- $this->indent(' ');
- if (!$this->parser->isStartTag) {
- $this->setLineBreaks(2);
- } else {
- $this->parser->html = ltrim($this->parser->html);
- }
- }
-
- /**
- * handle <blockquote> tags
- *
- * @param void
- * @return void
- */
- protected function handleTag_blockquote()
- {
- $this->indent('> ');
- }
-
- /**
- * handle <ul> tags
- *
- * @param void
- * @return void
- */
- protected function handleTag_ul()
- {
- if ($this->parser->isStartTag) {
- $this->stack();
- if (!$this->keepHTML && $this->lastClosedTag == $this->parser->tagName) {
- $this->out("\n" . $this->indent . '<!-- -->' . "\n" . $this->indent . "\n" . $this->indent);
- }
- } else {
- $this->unstack();
- if ($this->parent() != 'li' || preg_match('#^\s*(</li\s*>\s*<li\s*>\s*)?<(p|blockquote)\s*>#sU', $this->parser->html)) {
- // dont make Markdown add unneeded paragraphs
- $this->setLineBreaks(2);
- }
- }
- }
-
- /**
- * handle <ul> tags
- *
- * @param void
- * @return void
- */
- protected function handleTag_ol()
- {
- // same as above
- $this->parser->tagAttributes['num'] = 0;
- $this->handleTag_ul();
- }
-
- /**
- * handle <li> tags
- *
- * @param void
- * @return void
- */
- protected function handleTag_li()
- {
- if ($this->parent() == 'ol') {
- $parent =& $this->getStacked('ol');
- if ($this->parser->isStartTag) {
- $parent['num']++;
- $this->out(str_repeat(' ', 3 - strlen($parent['num'])) . $parent['num'] . '. ', true);
- }
- } else {
- if ($this->parser->isStartTag) {
- $this->out(' * ', true);
- }
- }
- $this->indent(' ', false);
- if (!$this->parser->isStartTag) {
- $this->setLineBreaks(1);
- }
- }
-
- /**
- * handle <hr /> tags
- *
- * @param void
- * @return void
- */
- protected function handleTag_hr()
- {
- if (!$this->parser->isStartTag) {
- return; // just to be sure this really is an empty tag
- }
- $this->out('* * *', true);
- $this->setLineBreaks(2);
- }
-
- /**
- * handle <br /> tags
- *
- * @param void
- * @return void
- */
- protected function handleTag_br()
- {
- $this->out(" \n" . $this->indent, true);
- $this->parser->html = ltrim($this->parser->html);
- }
-
- /**
- * add current node to the stack
- * this only stores the attributes
- *
- * @param void
- * @return void
- */
- protected function stack()
- {
- if (!isset($this->stack[$this->parser->tagName])) {
- $this->stack[$this->parser->tagName] = array();
- }
- array_push($this->stack[$this->parser->tagName], $this->parser->tagAttributes);
- }
-
- /**
- * remove current tag from stack
- *
- * @param void
- * @return array
- */
- protected function unstack()
- {
- if (!isset($this->stack[$this->parser->tagName]) || !is_array($this->stack[$this->parser->tagName])) {
- trigger_error('Trying to unstack from empty stack. This must not happen.', E_USER_ERROR);
- }
-
- return array_pop($this->stack[$this->parser->tagName]);
- }
-
- /**
- * get last stacked element of type $tagName
- *
- * @param string $tagName
- * @return array
- */
- protected function &getStacked($tagName)
- {
- // no end() so it can be referenced
- return $this->stack[$tagName][count($this->stack[$tagName]) - 1];
- }
-
- /**
- * set number of line breaks before next start tag
- *
- * @param int $number
- * @return void
- */
- protected function setLineBreaks($number)
- {
- if ($this->lineBreaks < $number) {
- $this->lineBreaks = $number;
- }
- }
-
- /**
- * buffer next parser output until unbuffer() is called
- *
- * @param void
- * @return void
- */
- protected function buffer()
- {
- array_push($this->buffer, '');
- }
-
- /**
- * end current buffer and return buffered output
- *
- * @param void
- * @return string
- */
- protected function unbuffer()
- {
- return array_pop($this->buffer);
- }
-
- /**
- * append string to the correct var, either
- * directly to $this->output or to the current
- * buffers
- *
- * @param string $put
- * @param boolean $nowrap
- * @return void
- */
- protected function out($put, $nowrap = false)
- {
- if (empty($put)) {
- return;
- }
- if (!empty($this->buffer)) {
- $this->buffer[count($this->buffer) - 1] .= $put;
- } else {
- if ($this->bodyWidth && !$this->parser->keepWhitespace) { // wrap lines
- // get last line
- $pos = strrpos($this->output, "\n");
- if ($pos === false) {
- $line = $this->output;
- } else {
- $line = substr($this->output, $pos);
- }
-
- if ($nowrap) {
- if ($put[0] != "\n" && $this->strlen($line) + $this->strlen($put) > $this->bodyWidth) {
- $this->output .= "\n" . $this->indent . $put;
- } else {
- $this->output .= $put;
- }
-
- return;
- } else {
- $put .= "\n"; // make sure we get all lines in the while below
- $lineLen = $this->strlen($line);
- while ($pos = strpos($put, "\n")) {
- $putLine = substr($put, 0, $pos + 1);
- $put = substr($put, $pos + 1);
- $putLen = $this->strlen($putLine);
- if ($lineLen + $putLen < $this->bodyWidth) {
- $this->output .= $putLine;
- $lineLen = $putLen;
- } else {
- $split = preg_split('#^(.{0,' . ($this->bodyWidth - $lineLen) . '})\b#', $putLine, 2, PREG_SPLIT_OFFSET_CAPTURE | PREG_SPLIT_DELIM_CAPTURE);
- $this->output .= rtrim($split[1][0]) . "\n" . $this->indent . $this->wordwrap(ltrim($split[2][0]), $this->bodyWidth, "\n" . $this->indent, false);
- }
- }
- $this->output = substr($this->output, 0, -1);
-
- return;
- }
- } else {
- $this->output .= $put;
- }
- }
- }
-
- /**
- * indent next output (start tag) or unindent (end tag)
- *
- * @param string $str indentation
- * @param bool $output add indendation to output
- * @return void
- */
- protected function indent($str, $output = true)
- {
- if ($this->parser->isStartTag) {
- $this->indent .= $str;
- if ($output) {
- $this->out($str, true);
- }
- } else {
- $this->indent = substr($this->indent, 0, -strlen($str));
- }
- }
-
- /**
- * decode email addresses
- *
- * @author derernst@gmx.ch <http://www.php.net/manual/en/function.html-entity-decode.php#68536>
- * @author Milian Wolff <http://milianw.de>
- */
- protected function decode($text, $quote_style = ENT_QUOTES)
- {
- return htmlspecialchars_decode($text, $quote_style);
- }
-
- /**
- * callback for decode() which converts a hexadecimal entity to UTF-8
- *
- * @param array $matches
- * @return string UTF-8 encoded
- */
- protected function _decode_hex($matches)
- {
- return $this->unichr(hexdec($matches[1]));
- }
-
- /**
- * callback for decode() which converts a numerical entity to UTF-8
- *
- * @param array $matches
- * @return string UTF-8 encoded
- */
- protected function _decode_numeric($matches)
- {
- return $this->unichr($matches[1]);
- }
-
- /**
- * UTF-8 chr() which supports numeric entities
- *
- * @author grey - greywyvern - com <http://www.php.net/manual/en/function.chr.php#55978>
- * @param array $matches
- * @return string UTF-8 encoded
- */
- protected function unichr($dec)
- {
- if ($dec < 128) {
- $utf = chr($dec);
- } elseif ($dec < 2048) {
- $utf = chr(192 + (($dec - ($dec % 64)) / 64));
- $utf .= chr(128 + ($dec % 64));
- } else {
- $utf = chr(224 + (($dec - ($dec % 4096)) / 4096));
- $utf .= chr(128 + ((($dec % 4096) - ($dec % 64)) / 64));
- $utf .= chr(128 + ($dec % 64));
- }
-
- return $utf;
- }
-
- /**
- * UTF-8 strlen()
- *
- * @param string $str
- * @return int
- *
- * @author dtorop 932 at hotmail dot com <http://www.php.net/manual/en/function.strlen.php#37975>
- * @author Milian Wolff <http://milianw.de>
- */
- protected function strlen($str)
- {
- if (function_exists('mb_strlen')) {
- return mb_strlen($str, 'UTF-8');
- } else {
- return preg_match_all('/[\x00-\x7F\xC0-\xFD]/', $str, $var_empty);
- }
- }
-
- /**
- * wordwrap for utf8 encoded strings
- *
- * @param string $str
- * @param integer $len
- * @param string $what
- * @return string
- */
- protected function wordwrap($str, $width, $break, $cut = false)
- {
- if (!$cut) {
- $regexp = '#^(?:[\x00-\x7F]|[\xC0-\xFF][\x80-\xBF]+){1,' . $width . '}\b#';
- } else {
- $regexp = '#^(?:[\x00-\x7F]|[\xC0-\xFF][\x80-\xBF]+){' . $width . '}#';
- }
- $return = '';
- while (preg_match($regexp, $str, $matches)) {
- $string = $matches[0];
- $str = ltrim(substr($str, strlen($string)));
- if (!$cut && isset($str[0]) && in_array($str[0], array('.', '!', ';', ':', '?', ','))) {
- $string .= $str[0];
- $str = ltrim(substr($str, 1));
- }
- $return .= $string . $break;
- }
-
- return $return . ltrim($str);
- }
-
- /**
- * check if current node has a $tagName as parent (somewhere, not only the direct parent)
- *
- * @param string $tagName
- * @return bool
- */
- protected function hasParent($tagName)
- {
- return in_array($tagName, $this->parser->openTags);
- }
-
- /**
- * get tagName of direct parent tag
- *
- * @param void
- * @return string $tagName
- */
- protected function parent()
- {
- return end($this->parser->openTags);
- }
-
- /**
- * Trims whitespace in block-level elements, on the left side.
- */
- protected function fixBlockElementSpacing()
- {
- if ($this->parser->isStartTag) {
- $this->parser->html = ltrim($this->parser->html);
- }
- }
-
- /**
- * Moves leading/trailing whitespace from inline elements outside of the
- * element. This is to fix cases like `<strong> Text</strong>`, which if
- * converted to `** strong**` would be incorrect Markdown.
- *
- * Examples:
- *
- * * leading: `<strong> Text</strong>` becomes ` <strong>Text</strong>`
- * * trailing: `<strong>Text </strong>` becomes `<strong>Text</strong> `
- */
- protected function fixInlineElementSpacing()
- {
- if ($this->parser->isStartTag) {
- // move spaces after the start element to before the element
- if (preg_match('~^(\s+)~', $this->parser->html, $matches)) {
- $this->out($matches[1]);
- $this->parser->html = ltrim($this->parser->html, " \t\0\x0B");
- }
- } else {
- if (!empty($this->buffer)) {
- $str =& $this->buffer[count($this->buffer) - 1];
- } else {
- $str =& $this->output;
- }
-
- // move spaces before the end element to after the element
- if (preg_match('~(\s+)$~', $str, $matches)) {
- $str = rtrim($str, " \t\0\x0B");
- $this->parser->html = $matches[1] . $this->parser->html;
- }
- }
- }
-
- /**
- * Resetting the state forces the instance to behave as a fresh instance.
- * Ideal for running within a loop where you want to maintain a single instance.
- */
- protected function resetState()
- {
- $this->notConverted = array();
- $this->skipConversion = false;
- $this->buffer = array();
- $this->indent = '';
- $this->stack = array();
- $this->lineBreaks = 0;
- $this->lastClosedTag = '';
- $this->lastWasBlockTag = false;
- $this->footnotes = array();
- }
-}
diff --git a/vendor/pixel418/markdownify/src/ConverterExtra.php b/vendor/pixel418/markdownify/src/ConverterExtra.php
deleted file mode 100644
index 733955448..000000000
--- a/vendor/pixel418/markdownify/src/ConverterExtra.php
+++ /dev/null
@@ -1,573 +0,0 @@
-<?php
-
-/* This file is part of the Markdownify project, which is under LGPL license */
-
-namespace Markdownify;
-
-class ConverterExtra extends Converter
-{
-
- /**
- * table data, including rows with content and the maximum width of each col
- *
- * @var array
- */
- protected $table = array();
-
- /**
- * current col
- *
- * @var int
- */
- protected $col = -1;
-
- /**
- * current row
- *
- * @var int
- */
- protected $row = 0;
-
- /**
- * constructor, see Markdownify::Markdownify() for more information
- */
- public function __construct($linksAfterEachParagraph = self::LINK_AFTER_CONTENT, $bodyWidth = MDFY_BODYWIDTH, $keepHTML = MDFY_KEEPHTML)
- {
- parent::__construct($linksAfterEachParagraph, $bodyWidth, $keepHTML);
-
- // new markdownable tags & attributes
- // header ids: # foo {bar}
- $this->isMarkdownable['h1']['id'] = 'optional';
- $this->isMarkdownable['h1']['class'] = 'optional';
- $this->isMarkdownable['h2']['id'] = 'optional';
- $this->isMarkdownable['h2']['class'] = 'optional';
- $this->isMarkdownable['h3']['id'] = 'optional';
- $this->isMarkdownable['h3']['class'] = 'optional';
- $this->isMarkdownable['h4']['id'] = 'optional';
- $this->isMarkdownable['h4']['class'] = 'optional';
- $this->isMarkdownable['h5']['id'] = 'optional';
- $this->isMarkdownable['h5']['class'] = 'optional';
- $this->isMarkdownable['h6']['id'] = 'optional';
- $this->isMarkdownable['h6']['class'] = 'optional';
- // tables
- $this->isMarkdownable['table'] = array();
- $this->isMarkdownable['th'] = array(
- 'align' => 'optional',
- );
- $this->isMarkdownable['td'] = array(
- 'align' => 'optional',
- );
- $this->isMarkdownable['tr'] = array();
- array_push($this->ignore, 'thead');
- array_push($this->ignore, 'tbody');
- array_push($this->ignore, 'tfoot');
- // definition lists
- $this->isMarkdownable['dl'] = array();
- $this->isMarkdownable['dd'] = array();
- $this->isMarkdownable['dt'] = array();
- // link class
- $this->isMarkdownable['a']['id'] = 'optional';
- $this->isMarkdownable['a']['class'] = 'optional';
- // footnotes
- $this->isMarkdownable['fnref'] = array(
- 'target' => 'required',
- );
- $this->isMarkdownable['footnotes'] = array();
- $this->isMarkdownable['fn'] = array(
- 'name' => 'required',
- );
- $this->parser->blockElements['fnref'] = false;
- $this->parser->blockElements['fn'] = true;
- $this->parser->blockElements['footnotes'] = true;
- // abbr
- $this->isMarkdownable['abbr'] = array(
- 'title' => 'required',
- );
- // build RegEx lookahead to decide wether table can pe parsed or not
- $inlineTags = array_keys($this->parser->blockElements, false);
- $colContents = '(?:[^<]|<(?:' . implode('|', $inlineTags) . '|[^a-z]))*';
- $this->tableLookaheadHeader = '{
- ^\s*(?:<thead\s*>)?\s* # open optional thead
- <tr\s*>\s*(?: # start required row with headers
- <th(?:\s+align=("|\')(?:left|center|right)\1)?\s*> # header with optional align
- \s*' . $colContents . '\s* # contents
- </th>\s* # close header
- )+</tr> # close row with headers
- \s*(?:</thead>)? # close optional thead
- }sxi';
- $this->tdSubstitute = '\s*' . $colContents . '\s* # contents
- </td>\s*';
- $this->tableLookaheadBody = '{
- \s*(?:<tbody\s*>)?\s* # open optional tbody
- (?:<tr\s*>\s* # start row
- %s # cols to be substituted
- </tr>)+ # close row
- \s*(?:</tbody>)? # close optional tbody
- \s*</table> # close table
- }sxi';
- }
-
- /**
- * handle header tags (<h1> - <h6>)
- *
- * @param int $level 1-6
- * @return void
- */
- protected function handleHeader($level)
- {
- if ($this->parser->isStartTag) {
- $this->parser->tagAttributes['cssSelector'] = $this->getCurrentCssSelector();
- $this->stack();
- } else {
- $tag = $this->unstack();
- if (!empty($tag['cssSelector'])) {
- // {#id.class}
- $this->out(' {' . $tag['cssSelector'] . '}');
- }
- }
- parent::handleHeader($level);
- }
-
- /**
- * handle <a> tags parsing
- *
- * @param void
- * @return void
- */
- protected function handleTag_a_parser()
- {
- parent::handleTag_a_parser();
- $this->parser->tagAttributes['cssSelector'] = $this->getCurrentCssSelector();
- }
-
- /**
- * handle <a> tags conversion
- *
- * @param array $tag
- * @param string $buffer
- * @return string The markdownified link
- */
- protected function handleTag_a_converter($tag, $buffer)
- {
- $output = parent::handleTag_a_converter($tag, $buffer);
- if (!empty($tag['cssSelector'])) {
- // [This link][id]{#id.class}
- $output .= '{' . $tag['cssSelector'] . '}';
- }
-
- return $output;
- }
-
- /**
- * handle <abbr> tags
- *
- * @param void
- * @return void
- */
- protected function handleTag_abbr()
- {
- if ($this->parser->isStartTag) {
- $this->stack();
- $this->buffer();
- } else {
- $tag = $this->unstack();
- $tag['text'] = $this->unbuffer();
- $add = true;
- foreach ($this->stack['abbr'] as $stacked) {
- if ($stacked['text'] == $tag['text']) {
- /** TODO: differing abbr definitions, i.e. different titles for same text **/
- $add = false;
- break;
- }
- }
- $this->out($tag['text']);
- if ($add) {
- array_push($this->stack['abbr'], $tag);
- }
- }
- }
-
- /**
- * flush stacked abbr tags
- *
- * @param void
- * @return void
- */
- protected function flushStacked_abbr()
- {
- $out = array();
- foreach ($this->stack['abbr'] as $k => $tag) {
- if (!isset($tag['unstacked'])) {
- array_push($out, ' *[' . $tag['text'] . ']: ' . $tag['title']);
- $tag['unstacked'] = true;
- $this->stack['abbr'][$k] = $tag;
- }
- }
- if (!empty($out)) {
- $this->out("\n\n" . implode("\n", $out));
- }
- }
-
- /**
- * handle <table> tags
- *
- * @param void
- * @return void
- */
- protected function handleTag_table()
- {
- if ($this->parser->isStartTag) {
- // check if upcoming table can be converted
- if ($this->keepHTML) {
- if (preg_match($this->tableLookaheadHeader, $this->parser->html, $matches)) {
- // header seems good, now check body
- // get align & number of cols
- preg_match_all('#<th(?:\s+align=("|\')(left|right|center)\1)?\s*>#si', $matches[0], $cols);
- $regEx = '';
- $i = 1;
- $aligns = array();
- foreach ($cols[2] as $align) {
- $align = strtolower($align);
- array_push($aligns, $align);
- if (empty($align)) {
- $align = 'left'; // default value
- }
- $td = '\s+align=("|\')' . $align . '\\' . $i;
- $i++;
- if ($align == 'left') {
- // look for empty align or left
- $td = '(?:' . $td . ')?';
- }
- $td = '<td' . $td . '\s*>';
- $regEx .= $td . $this->tdSubstitute;
- }
- $regEx = sprintf($this->tableLookaheadBody, $regEx);
- if (preg_match($regEx, $this->parser->html, $matches, null, strlen($matches[0]))) {
- // this is a markdownable table tag!
- $this->table = array(
- 'rows' => array(),
- 'col_widths' => array(),
- 'aligns' => $aligns,
- );
- $this->row = 0;
- } else {
- // non markdownable table
- $this->handleTagToText();
- }
- } else {
- // non markdownable table
- $this->handleTagToText();
- }
- } else {
- $this->table = array(
- 'rows' => array(),
- 'col_widths' => array(),
- 'aligns' => array(),
- );
- $this->row = 0;
- }
- } else {
- // finally build the table in Markdown Extra syntax
- $separator = array();
- if (!isset($this->table['aligns'])) {
- $this->table['aligns'] = array();
- }
- // seperator with correct align identifiers
- foreach ($this->table['aligns'] as $col => $align) {
- if (!$this->keepHTML && !isset($this->table['col_widths'][$col])) {
- break;
- }
- $left = ' ';
- $right = ' ';
- switch ($align) {
- case 'left':
- $left = ':';
- break;
- case 'center':
- $right = ':';
- $left = ':';
- case 'right':
- $right = ':';
- break;
- }
- array_push($separator, $left . str_repeat('-', $this->table['col_widths'][$col]) . $right);
- }
- $separator = '|' . implode('|', $separator) . '|';
-
- $rows = array();
- // add padding
- array_walk_recursive($this->table['rows'], array(&$this, 'alignTdContent'));
- $header = array_shift($this->table['rows']);
- array_push($rows, '| ' . implode(' | ', $header) . ' |');
- array_push($rows, $separator);
- foreach ($this->table['rows'] as $row) {
- array_push($rows, '| ' . implode(' | ', $row) . ' |');
- }
- $this->out(implode("\n" . $this->indent, $rows));
- $this->table = array();
- $this->setLineBreaks(2);
- }
- }
-
- /**
- * properly pad content so it is aligned as whished
- * should be used with array_walk_recursive on $this->table['rows']
- *
- * @param string &$content
- * @param int $col
- * @return void
- */
- protected function alignTdContent(&$content, $col)
- {
- if (!isset($this->table['aligns'][$col])) {
- $this->table['aligns'][$col] = 'left';
- }
- switch ($this->table['aligns'][$col]) {
- default:
- case 'left':
- $content .= str_repeat(' ', $this->table['col_widths'][$col] - $this->strlen($content));
- break;
- case 'right':
- $content = str_repeat(' ', $this->table['col_widths'][$col] - $this->strlen($content)) . $content;
- break;
- case 'center':
- $paddingNeeded = $this->table['col_widths'][$col] - $this->strlen($content);
- $left = floor($paddingNeeded / 2);
- $right = $paddingNeeded - $left;
- $content = str_repeat(' ', $left) . $content . str_repeat(' ', $right);
- break;
- }
- }
-
- /**
- * handle <tr> tags
- *
- * @param void
- * @return void
- */
- protected function handleTag_tr()
- {
- if ($this->parser->isStartTag) {
- $this->col = -1;
- } else {
- $this->row++;
- }
- }
-
- /**
- * handle <td> tags
- *
- * @param void
- * @return void
- */
- protected function handleTag_td()
- {
- if ($this->parser->isStartTag) {
- $this->col++;
- if (!isset($this->table['col_widths'][$this->col])) {
- $this->table['col_widths'][$this->col] = 0;
- }
- $this->buffer();
- } else {
- $buffer = trim($this->unbuffer());
- if (!isset($this->table['col_widths'][$this->col])) {
- $this->table['col_widths'][$this->col] = 0;
- }
- $this->table['col_widths'][$this->col] = max($this->table['col_widths'][$this->col], $this->strlen($buffer));
- $this->table['rows'][$this->row][$this->col] = $buffer;
- }
- }
-
- /**
- * handle <th> tags
- *
- * @param void
- * @return void
- */
- protected function handleTag_th()
- {
- if (!$this->keepHTML && !isset($this->table['rows'][1]) && !isset($this->table['aligns'][$this->col + 1])) {
- if (isset($this->parser->tagAttributes['align'])) {
- $this->table['aligns'][$this->col + 1] = $this->parser->tagAttributes['align'];
- } else {
- $this->table['aligns'][$this->col + 1] = '';
- }
- }
- $this->handleTag_td();
- }
-
- /**
- * handle <dl> tags
- *
- * @param void
- * @return void
- */
- protected function handleTag_dl()
- {
- if (!$this->parser->isStartTag) {
- $this->setLineBreaks(2);
- }
- }
-
- /**
- * handle <dt> tags
- *
- * @param void
- * @return void
- **/
- protected function handleTag_dt()
- {
- if (!$this->parser->isStartTag) {
- $this->setLineBreaks(1);
- }
- }
-
- /**
- * handle <dd> tags
- *
- * @param void
- * @return void
- */
- protected function handleTag_dd()
- {
- if ($this->parser->isStartTag) {
- if (substr(ltrim($this->parser->html), 0, 3) == '<p>') {
- // next comes a paragraph, so we'll need an extra line
- $this->out("\n" . $this->indent);
- } elseif (substr($this->output, -2) == "\n\n") {
- $this->output = substr($this->output, 0, -1);
- }
- $this->out(': ');
- $this->indent(' ', false);
- } else {
- // lookahead for next dt
- if (substr(ltrim($this->parser->html), 0, 4) == '<dt>') {
- $this->setLineBreaks(2);
- } else {
- $this->setLineBreaks(1);
- }
- $this->indent(' ');
- }
- }
-
- /**
- * handle <fnref /> tags (custom footnote references, see markdownify_extra::parseString())
- *
- * @param void
- * @return void
- */
- protected function handleTag_fnref()
- {
- $this->out('[^' . $this->parser->tagAttributes['target'] . ']');
- }
-
- /**
- * handle <fn> tags (custom footnotes, see markdownify_extra::parseString()
- * and markdownify_extra::_makeFootnotes())
- *
- * @param void
- * @return void
- */
- protected function handleTag_fn()
- {
- if ($this->parser->isStartTag) {
- $this->out('[^' . $this->parser->tagAttributes['name'] . ']:');
- $this->setLineBreaks(1);
- } else {
- $this->setLineBreaks(2);
- }
- $this->indent(' ');
- }
-
- /**
- * handle <footnotes> tag (custom footnotes, see markdownify_extra::parseString()
- * and markdownify_extra::_makeFootnotes())
- *
- * @param void
- * @return void
- */
- protected function handleTag_footnotes()
- {
- if (!$this->parser->isStartTag) {
- $this->setLineBreaks(2);
- }
- }
-
- /**
- * parse a HTML string, clean up footnotes prior
- *
- * @param string $HTML input
- * @return string Markdown formatted output
- */
- public function parseString($html)
- {
- /** TODO: custom markdown-extra options, e.g. titles & classes **/
- // <sup id="fnref:..."><a href"#fn..." rel="footnote">...</a></sup>
- // => <fnref target="..." />
- $html = preg_replace('@<sup id="fnref:([^"]+)">\s*<a href="#fn:\1" rel="footnote">\s*\d+\s*</a>\s*</sup>@Us', '<fnref target="$1" />', $html);
- // <div class="footnotes">
- // <hr />
- // <ol>
- //
- // <li id="fn:...">...</li>
- // ...
- //
- // </ol>
- // </div>
- // =>
- // <footnotes>
- // <fn name="...">...</fn>
- // ...
- // </footnotes>
- $html = preg_replace_callback('#<div class="footnotes">\s*<hr />\s*<ol>\s*(.+)\s*</ol>\s*</div>#Us', array(&$this, '_makeFootnotes'), $html);
-
- return parent::parseString($html);
- }
-
- /**
- * replace HTML representation of footnotes with something more easily parsable
- *
- * @note this is a callback to be used in parseString()
- *
- * @param array $matches
- * @return string
- */
- protected function _makeFootnotes($matches)
- {
- // <li id="fn:1">
- // ...
- // <a href="#fnref:block" rev="footnote">&#8617;</a></p>
- // </li>
- // => <fn name="1">...</fn>
- // remove footnote link
- $fns = preg_replace('@\s*(&#160;\s*)?<a href="#fnref:[^"]+" rev="footnote"[^>]*>&#8617;</a>\s*@s', '', $matches[1]);
- // remove empty paragraph
- $fns = preg_replace('@<p>\s*</p>@s', '', $fns);
- // <li id="fn:1">...</li> -> <footnote nr="1">...</footnote>
- $fns = str_replace('<li id="fn:', '<fn name="', $fns);
-
- $fns = '<footnotes>' . $fns . '</footnotes>';
-
- return preg_replace('#</li>\s*(?=(?:<fn|</footnotes>))#s', '</fn>$1', $fns);
- }
-
- /**
- * handle <a> tags parsing
- *
- * @param void
- * @return void
- */
- protected function getCurrentCssSelector()
- {
- $cssSelector = '';
- if (isset($this->parser->tagAttributes['id'])) {
- $cssSelector .= '#' . $this->decode($this->parser->tagAttributes['id']);
- }
- if (isset($this->parser->tagAttributes['class'])) {
- $classes = explode(' ', $this->decode($this->parser->tagAttributes['class']));
- $classes = array_filter($classes);
- $cssSelector .= '.' . join('.', $classes);
- }
- return $cssSelector;
- }
-}
diff --git a/vendor/pixel418/markdownify/src/Parser.php b/vendor/pixel418/markdownify/src/Parser.php
deleted file mode 100644
index 90fcdf9f8..000000000
--- a/vendor/pixel418/markdownify/src/Parser.php
+++ /dev/null
@@ -1,564 +0,0 @@
-<?php
-
-/* This file is part of the Markdownify project, which is under LGPL license */
-
-namespace Markdownify;
-
-class Parser
-{
- public static $skipWhitespace = true;
- public static $a_ord;
- public static $z_ord;
- public static $special_ords;
-
- /**
- * tags which are always empty (<br /> etc.)
- *
- * @var array<string>
- */
- public $emptyTags = array(
- 'br',
- 'hr',
- 'input',
- 'img',
- 'area',
- 'link',
- 'meta',
- 'param',
- );
-
- /**
- * tags with preformatted text
- * whitespaces wont be touched in them
- *
- * @var array<string>
- */
- public $preformattedTags = array(
- 'script',
- 'style',
- 'pre',
- 'code',
- );
-
- /**
- * supress HTML tags inside preformatted tags (see above)
- *
- * @var bool
- */
- public $noTagsInCode = false;
-
- /**
- * html to be parsed
- *
- * @var string
- */
- public $html = '';
-
- /**
- * node type:
- *
- * - tag (see isStartTag)
- * - text (includes cdata)
- * - comment
- * - doctype
- * - pi (processing instruction)
- *
- * @var string
- */
- public $nodeType = '';
-
- /**
- * current node content, i.e. either a
- * simple string (text node), or something like
- * <tag attrib="value"...>
- *
- * @var string
- */
- public $node = '';
-
- /**
- * wether current node is an opening tag (<a>) or not (</a>)
- * set to NULL if current node is not a tag
- * NOTE: empty tags (<br />) set this to true as well!
- *
- * @var bool | null
- */
- public $isStartTag = null;
-
- /**
- * wether current node is an empty tag (<br />) or not (<a></a>)
- *
- * @var bool | null
- */
- public $isEmptyTag = null;
-
- /**
- * tag name
- *
- * @var string | null
- */
- public $tagName = '';
-
- /**
- * attributes of current tag
- *
- * @var array (attribName=>value) | null
- */
- public $tagAttributes = null;
-
- /**
- * whether or not the actual context is a inline context
- *
- * @var bool | null
- */
- public $isInlineContext = null;
-
- /**
- * whether the current tag is a block element
- *
- * @var bool | null
- */
- public $isBlockElement = null;
-
- /**
- * whether the previous tag (browser) is a block element
- *
- * @var bool | null
- */
- public $isNextToInlineContext = null;
-
- /**
- * keep whitespace
- *
- * @var int
- */
- public $keepWhitespace = 0;
-
- /**
- * list of open tags
- * count this to get current depth
- *
- * @var array
- */
- public $openTags = array();
-
- /**
- * list of block elements
- *
- * @var array
- * TODO: what shall we do with <del> and <ins> ?!
- */
- public $blockElements = array(
- // tag name => <bool> is block
- // block elements
- 'address' => true,
- 'blockquote' => true,
- 'center' => true,
- 'del' => true,
- 'dir' => true,
- 'div' => true,
- 'dl' => true,
- 'fieldset' => true,
- 'form' => true,
- 'h1' => true,
- 'h2' => true,
- 'h3' => true,
- 'h4' => true,
- 'h5' => true,
- 'h6' => true,
- 'hr' => true,
- 'ins' => true,
- 'isindex' => true,
- 'menu' => true,
- 'noframes' => true,
- 'noscript' => true,
- 'ol' => true,
- 'p' => true,
- 'pre' => true,
- 'table' => true,
- 'ul' => true,
- // set table elements and list items to block as well
- 'thead' => true,
- 'tbody' => true,
- 'tfoot' => true,
- 'td' => true,
- 'tr' => true,
- 'th' => true,
- 'li' => true,
- 'dd' => true,
- 'dt' => true,
- // header items and html / body as well
- 'html' => true,
- 'body' => true,
- 'head' => true,
- 'meta' => true,
- 'link' => true,
- 'style' => true,
- 'title' => true,
- // unfancy media tags, when indented should be rendered as block
- 'map' => true,
- 'object' => true,
- 'param' => true,
- 'embed' => true,
- 'area' => true,
- // inline elements
- 'a' => false,
- 'abbr' => false,
- 'acronym' => false,
- 'applet' => false,
- 'b' => false,
- 'basefont' => false,
- 'bdo' => false,
- 'big' => false,
- 'br' => false,
- 'button' => false,
- 'cite' => false,
- 'code' => false,
- 'del' => false,
- 'dfn' => false,
- 'em' => false,
- 'font' => false,
- 'i' => false,
- 'img' => false,
- 'ins' => false,
- 'input' => false,
- 'iframe' => false,
- 'kbd' => false,
- 'label' => false,
- 'q' => false,
- 'samp' => false,
- 'script' => false,
- 'select' => false,
- 'small' => false,
- 'span' => false,
- 'strong' => false,
- 'sub' => false,
- 'sup' => false,
- 'textarea' => false,
- 'tt' => false,
- 'var' => false,
- );
-
- /**
- * get next node, set $this->html prior!
- *
- * @param void
- * @return bool
- */
- public function nextNode()
- {
- if (empty($this->html)) {
- // we are done with parsing the html string
-
- return false;
- }
-
- if ($this->isStartTag && !$this->isEmptyTag) {
- array_push($this->openTags, $this->tagName);
- if (in_array($this->tagName, $this->preformattedTags)) {
- // dont truncate whitespaces for <code> or <pre> contents
- $this->keepWhitespace++;
- }
- }
-
- if ($this->html[0] == '<') {
- $token = substr($this->html, 0, 9);
- if (substr($token, 0, 2) == '<?') {
- // xml prolog or other pi's
- /** TODO **/
- // trigger_error('this might need some work', E_USER_NOTICE);
- $pos = strpos($this->html, '>');
- $this->setNode('pi', $pos + 1);
-
- return true;
- }
- if (substr($token, 0, 4) == '<!--') {
- // comment
- $pos = strpos($this->html, '-->');
- if ($pos === false) {
- // could not find a closing -->, use next gt instead
- // this is firefox' behaviour
- $pos = strpos($this->html, '>') + 1;
- } else {
- $pos += 3;
- }
- $this->setNode('comment', $pos);
-
- static::$skipWhitespace = true;
-
- return true;
- }
- if ($token == '<!DOCTYPE') {
- // doctype
- $this->setNode('doctype', strpos($this->html, '>') + 1);
-
- static::$skipWhitespace = true;
-
- return true;
- }
- if ($token == '<![CDATA[') {
- // cdata, use text node
-
- // remove leading <![CDATA[
- $this->html = substr($this->html, 9);
-
- $this->setNode('text', strpos($this->html, ']]>') + 3);
-
- // remove trailing ]]> and trim
- $this->node = substr($this->node, 0, -3);
- $this->handleWhitespaces();
-
- static::$skipWhitespace = true;
-
- return true;
- }
- if ($this->parseTag()) {
- // seems to be a tag
- // handle whitespaces
- if ($this->isBlockElement) {
- static::$skipWhitespace = true;
- } else {
- static::$skipWhitespace = false;
- }
-
- return true;
- }
- }
- if ($this->keepWhitespace) {
- static::$skipWhitespace = false;
- }
- // when we get here it seems to be a text node
- $pos = strpos($this->html, '<');
- if ($pos === false) {
- $pos = strlen($this->html);
- }
- $this->setNode('text', $pos);
- $this->handleWhitespaces();
- if (static::$skipWhitespace && $this->node == ' ') {
- return $this->nextNode();
- }
- $this->isInlineContext = true;
- static::$skipWhitespace = false;
-
- return true;
- }
-
- /**
- * parse tag, set tag name and attributes, see if it's a closing tag and so forth...
- *
- * @param void
- * @return bool
- */
- protected function parseTag()
- {
- if (!isset(static::$a_ord)) {
- static::$a_ord = ord('a');
- static::$z_ord = ord('z');
- static::$special_ords = array(
- ord(':'), // for xml:lang
- ord('-'), // for http-equiv
- );
- }
-
- $tagName = '';
-
- $pos = 1;
- $isStartTag = $this->html[$pos] != '/';
- if (!$isStartTag) {
- $pos++;
- }
- // get tagName
- while (isset($this->html[$pos])) {
- $pos_ord = ord(strtolower($this->html[$pos]));
- if (($pos_ord >= static::$a_ord && $pos_ord <= static::$z_ord) || (!empty($tagName) && is_numeric($this->html[$pos]))) {
- $tagName .= $this->html[$pos];
- $pos++;
- } else {
- $pos--;
- break;
- }
- }
-
- $tagName = strtolower($tagName);
- if (empty($tagName) || !isset($this->blockElements[$tagName])) {
- // something went wrong => invalid tag
- $this->invalidTag();
-
- return false;
- }
- if ($this->noTagsInCode && end($this->openTags) == 'code' && !($tagName == 'code' && !$isStartTag)) {
- // we supress all HTML tags inside code tags
- $this->invalidTag();
-
- return false;
- }
-
- // get tag attributes
- /** TODO: in html 4 attributes do not need to be quoted **/
- $isEmptyTag = false;
- $attributes = array();
- $currAttrib = '';
- while (isset($this->html[$pos + 1])) {
- $pos++;
- // close tag
- if ($this->html[$pos] == '>' || $this->html[$pos] . $this->html[$pos + 1] == '/>') {
- if ($this->html[$pos] == '/') {
- $isEmptyTag = true;
- $pos++;
- }
- break;
- }
-
- $pos_ord = ord(strtolower($this->html[$pos]));
- if (($pos_ord >= static::$a_ord && $pos_ord <= static::$z_ord) || in_array($pos_ord, static::$special_ords)) {
- // attribute name
- $currAttrib .= $this->html[$pos];
- } elseif (in_array($this->html[$pos], array(' ', "\t", "\n"))) {
- // drop whitespace
- } elseif (in_array($this->html[$pos] . $this->html[$pos + 1], array('="', "='"))) {
- // get attribute value
- $pos++;
- $await = $this->html[$pos]; // single or double quote
- $pos++;
- $value = '';
- while (isset($this->html[$pos]) && $this->html[$pos] != $await) {
- $value .= $this->html[$pos];
- $pos++;
- }
- $attributes[$currAttrib] = $value;
- $currAttrib = '';
- } else {
- $this->invalidTag();
-
- return false;
- }
- }
- if ($this->html[$pos] != '>') {
- $this->invalidTag();
-
- return false;
- }
-
- if (!empty($currAttrib)) {
- // html 4 allows something like <option selected> instead of <option selected="selected">
- $attributes[$currAttrib] = $currAttrib;
- }
- if (!$isStartTag) {
- if (!empty($attributes) || $tagName != end($this->openTags)) {
- // end tags must not contain any attributes
- // or maybe we did not expect a different tag to be closed
- $this->invalidTag();
-
- return false;
- }
- array_pop($this->openTags);
- if (in_array($tagName, $this->preformattedTags)) {
- $this->keepWhitespace--;
- }
- }
- $pos++;
- $this->node = substr($this->html, 0, $pos);
- $this->html = substr($this->html, $pos);
- $this->tagName = $tagName;
- $this->tagAttributes = $attributes;
- $this->isStartTag = $isStartTag;
- $this->isEmptyTag = $isEmptyTag || in_array($tagName, $this->emptyTags);
- if ($this->isEmptyTag) {
- // might be not well formed
- $this->node = preg_replace('# */? *>$#', ' />', $this->node);
- }
- $this->nodeType = 'tag';
- $this->isBlockElement = $this->blockElements[$tagName];
- $this->isNextToInlineContext = $isStartTag && $this->isInlineContext;
- $this->isInlineContext = !$this->isBlockElement;
- return true;
- }
-
- /**
- * handle invalid tags
- *
- * @param void
- * @return void
- */
- protected function invalidTag()
- {
- $this->html = substr_replace($this->html, '&lt;', 0, 1);
- }
-
- /**
- * update all vars and make $this->html shorter
- *
- * @param string $type see description for $this->nodeType
- * @param int $pos to which position shall we cut?
- * @return void
- */
- protected function setNode($type, $pos)
- {
- if ($this->nodeType == 'tag') {
- // set tag specific vars to null
- // $type == tag should not be called here
- // see this::parseTag() for more
- $this->tagName = null;
- $this->tagAttributes = null;
- $this->isStartTag = null;
- $this->isEmptyTag = null;
- $this->isBlockElement = null;
-
- }
- $this->nodeType = $type;
- $this->node = substr($this->html, 0, $pos);
- $this->html = substr($this->html, $pos);
- }
-
- /**
- * check if $this->html begins with $str
- *
- * @param string $str
- * @return bool
- */
- protected function match($str)
- {
- return substr($this->html, 0, strlen($str)) == $str;
- }
-
- /**
- * truncate whitespaces
- *
- * @param void
- * @return void
- */
- protected function handleWhitespaces()
- {
- if ($this->keepWhitespace) {
- // <pre> or <code> before...
-
- return;
- }
- // truncate multiple whitespaces to a single one
- $this->node = preg_replace('#\s+#s', ' ', $this->node);
- }
-
- /**
- * normalize self::node
- *
- * @param void
- * @return void
- */
- protected function normalizeNode()
- {
- $this->node = '<';
- if (!$this->isStartTag) {
- $this->node .= '/' . $this->tagName . '>';
-
- return;
- }
- $this->node .= $this->tagName;
- foreach ($this->tagAttributes as $name => $value) {
- $this->node .= ' ' . $name . '="' . str_replace('"', '&quot;', $value) . '"';
- }
- if ($this->isEmptyTag) {
- $this->node .= ' /';
- }
- $this->node .= '>';
- }
-}
diff --git a/vendor/sabre/dav/.travis.yml b/vendor/sabre/dav/.travis.yml
index a9189c981..85637048a 100644
--- a/vendor/sabre/dav/.travis.yml
+++ b/vendor/sabre/dav/.travis.yml
@@ -2,7 +2,9 @@ language: php
php:
- 5.5
- 5.6
- - 7
+ - 7.0
+ - 7.1
+
env:
matrix:
@@ -19,7 +21,6 @@ before_script:
- mysql -e 'create database sabredav_test'
- psql -c "create database sabredav_test" -U postgres
- psql -c "create user sabredav with PASSWORD 'sabredav';GRANT ALL PRIVILEGES ON DATABASE sabredav_test TO sabredav" -U postgres
- - phpenv config-rm xdebug.ini; true
# - composer self-update
- composer update --prefer-dist $LOWEST_DEPS
@@ -28,7 +29,7 @@ before_script:
script:
- ./bin/phpunit --configuration tests/phpunit.xml.dist $TEST_DEPS
- - ./bin/sabre-cs-fixer fix lib/ --dry-run --diff
+ - ./bin/sabre-cs-fixer fix . --dry-run --diff
cache:
directories:
diff --git a/vendor/sabre/dav/CHANGELOG.md b/vendor/sabre/dav/CHANGELOG.md
index d8a3898c3..0bccc995c 100644
--- a/vendor/sabre/dav/CHANGELOG.md
+++ b/vendor/sabre/dav/CHANGELOG.md
@@ -1,6 +1,28 @@
ChangeLog
=========
+3.2.2 (2017-02-14)
+------------------
+
+* #943: Fix CardDAV XML reporting bug, which was affecting several CardDAV
+ clients. Bug was introduced in 3.2.1.
+* The zip release ships with [sabre/vobject 4.1.2][vobj],
+ [sabre/http 4.2.2][http], [sabre/event 3.0.0][evnt],
+ [sabre/uri 1.2.0][uri] and [sabre/xml 1.5.0][xml].
+
+
+3.2.1 (2017-01-28)
+------------------
+
+* #877: Fix for syncing large calendars when using the Sqlite PDO backend.
+ (@theseer).
+* #889 Added support for filtering vCard properties in the addressbook-query
+ REPORT (@DeepDiver1975).
+* The zip release ships with [sabre/vobject 4.1.2][vobj],
+ [sabre/http 4.2.2][http], [sabre/event 3.0.0][evnt],
+ [sabre/uri 1.2.0][uri] and [sabre/xml 1.5.0][xml].
+
+
3.2.0 (2016-06-27)
------------------
@@ -88,6 +110,9 @@ ChangeLog
------------------
* Fixed: Creating a new calendar on some MySQL configurations caused an error.
+* #889 Added support for filtering vCard properties in the addressbook-query
+ REPORT (@DeepDiver1975).
+
3.1.4 (2016-05-28)
@@ -200,6 +225,13 @@ ChangeLog
[sabre/uri 1.0.1][uri] and [sabre/xml 1.1.0][xml].
+3.0.10 (2016-??-??)
+------------------
+
+* #889 Added support for filtering vCard properties in the addressbook-query
+ REPORT (@DeepDiver1975).
+
+
3.0.9 (2016-04-06)
------------------
@@ -463,11 +495,13 @@ ChangeLog
* #193: Fix `Sabre\DAV\FSExt\Directory::getQuotaInfo()` on windows.
-2.1.11 (2016-??-??)
+2.1.11 (2016-10-06)
-------------------
* #805: It wasn't possible to create calendars that hold events, journals and
todos using MySQL, because the `components` column was 1 byte too small.
+* The zip release ships with [sabre/vobject 3.5.3][vobj],
+ [sabre/http 3.0.5][http], and [sabre/event 2.0.2][evnt].
2.1.10 (2016-03-10)
@@ -475,6 +509,8 @@ ChangeLog
* #784: Sync logs for address books were not correctly cleaned up after
deleting them.
+* The zip release ships with [sabre/vobject 3.5.0][vobj],
+ [sabre/http 3.0.5][http], and [sabre/event 2.0.2][evnt].
2.1.9 (2016-01-25)
@@ -627,7 +663,7 @@ ChangeLog
* Added: Automatically converting between vCard 3, 4 and jCard using the
`Accept:` header, in CardDAV reports, and automatically converting from
jCard to vCard upon `PUT`. It's important to note that your backends _may_
- now recieve both vCard 3.0 and 4.0.
+ now receive both vCard 3.0 and 4.0.
* Added: #444. Collections can now opt-in to support high-speed `MOVE`.
* Changed: PropertyStorage backends now have a `move` method.
* Added: `beforeMove`, and `afterMove` events.
@@ -812,7 +848,7 @@ ChangeLog
* Added: Support for the `{DAV:}supported-method-set` property server-wide.
* Making it easier for implementors to override how the CardDAV addressbook
home is located.
-* Fixed: Issue #422 Preconditions were not being set on PUT on non-existant
+* Fixed: Issue #422 Preconditions were not being set on PUT on non-existent
files. Not really a chance for data-loss, but incorrect nevertheless.
* Fixed: Issue #428: Etag check with `If:` fails if the target is a collection.
* Fixed: Issues #430, #431, #433: Locks plugin didn't not properly release
@@ -1024,7 +1060,7 @@ ChangeLog
* 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.
+ greater flexibility.
1.7.13 (2014-07-28)
@@ -1042,7 +1078,7 @@ ChangeLog
Sabre_DAV_PartialUpdate_IFile interface is now deprecated and will be removed
in a future version.
* Fixed: Restoring old setting after changing libxml_disable_entity_loader.
-* Fixed: Issue #422: Preconditions were not being set on PUT on non-existant
+* Fixed: Issue #422: Preconditions were not being set on PUT on non-existent
files. Not really a chance for data-loss, but incorrect nevertheless.
* Fixed: Issue #427: Now checking preconditions on DELETE requests.
* Fixed: Issue #428: Etag check with If: fails if the target is a collection.
@@ -1121,7 +1157,7 @@ ChangeLog
------------------
* The zip release ships with sabre/vobject 2.0.5.
-* Changed: To be compatibile with MS Office 2011 for Mac, a workaround was
+* Changed: To be compatible 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.
@@ -1129,7 +1165,7 @@ ChangeLog
* 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.
+ to improve compatibility 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
@@ -2006,7 +2042,7 @@ ChangeLog
-------------------
* Fixed: Issue 34: Invalid Lock-Token header response.
-* Added: Issue 35: Addign SabreDAV version to HTTP OPTIONS responses.
+* Added: Issue 35: Adding SabreDAV version to HTTP OPTIONS responses.
1.0.9 (2010-03-19)
@@ -2220,7 +2256,7 @@ ChangeLog
* 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
+* Added: Sabre_DAV_Tree_Aggregate, 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.
@@ -2237,7 +2273,7 @@ ChangeLog
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: Some methods didn't get passed through in the FilterTree (r283).
* Fixed: LockManager is now slightly more complex, Tree classes slightly less.
(r287)
diff --git a/vendor/sabre/dav/README.md b/vendor/sabre/dav/README.md
index 8edcd4073..86a0fe9a6 100644
--- a/vendor/sabre/dav/README.md
+++ b/vendor/sabre/dav/README.md
@@ -10,6 +10,7 @@ Full documentation can be found on the website:
http://sabre.io/
+
Build status
------------
@@ -30,6 +31,7 @@ Documentation
* [Introduction](http://sabre.io/dav/).
* [Installation](http://sabre.io/dav/install/).
+
Made at fruux
-------------
diff --git a/vendor/sabre/dav/bin/build.php b/vendor/sabre/dav/bin/build.php
index c4ba20941..c4ba20941 100644..100755
--- a/vendor/sabre/dav/bin/build.php
+++ b/vendor/sabre/dav/bin/build.php
diff --git a/vendor/sabre/dav/bin/googlecode_upload.py b/vendor/sabre/dav/bin/googlecode_upload.py
index caafd5ded..caafd5ded 100644..100755
--- a/vendor/sabre/dav/bin/googlecode_upload.py
+++ b/vendor/sabre/dav/bin/googlecode_upload.py
diff --git a/vendor/sabre/dav/bin/migrateto20.php b/vendor/sabre/dav/bin/migrateto20.php
index 77236804f..77236804f 100644..100755
--- a/vendor/sabre/dav/bin/migrateto20.php
+++ b/vendor/sabre/dav/bin/migrateto20.php
diff --git a/vendor/sabre/dav/bin/migrateto21.php b/vendor/sabre/dav/bin/migrateto21.php
index c81ee5cca..c81ee5cca 100644..100755
--- a/vendor/sabre/dav/bin/migrateto21.php
+++ b/vendor/sabre/dav/bin/migrateto21.php
diff --git a/vendor/sabre/dav/bin/migrateto30.php b/vendor/sabre/dav/bin/migrateto30.php
index 9ca77c13c..9ca77c13c 100644..100755
--- a/vendor/sabre/dav/bin/migrateto30.php
+++ b/vendor/sabre/dav/bin/migrateto30.php
diff --git a/vendor/sabre/dav/bin/migrateto32.php b/vendor/sabre/dav/bin/migrateto32.php
index 7567aeb60..7567aeb60 100644..100755
--- a/vendor/sabre/dav/bin/migrateto32.php
+++ b/vendor/sabre/dav/bin/migrateto32.php
diff --git a/vendor/sabre/dav/bin/sabredav.php b/vendor/sabre/dav/bin/sabredav.php
index 950075d1a..950075d1a 100644..100755
--- a/vendor/sabre/dav/bin/sabredav.php
+++ b/vendor/sabre/dav/bin/sabredav.php
diff --git a/vendor/sabre/dav/composer.json b/vendor/sabre/dav/composer.json
index f85d9655e..fca0e07fb 100644
--- a/vendor/sabre/dav/composer.json
+++ b/vendor/sabre/dav/composer.json
@@ -32,9 +32,9 @@
"psr/log": "^1.0"
},
"require-dev" : {
- "phpunit/phpunit" : "> 4.8, <=6.0.0",
+ "phpunit/phpunit" : "> 4.8, <6.0.0",
"evert/phpdoc-md" : "~0.1.0",
- "sabre/cs" : "~0.0.5",
+ "sabre/cs" : "^1.0.0",
"monolog/monolog": "^1.18"
},
"suggest" : {
diff --git a/vendor/sabre/dav/lib/CalDAV/Backend/AbstractBackend.php b/vendor/sabre/dav/lib/CalDAV/Backend/AbstractBackend.php
index d58b4a46e..311b1c415 100644
--- a/vendor/sabre/dav/lib/CalDAV/Backend/AbstractBackend.php
+++ b/vendor/sabre/dav/lib/CalDAV/Backend/AbstractBackend.php
@@ -2,8 +2,8 @@
namespace Sabre\CalDAV\Backend;
-use Sabre\VObject;
use Sabre\CalDAV;
+use Sabre\VObject;
/**
* Abstract Calendaring backend. Extend this class to create your own backends.
@@ -26,9 +26,9 @@ abstract class AbstractBackend implements BackendInterface {
* Calling the handle method is like telling the PropPatch object "I
* promise I can handle updating this property".
*
- * Read the PropPatch documenation for more info and examples.
+ * Read the PropPatch documentation for more info and examples.
*
- * @param string $path
+ * @param mixed $calendarId
* @param \Sabre\DAV\PropPatch $propPatch
* @return void
*/
diff --git a/vendor/sabre/dav/lib/CalDAV/Backend/NotificationSupport.php b/vendor/sabre/dav/lib/CalDAV/Backend/NotificationSupport.php
index 9c00a89ef..bf2ef27a0 100644
--- a/vendor/sabre/dav/lib/CalDAV/Backend/NotificationSupport.php
+++ b/vendor/sabre/dav/lib/CalDAV/Backend/NotificationSupport.php
@@ -49,8 +49,8 @@ interface NotificationSupport extends BackendInterface {
* 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 $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
diff --git a/vendor/sabre/dav/lib/CalDAV/Backend/PDO.php b/vendor/sabre/dav/lib/CalDAV/Backend/PDO.php
index 95f1d49a6..458440588 100644
--- a/vendor/sabre/dav/lib/CalDAV/Backend/PDO.php
+++ b/vendor/sabre/dav/lib/CalDAV/Backend/PDO.php
@@ -5,8 +5,8 @@ namespace Sabre\CalDAV\Backend;
use Sabre\CalDAV;
use Sabre\DAV;
use Sabre\DAV\Exception\Forbidden;
-use Sabre\VObject;
use Sabre\DAV\Xml\Element\Sharee;
+use Sabre\VObject;
/**
* PDO CalDAV backend
@@ -296,7 +296,7 @@ SQL
* Calling the handle method is like telling the PropPatch object "I
* promise I can handle updating this property".
*
- * Read the PropPatch documenation for more info and examples.
+ * Read the PropPatch documentation for more info and examples.
*
* @param mixed $calendarId
* @param \Sabre\DAV\PropPatch $propPatch
@@ -481,13 +481,13 @@ SQL
if (!$row) return null;
return [
- 'id' => $row['id'],
- 'uri' => $row['uri'],
- 'lastmodified' => (int)$row['lastmodified'],
- 'etag' => '"' . $row['etag'] . '"',
- 'size' => (int)$row['size'],
- 'calendardata' => $row['calendardata'],
- 'component' => strtolower($row['componenttype']),
+ 'id' => $row['id'],
+ 'uri' => $row['uri'],
+ 'lastmodified' => (int)$row['lastmodified'],
+ 'etag' => '"' . $row['etag'] . '"',
+ 'size' => (int)$row['size'],
+ 'calendardata' => $row['calendardata'],
+ 'component' => strtolower($row['componenttype']),
];
}
@@ -511,27 +511,29 @@ SQL
}
list($calendarId, $instanceId) = $calendarId;
- $query = 'SELECT id, uri, lastmodified, etag, calendarid, size, calendardata, componenttype FROM ' . $this->calendarObjectTableName . ' WHERE calendarid = ? AND uri IN (';
- // Inserting a whole bunch of question marks
- $query .= implode(',', array_fill(0, count($uris), '?'));
- $query .= ')';
+ $result = [];
+ foreach (array_chunk($uris, 900) as $chunk) {
+ $query = 'SELECT id, uri, lastmodified, etag, calendarid, size, calendardata, componenttype FROM ' . $this->calendarObjectTableName . ' WHERE calendarid = ? AND uri IN (';
+ // Inserting a whole bunch of question marks
+ $query .= implode(',', array_fill(0, count($chunk), '?'));
+ $query .= ')';
- $stmt = $this->pdo->prepare($query);
- $stmt->execute(array_merge([$calendarId], $uris));
+ $stmt = $this->pdo->prepare($query);
+ $stmt->execute(array_merge([$calendarId], $chunk));
- $result = [];
- while ($row = $stmt->fetch(\PDO::FETCH_ASSOC)) {
+ while ($row = $stmt->fetch(\PDO::FETCH_ASSOC)) {
- $result[] = [
- 'id' => $row['id'],
- 'uri' => $row['uri'],
- 'lastmodified' => (int)$row['lastmodified'],
- 'etag' => '"' . $row['etag'] . '"',
- 'size' => (int)$row['size'],
- 'calendardata' => $row['calendardata'],
- 'component' => strtolower($row['componenttype']),
- ];
+ $result[] = [
+ 'id' => $row['id'],
+ 'uri' => $row['uri'],
+ 'lastmodified' => (int)$row['lastmodified'],
+ 'etag' => '"' . $row['etag'] . '"',
+ 'size' => (int)$row['size'],
+ 'calendardata' => $row['calendardata'],
+ 'component' => strtolower($row['componenttype']),
+ ];
+ }
}
return $result;
@@ -686,7 +688,7 @@ SQL
}
}
-
+
// Ensure Occurence values are positive
if ($firstOccurence < 0) $firstOccurence = 0;
if ($lastOccurence < 0) $lastOccurence = 0;
@@ -769,7 +771,7 @@ SQL
* 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
+ * A good example of how to interpret 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.
@@ -969,7 +971,7 @@ SQL;
// Current synctoken
$stmt = $this->pdo->prepare('SELECT synctoken FROM ' . $this->calendarTableName . ' WHERE id = ?');
- $stmt->execute([ $calendarId ]);
+ $stmt->execute([$calendarId]);
$currentToken = $stmt->fetchColumn(0);
if (is_null($currentToken)) return null;
@@ -1181,7 +1183,7 @@ SQL;
* Calling the handle method is like telling the PropPatch object "I
* promise I can handle updating this property".
*
- * Read the PropPatch documenation for more info and examples.
+ * Read the PropPatch documentation for more info and examples.
*
* @param mixed $subscriptionId
* @param \Sabre\DAV\PropPatch $propPatch
@@ -1327,7 +1329,7 @@ SQL;
function createSchedulingObject($principalUri, $objectUri, $objectData) {
$stmt = $this->pdo->prepare('INSERT INTO ' . $this->schedulingObjectTableName . ' (principaluri, calendardata, uri, lastmodified, etag, size) VALUES (?, ?, ?, ?, ?, ?)');
- $stmt->execute([$principalUri, $objectData, $objectUri, time(), md5($objectData), strlen($objectData) ]);
+ $stmt->execute([$principalUri, $objectData, $objectUri, time(), md5($objectData), strlen($objectData)]);
}
@@ -1483,7 +1485,7 @@ SQL;
'inviteStatus' => (int)$row['share_invitestatus'],
'properties' =>
!empty($row['share_displayname'])
- ? [ '{DAV:}displayname' => $row['share_displayname'] ]
+ ? ['{DAV:}displayname' => $row['share_displayname']]
: [],
'principal' => $row['principaluri'],
]);
@@ -1502,7 +1504,7 @@ SQL;
*/
function setPublishStatus($calendarId, $value) {
- throw new \Sabre\DAV\Exception\NotImplemented('Not implemented');
+ throw new DAV\Exception\NotImplemented('Not implemented');
}
diff --git a/vendor/sabre/dav/lib/CalDAV/Backend/SharingSupport.php b/vendor/sabre/dav/lib/CalDAV/Backend/SharingSupport.php
index 8b6e074e0..278ec2564 100644
--- a/vendor/sabre/dav/lib/CalDAV/Backend/SharingSupport.php
+++ b/vendor/sabre/dav/lib/CalDAV/Backend/SharingSupport.php
@@ -11,9 +11,9 @@ namespace Sabre\CalDAV\Backend;
* 1. Return shared calendars for users.
* 2. For every calendar, return calendar-resource-uri. This strings is a URI or
* relative URI reference that must be unique for every calendar, but
- * identical for every instance of the same shared calenar.
- * 3. For every calenar, you must return a share-access element. This element
- * should contain one of the Sabre\DAV\Sharing\Plugin:ACCESS_* contants and
+ * identical for every instance of the same shared calendar.
+ * 3. For every calendar, you must return a share-access element. This element
+ * should contain one of the Sabre\DAV\Sharing\Plugin:ACCESS_* constants and
* indicates the access level the user has.
*
* @copyright Copyright (C) fruux GmbH (https://fruux.com/)
diff --git a/vendor/sabre/dav/lib/CalDAV/Backend/SimplePDO.php b/vendor/sabre/dav/lib/CalDAV/Backend/SimplePDO.php
index f8238ea9a..d21f7f916 100644
--- a/vendor/sabre/dav/lib/CalDAV/Backend/SimplePDO.php
+++ b/vendor/sabre/dav/lib/CalDAV/Backend/SimplePDO.php
@@ -8,7 +8,7 @@ use Sabre\DAV;
/**
* Simple PDO CalDAV backend.
*
- * This class is basically the most minmum example to get a caldav backend up
+ * This class is basically the most minimum example to get a caldav backend up
* and running. This class uses the following schema (MySQL example):
*
* CREATE TABLE simple_calendars (
@@ -209,12 +209,12 @@ class SimplePDO extends AbstractBackend {
if (!$row) return null;
return [
- 'id' => $row['id'],
- 'uri' => $row['uri'],
- 'etag' => '"' . md5($row['calendardata']) . '"',
- 'calendarid' => $calendarId,
- 'size' => strlen($row['calendardata']),
- 'calendardata' => $row['calendardata'],
+ 'id' => $row['id'],
+ 'uri' => $row['uri'],
+ 'etag' => '"' . md5($row['calendardata']) . '"',
+ 'calendarid' => $calendarId,
+ 'size' => strlen($row['calendardata']),
+ 'calendardata' => $row['calendardata'],
];
}
diff --git a/vendor/sabre/dav/lib/CalDAV/Backend/SubscriptionSupport.php b/vendor/sabre/dav/lib/CalDAV/Backend/SubscriptionSupport.php
index a39289f5e..d77a2fe0f 100644
--- a/vendor/sabre/dav/lib/CalDAV/Backend/SubscriptionSupport.php
+++ b/vendor/sabre/dav/lib/CalDAV/Backend/SubscriptionSupport.php
@@ -70,7 +70,7 @@ interface SubscriptionSupport extends BackendInterface {
* Calling the handle method is like telling the PropPatch object "I
* promise I can handle updating this property".
*
- * Read the PropPatch documenation for more info and examples.
+ * Read the PropPatch documentation for more info and examples.
*
* @param mixed $subscriptionId
* @param \Sabre\DAV\PropPatch $propPatch
diff --git a/vendor/sabre/dav/lib/CalDAV/Calendar.php b/vendor/sabre/dav/lib/CalDAV/Calendar.php
index 90ace0d21..7467900cc 100644
--- a/vendor/sabre/dav/lib/CalDAV/Calendar.php
+++ b/vendor/sabre/dav/lib/CalDAV/Calendar.php
@@ -3,8 +3,8 @@
namespace Sabre\CalDAV;
use Sabre\DAV;
-use Sabre\DAVACL;
use Sabre\DAV\PropPatch;
+use Sabre\DAVACL;
/**
* This object represents a CalDAV calendar.
diff --git a/vendor/sabre/dav/lib/CalDAV/CalendarHome.php b/vendor/sabre/dav/lib/CalDAV/CalendarHome.php
index 0a4bfb68f..ffd7f72fb 100644
--- a/vendor/sabre/dav/lib/CalDAV/CalendarHome.php
+++ b/vendor/sabre/dav/lib/CalDAV/CalendarHome.php
@@ -27,7 +27,7 @@ class CalendarHome implements DAV\IExtendedCollection, DAVACL\IACL {
/**
* CalDAV backend
*
- * @var Sabre\CalDAV\Backend\BackendInterface
+ * @var Backend\BackendInterface
*/
protected $caldavBackend;
@@ -42,7 +42,7 @@ class CalendarHome implements DAV\IExtendedCollection, DAVACL\IACL {
* Constructor
*
* @param Backend\BackendInterface $caldavBackend
- * @param mixed $userUri
+ * @param array $principalInfo
*/
function __construct(Backend\BackendInterface $caldavBackend, $principalInfo) {
@@ -334,8 +334,8 @@ class CalendarHome implements DAV\IExtendedCollection, DAVACL\IACL {
* 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 $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
diff --git a/vendor/sabre/dav/lib/CalDAV/CalendarObject.php b/vendor/sabre/dav/lib/CalDAV/CalendarObject.php
index 001b35112..9d6532a35 100644
--- a/vendor/sabre/dav/lib/CalDAV/CalendarObject.php
+++ b/vendor/sabre/dav/lib/CalDAV/CalendarObject.php
@@ -16,7 +16,7 @@ class CalendarObject extends \Sabre\DAV\File implements ICalendarObject, \Sabre\
/**
* Sabre\CalDAV\Backend\BackendInterface
*
- * @var Sabre\CalDAV\Backend\AbstractBackend
+ * @var Backend\AbstractBackend
*/
protected $caldavBackend;
diff --git a/vendor/sabre/dav/lib/CalDAV/CalendarQueryValidator.php b/vendor/sabre/dav/lib/CalDAV/CalendarQueryValidator.php
index f3c7524d2..df8008fe2 100644
--- a/vendor/sabre/dav/lib/CalDAV/CalendarQueryValidator.php
+++ b/vendor/sabre/dav/lib/CalDAV/CalendarQueryValidator.php
@@ -2,8 +2,8 @@
namespace Sabre\CalDAV;
-use Sabre\VObject;
use DateTime;
+use Sabre\VObject;
/**
* CalendarQuery Validator
@@ -25,7 +25,7 @@ class CalendarQueryValidator {
*
* The list of filters must be formatted as parsed by \Sabre\CalDAV\CalendarQueryParser
*
- * @param VObject\Component $vObject
+ * @param VObject\Component\VCalendar $vObject
* @param array $filters
* @return bool
*/
diff --git a/vendor/sabre/dav/lib/CalDAV/CalendarRoot.php b/vendor/sabre/dav/lib/CalDAV/CalendarRoot.php
index 0ac50e41d..1d6b2ac9f 100644
--- a/vendor/sabre/dav/lib/CalDAV/CalendarRoot.php
+++ b/vendor/sabre/dav/lib/CalDAV/CalendarRoot.php
@@ -22,7 +22,7 @@ class CalendarRoot extends \Sabre\DAVACL\AbstractPrincipalCollection {
/**
* CalDAV backend
*
- * @var Sabre\CalDAV\Backend\BackendInterface
+ * @var Backend\BackendInterface
*/
protected $caldavBackend;
diff --git a/vendor/sabre/dav/lib/CalDAV/Exception/InvalidComponentType.php b/vendor/sabre/dav/lib/CalDAV/Exception/InvalidComponentType.php
index 5ce8a93f5..7aff2edab 100644
--- a/vendor/sabre/dav/lib/CalDAV/Exception/InvalidComponentType.php
+++ b/vendor/sabre/dav/lib/CalDAV/Exception/InvalidComponentType.php
@@ -2,8 +2,8 @@
namespace Sabre\CalDAV\Exception;
-use Sabre\DAV;
use Sabre\CalDAV;
+use Sabre\DAV;
/**
* InvalidComponentType
diff --git a/vendor/sabre/dav/lib/CalDAV/ICSExportPlugin.php b/vendor/sabre/dav/lib/CalDAV/ICSExportPlugin.php
index a3a824c71..fc8b971f3 100644
--- a/vendor/sabre/dav/lib/CalDAV/ICSExportPlugin.php
+++ b/vendor/sabre/dav/lib/CalDAV/ICSExportPlugin.php
@@ -2,13 +2,13 @@
namespace Sabre\CalDAV;
+use DateTime;
use DateTimeZone;
use Sabre\DAV;
-use Sabre\VObject;
+use Sabre\DAV\Exception\BadRequest;
use Sabre\HTTP\RequestInterface;
use Sabre\HTTP\ResponseInterface;
-use Sabre\DAV\Exception\BadRequest;
-use DateTime;
+use Sabre\VObject;
/**
* ICS Exporter
diff --git a/vendor/sabre/dav/lib/CalDAV/Notifications/Collection.php b/vendor/sabre/dav/lib/CalDAV/Notifications/Collection.php
index 5fda61dfa..557832a5a 100644
--- a/vendor/sabre/dav/lib/CalDAV/Notifications/Collection.php
+++ b/vendor/sabre/dav/lib/CalDAV/Notifications/Collection.php
@@ -2,8 +2,8 @@
namespace Sabre\CalDAV\Notifications;
-use Sabre\DAV;
use Sabre\CalDAV;
+use Sabre\DAV;
use Sabre\DAVACL;
/**
@@ -27,7 +27,7 @@ class Collection extends DAV\Collection implements ICollection, DAVACL\IACL {
/**
* The notification backend
*
- * @var Sabre\CalDAV\Backend\NotificationSupport
+ * @var CalDAV\Backend\NotificationSupport
*/
protected $caldavBackend;
diff --git a/vendor/sabre/dav/lib/CalDAV/Notifications/INode.php b/vendor/sabre/dav/lib/CalDAV/Notifications/INode.php
index f9986b714..783b92be9 100644
--- a/vendor/sabre/dav/lib/CalDAV/Notifications/INode.php
+++ b/vendor/sabre/dav/lib/CalDAV/Notifications/INode.php
@@ -2,6 +2,8 @@
namespace Sabre\CalDAV\Notifications;
+use Sabre\CalDAV\Xml\Notification\NotificationInterface;
+
/**
* This node represents a single notification.
*
@@ -20,16 +22,16 @@ interface INode {
/**
* This method must return an xml element, using the
- * Sabre\CalDAV\Notifications\INotificationType classes.
+ * Sabre\CalDAV\Xml\Notification\NotificationInterface classes.
*
- * @return INotificationType
+ * @return NotificationInterface
*/
function getNotificationType();
/**
* Returns the etag for the notification.
*
- * The etag must be surrounded by litteral double-quotes.
+ * The etag must be surrounded by literal double-quotes.
*
* @return string
*/
diff --git a/vendor/sabre/dav/lib/CalDAV/Notifications/Node.php b/vendor/sabre/dav/lib/CalDAV/Notifications/Node.php
index 11df0c94b..ad7ddf8f5 100644
--- a/vendor/sabre/dav/lib/CalDAV/Notifications/Node.php
+++ b/vendor/sabre/dav/lib/CalDAV/Notifications/Node.php
@@ -2,9 +2,9 @@
namespace Sabre\CalDAV\Notifications;
-use Sabre\DAV;
use Sabre\CalDAV;
use Sabre\CalDAV\Xml\Notification\NotificationInterface;
+use Sabre\DAV;
use Sabre\DAVACL;
/**
@@ -25,14 +25,14 @@ class Node extends DAV\File implements INode, DAVACL\IACL {
/**
* The notification backend
*
- * @var Sabre\CalDAV\Backend\NotificationSupport
+ * @var CalDAV\Backend\NotificationSupport
*/
protected $caldavBackend;
/**
* The actual notification
*
- * @var Sabre\CalDAV\Notifications\INotificationType
+ * @var NotificationInterface
*/
protected $notification;
@@ -61,7 +61,7 @@ class Node extends DAV\File implements INode, DAVACL\IACL {
/**
* Returns the path name for this notification
*
- * @return id
+ * @return string
*/
function getName() {
@@ -84,9 +84,9 @@ class Node extends DAV\File implements INode, DAVACL\IACL {
/**
* This method must return an xml element, using the
- * Sabre\CalDAV\Notifications\INotificationType classes.
+ * Sabre\CalDAV\Xml\Notification\NotificationInterface classes.
*
- * @return INotificationType
+ * @return NotificationInterface
*/
function getNotificationType() {
diff --git a/vendor/sabre/dav/lib/CalDAV/Notifications/Plugin.php b/vendor/sabre/dav/lib/CalDAV/Notifications/Plugin.php
index 546bf927f..e742351f5 100644
--- a/vendor/sabre/dav/lib/CalDAV/Notifications/Plugin.php
+++ b/vendor/sabre/dav/lib/CalDAV/Notifications/Plugin.php
@@ -3,10 +3,10 @@
namespace Sabre\CalDAV\Notifications;
use Sabre\DAV;
-use Sabre\DAV\PropFind;
use Sabre\DAV\INode as BaseINode;
-use Sabre\DAV\ServerPlugin;
+use Sabre\DAV\PropFind;
use Sabre\DAV\Server;
+use Sabre\DAV\ServerPlugin;
use Sabre\DAVACL;
use Sabre\HTTP\RequestInterface;
use Sabre\HTTP\ResponseInterface;
diff --git a/vendor/sabre/dav/lib/CalDAV/Plugin.php b/vendor/sabre/dav/lib/CalDAV/Plugin.php
index 71ba75206..def11d52d 100644
--- a/vendor/sabre/dav/lib/CalDAV/Plugin.php
+++ b/vendor/sabre/dav/lib/CalDAV/Plugin.php
@@ -9,11 +9,11 @@ use Sabre\DAV\INode;
use Sabre\DAV\MkCol;
use Sabre\DAV\Xml\Property\LocalHref;
use Sabre\DAVACL;
-use Sabre\VObject;
use Sabre\HTTP;
-use Sabre\Uri;
use Sabre\HTTP\RequestInterface;
use Sabre\HTTP\ResponseInterface;
+use Sabre\Uri;
+use Sabre\VObject;
/**
* CalDAV plugin
@@ -302,8 +302,8 @@ class Plugin extends DAV\ServerPlugin {
$this->server->createCollection($path, new MkCol($resourceType, $properties));
- $this->server->httpResponse->setStatus(201);
- $this->server->httpResponse->setHeader('Content-Length', 0);
+ $response->setStatus(201);
+ $response->setHeader('Content-Length', 0);
// This breaks the method chain.
return false;
@@ -926,7 +926,7 @@ class Plugin extends DAV\ServerPlugin {
);
}
- // We use an extra variable to allow event handles to tell us wether
+ // We use an extra variable to allow event handles to tell us whether
// the object was modified or not.
//
// This helps us determine if we need to re-serialize the object.
diff --git a/vendor/sabre/dav/lib/CalDAV/Principal/ProxyRead.php b/vendor/sabre/dav/lib/CalDAV/Principal/ProxyRead.php
index 93f0fe095..e3881831e 100644
--- a/vendor/sabre/dav/lib/CalDAV/Principal/ProxyRead.php
+++ b/vendor/sabre/dav/lib/CalDAV/Principal/ProxyRead.php
@@ -2,8 +2,8 @@
namespace Sabre\CalDAV\Principal;
-use Sabre\DAVACL;
use Sabre\DAV;
+use Sabre\DAVACL;
/**
* ProxyRead principal
@@ -84,8 +84,8 @@ class ProxyRead implements IProxyRead {
/**
* Renames the node
*
- * @throws DAV\Exception\Forbidden
* @param string $name The new name
+ * @throws DAV\Exception\Forbidden
* @return void
*/
function setName($name) {
diff --git a/vendor/sabre/dav/lib/CalDAV/Principal/ProxyWrite.php b/vendor/sabre/dav/lib/CalDAV/Principal/ProxyWrite.php
index 8124c05e0..43dd9bf07 100644
--- a/vendor/sabre/dav/lib/CalDAV/Principal/ProxyWrite.php
+++ b/vendor/sabre/dav/lib/CalDAV/Principal/ProxyWrite.php
@@ -2,8 +2,8 @@
namespace Sabre\CalDAV\Principal;
-use Sabre\DAVACL;
use Sabre\DAV;
+use Sabre\DAVACL;
/**
* ProxyWrite principal
@@ -84,8 +84,8 @@ class ProxyWrite implements IProxyWrite {
/**
* Renames the node
*
- * @throws DAV\Exception\Forbidden
* @param string $name The new name
+ * @throws DAV\Exception\Forbidden
* @return void
*/
function setName($name) {
diff --git a/vendor/sabre/dav/lib/CalDAV/Schedule/IMipPlugin.php b/vendor/sabre/dav/lib/CalDAV/Schedule/IMipPlugin.php
index ffb1fe45b..6f5acb29a 100644
--- a/vendor/sabre/dav/lib/CalDAV/Schedule/IMipPlugin.php
+++ b/vendor/sabre/dav/lib/CalDAV/Schedule/IMipPlugin.php
@@ -181,7 +181,7 @@ class IMipPlugin extends DAV\ServerPlugin {
return [
'name' => $this->getPluginName(),
- 'description' => 'Email delivery (rfc6037) for CalDAV scheduling',
+ 'description' => 'Email delivery (rfc6047) for CalDAV scheduling',
'link' => 'http://sabre.io/dav/scheduling/',
];
diff --git a/vendor/sabre/dav/lib/CalDAV/Schedule/Inbox.php b/vendor/sabre/dav/lib/CalDAV/Schedule/Inbox.php
index 6b374ea3f..81b017307 100644
--- a/vendor/sabre/dav/lib/CalDAV/Schedule/Inbox.php
+++ b/vendor/sabre/dav/lib/CalDAV/Schedule/Inbox.php
@@ -2,10 +2,10 @@
namespace Sabre\CalDAV\Schedule;
-use Sabre\DAV;
use Sabre\CalDAV;
-use Sabre\DAVACL;
use Sabre\CalDAV\Backend;
+use Sabre\DAV;
+use Sabre\DAVACL;
use Sabre\VObject;
/**
@@ -83,7 +83,7 @@ class Inbox extends DAV\Collection implements IInbox {
* 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
+ * 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
diff --git a/vendor/sabre/dav/lib/CalDAV/Schedule/Outbox.php b/vendor/sabre/dav/lib/CalDAV/Schedule/Outbox.php
index 29eefa744..888ea3086 100644
--- a/vendor/sabre/dav/lib/CalDAV/Schedule/Outbox.php
+++ b/vendor/sabre/dav/lib/CalDAV/Schedule/Outbox.php
@@ -2,8 +2,8 @@
namespace Sabre\CalDAV\Schedule;
-use Sabre\DAV;
use Sabre\CalDAV;
+use Sabre\DAV;
use Sabre\DAVACL;
/**
diff --git a/vendor/sabre/dav/lib/CalDAV/Schedule/Plugin.php b/vendor/sabre/dav/lib/CalDAV/Schedule/Plugin.php
index 47511140f..0b991e619 100644
--- a/vendor/sabre/dav/lib/CalDAV/Schedule/Plugin.php
+++ b/vendor/sabre/dav/lib/CalDAV/Schedule/Plugin.php
@@ -3,29 +3,28 @@
namespace Sabre\CalDAV\Schedule;
use DateTimeZone;
+use Sabre\CalDAV\ICalendar;
+use Sabre\CalDAV\ICalendarObject;
+use Sabre\CalDAV\Xml\Property\ScheduleCalendarTransp;
+use Sabre\DAV\Exception\BadRequest;
+use Sabre\DAV\Exception\Forbidden;
+use Sabre\DAV\Exception\NotFound;
+use Sabre\DAV\Exception\NotImplemented;
+use Sabre\DAV\INode;
+use Sabre\DAV\PropFind;
+use Sabre\DAV\PropPatch;
use Sabre\DAV\Server;
use Sabre\DAV\ServerPlugin;
use Sabre\DAV\Sharing;
-use Sabre\DAV\PropFind;
-use Sabre\DAV\PropPatch;
-use Sabre\DAV\INode;
-use Sabre\DAV\Xml\Property\Href;
use Sabre\DAV\Xml\Property\LocalHref;
+use Sabre\DAVACL;
use Sabre\HTTP\RequestInterface;
use Sabre\HTTP\ResponseInterface;
use Sabre\VObject;
-use Sabre\VObject\Reader;
use Sabre\VObject\Component\VCalendar;
use Sabre\VObject\ITip;
use Sabre\VObject\ITip\Message;
-use Sabre\DAVACL;
-use Sabre\CalDAV\ICalendar;
-use Sabre\CalDAV\ICalendarObject;
-use Sabre\CalDAV\Xml\Property\ScheduleCalendarTransp;
-use Sabre\DAV\Exception\NotFound;
-use Sabre\DAV\Exception\Forbidden;
-use Sabre\DAV\Exception\BadRequest;
-use Sabre\DAV\Exception\NotImplemented;
+use Sabre\VObject\Reader;
/**
* CalDAV scheduling plugin.
@@ -377,7 +376,7 @@ class Plugin extends ServerPlugin {
/**
* This method is responsible for delivering the ITip message.
*
- * @param ITip\Message $itipMessage
+ * @param ITip\Message $iTipMessage
* @return void
*/
function deliver(ITip\Message $iTipMessage) {
@@ -890,8 +889,8 @@ class Plugin extends ServerPlugin {
* * 3.7;description
*
* @param string $email address
- * @param DateTimeInterface $start
- * @param DateTimeInterface $end
+ * @param \DateTimeInterface $start
+ * @param \DateTimeInterface $end
* @param VObject\Component $request
* @return array
*/
@@ -1059,7 +1058,7 @@ class Plugin extends ServerPlugin {
return [
'name' => $this->getPluginName(),
- 'description' => 'Adds calendar-auto-schedule, as defined in rf6868',
+ 'description' => 'Adds calendar-auto-schedule, as defined in rfc6638',
'link' => 'http://sabre.io/dav/scheduling/',
];
diff --git a/vendor/sabre/dav/lib/CalDAV/Schedule/SchedulingObject.php b/vendor/sabre/dav/lib/CalDAV/Schedule/SchedulingObject.php
index 6d9d3d5ec..0cd05a965 100644
--- a/vendor/sabre/dav/lib/CalDAV/Schedule/SchedulingObject.php
+++ b/vendor/sabre/dav/lib/CalDAV/Schedule/SchedulingObject.php
@@ -42,7 +42,7 @@ class SchedulingObject extends \Sabre\CalDAV\CalendarObject implements IScheduli
* * lastmodified - (optional) format as a unix timestamp.
* * acl - (optional) Use this to override the default ACL for the node.
*
- * @param Backend\BackendInterface $caldavBackend
+ * @param Backend\SchedulingSupport $caldavBackend
* @param array $objectData
*/
function __construct(Backend\SchedulingSupport $caldavBackend, array $objectData) {
diff --git a/vendor/sabre/dav/lib/CalDAV/SharingPlugin.php b/vendor/sabre/dav/lib/CalDAV/SharingPlugin.php
index 6f7df02bc..5cce79678 100644
--- a/vendor/sabre/dav/lib/CalDAV/SharingPlugin.php
+++ b/vendor/sabre/dav/lib/CalDAV/SharingPlugin.php
@@ -3,7 +3,6 @@
namespace Sabre\CalDAV;
use Sabre\DAV;
-use Sabre\DAV\Xml\Property\Href;
use Sabre\DAV\Xml\Property\LocalHref;
use Sabre\HTTP\RequestInterface;
use Sabre\HTTP\ResponseInterface;
@@ -29,7 +28,7 @@ class SharingPlugin extends DAV\ServerPlugin {
/**
* Reference to SabreDAV server object.
*
- * @var Sabre\DAV\Server
+ * @var DAV\Server
*/
protected $server;
diff --git a/vendor/sabre/dav/lib/CalDAV/Subscriptions/Plugin.php b/vendor/sabre/dav/lib/CalDAV/Subscriptions/Plugin.php
index 7abbfb1f9..877d96c6c 100644
--- a/vendor/sabre/dav/lib/CalDAV/Subscriptions/Plugin.php
+++ b/vendor/sabre/dav/lib/CalDAV/Subscriptions/Plugin.php
@@ -4,8 +4,8 @@ namespace Sabre\CalDAV\Subscriptions;
use Sabre\DAV\INode;
use Sabre\DAV\PropFind;
-use Sabre\DAV\ServerPlugin;
use Sabre\DAV\Server;
+use Sabre\DAV\ServerPlugin;
/**
* This plugin adds calendar-subscription support to your CalDAV server.
diff --git a/vendor/sabre/dav/lib/CalDAV/Subscriptions/Subscription.php b/vendor/sabre/dav/lib/CalDAV/Subscriptions/Subscription.php
index 3bb3451f3..6a1851ed8 100644
--- a/vendor/sabre/dav/lib/CalDAV/Subscriptions/Subscription.php
+++ b/vendor/sabre/dav/lib/CalDAV/Subscriptions/Subscription.php
@@ -2,12 +2,12 @@
namespace Sabre\CalDAV\Subscriptions;
+use Sabre\CalDAV\Backend\SubscriptionSupport;
use Sabre\DAV\Collection;
-use Sabre\DAV\Xml\Property\Href;
use Sabre\DAV\PropPatch;
-use Sabre\DAVACL\IACL;
+use Sabre\DAV\Xml\Property\Href;
use Sabre\DAVACL\ACLTrait;
-use Sabre\CalDAV\Backend\SubscriptionSupport;
+use Sabre\DAVACL\IACL;
/**
* Subscription Node
@@ -25,7 +25,7 @@ class Subscription extends Collection implements ISubscription, IACL {
/**
* caldavBackend
*
- * @var SupportsSubscriptions
+ * @var SubscriptionSupport
*/
protected $caldavBackend;
@@ -40,7 +40,7 @@ class Subscription extends Collection implements ISubscription, IACL {
* Constructor
*
* @param SubscriptionSupport $caldavBackend
- * @param array $calendarInfo
+ * @param array $subscriptionInfo
*/
function __construct(SubscriptionSupport $caldavBackend, array $subscriptionInfo) {
@@ -104,7 +104,7 @@ class Subscription extends Collection implements ISubscription, IACL {
/**
* Returns an array with all the child nodes
*
- * @return DAV\INode[]
+ * @return \Sabre\DAV\INode[]
*/
function getChildren() {
diff --git a/vendor/sabre/dav/lib/CalDAV/Xml/Filter/CalendarData.php b/vendor/sabre/dav/lib/CalDAV/Xml/Filter/CalendarData.php
index 9babcf15c..9669be304 100644
--- a/vendor/sabre/dav/lib/CalDAV/Xml/Filter/CalendarData.php
+++ b/vendor/sabre/dav/lib/CalDAV/Xml/Filter/CalendarData.php
@@ -2,11 +2,11 @@
namespace Sabre\CalDAV\Xml\Filter;
-use Sabre\Xml\Reader;
-use Sabre\Xml\XmlDeserializable;
-use Sabre\DAV\Exception\BadRequest;
use Sabre\CalDAV\Plugin;
+use Sabre\DAV\Exception\BadRequest;
use Sabre\VObject\DateTimeParser;
+use Sabre\Xml\Reader;
+use Sabre\Xml\XmlDeserializable;
/**
* CalendarData parser.
@@ -30,7 +30,7 @@ class CalendarData implements XmlDeserializable {
/**
* The deserialize method is called during xml parsing.
*
- * This method is called statictly, this is because in theory this method
+ * This method is called statically, this is because in theory this method
* may be used as a type of constructor, or factory method.
*
* Often you want to return an instance of the current class, but you are
diff --git a/vendor/sabre/dav/lib/CalDAV/Xml/Filter/CompFilter.php b/vendor/sabre/dav/lib/CalDAV/Xml/Filter/CompFilter.php
index c9b27dbfd..c21ede66b 100644
--- a/vendor/sabre/dav/lib/CalDAV/Xml/Filter/CompFilter.php
+++ b/vendor/sabre/dav/lib/CalDAV/Xml/Filter/CompFilter.php
@@ -2,11 +2,11 @@
namespace Sabre\CalDAV\Xml\Filter;
-use Sabre\Xml\Reader;
-use Sabre\Xml\XmlDeserializable;
-use Sabre\DAV\Exception\BadRequest;
use Sabre\CalDAV\Plugin;
+use Sabre\DAV\Exception\BadRequest;
use Sabre\VObject\DateTimeParser;
+use Sabre\Xml\Reader;
+use Sabre\Xml\XmlDeserializable;
/**
* CompFilter parser.
@@ -27,7 +27,7 @@ class CompFilter implements XmlDeserializable {
/**
* The deserialize method is called during xml parsing.
*
- * This method is called statictly, this is because in theory this method
+ * This method is called statically, this is because in theory this method
* may be used as a type of constructor, or factory method.
*
* Often you want to return an instance of the current class, but you are
diff --git a/vendor/sabre/dav/lib/CalDAV/Xml/Filter/ParamFilter.php b/vendor/sabre/dav/lib/CalDAV/Xml/Filter/ParamFilter.php
index eb7f564df..bf422cf05 100644
--- a/vendor/sabre/dav/lib/CalDAV/Xml/Filter/ParamFilter.php
+++ b/vendor/sabre/dav/lib/CalDAV/Xml/Filter/ParamFilter.php
@@ -2,9 +2,9 @@
namespace Sabre\CalDAV\Xml\Filter;
+use Sabre\CalDAV\Plugin;
use Sabre\Xml\Reader;
use Sabre\Xml\XmlDeserializable;
-use Sabre\CalDAV\Plugin;
/**
* PropFilter parser.
@@ -25,7 +25,7 @@ class ParamFilter implements XmlDeserializable {
/**
* The deserialize method is called during xml parsing.
*
- * This method is called statictly, this is because in theory this method
+ * This method is called statically, this is because in theory this method
* may be used as a type of constructor, or factory method.
*
* Often you want to return an instance of the current class, but you are
diff --git a/vendor/sabre/dav/lib/CalDAV/Xml/Filter/PropFilter.php b/vendor/sabre/dav/lib/CalDAV/Xml/Filter/PropFilter.php
index 4c2e1b172..db9207295 100644
--- a/vendor/sabre/dav/lib/CalDAV/Xml/Filter/PropFilter.php
+++ b/vendor/sabre/dav/lib/CalDAV/Xml/Filter/PropFilter.php
@@ -2,11 +2,11 @@
namespace Sabre\CalDAV\Xml\Filter;
-use Sabre\Xml\Reader;
-use Sabre\Xml\XmlDeserializable;
-use Sabre\DAV\Exception\BadRequest;
use Sabre\CalDAV\Plugin;
+use Sabre\DAV\Exception\BadRequest;
use Sabre\VObject\DateTimeParser;
+use Sabre\Xml\Reader;
+use Sabre\Xml\XmlDeserializable;
/**
* PropFilter parser.
@@ -27,7 +27,7 @@ class PropFilter implements XmlDeserializable {
/**
* The deserialize method is called during xml parsing.
*
- * This method is called statictly, this is because in theory this method
+ * This method is called statically, this is because in theory this method
* may be used as a type of constructor, or factory method.
*
* Often you want to return an instance of the current class, but you are
diff --git a/vendor/sabre/dav/lib/CalDAV/Xml/Notification/Invite.php b/vendor/sabre/dav/lib/CalDAV/Xml/Notification/Invite.php
index 1ca64f3e8..92a9ac7b7 100644
--- a/vendor/sabre/dav/lib/CalDAV/Xml/Notification/Invite.php
+++ b/vendor/sabre/dav/lib/CalDAV/Xml/Notification/Invite.php
@@ -2,10 +2,10 @@
namespace Sabre\CalDAV\Xml\Notification;
-use Sabre\Xml\Writer;
-use Sabre\CalDAV\SharingPlugin as SharingPlugin;
use Sabre\CalDAV;
+use Sabre\CalDAV\SharingPlugin as SharingPlugin;
use Sabre\DAV;
+use Sabre\Xml\Writer;
/**
* This class represents the cs:invite-notification notification element.
@@ -107,7 +107,7 @@ class Invite implements NotificationInterface {
/**
* The list of supported components
*
- * @var Sabre\CalDAV\Property\SupportedCalendarComponentSet
+ * @var CalDAV\Xml\Property\SupportedCalendarComponentSet
*/
protected $supportedComponents;
@@ -166,12 +166,12 @@ class Invite implements NotificationInterface {
}
/**
- * The xmlSerialize metod is called during xml writing.
+ * The xmlSerialize method is called during xml writing.
*
* Use the $writer argument to write its own xml serialization.
*
* An important note: do _not_ create a parent element. Any element
- * implementing XmlSerializble should only ever write what's considered
+ * implementing XmlSerializable should only ever write what's considered
* its 'inner xml'.
*
* The parent of the current element is responsible for writing a
diff --git a/vendor/sabre/dav/lib/CalDAV/Xml/Notification/InviteReply.php b/vendor/sabre/dav/lib/CalDAV/Xml/Notification/InviteReply.php
index 51bfc178a..f4b10a396 100644
--- a/vendor/sabre/dav/lib/CalDAV/Xml/Notification/InviteReply.php
+++ b/vendor/sabre/dav/lib/CalDAV/Xml/Notification/InviteReply.php
@@ -2,10 +2,10 @@
namespace Sabre\CalDAV\Xml\Notification;
-use Sabre\Xml\Writer;
use Sabre\CalDAV;
use Sabre\CalDAV\SharingPlugin;
use Sabre\DAV;
+use Sabre\Xml\Writer;
/**
* This class represents the cs:invite-reply notification element.
@@ -117,12 +117,12 @@ class InviteReply implements NotificationInterface {
}
/**
- * The xmlSerialize metod is called during xml writing.
+ * The xmlSerialize method is called during xml writing.
*
* Use the $writer argument to write its own xml serialization.
*
* An important note: do _not_ create a parent element. Any element
- * implementing XmlSerializble should only ever write what's considered
+ * implementing XmlSerializable should only ever write what's considered
* its 'inner xml'.
*
* The parent of the current element is responsible for writing a
diff --git a/vendor/sabre/dav/lib/CalDAV/Xml/Notification/NotificationInterface.php b/vendor/sabre/dav/lib/CalDAV/Xml/Notification/NotificationInterface.php
index 1c08f12fd..b98f9c888 100644
--- a/vendor/sabre/dav/lib/CalDAV/Xml/Notification/NotificationInterface.php
+++ b/vendor/sabre/dav/lib/CalDAV/Xml/Notification/NotificationInterface.php
@@ -2,8 +2,8 @@
namespace Sabre\CalDAV\Xml\Notification;
-use Sabre\Xml\XmlSerializable;
use Sabre\Xml\Writer;
+use Sabre\Xml\XmlSerializable;
/**
* This interface reflects a single notification type.
diff --git a/vendor/sabre/dav/lib/CalDAV/Xml/Notification/SystemStatus.php b/vendor/sabre/dav/lib/CalDAV/Xml/Notification/SystemStatus.php
index d41702e07..8c945dd68 100644
--- a/vendor/sabre/dav/lib/CalDAV/Xml/Notification/SystemStatus.php
+++ b/vendor/sabre/dav/lib/CalDAV/Xml/Notification/SystemStatus.php
@@ -2,8 +2,8 @@
namespace Sabre\CalDAV\Xml\Notification;
-use Sabre\Xml\Writer;
use Sabre\CalDAV\Plugin;
+use Sabre\Xml\Writer;
/**
* SystemStatus notification
diff --git a/vendor/sabre/dav/lib/CalDAV/Xml/Property/AllowedSharingModes.php b/vendor/sabre/dav/lib/CalDAV/Xml/Property/AllowedSharingModes.php
index c2a2d565e..54e5a116a 100644
--- a/vendor/sabre/dav/lib/CalDAV/Xml/Property/AllowedSharingModes.php
+++ b/vendor/sabre/dav/lib/CalDAV/Xml/Property/AllowedSharingModes.php
@@ -2,9 +2,9 @@
namespace Sabre\CalDAV\Xml\Property;
-use Sabre\Xml\XmlSerializable;
-use Sabre\Xml\Writer;
use Sabre\CalDAV\Plugin;
+use Sabre\Xml\Writer;
+use Sabre\Xml\XmlSerializable;
/**
* AllowedSharingModes
@@ -53,12 +53,12 @@ class AllowedSharingModes implements XmlSerializable {
}
/**
- * The xmlSerialize metod is called during xml writing.
+ * The xmlSerialize method is called during xml writing.
*
* Use the $writer argument to write its own xml serialization.
*
* An important note: do _not_ create a parent element. Any element
- * implementing XmlSerializble should only ever write what's considered
+ * implementing XmlSerializable should only ever write what's considered
* its 'inner xml'.
*
* The parent of the current element is responsible for writing a
diff --git a/vendor/sabre/dav/lib/CalDAV/Xml/Property/EmailAddressSet.php b/vendor/sabre/dav/lib/CalDAV/Xml/Property/EmailAddressSet.php
index f577a9919..fc6f1d505 100644
--- a/vendor/sabre/dav/lib/CalDAV/Xml/Property/EmailAddressSet.php
+++ b/vendor/sabre/dav/lib/CalDAV/Xml/Property/EmailAddressSet.php
@@ -49,12 +49,12 @@ class EmailAddressSet implements XmlSerializable {
}
/**
- * The xmlSerialize metod is called during xml writing.
+ * The xmlSerialize method is called during xml writing.
*
* Use the $writer argument to write its own xml serialization.
*
* An important note: do _not_ create a parent element. Any element
- * implementing XmlSerializble should only ever write what's considered
+ * implementing XmlSerializable should only ever write what's considered
* its 'inner xml'.
*
* The parent of the current element is responsible for writing a
diff --git a/vendor/sabre/dav/lib/CalDAV/Xml/Property/Invite.php b/vendor/sabre/dav/lib/CalDAV/Xml/Property/Invite.php
index 40ff6b936..4f33c464c 100644
--- a/vendor/sabre/dav/lib/CalDAV/Xml/Property/Invite.php
+++ b/vendor/sabre/dav/lib/CalDAV/Xml/Property/Invite.php
@@ -2,10 +2,11 @@
namespace Sabre\CalDAV\Xml\Property;
-use Sabre\Xml\XmlSerializable;
-use Sabre\Xml\Writer;
use Sabre\CalDAV\Plugin;
use Sabre\DAV;
+use Sabre\DAV\Xml\Element\Sharee;
+use Sabre\Xml\Writer;
+use Sabre\Xml\XmlSerializable;
/**
* Invite property
@@ -51,12 +52,12 @@ class Invite implements XmlSerializable {
}
/**
- * The xmlSerialize metod is called during xml writing.
+ * The xmlSerialize method is called during xml writing.
*
* Use the $writer argument to write its own xml serialization.
*
* An important note: do _not_ create a parent element. Any element
- * implementing XmlSerializble should only ever write what's considered
+ * implementing XmlSerializable should only ever write what's considered
* its 'inner xml'.
*
* The parent of the current element is responsible for writing a
@@ -75,7 +76,7 @@ class Invite implements XmlSerializable {
foreach ($this->sharees as $sharee) {
- if ($sharee->access === \Sabre\DAV\Sharing\Plugin::ACCESS_SHAREDOWNER) {
+ if ($sharee->access === DAV\Sharing\Plugin::ACCESS_SHAREDOWNER) {
$writer->startElement($cs . 'organizer');
} else {
$writer->startElement($cs . 'user');
@@ -109,7 +110,7 @@ class Invite implements XmlSerializable {
}
- $href = new \Sabre\DAV\Xml\Property\Href($sharee->href);
+ $href = new DAV\Xml\Property\Href($sharee->href);
$href->xmlSerialize($writer);
if (isset($sharee->properties['{DAV:}displayname'])) {
diff --git a/vendor/sabre/dav/lib/CalDAV/Xml/Property/ScheduleCalendarTransp.php b/vendor/sabre/dav/lib/CalDAV/Xml/Property/ScheduleCalendarTransp.php
index a82b8eff7..10c20be55 100644
--- a/vendor/sabre/dav/lib/CalDAV/Xml/Property/ScheduleCalendarTransp.php
+++ b/vendor/sabre/dav/lib/CalDAV/Xml/Property/ScheduleCalendarTransp.php
@@ -2,11 +2,11 @@
namespace Sabre\CalDAV\Xml\Property;
+use Sabre\CalDAV\Plugin;
+use Sabre\Xml\Deserializer;
use Sabre\Xml\Element;
use Sabre\Xml\Reader;
-use Sabre\Xml\Deserializer;
use Sabre\Xml\Writer;
-use Sabre\CalDAV\Plugin;
/**
* schedule-calendar-transp property.
@@ -62,12 +62,12 @@ class ScheduleCalendarTransp implements Element {
}
/**
- * The xmlSerialize metod is called during xml writing.
+ * The xmlSerialize method is called during xml writing.
*
* Use the $writer argument to write its own xml serialization.
*
* An important note: do _not_ create a parent element. Any element
- * implementing XmlSerializble should only ever write what's considered
+ * implementing XmlSerializable should only ever write what's considered
* its 'inner xml'.
*
* The parent of the current element is responsible for writing a
@@ -96,7 +96,7 @@ class ScheduleCalendarTransp implements Element {
/**
* The deserialize method is called during xml parsing.
*
- * This method is called statictly, this is because in theory this method
+ * This method is called statically, this is because in theory this method
* may be used as a type of constructor, or factory method.
*
* Often you want to return an instance of the current class, but you are
diff --git a/vendor/sabre/dav/lib/CalDAV/Xml/Property/SupportedCalendarComponentSet.php b/vendor/sabre/dav/lib/CalDAV/Xml/Property/SupportedCalendarComponentSet.php
index 7a26e767e..7fc25c5f0 100644
--- a/vendor/sabre/dav/lib/CalDAV/Xml/Property/SupportedCalendarComponentSet.php
+++ b/vendor/sabre/dav/lib/CalDAV/Xml/Property/SupportedCalendarComponentSet.php
@@ -2,11 +2,11 @@
namespace Sabre\CalDAV\Xml\Property;
+use Sabre\CalDAV\Plugin;
use Sabre\Xml\Element;
use Sabre\Xml\ParseException;
use Sabre\Xml\Reader;
use Sabre\Xml\Writer;
-use Sabre\CalDAV\Plugin;
/**
* SupportedCalendarComponentSet property.
@@ -55,12 +55,12 @@ class SupportedCalendarComponentSet implements Element {
}
/**
- * The xmlSerialize metod is called during xml writing.
+ * The xmlSerialize method is called during xml writing.
*
* Use the $writer argument to write its own xml serialization.
*
* An important note: do _not_ create a parent element. Any element
- * implementing XmlSerializble should only ever write what's considered
+ * implementing XmlSerializable should only ever write what's considered
* its 'inner xml'.
*
* The parent of the current element is responsible for writing a
@@ -88,7 +88,7 @@ class SupportedCalendarComponentSet implements Element {
/**
* The deserialize method is called during xml parsing.
*
- * This method is called statictly, this is because in theory this method
+ * This method is called statically, this is because in theory this method
* may be used as a type of constructor, or factory method.
*
* Often you want to return an instance of the current class, but you are
diff --git a/vendor/sabre/dav/lib/CalDAV/Xml/Property/SupportedCalendarData.php b/vendor/sabre/dav/lib/CalDAV/Xml/Property/SupportedCalendarData.php
index b0c407fd6..d123ba4c0 100644
--- a/vendor/sabre/dav/lib/CalDAV/Xml/Property/SupportedCalendarData.php
+++ b/vendor/sabre/dav/lib/CalDAV/Xml/Property/SupportedCalendarData.php
@@ -2,9 +2,9 @@
namespace Sabre\CalDAV\Xml\Property;
-use Sabre\Xml\XmlSerializable;
-use Sabre\Xml\Writer;
use Sabre\CalDAV\Plugin;
+use Sabre\Xml\Writer;
+use Sabre\Xml\XmlSerializable;
/**
* Supported-calendar-data property
@@ -23,12 +23,12 @@ use Sabre\CalDAV\Plugin;
class SupportedCalendarData implements XmlSerializable {
/**
- * The xmlSerialize metod is called during xml writing.
+ * The xmlSerialize method is called during xml writing.
*
* Use the $writer argument to write its own xml serialization.
*
* An important note: do _not_ create a parent element. Any element
- * implementing XmlSerializble should only ever write what's considered
+ * implementing XmlSerializable should only ever write what's considered
* its 'inner xml'.
*
* The parent of the current element is responsible for writing a
diff --git a/vendor/sabre/dav/lib/CalDAV/Xml/Property/SupportedCollationSet.php b/vendor/sabre/dav/lib/CalDAV/Xml/Property/SupportedCollationSet.php
index 71de25a62..af10860d0 100644
--- a/vendor/sabre/dav/lib/CalDAV/Xml/Property/SupportedCollationSet.php
+++ b/vendor/sabre/dav/lib/CalDAV/Xml/Property/SupportedCollationSet.php
@@ -2,9 +2,9 @@
namespace Sabre\CalDAV\Xml\Property;
+use Sabre\CalDAV\Plugin;
use Sabre\Xml\Writer;
use Sabre\Xml\XmlSerializable;
-use Sabre\CalDAV\Plugin;
/**
* supported-collation-set property
@@ -22,12 +22,12 @@ use Sabre\CalDAV\Plugin;
class SupportedCollationSet implements XmlSerializable {
/**
- * The xmlSerialize metod is called during xml writing.
+ * The xmlSerialize method is called during xml writing.
*
* Use the $writer argument to write its own xml serialization.
*
* An important note: do _not_ create a parent element. Any element
- * implementing XmlSerializble should only ever write what's considered
+ * implementing XmlSerializable should only ever write what's considered
* its 'inner xml'.
*
* The parent of the current element is responsible for writing a
diff --git a/vendor/sabre/dav/lib/CalDAV/Xml/Request/CalendarMultiGetReport.php b/vendor/sabre/dav/lib/CalDAV/Xml/Request/CalendarMultiGetReport.php
index 79b3bb3ac..6d3c5d508 100644
--- a/vendor/sabre/dav/lib/CalDAV/Xml/Request/CalendarMultiGetReport.php
+++ b/vendor/sabre/dav/lib/CalDAV/Xml/Request/CalendarMultiGetReport.php
@@ -2,10 +2,10 @@
namespace Sabre\CalDAV\Xml\Request;
-use Sabre\Xml\XmlDeserializable;
-use Sabre\Xml\Reader;
use Sabre\CalDAV\Plugin;
use Sabre\Uri;
+use Sabre\Xml\Reader;
+use Sabre\Xml\XmlDeserializable;
/**
* CalendarMultiGetReport request parser.
@@ -64,7 +64,7 @@ class CalendarMultiGetReport implements XmlDeserializable {
/**
* The deserialize method is called during xml parsing.
*
- * This method is called statictly, this is because in theory this method
+ * This method is called statically, this is because in theory this method
* may be used as a type of constructor, or factory method.
*
* Often you want to return an instance of the current class, but you are
diff --git a/vendor/sabre/dav/lib/CalDAV/Xml/Request/CalendarQueryReport.php b/vendor/sabre/dav/lib/CalDAV/Xml/Request/CalendarQueryReport.php
index 848a4dc46..e0b1c7950 100644
--- a/vendor/sabre/dav/lib/CalDAV/Xml/Request/CalendarQueryReport.php
+++ b/vendor/sabre/dav/lib/CalDAV/Xml/Request/CalendarQueryReport.php
@@ -2,10 +2,10 @@
namespace Sabre\CalDAV\Xml\Request;
-use Sabre\Xml\XmlDeserializable;
-use Sabre\Xml\Reader;
-use Sabre\DAV\Exception\BadRequest;
use Sabre\CalDAV\Plugin;
+use Sabre\DAV\Exception\BadRequest;
+use Sabre\Xml\Reader;
+use Sabre\Xml\XmlDeserializable;
/**
* CalendarQueryReport request parser.
@@ -64,7 +64,7 @@ class CalendarQueryReport implements XmlDeserializable {
/**
* The deserialize method is called during xml parsing.
*
- * This method is called statictly, this is because in theory this method
+ * This method is called statically, this is because in theory this method
* may be used as a type of constructor, or factory method.
*
* Often you want to return an instance of the current class, but you are
diff --git a/vendor/sabre/dav/lib/CalDAV/Xml/Request/FreeBusyQueryReport.php b/vendor/sabre/dav/lib/CalDAV/Xml/Request/FreeBusyQueryReport.php
index e3b27d08e..0f6c1e074 100644
--- a/vendor/sabre/dav/lib/CalDAV/Xml/Request/FreeBusyQueryReport.php
+++ b/vendor/sabre/dav/lib/CalDAV/Xml/Request/FreeBusyQueryReport.php
@@ -38,7 +38,7 @@ class FreeBusyQueryReport implements XmlDeserializable {
/**
* The deserialize method is called during xml parsing.
*
- * This method is called statictly, this is because in theory this method
+ * This method is called statically, this is because in theory this method
* may be used as a type of constructor, or factory method.
*
* Often you want to return an instance of the current class, but you are
diff --git a/vendor/sabre/dav/lib/CalDAV/Xml/Request/InviteReply.php b/vendor/sabre/dav/lib/CalDAV/Xml/Request/InviteReply.php
index 2ecf6c2bb..db32cc6a5 100644
--- a/vendor/sabre/dav/lib/CalDAV/Xml/Request/InviteReply.php
+++ b/vendor/sabre/dav/lib/CalDAV/Xml/Request/InviteReply.php
@@ -6,9 +6,9 @@ use Sabre\CalDAV\Plugin;
use Sabre\CalDAV\SharingPlugin;
use Sabre\DAV;
use Sabre\DAV\Exception\BadRequest;
+use Sabre\Xml\Element\KeyValue;
use Sabre\Xml\Reader;
use Sabre\Xml\XmlDeserializable;
-use Sabre\Xml\Element\KeyValue;
/**
* Invite-reply POST request parser
@@ -82,7 +82,7 @@ class InviteReply implements XmlDeserializable {
/**
* The deserialize method is called during xml parsing.
*
- * This method is called statictly, this is because in theory this method
+ * This method is called statically, this is because in theory this method
* may be used as a type of constructor, or factory method.
*
* Often you want to return an instance of the current class, but you are
diff --git a/vendor/sabre/dav/lib/CalDAV/Xml/Request/MkCalendar.php b/vendor/sabre/dav/lib/CalDAV/Xml/Request/MkCalendar.php
index 7b745db55..ce7fafde9 100644
--- a/vendor/sabre/dav/lib/CalDAV/Xml/Request/MkCalendar.php
+++ b/vendor/sabre/dav/lib/CalDAV/Xml/Request/MkCalendar.php
@@ -39,7 +39,7 @@ class MkCalendar implements XmlDeserializable {
/**
* The deserialize method is called during xml parsing.
*
- * This method is called statictly, this is because in theory this method
+ * This method is called statically, this is because in theory this method
* may be used as a type of constructor, or factory method.
*
* Often you want to return an instance of the current class, but you are
@@ -62,8 +62,8 @@ class MkCalendar implements XmlDeserializable {
$self = new self();
$elementMap = $reader->elementMap;
- $elementMap['{DAV:}prop'] = 'Sabre\DAV\Xml\Element\Prop';
- $elementMap['{DAV:}set'] = 'Sabre\Xml\Element\KeyValue';
+ $elementMap['{DAV:}prop'] = 'Sabre\DAV\Xml\Element\Prop';
+ $elementMap['{DAV:}set'] = 'Sabre\Xml\Element\KeyValue';
$elems = $reader->parseInnerTree($elementMap);
foreach ($elems as $elem) {
diff --git a/vendor/sabre/dav/lib/CalDAV/Xml/Request/Share.php b/vendor/sabre/dav/lib/CalDAV/Xml/Request/Share.php
index b5d9a133c..e0bd8e0af 100644
--- a/vendor/sabre/dav/lib/CalDAV/Xml/Request/Share.php
+++ b/vendor/sabre/dav/lib/CalDAV/Xml/Request/Share.php
@@ -41,7 +41,7 @@ class Share implements XmlDeserializable {
/**
* The deserialize method is called during xml parsing.
*
- * This method is called statictly, this is because in theory this method
+ * This method is called statically, this is because in theory this method
* may be used as a type of constructor, or factory method.
*
* Often you want to return an instance of the current class, but you are
diff --git a/vendor/sabre/dav/lib/CardDAV/AddressBook.php b/vendor/sabre/dav/lib/CardDAV/AddressBook.php
index 6dd098618..c9d28a091 100644
--- a/vendor/sabre/dav/lib/CardDAV/AddressBook.php
+++ b/vendor/sabre/dav/lib/CardDAV/AddressBook.php
@@ -60,7 +60,7 @@ class AddressBook extends DAV\Collection implements IAddressBook, DAV\IPropertie
* Returns a card
*
* @param string $name
- * @return \ICard
+ * @return Card
*/
function getChild($name) {
diff --git a/vendor/sabre/dav/lib/CardDAV/AddressBookHome.php b/vendor/sabre/dav/lib/CardDAV/AddressBookHome.php
index 888a44a40..d770c0ffe 100644
--- a/vendor/sabre/dav/lib/CardDAV/AddressBookHome.php
+++ b/vendor/sabre/dav/lib/CardDAV/AddressBookHome.php
@@ -127,7 +127,7 @@ class AddressBookHome extends DAV\Collection implements DAV\IExtendedCollection,
*
* @param string $name
* @todo needs optimizing
- * @return \AddressBook
+ * @return AddressBook
*/
function getChild($name) {
diff --git a/vendor/sabre/dav/lib/CardDAV/AddressBookRoot.php b/vendor/sabre/dav/lib/CardDAV/AddressBookRoot.php
index 4a33df4ec..a9f1183da 100644
--- a/vendor/sabre/dav/lib/CardDAV/AddressBookRoot.php
+++ b/vendor/sabre/dav/lib/CardDAV/AddressBookRoot.php
@@ -18,7 +18,7 @@ class AddressBookRoot extends DAVACL\AbstractPrincipalCollection {
/**
* Principal Backend
*
- * @var Sabre\DAVACL\PrincipalBackend\BackendInteface
+ * @var DAVACL\PrincipalBackend\BackendInterface
*/
protected $principalBackend;
diff --git a/vendor/sabre/dav/lib/CardDAV/Backend/BackendInterface.php b/vendor/sabre/dav/lib/CardDAV/Backend/BackendInterface.php
index 54e42b899..18c0c0a99 100644
--- a/vendor/sabre/dav/lib/CardDAV/Backend/BackendInterface.php
+++ b/vendor/sabre/dav/lib/CardDAV/Backend/BackendInterface.php
@@ -46,7 +46,7 @@ interface BackendInterface {
* Calling the handle method is like telling the PropPatch object "I
* promise I can handle updating this property".
*
- * Read the PropPatch documenation for more info and examples.
+ * Read the PropPatch documentation for more info and examples.
*
* @param string $addressBookId
* @param \Sabre\DAV\PropPatch $propPatch
diff --git a/vendor/sabre/dav/lib/CardDAV/Backend/PDO.php b/vendor/sabre/dav/lib/CardDAV/Backend/PDO.php
index 7c3feff93..13487e9da 100644
--- a/vendor/sabre/dav/lib/CardDAV/Backend/PDO.php
+++ b/vendor/sabre/dav/lib/CardDAV/Backend/PDO.php
@@ -93,7 +93,7 @@ class PDO extends AbstractBackend implements SyncSupport {
* Calling the handle method is like telling the PropPatch object "I
* promise I can handle updating this property".
*
- * Read the PropPatch documenation for more info and examples.
+ * Read the PropPatch documentation for more info and examples.
*
* @param string $addressBookId
* @param \Sabre\DAV\PropPatch $propPatch
@@ -240,7 +240,7 @@ class PDO extends AbstractBackend implements SyncSupport {
}
/**
- * Returns a specfic card.
+ * Returns a specific card.
*
* The same set of properties must be returned as with getCards. The only
* exception is that 'carddata' is absolutely required.
@@ -466,7 +466,7 @@ class PDO extends AbstractBackend implements SyncSupport {
// Current synctoken
$stmt = $this->pdo->prepare('SELECT synctoken FROM ' . $this->addressBooksTableName . ' WHERE id = ?');
- $stmt->execute([ $addressBookId ]);
+ $stmt->execute([$addressBookId]);
$currentToken = $stmt->fetchColumn(0);
if (is_null($currentToken)) return null;
diff --git a/vendor/sabre/dav/lib/CardDAV/Card.php b/vendor/sabre/dav/lib/CardDAV/Card.php
index 0a040be6b..42a2d7b6a 100644
--- a/vendor/sabre/dav/lib/CardDAV/Card.php
+++ b/vendor/sabre/dav/lib/CardDAV/Card.php
@@ -2,8 +2,8 @@
namespace Sabre\CardDAV;
-use Sabre\DAVACL;
use Sabre\DAV;
+use Sabre\DAVACL;
/**
* The Card object represents a single Card from an addressbook
diff --git a/vendor/sabre/dav/lib/CardDAV/Plugin.php b/vendor/sabre/dav/lib/CardDAV/Plugin.php
index 0507df100..272ae71fa 100644
--- a/vendor/sabre/dav/lib/CardDAV/Plugin.php
+++ b/vendor/sabre/dav/lib/CardDAV/Plugin.php
@@ -43,7 +43,7 @@ class Plugin extends DAV\ServerPlugin {
/**
* Server class
*
- * @var Sabre\DAV\Server
+ * @var DAV\Server
*/
protected $server;
@@ -490,7 +490,8 @@ class Plugin extends DAV\ServerPlugin {
$props[200]['{' . self::NS_CARDDAV . '}address-data'] = $this->convertVCard(
$props[200]['{' . self::NS_CARDDAV . '}address-data'],
- $vcardType
+ $vcardType,
+ $report->addressDataProperties
);
}
@@ -845,14 +846,26 @@ class Plugin extends DAV\ServerPlugin {
*
* @param string|resource $data
* @param string $target
+ * @param array $propertiesFilter
* @return string
*/
- protected function convertVCard($data, $target) {
+ protected function convertVCard($data, $target, array $propertiesFilter = null) {
if (is_resource($data)) {
$data = stream_get_contents($data);
}
$input = VObject\Reader::read($data);
+ if (!empty($propertiesFilter)) {
+ $propertiesFilter = array_merge(['UID', 'VERSION', 'FN'], $propertiesFilter);
+ $keys = array_unique(array_map(function($child) {
+ return $child->name;
+ }, $input->children()));
+ $keys = array_diff($keys, $propertiesFilter);
+ foreach ($keys as $key) {
+ unset($input->$key);
+ }
+ $data = $input->serialize();
+ }
$output = null;
try {
diff --git a/vendor/sabre/dav/lib/CardDAV/VCFExportPlugin.php b/vendor/sabre/dav/lib/CardDAV/VCFExportPlugin.php
index d015589ad..2d61db6ac 100644
--- a/vendor/sabre/dav/lib/CardDAV/VCFExportPlugin.php
+++ b/vendor/sabre/dav/lib/CardDAV/VCFExportPlugin.php
@@ -3,9 +3,9 @@
namespace Sabre\CardDAV;
use Sabre\DAV;
-use Sabre\VObject;
use Sabre\HTTP\RequestInterface;
use Sabre\HTTP\ResponseInterface;
+use Sabre\VObject;
/**
* VCF Exporter
@@ -24,7 +24,7 @@ class VCFExportPlugin extends DAV\ServerPlugin {
/**
* Reference to Server class
*
- * @var Sabre\DAV\Server
+ * @var DAV\Server
*/
protected $server;
diff --git a/vendor/sabre/dav/lib/CardDAV/Xml/Filter/AddressData.php b/vendor/sabre/dav/lib/CardDAV/Xml/Filter/AddressData.php
index 34028db85..a130cd61d 100644
--- a/vendor/sabre/dav/lib/CardDAV/Xml/Filter/AddressData.php
+++ b/vendor/sabre/dav/lib/CardDAV/Xml/Filter/AddressData.php
@@ -26,7 +26,7 @@ class AddressData implements XmlDeserializable {
/**
* The deserialize method is called during xml parsing.
*
- * This method is called statictly, this is because in theory this method
+ * This method is called statically, this is because in theory this method
* may be used as a type of constructor, or factory method.
*
* Often you want to return an instance of the current class, but you are
@@ -51,7 +51,11 @@ class AddressData implements XmlDeserializable {
'version' => $reader->getAttribute('version') ?: '3.0',
];
- $reader->next();
+ $elems = (array)$reader->parseInnerTree();
+ $result['addressDataProperties'] = array_map(function($element) {
+ return $element['attributes']['name'];
+ }, $elems);
+
return $result;
}
diff --git a/vendor/sabre/dav/lib/CardDAV/Xml/Filter/ParamFilter.php b/vendor/sabre/dav/lib/CardDAV/Xml/Filter/ParamFilter.php
index 9646ae3e6..936e26917 100644
--- a/vendor/sabre/dav/lib/CardDAV/Xml/Filter/ParamFilter.php
+++ b/vendor/sabre/dav/lib/CardDAV/Xml/Filter/ParamFilter.php
@@ -2,10 +2,10 @@
namespace Sabre\CardDAV\Xml\Filter;
+use Sabre\CardDAV\Plugin;
+use Sabre\DAV\Exception\BadRequest;
use Sabre\Xml\Element;
use Sabre\Xml\Reader;
-use Sabre\DAV\Exception\BadRequest;
-use Sabre\CardDAV\Plugin;
/**
* ParamFilter parser.
@@ -26,7 +26,7 @@ abstract class ParamFilter implements Element {
/**
* The deserialize method is called during xml parsing.
*
- * This method is called statictly, this is because in theory this method
+ * This method is called statically, this is because in theory this method
* may be used as a type of constructor, or factory method.
*
* Often you want to return an instance of the current class, but you are
diff --git a/vendor/sabre/dav/lib/CardDAV/Xml/Filter/PropFilter.php b/vendor/sabre/dav/lib/CardDAV/Xml/Filter/PropFilter.php
index c162da160..d7799429d 100644
--- a/vendor/sabre/dav/lib/CardDAV/Xml/Filter/PropFilter.php
+++ b/vendor/sabre/dav/lib/CardDAV/Xml/Filter/PropFilter.php
@@ -2,10 +2,10 @@
namespace Sabre\CardDAV\Xml\Filter;
+use Sabre\CardDAV\Plugin;
+use Sabre\DAV\Exception\BadRequest;
use Sabre\Xml\Reader;
use Sabre\Xml\XmlDeserializable;
-use Sabre\DAV\Exception\BadRequest;
-use Sabre\CardDAV\Plugin;
/**
* PropFilter parser.
@@ -26,7 +26,7 @@ class PropFilter implements XmlDeserializable {
/**
* The deserialize method is called during xml parsing.
*
- * This method is called statictly, this is because in theory this method
+ * This method is called statically, this is because in theory this method
* may be used as a type of constructor, or factory method.
*
* Often you want to return an instance of the current class, but you are
diff --git a/vendor/sabre/dav/lib/CardDAV/Xml/Property/SupportedAddressData.php b/vendor/sabre/dav/lib/CardDAV/Xml/Property/SupportedAddressData.php
index 6ff57b6e3..aecd8a09f 100644
--- a/vendor/sabre/dav/lib/CardDAV/Xml/Property/SupportedAddressData.php
+++ b/vendor/sabre/dav/lib/CardDAV/Xml/Property/SupportedAddressData.php
@@ -2,9 +2,9 @@
namespace Sabre\CardDAV\Xml\Property;
+use Sabre\CardDAV\Plugin;
use Sabre\Xml\Writer;
use Sabre\Xml\XmlSerializable;
-use Sabre\CardDAV\Plugin;
/**
* Supported-address-data property
@@ -49,12 +49,12 @@ class SupportedAddressData implements XmlSerializable {
}
/**
- * The xmlSerialize metod is called during xml writing.
+ * The xmlSerialize method is called during xml writing.
*
* Use the $writer argument to write its own xml serialization.
*
* An important note: do _not_ create a parent element. Any element
- * implementing XmlSerializble should only ever write what's considered
+ * implementing XmlSerializable should only ever write what's considered
* its 'inner xml'.
*
* The parent of the current element is responsible for writing a
diff --git a/vendor/sabre/dav/lib/CardDAV/Xml/Property/SupportedCollationSet.php b/vendor/sabre/dav/lib/CardDAV/Xml/Property/SupportedCollationSet.php
index 1fc064900..778aa2b64 100644
--- a/vendor/sabre/dav/lib/CardDAV/Xml/Property/SupportedCollationSet.php
+++ b/vendor/sabre/dav/lib/CardDAV/Xml/Property/SupportedCollationSet.php
@@ -18,12 +18,12 @@ use Sabre\Xml\XmlSerializable;
class SupportedCollationSet implements XmlSerializable {
/**
- * The xmlSerialize metod is called during xml writing.
+ * The xmlSerialize method is called during xml writing.
*
* Use the $writer argument to write its own xml serialization.
*
* An important note: do _not_ create a parent element. Any element
- * implementing XmlSerializble should only ever write what's considered
+ * implementing XmlSerializable should only ever write what's considered
* its 'inner xml'.
*
* The parent of the current element is responsible for writing a
diff --git a/vendor/sabre/dav/lib/CardDAV/Xml/Request/AddressBookMultiGetReport.php b/vendor/sabre/dav/lib/CardDAV/Xml/Request/AddressBookMultiGetReport.php
index c97c5eb4f..0115a0107 100644
--- a/vendor/sabre/dav/lib/CardDAV/Xml/Request/AddressBookMultiGetReport.php
+++ b/vendor/sabre/dav/lib/CardDAV/Xml/Request/AddressBookMultiGetReport.php
@@ -54,7 +54,7 @@ class AddressBookMultiGetReport implements XmlDeserializable {
/**
* The deserialize method is called during xml parsing.
*
- * This method is called statictly, this is because in theory this method
+ * This method is called statically, this is because in theory this method
* may be used as a type of constructor, or factory method.
*
* Often you want to return an instance of the current class, but you are
diff --git a/vendor/sabre/dav/lib/CardDAV/Xml/Request/AddressBookQueryReport.php b/vendor/sabre/dav/lib/CardDAV/Xml/Request/AddressBookQueryReport.php
index a68ac5800..09fad008a 100644
--- a/vendor/sabre/dav/lib/CardDAV/Xml/Request/AddressBookQueryReport.php
+++ b/vendor/sabre/dav/lib/CardDAV/Xml/Request/AddressBookQueryReport.php
@@ -2,10 +2,10 @@
namespace Sabre\CardDAV\Xml\Request;
+use Sabre\CardDAV\Plugin;
+use Sabre\DAV\Exception\BadRequest;
use Sabre\Xml\Reader;
use Sabre\Xml\XmlDeserializable;
-use Sabre\DAV\Exception\BadRequest;
-use Sabre\CardDAV\Plugin;
/**
* AddressBookQueryReport request parser.
@@ -29,6 +29,13 @@ class AddressBookQueryReport implements XmlDeserializable {
public $properties;
/**
+ * An array with requested vcard properties.
+ *
+ * @var array
+ */
+ public $addressDataProperties = [];
+
+ /**
* List of property/component filters.
*
* This is an array with filters. Every item is a property filter. Every
@@ -92,7 +99,7 @@ class AddressBookQueryReport implements XmlDeserializable {
/**
* The deserialize method is called during xml parsing.
*
- * This method is called statictly, this is because in theory this method
+ * This method is called statically, this is because in theory this method
* may be used as a type of constructor, or factory method.
*
* Often you want to return an instance of the current class, but you are
diff --git a/vendor/sabre/dav/lib/DAV/Auth/Backend/AbstractDigest.php b/vendor/sabre/dav/lib/DAV/Auth/Backend/AbstractDigest.php
index 85c5f30d5..4b47f56c9 100644
--- a/vendor/sabre/dav/lib/DAV/Auth/Backend/AbstractDigest.php
+++ b/vendor/sabre/dav/lib/DAV/Auth/Backend/AbstractDigest.php
@@ -2,8 +2,8 @@
namespace Sabre\DAV\Auth\Backend;
-use Sabre\HTTP;
use Sabre\DAV;
+use Sabre\HTTP;
use Sabre\HTTP\RequestInterface;
use Sabre\HTTP\ResponseInterface;
diff --git a/vendor/sabre/dav/lib/DAV/Auth/Backend/PDO.php b/vendor/sabre/dav/lib/DAV/Auth/Backend/PDO.php
index 76ad89391..c2f6de974 100644
--- a/vendor/sabre/dav/lib/DAV/Auth/Backend/PDO.php
+++ b/vendor/sabre/dav/lib/DAV/Auth/Backend/PDO.php
@@ -31,7 +31,7 @@ class PDO extends AbstractDigest {
*
* If the filename argument is passed in, it will parse out the specified file fist.
*
- * @param PDO $pdo
+ * @param \PDO $pdo
*/
function __construct(\PDO $pdo) {
diff --git a/vendor/sabre/dav/lib/DAV/Auth/Plugin.php b/vendor/sabre/dav/lib/DAV/Auth/Plugin.php
index 4b5f35ac3..bbb5d180d 100644
--- a/vendor/sabre/dav/lib/DAV/Auth/Plugin.php
+++ b/vendor/sabre/dav/lib/DAV/Auth/Plugin.php
@@ -2,11 +2,11 @@
namespace Sabre\DAV\Auth;
-use Sabre\HTTP\RequestInterface;
-use Sabre\HTTP\ResponseInterface;
use Sabre\DAV\Exception\NotAuthenticated;
use Sabre\DAV\Server;
use Sabre\DAV\ServerPlugin;
+use Sabre\HTTP\RequestInterface;
+use Sabre\HTTP\ResponseInterface;
/**
* This plugin provides Authentication for a WebDAV server.
@@ -181,7 +181,7 @@ class Plugin extends ServerPlugin {
*
* If login was not successful, the second item in the array will contain a
* an array with strings. The strings are a list of reasons why login was
- * unsuccesful. For every auth backend there will be one reason, so usually
+ * unsuccessful. For every auth backend there will be one reason, so usually
* there's just one.
*
* @param RequestInterface $request
diff --git a/vendor/sabre/dav/lib/DAV/Browser/GuessContentType.php b/vendor/sabre/dav/lib/DAV/Browser/GuessContentType.php
index 01cddc230..3ba2aee25 100644
--- a/vendor/sabre/dav/lib/DAV/Browser/GuessContentType.php
+++ b/vendor/sabre/dav/lib/DAV/Browser/GuessContentType.php
@@ -2,10 +2,10 @@
namespace Sabre\DAV\Browser;
-use Sabre\HTTP\URLUtil;
use Sabre\DAV;
-use Sabre\DAV\PropFind;
use Sabre\DAV\Inode;
+use Sabre\DAV\PropFind;
+use Sabre\HTTP\URLUtil;
/**
* GuessContentType plugin
diff --git a/vendor/sabre/dav/lib/DAV/Browser/MapGetToPropFind.php b/vendor/sabre/dav/lib/DAV/Browser/MapGetToPropFind.php
index 38ee63bcd..61327c49a 100644
--- a/vendor/sabre/dav/lib/DAV/Browser/MapGetToPropFind.php
+++ b/vendor/sabre/dav/lib/DAV/Browser/MapGetToPropFind.php
@@ -21,7 +21,7 @@ class MapGetToPropFind extends DAV\ServerPlugin {
/**
* reference to server class
*
- * @var Sabre\DAV\Server
+ * @var DAV\Server
*/
protected $server;
diff --git a/vendor/sabre/dav/lib/DAV/Browser/Plugin.php b/vendor/sabre/dav/lib/DAV/Browser/Plugin.php
index 49359a045..545ad5633 100644
--- a/vendor/sabre/dav/lib/DAV/Browser/Plugin.php
+++ b/vendor/sabre/dav/lib/DAV/Browser/Plugin.php
@@ -4,9 +4,9 @@ namespace Sabre\DAV\Browser;
use Sabre\DAV;
use Sabre\DAV\MkCol;
-use Sabre\HTTP\URLUtil;
use Sabre\HTTP\RequestInterface;
use Sabre\HTTP\ResponseInterface;
+use Sabre\HTTP\URLUtil;
/**
* Browser Plugin
@@ -26,7 +26,7 @@ class Plugin extends DAV\ServerPlugin {
/**
* reference to server class
*
- * @var Sabre\DAV\Server
+ * @var DAV\Server
*/
protected $server;
@@ -112,7 +112,7 @@ class Plugin extends DAV\ServerPlugin {
$getVars = $request->getQueryParameters();
// CSP headers
- $this->server->httpResponse->setHeader('Content-Security-Policy', "default-src 'none'; img-src 'self'; style-src 'self'; font-src 'self';");
+ $response->setHeader('Content-Security-Policy', "default-src 'none'; img-src 'self'; style-src 'self'; font-src 'self';");
$sabreAction = isset($getVars['sabreAction']) ? $getVars['sabreAction'] : null;
@@ -317,7 +317,7 @@ class Plugin extends DAV\ServerPlugin {
$buttonActions = '';
if ($subProps['subNode'] instanceof DAV\IFile) {
- $buttonActions = '<a href="' . $this->escapeHTML($subProps['fullPath']) . '?sabreAction=info"><span class="oi" data-glyph="info"></span></a>';
+ $buttonActions = '<a href="' . $this->escapeHTML($subProps['fullPath']) . '?sabreAction=info"><span class="oi" data-glyph="info"></span></a>';
}
$this->server->emit('browserButtonActions', [$subProps['fullPath'], $subProps['subNode'], &$buttonActions]);
@@ -414,11 +414,14 @@ class Plugin extends DAV\ServerPlugin {
*
* @param string $title
* @param string $path
- * @return void
+ * @return string
*/
function generateHeader($title, $path = null) {
- $version = DAV\Version::VERSION;
+ $version = '';
+ if (DAV\Server::$exposeVersion) {
+ $version = DAV\Version::VERSION;
+ }
$vars = [
'title' => $this->escapeHTML($title),
@@ -475,7 +478,10 @@ HTML;
*/
function generateFooter() {
- $version = DAV\Version::VERSION;
+ $version = '';
+ if (DAV\Server::$exposeVersion) {
+ $version = DAV\Version::VERSION;
+ }
return <<<HTML
<footer>Generated by SabreDAV $version (c)2007-2016 <a href="http://sabre.io/">http://sabre.io/</a></footer>
</body>
@@ -506,23 +512,21 @@ HTML;
if (get_class($node) === 'Sabre\\DAV\\SimpleCollection')
return;
- ob_start();
- echo '<form method="post" action="">
- <h3>Create new folder</h3>
- <input type="hidden" name="sabreAction" value="mkcol" />
- <label>Name:</label> <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" />
- <label>Name (optional):</label> <input type="text" name="name" /><br />
- <label>File:</label> <input type="file" name="file" /><br />
- <input type="submit" value="upload" />
- </form>
- ';
-
- $output .= ob_get_clean();
+ $output .= <<<HTML
+<form method="post" action="">
+<h3>Create new folder</h3>
+<input type="hidden" name="sabreAction" value="mkcol" />
+<label>Name:</label> <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" />
+<label>Name (optional):</label> <input type="text" name="name" /><br />
+<label>File:</label> <input type="file" name="file" /><br />
+<input type="submit" value="upload" />
+</form>
+HTML;
}
@@ -543,8 +547,8 @@ HTML;
* This method returns a local pathname to an asset.
*
* @param string $assetName
- * @return string
* @throws DAV\Exception\NotFound
+ * @return string
*/
protected function getLocalAssetPath($assetName) {
@@ -575,9 +579,9 @@ HTML;
// Rudimentary mime type detection
$mime = 'application/octet-stream';
$map = [
- 'ico' => 'image/vnd.microsoft.icon',
- 'png' => 'image/png',
- 'css' => 'text/css',
+ 'ico' => 'image/vnd.microsoft.icon',
+ 'png' => 'image/png',
+ 'css' => 'text/css',
];
$ext = substr($assetName, strrpos($assetName, '.') + 1);
@@ -623,7 +627,7 @@ HTML;
* Maps a resource type to a human-readable string and icon.
*
* @param array $resourceTypes
- * @param INode $node
+ * @param DAV\INode $node
* @return array
*/
private function mapResourceType(array $resourceTypes, $node) {
diff --git a/vendor/sabre/dav/lib/DAV/Browser/PropFindAll.php b/vendor/sabre/dav/lib/DAV/Browser/PropFindAll.php
index 1ac439672..c14b7f2f9 100644
--- a/vendor/sabre/dav/lib/DAV/Browser/PropFindAll.php
+++ b/vendor/sabre/dav/lib/DAV/Browser/PropFindAll.php
@@ -28,7 +28,7 @@ class PropFindAll extends PropFind {
/**
* Handles a specific property.
*
- * This method checks wether the specified property was requested in this
+ * This method checks whether the specified property was requested in this
* PROPFIND request, and if so, it will call the callback and use the
* return value for it's value.
*
diff --git a/vendor/sabre/dav/lib/DAV/Client.php b/vendor/sabre/dav/lib/DAV/Client.php
index 08d5d4702..175ad1bc4 100644
--- a/vendor/sabre/dav/lib/DAV/Client.php
+++ b/vendor/sabre/dav/lib/DAV/Client.php
@@ -231,7 +231,7 @@ class Client extends HTTP\Client {
$response = $this->send($request);
if ((int)$response->getStatus() >= 400) {
- throw new \Sabre\HTTP\ClientHttpException($response);
+ throw new HTTP\ClientHttpException($response);
}
$result = $this->parseMultiStatus($response->getBodyAsString());
@@ -281,7 +281,7 @@ class Client extends HTTP\Client {
$response = $this->send($request);
if ($response->getStatus() >= 400) {
- throw new \Sabre\HTTP\ClientHttpException($response);
+ throw new HTTP\ClientHttpException($response);
}
if ($response->getStatus() === 207) {
@@ -303,7 +303,7 @@ class Client extends HTTP\Client {
}
if ($errorProperties) {
- throw new \Sabre\HTTP\ClientException('PROPPATCH failed. The following properties errored: ' . implode(', ', $errorProperties));
+ throw new HTTP\ClientException('PROPPATCH failed. The following properties errored: ' . implode(', ', $errorProperties));
}
}
return true;
diff --git a/vendor/sabre/dav/lib/DAV/Collection.php b/vendor/sabre/dav/lib/DAV/Collection.php
index a46bcc342..35c90b5af 100644
--- a/vendor/sabre/dav/lib/DAV/Collection.php
+++ b/vendor/sabre/dav/lib/DAV/Collection.php
@@ -68,7 +68,7 @@ abstract class Collection extends Node implements ICollection {
* 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
+ * 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
diff --git a/vendor/sabre/dav/lib/DAV/CorePlugin.php b/vendor/sabre/dav/lib/DAV/CorePlugin.php
index a1b052915..676cdd04a 100644
--- a/vendor/sabre/dav/lib/DAV/CorePlugin.php
+++ b/vendor/sabre/dav/lib/DAV/CorePlugin.php
@@ -165,7 +165,7 @@ class CorePlugin extends ServerPlugin {
} else {
$start = $nodeSize - $range[1];
- $end = $nodeSize - 1;
+ $end = $nodeSize - 1;
if ($start < 0) $start = 0;
@@ -194,7 +194,7 @@ class CorePlugin extends ServerPlugin {
$response->setBody($body);
}
- // Sending back false will interupt the event chain and tell the server
+ // Sending back false will interrupt the event chain and tell the server
// we've handled this method.
return false;
@@ -224,7 +224,7 @@ class CorePlugin extends ServerPlugin {
$response->setHeader('Content-Length', '0');
$response->setStatus(200);
- // Sending back false will interupt the event chain and tell the server
+ // Sending back false will interrupt the event chain and tell the server
// we've handled this method.
return false;
@@ -264,7 +264,7 @@ class CorePlugin extends ServerPlugin {
$response->setHeader('X-Sabre-Real-Status', $e->getHTTPCode());
}
- // Sending back false will interupt the event chain and tell the server
+ // Sending back false will interrupt the event chain and tell the server
// we've handled this method.
return false;
@@ -290,7 +290,7 @@ class CorePlugin extends ServerPlugin {
$response->setStatus(204);
$response->setHeader('Content-Length', '0');
- // Sending back false will interupt the event chain and tell the server
+ // Sending back false will interrupt the event chain and tell the server
// we've handled this method.
return false;
@@ -333,7 +333,7 @@ class CorePlugin extends ServerPlugin {
// The only two options for the depth of a propfind is 0 or 1 - as long as depth infinity is not enabled
if (!$this->server->enablePropfindDepthInfinity && $depth != 0) $depth = 1;
- $newProperties = $this->server->getPropertiesForPath($path, $propFindXml->properties, $depth);
+ $newProperties = $this->server->getPropertiesIteratorForPath($path, $propFindXml->properties, $depth);
// This is a multi-status response
$response->setStatus(207);
@@ -355,7 +355,7 @@ class CorePlugin extends ServerPlugin {
$data = $this->server->generateMultiStatus($newProperties, $minimal);
$response->setBody($data);
- // Sending back false will interupt the event chain and tell the server
+ // Sending back false will interrupt the event chain and tell the server
// we've handled this method.
return false;
@@ -390,7 +390,7 @@ class CorePlugin extends ServerPlugin {
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
+ // request was successful, and don't need to return the
// multi-status.
$ok = true;
foreach ($result as $prop => $code) {
@@ -427,7 +427,7 @@ class CorePlugin extends ServerPlugin {
$this->server->generateMultiStatus([$multiStatus])
);
- // Sending back false will interupt the event chain and tell the server
+ // Sending back false will interrupt the event chain and tell the server
// we've handled this method.
return false;
@@ -533,7 +533,7 @@ class CorePlugin extends ServerPlugin {
}
- // Sending back false will interupt the event chain and tell the server
+ // Sending back false will interrupt the event chain and tell the server
// we've handled this method.
return false;
@@ -602,7 +602,7 @@ class CorePlugin extends ServerPlugin {
$response->setStatus(201);
}
- // Sending back false will interupt the event chain and tell the server
+ // Sending back false will interrupt the event chain and tell the server
// we've handled this method.
return false;
@@ -653,7 +653,7 @@ class CorePlugin extends ServerPlugin {
$response->setHeader('Content-Length', '0');
$response->setStatus($moveInfo['destinationExists'] ? 204 : 201);
- // Sending back false will interupt the event chain and tell the server
+ // Sending back false will interrupt the event chain and tell the server
// we've handled this method.
return false;
@@ -688,7 +688,7 @@ class CorePlugin extends ServerPlugin {
$response->setHeader('Content-Length', '0');
$response->setStatus($copyInfo['destinationExists'] ? 204 : 201);
- // Sending back false will interupt the event chain and tell the server
+ // Sending back false will interrupt the event chain and tell the server
// we've handled this method.
return false;
@@ -722,7 +722,7 @@ class CorePlugin extends ServerPlugin {
}
- // Sending back false will interupt the event chain and tell the server
+ // Sending back false will interrupt the event chain and tell the server
// we've handled this method.
return false;
@@ -740,7 +740,7 @@ class CorePlugin extends ServerPlugin {
*/
function propPatchProtectedPropertyCheck($path, PropPatch $propPatch) {
- // Comparing the mutation list to the list of propetected properties.
+ // Comparing the mutation list to the list of protected properties.
$mutations = $propPatch->getMutations();
$protected = array_intersect(
diff --git a/vendor/sabre/dav/lib/DAV/Exception/InvalidResourceType.php b/vendor/sabre/dav/lib/DAV/Exception/InvalidResourceType.php
index 505fe5c10..6324d9f3a 100644
--- a/vendor/sabre/dav/lib/DAV/Exception/InvalidResourceType.php
+++ b/vendor/sabre/dav/lib/DAV/Exception/InvalidResourceType.php
@@ -19,7 +19,7 @@ class InvalidResourceType extends Forbidden {
/**
* This method allows the exception to include additional information into the WebDAV error response
*
- * @param DAV\Server $server
+ * @param \Sabre\DAV\Server $server
* @param \DOMElement $errorNode
* @return void
*/
diff --git a/vendor/sabre/dav/lib/DAV/FS/Node.php b/vendor/sabre/dav/lib/DAV/FS/Node.php
index 831c11911..424718f96 100644
--- a/vendor/sabre/dav/lib/DAV/FS/Node.php
+++ b/vendor/sabre/dav/lib/DAV/FS/Node.php
@@ -43,7 +43,7 @@ abstract class Node implements DAV\INode {
*/
function getName() {
- list(, $name) = URLUtil::splitPath($this->path);
+ list(, $name) = URLUtil::splitPath($this->path);
return $name;
}
diff --git a/vendor/sabre/dav/lib/DAV/File.php b/vendor/sabre/dav/lib/DAV/File.php
index 675956b22..5161fbd51 100644
--- a/vendor/sabre/dav/lib/DAV/File.php
+++ b/vendor/sabre/dav/lib/DAV/File.php
@@ -19,7 +19,7 @@ abstract class File extends Node implements IFile {
*
* The data argument is a readable stream resource.
*
- * After a succesful put operation, you may choose to return an ETag. The
+ * 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.
*
diff --git a/vendor/sabre/dav/lib/DAV/IFile.php b/vendor/sabre/dav/lib/DAV/IFile.php
index 37e7cd33c..19d8d8637 100644
--- a/vendor/sabre/dav/lib/DAV/IFile.php
+++ b/vendor/sabre/dav/lib/DAV/IFile.php
@@ -20,7 +20,7 @@ interface IFile extends INode {
*
* The data argument is a readable stream resource.
*
- * After a succesful put operation, you may choose to return an ETag. The
+ * 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.
*
@@ -32,7 +32,7 @@ interface IFile extends INode {
* different object on a subsequent GET you are strongly recommended to not
* return an ETag, and just return null.
*
- * @param resource|data $data
+ * @param resource|string $data
* @return string|null
*/
function put($data);
diff --git a/vendor/sabre/dav/lib/DAV/IMoveTarget.php b/vendor/sabre/dav/lib/DAV/IMoveTarget.php
index f0f67bc26..92fde1d5c 100644
--- a/vendor/sabre/dav/lib/DAV/IMoveTarget.php
+++ b/vendor/sabre/dav/lib/DAV/IMoveTarget.php
@@ -7,7 +7,7 @@ namespace Sabre\DAV;
* nodes may be moved into this collection".
*
* The benefit of this, is that sabre/dav will by default perform a move, by
- * tranfersing an entire directory tree, copying every collection, and deleting
+ * transferring an entire directory tree, copying every collection, and deleting
* every item.
*
* If a backend supports a better optimized move operation, this can trigger
diff --git a/vendor/sabre/dav/lib/DAV/Locks/Backend/PDO.php b/vendor/sabre/dav/lib/DAV/Locks/Backend/PDO.php
index a01d9bae4..510f266f7 100644
--- a/vendor/sabre/dav/lib/DAV/Locks/Backend/PDO.php
+++ b/vendor/sabre/dav/lib/DAV/Locks/Backend/PDO.php
@@ -33,7 +33,7 @@ class PDO extends AbstractBackend {
/**
* Constructor
*
- * @param PDO $pdo
+ * @param \PDO $pdo
*/
function __construct(\PDO $pdo) {
@@ -102,7 +102,7 @@ class PDO extends AbstractBackend {
$lockInfo->created = $row['created'];
$lockInfo->scope = $row['scope'];
$lockInfo->depth = $row['depth'];
- $lockInfo->uri = $row['uri'];
+ $lockInfo->uri = $row['uri'];
$lockList[] = $lockInfo;
}
diff --git a/vendor/sabre/dav/lib/DAV/Locks/Plugin.php b/vendor/sabre/dav/lib/DAV/Locks/Plugin.php
index 4855b7076..41a3bf3fa 100644
--- a/vendor/sabre/dav/lib/DAV/Locks/Plugin.php
+++ b/vendor/sabre/dav/lib/DAV/Locks/Plugin.php
@@ -25,14 +25,14 @@ class Plugin extends DAV\ServerPlugin {
/**
* locksBackend
*
- * @var Backend\Backend\Interface
+ * @var Backend\BackendInterface
*/
protected $locksBackend;
/**
* server
*
- * @var Sabre\DAV\Server
+ * @var DAV\Server
*/
protected $server;
@@ -256,7 +256,7 @@ class Plugin extends DAV\ServerPlugin {
$response->setStatus($newFile ? 201 : 200);
$response->setBody($this->generateLockResponse($lockInfo));
- // Returning false will interupt the event chain and mark this method
+ // Returning false will interrupt the event chain and mark this method
// as 'handled'.
return false;
diff --git a/vendor/sabre/dav/lib/DAV/MkCol.php b/vendor/sabre/dav/lib/DAV/MkCol.php
index c79055418..042e14bca 100644
--- a/vendor/sabre/dav/lib/DAV/MkCol.php
+++ b/vendor/sabre/dav/lib/DAV/MkCol.php
@@ -61,6 +61,7 @@ class MkCol extends PropPatch {
* checked.
*
* @param string|string[] $resourceType
+ * @return bool
*/
function hasResourceType($resourceType) {
diff --git a/vendor/sabre/dav/lib/DAV/Mount/Plugin.php b/vendor/sabre/dav/lib/DAV/Mount/Plugin.php
index 8e06acb9f..dc923ad85 100644
--- a/vendor/sabre/dav/lib/DAV/Mount/Plugin.php
+++ b/vendor/sabre/dav/lib/DAV/Mount/Plugin.php
@@ -20,7 +20,7 @@ class Plugin extends DAV\ServerPlugin {
/**
* Reference to Server class
*
- * @var Sabre\DAV\Server
+ * @var DAV\Server
*/
protected $server;
diff --git a/vendor/sabre/dav/lib/DAV/Node.php b/vendor/sabre/dav/lib/DAV/Node.php
index ba270e8f9..ef6eea18e 100644
--- a/vendor/sabre/dav/lib/DAV/Node.php
+++ b/vendor/sabre/dav/lib/DAV/Node.php
@@ -29,7 +29,7 @@ abstract class Node implements INode {
/**
* Deletes the current node
*
- * @throws Sabre\DAV\Exception\Forbidden
+ * @throws Exception\Forbidden
* @return void
*/
function delete() {
@@ -41,8 +41,8 @@ abstract class Node implements INode {
/**
* Renames the node
*
- * @throws Sabre\DAV\Exception\Forbidden
* @param string $name The new name
+ * @throws Exception\Forbidden
* @return void
*/
function setName($name) {
diff --git a/vendor/sabre/dav/lib/DAV/PartialUpdate/Plugin.php b/vendor/sabre/dav/lib/DAV/PartialUpdate/Plugin.php
index 24ba970b1..9c129d705 100644
--- a/vendor/sabre/dav/lib/DAV/PartialUpdate/Plugin.php
+++ b/vendor/sabre/dav/lib/DAV/PartialUpdate/Plugin.php
@@ -29,7 +29,7 @@ class Plugin extends DAV\ServerPlugin {
/**
* Reference to server
*
- * @var Sabre\DAV\Server
+ * @var DAV\Server
*/
protected $server;
diff --git a/vendor/sabre/dav/lib/DAV/PropFind.php b/vendor/sabre/dav/lib/DAV/PropFind.php
index 8ae6b6cfd..0940a1ce2 100644
--- a/vendor/sabre/dav/lib/DAV/PropFind.php
+++ b/vendor/sabre/dav/lib/DAV/PropFind.php
@@ -72,7 +72,7 @@ class PropFind {
/**
* Handles a specific property.
*
- * This method checks wether the specified property was requested in this
+ * This method checks whether the specified property was requested in this
* PROPFIND request, and if so, it will call the callback and use the
* return value for it's value.
*
diff --git a/vendor/sabre/dav/lib/DAV/PropertyStorage/Backend/BackendInterface.php b/vendor/sabre/dav/lib/DAV/PropertyStorage/Backend/BackendInterface.php
index 31ecafdb2..b15d7fef9 100644
--- a/vendor/sabre/dav/lib/DAV/PropertyStorage/Backend/BackendInterface.php
+++ b/vendor/sabre/dav/lib/DAV/PropertyStorage/Backend/BackendInterface.php
@@ -23,7 +23,7 @@ interface BackendInterface {
* This method received a PropFind object, which contains all the
* information about the properties that need to be fetched.
*
- * Ususually you would just want to call 'get404Properties' on this object,
+ * Usually you would just want to call 'get404Properties' on this object,
* as this will give you the _exact_ list of properties that need to be
* fetched, and haven't yet.
*
diff --git a/vendor/sabre/dav/lib/DAV/PropertyStorage/Backend/PDO.php b/vendor/sabre/dav/lib/DAV/PropertyStorage/Backend/PDO.php
index 2fe843884..6f3f1feaf 100644
--- a/vendor/sabre/dav/lib/DAV/PropertyStorage/Backend/PDO.php
+++ b/vendor/sabre/dav/lib/DAV/PropertyStorage/Backend/PDO.php
@@ -66,7 +66,7 @@ class PDO implements BackendInterface {
* This method received a PropFind object, which contains all the
* information about the properties that need to be fetched.
*
- * Ususually you would just want to call 'get404Properties' on this object,
+ * Usually you would just want to call 'get404Properties' on this object,
* as this will give you the _exact_ list of properties that need to be
* fetched, and haven't yet.
*
diff --git a/vendor/sabre/dav/lib/DAV/PropertyStorage/Plugin.php b/vendor/sabre/dav/lib/DAV/PropertyStorage/Plugin.php
index 0c28b7882..a66a14113 100644
--- a/vendor/sabre/dav/lib/DAV/PropertyStorage/Plugin.php
+++ b/vendor/sabre/dav/lib/DAV/PropertyStorage/Plugin.php
@@ -2,11 +2,11 @@
namespace Sabre\DAV\PropertyStorage;
+use Sabre\DAV\INode;
+use Sabre\DAV\PropFind;
+use Sabre\DAV\PropPatch;
use Sabre\DAV\Server;
use Sabre\DAV\ServerPlugin;
-use Sabre\DAV\PropPatch;
-use Sabre\DAV\PropFind;
-use Sabre\DAV\INode;
/**
* PropertyStorage Plugin.
@@ -30,7 +30,7 @@ class Plugin extends ServerPlugin {
* paths, you can use a pathFilter to do this.
*
* The pathFilter should be a callable. The callable retrieves a path as
- * its argument, and should return true or false wether it allows
+ * its argument, and should return true or false whether it allows
* properties to be stored.
*
* @var callable
@@ -38,6 +38,11 @@ class Plugin extends ServerPlugin {
public $pathFilter;
/**
+ * @var Backend\BackendInterface
+ */
+ public $backend;
+
+ /**
* Creates the plugin
*
* @param Backend\BackendInterface $backend
diff --git a/vendor/sabre/dav/lib/DAV/Server.php b/vendor/sabre/dav/lib/DAV/Server.php
index 024b7a557..6805ec0b0 100644
--- a/vendor/sabre/dav/lib/DAV/Server.php
+++ b/vendor/sabre/dav/lib/DAV/Server.php
@@ -2,16 +2,16 @@
namespace Sabre\DAV;
+use Psr\Log\LoggerAwareInterface;
+use Psr\Log\LoggerAwareTrait;
+use Psr\Log\LoggerInterface;
+use Psr\Log\NullLogger;
use Sabre\Event\EventEmitter;
use Sabre\HTTP;
use Sabre\HTTP\RequestInterface;
use Sabre\HTTP\ResponseInterface;
use Sabre\HTTP\URLUtil;
use Sabre\Uri;
-use Psr\Log\LoggerAwareInterface;
-use Psr\Log\LoggerAwareTrait;
-use Psr\Log\LoggerInterface;
-use Psr\Log\NullLogger;
/**
* Main DAV server class
@@ -37,7 +37,7 @@ class Server extends EventEmitter implements LoggerAwareInterface {
/**
* The tree object
*
- * @var Sabre\DAV\Tree
+ * @var Tree
*/
public $tree;
@@ -51,21 +51,21 @@ class Server extends EventEmitter implements LoggerAwareInterface {
/**
* httpResponse
*
- * @var Sabre\HTTP\Response
+ * @var HTTP\Response
*/
public $httpResponse;
/**
* httpRequest
*
- * @var Sabre\HTTP\Request
+ * @var HTTP\Request
*/
public $httpRequest;
/**
* PHP HTTP Sapi
*
- * @var Sabre\HTTP\Sapi
+ * @var HTTP\Sapi
*/
public $sapi;
@@ -437,7 +437,7 @@ class Server extends EventEmitter implements LoggerAwareInterface {
}
/**
- * Returns the PSR-3 logger objcet.
+ * Returns the PSR-3 logger object.
*
* @return LoggerInterface
*/
@@ -455,7 +455,7 @@ class Server extends EventEmitter implements LoggerAwareInterface {
*
* @param RequestInterface $request
* @param ResponseInterface $response
- * @param $sendResponse Whether to send the HTTP response to the DAV client.
+ * @param bool $sendResponse Whether to send the HTTP response to the DAV client.
* @return void
*/
function invokeMethod(RequestInterface $request, ResponseInterface $response, $sendResponse = true) {
@@ -681,18 +681,18 @@ class Server extends EventEmitter implements LoggerAwareInterface {
// can be true or false
'respond-async' => false,
// Could be set to 'representation' or 'minimal'.
- 'return' => null,
+ 'return' => null,
// Used as a timeout, is usually a number.
- 'wait' => null,
+ 'wait' => null,
// can be 'strict' or 'lenient'.
- 'handling' => false,
+ 'handling' => false,
];
if ($prefer = $this->httpRequest->getHeader('Prefer')) {
$result = array_merge(
$result,
- \Sabre\HTTP\parsePrefer($prefer)
+ HTTP\parsePrefer($prefer)
);
} elseif ($this->httpRequest->getHeader('Brief') == 't') {
@@ -794,6 +794,7 @@ class Server extends EventEmitter implements LoggerAwareInterface {
*
* @param string $path
* @param array $propertyNames
+ * @return array
*/
function getProperties($path, $propertyNames) {
@@ -877,12 +878,14 @@ class Server extends EventEmitter implements LoggerAwareInterface {
/**
* Small helper to support PROPFIND with DEPTH_INFINITY.
*
- * @param array[] $propFindRequests
* @param PropFind $propFind
- * @return void
+ * @param array $yieldFirst
+ * @return \Iterator
*/
- private function addPathNodesRecursively(&$propFindRequests, PropFind $propFind) {
-
+ private function generatePathNodes(PropFind $propFind, array $yieldFirst = null) {
+ if ($yieldFirst !== null) {
+ yield $yieldFirst;
+ }
$newDepth = $propFind->getDepth();
$path = $propFind->getPath();
@@ -900,13 +903,15 @@ class Server extends EventEmitter implements LoggerAwareInterface {
}
$subPropFind->setPath($subPath);
- $propFindRequests[] = [
+ yield [
$subPropFind,
$childNode
];
if (($newDepth === self::DEPTH_INFINITY || $newDepth >= 1) && $childNode instanceof ICollection) {
- $this->addPathNodesRecursively($propFindRequests, $subPropFind);
+ foreach ($this->generatePathNodes($subPropFind) as $subItem) {
+ yield $subItem;
+ }
}
}
@@ -925,9 +930,31 @@ class Server extends EventEmitter implements LoggerAwareInterface {
* @param array $propertyNames
* @param int $depth
* @return array
+ *
+ * @deprecated Use getPropertiesIteratorForPath() instead (as it's more memory efficient)
+ * @see getPropertiesIteratorForPath()
*/
function getPropertiesForPath($path, $propertyNames = [], $depth = 0) {
+ return iterator_to_array($this->getPropertiesIteratorForPath($path, $propertyNames, $depth));
+
+ }
+ /**
+ * 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 \Iterator
+ */
+ function getPropertiesIteratorForPath($path, $propertyNames = [], $depth = 0) {
+
// The only two options for the depth of a propfind is 0 or 1 - as long as depth infinity is not enabled
if (!$this->enablePropfindDepthInfinity && $depth != 0) $depth = 1;
@@ -944,11 +971,9 @@ class Server extends EventEmitter implements LoggerAwareInterface {
]];
if (($depth > 0 || $depth === self::DEPTH_INFINITY) && $parentNode instanceof ICollection) {
- $this->addPathNodesRecursively($propFindRequests, $propFind);
+ $propFindRequests = $this->generatePathNodes(clone $propFind, current($propFindRequests));
}
- $returnPropertyList = [];
-
foreach ($propFindRequests as $propFindRequest) {
list($propFind, $node) = $propFindRequest;
@@ -965,13 +990,11 @@ class Server extends EventEmitter implements LoggerAwareInterface {
if (in_array('{DAV:}collection', $resourceType) || in_array('{DAV:}principal', $resourceType)) {
$result['href'] .= '/';
}
- $returnPropertyList[] = $result;
+ yield $result;
}
}
- return $returnPropertyList;
-
}
/**
@@ -1430,7 +1453,7 @@ class Server extends EventEmitter implements LoggerAwareInterface {
// Plugins are responsible for validating all the tokens.
// If a plugin deemed a token 'valid', it will set 'validToken' to
// true.
- $this->emit('validateTokens', [ $request, &$ifConditions ]);
+ $this->emit('validateTokens', [$request, &$ifConditions]);
// Now we're going to analyze the result.
@@ -1450,7 +1473,7 @@ class Server extends EventEmitter implements LoggerAwareInterface {
if (!$token['etag']) {
$etagValid = true;
}
- // Checking the ETag, only if the token was already deamed
+ // Checking the ETag, only if the token was already deemed
// valid and there is one.
if ($token['etag'] && $tokenValid) {
@@ -1626,13 +1649,18 @@ class Server extends EventEmitter implements LoggerAwareInterface {
*
* If 'strip404s' is set to true, all 404 responses will be removed.
*
- * @param array $fileProperties The list with nodes
- * @param bool strip404s
+ * @param array|\Traversable $fileProperties The list with nodes
+ * @param bool $strip404s
* @return string
*/
- function generateMultiStatus(array $fileProperties, $strip404s = false) {
+ function generateMultiStatus($fileProperties, $strip404s = false) {
- $xml = [];
+ $w = $this->xml->getWriter();
+ $w->openMemory();
+ $w->contextUri = $this->baseUri;
+ $w->startDocument();
+
+ $w->startElement('{DAV:}multistatus');
foreach ($fileProperties as $entry) {
@@ -1645,13 +1673,14 @@ class Server extends EventEmitter implements LoggerAwareInterface {
ltrim($href, '/'),
$entry
);
- $xml[] = [
+ $w->write([
'name' => '{DAV:}response',
'value' => $response
- ];
-
+ ]);
}
- return $this->xml->write('{DAV:}multistatus', $xml, $this->baseUri);
+ $w->endElement();
+
+ return $w->outputMemory();
}
diff --git a/vendor/sabre/dav/lib/DAV/Sharing/Plugin.php b/vendor/sabre/dav/lib/DAV/Sharing/Plugin.php
index 354d06a56..ef5702c57 100644
--- a/vendor/sabre/dav/lib/DAV/Sharing/Plugin.php
+++ b/vendor/sabre/dav/lib/DAV/Sharing/Plugin.php
@@ -8,8 +8,8 @@ use Sabre\DAV\INode;
use Sabre\DAV\PropFind;
use Sabre\DAV\Server;
use Sabre\DAV\ServerPlugin;
-use Sabre\DAV\Xml\Property;
use Sabre\DAV\Xml\Element\Sharee;
+use Sabre\DAV\Xml\Property;
use Sabre\HTTP\RequestInterface;
use Sabre\HTTP\ResponseInterface;
@@ -40,7 +40,7 @@ class Plugin extends ServerPlugin {
/**
* Reference to SabreDAV server object.
*
- * @var Sabre\DAV\Server
+ * @var Server
*/
protected $server;
diff --git a/vendor/sabre/dav/lib/DAV/Sync/Plugin.php b/vendor/sabre/dav/lib/DAV/Sync/Plugin.php
index 4a141c72b..8e4b1aa64 100644
--- a/vendor/sabre/dav/lib/DAV/Sync/Plugin.php
+++ b/vendor/sabre/dav/lib/DAV/Sync/Plugin.php
@@ -3,8 +3,8 @@
namespace Sabre\DAV\Sync;
use Sabre\DAV;
-use Sabre\HTTP\RequestInterface;
use Sabre\DAV\Xml\Request\SyncCollectionReport;
+use Sabre\HTTP\RequestInterface;
/**
* This plugin all WebDAV-sync capabilities to the Server.
diff --git a/vendor/sabre/dav/lib/DAV/TemporaryFileFilterPlugin.php b/vendor/sabre/dav/lib/DAV/TemporaryFileFilterPlugin.php
index c5b8aa1ca..7b453d105 100644
--- a/vendor/sabre/dav/lib/DAV/TemporaryFileFilterPlugin.php
+++ b/vendor/sabre/dav/lib/DAV/TemporaryFileFilterPlugin.php
@@ -14,7 +14,7 @@ use Sabre\HTTP\URLUtil;
* 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
+ * these files are not deleted automatically, so it is advisable to
* delete these after they are not accessed for 24 hours.
*
* Currently it supports:
@@ -51,7 +51,7 @@ class TemporaryFileFilterPlugin extends ServerPlugin {
/**
* A reference to the main Server class
*
- * @var Sabre\DAV\Server
+ * @var \Sabre\DAV\Server
*/
protected $server;
@@ -134,12 +134,12 @@ class TemporaryFileFilterPlugin extends ServerPlugin {
*
* @param string $uri
* @param resource $data
- * @param DAV\ICollection $parentNode
+ * @param ICollection $parent
* @param bool $modified Should be set to true, if this event handler
* changed &$data.
* @return bool
*/
- function beforeCreateFile($uri, $data, $parent, $modified) {
+ function beforeCreateFile($uri, $data, ICollection $parent, $modified) {
if ($tempPath = $this->isTempFile($uri)) {
diff --git a/vendor/sabre/dav/lib/DAV/Version.php b/vendor/sabre/dav/lib/DAV/Version.php
index 2fda85db8..89918e5bc 100644
--- a/vendor/sabre/dav/lib/DAV/Version.php
+++ b/vendor/sabre/dav/lib/DAV/Version.php
@@ -14,6 +14,6 @@ class Version {
/**
* Full version number
*/
- const VERSION = '3.2.0';
+ const VERSION = '3.2.2';
}
diff --git a/vendor/sabre/dav/lib/DAV/Xml/Element/Prop.php b/vendor/sabre/dav/lib/DAV/Xml/Element/Prop.php
index db5332c50..71ef03e3f 100644
--- a/vendor/sabre/dav/lib/DAV/Xml/Element/Prop.php
+++ b/vendor/sabre/dav/lib/DAV/Xml/Element/Prop.php
@@ -3,8 +3,8 @@
namespace Sabre\DAV\Xml\Element;
use Sabre\DAV\Xml\Property\Complex;
-use Sabre\Xml\XmlDeserializable;
use Sabre\Xml\Reader;
+use Sabre\Xml\XmlDeserializable;
/**
* This class is responsible for decoding the {DAV:}prop element as it appears
@@ -22,7 +22,7 @@ class Prop implements XmlDeserializable {
/**
* The deserialize method is called during xml parsing.
*
- * This method is called statictly, this is because in theory this method
+ * This method is called statically, this is because in theory this method
* may be used as a type of constructor, or factory method.
*
* Often you want to return an instance of the current class, but you are
@@ -90,7 +90,7 @@ class Prop implements XmlDeserializable {
if (array_key_exists($name, $reader->elementMap)) {
$deserializer = $reader->elementMap[$name];
if (is_subclass_of($deserializer, 'Sabre\\Xml\\XmlDeserializable')) {
- $value = call_user_func([ $deserializer, 'xmlDeserialize' ], $reader);
+ $value = call_user_func([$deserializer, 'xmlDeserialize'], $reader);
} elseif (is_callable($deserializer)) {
$value = call_user_func($deserializer, $reader);
} else {
diff --git a/vendor/sabre/dav/lib/DAV/Xml/Element/Response.php b/vendor/sabre/dav/lib/DAV/Xml/Element/Response.php
index 97a2bb59f..ce97ae943 100644
--- a/vendor/sabre/dav/lib/DAV/Xml/Element/Response.php
+++ b/vendor/sabre/dav/lib/DAV/Xml/Element/Response.php
@@ -160,7 +160,7 @@ class Response implements Element {
/**
* The deserialize method is called during xml parsing.
*
- * This method is called statictly, this is because in theory this method
+ * This method is called statically, this is because in theory this method
* may be used as a type of constructor, or factory method.
*
* Often you want to return an instance of the current class, but you are
diff --git a/vendor/sabre/dav/lib/DAV/Xml/Element/Sharee.php b/vendor/sabre/dav/lib/DAV/Xml/Element/Sharee.php
index dcfd7bd2e..e187bf11c 100644
--- a/vendor/sabre/dav/lib/DAV/Xml/Element/Sharee.php
+++ b/vendor/sabre/dav/lib/DAV/Xml/Element/Sharee.php
@@ -105,7 +105,7 @@ class Sharee implements Element {
* Use the $writer argument to write its own xml serialization.
*
* An important note: do _not_ create a parent element. Any element
- * implementing XmlSerializble should only ever write what's considered
+ * implementing XmlSerializable should only ever write what's considered
* its 'inner xml'.
*
* The parent of the current element is responsible for writing a
@@ -146,7 +146,7 @@ class Sharee implements Element {
/**
* The deserialize method is called during xml parsing.
*
- * This method is called statictly, this is because in theory this method
+ * This method is called statically, this is because in theory this method
* may be used as a type of constructor, or factory method.
*
* Often you want to return an instance of the current class, but you are
diff --git a/vendor/sabre/dav/lib/DAV/Xml/Property/Complex.php b/vendor/sabre/dav/lib/DAV/Xml/Property/Complex.php
index 1d9202082..258806e4a 100644
--- a/vendor/sabre/dav/lib/DAV/Xml/Property/Complex.php
+++ b/vendor/sabre/dav/lib/DAV/Xml/Property/Complex.php
@@ -20,7 +20,7 @@ class Complex extends XmlFragment {
/**
* The deserialize method is called during xml parsing.
*
- * This method is called statictly, this is because in theory this method
+ * This method is called statically, this is because in theory this method
* may be used as a type of constructor, or factory method.
*
* Often you want to return an instance of the current class, but you are
diff --git a/vendor/sabre/dav/lib/DAV/Xml/Property/GetLastModified.php b/vendor/sabre/dav/lib/DAV/Xml/Property/GetLastModified.php
index 2db47269f..101a0f0c9 100644
--- a/vendor/sabre/dav/lib/DAV/Xml/Property/GetLastModified.php
+++ b/vendor/sabre/dav/lib/DAV/Xml/Property/GetLastModified.php
@@ -2,12 +2,12 @@
namespace Sabre\DAV\Xml\Property;
+use DateTime;
+use DateTimeZone;
+use Sabre\HTTP;
use Sabre\Xml\Element;
use Sabre\Xml\Reader;
use Sabre\Xml\Writer;
-use Sabre\HTTP;
-use DateTime;
-use DateTimeZone;
/**
* This property represents the {DAV:}getlastmodified property.
@@ -83,7 +83,7 @@ class GetLastModified implements Element {
/**
* The deserialize method is called during xml parsing.
*
- * This method is called statictly, this is because in theory this method
+ * This method is called statically, this is because in theory this method
* may be used as a type of constructor, or factory method.
*
* Often you want to return an instance of the current class, but you are
diff --git a/vendor/sabre/dav/lib/DAV/Xml/Property/Href.php b/vendor/sabre/dav/lib/DAV/Xml/Property/Href.php
index 0027f72e1..6c4f11b87 100644
--- a/vendor/sabre/dav/lib/DAV/Xml/Property/Href.php
+++ b/vendor/sabre/dav/lib/DAV/Xml/Property/Href.php
@@ -4,10 +4,10 @@ namespace Sabre\DAV\Xml\Property;
use Sabre\DAV\Browser\HtmlOutput;
use Sabre\DAV\Browser\HtmlOutputHelper;
+use Sabre\Uri;
use Sabre\Xml\Element;
use Sabre\Xml\Reader;
use Sabre\Xml\Writer;
-use Sabre\Uri;
/**
* Href property
@@ -40,7 +40,7 @@ class Href implements Element, HtmlOutput {
* If auto-prefix is set to false, the hrefs will be treated as absolute
* and not relative to the servers base uri.
*
- * @param string|string[] $href
+ * @param string|string[] $hrefs
*/
function __construct($hrefs) {
@@ -74,12 +74,12 @@ class Href implements Element, HtmlOutput {
}
/**
- * The xmlSerialize metod is called during xml writing.
+ * The xmlSerialize method is called during xml writing.
*
* Use the $writer argument to write its own xml serialization.
*
* An important note: do _not_ create a parent element. Any element
- * implementing XmlSerializble should only ever write what's considered
+ * implementing XmlSerializable should only ever write what's considered
* its 'inner xml'.
*
* The parent of the current element is responsible for writing a
@@ -128,7 +128,7 @@ class Href implements Element, HtmlOutput {
/**
* The deserialize method is called during xml parsing.
*
- * This method is called statictly, this is because in theory this method
+ * This method is called statically, this is because in theory this method
* may be used as a type of constructor, or factory method.
*
* Often you want to return an instance of the current class, but you are
diff --git a/vendor/sabre/dav/lib/DAV/Xml/Property/Invite.php b/vendor/sabre/dav/lib/DAV/Xml/Property/Invite.php
index 0616ff113..6adad3650 100644
--- a/vendor/sabre/dav/lib/DAV/Xml/Property/Invite.php
+++ b/vendor/sabre/dav/lib/DAV/Xml/Property/Invite.php
@@ -2,9 +2,9 @@
namespace Sabre\DAV\Xml\Property;
-use Sabre\DAV\Sharing\Sharee;
-use Sabre\Xml\XmlSerializable;
+use Sabre\DAV\Xml\Element\Sharee;
use Sabre\Xml\Writer;
+use Sabre\Xml\XmlSerializable;
/**
* This class represents the {DAV:}invite property.
@@ -46,7 +46,7 @@ class Invite implements XmlSerializable {
* Use the $writer argument to write its own xml serialization.
*
* An important note: do _not_ create a parent element. Any element
- * implementing XmlSerializble should only ever write what's considered
+ * implementing XmlSerializable should only ever write what's considered
* its 'inner xml'.
*
* The parent of the current element is responsible for writing a
diff --git a/vendor/sabre/dav/lib/DAV/Xml/Property/LocalHref.php b/vendor/sabre/dav/lib/DAV/Xml/Property/LocalHref.php
index 76a27b95d..00d2fa708 100644
--- a/vendor/sabre/dav/lib/DAV/Xml/Property/LocalHref.php
+++ b/vendor/sabre/dav/lib/DAV/Xml/Property/LocalHref.php
@@ -8,7 +8,7 @@ use Sabre\HTTP;
* LocalHref property
*
* Like the Href property, this element represents {DAV:}href. The difference
- * is that this is used stricly for paths on the server. The LocalHref property
+ * is that this is used strictly for paths on the server. The LocalHref property
* will prepare the path so it's a valid URI.
*
* These two objects behave identically:
@@ -32,7 +32,7 @@ class LocalHref extends Href {
* If auto-prefix is set to false, the hrefs will be treated as absolute
* and not relative to the servers base uri.
*
- * @param string|string[] $href
+ * @param string|string[] $hrefs
*/
function __construct($hrefs) {
diff --git a/vendor/sabre/dav/lib/DAV/Xml/Property/ResourceType.php b/vendor/sabre/dav/lib/DAV/Xml/Property/ResourceType.php
index 302888321..ce640ff32 100644
--- a/vendor/sabre/dav/lib/DAV/Xml/Property/ResourceType.php
+++ b/vendor/sabre/dav/lib/DAV/Xml/Property/ResourceType.php
@@ -28,7 +28,7 @@ class ResourceType extends Element\Elements implements HtmlOutput {
*
* The resourcetype must be specified in clark-notation
*
- * @param array|string|null $resourceType
+ * @param array|string|null $resourceTypes
*/
function __construct($resourceTypes = null) {
@@ -77,7 +77,7 @@ class ResourceType extends Element\Elements implements HtmlOutput {
/**
* The deserialize method is called during xml parsing.
*
- * This method is called statictly, this is because in theory this method
+ * This method is called statically, this is because in theory this method
* may be used as a type of constructor, or factory method.
*
* Often you want to return an instance of the current class, but you are
diff --git a/vendor/sabre/dav/lib/DAV/Xml/Property/ShareAccess.php b/vendor/sabre/dav/lib/DAV/Xml/Property/ShareAccess.php
index a3fc6b0e1..939062f76 100644
--- a/vendor/sabre/dav/lib/DAV/Xml/Property/ShareAccess.php
+++ b/vendor/sabre/dav/lib/DAV/Xml/Property/ShareAccess.php
@@ -2,8 +2,8 @@
namespace Sabre\DAV\Xml\Property;
-use Sabre\DAV\Sharing\Plugin as SharingPlugin;
use Sabre\DAV\Exception\BadRequest;
+use Sabre\DAV\Sharing\Plugin as SharingPlugin;
use Sabre\Xml\Element;
use Sabre\Xml\Reader;
use Sabre\Xml\Writer;
@@ -62,7 +62,7 @@ class ShareAccess implements Element {
* Use the $writer argument to write its own xml serialization.
*
* An important note: do _not_ create a parent element. Any element
- * implementing XmlSerializble should only ever write what's considered
+ * implementing XmlSerializable should only ever write what's considered
* its 'inner xml'.
*
* The parent of the current element is responsible for writing a
@@ -102,7 +102,7 @@ class ShareAccess implements Element {
/**
* The deserialize method is called during xml parsing.
*
- * This method is called statictly, this is because in theory this method
+ * This method is called statically, this is because in theory this method
* may be used as a type of constructor, or factory method.
*
* Often you want to return an instance of the current class, but you are
diff --git a/vendor/sabre/dav/lib/DAV/Xml/Property/SupportedLock.php b/vendor/sabre/dav/lib/DAV/Xml/Property/SupportedLock.php
index f6d01aa37..677fdde4b 100644
--- a/vendor/sabre/dav/lib/DAV/Xml/Property/SupportedLock.php
+++ b/vendor/sabre/dav/lib/DAV/Xml/Property/SupportedLock.php
@@ -21,12 +21,12 @@ use Sabre\Xml\XmlSerializable;
class SupportedLock implements XmlSerializable {
/**
- * The xmlSerialize metod is called during xml writing.
+ * The xmlSerialize method is called during xml writing.
*
* Use the $writer argument to write its own xml serialization.
*
* An important note: do _not_ create a parent element. Any element
- * implementing XmlSerializble should only ever write what's considered
+ * implementing XmlSerializable should only ever write what's considered
* its 'inner xml'.
*
* The parent of the current element is responsible for writing a
@@ -43,11 +43,11 @@ class SupportedLock implements XmlSerializable {
$writer->writeElement('{DAV:}lockentry', [
'{DAV:}lockscope' => ['{DAV:}exclusive' => null],
- '{DAV:}locktype' => ['{DAV:}write' => null],
+ '{DAV:}locktype' => ['{DAV:}write' => null],
]);
$writer->writeElement('{DAV:}lockentry', [
'{DAV:}lockscope' => ['{DAV:}shared' => null],
- '{DAV:}locktype' => ['{DAV:}write' => null],
+ '{DAV:}locktype' => ['{DAV:}write' => null],
]);
}
diff --git a/vendor/sabre/dav/lib/DAV/Xml/Property/SupportedMethodSet.php b/vendor/sabre/dav/lib/DAV/Xml/Property/SupportedMethodSet.php
index 7641f3739..1a3878ef7 100644
--- a/vendor/sabre/dav/lib/DAV/Xml/Property/SupportedMethodSet.php
+++ b/vendor/sabre/dav/lib/DAV/Xml/Property/SupportedMethodSet.php
@@ -67,12 +67,12 @@ class SupportedMethodSet implements XmlSerializable, HtmlOutput {
}
/**
- * The xmlSerialize metod is called during xml writing.
+ * The xmlSerialize method is called during xml writing.
*
* Use the $writer argument to write its own xml serialization.
*
* An important note: do _not_ create a parent element. Any element
- * implementing XmlSerializble should only ever write what's considered
+ * implementing XmlSerializable should only ever write what's considered
* its 'inner xml'.
*
* The parent of the current element is responsible for writing a
diff --git a/vendor/sabre/dav/lib/DAV/Xml/Property/SupportedReportSet.php b/vendor/sabre/dav/lib/DAV/Xml/Property/SupportedReportSet.php
index ebf27300d..96383ec96 100644
--- a/vendor/sabre/dav/lib/DAV/Xml/Property/SupportedReportSet.php
+++ b/vendor/sabre/dav/lib/DAV/Xml/Property/SupportedReportSet.php
@@ -98,12 +98,12 @@ class SupportedReportSet implements XmlSerializable, HtmlOutput {
}
/**
- * The xmlSerialize metod is called during xml writing.
+ * The xmlSerialize method is called during xml writing.
*
* Use the $writer argument to write its own xml serialization.
*
* An important note: do _not_ create a parent element. Any element
- * implementing XmlSerializble should only ever write what's considered
+ * implementing XmlSerializable should only ever write what's considered
* its 'inner xml'.
*
* The parent of the current element is responsible for writing a
diff --git a/vendor/sabre/dav/lib/DAV/Xml/Request/Lock.php b/vendor/sabre/dav/lib/DAV/Xml/Request/Lock.php
index 76df98d13..c315a9a45 100644
--- a/vendor/sabre/dav/lib/DAV/Xml/Request/Lock.php
+++ b/vendor/sabre/dav/lib/DAV/Xml/Request/Lock.php
@@ -38,7 +38,7 @@ class Lock implements XmlDeserializable {
/**
* The deserialize method is called during xml parsing.
*
- * This method is called statictly, this is because in theory this method
+ * This method is called statically, this is because in theory this method
* may be used as a type of constructor, or factory method.
*
* Often you want to return an instance of the current class, but you are
diff --git a/vendor/sabre/dav/lib/DAV/Xml/Request/MkCol.php b/vendor/sabre/dav/lib/DAV/Xml/Request/MkCol.php
index 5db239061..9490bf58c 100644
--- a/vendor/sabre/dav/lib/DAV/Xml/Request/MkCol.php
+++ b/vendor/sabre/dav/lib/DAV/Xml/Request/MkCol.php
@@ -40,7 +40,7 @@ class MkCol implements XmlDeserializable {
/**
* The deserialize method is called during xml parsing.
*
- * This method is called statictly, this is because in theory this method
+ * This method is called statically, this is because in theory this method
* may be used as a type of constructor, or factory method.
*
* Often you want to return an instance of the current class, but you are
@@ -63,8 +63,8 @@ class MkCol implements XmlDeserializable {
$self = new self();
$elementMap = $reader->elementMap;
- $elementMap['{DAV:}prop'] = 'Sabre\DAV\Xml\Element\Prop';
- $elementMap['{DAV:}set'] = 'Sabre\Xml\Element\KeyValue';
+ $elementMap['{DAV:}prop'] = 'Sabre\DAV\Xml\Element\Prop';
+ $elementMap['{DAV:}set'] = 'Sabre\Xml\Element\KeyValue';
$elementMap['{DAV:}remove'] = 'Sabre\Xml\Element\KeyValue';
$elems = $reader->parseInnerTree($elementMap);
diff --git a/vendor/sabre/dav/lib/DAV/Xml/Request/PropFind.php b/vendor/sabre/dav/lib/DAV/Xml/Request/PropFind.php
index ad3ad7c43..f1b5b6fdc 100644
--- a/vendor/sabre/dav/lib/DAV/Xml/Request/PropFind.php
+++ b/vendor/sabre/dav/lib/DAV/Xml/Request/PropFind.php
@@ -36,7 +36,7 @@ class PropFind implements XmlDeserializable {
/**
* The deserialize method is called during xml parsing.
*
- * This method is called statictly, this is because in theory this method
+ * This method is called statically, this is because in theory this method
* may be used as a type of constructor, or factory method.
*
* Often you want to return an instance of the current class, but you are
diff --git a/vendor/sabre/dav/lib/DAV/Xml/Request/PropPatch.php b/vendor/sabre/dav/lib/DAV/Xml/Request/PropPatch.php
index 07a05f887..821b9e047 100644
--- a/vendor/sabre/dav/lib/DAV/Xml/Request/PropPatch.php
+++ b/vendor/sabre/dav/lib/DAV/Xml/Request/PropPatch.php
@@ -29,12 +29,12 @@ class PropPatch implements Element {
public $properties = [];
/**
- * The xmlSerialize metod is called during xml writing.
+ * The xmlSerialize method is called during xml writing.
*
* Use the $writer argument to write its own xml serialization.
*
* An important note: do _not_ create a parent element. Any element
- * implementing XmlSerializble should only ever write what's considered
+ * implementing XmlSerializable should only ever write what's considered
* its 'inner xml'.
*
* The parent of the current element is responsible for writing a
@@ -68,7 +68,7 @@ class PropPatch implements Element {
/**
* The deserialize method is called during xml parsing.
*
- * This method is called statictly, this is because in theory this method
+ * This method is called statically, this is because in theory this method
* may be used as a type of constructor, or factory method.
*
* Often you want to return an instance of the current class, but you are
@@ -91,8 +91,8 @@ class PropPatch implements Element {
$self = new self();
$elementMap = $reader->elementMap;
- $elementMap['{DAV:}prop'] = 'Sabre\DAV\Xml\Element\Prop';
- $elementMap['{DAV:}set'] = 'Sabre\Xml\Element\KeyValue';
+ $elementMap['{DAV:}prop'] = 'Sabre\DAV\Xml\Element\Prop';
+ $elementMap['{DAV:}set'] = 'Sabre\Xml\Element\KeyValue';
$elementMap['{DAV:}remove'] = 'Sabre\Xml\Element\KeyValue';
$elems = $reader->parseInnerTree($elementMap);
diff --git a/vendor/sabre/dav/lib/DAV/Xml/Request/ShareResource.php b/vendor/sabre/dav/lib/DAV/Xml/Request/ShareResource.php
index 965e5857c..526a4eb6f 100644
--- a/vendor/sabre/dav/lib/DAV/Xml/Request/ShareResource.php
+++ b/vendor/sabre/dav/lib/DAV/Xml/Request/ShareResource.php
@@ -2,9 +2,9 @@
namespace Sabre\DAV\Xml\Request;
+use Sabre\DAV\Xml\Element\Sharee;
use Sabre\Xml\Reader;
use Sabre\Xml\XmlDeserializable;
-use Sabre\DAV\Xml\Element\Sharee;
/**
* ShareResource request parser.
@@ -40,7 +40,7 @@ class ShareResource implements XmlDeserializable {
/**
* The deserialize method is called during xml parsing.
*
- * This method is called statictly, this is because in theory this method
+ * This method is called statically, this is because in theory this method
* may be used as a type of constructor, or factory method.
*
* Often you want to return an instance of the current class, but you are
diff --git a/vendor/sabre/dav/lib/DAV/Xml/Request/SyncCollectionReport.php b/vendor/sabre/dav/lib/DAV/Xml/Request/SyncCollectionReport.php
index 3092ada47..830293a01 100644
--- a/vendor/sabre/dav/lib/DAV/Xml/Request/SyncCollectionReport.php
+++ b/vendor/sabre/dav/lib/DAV/Xml/Request/SyncCollectionReport.php
@@ -2,10 +2,10 @@
namespace Sabre\DAV\Xml\Request;
+use Sabre\DAV\Exception\BadRequest;
+use Sabre\Xml\Element\KeyValue;
use Sabre\Xml\Reader;
use Sabre\Xml\XmlDeserializable;
-use Sabre\Xml\Element\KeyValue;
-use Sabre\DAV\Exception\BadRequest;
/**
* SyncCollection request parser.
@@ -51,7 +51,7 @@ class SyncCollectionReport implements XmlDeserializable {
/**
* The deserialize method is called during xml parsing.
*
- * This method is called statictly, this is because in theory this method
+ * This method is called statically, this is because in theory this method
* may be used as a type of constructor, or factory method.
*
* Often you want to return an instance of the current class, but you are
@@ -75,7 +75,7 @@ class SyncCollectionReport implements XmlDeserializable {
$reader->pushContext();
- $reader->elementMap['{DAV:}prop'] = 'Sabre\Xml\Element\Elements';
+ $reader->elementMap['{DAV:}prop'] = 'Sabre\Xml\Element\Elements';
$elems = KeyValue::xmlDeserialize($reader);
$reader->popContext();
diff --git a/vendor/sabre/dav/lib/DAV/Xml/Response/MultiStatus.php b/vendor/sabre/dav/lib/DAV/Xml/Response/MultiStatus.php
index 16a3d4a68..cf5a0453b 100644
--- a/vendor/sabre/dav/lib/DAV/Xml/Response/MultiStatus.php
+++ b/vendor/sabre/dav/lib/DAV/Xml/Response/MultiStatus.php
@@ -99,7 +99,7 @@ class MultiStatus implements Element {
/**
* The deserialize method is called during xml parsing.
*
- * This method is called statictly, this is because in theory this method
+ * This method is called statically, this is because in theory this method
* may be used as a type of constructor, or factory method.
*
* Often you want to return an instance of the current class, but you are
diff --git a/vendor/sabre/dav/lib/DAVACL/Exception/NotRecognizedPrincipal.php b/vendor/sabre/dav/lib/DAVACL/Exception/NotRecognizedPrincipal.php
index 4349bf101..d7ae188ae 100644
--- a/vendor/sabre/dav/lib/DAVACL/Exception/NotRecognizedPrincipal.php
+++ b/vendor/sabre/dav/lib/DAVACL/Exception/NotRecognizedPrincipal.php
@@ -5,7 +5,7 @@ namespace Sabre\DAVACL\Exception;
use Sabre\DAV;
/**
- * If a client tried to set a privilege assigned to a non-existant principal,
+ * If a client tried to set a privilege assigned to a non-existent principal,
* this exception will be thrown.
*
* @copyright Copyright (C) fruux GmbH (https://fruux.com/)
diff --git a/vendor/sabre/dav/lib/DAVACL/FS/Collection.php b/vendor/sabre/dav/lib/DAVACL/FS/Collection.php
index 1c08b43b1..b4fe7a1b0 100644
--- a/vendor/sabre/dav/lib/DAVACL/FS/Collection.php
+++ b/vendor/sabre/dav/lib/DAVACL/FS/Collection.php
@@ -2,11 +2,11 @@
namespace Sabre\DAVACL\FS;
+use Sabre\DAV\Exception\Forbidden;
+use Sabre\DAV\Exception\NotFound;
use Sabre\DAV\FSExt\Directory as BaseCollection;
use Sabre\DAVACL\ACLTrait;
use Sabre\DAVACL\IACL;
-use Sabre\DAV\Exception\Forbidden;
-use Sabre\DAV\Exception\NotFound;
/**
* This is an ACL-enabled collection.
diff --git a/vendor/sabre/dav/lib/DAVACL/FS/File.php b/vendor/sabre/dav/lib/DAVACL/FS/File.php
index 387597bf7..aaf2ae148 100644
--- a/vendor/sabre/dav/lib/DAVACL/FS/File.php
+++ b/vendor/sabre/dav/lib/DAVACL/FS/File.php
@@ -3,8 +3,8 @@
namespace Sabre\DAVACL\FS;
use Sabre\DAV\FSExt\File as BaseFile;
-use Sabre\DAVACL\IACL;
use Sabre\DAVACL\ACLTrait;
+use Sabre\DAVACL\IACL;
/**
* This is an ACL-enabled file node.
diff --git a/vendor/sabre/dav/lib/DAVACL/FS/HomeCollection.php b/vendor/sabre/dav/lib/DAVACL/FS/HomeCollection.php
index 9e21353ea..201235e5a 100644
--- a/vendor/sabre/dav/lib/DAVACL/FS/HomeCollection.php
+++ b/vendor/sabre/dav/lib/DAVACL/FS/HomeCollection.php
@@ -72,7 +72,7 @@ class HomeCollection extends AbstractPrincipalCollection implements IACL {
* supplied by the authentication backend.
*
* @param array $principalInfo
- * @return \Sabre\DAVACL\INode
+ * @return \Sabre\DAV\INode
*/
function getChildForPrincipal(array $principalInfo) {
diff --git a/vendor/sabre/dav/lib/DAVACL/Plugin.php b/vendor/sabre/dav/lib/DAVACL/Plugin.php
index 8e912309e..a2aa118d7 100644
--- a/vendor/sabre/dav/lib/DAVACL/Plugin.php
+++ b/vendor/sabre/dav/lib/DAVACL/Plugin.php
@@ -3,11 +3,12 @@
namespace Sabre\DAVACL;
use Sabre\DAV;
-use Sabre\DAV\INode;
-use Sabre\DAV\Xml\Property\Href;
use Sabre\DAV\Exception\BadRequest;
-use Sabre\DAV\Exception\NotFound;
+use Sabre\DAV\Exception\Forbidden;
use Sabre\DAV\Exception\NotAuthenticated;
+use Sabre\DAV\Exception\NotFound;
+use Sabre\DAV\INode;
+use Sabre\DAV\Xml\Property\Href;
use Sabre\DAVACL\Exception\NeedPrivileges;
use Sabre\HTTP\RequestInterface;
use Sabre\HTTP\ResponseInterface;
@@ -53,7 +54,7 @@ class Plugin extends DAV\ServerPlugin {
/**
* Reference to server object.
*
- * @var Sabre\DAV\Server
+ * @var DAV\Server
*/
protected $server;
@@ -228,14 +229,14 @@ class Plugin extends DAV\ServerPlugin {
/**
* Returns the standard users' principal.
*
- * This is one authorative principal url for the current user.
+ * This is one authoritative principal url for the current user.
* This method will return null if the user wasn't logged in.
*
* @return string|null
*/
function getCurrentUserPrincipal() {
- /** @var $authPlugin Sabre\DAV\Auth\Plugin */
+ /** @var $authPlugin \Sabre\DAV\Auth\Plugin */
$authPlugin = $this->server->getPlugin('auth');
if (!$authPlugin) {
return null;
@@ -283,8 +284,7 @@ class Plugin extends DAV\ServerPlugin {
*
* These rules are used for all nodes that don't implement the IACL interface.
*
- * @param array $acl
- * @return void
+ * @return array
*/
function getDefaultAcl() {
@@ -299,7 +299,7 @@ class Plugin extends DAV\ServerPlugin {
* set of rules allow anyone to do anything, as long as they are
* authenticated.
*
- * var array
+ * @var array
*/
protected $defaultAcl = [
[
@@ -321,7 +321,7 @@ class Plugin extends DAV\ServerPlugin {
/**
* Returns all the principal groups the specified principal is a member of.
*
- * @param string $principal
+ * @param string $mainPrincipal
* @return array
*/
function getPrincipalMembership($mainPrincipal) {
@@ -365,7 +365,7 @@ class Plugin extends DAV\ServerPlugin {
/**
* Find out of a principal equals another principal.
*
- * This is a quick way to find out wether a principal URI is part of a
+ * This is a quick way to find out whether a principal URI is part of a
* group, or any subgroups.
*
* The first argument is the principal URI you want to check against. For
@@ -373,10 +373,10 @@ class Plugin extends DAV\ServerPlugin {
* which you want to find out of it is the same as the first principal, or
* in a member of the first principal's group or subgroups.
*
- * So the arguments are not interchangable. If principal A is in group B,
+ * So the arguments are not interchangeable. If principal A is in group B,
* passing 'B', 'A' will yield true, but 'A', 'B' is false.
*
- * If the sceond argument is not passed, we will use the current user
+ * If the second argument is not passed, we will use the current user
* principal.
*
* @param string $checkPrincipal
@@ -412,8 +412,8 @@ class Plugin extends DAV\ServerPlugin {
* ]
* ]
*
- * Privileges can be nested using "aggregrates". Doing so means that
- * if you assign someone the aggregrating privilege, all the
+ * Privileges can be nested using "aggregates". Doing so means that
+ * if you assign someone the aggregating privilege, all the
* sub-privileges will automatically be granted.
*
* Marking a privilege as abstract means that the privilege cannot be
@@ -484,7 +484,7 @@ class Plugin extends DAV\ServerPlugin {
],
],
];
- if ($node instanceof \Sabre\DAV\ICollection) {
+ if ($node instanceof DAV\ICollection) {
$supportedPrivileges['{DAV:}write']['aggregates']['{DAV:}bind'] = [
'abstract' => false,
'aggregates' => [],
@@ -494,7 +494,7 @@ class Plugin extends DAV\ServerPlugin {
'aggregates' => [],
];
}
- if ($node instanceof \Sabre\DAVACL\IACL) {
+ if ($node instanceof IACL) {
$supportedPrivileges['{DAV:}write']['aggregates']['{DAV:}write-acl'] = [
'abstract' => false,
'aggregates' => [],
@@ -980,8 +980,6 @@ class Plugin extends DAV\ServerPlugin {
*
* @param DAV\PropFind $propFind
* @param DAV\INode $node
- * @param array $requestedProperties
- * @param array $returnedProperties
* @TODO really should be broken into multiple methods, or even a class.
* @return bool
*/
@@ -1423,7 +1421,7 @@ class Plugin extends DAV\ServerPlugin {
];
}
- // Replacing the property with its expannded form.
+ // Replacing the property with its expanded form.
$node[200][$propertyName] = $childProps;
}
diff --git a/vendor/sabre/dav/lib/DAVACL/Principal.php b/vendor/sabre/dav/lib/DAVACL/Principal.php
index 6ebb30907..d7db94999 100644
--- a/vendor/sabre/dav/lib/DAVACL/Principal.php
+++ b/vendor/sabre/dav/lib/DAVACL/Principal.php
@@ -41,7 +41,7 @@ class Principal extends DAV\Node implements IPrincipal, DAV\IProperties, IACL {
/**
* Creates the principal object
*
- * @param IPrincipalBackend $principalBackend
+ * @param PrincipalBackend\BackendInterface $principalBackend
* @param array $principalProperties
*/
function __construct(PrincipalBackend\BackendInterface $principalBackend, array $principalProperties = []) {
diff --git a/vendor/sabre/dav/lib/DAVACL/PrincipalBackend/BackendInterface.php b/vendor/sabre/dav/lib/DAVACL/PrincipalBackend/BackendInterface.php
index 2cb83071a..40b6e33ea 100644
--- a/vendor/sabre/dav/lib/DAVACL/PrincipalBackend/BackendInterface.php
+++ b/vendor/sabre/dav/lib/DAVACL/PrincipalBackend/BackendInterface.php
@@ -53,7 +53,7 @@ interface BackendInterface {
* Calling the handle method is like telling the PropPatch object "I
* promise I can handle updating this property".
*
- * Read the PropPatch documenation for more info and examples.
+ * Read the PropPatch documentation for more info and examples.
*
* @param string $path
* @param \Sabre\DAV\PropPatch $propPatch
diff --git a/vendor/sabre/dav/lib/DAVACL/PrincipalBackend/PDO.php b/vendor/sabre/dav/lib/DAVACL/PrincipalBackend/PDO.php
index a491dc88f..eb0df888b 100644
--- a/vendor/sabre/dav/lib/DAVACL/PrincipalBackend/PDO.php
+++ b/vendor/sabre/dav/lib/DAVACL/PrincipalBackend/PDO.php
@@ -11,7 +11,7 @@ use Sabre\HTTP\URLUtil;
*
*
* This backend assumes all principals are in a single collection. The default collection
- * is 'principals/', but this can be overriden.
+ * is 'principals/', but this can be overridden.
*
* @copyright Copyright (C) fruux GmbH (https://fruux.com/)
* @author Evert Pot (http://evertpot.com/)
@@ -65,7 +65,7 @@ class PDO extends AbstractBackend implements CreatePrincipalSupport {
/**
* Sets up the backend.
*
- * @param PDO $pdo
+ * @param \PDO $pdo
*/
function __construct(\PDO $pdo) {
@@ -171,7 +171,7 @@ class PDO extends AbstractBackend implements CreatePrincipalSupport {
* Calling the handle method is like telling the PropPatch object "I
* promise I can handle updating this property".
*
- * Read the PropPatch documenation for more info and examples.
+ * Read the PropPatch documentation for more info and examples.
*
* @param string $path
* @param DAV\PropPatch $propPatch
@@ -307,7 +307,7 @@ class PDO extends AbstractBackend implements CreatePrincipalSupport {
case "mailto":
$query = 'SELECT uri FROM ' . $this->tableName . ' WHERE lower(email)=lower(?)';
$stmt = $this->pdo->prepare($query);
- $stmt->execute([ $value ]);
+ $stmt->execute([$value]);
while ($row = $stmt->fetch(\PDO::FETCH_ASSOC)) {
// Checking if the principal is in the prefix
diff --git a/vendor/sabre/dav/lib/DAVACL/PrincipalCollection.php b/vendor/sabre/dav/lib/DAVACL/PrincipalCollection.php
index d8a90153a..ee5b88a90 100644
--- a/vendor/sabre/dav/lib/DAVACL/PrincipalCollection.php
+++ b/vendor/sabre/dav/lib/DAVACL/PrincipalCollection.php
@@ -57,7 +57,7 @@ class PrincipalCollection extends AbstractPrincipalCollection implements IExtend
*
* @param string $name
* @param MkCol $mkCol
- * @throws Exception\InvalidResourceType
+ * @throws InvalidResourceType
* @return void
*/
function createExtendedCollection($name, MkCol $mkCol) {
diff --git a/vendor/sabre/dav/lib/DAVACL/Xml/Property/Acl.php b/vendor/sabre/dav/lib/DAVACL/Xml/Property/Acl.php
index 9f5e40df1..0e1c30ccf 100644
--- a/vendor/sabre/dav/lib/DAVACL/Xml/Property/Acl.php
+++ b/vendor/sabre/dav/lib/DAVACL/Xml/Property/Acl.php
@@ -78,12 +78,12 @@ class Acl implements Element, HtmlOutput {
}
/**
- * The xmlSerialize metod is called during xml writing.
+ * The xmlSerialize method is called during xml writing.
*
* Use the $writer argument to write its own xml serialization.
*
* An important note: do _not_ create a parent element. Any element
- * implementing XmlSerializble should only ever write what's considered
+ * implementing XmlSerializable should only ever write what's considered
* its 'inner xml'.
*
* The parent of the current element is responsible for writing a
@@ -149,7 +149,7 @@ class Acl implements Element, HtmlOutput {
/**
* The deserialize method is called during xml parsing.
*
- * This method is called statictly, this is because in theory this method
+ * This method is called statically, this is because in theory this method
* may be used as a type of constructor, or factory method.
*
* Often you want to return an instance of the current class, but you are
diff --git a/vendor/sabre/dav/lib/DAVACL/Xml/Property/AclRestrictions.php b/vendor/sabre/dav/lib/DAVACL/Xml/Property/AclRestrictions.php
index f669cc5e1..8d5854c23 100644
--- a/vendor/sabre/dav/lib/DAVACL/Xml/Property/AclRestrictions.php
+++ b/vendor/sabre/dav/lib/DAVACL/Xml/Property/AclRestrictions.php
@@ -2,8 +2,8 @@
namespace Sabre\DAVACL\Xml\Property;
-use Sabre\Xml\XmlSerializable;
use Sabre\Xml\Writer;
+use Sabre\Xml\XmlSerializable;
/**
* AclRestrictions property
@@ -17,12 +17,12 @@ use Sabre\Xml\Writer;
class AclRestrictions implements XmlSerializable {
/**
- * The xmlSerialize metod is called during xml writing.
+ * The xmlSerialize method is called during xml writing.
*
* Use the $writer argument to write its own xml serialization.
*
* An important note: do _not_ create a parent element. Any element
- * implementing XmlSerializble should only ever write what's considered
+ * implementing XmlSerializable should only ever write what's considered
* its 'inner xml'.
*
* The parent of the current element is responsible for writing a
diff --git a/vendor/sabre/dav/lib/DAVACL/Xml/Property/CurrentUserPrivilegeSet.php b/vendor/sabre/dav/lib/DAVACL/Xml/Property/CurrentUserPrivilegeSet.php
index 0a95eb2b7..74c09cee1 100644
--- a/vendor/sabre/dav/lib/DAVACL/Xml/Property/CurrentUserPrivilegeSet.php
+++ b/vendor/sabre/dav/lib/DAVACL/Xml/Property/CurrentUserPrivilegeSet.php
@@ -41,12 +41,12 @@ class CurrentUserPrivilegeSet implements Element, HtmlOutput {
}
/**
- * The xmlSerialize metod is called during xml writing.
+ * The xmlSerialize method is called during xml writing.
*
* Use the $writer argument to write its own xml serialization.
*
* An important note: do _not_ create a parent element. Any element
- * implementing XmlSerializble should only ever write what's considered
+ * implementing XmlSerializable should only ever write what's considered
* its 'inner xml'.
*
* The parent of the current element is responsible for writing a
@@ -99,7 +99,7 @@ class CurrentUserPrivilegeSet implements Element, HtmlOutput {
/**
* The deserialize method is called during xml parsing.
*
- * This method is called statictly, this is because in theory this method
+ * This method is called statically, this is because in theory this method
* may be used as a type of constructor, or factory method.
*
* Often you want to return an instance of the current class, but you are
diff --git a/vendor/sabre/dav/lib/DAVACL/Xml/Property/Principal.php b/vendor/sabre/dav/lib/DAVACL/Xml/Property/Principal.php
index d32249d8b..04d22165d 100644
--- a/vendor/sabre/dav/lib/DAVACL/Xml/Property/Principal.php
+++ b/vendor/sabre/dav/lib/DAVACL/Xml/Property/Principal.php
@@ -85,12 +85,12 @@ class Principal extends DAV\Xml\Property\Href {
/**
- * The xmlSerialize metod is called during xml writing.
+ * The xmlSerialize method is called during xml writing.
*
* Use the $writer argument to write its own xml serialization.
*
* An important note: do _not_ create a parent element. Any element
- * implementing XmlSerializble should only ever write what's considered
+ * implementing XmlSerializable should only ever write what's considered
* its 'inner xml'.
*
* The parent of the current element is responsible for writing a
diff --git a/vendor/sabre/dav/lib/DAVACL/Xml/Property/SupportedPrivilegeSet.php b/vendor/sabre/dav/lib/DAVACL/Xml/Property/SupportedPrivilegeSet.php
index 55e7783ae..b963cc8c3 100644
--- a/vendor/sabre/dav/lib/DAVACL/Xml/Property/SupportedPrivilegeSet.php
+++ b/vendor/sabre/dav/lib/DAVACL/Xml/Property/SupportedPrivilegeSet.php
@@ -4,8 +4,8 @@ namespace Sabre\DAVACL\Xml\Property;
use Sabre\DAV\Browser\HtmlOutput;
use Sabre\DAV\Browser\HtmlOutputHelper;
-use Sabre\Xml\XmlSerializable;
use Sabre\Xml\Writer;
+use Sabre\Xml\XmlSerializable;
/**
* SupportedPrivilegeSet property
@@ -53,12 +53,12 @@ class SupportedPrivilegeSet implements XmlSerializable, HtmlOutput {
}
/**
- * The xmlSerialize metod is called during xml writing.
+ * The xmlSerialize method is called during xml writing.
*
* Use the $writer argument to write its own xml serialization.
*
* An important note: do _not_ create a parent element. Any element
- * implementing XmlSerializble should only ever write what's considered
+ * implementing XmlSerializable should only ever write what's considered
* its 'inner xml'.
*
* The parent of the current element is responsible for writing a
@@ -73,7 +73,7 @@ class SupportedPrivilegeSet implements XmlSerializable, HtmlOutput {
*/
function xmlSerialize(Writer $writer) {
- $this->serializePriv($writer, '{DAV:}all', [ 'aggregates' => $this->privileges]);
+ $this->serializePriv($writer, '{DAV:}all', ['aggregates' => $this->privileges]);
}
@@ -114,7 +114,7 @@ class SupportedPrivilegeSet implements XmlSerializable, HtmlOutput {
ob_start();
echo "<ul class=\"tree\">";
- $traverse('{DAV:}all', [ 'aggregates' => $this->getValue() ]);
+ $traverse('{DAV:}all', ['aggregates' => $this->getValue()]);
echo "</ul>\n";
return ob_get_clean();
@@ -129,6 +129,7 @@ class SupportedPrivilegeSet implements XmlSerializable, HtmlOutput {
* This is a recursive function.
*
* @param Writer $writer
+ * @param string $privName
* @param array $privilege
* @return void
*/
diff --git a/vendor/sabre/dav/lib/DAVACL/Xml/Request/AclPrincipalPropSetReport.php b/vendor/sabre/dav/lib/DAVACL/Xml/Request/AclPrincipalPropSetReport.php
index f01c1e6ab..0aa2f29a5 100644
--- a/vendor/sabre/dav/lib/DAVACL/Xml/Request/AclPrincipalPropSetReport.php
+++ b/vendor/sabre/dav/lib/DAVACL/Xml/Request/AclPrincipalPropSetReport.php
@@ -2,9 +2,9 @@
namespace Sabre\DAVACL\Xml\Request;
-use Sabre\Xml\XmlDeserializable;
-use Sabre\Xml\Reader;
use Sabre\Xml\Deserializer;
+use Sabre\Xml\Reader;
+use Sabre\Xml\XmlDeserializable;
/**
* AclPrincipalPropSet request parser.
@@ -24,7 +24,7 @@ class AclPrincipalPropSetReport implements XmlDeserializable {
/**
* The deserialize method is called during xml parsing.
*
- * This method is called statictly, this is because in theory this method
+ * This method is called statically, this is because in theory this method
* may be used as a type of constructor, or factory method.
*
* Often you want to return an instance of the current class, but you are
diff --git a/vendor/sabre/dav/lib/DAVACL/Xml/Request/ExpandPropertyReport.php b/vendor/sabre/dav/lib/DAVACL/Xml/Request/ExpandPropertyReport.php
index 3f535e301..a9938ba5b 100644
--- a/vendor/sabre/dav/lib/DAVACL/Xml/Request/ExpandPropertyReport.php
+++ b/vendor/sabre/dav/lib/DAVACL/Xml/Request/ExpandPropertyReport.php
@@ -35,7 +35,7 @@ class ExpandPropertyReport implements XmlDeserializable {
/**
* The deserialize method is called during xml parsing.
*
- * This method is called statictly, this is because in theory this method
+ * This method is called statically, this is because in theory this method
* may be used as a type of constructor, or factory method.
*
* Often you want to return an instance of the current class, but you are
diff --git a/vendor/sabre/dav/lib/DAVACL/Xml/Request/PrincipalMatchReport.php b/vendor/sabre/dav/lib/DAVACL/Xml/Request/PrincipalMatchReport.php
index 5c4e88189..1be15ab2d 100644
--- a/vendor/sabre/dav/lib/DAVACL/Xml/Request/PrincipalMatchReport.php
+++ b/vendor/sabre/dav/lib/DAVACL/Xml/Request/PrincipalMatchReport.php
@@ -2,9 +2,9 @@
namespace Sabre\DAVACL\Xml\Request;
-use Sabre\Xml\XmlDeserializable;
-use Sabre\Xml\Reader;
use Sabre\Xml\Deserializer;
+use Sabre\Xml\Reader;
+use Sabre\Xml\XmlDeserializable;
/**
* PrincipalMatchReport request parser.
@@ -55,7 +55,7 @@ class PrincipalMatchReport implements XmlDeserializable {
/**
* The deserialize method is called during xml parsing.
*
- * This method is called statictly, this is because in theory this method
+ * This method is called statically, this is because in theory this method
* may be used as a type of constructor, or factory method.
*
* Often you want to return an instance of the current class, but you are
diff --git a/vendor/sabre/dav/lib/DAVACL/Xml/Request/PrincipalPropertySearchReport.php b/vendor/sabre/dav/lib/DAVACL/Xml/Request/PrincipalPropertySearchReport.php
index 1e7aa4481..b0cf0e408 100644
--- a/vendor/sabre/dav/lib/DAVACL/Xml/Request/PrincipalPropertySearchReport.php
+++ b/vendor/sabre/dav/lib/DAVACL/Xml/Request/PrincipalPropertySearchReport.php
@@ -2,9 +2,9 @@
namespace Sabre\DAVACL\Xml\Request;
+use Sabre\DAV\Exception\BadRequest;
use Sabre\Xml\Reader;
use Sabre\Xml\XmlDeserializable;
-use Sabre\DAV\Exception\BadRequest;
/**
* PrincipalSearchPropertySetReport request parser.
@@ -56,7 +56,7 @@ class PrincipalPropertySearchReport implements XmlDeserializable {
/**
* The deserialize method is called during xml parsing.
*
- * This method is called statictly, this is because in theory this method
+ * This method is called statically, this is because in theory this method
* may be used as a type of constructor, or factory method.
*
* Often you want to return an instance of the current class, but you are
diff --git a/vendor/sabre/dav/lib/DAVACL/Xml/Request/PrincipalSearchPropertySetReport.php b/vendor/sabre/dav/lib/DAVACL/Xml/Request/PrincipalSearchPropertySetReport.php
index ade157b19..64d1f7f86 100644
--- a/vendor/sabre/dav/lib/DAVACL/Xml/Request/PrincipalSearchPropertySetReport.php
+++ b/vendor/sabre/dav/lib/DAVACL/Xml/Request/PrincipalSearchPropertySetReport.php
@@ -2,9 +2,9 @@
namespace Sabre\DAVACL\Xml\Request;
+use Sabre\DAV\Exception\BadRequest;
use Sabre\Xml\Reader;
use Sabre\Xml\XmlDeserializable;
-use Sabre\DAV\Exception\BadRequest;
/**
* PrincipalSearchPropertySetReport request parser.
@@ -23,7 +23,7 @@ class PrincipalSearchPropertySetReport implements XmlDeserializable {
/**
* The deserialize method is called during xml parsing.
*
- * This method is called statictly, this is because in theory this method
+ * This method is called statically, this is because in theory this method
* may be used as a type of constructor, or factory method.
*
* Often you want to return an instance of the current class, but you are
diff --git a/vendor/sabre/dav/tests/Sabre/CalDAV/Backend/AbstractPDOTest.php b/vendor/sabre/dav/tests/Sabre/CalDAV/Backend/AbstractPDOTest.php
index 2a00f7925..406dbe0e8 100644
--- a/vendor/sabre/dav/tests/Sabre/CalDAV/Backend/AbstractPDOTest.php
+++ b/vendor/sabre/dav/tests/Sabre/CalDAV/Backend/AbstractPDOTest.php
@@ -280,7 +280,7 @@ abstract class AbstractPDOTest extends \PHPUnit_Framework_TestCase {
],
];
- $result = $backend->getMultipleCalendarObjects($returnedId, [ 'id-1', 'id-2' ]);
+ $result = $backend->getMultipleCalendarObjects($returnedId, ['id-1', 'id-2']);
foreach ($check as $index => $props) {
@@ -441,7 +441,7 @@ abstract class AbstractPDOTest extends \PHPUnit_Framework_TestCase {
/**
* @depends testCreateCalendarObject
*/
- function testCreateCalendarObjectInfiniteReccurence() {
+ function testCreateCalendarObjectInfiniteRecurrence() {
$backend = new PDO($this->pdo);
$returnedId = $backend->createCalendar('principals/user2', 'somerandomid', []);
@@ -470,7 +470,7 @@ abstract class AbstractPDOTest extends \PHPUnit_Framework_TestCase {
/**
* @depends testCreateCalendarObject
*/
- function testCreateCalendarObjectEndingReccurence() {
+ function testCreateCalendarObjectEndingRecurrence() {
$backend = new PDO($this->pdo);
$returnedId = $backend->createCalendar('principals/user2', 'somerandomid', []);
@@ -1246,8 +1246,8 @@ abstract class AbstractPDOTest extends \PHPUnit_Framework_TestCase {
$calendar['id'],
[
new Sharee([
- 'href' => 'mailto:user@example.org',
- 'access' => \Sabre\DAV\Sharing\Plugin::ACCESS_NOACCESS,
+ 'href' => 'mailto:user@example.org',
+ 'access' => \Sabre\DAV\Sharing\Plugin::ACCESS_NOACCESS,
])
]
);
@@ -1263,8 +1263,8 @@ abstract class AbstractPDOTest extends \PHPUnit_Framework_TestCase {
$calendar['id'],
[
new Sharee([
- 'href' => 'principals/user2',
- 'access' => \Sabre\DAV\Sharing\Plugin::ACCESS_NOACCESS,
+ 'href' => 'principals/user2',
+ 'access' => \Sabre\DAV\Sharing\Plugin::ACCESS_NOACCESS,
])
]
);
diff --git a/vendor/sabre/dav/tests/Sabre/CalDAV/Backend/Mock.php b/vendor/sabre/dav/tests/Sabre/CalDAV/Backend/Mock.php
index d4dcc07dc..cc665cd8f 100644
--- a/vendor/sabre/dav/tests/Sabre/CalDAV/Backend/Mock.php
+++ b/vendor/sabre/dav/tests/Sabre/CalDAV/Backend/Mock.php
@@ -2,8 +2,8 @@
namespace Sabre\CalDAV\Backend;
-use Sabre\DAV;
use Sabre\CalDAV;
+use Sabre\DAV;
class Mock extends AbstractBackend {
diff --git a/vendor/sabre/dav/tests/Sabre/CalDAV/CalendarObjectTest.php b/vendor/sabre/dav/tests/Sabre/CalDAV/CalendarObjectTest.php
index 0d98922ff..c92cde661 100644
--- a/vendor/sabre/dav/tests/Sabre/CalDAV/CalendarObjectTest.php
+++ b/vendor/sabre/dav/tests/Sabre/CalDAV/CalendarObjectTest.php
@@ -114,7 +114,7 @@ class CalendarObjectTest extends \PHPUnit_Framework_TestCase {
$obj = $children[0];
$obj->delete();
- $children2 = $this->calendar->getChildren();
+ $children2 = $this->calendar->getChildren();
$this->assertEquals(count($children) - 1, count($children2));
}
diff --git a/vendor/sabre/dav/tests/Sabre/CalDAV/CalendarQueryValidatorTest.php b/vendor/sabre/dav/tests/Sabre/CalDAV/CalendarQueryValidatorTest.php
index 4c2558a9b..f3305163b 100644
--- a/vendor/sabre/dav/tests/Sabre/CalDAV/CalendarQueryValidatorTest.php
+++ b/vendor/sabre/dav/tests/Sabre/CalDAV/CalendarQueryValidatorTest.php
@@ -21,6 +21,9 @@ ICS;
}
/**
+ * @param string $icalObject
+ * @param array $filters
+ * @param int $outcome
* @dataProvider provider
*/
function testValid($icalObject, $filters, $outcome) {
diff --git a/vendor/sabre/dav/tests/Sabre/CalDAV/FreeBusyReportTest.php b/vendor/sabre/dav/tests/Sabre/CalDAV/FreeBusyReportTest.php
index 7a756774f..7604c7f4c 100644
--- a/vendor/sabre/dav/tests/Sabre/CalDAV/FreeBusyReportTest.php
+++ b/vendor/sabre/dav/tests/Sabre/CalDAV/FreeBusyReportTest.php
@@ -11,11 +11,11 @@ require_once 'Sabre/HTTP/ResponseMock.php';
class FreeBusyReportTest extends \PHPUnit_Framework_TestCase {
/**
- * @var Sabre\CalDAV\Plugin
+ * @var Plugin
*/
protected $plugin;
/**
- * @var Sabre\DAV\Server
+ * @var DAV\Server
*/
protected $server;
diff --git a/vendor/sabre/dav/tests/Sabre/CalDAV/ICSExportPluginTest.php b/vendor/sabre/dav/tests/Sabre/CalDAV/ICSExportPluginTest.php
index 9719529fb..75412577e 100644
--- a/vendor/sabre/dav/tests/Sabre/CalDAV/ICSExportPluginTest.php
+++ b/vendor/sabre/dav/tests/Sabre/CalDAV/ICSExportPluginTest.php
@@ -3,9 +3,9 @@
namespace Sabre\CalDAV;
use Sabre\DAV;
+use Sabre\DAVACL;
use Sabre\HTTP;
use Sabre\VObject;
-use Sabre\DAVACL;
class ICSExportPluginTest extends \Sabre\DAVServerTest {
diff --git a/vendor/sabre/dav/tests/Sabre/CalDAV/PluginTest.php b/vendor/sabre/dav/tests/Sabre/CalDAV/PluginTest.php
index 8d538dee5..859f6aa0c 100644
--- a/vendor/sabre/dav/tests/Sabre/CalDAV/PluginTest.php
+++ b/vendor/sabre/dav/tests/Sabre/CalDAV/PluginTest.php
@@ -2,11 +2,11 @@
namespace Sabre\CalDAV;
-use Sabre\DAVACL;
-use Sabre\DAV;
-use Sabre\HTTP;
use DateTime;
use DateTimeZone;
+use Sabre\DAV;
+use Sabre\DAVACL;
+use Sabre\HTTP;
class PluginTest extends \PHPUnit_Framework_TestCase {
diff --git a/vendor/sabre/dav/tests/Sabre/CalDAV/SharingPluginTest.php b/vendor/sabre/dav/tests/Sabre/CalDAV/SharingPluginTest.php
index 6e9e88419..9589176a3 100644
--- a/vendor/sabre/dav/tests/Sabre/CalDAV/SharingPluginTest.php
+++ b/vendor/sabre/dav/tests/Sabre/CalDAV/SharingPluginTest.php
@@ -194,8 +194,8 @@ RRR;
$this->assertEquals(
[
new Sharee([
- 'href' => 'mailto:joe@example.org',
- 'properties' => [
+ 'href' => 'mailto:joe@example.org',
+ 'properties' => [
'{DAV:}displayname' => 'Joe Shmoe',
],
'access' => \Sabre\DAV\Sharing\Plugin::ACCESS_READWRITE,
diff --git a/vendor/sabre/dav/tests/Sabre/CardDAV/AddressBookQueryTest.php b/vendor/sabre/dav/tests/Sabre/CardDAV/AddressBookQueryTest.php
index 2c3171bf3..f8da38a16 100644
--- a/vendor/sabre/dav/tests/Sabre/CardDAV/AddressBookQueryTest.php
+++ b/vendor/sabre/dav/tests/Sabre/CardDAV/AddressBookQueryTest.php
@@ -2,8 +2,8 @@
namespace Sabre\CardDAV;
-use Sabre\HTTP;
use Sabre\DAV;
+use Sabre\HTTP;
require_once 'Sabre/CardDAV/AbstractPluginTest.php';
require_once 'Sabre/HTTP/ResponseMock.php';
@@ -288,14 +288,14 @@ class AddressBookQueryTest extends AbstractPluginTest {
);
$request->setBody(
-'<?xml version="1.0"?>
+ '<?xml version="1.0"?>
<c:addressbook-query xmlns:d="DAV:" xmlns:c="urn:ietf:params:xml:ns:carddav">
<d:prop>
<c:address-data content-type="application/vcard+json" />
<d:getetag />
</d:prop>
</c:addressbook-query>'
- );
+ );
$response = new HTTP\ResponseMock();
@@ -305,6 +305,51 @@ class AddressBookQueryTest extends AbstractPluginTest {
$this->server->exec();
$this->assertEquals(415, $response->status, 'Incorrect status code. Full response body:' . $response->body);
+ }
+
+ function testAddressBookProperties() {
+
+ $request = new HTTP\Request(
+ 'REPORT',
+ '/addressbooks/user1/book3',
+ ['Depth' => '1']
+ );
+
+ $request->setBody(
+ '<?xml version="1.0"?>
+<c:addressbook-query xmlns:d="DAV:" xmlns:c="urn:ietf:params:xml:ns:carddav">
+ <d:prop>
+ <c:address-data>
+ <c:prop name="FN"/>
+ <c:prop name="BDAY"/>
+ </c:address-data>
+ <d:getetag />
+ </d:prop>
+</c:addressbook-query>'
+ );
+
+ $response = new HTTP\ResponseMock();
+
+ $this->server->httpRequest = $request;
+ $this->server->httpResponse = $response;
+
+ $this->server->exec();
+
+ $this->assertEquals(207, $response->status, 'Incorrect status code. Full response body:' . $response->body);
+
+ // using the client for parsing
+ $client = new DAV\Client(['baseUri' => '/']);
+
+ $result = $client->parseMultiStatus($response->body);
+
+ $this->assertEquals([
+ '/addressbooks/user1/book3/card3' => [
+ 200 => [
+ '{DAV:}getetag' => '"' . md5("BEGIN:VCARD\nVERSION:3.0\nUID:12345\nFN:Test-Card\nEMAIL;TYPE=home:bar@example.org\nEND:VCARD") . '"',
+ '{urn:ietf:params:xml:ns:carddav}address-data' => "BEGIN:VCARD\r\nVERSION:3.0\r\nUID:12345\r\nFN:Test-Card\r\nEND:VCARD\r\n",
+ ],
+ ],
+ ], $result);
}
}
diff --git a/vendor/sabre/dav/tests/Sabre/CardDAV/AddressBookTest.php b/vendor/sabre/dav/tests/Sabre/CardDAV/AddressBookTest.php
index 1a36fd10c..1f0064dd3 100644
--- a/vendor/sabre/dav/tests/Sabre/CardDAV/AddressBookTest.php
+++ b/vendor/sabre/dav/tests/Sabre/CardDAV/AddressBookTest.php
@@ -85,7 +85,7 @@ class AddressBookTest extends \PHPUnit_Framework_TestCase {
function testDelete() {
$this->ab->delete();
- $this->assertEquals([], $this->backend->addressBooks);
+ $this->assertEquals(1, count($this->backend->addressBooks));
}
@@ -175,7 +175,7 @@ class AddressBookTest extends \PHPUnit_Framework_TestCase {
$backend = new Backend\PDO(
$this->getPDO()
);
- $ab = new AddressBook($backend, [ 'id' => 1, '{DAV:}sync-token' => 2]);
+ $ab = new AddressBook($backend, ['id' => 1, '{DAV:}sync-token' => 2]);
$this->assertEquals(2, $ab->getSyncToken());
}
@@ -187,7 +187,7 @@ class AddressBookTest extends \PHPUnit_Framework_TestCase {
$backend = new Backend\PDO(
$this->getPDO()
);
- $ab = new AddressBook($backend, [ 'id' => 1, '{http://sabredav.org/ns}sync-token' => 2]);
+ $ab = new AddressBook($backend, ['id' => 1, '{http://sabredav.org/ns}sync-token' => 2]);
$this->assertEquals(2, $ab->getSyncToken());
}
diff --git a/vendor/sabre/dav/tests/Sabre/CardDAV/Backend/Mock.php b/vendor/sabre/dav/tests/Sabre/CardDAV/Backend/Mock.php
index 840b898e8..8638dc74a 100644
--- a/vendor/sabre/dav/tests/Sabre/CardDAV/Backend/Mock.php
+++ b/vendor/sabre/dav/tests/Sabre/CardDAV/Backend/Mock.php
@@ -20,6 +20,12 @@ class Mock extends AbstractBackend {
'principaluri' => 'principals/user1',
'{DAV:}displayname' => 'd-name',
],
+ [
+ 'id' => 'bar',
+ 'uri' => 'book3',
+ 'principaluri' => 'principals/user1',
+ '{DAV:}displayname' => 'd-name',
+ ],
];
$card2 = fopen('php://memory', 'r+');
@@ -30,6 +36,9 @@ class Mock extends AbstractBackend {
'card1' => "BEGIN:VCARD\nVERSION:3.0\nUID:12345\nEND:VCARD",
'card2' => $card2,
],
+ 'bar' => [
+ 'card3' => "BEGIN:VCARD\nVERSION:3.0\nUID:12345\nFN:Test-Card\nEMAIL;TYPE=home:bar@example.org\nEND:VCARD",
+ ],
];
}
@@ -58,7 +67,7 @@ class Mock extends AbstractBackend {
* Calling the handle method is like telling the PropPatch object "I
* promise I can handle updating this property".
*
- * Read the PropPatch documenation for more info and examples.
+ * Read the PropPatch documentation for more info and examples.
*
* @param string $addressBookId
* @param \Sabre\DAV\PropPatch $propPatch
@@ -117,7 +126,7 @@ class Mock extends AbstractBackend {
* calculating them. If they are specified, you can also ommit carddata.
* This may speed up certain requests, especially with large cards.
*
- * @param mixed $addressbookId
+ * @param mixed $addressBookId
* @return array
*/
function getCards($addressBookId) {
diff --git a/vendor/sabre/dav/tests/Sabre/CardDAV/MultiGetTest.php b/vendor/sabre/dav/tests/Sabre/CardDAV/MultiGetTest.php
index d79239d0f..2d57c6ae7 100644
--- a/vendor/sabre/dav/tests/Sabre/CardDAV/MultiGetTest.php
+++ b/vendor/sabre/dav/tests/Sabre/CardDAV/MultiGetTest.php
@@ -2,8 +2,8 @@
namespace Sabre\CardDAV;
-use Sabre\HTTP;
use Sabre\DAV;
+use Sabre\HTTP;
require_once 'Sabre/HTTP/ResponseMock.php';
diff --git a/vendor/sabre/dav/tests/Sabre/CardDAV/SogoStripContentTypeTest.php b/vendor/sabre/dav/tests/Sabre/CardDAV/SogoStripContentTypeTest.php
index 0ba4fd669..d4bc48098 100644
--- a/vendor/sabre/dav/tests/Sabre/CardDAV/SogoStripContentTypeTest.php
+++ b/vendor/sabre/dav/tests/Sabre/CardDAV/SogoStripContentTypeTest.php
@@ -2,8 +2,8 @@
namespace Sabre\CardDAV;
-use Sabre\HTTP;
use Sabre\DAV\PropFind;
+use Sabre\HTTP;
class SogoStripContentTypeTest extends \Sabre\DAVServerTest {
diff --git a/vendor/sabre/dav/tests/Sabre/CardDAV/ValidateFilterTest.php b/vendor/sabre/dav/tests/Sabre/CardDAV/ValidateFilterTest.php
index 57ac21b4a..03c468f86 100644
--- a/vendor/sabre/dav/tests/Sabre/CardDAV/ValidateFilterTest.php
+++ b/vendor/sabre/dav/tests/Sabre/CardDAV/ValidateFilterTest.php
@@ -7,6 +7,11 @@ require_once 'Sabre/CardDAV/AbstractPluginTest.php';
class ValidateFilterTest extends AbstractPluginTest {
/**
+ * @param string $input
+ * @param array $filters
+ * @param string $test
+ * @param bool $result
+ * @param string|null $message
* @dataProvider data
*/
function testFilter($input, $filters, $test, $result, $message = null) {
diff --git a/vendor/sabre/dav/tests/Sabre/CardDAV/ValidateVCardTest.php b/vendor/sabre/dav/tests/Sabre/CardDAV/ValidateVCardTest.php
index dda8a0c37..acba2cfc8 100644
--- a/vendor/sabre/dav/tests/Sabre/CardDAV/ValidateVCardTest.php
+++ b/vendor/sabre/dav/tests/Sabre/CardDAV/ValidateVCardTest.php
@@ -3,8 +3,8 @@
namespace Sabre\CardDAV;
use Sabre\DAV;
-use Sabre\HTTP;
use Sabre\DAVACL;
+use Sabre\HTTP;
require_once 'Sabre/HTTP/ResponseMock.php';
@@ -293,10 +293,10 @@ VCF;
$response = $this->request($request, 204);
$expected = [
- 'uri' => 'blabla.vcf',
- 'carddata' => $body,
- 'size' => strlen($body),
- 'etag' => '"' . md5($body) . '"',
+ 'uri' => 'blabla.vcf',
+ 'carddata' => $body,
+ 'size' => strlen($body),
+ 'etag' => '"' . md5($body) . '"',
];
$this->assertEquals($expected, $this->cardBackend->getCard('addressbook1', 'blabla.vcf'));
diff --git a/vendor/sabre/dav/tests/Sabre/DAV/Auth/Backend/Mock.php b/vendor/sabre/dav/tests/Sabre/DAV/Auth/Backend/Mock.php
index b30b3f143..369bc249e 100644
--- a/vendor/sabre/dav/tests/Sabre/DAV/Auth/Backend/Mock.php
+++ b/vendor/sabre/dav/tests/Sabre/DAV/Auth/Backend/Mock.php
@@ -76,6 +76,8 @@ class Mock implements BackendInterface {
* append your own WWW-Authenticate header instead of overwriting the
* existing one.
*
+ * @param RequestInterface $request
+ * @param ResponseInterface $response
* @return void
*/
function challenge(RequestInterface $request, ResponseInterface $response) {
diff --git a/vendor/sabre/dav/tests/Sabre/DAV/Auth/PluginTest.php b/vendor/sabre/dav/tests/Sabre/DAV/Auth/PluginTest.php
index b566dd757..743446127 100644
--- a/vendor/sabre/dav/tests/Sabre/DAV/Auth/PluginTest.php
+++ b/vendor/sabre/dav/tests/Sabre/DAV/Auth/PluginTest.php
@@ -2,8 +2,8 @@
namespace Sabre\DAV\Auth;
-use Sabre\HTTP;
use Sabre\DAV;
+use Sabre\HTTP;
class PluginTest extends \PHPUnit_Framework_TestCase {
diff --git a/vendor/sabre/dav/tests/Sabre/DAV/ClientTest.php b/vendor/sabre/dav/tests/Sabre/DAV/ClientTest.php
index 4cf27dfaa..687f61e2f 100644
--- a/vendor/sabre/dav/tests/Sabre/DAV/ClientTest.php
+++ b/vendor/sabre/dav/tests/Sabre/DAV/ClientTest.php
@@ -224,7 +224,7 @@ XML;
XML;
$client->response = new Response(207, [], $responseBody);
- $result = $client->propPatch('foo', ['{DAV:}displayname' => 'hi', '{urn:zim}gir' => null], 1);
+ $result = $client->propPatch('foo', ['{DAV:}displayname' => 'hi', '{urn:zim}gir' => null]);
$this->assertTrue($result);
$request = $client->request;
$this->assertEquals('PROPPATCH', $request->getMethod());
@@ -246,7 +246,7 @@ XML;
]);
$client->response = new Response(403, [], '');
- $client->propPatch('foo', ['{DAV:}displayname' => 'hi', '{urn:zim}gir' => null], 1);
+ $client->propPatch('foo', ['{DAV:}displayname' => 'hi', '{urn:zim}gir' => null]);
}
@@ -276,7 +276,7 @@ XML;
XML;
$client->response = new Response(207, [], $responseBody);
- $client->propPatch('foo', ['{DAV:}displayname' => 'hi', '{urn:zim}gir' => null], 1);
+ $client->propPatch('foo', ['{DAV:}displayname' => 'hi', '{urn:zim}gir' => null]);
}
diff --git a/vendor/sabre/dav/tests/Sabre/DAV/Exception/LockedTest.php b/vendor/sabre/dav/tests/Sabre/DAV/Exception/LockedTest.php
index 8788475cb..174a561b5 100644
--- a/vendor/sabre/dav/tests/Sabre/DAV/Exception/LockedTest.php
+++ b/vendor/sabre/dav/tests/Sabre/DAV/Exception/LockedTest.php
@@ -2,8 +2,8 @@
namespace Sabre\DAV\Exception;
-use Sabre\DAV;
use DOMDocument;
+use Sabre\DAV;
class LockedTest extends \PHPUnit_Framework_TestCase {
diff --git a/vendor/sabre/dav/tests/Sabre/DAV/Issue33Test.php b/vendor/sabre/dav/tests/Sabre/DAV/Issue33Test.php
index edd09e634..ba2cf3dc1 100644
--- a/vendor/sabre/dav/tests/Sabre/DAV/Issue33Test.php
+++ b/vendor/sabre/dav/tests/Sabre/DAV/Issue33Test.php
@@ -99,7 +99,7 @@ class Issue33Test extends \PHPUnit_Framework_TestCase {
$server->sapi = new HTTP\SapiMock();
$server->exec();
- $this->assertTrue(file_exists(SABRE_TEMPDIR . '/issue33/' . urldecode('%C3%A0fo%C3%B3')));
+ $this->assertTrue(file_exists(SABRE_TEMPDIR . '/issue33/' . urldecode('%C3%A0fo%C3%B3')));
}
diff --git a/vendor/sabre/dav/tests/Sabre/DAV/Locks/MSWordTest.php b/vendor/sabre/dav/tests/Sabre/DAV/Locks/MSWordTest.php
index f08f19da5..1111db5b5 100644
--- a/vendor/sabre/dav/tests/Sabre/DAV/Locks/MSWordTest.php
+++ b/vendor/sabre/dav/tests/Sabre/DAV/Locks/MSWordTest.php
@@ -2,8 +2,8 @@
namespace Sabre\DAV\Locks;
-use Sabre\HTTP;
use Sabre\DAV;
+use Sabre\HTTP;
require_once 'Sabre/HTTP/ResponseMock.php';
require_once 'Sabre/TestUtil.php';
@@ -112,9 +112,9 @@ class MSWordTest extends \PHPUnit_Framework_TestCase {
function getPutRequest($lockToken) {
$request = HTTP\Sapi::createFromServerArray([
- 'REQUEST_METHOD' => 'PUT',
- 'REQUEST_URI' => '/Nouveau%20Microsoft%20Office%20Excel%20Worksheet.xlsx',
- 'HTTP_IF' => 'If: (' . $lockToken . ')',
+ '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
index 6511d4e7d..dbbf6757a 100644
--- a/vendor/sabre/dav/tests/Sabre/DAV/Locks/PluginTest.php
+++ b/vendor/sabre/dav/tests/Sabre/DAV/Locks/PluginTest.php
@@ -2,8 +2,8 @@
namespace Sabre\DAV\Locks;
-use Sabre\HTTP;
use Sabre\DAV;
+use Sabre\HTTP;
require_once 'Sabre/DAV/AbstractServer.php';
@@ -168,7 +168,7 @@ class PluginTest extends DAV\AbstractServer {
$this->response = new HTTP\ResponseMock();
$this->server->httpResponse = $this->response;
- $request = new HTTP\Request('LOCK', '/test.txt', ['If' => '(' . $lockToken . ')' ]);
+ $request = new HTTP\Request('LOCK', '/test.txt', ['If' => '(' . $lockToken . ')']);
$request->setBody('');
$this->server->httpRequest = $request;
@@ -203,7 +203,7 @@ class PluginTest extends DAV\AbstractServer {
$this->response = new HTTP\ResponseMock();
$this->server->httpResponse = $this->response;
- $request = new HTTP\Request('LOCK', '/test.txt', ['If' => '(' . $lockToken . 'foobar) (<opaquelocktoken:anotherbadtoken>)' ]);
+ $request = new HTTP\Request('LOCK', '/test.txt', ['If' => '(' . $lockToken . 'foobar) (<opaquelocktoken:anotherbadtoken>)']);
$request->setBody('');
$this->server->httpRequest = $request;
diff --git a/vendor/sabre/dav/tests/Sabre/DAV/Mock/Collection.php b/vendor/sabre/dav/tests/Sabre/DAV/Mock/Collection.php
index 6ccab4f66..fded5e474 100644
--- a/vendor/sabre/dav/tests/Sabre/DAV/Mock/Collection.php
+++ b/vendor/sabre/dav/tests/Sabre/DAV/Mock/Collection.php
@@ -30,6 +30,7 @@ class Collection extends DAV\Collection {
*
* @param string $name
* @param array $children
+ * @param Collection $parent
* @return void
*/
function __construct($name, array $children = [], Collection $parent = null) {
@@ -122,6 +123,8 @@ class Collection extends DAV\Collection {
/**
* Adds an already existing node to this collection.
+ *
+ * @param \Sabre\DAV\INode $node
*/
function addNode(\Sabre\DAV\INode $node) {
diff --git a/vendor/sabre/dav/tests/Sabre/DAV/Mock/File.php b/vendor/sabre/dav/tests/Sabre/DAV/Mock/File.php
index 23855e3c5..a624b6b6b 100644
--- a/vendor/sabre/dav/tests/Sabre/DAV/Mock/File.php
+++ b/vendor/sabre/dav/tests/Sabre/DAV/Mock/File.php
@@ -24,7 +24,9 @@ class File extends DAV\File {
* Creates the object
*
* @param string $name
- * @param array $children
+ * @param resource $contents
+ * @param Collection $parent
+ * @param int $lastModified
* @return void
*/
function __construct($name, $contents, Collection $parent = null, $lastModified = -1) {
@@ -57,6 +59,7 @@ class File extends DAV\File {
/**
* Changes the name of the node.
*
+ * @param string $name
* @return void
*/
function setName($name) {
@@ -70,7 +73,7 @@ class File extends DAV\File {
*
* The data argument is a readable stream resource.
*
- * After a succesful put operation, you may choose to return an ETag. The
+ * 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.
*
diff --git a/vendor/sabre/dav/tests/Sabre/DAV/PartialUpdate/SpecificationTest.php b/vendor/sabre/dav/tests/Sabre/DAV/PartialUpdate/SpecificationTest.php
index ca8ca3f6e..2c6274173 100644
--- a/vendor/sabre/dav/tests/Sabre/DAV/PartialUpdate/SpecificationTest.php
+++ b/vendor/sabre/dav/tests/Sabre/DAV/PartialUpdate/SpecificationTest.php
@@ -38,6 +38,11 @@ class SpecificationTest extends \PHPUnit_Framework_TestCase {
}
/**
+ * @param string $headerValue
+ * @param string $httpStatus
+ * @param string $endResult
+ * @param int $contentLength
+ *
* @dataProvider data
*/
function testUpdateRange($headerValue, $httpStatus, $endResult, $contentLength = 4) {
diff --git a/vendor/sabre/dav/tests/Sabre/DAV/ServerEventsTest.php b/vendor/sabre/dav/tests/Sabre/DAV/ServerEventsTest.php
index 4c576f108..42759647a 100644
--- a/vendor/sabre/dav/tests/Sabre/DAV/ServerEventsTest.php
+++ b/vendor/sabre/dav/tests/Sabre/DAV/ServerEventsTest.php
@@ -39,8 +39,8 @@ class ServerEventsTest extends AbstractServer {
$this->server->on('afterResponse', [$mock, 'afterResponseCallback']);
$this->server->httpRequest = HTTP\Sapi::createFromServerArray([
- 'REQUEST_METHOD' => 'GET',
- 'REQUEST_URI' => '/test.txt',
+ 'REQUEST_METHOD' => 'GET',
+ 'REQUEST_URI' => '/test.txt',
]);
$this->server->exec();
@@ -118,8 +118,8 @@ class ServerEventsTest extends AbstractServer {
);
} catch (Exception $e) {}
- $this->assertEquals(2, $k);
-
+ // Fun fact, PHP 7.1 changes the order when sorting-by-callback.
+ $this->assertTrue($k >= 2 && $k <= 3);
}
diff --git a/vendor/sabre/dav/tests/Sabre/DAV/ServerRangeTest.php b/vendor/sabre/dav/tests/Sabre/DAV/ServerRangeTest.php
index bafbef6e4..81224d687 100644
--- a/vendor/sabre/dav/tests/Sabre/DAV/ServerRangeTest.php
+++ b/vendor/sabre/dav/tests/Sabre/DAV/ServerRangeTest.php
@@ -144,7 +144,7 @@ class ServerRangeTest extends \Sabre\DAVServerTest {
'Content-Length' => [4],
'Content-Range' => ['bytes 2-5/12'],
// 'ETag' => ['"' . md5('Test contents') . '"'],
- 'Last-Modified' => [$this->lastModified],
+ 'Last-Modified' => [$this->lastModified],
],
$response->getHeaders()
);
diff --git a/vendor/sabre/dav/tests/Sabre/DAV/StringUtilTest.php b/vendor/sabre/dav/tests/Sabre/DAV/StringUtilTest.php
index 8888f0276..e98fe9048 100644
--- a/vendor/sabre/dav/tests/Sabre/DAV/StringUtilTest.php
+++ b/vendor/sabre/dav/tests/Sabre/DAV/StringUtilTest.php
@@ -5,6 +5,13 @@ namespace Sabre\DAV;
class StringUtilTest extends \PHPUnit_Framework_TestCase {
/**
+ * @param string $haystack
+ * @param string $needle
+ * @param string $collation
+ * @param string $matchType
+ * @param string $result
+ * @throws Exception\BadRequest
+ *
* @dataProvider dataset
*/
function testTextMatch($haystack, $needle, $collation, $matchType, $result) {
diff --git a/vendor/sabre/dav/tests/Sabre/DAV/TreeTest.php b/vendor/sabre/dav/tests/Sabre/DAV/TreeTest.php
index ad33200c8..e719e38d5 100644
--- a/vendor/sabre/dav/tests/Sabre/DAV/TreeTest.php
+++ b/vendor/sabre/dav/tests/Sabre/DAV/TreeTest.php
@@ -200,8 +200,8 @@ class TreeFileTester extends File implements IProperties {
* To update specific properties, call the 'handle' method on this object.
* Read the PropPatch documentation for more information.
*
- * @param array $mutations
- * @return bool|array
+ * @param PropPatch $propPatch
+ * @return void
*/
function propPatch(PropPatch $propPatch) {
@@ -220,6 +220,7 @@ class TreeMultiGetTester extends TreeDirectoryTester implements IMultiGet {
*
* If any children are not found, you do not have to return them.
*
+ * @param array $paths
* @return array
*/
function getMultipleChildren(array $paths) {
diff --git a/vendor/sabre/dav/tests/Sabre/DAVACL/PrincipalBackend/Mock.php b/vendor/sabre/dav/tests/Sabre/DAVACL/PrincipalBackend/Mock.php
index afb094a39..1464f4c26 100644
--- a/vendor/sabre/dav/tests/Sabre/DAVACL/PrincipalBackend/Mock.php
+++ b/vendor/sabre/dav/tests/Sabre/DAVACL/PrincipalBackend/Mock.php
@@ -128,7 +128,7 @@ class Mock extends AbstractBackend {
* Calling the handle method is like telling the PropPatch object "I
* promise I can handle updating this property".
*
- * Read the PropPatch documenation for more info and examples.
+ * Read the PropPatch documentation for more info and examples.
*
* @param string $path
* @param \Sabre\DAV\PropPatch $propPatch
diff --git a/vendor/sabre/http/.travis.yml b/vendor/sabre/http/.travis.yml
index 490e42e1e..8ae84d90f 100644
--- a/vendor/sabre/http/.travis.yml
+++ b/vendor/sabre/http/.travis.yml
@@ -4,6 +4,7 @@ php:
- 5.5
- 5.6
- 7
+ - 7.1
- hhvm
matrix:
@@ -16,7 +17,8 @@ env:
before_script:
- - composer self-update
+ - rm -f ~/.phpenv/versions/$(phpenv version-name)/etc/conf.d/xdebug.ini
+# - composer self-update
- composer update --prefer-source $PREFER_LOWEST
script:
diff --git a/vendor/sabre/http/CHANGELOG.md b/vendor/sabre/http/CHANGELOG.md
index 9a751d8fb..00be2d887 100644
--- a/vendor/sabre/http/CHANGELOG.md
+++ b/vendor/sabre/http/CHANGELOG.md
@@ -1,19 +1,31 @@
ChangeLog
=========
+4.2.3 (2017-06-12)
+------------------
+
+* #74, #77: Work around 4GB file size limit at 32 Bit systems
+
+
+4.2.2 (2017-01-02)
+------------------
+
+* #72: Handling clients that send invalid `Content-Length` headers.
+
+
4.2.1 (2016-01-06)
------------------
* #56: `getBodyAsString` now returns at most as many bytes as the contents of
the `Content-Length` header. This allows users to pass much larger strings
without having to copy and truncate them.
+* The client now sets a default `User-Agent` header identifying this library.
4.2.0 (2016-01-04)
------------------
* This package now supports sabre/event 3.0.
-* The client now sets a default `User-Agent` header identifying this library.
4.1.0 (2015-09-04)
diff --git a/vendor/sabre/http/LICENSE b/vendor/sabre/http/LICENSE
index 19812ad7a..864041b22 100644
--- a/vendor/sabre/http/LICENSE
+++ b/vendor/sabre/http/LICENSE
@@ -1,4 +1,4 @@
-Copyright (C) 2009-2016 fruux GmbH (https://fruux.com/)
+Copyright (C) 2009-2017 fruux GmbH (https://fruux.com/)
All rights reserved.
diff --git a/vendor/sabre/http/composer.json b/vendor/sabre/http/composer.json
index b061194cf..507d5d28d 100644
--- a/vendor/sabre/http/composer.json
+++ b/vendor/sabre/http/composer.json
@@ -7,6 +7,7 @@
"require" : {
"php" : ">=5.4",
"ext-mbstring" : "*",
+ "ext-ctype" : "*",
"sabre/event" : ">=1.0.0,<4.0.0",
"sabre/uri" : "~1.0"
},
diff --git a/vendor/sabre/http/lib/Message.php b/vendor/sabre/http/lib/Message.php
index 5c6887d8a..45bd18398 100644
--- a/vendor/sabre/http/lib/Message.php
+++ b/vendor/sabre/http/lib/Message.php
@@ -75,12 +75,11 @@ abstract class Message implements MessageInterface {
return '';
}
$contentLength = $this->getHeader('Content-Length');
- if (null === $contentLength) {
- return stream_get_contents($body);
- } else {
+ if (is_int($contentLength) || ctype_digit($contentLength)) {
return stream_get_contents($body, $contentLength);
+ } else {
+ return stream_get_contents($body);
}
-
}
/**
@@ -189,7 +188,7 @@ abstract class Message implements MessageInterface {
/**
* Updates a HTTP header.
*
- * The case-sensitity of the name value must be retained as-is.
+ * The case-sensitivity of the name value must be retained as-is.
*
* If the header already existed, it will be overwritten.
*
@@ -270,10 +269,11 @@ abstract class Message implements MessageInterface {
/**
* Removes a HTTP header.
*
- * The specified header name must be treated as case-insenstive.
+ * The specified header name must be treated as case-insensitive.
* This method should return true if the header was successfully deleted,
* and false if the header did not exist.
*
+ * @param string $name
* @return bool
*/
function removeHeader($name) {
diff --git a/vendor/sabre/http/lib/MessageDecoratorTrait.php b/vendor/sabre/http/lib/MessageDecoratorTrait.php
index f104af38d..1cb32da22 100644
--- a/vendor/sabre/http/lib/MessageDecoratorTrait.php
+++ b/vendor/sabre/http/lib/MessageDecoratorTrait.php
@@ -144,7 +144,7 @@ trait MessageDecoratorTrait {
/**
* Updates a HTTP header.
*
- * The case-sensitity of the name value must be retained as-is.
+ * The case-sensitivity of the name value must be retained as-is.
*
* If the header already existed, it will be overwritten.
*
@@ -210,15 +210,16 @@ trait MessageDecoratorTrait {
/**
* Removes a HTTP header.
*
- * The specified header name must be treated as case-insenstive.
+ * The specified header name must be treated as case-insensitive.
* This method should return true if the header was successfully deleted,
* and false if the header did not exist.
*
+ * @param string $name
* @return bool
*/
function removeHeader($name) {
- $this->inner->removeHeader($name);
+ return $this->inner->removeHeader($name);
}
diff --git a/vendor/sabre/http/lib/MessageInterface.php b/vendor/sabre/http/lib/MessageInterface.php
index 55d8485c1..df55beb2f 100644
--- a/vendor/sabre/http/lib/MessageInterface.php
+++ b/vendor/sabre/http/lib/MessageInterface.php
@@ -44,7 +44,7 @@ interface MessageInterface {
/**
* Updates the body resource with a new stream.
*
- * @param resource $body
+ * @param resource|string $body
* @return void
*/
function setBody($body);
@@ -153,6 +153,7 @@ interface MessageInterface {
* This method should return true if the header was successfully deleted,
* and false if the header did not exist.
*
+ * @param string $name
* @return bool
*/
function removeHeader($name);
diff --git a/vendor/sabre/http/lib/Request.php b/vendor/sabre/http/lib/Request.php
index 8bcaf32a6..dfa3d5b48 100644
--- a/vendor/sabre/http/lib/Request.php
+++ b/vendor/sabre/http/lib/Request.php
@@ -301,7 +301,7 @@ class Request extends Message implements RequestInterface {
foreach ($value as $v) {
if ($key === 'Authorization') {
list($v) = explode(' ', $v, 2);
- $v .= ' REDACTED';
+ $v .= ' REDACTED';
}
$out .= $key . ": " . $v . "\r\n";
}
diff --git a/vendor/sabre/http/lib/Response.php b/vendor/sabre/http/lib/Response.php
index d2ba6d40d..01920d8d9 100644
--- a/vendor/sabre/http/lib/Response.php
+++ b/vendor/sabre/http/lib/Response.php
@@ -100,7 +100,6 @@ class Response extends Message implements ResponseInterface {
* @param string|int $status
* @param array $headers
* @param resource $body
- * @return void
*/
function __construct($status = null, array $headers = null, $body = null) {
@@ -145,7 +144,7 @@ class Response extends Message implements ResponseInterface {
* added.
*
* @param string|int $status
- * @throws \InvalidArgumentExeption
+ * @throws \InvalidArgumentException
* @return void
*/
function setStatus($status) {
diff --git a/vendor/sabre/http/lib/ResponseInterface.php b/vendor/sabre/http/lib/ResponseInterface.php
index c0ecc35ae..411cdc06c 100644
--- a/vendor/sabre/http/lib/ResponseInterface.php
+++ b/vendor/sabre/http/lib/ResponseInterface.php
@@ -37,7 +37,7 @@ interface ResponseInterface extends MessageInterface {
* added.
*
* @param string|int $status
- * @throws \InvalidArgumentExeption
+ * @throws \InvalidArgumentException
* @return void
*/
function setStatus($status);
diff --git a/vendor/sabre/http/lib/Sapi.php b/vendor/sabre/http/lib/Sapi.php
index 6c83c8719..6fc6452e4 100644
--- a/vendor/sabre/http/lib/Sapi.php
+++ b/vendor/sabre/http/lib/Sapi.php
@@ -75,7 +75,15 @@ class Sapi {
if ($contentLength !== null) {
$output = fopen('php://output', 'wb');
if (is_resource($body) && get_resource_type($body) == 'stream') {
- stream_copy_to_stream($body, $output, $contentLength);
+ if (PHP_INT_SIZE !== 4){
+ // use the dedicated function on 64 Bit systems
+ stream_copy_to_stream($body, $output, $contentLength);
+ } else {
+ // workaround for 32 Bit systems to avoid stream_copy_to_stream
+ while (!feof($body)) {
+ fwrite($output, fread($body, 8192));
+ }
+ }
} else {
fwrite($output, $body, $contentLength);
}
diff --git a/vendor/sabre/http/lib/URLUtil.php b/vendor/sabre/http/lib/URLUtil.php
index 474856348..85c0e1150 100644
--- a/vendor/sabre/http/lib/URLUtil.php
+++ b/vendor/sabre/http/lib/URLUtil.php
@@ -10,7 +10,7 @@ use Sabre\URI;
* Note: this class is deprecated. All its functionality moved to functions.php
* or sabre\uri.
*
- * @deprectated
+ * @deprecated
* @copyright Copyright (C) fruux GmbH (https://fruux.com/)
* @author Evert Pot (http://evertpot.com/)
* @license http://sabre.io/license/ Modified BSD License
diff --git a/vendor/sabre/http/lib/Util.php b/vendor/sabre/http/lib/Util.php
index 83bde50a4..e3f13a645 100644
--- a/vendor/sabre/http/lib/Util.php
+++ b/vendor/sabre/http/lib/Util.php
@@ -31,7 +31,7 @@ class Util {
* Deprecated! Use negotiateContentType.
*
* @deprecated Use \Sabre\HTTP\NegotiateContentType
- * @param string|null $acceptHeader
+ * @param string|null $acceptHeaderValue
* @param array $availableOptions
* @return string|null
*/
diff --git a/vendor/sabre/http/lib/Version.php b/vendor/sabre/http/lib/Version.php
index 789ee4543..aeb080e93 100644
--- a/vendor/sabre/http/lib/Version.php
+++ b/vendor/sabre/http/lib/Version.php
@@ -14,6 +14,6 @@ class Version {
/**
* Full version number
*/
- const VERSION = '4.2.1';
+ const VERSION = '4.2.3';
}
diff --git a/vendor/sabre/http/lib/functions.php b/vendor/sabre/http/lib/functions.php
index 1ec123f2e..d94119623 100644
--- a/vendor/sabre/http/lib/functions.php
+++ b/vendor/sabre/http/lib/functions.php
@@ -79,7 +79,7 @@ function toDate(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'));
+ $dateTime->setTimezone(new \DateTimeZone('GMT'));
return $dateTime->format('D, d M Y H:i:s \G\M\T');
}
@@ -216,7 +216,7 @@ function negotiateContentType($acceptHeaderValue, array $availableOptions) {
* Parameters are currently discarded. There's no known prefer value that
* uses them.
*
- * @param string|string[] $header
+ * @param string|string[] $input
* @return array
*/
function parsePrefer($input) {
diff --git a/vendor/sabre/uri/.travis.yml b/vendor/sabre/uri/.travis.yml
index f7d1a0657..75c8270df 100644
--- a/vendor/sabre/uri/.travis.yml
+++ b/vendor/sabre/uri/.travis.yml
@@ -3,8 +3,8 @@ php:
- 5.4
- 5.5
- 5.6
- - hhvm
- 7
+ - 7.1
script:
- ./bin/phpunit --configuration tests/phpunit.xml.dist
diff --git a/vendor/sabre/uri/CHANGELOG.md b/vendor/sabre/uri/CHANGELOG.md
index 9fa510dc2..92aaa7507 100644
--- a/vendor/sabre/uri/CHANGELOG.md
+++ b/vendor/sabre/uri/CHANGELOG.md
@@ -1,6 +1,29 @@
ChangeLog
=========
+1.2.1 (2017-02-20)
+------------------
+
+* #16: Correctly parse urls that are only a fragment `#`.
+
+
+1.2.0 (2016-12-06)
+------------------
+
+* Now throwing `InvalidUriException` if a uri passed to the `parse` function
+ is invalid or could not be parsed.
+* #11: Fix support for URIs that start with a triple slash. PHP's `parse_uri()`
+ doesn't support them, so we now have a pure-php fallback in case it fails.
+* #9: Fix support for relative URI's that have a non-uri encoded colon `:` in
+ them.
+
+
+1.1.1 (2016-10-27)
+------------------
+
+* #10: Correctly support file:// URIs in the build() method. (@yuloh)
+
+
1.1.0 (2016-03-07)
------------------
diff --git a/vendor/sabre/uri/LICENSE b/vendor/sabre/uri/LICENSE
index 9a3a91946..087996be7 100644
--- a/vendor/sabre/uri/LICENSE
+++ b/vendor/sabre/uri/LICENSE
@@ -1,4 +1,4 @@
-Copyright (C) 2014-2016 fruux GmbH (https://fruux.com/)
+Copyright (C) 2014-2017 fruux GmbH (https://fruux.com/)
All rights reserved.
diff --git a/vendor/sabre/uri/README.md b/vendor/sabre/uri/README.md
index 76f55d8e4..aa21bfe06 100644
--- a/vendor/sabre/uri/README.md
+++ b/vendor/sabre/uri/README.md
@@ -25,14 +25,6 @@ Further reading
* [Usage][8]
-Build status
-------------
-
-| branch | status |
-| ------ | ------ |
-| master | [![Build Status](https://travis-ci.org/fruux/sabre-uri.svg?branch=master)](https://travis-ci.org/fruux/sabre-uri) |
-
-
Questions?
----------
diff --git a/vendor/sabre/uri/composer.json b/vendor/sabre/uri/composer.json
index 7b48acb71..49d69e723 100644
--- a/vendor/sabre/uri/composer.json
+++ b/vendor/sabre/uri/composer.json
@@ -32,8 +32,8 @@
}
},
"require-dev": {
- "sabre/cs": "~0.0.1",
- "phpunit/phpunit" : "*"
+ "sabre/cs": "~1.0.0",
+ "phpunit/phpunit" : ">=4.0,<6.0"
},
"config" : {
"bin-dir" : "bin/"
diff --git a/vendor/sabre/uri/lib/InvalidUriException.php b/vendor/sabre/uri/lib/InvalidUriException.php
new file mode 100644
index 000000000..0385fd462
--- /dev/null
+++ b/vendor/sabre/uri/lib/InvalidUriException.php
@@ -0,0 +1,17 @@
+<?php
+
+namespace Sabre\Uri;
+
+/**
+ * Invalid Uri
+ *
+ * This is thrown when an attempt was made to use Sabre\Uri parse a uri that
+ * it could not.
+ *
+ * @copyright Copyright (C) fruux GmbH (https://fruux.com/)
+ * @author Evert Pot (https://evertpot.com/)
+ * @license http://sabre.io/license/
+ */
+class InvalidUriException extends \Exception {
+
+}
diff --git a/vendor/sabre/uri/lib/Version.php b/vendor/sabre/uri/lib/Version.php
index 88678d4d5..fa544538b 100644
--- a/vendor/sabre/uri/lib/Version.php
+++ b/vendor/sabre/uri/lib/Version.php
@@ -14,6 +14,6 @@ class Version {
/**
* Full version number
*/
- const VERSION = '1.1.0';
+ const VERSION = '1.2.1';
}
diff --git a/vendor/sabre/uri/lib/functions.php b/vendor/sabre/uri/lib/functions.php
index 06181aef0..39b4a6f08 100644
--- a/vendor/sabre/uri/lib/functions.php
+++ b/vendor/sabre/uri/lib/functions.php
@@ -45,8 +45,8 @@ function resolve($basePath, $newPath) {
$newParts = [];
$newParts['scheme'] = $pick('scheme');
- $newParts['host'] = $pick('host');
- $newParts['port'] = $pick('port');
+ $newParts['host'] = $pick('host');
+ $newParts['port'] = $pick('port');
$path = '';
if ($delta['path']) {
@@ -193,8 +193,13 @@ function parse($uri) {
$uri
);
+ $result = parse_url($uri);
+ if (!$result) {
+ $result = _parse_fallback($uri);
+ }
+
return
- parse_url($uri) + [
+ $result + [
'scheme' => null,
'host' => null,
'path' => null,
@@ -233,7 +238,7 @@ function build(array $parts) {
$uri = $parts['scheme'] . ':';
}
- if ($authority) {
+ if ($authority || (!empty($parts['scheme']) && $parts['scheme'] === 'file')) {
// No scheme, but there is a host.
$uri .= '//' . $authority;
@@ -280,3 +285,89 @@ function split($path) {
return [null,null];
}
+
+/**
+ * This function is another implementation of parse_url, except this one is
+ * fully written in PHP.
+ *
+ * The reason is that the PHP bug team is not willing to admit that there are
+ * bugs in the parse_url implementation.
+ *
+ * This function is only called if the main parse method fails. It's pretty
+ * crude and probably slow, so the original parse_url is usually preferred.
+ *
+ * @param string $uri
+ * @return array
+ */
+function _parse_fallback($uri) {
+
+ // Normally a URI must be ASCII, however. However, often it's not and
+ // parse_url might corrupt these strings.
+ //
+ // For that reason we take any non-ascii characters from the uri and
+ // uriencode them first.
+ $uri = preg_replace_callback(
+ '/[^[:ascii:]]/u',
+ function($matches) {
+ return rawurlencode($matches[0]);
+ },
+ $uri
+ );
+
+ $result = [
+ 'scheme' => null,
+ 'host' => null,
+ 'port' => null,
+ 'user' => null,
+ 'path' => null,
+ 'fragment' => null,
+ 'query' => null,
+ ];
+
+ if (preg_match('% ^([A-Za-z][A-Za-z0-9+-\.]+): %x', $uri, $matches)) {
+
+ $result['scheme'] = $matches[1];
+ // Take what's left.
+ $uri = substr($uri, strlen($result['scheme']) + 1);
+
+ }
+
+ // Taking off a fragment part
+ if (strpos($uri, '#') !== false) {
+ list($uri, $result['fragment']) = explode('#', $uri, 2);
+ }
+ // Taking off the query part
+ if (strpos($uri, '?') !== false) {
+ list($uri, $result['query']) = explode('?', $uri, 2);
+ }
+
+ if (substr($uri, 0, 3) === '///') {
+ // The triple slash uris are a bit unusual, but we have special handling
+ // for them.
+ $result['path'] = substr($uri, 2);
+ $result['host'] = '';
+ } elseif (substr($uri, 0, 2) === '//') {
+ // Uris that have an authority part.
+ $regex = '
+ %^
+ //
+ (?: (?<user> [^:@]+) (: (?<pass> [^@]+)) @)?
+ (?<host> ( [^:/]* | \[ [^\]]+ \] ))
+ (?: : (?<port> [0-9]+))?
+ (?<path> / .*)?
+ $%x
+ ';
+ if (!preg_match($regex, $uri, $matches)) {
+ throw new InvalidUriException('Invalid, or could not parse URI');
+ }
+ if ($matches['host']) $result['host'] = $matches['host'];
+ if ($matches['port']) $result['port'] = (int)$matches['port'];
+ if (isset($matches['path'])) $result['path'] = $matches['path'];
+ if ($matches['user']) $result['user'] = $matches['user'];
+ if ($matches['pass']) $result['pass'] = $matches['pass'];
+ } else {
+ $result['path'] = $uri;
+ }
+
+ return $result;
+}
diff --git a/vendor/sabre/vobject/.travis.yml b/vendor/sabre/vobject/.travis.yml
index b7266a878..3c5b32157 100644
--- a/vendor/sabre/vobject/.travis.yml
+++ b/vendor/sabre/vobject/.travis.yml
@@ -2,7 +2,8 @@ language: php
php:
- 5.5
- 5.6
- - 7
+ - 7.0
+ - 7.1
sudo: false
diff --git a/vendor/sabre/vobject/CHANGELOG.md b/vendor/sabre/vobject/CHANGELOG.md
index 4c72680f8..c8f4cb4be 100644
--- a/vendor/sabre/vobject/CHANGELOG.md
+++ b/vendor/sabre/vobject/CHANGELOG.md
@@ -1,6 +1,22 @@
ChangeLog
=========
+4.1.2 (2016-12-15)
+------------------
+
+* #340: Support for `BYYEARDAY` recurrence when `FREQ=YEARLY`. (@PHPGangsta)
+* #341: Support for `BYWEEKNO` recurrence when `FREQ=YEARLY`. (@PHPGangsta)
+* Updated to the latest windows timezone data mappings.
+* #344: Auto-detecting more Outlook 365-generated timezone identifiers.
+ (@jpirkey)
+* #348: `FreeBusyGenerator` can now accept streams.
+* Support sabre/xml 1.5 and 2.0.
+* #355: Support `DateTimeInterface` in more places where only `DateTime` was
+ supported. (@gharlan).
+* #351: Fixing an inclusive/exclusive problem with `isInTimeRange` and
+ `fastForward` with all-day events. (@strokyl, thanks you are brilliant).
+
+
4.1.1 (2016-07-15)
------------------
@@ -143,7 +159,7 @@ ChangeLog
and `IntegerValue` to allow PHP 7 compatibility.
-3.5.3 (????-??-??)
+3.5.3 (2016-10-06)
------------------
* #331: Fix dealing with multiple overridden instances falling on the same
diff --git a/vendor/sabre/vobject/bin/fetch_windows_zones.php b/vendor/sabre/vobject/bin/fetch_windows_zones.php
index 1b1fdc37c..3f2a00f7a 100755
--- a/vendor/sabre/vobject/bin/fetch_windows_zones.php
+++ b/vendor/sabre/vobject/bin/fetch_windows_zones.php
@@ -36,7 +36,7 @@ fwrite($f, " *\n");
fwrite($f, " * Last update: " . date(DATE_W3C) . "\n");
fwrite($f, " * Source: " . $windowsZonesUrl . "\n");
fwrite($f, " *\n");
-fwrite($f, " * @copyright Copyright (C) 2011-2015 fruux GmbH (https://fruux.com/).\n");
+fwrite($f, " * @copyright Copyright (C) fruux GmbH (https://fruux.com/).\n");
fwrite($f, " * @license http://sabre.io/license/ Modified BSD License\n");
fwrite($f, " */\n");
fwrite($f, "\n");
diff --git a/vendor/sabre/vobject/composer.json b/vendor/sabre/vobject/composer.json
index bd6348a82..cfa4a712d 100644
--- a/vendor/sabre/vobject/composer.json
+++ b/vendor/sabre/vobject/composer.json
@@ -34,11 +34,11 @@
"require" : {
"php" : ">=5.5",
"ext-mbstring" : "*",
- "sabre/xml" : "~1.1"
+ "sabre/xml" : ">=1.5 <3.0"
},
"require-dev" : {
"phpunit/phpunit" : "*",
- "sabre/cs" : "~0.0.3"
+ "sabre/cs" : "^1.0.0"
},
"suggest" : {
diff --git a/vendor/sabre/vobject/lib/BirthdayCalendarGenerator.php b/vendor/sabre/vobject/lib/BirthdayCalendarGenerator.php
index afa41ab1c..553912249 100644
--- a/vendor/sabre/vobject/lib/BirthdayCalendarGenerator.php
+++ b/vendor/sabre/vobject/lib/BirthdayCalendarGenerator.php
@@ -159,10 +159,10 @@ class BirthdayCalendarGenerator {
// Create event.
$event = $calendar->add('VEVENT', [
- 'SUMMARY' => sprintf($this->format, $object->FN->getValue()),
- 'DTSTART' => new \DateTime($object->BDAY->getValue()),
- 'RRULE' => 'FREQ=YEARLY',
- 'TRANSP' => 'TRANSPARENT',
+ 'SUMMARY' => sprintf($this->format, $object->FN->getValue()),
+ 'DTSTART' => new \DateTime($object->BDAY->getValue()),
+ 'RRULE' => 'FREQ=YEARLY',
+ 'TRANSP' => 'TRANSPARENT',
]);
// add VALUE=date
diff --git a/vendor/sabre/vobject/lib/Component/VAlarm.php b/vendor/sabre/vobject/lib/Component/VAlarm.php
index 8cbd572e6..faa8a5e74 100644
--- a/vendor/sabre/vobject/lib/Component/VAlarm.php
+++ b/vendor/sabre/vobject/lib/Component/VAlarm.php
@@ -2,10 +2,10 @@
namespace Sabre\VObject\Component;
+use DateTimeImmutable;
+use DateTimeInterface;
use Sabre\VObject;
use Sabre\VObject\InvalidDataException;
-use DateTimeInterface;
-use DateTimeImmutable;
/**
* VAlarm component.
diff --git a/vendor/sabre/vobject/lib/Component/VCalendar.php b/vendor/sabre/vobject/lib/Component/VCalendar.php
index 988db9dc2..1b3137d38 100644
--- a/vendor/sabre/vobject/lib/Component/VCalendar.php
+++ b/vendor/sabre/vobject/lib/Component/VCalendar.php
@@ -6,10 +6,10 @@ use DateTimeInterface;
use DateTimeZone;
use Sabre\VObject;
use Sabre\VObject\Component;
+use Sabre\VObject\InvalidDataException;
use Sabre\VObject\Property;
use Sabre\VObject\Recur\EventIterator;
use Sabre\VObject\Recur\NoInstancesException;
-use Sabre\VObject\InvalidDataException;
/**
* The VCalendar component.
@@ -54,21 +54,21 @@ class VCalendar extends VObject\Document {
* @var array
*/
static $valueMap = [
- 'BINARY' => 'Sabre\\VObject\\Property\\Binary',
- 'BOOLEAN' => 'Sabre\\VObject\\Property\\Boolean',
- 'CAL-ADDRESS' => 'Sabre\\VObject\\Property\\ICalendar\\CalAddress',
- 'DATE' => 'Sabre\\VObject\\Property\\ICalendar\\Date',
- 'DATE-TIME' => 'Sabre\\VObject\\Property\\ICalendar\\DateTime',
- 'DURATION' => 'Sabre\\VObject\\Property\\ICalendar\\Duration',
- 'FLOAT' => 'Sabre\\VObject\\Property\\FloatValue',
- 'INTEGER' => 'Sabre\\VObject\\Property\\IntegerValue',
- 'PERIOD' => 'Sabre\\VObject\\Property\\ICalendar\\Period',
- 'RECUR' => 'Sabre\\VObject\\Property\\ICalendar\\Recur',
- 'TEXT' => 'Sabre\\VObject\\Property\\Text',
- 'TIME' => 'Sabre\\VObject\\Property\\Time',
- 'UNKNOWN' => 'Sabre\\VObject\\Property\\Unknown', // jCard / jCal-only.
- 'URI' => 'Sabre\\VObject\\Property\\Uri',
- 'UTC-OFFSET' => 'Sabre\\VObject\\Property\\UtcOffset',
+ 'BINARY' => 'Sabre\\VObject\\Property\\Binary',
+ 'BOOLEAN' => 'Sabre\\VObject\\Property\\Boolean',
+ 'CAL-ADDRESS' => 'Sabre\\VObject\\Property\\ICalendar\\CalAddress',
+ 'DATE' => 'Sabre\\VObject\\Property\\ICalendar\\Date',
+ 'DATE-TIME' => 'Sabre\\VObject\\Property\\ICalendar\\DateTime',
+ 'DURATION' => 'Sabre\\VObject\\Property\\ICalendar\\Duration',
+ 'FLOAT' => 'Sabre\\VObject\\Property\\FloatValue',
+ 'INTEGER' => 'Sabre\\VObject\\Property\\IntegerValue',
+ 'PERIOD' => 'Sabre\\VObject\\Property\\ICalendar\\Period',
+ 'RECUR' => 'Sabre\\VObject\\Property\\ICalendar\\Recur',
+ 'TEXT' => 'Sabre\\VObject\\Property\\Text',
+ 'TIME' => 'Sabre\\VObject\\Property\\Time',
+ 'UNKNOWN' => 'Sabre\\VObject\\Property\\Unknown', // jCard / jCal-only.
+ 'URI' => 'Sabre\\VObject\\Property\\Uri',
+ 'UTC-OFFSET' => 'Sabre\\VObject\\Property\\UtcOffset',
];
/**
@@ -78,40 +78,40 @@ class VCalendar extends VObject\Document {
*/
static $propertyMap = [
// Calendar properties
- 'CALSCALE' => 'Sabre\\VObject\\Property\\FlatText',
- 'METHOD' => 'Sabre\\VObject\\Property\\FlatText',
- 'PRODID' => 'Sabre\\VObject\\Property\\FlatText',
- 'VERSION' => 'Sabre\\VObject\\Property\\FlatText',
+ 'CALSCALE' => 'Sabre\\VObject\\Property\\FlatText',
+ 'METHOD' => 'Sabre\\VObject\\Property\\FlatText',
+ 'PRODID' => 'Sabre\\VObject\\Property\\FlatText',
+ 'VERSION' => 'Sabre\\VObject\\Property\\FlatText',
// Component properties
- 'ATTACH' => 'Sabre\\VObject\\Property\\Uri',
- 'CATEGORIES' => 'Sabre\\VObject\\Property\\Text',
- 'CLASS' => 'Sabre\\VObject\\Property\\FlatText',
- 'COMMENT' => 'Sabre\\VObject\\Property\\FlatText',
- 'DESCRIPTION' => 'Sabre\\VObject\\Property\\FlatText',
- 'GEO' => 'Sabre\\VObject\\Property\\FloatValue',
- 'LOCATION' => 'Sabre\\VObject\\Property\\FlatText',
- 'PERCENT-COMPLETE' => 'Sabre\\VObject\\Property\\IntegerValue',
- 'PRIORITY' => 'Sabre\\VObject\\Property\\IntegerValue',
- 'RESOURCES' => 'Sabre\\VObject\\Property\\Text',
- 'STATUS' => 'Sabre\\VObject\\Property\\FlatText',
- 'SUMMARY' => 'Sabre\\VObject\\Property\\FlatText',
+ 'ATTACH' => 'Sabre\\VObject\\Property\\Uri',
+ 'CATEGORIES' => 'Sabre\\VObject\\Property\\Text',
+ 'CLASS' => 'Sabre\\VObject\\Property\\FlatText',
+ 'COMMENT' => 'Sabre\\VObject\\Property\\FlatText',
+ 'DESCRIPTION' => 'Sabre\\VObject\\Property\\FlatText',
+ 'GEO' => 'Sabre\\VObject\\Property\\FloatValue',
+ 'LOCATION' => 'Sabre\\VObject\\Property\\FlatText',
+ 'PERCENT-COMPLETE' => 'Sabre\\VObject\\Property\\IntegerValue',
+ 'PRIORITY' => 'Sabre\\VObject\\Property\\IntegerValue',
+ 'RESOURCES' => 'Sabre\\VObject\\Property\\Text',
+ 'STATUS' => 'Sabre\\VObject\\Property\\FlatText',
+ 'SUMMARY' => 'Sabre\\VObject\\Property\\FlatText',
// Date and Time Component Properties
- 'COMPLETED' => 'Sabre\\VObject\\Property\\ICalendar\\DateTime',
- 'DTEND' => 'Sabre\\VObject\\Property\\ICalendar\\DateTime',
- 'DUE' => 'Sabre\\VObject\\Property\\ICalendar\\DateTime',
- 'DTSTART' => 'Sabre\\VObject\\Property\\ICalendar\\DateTime',
- 'DURATION' => 'Sabre\\VObject\\Property\\ICalendar\\Duration',
- 'FREEBUSY' => 'Sabre\\VObject\\Property\\ICalendar\\Period',
- 'TRANSP' => 'Sabre\\VObject\\Property\\FlatText',
+ 'COMPLETED' => 'Sabre\\VObject\\Property\\ICalendar\\DateTime',
+ 'DTEND' => 'Sabre\\VObject\\Property\\ICalendar\\DateTime',
+ 'DUE' => 'Sabre\\VObject\\Property\\ICalendar\\DateTime',
+ 'DTSTART' => 'Sabre\\VObject\\Property\\ICalendar\\DateTime',
+ 'DURATION' => 'Sabre\\VObject\\Property\\ICalendar\\Duration',
+ 'FREEBUSY' => 'Sabre\\VObject\\Property\\ICalendar\\Period',
+ 'TRANSP' => 'Sabre\\VObject\\Property\\FlatText',
// Time Zone Component Properties
- 'TZID' => 'Sabre\\VObject\\Property\\FlatText',
- 'TZNAME' => 'Sabre\\VObject\\Property\\FlatText',
- 'TZOFFSETFROM' => 'Sabre\\VObject\\Property\\UtcOffset',
- 'TZOFFSETTO' => 'Sabre\\VObject\\Property\\UtcOffset',
- 'TZURL' => 'Sabre\\VObject\\Property\\Uri',
+ 'TZID' => 'Sabre\\VObject\\Property\\FlatText',
+ 'TZNAME' => 'Sabre\\VObject\\Property\\FlatText',
+ 'TZOFFSETFROM' => 'Sabre\\VObject\\Property\\UtcOffset',
+ 'TZOFFSETTO' => 'Sabre\\VObject\\Property\\UtcOffset',
+ 'TZURL' => 'Sabre\\VObject\\Property\\Uri',
// Relationship Component Properties
'ATTENDEE' => 'Sabre\\VObject\\Property\\ICalendar\\CalAddress',
@@ -123,15 +123,15 @@ class VCalendar extends VObject\Document {
'UID' => 'Sabre\\VObject\\Property\\FlatText',
// Recurrence Component Properties
- 'EXDATE' => 'Sabre\\VObject\\Property\\ICalendar\\DateTime',
- 'RDATE' => 'Sabre\\VObject\\Property\\ICalendar\\DateTime',
- 'RRULE' => 'Sabre\\VObject\\Property\\ICalendar\\Recur',
- 'EXRULE' => 'Sabre\\VObject\\Property\\ICalendar\\Recur', // Deprecated since rfc5545
+ 'EXDATE' => 'Sabre\\VObject\\Property\\ICalendar\\DateTime',
+ 'RDATE' => 'Sabre\\VObject\\Property\\ICalendar\\DateTime',
+ 'RRULE' => 'Sabre\\VObject\\Property\\ICalendar\\Recur',
+ 'EXRULE' => 'Sabre\\VObject\\Property\\ICalendar\\Recur', // Deprecated since rfc5545
// Alarm Component Properties
- 'ACTION' => 'Sabre\\VObject\\Property\\FlatText',
- 'REPEAT' => 'Sabre\\VObject\\Property\\IntegerValue',
- 'TRIGGER' => 'Sabre\\VObject\\Property\\ICalendar\\Duration',
+ 'ACTION' => 'Sabre\\VObject\\Property\\FlatText',
+ 'REPEAT' => 'Sabre\\VObject\\Property\\IntegerValue',
+ 'TRIGGER' => 'Sabre\\VObject\\Property\\ICalendar\\Duration',
// Change Management Component Properties
'CREATED' => 'Sabre\\VObject\\Property\\ICalendar\\DateTime',
@@ -143,13 +143,13 @@ class VCalendar extends VObject\Document {
'REQUEST-STATUS' => 'Sabre\\VObject\\Property\\Text',
// Additions from draft-daboo-valarm-extensions-04
- 'ALARM-AGENT' => 'Sabre\\VObject\\Property\\Text',
- 'ACKNOWLEDGED' => 'Sabre\\VObject\\Property\\ICalendar\\DateTime',
- 'PROXIMITY' => 'Sabre\\VObject\\Property\\Text',
- 'DEFAULT-ALARM' => 'Sabre\\VObject\\Property\\Boolean',
+ 'ALARM-AGENT' => 'Sabre\\VObject\\Property\\Text',
+ 'ACKNOWLEDGED' => 'Sabre\\VObject\\Property\\ICalendar\\DateTime',
+ 'PROXIMITY' => 'Sabre\\VObject\\Property\\Text',
+ 'DEFAULT-ALARM' => 'Sabre\\VObject\\Property\\Boolean',
// Additions from draft-daboo-calendar-availability-05
- 'BUSYTYPE' => 'Sabre\\VObject\\Property\\Text',
+ 'BUSYTYPE' => 'Sabre\\VObject\\Property\\Text',
];
diff --git a/vendor/sabre/vobject/lib/Component/VCard.php b/vendor/sabre/vobject/lib/Component/VCard.php
index 3c05191a9..4f620de10 100644
--- a/vendor/sabre/vobject/lib/Component/VCard.php
+++ b/vendor/sabre/vobject/lib/Component/VCard.php
@@ -74,19 +74,19 @@ class VCard extends VObject\Document {
static $propertyMap = [
// vCard 2.1 properties and up
- 'N' => 'Sabre\\VObject\\Property\\Text',
- 'FN' => 'Sabre\\VObject\\Property\\FlatText',
- 'PHOTO' => 'Sabre\\VObject\\Property\\Binary',
- 'BDAY' => 'Sabre\\VObject\\Property\\VCard\\DateAndOrTime',
- 'ADR' => 'Sabre\\VObject\\Property\\Text',
- 'LABEL' => 'Sabre\\VObject\\Property\\FlatText', // Removed in vCard 4.0
- 'TEL' => 'Sabre\\VObject\\Property\\FlatText',
- 'EMAIL' => 'Sabre\\VObject\\Property\\FlatText',
- 'MAILER' => 'Sabre\\VObject\\Property\\FlatText', // Removed in vCard 4.0
- 'GEO' => 'Sabre\\VObject\\Property\\FlatText',
- 'TITLE' => 'Sabre\\VObject\\Property\\FlatText',
- 'ROLE' => 'Sabre\\VObject\\Property\\FlatText',
- 'LOGO' => 'Sabre\\VObject\\Property\\Binary',
+ 'N' => 'Sabre\\VObject\\Property\\Text',
+ 'FN' => 'Sabre\\VObject\\Property\\FlatText',
+ 'PHOTO' => 'Sabre\\VObject\\Property\\Binary',
+ 'BDAY' => 'Sabre\\VObject\\Property\\VCard\\DateAndOrTime',
+ 'ADR' => 'Sabre\\VObject\\Property\\Text',
+ 'LABEL' => 'Sabre\\VObject\\Property\\FlatText', // Removed in vCard 4.0
+ 'TEL' => 'Sabre\\VObject\\Property\\FlatText',
+ 'EMAIL' => 'Sabre\\VObject\\Property\\FlatText',
+ 'MAILER' => 'Sabre\\VObject\\Property\\FlatText', // Removed in vCard 4.0
+ 'GEO' => 'Sabre\\VObject\\Property\\FlatText',
+ 'TITLE' => 'Sabre\\VObject\\Property\\FlatText',
+ 'ROLE' => 'Sabre\\VObject\\Property\\FlatText',
+ 'LOGO' => 'Sabre\\VObject\\Property\\Binary',
// 'AGENT' => 'Sabre\\VObject\\Property\\', // Todo: is an embedded vCard. Probably rare, so
// not supported at the moment
'ORG' => 'Sabre\\VObject\\Property\\Text',
@@ -107,13 +107,13 @@ class VCard extends VObject\Document {
'CLASS' => 'Sabre\\VObject\\Property\\FlatText', // Removed in vCard 4.0
// rfc2739 properties
- 'FBURL' => 'Sabre\\VObject\\Property\\Uri',
- 'CAPURI' => 'Sabre\\VObject\\Property\\Uri',
- 'CALURI' => 'Sabre\\VObject\\Property\\Uri',
- 'CALADRURI' => 'Sabre\\VObject\\Property\\Uri',
+ 'FBURL' => 'Sabre\\VObject\\Property\\Uri',
+ 'CAPURI' => 'Sabre\\VObject\\Property\\Uri',
+ 'CALURI' => 'Sabre\\VObject\\Property\\Uri',
+ 'CALADRURI' => 'Sabre\\VObject\\Property\\Uri',
// rfc4770 properties
- 'IMPP' => 'Sabre\\VObject\\Property\\Uri',
+ 'IMPP' => 'Sabre\\VObject\\Property\\Uri',
// vCard 4.0 properties
'SOURCE' => 'Sabre\\VObject\\Property\\Uri',
@@ -127,9 +127,9 @@ class VCard extends VObject\Document {
'RELATED' => 'Sabre\\VObject\\Property\\Uri',
// rfc6474 properties
- 'BIRTHPLACE' => 'Sabre\\VObject\\Property\\FlatText',
- 'DEATHPLACE' => 'Sabre\\VObject\\Property\\FlatText',
- 'DEATHDATE' => 'Sabre\\VObject\\Property\\VCard\\DateAndOrTime',
+ 'BIRTHPLACE' => 'Sabre\\VObject\\Property\\FlatText',
+ 'DEATHPLACE' => 'Sabre\\VObject\\Property\\FlatText',
+ 'DEATHDATE' => 'Sabre\\VObject\\Property\\VCard\\DateAndOrTime',
// rfc6715 properties
'EXPERTISE' => 'Sabre\\VObject\\Property\\FlatText',
@@ -368,7 +368,7 @@ class VCard extends VObject\Document {
// FN is commented out, because it's already handled by the
// validate function, which may also try to repair it.
// 'FN' => '+',
- 'UID' => '?',
+ 'UID' => '?',
];
}
diff --git a/vendor/sabre/vobject/lib/DateTimeParser.php b/vendor/sabre/vobject/lib/DateTimeParser.php
index 443bbb660..f9a802d25 100644
--- a/vendor/sabre/vobject/lib/DateTimeParser.php
+++ b/vendor/sabre/vobject/lib/DateTimeParser.php
@@ -2,9 +2,9 @@
namespace Sabre\VObject;
+use DateInterval;
use DateTimeImmutable;
use DateTimeZone;
-use DateInterval;
/**
* DateTimeParser.
@@ -509,7 +509,7 @@ class DateTimeParser {
static function parseVCardDateAndOrTime($date) {
// \d{8}|\d{4}-\d\d|--\d\d(\d\d)?|---\d\d
- $valueDate = '/^(?J)(?:' .
+ $valueDate = '/^(?J)(?:' .
'(?<year>\d{4})(?<month>\d\d)(?<date>\d\d)' .
'|(?<year>\d{4})-(?<month>\d\d)' .
'|--(?<month>\d\d)(?<date>\d\d)?' .
@@ -517,7 +517,7 @@ class DateTimeParser {
')$/';
// (\d\d(\d\d(\d\d)?)?|-\d\d(\d\d)?|--\d\d)(Z|[+\-]\d\d(\d\d)?)?
- $valueTime = '/^(?J)(?:' .
+ $valueTime = '/^(?J)(?:' .
'((?<hour>\d\d)((?<minute>\d\d)(?<second>\d\d)?)?' .
'|-(?<minute>\d\d)(?<second>\d\d)?' .
'|--(?<second>\d\d))' .
@@ -554,12 +554,12 @@ class DateTimeParser {
];
// The $valueDateTime expression has a bug with (?J) so we simulate it.
- $parts['date0'] = &$parts['date'];
- $parts['date1'] = &$parts['date'];
- $parts['date2'] = &$parts['date'];
+ $parts['date0'] = &$parts['date'];
+ $parts['date1'] = &$parts['date'];
+ $parts['date2'] = &$parts['date'];
$parts['month0'] = &$parts['month'];
$parts['month1'] = &$parts['month'];
- $parts['year0'] = &$parts['year'];
+ $parts['year0'] = &$parts['year'];
foreach ($parts as $part => &$value) {
if (!empty($matches[$part])) {
diff --git a/vendor/sabre/vobject/lib/FreeBusyGenerator.php b/vendor/sabre/vobject/lib/FreeBusyGenerator.php
index e33621090..e30b136c4 100644
--- a/vendor/sabre/vobject/lib/FreeBusyGenerator.php
+++ b/vendor/sabre/vobject/lib/FreeBusyGenerator.php
@@ -2,8 +2,8 @@
namespace Sabre\VObject;
-use DateTimeInterface;
use DateTimeImmutable;
+use DateTimeInterface;
use DateTimeZone;
use Sabre\VObject\Component\VCalendar;
use Sabre\VObject\Recur\EventIterator;
@@ -152,7 +152,7 @@ class FreeBusyGenerator {
$this->objects = [];
foreach ($objects as $object) {
- if (is_string($object)) {
+ if (is_string($object) || is_resource($object)) {
$this->objects[] = Reader::read($object);
} elseif ($object instanceof Component) {
$this->objects[] = $object;
@@ -292,7 +292,7 @@ class FreeBusyGenerator {
list($higherStart, $higherEnd) = $higherVavail->getEffectiveStartEnd();
if (
(is_null($higherStart) || $higherStart < $compStart) &&
- (is_null($higherEnd) || $higherEnd > $compEnd)
+ (is_null($higherEnd) || $higherEnd > $compEnd)
) {
// Component is fully covered by a higher priority
diff --git a/vendor/sabre/vobject/lib/Parameter.php b/vendor/sabre/vobject/lib/Parameter.php
index 270643eab..a99a33eec 100644
--- a/vendor/sabre/vobject/lib/Parameter.php
+++ b/vendor/sabre/vobject/lib/Parameter.php
@@ -2,8 +2,8 @@
namespace Sabre\VObject;
-use Sabre\Xml;
use ArrayIterator;
+use Sabre\Xml;
/**
* VObject Parameter.
diff --git a/vendor/sabre/vobject/lib/Parser/Json.php b/vendor/sabre/vobject/lib/Parser/Json.php
index 370c981a8..a77258a2e 100644
--- a/vendor/sabre/vobject/lib/Parser/Json.php
+++ b/vendor/sabre/vobject/lib/Parser/Json.php
@@ -4,8 +4,8 @@ namespace Sabre\VObject\Parser;
use Sabre\VObject\Component\VCalendar;
use Sabre\VObject\Component\VCard;
-use Sabre\VObject\ParseException;
use Sabre\VObject\EofException;
+use Sabre\VObject\ParseException;
/**
* Json Parser.
diff --git a/vendor/sabre/vobject/lib/Parser/MimeDir.php b/vendor/sabre/vobject/lib/Parser/MimeDir.php
index 6a7f9317b..fa75a1a3b 100644
--- a/vendor/sabre/vobject/lib/Parser/MimeDir.php
+++ b/vendor/sabre/vobject/lib/Parser/MimeDir.php
@@ -2,12 +2,12 @@
namespace Sabre\VObject\Parser;
-use Sabre\VObject\ParseException;
-use Sabre\VObject\EofException;
use Sabre\VObject\Component;
use Sabre\VObject\Component\VCalendar;
use Sabre\VObject\Component\VCard;
use Sabre\VObject\Document;
+use Sabre\VObject\EofException;
+use Sabre\VObject\ParseException;
/**
* MimeDir parser.
diff --git a/vendor/sabre/vobject/lib/Parser/XML.php b/vendor/sabre/vobject/lib/Parser/XML.php
index 060a7fe2e..5ac423984 100644
--- a/vendor/sabre/vobject/lib/Parser/XML.php
+++ b/vendor/sabre/vobject/lib/Parser/XML.php
@@ -20,7 +20,7 @@ use Sabre\Xml as SabreXml;
*/
class XML extends Parser {
- const XCAL_NAMESPACE = 'urn:ietf:params:xml:ns:icalendar-2.0';
+ const XCAL_NAMESPACE = 'urn:ietf:params:xml:ns:icalendar-2.0';
const XCARD_NAMESPACE = 'urn:ietf:params:xml:ns:vcard-4.0';
/**
@@ -100,7 +100,7 @@ class XML extends Parser {
foreach ($this->input['value'] as &$vCard) {
$this->root = new VCard(['version' => '4.0'], false);
- $this->pointer = &$vCard;
+ $this->pointer = &$vCard;
$this->parseVCardComponents($this->root);
// We just parse the first <vcard /> element.
@@ -172,10 +172,10 @@ class XML extends Parser {
list($namespace, $tagName) = SabreXml\Service::parseClarkNotation($xmlProperty['name']);
- $propertyName = $tagName;
- $propertyValue = [];
+ $propertyName = $tagName;
+ $propertyValue = [];
$propertyParameters = [];
- $propertyType = 'text';
+ $propertyType = 'text';
// A property which is not part of the standard.
if ($namespace !== self::XCAL_NAMESPACE
@@ -253,8 +253,8 @@ class XML extends Parser {
switch ($propertyNameExtended) {
case 'xcal:geo':
- $propertyType = 'float';
- $propertyValue['latitude'] = 0;
+ $propertyType = 'float';
+ $propertyValue['latitude'] = 0;
$propertyValue['longitude'] = 0;
foreach ($xmlProperty['value'] as $xmlRequestChild) {
@@ -296,7 +296,7 @@ class XML extends Parser {
if ('period' === $tagName) {
$propertyParameters['value'] = 'PERIOD';
- $propertyValue[] = implode('/', $specialChild['value']);
+ $propertyValue[] = implode('/', $specialChild['value']);
}
else {
@@ -306,7 +306,7 @@ class XML extends Parser {
break;
default:
- $propertyType = static::getTagName($xmlProperty['value'][0]['name']);
+ $propertyType = static::getTagName($xmlProperty['value'][0]['name']);
foreach ($xmlProperty['value'] as $value) {
$propertyValue[] = $value['value'];
@@ -343,7 +343,7 @@ class XML extends Parser {
foreach ($components as $component) {
- $componentName = static::getTagName($component['name']);
+ $componentName = static::getTagName($component['name']);
$currentComponent = $this->root->createComponent(
$componentName,
null,
@@ -404,7 +404,7 @@ class XML extends Parser {
$reader->elementMap['{' . self::XCAL_NAMESPACE . '}recur']
= 'Sabre\VObject\Parser\XML\Element\KeyValue';
$reader->xml($input);
- $input = $reader->parse();
+ $input = $reader->parse();
}
diff --git a/vendor/sabre/vobject/lib/Property/ICalendar/Duration.php b/vendor/sabre/vobject/lib/Property/ICalendar/Duration.php
index 66d366960..7b7e1ce8e 100644
--- a/vendor/sabre/vobject/lib/Property/ICalendar/Duration.php
+++ b/vendor/sabre/vobject/lib/Property/ICalendar/Duration.php
@@ -2,8 +2,8 @@
namespace Sabre\VObject\Property\ICalendar;
-use Sabre\VObject\Property;
use Sabre\VObject\DateTimeParser;
+use Sabre\VObject\Property;
/**
* Duration property.
diff --git a/vendor/sabre/vobject/lib/Property/ICalendar/Period.php b/vendor/sabre/vobject/lib/Property/ICalendar/Period.php
index a4561d929..d35b425aa 100644
--- a/vendor/sabre/vobject/lib/Property/ICalendar/Period.php
+++ b/vendor/sabre/vobject/lib/Property/ICalendar/Period.php
@@ -2,8 +2,8 @@
namespace Sabre\VObject\Property\ICalendar;
-use Sabre\VObject\Property;
use Sabre\VObject\DateTimeParser;
+use Sabre\VObject\Property;
use Sabre\Xml;
/**
diff --git a/vendor/sabre/vobject/lib/Property/ICalendar/Recur.php b/vendor/sabre/vobject/lib/Property/ICalendar/Recur.php
index 8392a5cc1..434b77088 100644
--- a/vendor/sabre/vobject/lib/Property/ICalendar/Recur.php
+++ b/vendor/sabre/vobject/lib/Property/ICalendar/Recur.php
@@ -287,6 +287,54 @@ class Recur extends Property {
}
}
}
+ // if there is no valid entry left, remove the whole value
+ if (is_array($value) && empty($values[$key])) {
+ unset($values[$key]);
+ }
+ } elseif ($key == 'BYWEEKNO') {
+ $byWeekNo = (array)$value;
+ foreach ($byWeekNo as $i => $v) {
+ if (!is_numeric($v) || (int)$v < -53 || (int)$v == 0 || (int)$v > 53) {
+ $warnings[] = [
+ 'level' => $repair ? 1 : 3,
+ 'message' => 'BYWEEKNO in RRULE must have value(s) from -53 to -1, or 1 to 53!',
+ 'node' => $this
+ ];
+ if ($repair) {
+ if (is_array($value)) {
+ unset($values[$key][$i]);
+ } else {
+ unset($values[$key]);
+ }
+ }
+ }
+ }
+ // if there is no valid entry left, remove the whole value
+ if (is_array($value) && empty($values[$key])) {
+ unset($values[$key]);
+ }
+ } elseif ($key == 'BYYEARDAY') {
+ $byYearDay = (array)$value;
+ foreach ($byYearDay as $i => $v) {
+ if (!is_numeric($v) || (int)$v < -366 || (int)$v == 0 || (int)$v > 366) {
+ $warnings[] = [
+ 'level' => $repair ? 1 : 3,
+ 'message' => 'BYYEARDAY in RRULE must have value(s) from -366 to -1, or 1 to 366!',
+ 'node' => $this
+ ];
+ if ($repair) {
+ if (is_array($value)) {
+ unset($values[$key][$i]);
+ } else {
+ unset($values[$key]);
+ }
+ }
+ }
+ }
+ // if there is no valid entry left, remove the whole value
+ if (is_array($value) && empty($values[$key])) {
+ unset($values[$key]);
+ }
}
}
diff --git a/vendor/sabre/vobject/lib/Property/Text.php b/vendor/sabre/vobject/lib/Property/Text.php
index abc17563f..476dcde4d 100644
--- a/vendor/sabre/vobject/lib/Property/Text.php
+++ b/vendor/sabre/vobject/lib/Property/Text.php
@@ -2,10 +2,10 @@
namespace Sabre\VObject\Property;
-use Sabre\VObject\Property;
use Sabre\VObject\Component;
-use Sabre\VObject\Parser\MimeDir;
use Sabre\VObject\Document;
+use Sabre\VObject\Parser\MimeDir;
+use Sabre\VObject\Property;
use Sabre\Xml;
/**
diff --git a/vendor/sabre/vobject/lib/Property/Uri.php b/vendor/sabre/vobject/lib/Property/Uri.php
index 58e676e60..88fcfaab8 100644
--- a/vendor/sabre/vobject/lib/Property/Uri.php
+++ b/vendor/sabre/vobject/lib/Property/Uri.php
@@ -2,8 +2,8 @@
namespace Sabre\VObject\Property;
-use Sabre\VObject\Property;
use Sabre\VObject\Parameter;
+use Sabre\VObject\Property;
/**
* URI property.
diff --git a/vendor/sabre/vobject/lib/Property/VCard/DateAndOrTime.php b/vendor/sabre/vobject/lib/Property/VCard/DateAndOrTime.php
index 650e19cbf..3b4ae3bb5 100644
--- a/vendor/sabre/vobject/lib/Property/VCard/DateAndOrTime.php
+++ b/vendor/sabre/vobject/lib/Property/VCard/DateAndOrTime.php
@@ -2,9 +2,9 @@
namespace Sabre\VObject\Property\VCard;
-use DateTimeInterface;
-use DateTimeImmutable;
use DateTime;
+use DateTimeImmutable;
+use DateTimeInterface;
use Sabre\VObject\DateTimeParser;
use Sabre\VObject\InvalidDataException;
use Sabre\VObject\Property;
@@ -45,7 +45,7 @@ class DateAndOrTime extends Property {
/**
* Sets a multi-valued property.
*
- * You may also specify DateTime objects here.
+ * You may also specify DateTimeInterface objects here.
*
* @param array $parts
*
@@ -56,7 +56,7 @@ class DateAndOrTime extends Property {
if (count($parts) > 1) {
throw new \InvalidArgumentException('Only one value allowed');
}
- if (isset($parts[0]) && $parts[0] instanceof \DateTime) {
+ if (isset($parts[0]) && $parts[0] instanceof DateTimeInterface) {
$this->setDateTime($parts[0]);
} else {
parent::setParts($parts);
@@ -69,15 +69,15 @@ class DateAndOrTime extends Property {
*
* This may be either a single, or multiple strings in an array.
*
- * Instead of strings, you may also use DateTime here.
+ * Instead of strings, you may also use DateTimeInterface here.
*
- * @param string|array|\DateTime $value
+ * @param string|array|DateTimeInterface $value
*
* @return void
*/
function setValue($value) {
- if ($value instanceof \DateTime) {
+ if ($value instanceof DateTimeInterface) {
$this->setDateTime($value);
} else {
parent::setValue($value);
@@ -261,8 +261,8 @@ class DateAndOrTime extends Property {
protected function xmlSerializeValue(Xml\Writer $writer) {
$valueType = strtolower($this->getValueType());
- $parts = DateTimeParser::parseVCardDateAndOrTime($this->getValue());
- $value = '';
+ $parts = DateTimeParser::parseVCardDateAndOrTime($this->getValue());
+ $value = '';
// $d = defined
$d = function($part) use ($parts) {
@@ -280,7 +280,7 @@ class DateAndOrTime extends Property {
// value-date = element date {
// xsd:string { pattern = "\d{8}|\d{4}-\d\d|--\d\d(\d\d)?|---\d\d" }
// }
- if (($d('year') || $d('month') || $d('date'))
+ if (($d('year') || $d('month') || $d('date'))
&& (!$d('hour') && !$d('minute') && !$d('second') && !$d('timezone'))) {
if ($d('year') && $d('month') && $d('date')) {
@@ -298,8 +298,8 @@ class DateAndOrTime extends Property {
// xsd:string { pattern = "(\d\d(\d\d(\d\d)?)?|-\d\d(\d\d?)|--\d\d)"
// ~ "(Z|[+\-]\d\d(\d\d)?)?" }
// }
- } elseif ((!$d('year') && !$d('month') && !$d('date'))
- && ($d('hour') || $d('minute') || $d('second'))) {
+ } elseif ((!$d('year') && !$d('month') && !$d('date'))
+ && ($d('hour') || $d('minute') || $d('second'))) {
if ($d('hour')) {
$value .= $r('hour') . $r('minute') . $r('second');
diff --git a/vendor/sabre/vobject/lib/Recur/EventIterator.php b/vendor/sabre/vobject/lib/Recur/EventIterator.php
index f91c336bc..d313305a0 100644
--- a/vendor/sabre/vobject/lib/Recur/EventIterator.php
+++ b/vendor/sabre/vobject/lib/Recur/EventIterator.php
@@ -2,9 +2,9 @@
namespace Sabre\VObject\Recur;
-use DateTimeZone;
use DateTimeImmutable;
use DateTimeInterface;
+use DateTimeZone;
use InvalidArgumentException;
use Sabre\VObject\Component;
use Sabre\VObject\Component\VEvent;
@@ -43,6 +43,8 @@ use Sabre\VObject\Settings;
* * BYSETPOS
* * FREQ=YEARLY
* * BYMONTH
+ * * BYYEARDAY
+ * * BYWEEKNO
* * BYMONTHDAY (only if BYMONTH is also set)
* * BYDAY (only if BYMONTH is also set)
*
@@ -407,7 +409,7 @@ class EventIterator implements \Iterator {
*/
function fastForward(DateTimeInterface $dateTime) {
- while ($this->valid() && $this->getDtEnd() < $dateTime) {
+ while ($this->valid() && $this->getDtEnd() <= $dateTime) {
$this->next();
}
diff --git a/vendor/sabre/vobject/lib/Recur/RRuleIterator.php b/vendor/sabre/vobject/lib/Recur/RRuleIterator.php
index 4c89f3ce4..20f34ef42 100644
--- a/vendor/sabre/vobject/lib/Recur/RRuleIterator.php
+++ b/vendor/sabre/vobject/lib/Recur/RRuleIterator.php
@@ -2,8 +2,8 @@
namespace Sabre\VObject\Recur;
-use DateTimeInterface;
use DateTimeImmutable;
+use DateTimeInterface;
use Iterator;
use Sabre\VObject\DateTimeParser;
use Sabre\VObject\InvalidDataException;
@@ -374,8 +374,8 @@ class RRuleIterator implements Iterator {
$currentHour = $this->currentDate->format('G');
} while (
- ($this->byDay && !in_array($currentDay, $recurrenceDays)) ||
- ($this->byHour && !in_array($currentHour, $recurrenceHours)) ||
+ ($this->byDay && !in_array($currentDay, $recurrenceDays)) ||
+ ($this->byHour && !in_array($currentHour, $recurrenceHours)) ||
($this->byMonth && !in_array($currentMonth, $recurrenceMonths))
);
@@ -537,6 +537,83 @@ class RRuleIterator implements Iterator {
}
+ if ($this->byWeekNo !== null) { // byWeekNo is an array with values from -53 to -1, or 1 to 53
+ $dayOffsets = [];
+ if ($this->byDay) {
+ foreach ($this->byDay as $byDay) {
+ $dayOffsets[] = $this->dayMap[$byDay];
+ }
+ } else { // default is Monday
+ $dayOffsets[] = 1;
+ }
+
+ $currentYear = $this->currentDate->format('Y');
+
+ while (true) {
+ $checkDates = [];
+
+ // loop through all WeekNo and Days to check all the combinations
+ foreach ($this->byWeekNo as $byWeekNo) {
+ foreach ($dayOffsets as $dayOffset) {
+ $date = clone $this->currentDate;
+ $date->setISODate($currentYear, $byWeekNo, $dayOffset);
+
+ if ($date > $this->currentDate) {
+ $checkDates[] = $date;
+ }
+ }
+ }
+
+ if (count($checkDates) > 0) {
+ $this->currentDate = min($checkDates);
+ return;
+ }
+
+ // if there is no date found, check the next year
+ $currentYear += $this->interval;
+ }
+ }
+
+ if ($this->byYearDay !== null) { // byYearDay is an array with values from -366 to -1, or 1 to 366
+ $dayOffsets = [];
+ if ($this->byDay) {
+ foreach ($this->byDay as $byDay) {
+ $dayOffsets[] = $this->dayMap[$byDay];
+ }
+ } else { // default is Monday-Sunday
+ $dayOffsets = [1,2,3,4,5,6,7];
+ }
+
+ $currentYear = $this->currentDate->format('Y');
+
+ while (true) {
+ $checkDates = [];
+
+ // loop through all YearDay and Days to check all the combinations
+ foreach ($this->byYearDay as $byYearDay) {
+ $date = clone $this->currentDate;
+ $date->setDate($currentYear, 1, 1);
+ if ($byYearDay > 0) {
+ $date->add(new \DateInterval('P' . $byYearDay . 'D'));
+ } else {
+ $date->sub(new \DateInterval('P' . abs($byYearDay) . 'D'));
+ }
+
+ if ($date > $this->currentDate && in_array($date->format('N'), $dayOffsets)) {
+ $checkDates[] = $date;
+ }
+ }
+
+ if (count($checkDates) > 0) {
+ $this->currentDate = min($checkDates);
+ return;
+ }
+
+ // if there is no date found, check the next year
+ $currentYear += $this->interval;
+ }
+ }
+
// The easiest form
$this->currentDate = $this->currentDate->modify('+' . $this->interval . ' years');
return;
@@ -710,10 +787,20 @@ class RRuleIterator implements Iterator {
case 'BYYEARDAY' :
$this->byYearDay = (array)$value;
+ foreach ($this->byYearDay as $byYearDay) {
+ if (!is_numeric($byYearDay) || (int)$byYearDay < -366 || (int)$byYearDay == 0 || (int)$byYearDay > 366) {
+ throw new InvalidDataException('BYYEARDAY in RRULE must have value(s) from 1 to 366, or -366 to -1!');
+ }
+ }
break;
case 'BYWEEKNO' :
$this->byWeekNo = (array)$value;
+ foreach ($this->byWeekNo as $byWeekNo) {
+ if (!is_numeric($byWeekNo) || (int)$byWeekNo < -53 || (int)$byWeekNo == 0 || (int)$byWeekNo > 53) {
+ throw new InvalidDataException('BYWEEKNO in RRULE must have value(s) from 1 to 53, or -53 to -1!');
+ }
+ }
break;
case 'BYMONTH' :
diff --git a/vendor/sabre/vobject/lib/TimeZoneUtil.php b/vendor/sabre/vobject/lib/TimeZoneUtil.php
index 2a95ae898..925183e8d 100644
--- a/vendor/sabre/vobject/lib/TimeZoneUtil.php
+++ b/vendor/sabre/vobject/lib/TimeZoneUtil.php
@@ -165,6 +165,16 @@ class TimeZoneUtil {
return new \DateTimeZone(self::$map[$tzid]);
}
+ // Some Microsoft products prefix the offset first, so let's strip that off
+ // and see if it is our tzid map. We don't want to check for this first just
+ // in case there are overrides in our tzid map.
+ if (preg_match('/^\((UTC|GMT)(\+|\-)[\d]{2}\:[\d]{2}\) (.*)/', $tzid, $matches)) {
+ $tzidAlternate = $matches[3];
+ if (isset(self::$map[$tzidAlternate])) {
+ return new \DateTimeZone(self::$map[$tzidAlternate]);
+ }
+ }
+
// 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)) {
diff --git a/vendor/sabre/vobject/lib/Version.php b/vendor/sabre/vobject/lib/Version.php
index ca9f21960..346e2044d 100644
--- a/vendor/sabre/vobject/lib/Version.php
+++ b/vendor/sabre/vobject/lib/Version.php
@@ -14,6 +14,6 @@ class Version {
/**
* Full version number.
*/
- const VERSION = '4.1.1';
+ const VERSION = '4.1.2';
}
diff --git a/vendor/sabre/vobject/lib/timezonedata/lotuszones.php b/vendor/sabre/vobject/lib/timezonedata/lotuszones.php
index 7d0785f04..79d555a92 100644
--- a/vendor/sabre/vobject/lib/timezonedata/lotuszones.php
+++ b/vendor/sabre/vobject/lib/timezonedata/lotuszones.php
@@ -17,85 +17,85 @@ return [
'Mexico Standard Time 2' => 'America/Chihuahua',
'Mountain' => 'America/Denver',
// 'Mountain Standard Time' => 'America/Chihuahua', // conflict with windows timezones.
- 'US Mountain' => 'America/Phoenix',
- 'Canada Central' => 'America/Edmonton',
- 'Central America' => 'America/Guatemala',
- 'Central' => 'America/Chicago',
+ 'US Mountain' => 'America/Phoenix',
+ 'Canada Central' => 'America/Edmonton',
+ 'Central America' => 'America/Guatemala',
+ 'Central' => 'America/Chicago',
// 'Central Standard Time' => 'America/Mexico_City', // conflict with windows timezones.
- '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',
+ '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', // conflict with windows timezones.
- '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',
+ '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',
];
diff --git a/vendor/sabre/vobject/lib/timezonedata/windowszones.php b/vendor/sabre/vobject/lib/timezonedata/windowszones.php
index ac69847cc..29f3a6cb8 100644
--- a/vendor/sabre/vobject/lib/timezonedata/windowszones.php
+++ b/vendor/sabre/vobject/lib/timezonedata/windowszones.php
@@ -3,28 +3,33 @@
/**
* Automatically generated timezone file
*
- * Last update: 2015-07-27T16:56:36-04:00
+ * Last update: 2016-08-24T17:35:38-04:00
* Source: http://unicode.org/repos/cldr/trunk/common/supplemental/windowsZones.xml
*
- * @copyright Copyright (C) fruux GmbH (https://fruux.com/)
+ * @copyright Copyright (C) 2011-2015 fruux GmbH (https://fruux.com/).
* @license http://sabre.io/license/ Modified BSD License
*/
-return [
+return [
'AUS Central Standard Time' => 'Australia/Darwin',
'AUS Eastern Standard Time' => 'Australia/Sydney',
'Afghanistan Standard Time' => 'Asia/Kabul',
'Alaskan Standard Time' => 'America/Anchorage',
+ 'Aleutian Standard Time' => 'America/Adak',
+ 'Altai Standard Time' => 'Asia/Barnaul',
'Arab Standard Time' => 'Asia/Riyadh',
'Arabian Standard Time' => 'Asia/Dubai',
'Arabic Standard Time' => 'Asia/Baghdad',
'Argentina Standard Time' => 'America/Buenos_Aires',
+ 'Astrakhan Standard Time' => 'Europe/Astrakhan',
'Atlantic Standard Time' => 'America/Halifax',
+ 'Aus Central W. Standard Time' => 'Australia/Eucla',
'Azerbaijan Standard Time' => 'Asia/Baku',
'Azores Standard Time' => 'Atlantic/Azores',
'Bahia Standard Time' => 'America/Bahia',
'Bangladesh Standard Time' => 'Asia/Dhaka',
'Belarus Standard Time' => 'Europe/Minsk',
+ 'Bougainville Standard Time' => 'Pacific/Bougainville',
'Canada Central Standard Time' => 'America/Regina',
'Cape Verde Standard Time' => 'Atlantic/Cape_Verde',
'Caucasus Standard Time' => 'Asia/Yerevan',
@@ -37,11 +42,15 @@ return [
'Central Pacific Standard Time' => 'Pacific/Guadalcanal',
'Central Standard Time' => 'America/Chicago',
'Central Standard Time (Mexico)' => 'America/Mexico_City',
+ 'Chatham Islands Standard Time' => 'Pacific/Chatham',
'China Standard Time' => 'Asia/Shanghai',
+ 'Cuba Standard Time' => 'America/Havana',
'Dateline Standard Time' => 'Etc/GMT+12',
'E. Africa Standard Time' => 'Africa/Nairobi',
'E. Australia Standard Time' => 'Australia/Brisbane',
+ 'E. Europe Standard Time' => 'Europe/Chisinau',
'E. South America Standard Time' => 'America/Sao_Paulo',
+ 'Easter Island Standard Time' => 'Pacific/Easter',
'Eastern Standard Time' => 'America/New_York',
'Eastern Standard Time (Mexico)' => 'America/Cancun',
'Egypt Standard Time' => 'Africa/Cairo',
@@ -53,6 +62,7 @@ return [
'Georgian Standard Time' => 'Asia/Tbilisi',
'Greenland Standard Time' => 'America/Godthab',
'Greenwich Standard Time' => 'Atlantic/Reykjavik',
+ 'Haiti Standard Time' => 'America/Port-au-Prince',
'Hawaiian Standard Time' => 'Pacific/Honolulu',
'India Standard Time' => 'Asia/Calcutta',
'Iran Standard Time' => 'Asia/Tehran',
@@ -62,7 +72,9 @@ return [
'Korea Standard Time' => 'Asia/Seoul',
'Libya Standard Time' => 'Africa/Tripoli',
'Line Islands Standard Time' => 'Pacific/Kiritimati',
+ 'Lord Howe Standard Time' => 'Australia/Lord_Howe',
'Magadan Standard Time' => 'Asia/Magadan',
+ 'Marquesas Standard Time' => 'Pacific/Marquesas',
'Mauritius Standard Time' => 'Indian/Mauritius',
'Middle East Standard Time' => 'Asia/Beirut',
'Montevideo Standard Time' => 'America/Montevideo',
@@ -75,11 +87,13 @@ return [
'Nepal Standard Time' => 'Asia/Katmandu',
'New Zealand Standard Time' => 'Pacific/Auckland',
'Newfoundland Standard Time' => 'America/St_Johns',
+ 'Norfolk Standard Time' => 'Pacific/Norfolk',
'North Asia East Standard Time' => 'Asia/Irkutsk',
'North Asia Standard Time' => 'Asia/Krasnoyarsk',
+ 'North Korea Standard Time' => 'Asia/Pyongyang',
'Pacific SA Standard Time' => 'America/Santiago',
'Pacific Standard Time' => 'America/Los_Angeles',
- 'Pacific Standard Time (Mexico)' => 'America/Santa_Isabel',
+ 'Pacific Standard Time (Mexico)' => 'America/Tijuana',
'Pakistan Standard Time' => 'Asia/Karachi',
'Paraguay Standard Time' => 'America/Asuncion',
'Romance Standard Time' => 'Europe/Paris',
@@ -91,6 +105,8 @@ return [
'SA Pacific Standard Time' => 'America/Bogota',
'SA Western Standard Time' => 'America/La_Paz',
'SE Asia Standard Time' => 'Asia/Bangkok',
+ 'Saint Pierre Standard Time' => 'America/Miquelon',
+ 'Sakhalin Standard Time' => 'Asia/Sakhalin',
'Samoa Standard Time' => 'Pacific/Apia',
'Singapore Standard Time' => 'Asia/Singapore',
'South Africa Standard Time' => 'Africa/Johannesburg',
@@ -98,14 +114,20 @@ return [
'Syria Standard Time' => 'Asia/Damascus',
'Taipei Standard Time' => 'Asia/Taipei',
'Tasmania Standard Time' => 'Australia/Hobart',
+ 'Tocantins Standard Time' => 'America/Araguaina',
'Tokyo Standard Time' => 'Asia/Tokyo',
+ 'Tomsk Standard Time' => 'Asia/Tomsk',
'Tonga Standard Time' => 'Pacific/Tongatapu',
+ 'Transbaikal Standard Time' => 'Asia/Chita',
'Turkey Standard Time' => 'Europe/Istanbul',
+ 'Turks And Caicos Standard Time' => 'America/Grand_Turk',
'US Eastern Standard Time' => 'America/Indianapolis',
'US Mountain Standard Time' => 'America/Phoenix',
'UTC' => 'Etc/GMT',
'UTC+12' => 'Etc/GMT-12',
'UTC-02' => 'Etc/GMT+2',
+ 'UTC-08' => 'Etc/GMT+8',
+ 'UTC-09' => 'Etc/GMT+9',
'UTC-11' => 'Etc/GMT+11',
'Ulaanbaatar Standard Time' => 'Asia/Ulaanbaatar',
'Venezuela Standard Time' => 'America/Caracas',
@@ -113,7 +135,9 @@ return [
'W. Australia Standard Time' => 'Australia/Perth',
'W. Central Africa Standard Time' => 'Africa/Lagos',
'W. Europe Standard Time' => 'Europe/Berlin',
+ 'W. Mongolia Standard Time' => 'Asia/Hovd',
'West Asia Standard Time' => 'Asia/Tashkent',
+ 'West Bank Standard Time' => 'Asia/Hebron',
'West Pacific Standard Time' => 'Pacific/Port_Moresby',
'Yakutsk Standard Time' => 'Asia/Yakutsk',
];
diff --git a/view/css/bootstrap-red.css b/view/css/bootstrap-red.css
index 1bb82f11c..a3a8ce0be 100644
--- a/view/css/bootstrap-red.css
+++ b/view/css/bootstrap-red.css
@@ -11,6 +11,7 @@ nav .badge {
nav .badge {
top: 0px;
left: 0px;
+ line-height: 0.75;
}
}
@@ -38,7 +39,7 @@ nav .badge {
}
#navbar-collapse-1 i {
- font-size: 1rem;
+ font-size: 1.0rem;
}
nav .dropdown-menu {
@@ -61,15 +62,11 @@ nav .dropdown-menu {
padding: 0.5rem 0.1rem;
}
-.navbar-inverse .navbar-toggler {
+.navbar-dark .navbar-toggler {
color: rgba(255,255,255,1);
}
/* nav overrides end */
-.btn-outline-secondary {
- color: #aaa;
-}
-
.wall-item-tools .dropdown-menu {
min-width: auto;
}
diff --git a/view/css/cdav_addressbook.css b/view/css/cdav_addressbook.css
new file mode 100644
index 000000000..038358e43
--- /dev/null
+++ b/view/css/cdav_addressbook.css
@@ -0,0 +1,103 @@
+.vcard-header {
+ cursor: pointer;
+ padding: 7px 10px;
+ margin-bottom: 3px;
+}
+
+.vcard-header:hover,
+.vcard-header.active {
+ background-color: rgb(238,238,238);
+ cursor: pointer;
+}
+
+.vcard-header.active:hover {
+ cursor: initial;
+}
+
+.vcard-add-field {
+ margin-top: 8px;
+ display: none;
+}
+
+.vcard-cancel {
+ margin: 6px 10px;
+ height: 32px;
+ line-height: 32px;
+ color: #777;
+ font-size: 16px;
+
+ cursor: pointer;
+ display: none;
+ float: right;
+}
+
+.vcard-info {
+ display: none;
+}
+
+.vcard-nophoto {
+ display: inline-block;
+ width: 32px;
+ height: 32px;
+ border-radius: 4px;
+ border: 1px solid #ccc;
+ text-align: center;
+ font-size: 20px;
+ color: #fff;
+ background-color: #ddd;
+}
+
+.vcard-photo {
+ width: 32px;
+ height: 32px;
+ border-radius: 4px;
+ border: 1px solid #ccc;
+ text-align: center;
+}
+
+.vcard-fn-preview,
+input.vcard-fn {
+ font-size: 16px !important;
+ margin-left: 5px;
+}
+
+.vcard-email-preview,
+.vcard-tel-preview {
+ color: #999;
+}
+
+
+.vcard-fn,
+#create_form,
+#more_block {
+ display: none;
+}
+
+input.vcard-fn,
+.vcard-fn-create input,
+.vcard-org input,
+.vcard-title input,
+.vcard-tel input,
+.vcard-email input,
+.vcard-impp input,
+.vcard-url input,
+.vcard-adr input,
+.vcard-note input {
+ padding: 0px;
+ margin-left: 5px;
+ border-width: 0px 0px 1px 0px;
+ border-radius: 0px;
+ background-color: transparent;
+ min-width: 160px;
+}
+
+#template-form-vcard-org,
+#template-form-vcard-title,
+#template-form-vcard-tel,
+#template-form-vcard-email,
+#template-form-vcard-impp,
+#template-form-vcard-url,
+#template-form-vcard-adr,
+#template-form-vcard-note {
+ display: none;
+}
diff --git a/view/css/cdav_calendar.css b/view/css/cdav_calendar.css
new file mode 100644
index 000000000..d68278a63
--- /dev/null
+++ b/view/css/cdav_calendar.css
@@ -0,0 +1,22 @@
+/* fix borders */
+
+.fc th:first-child,
+.fc td:first-child {
+ border-left-width: 0px;
+}
+
+.fc th:last-child,
+.fc td:last-child {
+ border-right-width: 0px;
+ border-bottom-width: 0px;
+}
+
+.fc-unthemed th,
+.fc-unthemed td,
+.fc-unthemed thead,
+.fc-unthemed tbody,
+.fc-unthemed .fc-divider,
+.fc-unthemed .fc-row,
+.fc-unthemed .fc-popover {
+ border-color: #ccc !important;
+}
diff --git a/view/css/conversation.css b/view/css/conversation.css
index 08f23c4d0..d10e1e14e 100644
--- a/view/css/conversation.css
+++ b/view/css/conversation.css
@@ -77,7 +77,7 @@
/* conv_item */
.wall-item-head-new {
- border-top: 0.2rem solid #0275d8;
+ border-top: 0.2rem solid #007bff;
}
.wall-item-info {
@@ -168,11 +168,11 @@ a.wall-item-name-link {
}
.ivoted {
- color: #0275d8;
+ color: #007bff;
}
.item-highlight {
- border-left: 0.2rem solid #0275d8;
+ border-left: 0.2rem solid #007bff;
}
.item-highlight .wall-item-head,
diff --git a/view/css/mod_help.css b/view/css/mod_help.css
index c0b0bafa3..643885c99 100644
--- a/view/css/mod_help.css
+++ b/view/css/mod_help.css
@@ -19,3 +19,11 @@
#doco-top-toc li {
padding: 3px 0px;
}
+
+#doco-side-toc li {
+ padding-left: 10px;
+}
+
+#doco-side-toc {
+ padding-top: 10px;
+} \ No newline at end of file
diff --git a/view/css/mod_manage.css b/view/css/mod_manage.css
index 077b6b838..b08c90b62 100644
--- a/view/css/mod_manage.css
+++ b/view/css/mod_manage.css
@@ -4,10 +4,6 @@
text-decoration: none;
}
-.new-notification {
- color: #c60032;
-}
-
.channel-photo-wrapper {
display: table-cell;
table-layout: fixed;
@@ -24,11 +20,3 @@
vertical-align: top;
padding-left: 10px;
}
-
-.selected-channel {
- color: green;
-}
-
-#all-channels-end {
- margin-bottom: 20px;
-}
diff --git a/view/css/mod_setup.css b/view/css/mod_setup.css
deleted file mode 100644
index f0d91a0ae..000000000
--- a/view/css/mod_setup.css
+++ /dev/null
@@ -1,40 +0,0 @@
-#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;
-}
-
-main {
- max-width: 790px;
- margin-left: auto;
- margin-right: auto;
-}
diff --git a/view/de/hmessages.po b/view/de/hmessages.po
index 9c24dcbbd..db906e701 100644
--- a/view/de/hmessages.po
+++ b/view/de/hmessages.po
@@ -13,7 +13,7 @@
# Harald Klimach <harald@klimachs.de>, 2016
# JooBee <d13@raclan.de>, 2014
# Kai <kai@proppower.de>, 2015
-# Oliver <post@toktan.org>, 2015-2016
+# Oliver <post@toktan.org>, 2015-2017
# Phellmes <forum@suschka.de>, 2014,2016-2017
# sasiflo <transiflex@sasiflo.de>, 2014
# Steff <steff@digitalesecho.de>, 2015-2016
@@ -25,9 +25,9 @@ msgid ""
msgstr ""
"Project-Id-Version: Redmatrix\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2017-05-01 15:36+0200\n"
-"PO-Revision-Date: 2017-05-07 00:56+0000\n"
-"Last-Translator: Ettore Atalan <atalanttore@googlemail.com>\n"
+"POT-Creation-Date: 2017-08-01 12:13+0200\n"
+"PO-Revision-Date: 2017-08-05 12:18+0000\n"
+"Last-Translator: Phellmes <forum@suschka.de>\n"
"Language-Team: German (http://www.transifex.com/Friendica/red-matrix/language/de/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -35,163 +35,147 @@ msgstr ""
"Language: de\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
-#: ../../Zotlabs/Access/Permissions.php:46
+#: ../../Zotlabs/Access/Permissions.php:53
msgid "Can view my channel stream and posts"
msgstr "Kann meinen Kanal-Stream und meine Beiträge sehen"
-#: ../../Zotlabs/Access/Permissions.php:47 ../../include/permissions.php:42
+#: ../../Zotlabs/Access/Permissions.php:54
msgid "Can send me their channel stream and posts"
msgstr "Kann mir die Beiträge aus seinem/ihrem Kanal schicken"
-#: ../../Zotlabs/Access/Permissions.php:48 ../../include/permissions.php:36
+#: ../../Zotlabs/Access/Permissions.php:55
msgid "Can view my default channel profile"
msgstr "Kann mein Standardprofil sehen"
-#: ../../Zotlabs/Access/Permissions.php:49 ../../include/permissions.php:37
+#: ../../Zotlabs/Access/Permissions.php:56
msgid "Can view my connections"
msgstr "Kann meine Verbindungen sehen"
-#: ../../Zotlabs/Access/Permissions.php:50 ../../include/permissions.php:38
+#: ../../Zotlabs/Access/Permissions.php:57
msgid "Can view my file storage and photos"
msgstr "Kann meine Datei- und Bilderordner sehen"
-#: ../../Zotlabs/Access/Permissions.php:51
+#: ../../Zotlabs/Access/Permissions.php:58
msgid "Can upload/modify my file storage and photos"
msgstr "Kann in meine Datei- und Bilderordner hochladen/ändern"
-#: ../../Zotlabs/Access/Permissions.php:52
+#: ../../Zotlabs/Access/Permissions.php:59
msgid "Can view my channel webpages"
msgstr "Kann die Webseiten meines Kanals sehen"
-#: ../../Zotlabs/Access/Permissions.php:53
+#: ../../Zotlabs/Access/Permissions.php:60
msgid "Can view my wiki pages"
msgstr "Kann meine Wiki-Seiten sehen"
-#: ../../Zotlabs/Access/Permissions.php:54
+#: ../../Zotlabs/Access/Permissions.php:61
msgid "Can create/edit my channel webpages"
msgstr "Kann Webseiten in meinem Kanal erstellen/ändern"
-#: ../../Zotlabs/Access/Permissions.php:55
+#: ../../Zotlabs/Access/Permissions.php:62
msgid "Can write to my wiki pages"
msgstr "Kann meine Wiki-Seiten bearbeiten"
-#: ../../Zotlabs/Access/Permissions.php:56
+#: ../../Zotlabs/Access/Permissions.php:63
msgid "Can post on my channel (wall) page"
msgstr "Kann auf meiner Kanal-Seite (\"wall\") Beiträge veröffentlichen"
-#: ../../Zotlabs/Access/Permissions.php:57 ../../include/permissions.php:44
+#: ../../Zotlabs/Access/Permissions.php:64
msgid "Can comment on or like my posts"
msgstr "Darf meine Beiträge kommentieren und mögen/nicht mögen"
-#: ../../Zotlabs/Access/Permissions.php:58 ../../include/permissions.php:45
+#: ../../Zotlabs/Access/Permissions.php:65
msgid "Can send me private mail messages"
msgstr "Kann mir private Nachrichten schicken"
-#: ../../Zotlabs/Access/Permissions.php:59
+#: ../../Zotlabs/Access/Permissions.php:66
msgid "Can like/dislike profiles and profile things"
msgstr "Kann Profile und Profilsachen mögen/nicht mögen"
-#: ../../Zotlabs/Access/Permissions.php:60
+#: ../../Zotlabs/Access/Permissions.php:67
msgid "Can forward to all my channel connections via @+ mentions in posts"
msgstr "Kann an alle meine Verbindungen via @-Erwähnungen Nachrichten weiterleiten"
-#: ../../Zotlabs/Access/Permissions.php:61
+#: ../../Zotlabs/Access/Permissions.php:68
msgid "Can chat with me"
msgstr "Kann mit mir chatten"
-#: ../../Zotlabs/Access/Permissions.php:62 ../../include/permissions.php:53
+#: ../../Zotlabs/Access/Permissions.php:69
msgid "Can source my public posts in derived channels"
msgstr "Kann meine öffentlichen Beiträge als Quellen für Kanäle verwenden"
-#: ../../Zotlabs/Access/Permissions.php:63
+#: ../../Zotlabs/Access/Permissions.php:70
msgid "Can administer my channel"
msgstr "Kann meinen Kanal administrieren"
#: ../../Zotlabs/Access/PermissionRoles.php:248
-#: ../../include/permissions.php:946
msgid "Social Networking"
msgstr "Soziales Netzwerk"
#: ../../Zotlabs/Access/PermissionRoles.php:249
-#: ../../include/permissions.php:946
msgid "Social - Mostly Public"
msgstr "Soziales Netzwerk - Weitgehend öffentlich"
#: ../../Zotlabs/Access/PermissionRoles.php:250
-#: ../../include/permissions.php:946
msgid "Social - Restricted"
msgstr "Soziales Netzwerk - Beschränkt"
#: ../../Zotlabs/Access/PermissionRoles.php:251
-#: ../../include/permissions.php:946
msgid "Social - Private"
msgstr "Soziales Netzwerk - Privat"
#: ../../Zotlabs/Access/PermissionRoles.php:254
-#: ../../include/permissions.php:947
msgid "Community Forum"
msgstr "Forum"
#: ../../Zotlabs/Access/PermissionRoles.php:255
-#: ../../include/permissions.php:947
msgid "Forum - Mostly Public"
msgstr "Forum - Weitgehend öffentlich"
#: ../../Zotlabs/Access/PermissionRoles.php:256
-#: ../../include/permissions.php:947
msgid "Forum - Restricted"
msgstr "Forum - Beschränkt"
#: ../../Zotlabs/Access/PermissionRoles.php:257
-#: ../../include/permissions.php:947
msgid "Forum - Private"
msgstr "Forum - Privat"
#: ../../Zotlabs/Access/PermissionRoles.php:260
-#: ../../include/permissions.php:948
msgid "Feed Republish"
msgstr "Teilen von Feeds"
#: ../../Zotlabs/Access/PermissionRoles.php:261
-#: ../../include/permissions.php:948
msgid "Feed - Mostly Public"
msgstr "Feeds - Weitgehend öffentlich"
#: ../../Zotlabs/Access/PermissionRoles.php:262
-#: ../../include/permissions.php:948
msgid "Feed - Restricted"
msgstr "Feeds - Beschränkt"
#: ../../Zotlabs/Access/PermissionRoles.php:265
-#: ../../include/permissions.php:949
msgid "Special Purpose"
msgstr "Für besondere Zwecke"
#: ../../Zotlabs/Access/PermissionRoles.php:266
-#: ../../include/permissions.php:949
msgid "Special - Celebrity/Soapbox"
msgstr "Speziell - Mitteilungs-Kanal (keine Kommentare)"
#: ../../Zotlabs/Access/PermissionRoles.php:267
-#: ../../include/permissions.php:949
msgid "Special - Group Repository"
msgstr "Speziell - Gruppenarchiv"
#: ../../Zotlabs/Access/PermissionRoles.php:270
-#: ../../Zotlabs/Module/New_channel.php:132
-#: ../../Zotlabs/Module/Settings/Channel.php:463
-#: ../../Zotlabs/Module/Connedit.php:914 ../../Zotlabs/Module/Profiles.php:798
-#: ../../Zotlabs/Module/Register.php:213 ../../addon/cdav/Mod_Cdav.php:1148
-#: ../../addon/cdav/cdav.php:277 ../../addon/cdav/cdav.php:284
-#: ../../include/selectors.php:49 ../../include/selectors.php:66
-#: ../../include/selectors.php:104 ../../include/selectors.php:140
-#: ../../include/permissions.php:950 ../../include/connections.php:675
-#: ../../include/connections.php:682
+#: ../../Zotlabs/Module/Cdav.php:1123 ../../Zotlabs/Module/New_channel.php:132
+#: ../../Zotlabs/Module/Settings/Channel.php:467
+#: ../../Zotlabs/Module/Connedit.php:932 ../../Zotlabs/Module/Profiles.php:798
+#: ../../Zotlabs/Module/Register.php:213 ../../include/selectors.php:49
+#: ../../include/selectors.php:66 ../../include/selectors.php:104
+#: ../../include/selectors.php:140 ../../include/event.php:1297
+#: ../../include/event.php:1304 ../../include/connections.php:681
+#: ../../include/connections.php:688
msgid "Other"
msgstr "Andere"
#: ../../Zotlabs/Access/PermissionRoles.php:271
-#: ../../include/permissions.php:950
msgid "Custom/Expert Mode"
msgstr "Benutzerdefiniert/Expertenmodus"
@@ -201,7 +185,7 @@ msgstr "Benutzerdefiniert/Expertenmodus"
#: ../../Zotlabs/Module/Editblock.php:31 ../../Zotlabs/Module/Profile.php:20
#: ../../Zotlabs/Module/Layouts.php:31 ../../Zotlabs/Module/Editwebpage.php:32
#: ../../Zotlabs/Module/Webpages.php:33
-#: ../../Zotlabs/Module/Filestorage.php:59 ../../include/channel.php:945
+#: ../../Zotlabs/Module/Filestorage.php:51 ../../include/channel.php:1062
msgid "Requested profile is not available."
msgstr "Das angefragte Profil ist nicht verfügbar."
@@ -215,41 +199,43 @@ msgstr "Das angefragte Profil ist nicht verfügbar."
#: ../../Zotlabs/Module/Appman.php:82 ../../Zotlabs/Module/Regmod.php:21
#: ../../Zotlabs/Module/New_channel.php:77
#: ../../Zotlabs/Module/New_channel.php:104
-#: ../../Zotlabs/Module/Sharedwithme.php:11 ../../Zotlabs/Module/Setup.php:212
+#: ../../Zotlabs/Module/Sharedwithme.php:16 ../../Zotlabs/Module/Setup.php:209
+#: ../../Zotlabs/Module/Moderate.php:13
#: ../../Zotlabs/Module/Achievements.php:34 ../../Zotlabs/Module/Thing.php:274
#: ../../Zotlabs/Module/Thing.php:294 ../../Zotlabs/Module/Thing.php:335
#: ../../Zotlabs/Module/Api.php:24 ../../Zotlabs/Module/Editblock.php:67
-#: ../../Zotlabs/Module/Profile.php:83 ../../Zotlabs/Module/Profile.php:100
+#: ../../Zotlabs/Module/Profile.php:85 ../../Zotlabs/Module/Profile.php:102
#: ../../Zotlabs/Module/Mood.php:116 ../../Zotlabs/Module/Connections.php:29
-#: ../../Zotlabs/Module/Viewsrc.php:19 ../../Zotlabs/Module/Bookmarks.php:61
+#: ../../Zotlabs/Module/Viewsrc.php:19 ../../Zotlabs/Module/Bookmarks.php:64
#: ../../Zotlabs/Module/Photos.php:69 ../../Zotlabs/Module/Wiki.php:50
-#: ../../Zotlabs/Module/Wiki.php:216 ../../Zotlabs/Module/Wiki.php:315
-#: ../../Zotlabs/Module/Pdledit.php:29 ../../Zotlabs/Module/Poke.php:137
+#: ../../Zotlabs/Module/Wiki.php:235 ../../Zotlabs/Module/Wiki.php:341
+#: ../../Zotlabs/Module/Pdledit.php:29 ../../Zotlabs/Module/Poke.php:149
#: ../../Zotlabs/Module/Profile_photo.php:280
#: ../../Zotlabs/Module/Profile_photo.php:293
-#: ../../Zotlabs/Module/Authtest.php:16 ../../Zotlabs/Module/Item.php:221
-#: ../../Zotlabs/Module/Item.php:231 ../../Zotlabs/Module/Item.php:1038
-#: ../../Zotlabs/Module/Page.php:35 ../../Zotlabs/Module/Page.php:91
-#: ../../Zotlabs/Module/Connedit.php:385 ../../Zotlabs/Module/Chat.php:98
-#: ../../Zotlabs/Module/Chat.php:103 ../../Zotlabs/Module/Menu.php:78
-#: ../../Zotlabs/Module/Layouts.php:71 ../../Zotlabs/Module/Layouts.php:78
-#: ../../Zotlabs/Module/Layouts.php:89 ../../Zotlabs/Module/Group.php:13
-#: ../../Zotlabs/Module/Profiles.php:198 ../../Zotlabs/Module/Profiles.php:635
+#: ../../Zotlabs/Module/Authtest.php:16 ../../Zotlabs/Module/Item.php:223
+#: ../../Zotlabs/Module/Item.php:240 ../../Zotlabs/Module/Item.php:250
+#: ../../Zotlabs/Module/Item.php:1076 ../../Zotlabs/Module/Page.php:34
+#: ../../Zotlabs/Module/Page.php:125 ../../Zotlabs/Module/Connedit.php:385
+#: ../../Zotlabs/Module/Chat.php:100 ../../Zotlabs/Module/Chat.php:105
+#: ../../Zotlabs/Module/Menu.php:78 ../../Zotlabs/Module/Layouts.php:71
+#: ../../Zotlabs/Module/Layouts.php:78 ../../Zotlabs/Module/Layouts.php:89
+#: ../../Zotlabs/Module/Group.php:13 ../../Zotlabs/Module/Profiles.php:198
+#: ../../Zotlabs/Module/Profiles.php:635
#: ../../Zotlabs/Module/Editwebpage.php:68
#: ../../Zotlabs/Module/Editwebpage.php:89
#: ../../Zotlabs/Module/Editwebpage.php:107
#: ../../Zotlabs/Module/Editwebpage.php:121 ../../Zotlabs/Module/Manage.php:10
-#: ../../Zotlabs/Module/Webpages.php:116 ../../Zotlabs/Module/Block.php:26
-#: ../../Zotlabs/Module/Block.php:76 ../../Zotlabs/Module/Editpost.php:17
+#: ../../Zotlabs/Module/Webpages.php:118 ../../Zotlabs/Module/Block.php:24
+#: ../../Zotlabs/Module/Block.php:74 ../../Zotlabs/Module/Editpost.php:17
#: ../../Zotlabs/Module/Sources.php:74 ../../Zotlabs/Module/Like.php:181
#: ../../Zotlabs/Module/Suggest.php:28 ../../Zotlabs/Module/Message.php:18
-#: ../../Zotlabs/Module/Mail.php:164 ../../Zotlabs/Module/Register.php:77
+#: ../../Zotlabs/Module/Mail.php:146 ../../Zotlabs/Module/Register.php:77
#: ../../Zotlabs/Module/Cover_photo.php:281
#: ../../Zotlabs/Module/Cover_photo.php:294
-#: ../../Zotlabs/Module/Network.php:15 ../../Zotlabs/Module/Filestorage.php:23
-#: ../../Zotlabs/Module/Filestorage.php:78
-#: ../../Zotlabs/Module/Filestorage.php:93
-#: ../../Zotlabs/Module/Filestorage.php:120 ../../Zotlabs/Module/Common.php:39
+#: ../../Zotlabs/Module/Network.php:15 ../../Zotlabs/Module/Filestorage.php:15
+#: ../../Zotlabs/Module/Filestorage.php:70
+#: ../../Zotlabs/Module/Filestorage.php:85
+#: ../../Zotlabs/Module/Filestorage.php:112 ../../Zotlabs/Module/Common.php:39
#: ../../Zotlabs/Module/Viewconnections.php:28
#: ../../Zotlabs/Module/Viewconnections.php:33
#: ../../Zotlabs/Module/Service_limits.php:11
@@ -257,16 +243,14 @@ msgstr "Das angefragte Profil ist nicht verfügbar."
#: ../../Zotlabs/Lib/Chatroom.php:137 ../../Zotlabs/Web/WebServer.php:131
#: ../../addon/keepout/keepout.php:36 ../../addon/openid/Mod_Id.php:53
#: ../../addon/gitwiki/Mod_Gitwiki.php:196
-#: ../../addon/gitwiki/Mod_Gitwiki.php:292
-#: ../../addon/diaspora_reconnect/diaspora_reconnect.php:58
-#: ../../addon/pumpio/pumpio.php:40 ../../include/attach.php:144
-#: ../../include/attach.php:191 ../../include/attach.php:255
-#: ../../include/attach.php:269 ../../include/attach.php:276
-#: ../../include/attach.php:344 ../../include/attach.php:358
-#: ../../include/attach.php:365 ../../include/attach.php:442
-#: ../../include/attach.php:909 ../../include/attach.php:983
-#: ../../include/attach.php:1148 ../../include/items.php:3470
-#: ../../include/photos.php:27
+#: ../../addon/gitwiki/Mod_Gitwiki.php:292 ../../addon/pumpio/pumpio.php:40
+#: ../../include/attach.php:144 ../../include/attach.php:191
+#: ../../include/attach.php:255 ../../include/attach.php:269
+#: ../../include/attach.php:276 ../../include/attach.php:344
+#: ../../include/attach.php:358 ../../include/attach.php:365
+#: ../../include/attach.php:443 ../../include/attach.php:918
+#: ../../include/attach.php:992 ../../include/attach.php:1157
+#: ../../include/items.php:3440 ../../include/photos.php:28
msgid "Permission denied."
msgstr "Berechtigung verweigert."
@@ -275,7 +259,7 @@ msgstr "Berechtigung verweigert."
msgid "Block Name"
msgstr "Block-Name"
-#: ../../Zotlabs/Module/Blocks.php:154 ../../include/text.php:2267
+#: ../../Zotlabs/Module/Blocks.php:154 ../../include/text.php:2280
msgid "Blocks"
msgstr "Blöcke"
@@ -284,25 +268,22 @@ msgid "Block Title"
msgstr "Titel des Blocks"
#: ../../Zotlabs/Module/Blocks.php:157 ../../Zotlabs/Module/Menu.php:114
-#: ../../Zotlabs/Module/Layouts.php:191 ../../Zotlabs/Module/Webpages.php:256
-#: ../../include/page_widgets.php:47
+#: ../../Zotlabs/Module/Layouts.php:191 ../../Zotlabs/Module/Webpages.php:251
msgid "Created"
msgstr "Erstellt"
#: ../../Zotlabs/Module/Blocks.php:158 ../../Zotlabs/Module/Menu.php:115
-#: ../../Zotlabs/Module/Layouts.php:192 ../../Zotlabs/Module/Webpages.php:257
-#: ../../include/page_widgets.php:48
+#: ../../Zotlabs/Module/Layouts.php:192 ../../Zotlabs/Module/Webpages.php:252
msgid "Edited"
msgstr "Geändert"
-#: ../../Zotlabs/Module/Blocks.php:159
+#: ../../Zotlabs/Module/Blocks.php:159 ../../Zotlabs/Module/Cdav.php:1126
#: ../../Zotlabs/Module/New_channel.php:147
-#: ../../Zotlabs/Module/Connedit.php:917 ../../Zotlabs/Module/Menu.php:118
+#: ../../Zotlabs/Module/Connedit.php:935 ../../Zotlabs/Module/Menu.php:118
#: ../../Zotlabs/Module/Layouts.php:185 ../../Zotlabs/Module/Profiles.php:801
-#: ../../Zotlabs/Module/Webpages.php:244 ../../Zotlabs/Storage/Browser.php:228
-#: ../../Zotlabs/Storage/Browser.php:332 ../../addon/cdav/Mod_Cdav.php:1151
-#: ../../addon/cdav/include/widgets.php:127
-#: ../../addon/cdav/include/widgets.php:164
+#: ../../Zotlabs/Module/Webpages.php:239 ../../Zotlabs/Storage/Browser.php:229
+#: ../../Zotlabs/Storage/Browser.php:335 ../../Zotlabs/Widget/Cdav.php:127
+#: ../../Zotlabs/Widget/Cdav.php:164
msgid "Create"
msgstr "Erstelle"
@@ -310,52 +291,49 @@ msgstr "Erstelle"
#: ../../Zotlabs/Module/Admin/Profs.php:154
#: ../../Zotlabs/Module/Settings/Oauth.php:149
#: ../../Zotlabs/Module/Thing.php:260 ../../Zotlabs/Module/Editblock.php:114
-#: ../../Zotlabs/Module/Connections.php:296
-#: ../../Zotlabs/Module/Connections.php:316 ../../Zotlabs/Module/Wiki.php:165
-#: ../../Zotlabs/Module/Wiki.php:275 ../../Zotlabs/Module/Menu.php:112
+#: ../../Zotlabs/Module/Connections.php:260
+#: ../../Zotlabs/Module/Connections.php:297
+#: ../../Zotlabs/Module/Connections.php:317 ../../Zotlabs/Module/Wiki.php:167
+#: ../../Zotlabs/Module/Wiki.php:300 ../../Zotlabs/Module/Menu.php:112
#: ../../Zotlabs/Module/Layouts.php:193
#: ../../Zotlabs/Module/Editwebpage.php:142
-#: ../../Zotlabs/Module/Webpages.php:245 ../../Zotlabs/Module/Editpost.php:80
-#: ../../Zotlabs/Lib/Apps.php:367 ../../Zotlabs/Lib/ThreadItem.php:107
-#: ../../Zotlabs/Storage/Browser.php:238
-#: ../../addon/cdav/include/widgets.php:125
-#: ../../addon/cdav/include/widgets.php:161
-#: ../../addon/gitwiki/Mod_Gitwiki.php:151
-#: ../../addon/gitwiki/Mod_Gitwiki.php:252 ../../include/channel.php:1044
-#: ../../include/channel.php:1048 ../../include/menu.php:113
-#: ../../include/page_widgets.php:9 ../../include/page_widgets.php:39
+#: ../../Zotlabs/Module/Webpages.php:240 ../../Zotlabs/Module/Editpost.php:85
+#: ../../Zotlabs/Lib/Apps.php:393 ../../Zotlabs/Lib/ThreadItem.php:107
+#: ../../Zotlabs/Storage/Browser.php:239 ../../Zotlabs/Widget/Cdav.php:125
+#: ../../Zotlabs/Widget/Cdav.php:161 ../../addon/gitwiki/Mod_Gitwiki.php:151
+#: ../../addon/gitwiki/Mod_Gitwiki.php:252 ../../include/channel.php:1161
+#: ../../include/channel.php:1165 ../../include/menu.php:113
msgid "Edit"
msgstr "Bearbeiten"
-#: ../../Zotlabs/Module/Blocks.php:161 ../../Zotlabs/Module/Photos.php:1042
-#: ../../Zotlabs/Module/Layouts.php:194 ../../Zotlabs/Module/Webpages.php:246
-#: ../../addon/cdav/include/widgets.php:123
-#: ../../include/conversation.php:1311
+#: ../../Zotlabs/Module/Blocks.php:161 ../../Zotlabs/Module/Photos.php:1044
+#: ../../Zotlabs/Module/Layouts.php:194 ../../Zotlabs/Module/Webpages.php:241
+#: ../../Zotlabs/Widget/Cdav.php:123 ../../include/conversation.php:1308
msgid "Share"
msgstr "Teilen"
#: ../../Zotlabs/Module/Blocks.php:162 ../../Zotlabs/Module/Editlayout.php:138
+#: ../../Zotlabs/Module/Cdav.php:838 ../../Zotlabs/Module/Cdav.php:1128
#: ../../Zotlabs/Module/Admin/Accounts.php:173
#: ../../Zotlabs/Module/Admin/Channels.php:149
#: ../../Zotlabs/Module/Admin/Profs.php:155
#: ../../Zotlabs/Module/Settings/Oauth.php:150
#: ../../Zotlabs/Module/Thing.php:261 ../../Zotlabs/Module/Editblock.php:139
-#: ../../Zotlabs/Module/Connections.php:267
-#: ../../Zotlabs/Module/Photos.php:1143 ../../Zotlabs/Module/Connedit.php:650
-#: ../../Zotlabs/Module/Connedit.php:919 ../../Zotlabs/Module/Group.php:177
+#: ../../Zotlabs/Module/Connections.php:268
+#: ../../Zotlabs/Module/Photos.php:1145 ../../Zotlabs/Module/Connedit.php:650
+#: ../../Zotlabs/Module/Connedit.php:937 ../../Zotlabs/Module/Group.php:179
#: ../../Zotlabs/Module/Profiles.php:803
#: ../../Zotlabs/Module/Editwebpage.php:167
-#: ../../Zotlabs/Module/Webpages.php:247 ../../Zotlabs/Lib/Apps.php:368
-#: ../../Zotlabs/Lib/ThreadItem.php:127 ../../Zotlabs/Storage/Browser.php:239
-#: ../../addon/cdav/Mod_Cdav.php:864 ../../addon/cdav/Mod_Cdav.php:1153
-#: ../../include/conversation.php:654
+#: ../../Zotlabs/Module/Webpages.php:242 ../../Zotlabs/Lib/Apps.php:394
+#: ../../Zotlabs/Lib/ThreadItem.php:127 ../../Zotlabs/Storage/Browser.php:240
+#: ../../include/conversation.php:649 ../../include/conversation.php:686
msgid "Delete"
msgstr "Löschen"
#: ../../Zotlabs/Module/Blocks.php:166 ../../Zotlabs/Module/Events.php:694
-#: ../../Zotlabs/Module/Wiki.php:167 ../../Zotlabs/Module/Layouts.php:198
-#: ../../Zotlabs/Module/Webpages.php:251 ../../Zotlabs/Module/Pubsites.php:59
-#: ../../addon/gitwiki/Mod_Gitwiki.php:153 ../../include/page_widgets.php:42
+#: ../../Zotlabs/Module/Wiki.php:169 ../../Zotlabs/Module/Layouts.php:198
+#: ../../Zotlabs/Module/Webpages.php:246 ../../Zotlabs/Module/Pubsites.php:59
+#: ../../addon/gitwiki/Mod_Gitwiki.php:153
msgid "View"
msgstr "Ansicht"
@@ -388,52 +366,56 @@ msgid_plural "%d messages sent."
msgstr[0] "%d Nachricht gesendet."
msgstr[1] "%d Nachrichten gesendet."
-#: ../../Zotlabs/Module/Invite.php:105
+#: ../../Zotlabs/Module/Invite.php:98 ../../Zotlabs/Lib/Apps.php:254
+msgid "Invite"
+msgstr "Einladen"
+
+#: ../../Zotlabs/Module/Invite.php:107
msgid "You have no more invitations available"
msgstr "Du hast keine weiteren verfügbare Einladungen"
-#: ../../Zotlabs/Module/Invite.php:136
+#: ../../Zotlabs/Module/Invite.php:138
msgid "Send invitations"
msgstr "Einladungen senden"
-#: ../../Zotlabs/Module/Invite.php:137
+#: ../../Zotlabs/Module/Invite.php:139
msgid "Enter email addresses, one per line:"
msgstr "Email-Adressen eintragen, eine pro Zeile:"
-#: ../../Zotlabs/Module/Invite.php:138 ../../Zotlabs/Module/Mail.php:303
+#: ../../Zotlabs/Module/Invite.php:140 ../../Zotlabs/Module/Mail.php:285
msgid "Your message:"
msgstr "Deine Nachricht:"
-#: ../../Zotlabs/Module/Invite.php:139
+#: ../../Zotlabs/Module/Invite.php:141
msgid "Please join my community on $Projectname."
msgstr "Schließe Dich uns auf $Projectname an!"
-#: ../../Zotlabs/Module/Invite.php:141
+#: ../../Zotlabs/Module/Invite.php:143
msgid "You will need to supply this invitation code:"
msgstr "Bitte verwende bei der Registrierung den folgenden Einladungscode:"
-#: ../../Zotlabs/Module/Invite.php:142
+#: ../../Zotlabs/Module/Invite.php:144
msgid ""
"1. Register at any $Projectname location (they are all inter-connected)"
msgstr "1. Registriere Dich auf einem beliebigen $Projectname-Hub (sie sind alle miteinander verbunden)"
-#: ../../Zotlabs/Module/Invite.php:144
+#: ../../Zotlabs/Module/Invite.php:146
msgid "2. Enter my $Projectname network address into the site searchbar."
msgstr "2. Gib meine $Projectname-Adresse im Suchfeld ein."
-#: ../../Zotlabs/Module/Invite.php:145
+#: ../../Zotlabs/Module/Invite.php:147
msgid "or visit"
msgstr "oder besuche"
-#: ../../Zotlabs/Module/Invite.php:147
+#: ../../Zotlabs/Module/Invite.php:149
msgid "3. Click [Connect]"
msgstr "3. Klicke auf [Verbinden]"
-#: ../../Zotlabs/Module/Invite.php:149 ../../Zotlabs/Module/Locs.php:121
+#: ../../Zotlabs/Module/Invite.php:151 ../../Zotlabs/Module/Locs.php:121
#: ../../Zotlabs/Module/Mitem.php:243 ../../Zotlabs/Module/Events.php:493
-#: ../../Zotlabs/Module/Appman.php:134
+#: ../../Zotlabs/Module/Appman.php:148
#: ../../Zotlabs/Module/Import_items.php:129
-#: ../../Zotlabs/Module/Setup.php:309 ../../Zotlabs/Module/Setup.php:357
+#: ../../Zotlabs/Module/Setup.php:308 ../../Zotlabs/Module/Setup.php:349
#: ../../Zotlabs/Module/Connect.php:98
#: ../../Zotlabs/Module/Admin/Features.php:66
#: ../../Zotlabs/Module/Admin/Plugins.php:438
@@ -441,35 +423,35 @@ msgstr "3. Klicke auf [Verbinden]"
#: ../../Zotlabs/Module/Admin/Logs.php:84
#: ../../Zotlabs/Module/Admin/Channels.php:147
#: ../../Zotlabs/Module/Admin/Themes.php:158
-#: ../../Zotlabs/Module/Admin/Site.php:279
+#: ../../Zotlabs/Module/Admin/Site.php:271
#: ../../Zotlabs/Module/Admin/Profs.php:157
#: ../../Zotlabs/Module/Admin/Account_edit.php:74
#: ../../Zotlabs/Module/Admin/Security.php:104
#: ../../Zotlabs/Module/Settings/Permcats.php:110
-#: ../../Zotlabs/Module/Settings/Channel.php:476
+#: ../../Zotlabs/Module/Settings/Channel.php:480
#: ../../Zotlabs/Module/Settings/Features.php:47
#: ../../Zotlabs/Module/Settings/Tokens.php:168
#: ../../Zotlabs/Module/Settings/Account.php:118
-#: ../../Zotlabs/Module/Settings/Featured.php:50
+#: ../../Zotlabs/Module/Settings/Featured.php:52
#: ../../Zotlabs/Module/Settings/Display.php:203
#: ../../Zotlabs/Module/Settings/Oauth.php:87
#: ../../Zotlabs/Module/Thing.php:320 ../../Zotlabs/Module/Thing.php:370
-#: ../../Zotlabs/Module/Import.php:514 ../../Zotlabs/Module/Cal.php:343
-#: ../../Zotlabs/Module/Mood.php:139 ../../Zotlabs/Module/Photos.php:657
-#: ../../Zotlabs/Module/Photos.php:1022 ../../Zotlabs/Module/Photos.php:1062
-#: ../../Zotlabs/Module/Photos.php:1180 ../../Zotlabs/Module/Wiki.php:169
-#: ../../Zotlabs/Module/Pdledit.php:74 ../../Zotlabs/Module/Poke.php:186
-#: ../../Zotlabs/Module/Connedit.php:882 ../../Zotlabs/Module/Chat.php:194
-#: ../../Zotlabs/Module/Chat.php:240 ../../Zotlabs/Module/Pconfig.php:107
-#: ../../Zotlabs/Module/Group.php:85 ../../Zotlabs/Module/Profiles.php:726
+#: ../../Zotlabs/Module/Import.php:518 ../../Zotlabs/Module/Cal.php:343
+#: ../../Zotlabs/Module/Mood.php:139 ../../Zotlabs/Module/Photos.php:659
+#: ../../Zotlabs/Module/Photos.php:1024 ../../Zotlabs/Module/Photos.php:1064
+#: ../../Zotlabs/Module/Photos.php:1182 ../../Zotlabs/Module/Wiki.php:171
+#: ../../Zotlabs/Module/Pdledit.php:74 ../../Zotlabs/Module/Poke.php:200
+#: ../../Zotlabs/Module/Connedit.php:900 ../../Zotlabs/Module/Chat.php:196
+#: ../../Zotlabs/Module/Chat.php:242 ../../Zotlabs/Module/Pconfig.php:107
+#: ../../Zotlabs/Module/Group.php:87 ../../Zotlabs/Module/Profiles.php:726
#: ../../Zotlabs/Module/Sources.php:114 ../../Zotlabs/Module/Sources.php:149
-#: ../../Zotlabs/Module/Xchan.php:15 ../../Zotlabs/Module/Mail.php:449
-#: ../../Zotlabs/Module/Filestorage.php:165 ../../Zotlabs/Module/Rate.php:166
-#: ../../Zotlabs/Lib/ThreadItem.php:732
+#: ../../Zotlabs/Module/Xchan.php:15 ../../Zotlabs/Module/Mail.php:431
+#: ../../Zotlabs/Module/Filestorage.php:155 ../../Zotlabs/Module/Rate.php:166
+#: ../../Zotlabs/Lib/ThreadItem.php:730
#: ../../Zotlabs/Widget/Eventstools.php:16
-#: ../../view/theme/redbasic/php/config.php:84
-#: ../../addon/skeleton/skeleton.php:65 ../../addon/gnusoc/gnusoc.php:134
-#: ../../addon/cdav/cdav.php:246 ../../addon/planets/planets.php:157
+#: ../../view/theme/redbasic/php/config.php:95
+#: ../../addon/skeleton/skeleton.php:65 ../../addon/gnusoc/gnusoc.php:226
+#: ../../addon/planets/planets.php:153
#: ../../addon/openclipatar/openclipatar.php:53
#: ../../addon/wppost/wppost.php:113 ../../addon/nsfw/nsfw.php:92
#: ../../addon/ijpost/ijpost.php:89 ../../addon/dwpost/dwpost.php:89
@@ -477,7 +459,7 @@ msgstr "3. Klicke auf [Verbinden]"
#: ../../addon/likebanner/likebanner.php:57
#: ../../addon/redphotos/redphotos.php:136 ../../addon/irc/irc.php:53
#: ../../addon/ljpost/ljpost.php:86 ../../addon/startpage/startpage.php:113
-#: ../../addon/diaspora/diaspora.php:712
+#: ../../addon/diaspora/diaspora.php:759
#: ../../addon/gitwiki/Mod_Gitwiki.php:155
#: ../../addon/rainbowtag/rainbowtag.php:85 ../../addon/visage/visage.php:170
#: ../../addon/nsabait/nsabait.php:161 ../../addon/mailtest/mailtest.php:100
@@ -493,11 +475,11 @@ msgstr "3. Klicke auf [Verbinden]"
#: ../../addon/statusnet/statusnet.php:432
#: ../../addon/statusnet/statusnet.php:899 ../../addon/twitter/twitter.php:217
#: ../../addon/twitter/twitter.php:259
-#: ../../addon/smileybutton/smileybutton.php:281
+#: ../../addon/smileybutton/smileybutton.php:219
#: ../../addon/piwik/piwik.php:95 ../../addon/pageheader/pageheader.php:48
-#: ../../addon/xmpp/xmpp.php:69 ../../addon/pumpio/pumpio.php:237
-#: ../../addon/redfiles/redfiles.php:124 ../../addon/hubwall/hubwall.php:95
-#: ../../include/js_strings.php:22
+#: ../../addon/authchoose/authchoose.php:71 ../../addon/xmpp/xmpp.php:69
+#: ../../addon/pumpio/pumpio.php:237 ../../addon/redfiles/redfiles.php:124
+#: ../../addon/hubwall/hubwall.php:95 ../../include/js_strings.php:22
msgid "Submit"
msgstr "Absenden"
@@ -523,12 +505,12 @@ msgid "Edit Layout"
msgstr "Layout bearbeiten"
#: ../../Zotlabs/Module/Profperm.php:28 ../../Zotlabs/Module/Subthread.php:62
-#: ../../Zotlabs/Module/Import_items.php:120 ../../Zotlabs/Module/Group.php:72
+#: ../../Zotlabs/Module/Import_items.php:120 ../../Zotlabs/Module/Group.php:74
#: ../../Zotlabs/Module/Dreport.php:10 ../../Zotlabs/Module/Dreport.php:68
#: ../../Zotlabs/Module/Like.php:283 ../../Zotlabs/Web/WebServer.php:130
#: ../../addon/redphotos/redphotos.php:119
#: ../../addon/frphotos/frphotos.php:81 ../../addon/redfiles/redfiles.php:109
-#: ../../include/items.php:327
+#: ../../include/items.php:340
msgid "Permission denied"
msgstr "Keine Berechtigung"
@@ -540,7 +522,7 @@ msgstr "Ungültiger Profil-Identifikator"
msgid "Profile Visibility Editor"
msgstr "Profil-Sichtbarkeits-Editor"
-#: ../../Zotlabs/Module/Profperm.php:113 ../../include/channel.php:1362
+#: ../../Zotlabs/Module/Profperm.php:113 ../../include/channel.php:1485
msgid "Profile"
msgstr "Profil"
@@ -553,10 +535,291 @@ msgid "Visible To"
msgstr "Sichtbar für"
#: ../../Zotlabs/Module/Profperm.php:140
-#: ../../Zotlabs/Module/Connections.php:141
+#: ../../Zotlabs/Module/Connections.php:140
msgid "All Connections"
msgstr "Alle Verbindungen"
+#: ../../Zotlabs/Module/Cdav.php:726
+msgid "INVALID EVENT DISMISSED!"
+msgstr "UNGÜLTIGEN TERMIN ABGELEHNT!"
+
+#: ../../Zotlabs/Module/Cdav.php:727
+msgid "Summary: "
+msgstr "Zusammenfassung:"
+
+#: ../../Zotlabs/Module/Cdav.php:727 ../../Zotlabs/Module/Cdav.php:728
+#: ../../Zotlabs/Module/Cdav.php:735 ../../Zotlabs/Module/Embedphotos.php:146
+#: ../../Zotlabs/Module/Photos.php:759 ../../Zotlabs/Module/Photos.php:1215
+#: ../../Zotlabs/Lib/Apps.php:721 ../../Zotlabs/Lib/Apps.php:799
+#: ../../Zotlabs/Storage/Browser.php:164 ../../Zotlabs/Widget/Portfolio.php:86
+#: ../../Zotlabs/Widget/Album.php:84 ../../include/conversation.php:1107
+msgid "Unknown"
+msgstr "Unbekannt"
+
+#: ../../Zotlabs/Module/Cdav.php:728
+msgid "Date: "
+msgstr "Datum:"
+
+#: ../../Zotlabs/Module/Cdav.php:729 ../../Zotlabs/Module/Cdav.php:736
+msgid "Reason: "
+msgstr "Grund:"
+
+#: ../../Zotlabs/Module/Cdav.php:734
+msgid "INVALID CARD DISMISSED!"
+msgstr "UNGÜLTIGE KARTE ABGELEHNT!"
+
+#: ../../Zotlabs/Module/Cdav.php:735
+msgid "Name: "
+msgstr "Name: "
+
+#: ../../Zotlabs/Module/Cdav.php:768
+msgid "CalDAV"
+msgstr "CalDAV"
+
+#: ../../Zotlabs/Module/Cdav.php:809 ../../Zotlabs/Module/Events.php:460
+msgid "Event title"
+msgstr "Termintitel"
+
+#: ../../Zotlabs/Module/Cdav.php:810 ../../Zotlabs/Module/Events.php:466
+msgid "Start date and time"
+msgstr "Startdatum und -zeit"
+
+#: ../../Zotlabs/Module/Cdav.php:810 ../../Zotlabs/Module/Cdav.php:811
+msgid "Example: YYYY-MM-DD HH:mm"
+msgstr "Beispiel: JJJJ-MM-TT HH:mm"
+
+#: ../../Zotlabs/Module/Cdav.php:811
+msgid "End date and time"
+msgstr "Enddatum und -zeit"
+
+#: ../../Zotlabs/Module/Cdav.php:812 ../../Zotlabs/Module/Events.php:473
+#: ../../Zotlabs/Module/Appman.php:138 ../../Zotlabs/Module/Rbmark.php:101
+#: ../../addon/rendezvous/rendezvous.php:173
+msgid "Description"
+msgstr "Beschreibung"
+
+#: ../../Zotlabs/Module/Cdav.php:813 ../../Zotlabs/Module/Locs.php:117
+#: ../../Zotlabs/Module/Events.php:475 ../../Zotlabs/Module/Profiles.php:509
+#: ../../Zotlabs/Module/Profiles.php:737 ../../Zotlabs/Module/Pubsites.php:51
+#: ../../include/js_strings.php:25
+msgid "Location"
+msgstr "Ort"
+
+#: ../../Zotlabs/Module/Cdav.php:820 ../../Zotlabs/Module/Events.php:689
+#: ../../Zotlabs/Module/Events.php:698 ../../Zotlabs/Module/Cal.php:337
+#: ../../Zotlabs/Module/Cal.php:344 ../../Zotlabs/Module/Photos.php:913
+msgid "Previous"
+msgstr "Voriges"
+
+#: ../../Zotlabs/Module/Cdav.php:821 ../../Zotlabs/Module/Events.php:690
+#: ../../Zotlabs/Module/Events.php:699 ../../Zotlabs/Module/Setup.php:263
+#: ../../Zotlabs/Module/Cal.php:338 ../../Zotlabs/Module/Cal.php:345
+#: ../../Zotlabs/Module/Photos.php:922
+msgid "Next"
+msgstr "Nächste"
+
+#: ../../Zotlabs/Module/Cdav.php:822 ../../Zotlabs/Module/Events.php:700
+#: ../../Zotlabs/Module/Cal.php:346
+msgid "Today"
+msgstr "Heute"
+
+#: ../../Zotlabs/Module/Cdav.php:823 ../../Zotlabs/Module/Events.php:695
+msgid "Month"
+msgstr "Monat"
+
+#: ../../Zotlabs/Module/Cdav.php:824 ../../Zotlabs/Module/Events.php:696
+msgid "Week"
+msgstr "Woche"
+
+#: ../../Zotlabs/Module/Cdav.php:825 ../../Zotlabs/Module/Events.php:697
+msgid "Day"
+msgstr "Tag"
+
+#: ../../Zotlabs/Module/Cdav.php:826
+msgid "List month"
+msgstr "Liste Monat"
+
+#: ../../Zotlabs/Module/Cdav.php:827
+msgid "List week"
+msgstr "Liste Woche"
+
+#: ../../Zotlabs/Module/Cdav.php:828
+msgid "List day"
+msgstr "Liste Tag"
+
+#: ../../Zotlabs/Module/Cdav.php:835
+msgid "More"
+msgstr "Mehr"
+
+#: ../../Zotlabs/Module/Cdav.php:836
+msgid "Less"
+msgstr "Weniger"
+
+#: ../../Zotlabs/Module/Cdav.php:837
+msgid "Select calendar"
+msgstr "Kalender auswählen"
+
+#: ../../Zotlabs/Module/Cdav.php:839
+msgid "Delete all"
+msgstr "Alles löschen"
+
+#: ../../Zotlabs/Module/Cdav.php:840 ../../Zotlabs/Module/Cdav.php:1129
+#: ../../Zotlabs/Module/Admin/Plugins.php:423
+#: ../../Zotlabs/Module/Settings/Oauth.php:88
+#: ../../Zotlabs/Module/Settings/Oauth.php:114
+#: ../../Zotlabs/Module/Wiki.php:290 ../../Zotlabs/Module/Wiki.php:316
+#: ../../Zotlabs/Module/Connedit.php:938 ../../Zotlabs/Module/Fbrowser.php:66
+#: ../../Zotlabs/Module/Fbrowser.php:88 ../../Zotlabs/Module/Profiles.php:804
+#: ../../Zotlabs/Module/Filer.php:55 ../../Zotlabs/Module/Tagrm.php:15
+#: ../../Zotlabs/Module/Tagrm.php:138 ../../addon/js_upload/js_upload.php:46
+#: ../../addon/gitwiki/Mod_Gitwiki.php:244
+#: ../../addon/gitwiki/Mod_Gitwiki.php:267 ../../include/conversation.php:1324
+#: ../../include/conversation.php:1373
+msgid "Cancel"
+msgstr "Abbrechen"
+
+#: ../../Zotlabs/Module/Cdav.php:841
+msgid "Sorry! Editing of recurrent events is not yet implemented."
+msgstr "Entschuldigung, aber das Bearbeiten von wiederkehrenden Veranstaltungen ist leider noch nicht implementiert."
+
+#: ../../Zotlabs/Module/Cdav.php:969
+msgid "CardDAV"
+msgstr "CardDAV"
+
+#: ../../Zotlabs/Module/Cdav.php:1111
+#: ../../Zotlabs/Module/Sharedwithme.php:105
+#: ../../Zotlabs/Module/Admin/Channels.php:159
+#: ../../Zotlabs/Module/Settings/Oauth.php:89
+#: ../../Zotlabs/Module/Settings/Oauth.php:115
+#: ../../Zotlabs/Module/Wiki.php:174 ../../Zotlabs/Module/Connedit.php:920
+#: ../../Zotlabs/Module/Chat.php:251 ../../Zotlabs/Lib/NativeWikiPage.php:539
+#: ../../Zotlabs/Storage/Browser.php:234
+#: ../../Zotlabs/Widget/Wiki_page_history.php:22
+#: ../../addon/rendezvous/rendezvous.php:172
+#: ../../addon/gitwiki/Mod_Gitwiki.php:158
+msgid "Name"
+msgstr "Name"
+
+#: ../../Zotlabs/Module/Cdav.php:1112 ../../Zotlabs/Module/Connedit.php:921
+msgid "Organisation"
+msgstr "Organisation"
+
+#: ../../Zotlabs/Module/Cdav.php:1113 ../../Zotlabs/Module/Connedit.php:922
+msgid "Title"
+msgstr "Titel"
+
+#: ../../Zotlabs/Module/Cdav.php:1114 ../../Zotlabs/Module/Connedit.php:923
+#: ../../Zotlabs/Module/Profiles.php:789
+msgid "Phone"
+msgstr "Telefon"
+
+#: ../../Zotlabs/Module/Cdav.php:1115
+#: ../../Zotlabs/Module/Admin/Accounts.php:169
+#: ../../Zotlabs/Module/Admin/Accounts.php:181
+#: ../../Zotlabs/Module/Connedit.php:924 ../../Zotlabs/Module/Profiles.php:790
+#: ../../addon/openid/MysqlProvider.php:56
+#: ../../addon/openid/MysqlProvider.php:57 ../../addon/rtof/rtof.php:93
+#: ../../addon/redred/redred.php:107 ../../include/network.php:1697
+msgid "Email"
+msgstr "E-Mail"
+
+#: ../../Zotlabs/Module/Cdav.php:1116 ../../Zotlabs/Module/Connedit.php:925
+#: ../../Zotlabs/Module/Profiles.php:791
+msgid "Instant messenger"
+msgstr "Sofortnachrichtendienst"
+
+#: ../../Zotlabs/Module/Cdav.php:1117 ../../Zotlabs/Module/Connedit.php:926
+#: ../../Zotlabs/Module/Profiles.php:792
+msgid "Website"
+msgstr "Webseite"
+
+#: ../../Zotlabs/Module/Cdav.php:1118 ../../Zotlabs/Module/Locs.php:118
+#: ../../Zotlabs/Module/Admin/Channels.php:160
+#: ../../Zotlabs/Module/Connedit.php:927 ../../Zotlabs/Module/Profiles.php:502
+#: ../../Zotlabs/Module/Profiles.php:793
+msgid "Address"
+msgstr "Adresse"
+
+#: ../../Zotlabs/Module/Cdav.php:1119 ../../Zotlabs/Module/Connedit.php:928
+#: ../../Zotlabs/Module/Profiles.php:794
+msgid "Note"
+msgstr "Hinweis"
+
+#: ../../Zotlabs/Module/Cdav.php:1120 ../../Zotlabs/Module/Connedit.php:929
+#: ../../Zotlabs/Module/Profiles.php:795 ../../include/event.php:1290
+#: ../../include/connections.php:674
+msgid "Mobile"
+msgstr "Mobil"
+
+#: ../../Zotlabs/Module/Cdav.php:1121 ../../Zotlabs/Module/Connedit.php:930
+#: ../../Zotlabs/Module/Profiles.php:796 ../../include/event.php:1291
+#: ../../include/connections.php:675
+msgid "Home"
+msgstr "Home"
+
+#: ../../Zotlabs/Module/Cdav.php:1122 ../../Zotlabs/Module/Connedit.php:931
+#: ../../Zotlabs/Module/Profiles.php:797 ../../include/event.php:1294
+#: ../../include/connections.php:678
+msgid "Work"
+msgstr "Arbeit"
+
+#: ../../Zotlabs/Module/Cdav.php:1124 ../../Zotlabs/Module/Connedit.php:933
+#: ../../Zotlabs/Module/Profiles.php:799
+#: ../../addon/jappixmini/jappixmini.php:368
+msgid "Add Contact"
+msgstr "Kontakt hinzufügen"
+
+#: ../../Zotlabs/Module/Cdav.php:1125 ../../Zotlabs/Module/Connedit.php:934
+#: ../../Zotlabs/Module/Profiles.php:800
+msgid "Add Field"
+msgstr "Feld hinzufügen"
+
+#: ../../Zotlabs/Module/Cdav.php:1127
+#: ../../Zotlabs/Module/Admin/Plugins.php:453
+#: ../../Zotlabs/Module/Settings/Oauth.php:42
+#: ../../Zotlabs/Module/Settings/Oauth.php:113
+#: ../../Zotlabs/Module/Connedit.php:936 ../../Zotlabs/Module/Profiles.php:802
+#: ../../Zotlabs/Lib/Apps.php:384
+msgid "Update"
+msgstr "Aktualisieren"
+
+#: ../../Zotlabs/Module/Cdav.php:1130 ../../Zotlabs/Module/Connedit.php:939
+msgid "P.O. Box"
+msgstr "Postfach"
+
+#: ../../Zotlabs/Module/Cdav.php:1131 ../../Zotlabs/Module/Connedit.php:940
+msgid "Additional"
+msgstr "Zusätzlich"
+
+#: ../../Zotlabs/Module/Cdav.php:1132 ../../Zotlabs/Module/Connedit.php:941
+msgid "Street"
+msgstr "Straße"
+
+#: ../../Zotlabs/Module/Cdav.php:1133 ../../Zotlabs/Module/Connedit.php:942
+msgid "Locality"
+msgstr "Ortschaft"
+
+#: ../../Zotlabs/Module/Cdav.php:1134 ../../Zotlabs/Module/Connedit.php:943
+msgid "Region"
+msgstr "Region"
+
+#: ../../Zotlabs/Module/Cdav.php:1135 ../../Zotlabs/Module/Connedit.php:944
+msgid "ZIP Code"
+msgstr "Postleitzahl"
+
+#: ../../Zotlabs/Module/Cdav.php:1136 ../../Zotlabs/Module/Connedit.php:945
+#: ../../Zotlabs/Module/Profiles.php:760
+msgid "Country"
+msgstr "Land"
+
+#: ../../Zotlabs/Module/Cdav.php:1183
+msgid "Default Calendar"
+msgstr "Standardkalender"
+
+#: ../../Zotlabs/Module/Cdav.php:1193
+msgid "Default Addressbook"
+msgstr "Standardadressbuch"
+
#: ../../Zotlabs/Module/Regdir.php:49 ../../Zotlabs/Module/Dirsearch.php:25
msgid "This site is not a directory server"
msgstr "Diese Webseite ist kein Verzeichnisserver"
@@ -566,20 +829,30 @@ msgstr "Diese Webseite ist kein Verzeichnisserver"
msgid "You must be logged in to see this page."
msgstr "Du musst angemeldet sein, um diese Seite betrachten zu können."
-#: ../../Zotlabs/Module/Channel.php:47 ../../Zotlabs/Module/Hcard.php:35
-#: ../../Zotlabs/Module/Profile.php:43
+#: ../../Zotlabs/Module/Channel.php:47 ../../Zotlabs/Module/Hcard.php:37
+#: ../../Zotlabs/Module/Profile.php:45
msgid "Posts and comments"
msgstr "Beiträge und Kommentare"
-#: ../../Zotlabs/Module/Channel.php:54 ../../Zotlabs/Module/Hcard.php:42
-#: ../../Zotlabs/Module/Profile.php:50
+#: ../../Zotlabs/Module/Channel.php:54 ../../Zotlabs/Module/Hcard.php:44
+#: ../../Zotlabs/Module/Profile.php:52
msgid "Only posts"
msgstr "Nur Beiträge"
+#: ../../Zotlabs/Module/Channel.php:97 ../../Zotlabs/Lib/Apps.php:240
+#: ../../include/nav.php:175
+msgid "Channel Home"
+msgstr "Mein Kanal"
+
#: ../../Zotlabs/Module/Channel.php:112
msgid "Insufficient permissions. Request redirected to profile page."
msgstr "Unzureichende Zugriffsrechte. Die Anfrage wurde zur Profil-Seite umgeleitet."
+#: ../../Zotlabs/Module/Lang.php:8 ../../Zotlabs/Lib/Apps.php:256
+#: ../../addon/openid/MysqlProvider.php:69
+msgid "Language"
+msgstr "Sprache"
+
#: ../../Zotlabs/Module/Uexport.php:57 ../../Zotlabs/Module/Uexport.php:58
msgid "Export Channel"
msgstr "Kanal exportieren"
@@ -645,19 +918,20 @@ msgstr "Diese Inhalts-Sicherungen können wiederhergestellt werden, indem Du <a
msgid "Public access denied."
msgstr "Öffentlichen Zugriff verweigert."
-#: ../../Zotlabs/Module/Search.php:44 ../../Zotlabs/Module/Connections.php:312
-#: ../../Zotlabs/Lib/Apps.php:237 ../../Zotlabs/Widget/Sitesearch.php:31
-#: ../../include/text.php:1027 ../../include/text.php:1039
-#: ../../include/acl_selectors.php:213 ../../include/nav.php:164
+#: ../../Zotlabs/Module/Search.php:25 ../../Zotlabs/Module/Search.php:44
+#: ../../Zotlabs/Module/Connections.php:313 ../../Zotlabs/Lib/Apps.php:250
+#: ../../Zotlabs/Widget/Sitesearch.php:31 ../../include/text.php:1021
+#: ../../include/text.php:1033 ../../include/acl_selectors.php:213
+#: ../../include/nav.php:160
msgid "Search"
msgstr "Suche"
-#: ../../Zotlabs/Module/Search.php:224
+#: ../../Zotlabs/Module/Search.php:225
#, php-format
msgid "Items tagged with: %s"
msgstr "Beiträge mit Schlagwort: %s"
-#: ../../Zotlabs/Module/Search.php:226
+#: ../../Zotlabs/Module/Search.php:227
#, php-format
msgid "Search results for: %s"
msgstr "Suchergebnisse für: %s"
@@ -688,21 +962,7 @@ msgstr "Keine Klon-Adressen gefunden."
msgid "Manage Channel Locations"
msgstr "Klon-Adressen verwalten"
-#: ../../Zotlabs/Module/Locs.php:117 ../../Zotlabs/Module/Events.php:475
-#: ../../Zotlabs/Module/Profiles.php:509 ../../Zotlabs/Module/Profiles.php:737
-#: ../../Zotlabs/Module/Pubsites.php:51 ../../addon/cdav/Mod_Cdav.php:839
-#: ../../include/js_strings.php:25
-msgid "Location"
-msgstr "Ort"
-
-#: ../../Zotlabs/Module/Locs.php:118
-#: ../../Zotlabs/Module/Admin/Channels.php:160
-#: ../../Zotlabs/Module/Connedit.php:909 ../../Zotlabs/Module/Profiles.php:502
-#: ../../Zotlabs/Module/Profiles.php:793 ../../addon/cdav/Mod_Cdav.php:1143
-msgid "Address"
-msgstr "Adresse"
-
-#: ../../Zotlabs/Module/Locs.php:119
+#: ../../Zotlabs/Module/Locs.php:119 ../../Zotlabs/Module/Admin.php:111
msgid "Primary"
msgstr "Primär"
@@ -728,6 +988,15 @@ msgstr "Wenn möglich, lösche einen Klon, indem Du Dich auf dem jeweiligen Hub
msgid "Use this form to drop the location if the hub is no longer operating."
msgstr "Benutze dieses Formular zum Löschen eines Klons, wenn es den Hub nicht mehr gibt."
+#: ../../Zotlabs/Module/Apporder.php:34
+msgid "Change Order of Navigation Apps"
+msgstr "App-Reihenfolge in der Navigation ändern"
+
+#: ../../Zotlabs/Module/Apporder.php:35
+msgid ""
+"Use arrows to move the corresponding app up or down in the display list"
+msgstr "Benutze die Pfeiltasten, um die jeweilige App in der Anzeigeliste auf- oder abwärts zu bewegen."
+
#: ../../Zotlabs/Module/Mitem.php:28 ../../Zotlabs/Module/Menu.php:144
msgid "Menu not found."
msgstr "Menü nicht gefunden"
@@ -754,7 +1023,7 @@ msgid "Menu Item Permissions"
msgstr "Zugriffsrechte des Menü-Elements"
#: ../../Zotlabs/Module/Mitem.php:154 ../../Zotlabs/Module/Mitem.php:231
-#: ../../Zotlabs/Module/Settings/Channel.php:510
+#: ../../Zotlabs/Module/Settings/Channel.php:513
msgid "(click to open/close)"
msgstr "(zum öffnen/schließen anklicken)"
@@ -778,18 +1047,19 @@ msgstr "Magic-Auth verwenden, falls verfügbar"
#: ../../Zotlabs/Module/Mitem.php:240 ../../Zotlabs/Module/Mitem.php:241
#: ../../Zotlabs/Module/Events.php:470 ../../Zotlabs/Module/Events.php:471
#: ../../Zotlabs/Module/Removeme.php:63
-#: ../../Zotlabs/Module/Admin/Site.php:237
-#: ../../Zotlabs/Module/Settings/Channel.php:294
+#: ../../Zotlabs/Module/Admin/Site.php:235
+#: ../../Zotlabs/Module/Settings/Channel.php:298
#: ../../Zotlabs/Module/Settings/Display.php:103
-#: ../../Zotlabs/Module/Api.php:97 ../../Zotlabs/Module/Photos.php:642
-#: ../../Zotlabs/Module/Wiki.php:180 ../../Zotlabs/Module/Connedit.php:392
+#: ../../Zotlabs/Module/Api.php:97 ../../Zotlabs/Module/Photos.php:644
+#: ../../Zotlabs/Module/Wiki.php:182 ../../Zotlabs/Module/Connedit.php:392
#: ../../Zotlabs/Module/Connedit.php:775 ../../Zotlabs/Module/Menu.php:100
#: ../../Zotlabs/Module/Menu.php:157 ../../Zotlabs/Module/Profiles.php:681
-#: ../../Zotlabs/Module/Filestorage.php:160
-#: ../../Zotlabs/Module/Filestorage.php:168 ../../boot.php:1633
-#: ../../view/theme/redbasic/php/config.php:89
-#: ../../view/theme/redbasic/php/config.php:104 ../../addon/cdav/cdav.php:234
-#: ../../addon/planets/planets.php:153 ../../addon/wppost/wppost.php:82
+#: ../../Zotlabs/Module/Filestorage.php:150
+#: ../../Zotlabs/Module/Filestorage.php:158
+#: ../../Zotlabs/Storage/Browser.php:351 ../../boot.php:1605
+#: ../../view/theme/redbasic/php/config.php:100
+#: ../../view/theme/redbasic/php/config.php:115
+#: ../../addon/planets/planets.php:149 ../../addon/wppost/wppost.php:82
#: ../../addon/wppost/wppost.php:105 ../../addon/wppost/wppost.php:109
#: ../../addon/nsfw/nsfw.php:84 ../../addon/ijpost/ijpost.php:73
#: ../../addon/ijpost/ijpost.php:85 ../../addon/dwpost/dwpost.php:73
@@ -812,8 +1082,9 @@ msgstr "Magic-Auth verwenden, falls verfügbar"
#: ../../addon/statusnet/statusnet.php:415
#: ../../addon/statusnet/statusnet.php:424 ../../addon/twitter/twitter.php:242
#: ../../addon/twitter/twitter.php:246 ../../addon/twitter/twitter.php:255
-#: ../../addon/smileybutton/smileybutton.php:273
-#: ../../addon/smileybutton/smileybutton.php:277 ../../addon/xmpp/xmpp.php:53
+#: ../../addon/smileybutton/smileybutton.php:211
+#: ../../addon/smileybutton/smileybutton.php:215
+#: ../../addon/authchoose/authchoose.php:67 ../../addon/xmpp/xmpp.php:53
#: ../../addon/pumpio/pumpio.php:219 ../../addon/pumpio/pumpio.php:223
#: ../../addon/pumpio/pumpio.php:227 ../../addon/pumpio/pumpio.php:231
#: ../../include/dir_fns.php:143 ../../include/dir_fns.php:144
@@ -825,18 +1096,19 @@ msgstr "Nein"
#: ../../Zotlabs/Module/Mitem.php:240 ../../Zotlabs/Module/Mitem.php:241
#: ../../Zotlabs/Module/Events.php:470 ../../Zotlabs/Module/Events.php:471
#: ../../Zotlabs/Module/Removeme.php:63
-#: ../../Zotlabs/Module/Admin/Site.php:239
-#: ../../Zotlabs/Module/Settings/Channel.php:294
+#: ../../Zotlabs/Module/Admin/Site.php:237
+#: ../../Zotlabs/Module/Settings/Channel.php:298
#: ../../Zotlabs/Module/Settings/Display.php:103
-#: ../../Zotlabs/Module/Api.php:96 ../../Zotlabs/Module/Photos.php:642
-#: ../../Zotlabs/Module/Wiki.php:180 ../../Zotlabs/Module/Connedit.php:392
+#: ../../Zotlabs/Module/Api.php:96 ../../Zotlabs/Module/Photos.php:644
+#: ../../Zotlabs/Module/Wiki.php:182 ../../Zotlabs/Module/Connedit.php:392
#: ../../Zotlabs/Module/Menu.php:100 ../../Zotlabs/Module/Menu.php:157
#: ../../Zotlabs/Module/Profiles.php:681
-#: ../../Zotlabs/Module/Filestorage.php:160
-#: ../../Zotlabs/Module/Filestorage.php:168 ../../boot.php:1633
-#: ../../view/theme/redbasic/php/config.php:89
-#: ../../view/theme/redbasic/php/config.php:104 ../../addon/cdav/cdav.php:234
-#: ../../addon/planets/planets.php:153 ../../addon/wppost/wppost.php:82
+#: ../../Zotlabs/Module/Filestorage.php:150
+#: ../../Zotlabs/Module/Filestorage.php:158
+#: ../../Zotlabs/Storage/Browser.php:351 ../../boot.php:1605
+#: ../../view/theme/redbasic/php/config.php:100
+#: ../../view/theme/redbasic/php/config.php:115
+#: ../../addon/planets/planets.php:149 ../../addon/wppost/wppost.php:82
#: ../../addon/wppost/wppost.php:105 ../../addon/wppost/wppost.php:109
#: ../../addon/nsfw/nsfw.php:84 ../../addon/ijpost/ijpost.php:73
#: ../../addon/ijpost/ijpost.php:85 ../../addon/dwpost/dwpost.php:73
@@ -859,8 +1131,9 @@ msgstr "Nein"
#: ../../addon/statusnet/statusnet.php:415
#: ../../addon/statusnet/statusnet.php:424 ../../addon/twitter/twitter.php:242
#: ../../addon/twitter/twitter.php:246 ../../addon/twitter/twitter.php:255
-#: ../../addon/smileybutton/smileybutton.php:273
-#: ../../addon/smileybutton/smileybutton.php:277 ../../addon/xmpp/xmpp.php:53
+#: ../../addon/smileybutton/smileybutton.php:211
+#: ../../addon/smileybutton/smileybutton.php:215
+#: ../../addon/authchoose/authchoose.php:67 ../../addon/xmpp/xmpp.php:53
#: ../../addon/pumpio/pumpio.php:219 ../../addon/pumpio/pumpio.php:223
#: ../../addon/pumpio/pumpio.php:227 ../../addon/pumpio/pumpio.php:231
#: ../../include/dir_fns.php:143 ../../include/dir_fns.php:144
@@ -975,20 +1248,23 @@ msgstr "Termin nicht gefunden."
#: ../../Zotlabs/Module/Events.php:260 ../../Zotlabs/Module/Tagger.php:51
#: ../../Zotlabs/Module/Like.php:372 ../../include/conversation.php:119
-#: ../../include/text.php:1940 ../../include/event.php:1141
+#: ../../include/text.php:1933 ../../include/event.php:1145
msgid "event"
msgstr "Termin"
+#: ../../Zotlabs/Module/Events.php:275 ../../Zotlabs/Lib/Apps.php:243
+#: ../../include/conversation.php:1799 ../../include/conversation.php:1802
+#: ../../include/nav.php:195 ../../include/nav.php:397
+#: ../../include/nav.php:400
+msgid "Events"
+msgstr "Termine"
+
#: ../../Zotlabs/Module/Events.php:460
msgid "Edit event title"
msgstr "Termintitel bearbeiten"
-#: ../../Zotlabs/Module/Events.php:460 ../../addon/cdav/Mod_Cdav.php:835
-msgid "Event title"
-msgstr "Termintitel"
-
#: ../../Zotlabs/Module/Events.php:460 ../../Zotlabs/Module/Events.php:465
-#: ../../Zotlabs/Module/Appman.php:122 ../../Zotlabs/Module/Appman.php:123
+#: ../../Zotlabs/Module/Appman.php:136 ../../Zotlabs/Module/Appman.php:137
#: ../../Zotlabs/Module/Profiles.php:748 ../../Zotlabs/Module/Profiles.php:752
#: ../../include/datetime.php:259
msgid "Required"
@@ -1010,10 +1286,6 @@ msgstr "Kategorie"
msgid "Edit start date and time"
msgstr "Startdatum und -zeit bearbeiten"
-#: ../../Zotlabs/Module/Events.php:466 ../../addon/cdav/Mod_Cdav.php:836
-msgid "Start date and time"
-msgstr "Startdatum und -zeit"
-
#: ../../Zotlabs/Module/Events.php:467 ../../Zotlabs/Module/Events.php:470
msgid "Finish date and time are not known or not relevant"
msgstr "Enddatum und -zeit sind unbekannt oder irrelevant"
@@ -1040,23 +1312,17 @@ msgstr "Wichtig für Veranstaltungen die an bestimmten Orten stattfinden. Nicht
msgid "Edit Description"
msgstr "Beschreibung bearbeiten"
-#: ../../Zotlabs/Module/Events.php:473 ../../Zotlabs/Module/Appman.php:124
-#: ../../Zotlabs/Module/Rbmark.php:101
-#: ../../addon/rendezvous/rendezvous.php:173 ../../addon/cdav/Mod_Cdav.php:838
-msgid "Description"
-msgstr "Beschreibung"
-
#: ../../Zotlabs/Module/Events.php:475
msgid "Edit Location"
msgstr "Ort bearbeiten"
-#: ../../Zotlabs/Module/Events.php:478 ../../Zotlabs/Module/Photos.php:1063
-#: ../../Zotlabs/Module/Webpages.php:252 ../../Zotlabs/Lib/ThreadItem.php:741
-#: ../../include/conversation.php:1280 ../../include/page_widgets.php:43
+#: ../../Zotlabs/Module/Events.php:478 ../../Zotlabs/Module/Photos.php:1065
+#: ../../Zotlabs/Module/Webpages.php:247 ../../Zotlabs/Lib/ThreadItem.php:739
+#: ../../include/conversation.php:1277
msgid "Preview"
msgstr "Vorschau"
-#: ../../Zotlabs/Module/Events.php:479 ../../include/conversation.php:1343
+#: ../../Zotlabs/Module/Events.php:479 ../../include/conversation.php:1340
msgid "Permission settings"
msgstr "Berechtigungs-Einstellungen"
@@ -1081,7 +1347,7 @@ msgid "Delete event"
msgstr "Termin löschen"
#: ../../Zotlabs/Module/Events.php:660 ../../Zotlabs/Module/Cal.php:313
-#: ../../include/text.php:1759
+#: ../../include/text.php:1752
msgid "Link to Source"
msgstr "Link zur Quelle"
@@ -1097,41 +1363,11 @@ msgstr "Termin bearbeiten"
msgid "Create Event"
msgstr "Termin anlegen"
-#: ../../Zotlabs/Module/Events.php:689 ../../Zotlabs/Module/Events.php:698
-#: ../../Zotlabs/Module/Cal.php:337 ../../Zotlabs/Module/Cal.php:344
-#: ../../Zotlabs/Module/Photos.php:911 ../../addon/cdav/Mod_Cdav.php:846
-msgid "Previous"
-msgstr "Voriges"
-
-#: ../../Zotlabs/Module/Events.php:690 ../../Zotlabs/Module/Events.php:699
-#: ../../Zotlabs/Module/Setup.php:264 ../../Zotlabs/Module/Cal.php:338
-#: ../../Zotlabs/Module/Cal.php:345 ../../Zotlabs/Module/Photos.php:920
-#: ../../addon/cdav/Mod_Cdav.php:847
-msgid "Next"
-msgstr "Nächste"
-
#: ../../Zotlabs/Module/Events.php:691 ../../Zotlabs/Module/Cal.php:339
-#: ../../include/channel.php:1365
+#: ../../include/channel.php:1488
msgid "Export"
msgstr "Exportieren"
-#: ../../Zotlabs/Module/Events.php:695 ../../addon/cdav/Mod_Cdav.php:849
-msgid "Month"
-msgstr "Monat"
-
-#: ../../Zotlabs/Module/Events.php:696 ../../addon/cdav/Mod_Cdav.php:850
-msgid "Week"
-msgstr "Woche"
-
-#: ../../Zotlabs/Module/Events.php:697 ../../addon/cdav/Mod_Cdav.php:851
-msgid "Day"
-msgstr "Tag"
-
-#: ../../Zotlabs/Module/Events.php:700 ../../Zotlabs/Module/Cal.php:346
-#: ../../addon/cdav/Mod_Cdav.php:848
-msgid "Today"
-msgstr "Heute"
-
#: ../../Zotlabs/Module/Events.php:731
msgid "Event removed"
msgstr "Termin gelöscht"
@@ -1148,47 +1384,47 @@ msgstr "App installiert."
msgid "Malformed app."
msgstr "Fehlerhafte App."
-#: ../../Zotlabs/Module/Appman.php:111
+#: ../../Zotlabs/Module/Appman.php:125
msgid "Embed code"
msgstr "Code einbetten"
-#: ../../Zotlabs/Module/Appman.php:117
+#: ../../Zotlabs/Module/Appman.php:131
msgid "Edit App"
msgstr "App bearbeiten"
-#: ../../Zotlabs/Module/Appman.php:117
+#: ../../Zotlabs/Module/Appman.php:131
msgid "Create App"
msgstr "App erstellen"
-#: ../../Zotlabs/Module/Appman.php:122
+#: ../../Zotlabs/Module/Appman.php:136
msgid "Name of app"
msgstr "Name der App"
-#: ../../Zotlabs/Module/Appman.php:123
+#: ../../Zotlabs/Module/Appman.php:137
msgid "Location (URL) of app"
msgstr "Ort (URL) der App"
-#: ../../Zotlabs/Module/Appman.php:125
+#: ../../Zotlabs/Module/Appman.php:139
msgid "Photo icon URL"
msgstr "URL zum Icon"
-#: ../../Zotlabs/Module/Appman.php:125
+#: ../../Zotlabs/Module/Appman.php:139
msgid "80 x 80 pixels - optional"
msgstr "80 x 80 Pixel – optional"
-#: ../../Zotlabs/Module/Appman.php:126
+#: ../../Zotlabs/Module/Appman.php:140
msgid "Categories (optional, comma separated list)"
msgstr "Kategorien (optional, kommagetrennte Liste)"
-#: ../../Zotlabs/Module/Appman.php:127
+#: ../../Zotlabs/Module/Appman.php:141
msgid "Version ID"
msgstr "Versions-ID"
-#: ../../Zotlabs/Module/Appman.php:128
+#: ../../Zotlabs/Module/Appman.php:142
msgid "Price of app"
msgstr "Preis der App"
-#: ../../Zotlabs/Module/Appman.php:129
+#: ../../Zotlabs/Module/Appman.php:143
msgid "Location (URL) to purchase app"
msgstr "Ort (URL), um die App zu kaufen"
@@ -1203,14 +1439,14 @@ msgstr "Server nicht gefunden."
#: ../../Zotlabs/Module/Subthread.php:87 ../../Zotlabs/Module/Tagger.php:47
#: ../../Zotlabs/Module/Like.php:370
#: ../../addon/redphotos/redphotohelper.php:71
-#: ../../addon/diaspora/inbound.php:1783 ../../include/conversation.php:116
-#: ../../include/text.php:1937
+#: ../../addon/diaspora/Receiver.php:1370 ../../include/conversation.php:116
+#: ../../include/text.php:1930
msgid "photo"
msgstr "Foto"
#: ../../Zotlabs/Module/Subthread.php:87 ../../Zotlabs/Module/Like.php:370
-#: ../../addon/diaspora/inbound.php:1783 ../../include/conversation.php:144
-#: ../../include/text.php:1943
+#: ../../addon/diaspora/Receiver.php:1370 ../../include/conversation.php:144
+#: ../../include/text.php:1936
msgid "status"
msgstr "Status"
@@ -1258,12 +1494,12 @@ msgid ""
msgstr "Mit diesem Formular kannst Du existierende Beiträge und Inhalte aus einer Sicherungsdatei importieren."
#: ../../Zotlabs/Module/Import_items.php:127
-#: ../../Zotlabs/Module/Import.php:501
+#: ../../Zotlabs/Module/Import.php:505
msgid "File to Upload"
msgstr "Hochzuladende Datei:"
#: ../../Zotlabs/Module/New_channel.php:121
-#: ../../Zotlabs/Module/Manage.php:136
+#: ../../Zotlabs/Module/Manage.php:138
#, php-format
msgid "You have created %1$.0f of %2$.0f allowed channels."
msgstr "Du hast %1$.0f von maximal %2$.0f erlaubten Kanälen eingerichtet."
@@ -1362,456 +1598,435 @@ msgid ""
msgstr "Standardmäßig wird der Kanal nur auf diesem Server gelöscht, seine Klone verbleiben im Netzwerk"
#: ../../Zotlabs/Module/Removeme.php:64
-#: ../../Zotlabs/Module/Settings/Channel.php:575
+#: ../../Zotlabs/Module/Settings/Channel.php:580
msgid "Remove Channel"
msgstr "Kanal löschen"
-#: ../../Zotlabs/Module/Sharedwithme.php:99
+#: ../../Zotlabs/Module/Sharedwithme.php:104
msgid "Files: shared with me"
msgstr "Dateien, die mit mir geteilt wurden"
-#: ../../Zotlabs/Module/Sharedwithme.php:100
-#: ../../Zotlabs/Module/Admin/Channels.php:159
-#: ../../Zotlabs/Module/Settings/Oauth.php:89
-#: ../../Zotlabs/Module/Settings/Oauth.php:115
-#: ../../Zotlabs/Module/Wiki.php:172 ../../Zotlabs/Module/Connedit.php:902
-#: ../../Zotlabs/Module/Chat.php:249 ../../Zotlabs/Lib/NativeWikiPage.php:539
-#: ../../Zotlabs/Storage/Browser.php:233
-#: ../../Zotlabs/Widget/Wiki_page_history.php:22
-#: ../../addon/rendezvous/rendezvous.php:172
-#: ../../addon/cdav/Mod_Cdav.php:1136 ../../addon/gitwiki/Mod_Gitwiki.php:158
-msgid "Name"
-msgstr "Name"
-
-#: ../../Zotlabs/Module/Sharedwithme.php:101
+#: ../../Zotlabs/Module/Sharedwithme.php:106
msgid "NEW"
msgstr "NEU"
-#: ../../Zotlabs/Module/Sharedwithme.php:102
-#: ../../Zotlabs/Storage/Browser.php:235 ../../include/text.php:1409
+#: ../../Zotlabs/Module/Sharedwithme.php:107
+#: ../../Zotlabs/Storage/Browser.php:236 ../../include/text.php:1386
msgid "Size"
msgstr "Größe"
-#: ../../Zotlabs/Module/Sharedwithme.php:103
-#: ../../Zotlabs/Storage/Browser.php:236
+#: ../../Zotlabs/Module/Sharedwithme.php:108
+#: ../../Zotlabs/Storage/Browser.php:237
msgid "Last Modified"
msgstr "Zuletzt geändert"
-#: ../../Zotlabs/Module/Sharedwithme.php:104
+#: ../../Zotlabs/Module/Sharedwithme.php:109
msgid "Remove all files"
msgstr "Alle Dateien löschen"
-#: ../../Zotlabs/Module/Sharedwithme.php:105
+#: ../../Zotlabs/Module/Sharedwithme.php:110
msgid "Remove this file"
msgstr "Diese Datei löschen"
-#: ../../Zotlabs/Module/Setup.php:176
+#: ../../Zotlabs/Module/Setup.php:170
msgid "$Projectname Server - Setup"
msgstr "$Projectname Server-Einrichtung"
-#: ../../Zotlabs/Module/Setup.php:180
+#: ../../Zotlabs/Module/Setup.php:174
msgid "Could not connect to database."
msgstr "Kann nicht mit der Datenbank verbinden."
-#: ../../Zotlabs/Module/Setup.php:184
+#: ../../Zotlabs/Module/Setup.php:178
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."
-#: ../../Zotlabs/Module/Setup.php:191
+#: ../../Zotlabs/Module/Setup.php:185
msgid "Could not create table."
msgstr "Konnte Tabelle nicht erstellen."
-#: ../../Zotlabs/Module/Setup.php:196
+#: ../../Zotlabs/Module/Setup.php:191
msgid "Your site database has been installed."
msgstr "Die Datenbank Deines Hubs wurde installiert."
-#: ../../Zotlabs/Module/Setup.php:200
+#: ../../Zotlabs/Module/Setup.php:197
msgid ""
"You may need to import the file \"install/schema_xxx.sql\" manually using a "
"database client."
msgstr "Möglicherweise musst Du die Datei install/schema_xxx.sql manuell mit Hilfe eines Datenkbank-Clients importieren."
-#: ../../Zotlabs/Module/Setup.php:201 ../../Zotlabs/Module/Setup.php:263
-#: ../../Zotlabs/Module/Setup.php:748
+#: ../../Zotlabs/Module/Setup.php:198 ../../Zotlabs/Module/Setup.php:262
+#: ../../Zotlabs/Module/Setup.php:745
msgid "Please see the file \"install/INSTALL.txt\"."
msgstr "Lies die Datei \"install/INSTALL.txt\"."
-#: ../../Zotlabs/Module/Setup.php:260
+#: ../../Zotlabs/Module/Setup.php:259
msgid "System check"
msgstr "Systemprüfung"
-#: ../../Zotlabs/Module/Setup.php:265
+#: ../../Zotlabs/Module/Setup.php:264
msgid "Check again"
msgstr "Nochmal prüfen"
-#: ../../Zotlabs/Module/Setup.php:287
+#: ../../Zotlabs/Module/Setup.php:286
msgid "Database connection"
msgstr "Datenbankverbindung"
-#: ../../Zotlabs/Module/Setup.php:288
+#: ../../Zotlabs/Module/Setup.php:287
msgid ""
"In order to install $Projectname we need to know how to connect to your "
"database."
msgstr "Um $Projectname zu installieren, müssen wir wissen, wie wir eine Verbindung zu Deiner Datenbank aufbauen können."
-#: ../../Zotlabs/Module/Setup.php:289
+#: ../../Zotlabs/Module/Setup.php:288
msgid ""
"Please contact your hosting provider or site administrator if you have "
"questions about these settings."
msgstr "Bitte kontaktiere Deinen Hosting-Provider oder Administrator, falls Du Fragen zu diesen Einstellungen hast."
-#: ../../Zotlabs/Module/Setup.php:290
+#: ../../Zotlabs/Module/Setup.php:289
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."
-#: ../../Zotlabs/Module/Setup.php:294
+#: ../../Zotlabs/Module/Setup.php:293
msgid "Database Server Name"
msgstr "Datenbankservername"
-#: ../../Zotlabs/Module/Setup.php:294
+#: ../../Zotlabs/Module/Setup.php:293
msgid "Default is 127.0.0.1"
msgstr "Standard ist 127.0.0.1"
-#: ../../Zotlabs/Module/Setup.php:295
+#: ../../Zotlabs/Module/Setup.php:294
msgid "Database Port"
msgstr "Datenbankport"
-#: ../../Zotlabs/Module/Setup.php:295
+#: ../../Zotlabs/Module/Setup.php:294
msgid "Communication port number - use 0 for default"
msgstr "Port-Nummer für die Kommunikation – verwende 0 für die Standardeinstellung"
-#: ../../Zotlabs/Module/Setup.php:296
+#: ../../Zotlabs/Module/Setup.php:295
msgid "Database Login Name"
msgstr "Datenbank-Benutzername"
-#: ../../Zotlabs/Module/Setup.php:297
+#: ../../Zotlabs/Module/Setup.php:296
msgid "Database Login Password"
msgstr "Datenbank-Passwort"
-#: ../../Zotlabs/Module/Setup.php:298
+#: ../../Zotlabs/Module/Setup.php:297
msgid "Database Name"
msgstr "Datenbankname"
-#: ../../Zotlabs/Module/Setup.php:299
+#: ../../Zotlabs/Module/Setup.php:298
msgid "Database Type"
msgstr "Datenbanktyp"
-#: ../../Zotlabs/Module/Setup.php:301 ../../Zotlabs/Module/Setup.php:347
+#: ../../Zotlabs/Module/Setup.php:300 ../../Zotlabs/Module/Setup.php:341
msgid "Site administrator email address"
msgstr "E-Mail Adresse des Seiten-Administrators"
-#: ../../Zotlabs/Module/Setup.php:301 ../../Zotlabs/Module/Setup.php:347
+#: ../../Zotlabs/Module/Setup.php:300 ../../Zotlabs/Module/Setup.php:341
msgid ""
"Your account email address must match this in order to use the web admin "
"panel."
msgstr "Die E-Mail-Adresse Deines Accounts muss dieser Adresse entsprechen, damit Du Zugriff zur Administrations-Seite erhältst."
-#: ../../Zotlabs/Module/Setup.php:302 ../../Zotlabs/Module/Setup.php:349
+#: ../../Zotlabs/Module/Setup.php:301 ../../Zotlabs/Module/Setup.php:343
msgid "Website URL"
msgstr "Webseiten-URL"
-#: ../../Zotlabs/Module/Setup.php:302 ../../Zotlabs/Module/Setup.php:349
+#: ../../Zotlabs/Module/Setup.php:301 ../../Zotlabs/Module/Setup.php:343
msgid "Please use SSL (https) URL if available."
msgstr "Nutze wenn möglich eine SSL-URL (https)."
-#: ../../Zotlabs/Module/Setup.php:303 ../../Zotlabs/Module/Setup.php:353
+#: ../../Zotlabs/Module/Setup.php:302 ../../Zotlabs/Module/Setup.php:345
msgid "Please select a default timezone for your website"
msgstr "Standard-Zeitzone für Deinen Server"
-#: ../../Zotlabs/Module/Setup.php:328 ../../Zotlabs/Module/Admin/Site.php:258
-msgid "Basic/Minimal Social Networking"
-msgstr "Einfaches/minimales soziales Netzwerken"
-
-#: ../../Zotlabs/Module/Setup.php:329 ../../Zotlabs/Module/Admin/Site.php:259
-msgid "Standard Configuration (default)"
-msgstr "Standardkonfiguration (Standard)"
-
-#: ../../Zotlabs/Module/Setup.php:330 ../../Zotlabs/Module/Admin/Site.php:260
-msgid "Professional"
-msgstr "Professionell"
-
-#: ../../Zotlabs/Module/Setup.php:336
+#: ../../Zotlabs/Module/Setup.php:330
msgid "Site settings"
msgstr "Seiteneinstellungen"
-#: ../../Zotlabs/Module/Setup.php:351 ../../Zotlabs/Module/Admin/Site.php:289
-msgid "Server Configuration/Role"
-msgstr "Serverkonfiguration/Rolle"
-
-#: ../../Zotlabs/Module/Setup.php:392
+#: ../../Zotlabs/Module/Setup.php:384
msgid "PHP version 5.5 or greater is required."
msgstr "PHP-Version 5.5 oder höher ist erforderlich."
-#: ../../Zotlabs/Module/Setup.php:393
+#: ../../Zotlabs/Module/Setup.php:385
msgid "PHP version"
msgstr "PHP-Version"
-#: ../../Zotlabs/Module/Setup.php:409
+#: ../../Zotlabs/Module/Setup.php:401
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 Web-Servers finden."
-#: ../../Zotlabs/Module/Setup.php:410
+#: ../../Zotlabs/Module/Setup.php:402
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 "Ohne Kommandozeilen-Version von PHP auf dem Server wirst Du nicht in der Lage sein, Hintergrundprozesse via cron auszuführen."
-#: ../../Zotlabs/Module/Setup.php:414
+#: ../../Zotlabs/Module/Setup.php:406
msgid "PHP executable path"
msgstr "PHP-Pfad zu ausführbarer Datei"
-#: ../../Zotlabs/Module/Setup.php:414
+#: ../../Zotlabs/Module/Setup.php:406
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 Feld frei lassen und mit der Installation fortfahren."
-#: ../../Zotlabs/Module/Setup.php:419
+#: ../../Zotlabs/Module/Setup.php:411
msgid "Command line PHP"
msgstr "PHP-Befehlszeile"
-#: ../../Zotlabs/Module/Setup.php:429
+#: ../../Zotlabs/Module/Setup.php:421
msgid ""
"Unable to check command line PHP, as shell_exec() is disabled. This is "
"required."
msgstr "Prüfung auf Kommandozeilen-PHP fehlgeschlagen, da shell_exec() deaktiviert ist. Dies wird aber benötigt."
-#: ../../Zotlabs/Module/Setup.php:432
+#: ../../Zotlabs/Module/Setup.php:424
msgid ""
"The command line version of PHP on your system does not have "
"\"register_argc_argv\" enabled."
msgstr "Bei der Kommandozeilen-Version von PHP auf Deinem System ist \"register_argc_argv\" nicht aktiviert."
-#: ../../Zotlabs/Module/Setup.php:433
+#: ../../Zotlabs/Module/Setup.php:425
msgid "This is required for message delivery to work."
msgstr "Das wird benötigt, damit die Auslieferung von Nachrichten funktioniert."
-#: ../../Zotlabs/Module/Setup.php:436
+#: ../../Zotlabs/Module/Setup.php:428
msgid "PHP register_argc_argv"
msgstr "PHP register_argc_argv"
-#: ../../Zotlabs/Module/Setup.php:454
+#: ../../Zotlabs/Module/Setup.php:446
#, php-format
msgid ""
"Your max allowed total upload size is set to %s. Maximum size of one file to"
" upload is set to %s. You are allowed to upload up to %d files at once."
msgstr "Die Maximalgröße für Uploads insgesamt liegt bei %s. Die Maximalgröße für eine Datei liegt bei %s. Es können maximal %d Dateien gleichzeitig hochgeladen werden."
-#: ../../Zotlabs/Module/Setup.php:459
+#: ../../Zotlabs/Module/Setup.php:451
msgid "You can adjust these settings in the server php.ini file."
msgstr "Du kannst diese Einstellungen in der php.ini - Datei des Servers anpassen."
-#: ../../Zotlabs/Module/Setup.php:461
+#: ../../Zotlabs/Module/Setup.php:453
msgid "PHP upload limits"
msgstr "PHP-Hochladebeschränkungen"
-#: ../../Zotlabs/Module/Setup.php:484
+#: ../../Zotlabs/Module/Setup.php:476
msgid ""
"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."
-#: ../../Zotlabs/Module/Setup.php:485
+#: ../../Zotlabs/Module/Setup.php:477
msgid ""
"If running under Windows, please see "
"\"http://www.php.net/manual/en/openssl.installation.php\"."
msgstr "Wenn Du Windows verwendest, findest Du unter http://www.php.net/manual/en/openssl.installation.php eine Installationsanleitung."
-#: ../../Zotlabs/Module/Setup.php:488
+#: ../../Zotlabs/Module/Setup.php:480
msgid "Generate encryption keys"
msgstr "Verschlüsselungsschlüssel erzeugen"
-#: ../../Zotlabs/Module/Setup.php:505
+#: ../../Zotlabs/Module/Setup.php:497
msgid "libCurl PHP module"
msgstr "libCurl-PHP-Modul"
-#: ../../Zotlabs/Module/Setup.php:506
+#: ../../Zotlabs/Module/Setup.php:498
msgid "GD graphics PHP module"
msgstr "GD-Grafik-PHP-Modul"
-#: ../../Zotlabs/Module/Setup.php:507
+#: ../../Zotlabs/Module/Setup.php:499
msgid "OpenSSL PHP module"
msgstr "OpenSSL-PHP-Modul"
-#: ../../Zotlabs/Module/Setup.php:508
+#: ../../Zotlabs/Module/Setup.php:500
msgid "PDO database PHP module"
msgstr "PDO-Datenbank-PHP-Modul"
-#: ../../Zotlabs/Module/Setup.php:509
+#: ../../Zotlabs/Module/Setup.php:501
msgid "mb_string PHP module"
msgstr "mb_string-PHP-Modul"
-#: ../../Zotlabs/Module/Setup.php:510
+#: ../../Zotlabs/Module/Setup.php:502
msgid "xml PHP module"
msgstr "xml-PHP-Modul"
-#: ../../Zotlabs/Module/Setup.php:514 ../../Zotlabs/Module/Setup.php:516
+#: ../../Zotlabs/Module/Setup.php:503
+msgid "zip PHP module"
+msgstr "zip PHP Modul"
+
+#: ../../Zotlabs/Module/Setup.php:507 ../../Zotlabs/Module/Setup.php:509
msgid "Apache mod_rewrite module"
msgstr "Apache-mod_rewrite-Modul"
-#: ../../Zotlabs/Module/Setup.php:514
+#: ../../Zotlabs/Module/Setup.php:507
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."
-#: ../../Zotlabs/Module/Setup.php:520 ../../Zotlabs/Module/Setup.php:523
+#: ../../Zotlabs/Module/Setup.php:513 ../../Zotlabs/Module/Setup.php:516
msgid "exec"
msgstr "exec"
-#: ../../Zotlabs/Module/Setup.php:520
+#: ../../Zotlabs/Module/Setup.php:513
msgid ""
"Error: exec is required but is either not installed or has been disabled in "
"php.ini"
msgstr "Fehler: exec ist erforderlich, aber entweder nicht installiert oder wurde in der php.ini deaktiviert"
-#: ../../Zotlabs/Module/Setup.php:526 ../../Zotlabs/Module/Setup.php:529
+#: ../../Zotlabs/Module/Setup.php:519 ../../Zotlabs/Module/Setup.php:522
msgid "shell_exec"
msgstr "shell_exec"
-#: ../../Zotlabs/Module/Setup.php:526
+#: ../../Zotlabs/Module/Setup.php:519
msgid ""
"Error: shell_exec is required but is either not installed or has been "
"disabled in php.ini"
msgstr "Fehler: shell_exec ist erforderlich, aber entweder nicht installiert oder wurde in der php.ini deaktiviert"
-#: ../../Zotlabs/Module/Setup.php:534
+#: ../../Zotlabs/Module/Setup.php:527
msgid "Error: libCURL PHP module required but not installed."
msgstr "Fehler: Das PHP-Modul libCURL wird benötigt, ist aber nicht installiert."
-#: ../../Zotlabs/Module/Setup.php:538
+#: ../../Zotlabs/Module/Setup.php:531
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."
-#: ../../Zotlabs/Module/Setup.php:542
+#: ../../Zotlabs/Module/Setup.php:535
msgid "Error: openssl PHP module required but not installed."
msgstr "Fehler: Das PHP-Modul openssl wird benötigt, ist aber nicht installiert."
-#: ../../Zotlabs/Module/Setup.php:546
+#: ../../Zotlabs/Module/Setup.php:539
msgid "Error: PDO database PHP module required but not installed."
msgstr "Fehler: PDO-Datenbank-PHP-Modul ist erforderlich, aber nicht installiert."
-#: ../../Zotlabs/Module/Setup.php:550
+#: ../../Zotlabs/Module/Setup.php:543
msgid "Error: mb_string PHP module required but not installed."
msgstr "Fehler: Das PHP-Modul mb_string wird benötigt, ist aber nicht installiert."
-#: ../../Zotlabs/Module/Setup.php:554
+#: ../../Zotlabs/Module/Setup.php:547
msgid "Error: xml PHP module required for DAV but not installed."
msgstr "Fehler: Das xml-PHP-Modul wird für DAV benötigt, ist aber nicht installiert."
-#: ../../Zotlabs/Module/Setup.php:572
+#: ../../Zotlabs/Module/Setup.php:551
+msgid "Error: zip PHP module required but not installed."
+msgstr "Fehler: Das zip PHP Modul ist erforderlich, ist aber nicht installiert."
+
+#: ../../Zotlabs/Module/Setup.php:569
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 Installations-Assistent muss in der Lage sein, die Datei \".htconfig.php\" im Stammverzeichnis des Web-Servers anzulegen, ist er aber nicht."
-#: ../../Zotlabs/Module/Setup.php:573
+#: ../../Zotlabs/Module/Setup.php:570
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 "Meist liegt das daran, dass der Nutzer, unter dem der Web-Server läuft, keine Schreibrechte in dem Verzeichnis hat – selbst wenn Du selbst das darfst."
-#: ../../Zotlabs/Module/Setup.php:574
+#: ../../Zotlabs/Module/Setup.php:571
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 "Am Schluss dieses Vorgangs wird ein Text generiert, den Du unter dem Dateinamen .htconfig.php im Stammverzeichnis Deiner Hubzilla-Installation speichern musst."
-#: ../../Zotlabs/Module/Setup.php:575
+#: ../../Zotlabs/Module/Setup.php:572
msgid ""
"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."
-#: ../../Zotlabs/Module/Setup.php:578
+#: ../../Zotlabs/Module/Setup.php:575
msgid ".htconfig.php is writable"
msgstr ".htconfig.php ist beschreibbar"
-#: ../../Zotlabs/Module/Setup.php:592
+#: ../../Zotlabs/Module/Setup.php:589
msgid ""
"This software uses the Smarty3 template engine to render its web views. "
"Smarty3 compiles templates to PHP to speed up rendering."
msgstr "Diese Software verwendet die Smarty3 Template Engine, um Vorlagen für die Webdarstellung zu verarbeiten. Smarty3 übersetzt diese Vorlagen nach PHP, um die Darstellung zu beschleunigen."
-#: ../../Zotlabs/Module/Setup.php:593
+#: ../../Zotlabs/Module/Setup.php:590
#, php-format
msgid ""
"In order to store these compiled templates, the web server needs to have "
"write access to the directory %s under the top level web folder."
msgstr "Um diese kompilierten Vorlagen speichern zu können, braucht der Web-Server Schreibzugriff auf das Verzeichnis %s unterhalb des Hubzilla-Stammverzeichnisses."
-#: ../../Zotlabs/Module/Setup.php:594 ../../Zotlabs/Module/Setup.php:615
+#: ../../Zotlabs/Module/Setup.php:591 ../../Zotlabs/Module/Setup.php:612
msgid ""
"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 Web-Server läuft (z.B. www-data), Schreibzugriff auf dieses Verzeichnis hat."
-#: ../../Zotlabs/Module/Setup.php:595
+#: ../../Zotlabs/Module/Setup.php:592
#, php-format
msgid ""
"Note: as a security measure, you should give the web server write access to "
"%s only--not the template files (.tpl) that it contains."
msgstr "Hinweis: Aus Sicherheitsgründen sollte der Web-Server nur auf %s Schreibrechte haben, nicht auf die Template-Dateien (.tpl), die das Verzeichnis enthält."
-#: ../../Zotlabs/Module/Setup.php:598
+#: ../../Zotlabs/Module/Setup.php:595
#, php-format
msgid "%s is writable"
msgstr "%s ist beschreibbar"
-#: ../../Zotlabs/Module/Setup.php:614
+#: ../../Zotlabs/Module/Setup.php:611
msgid ""
"This software uses the store directory to save uploaded files. The web "
"server needs to have write access to the store directory under the top level"
" web folder"
msgstr "Diese Software benutzt das Verzeichnis store, um hochgeladene Dateien zu speichern. Der Webserver benötigt Schreibrechte für dieses Verzeichnis direkt unterhalb des Web-Stammverzeichnisses."
-#: ../../Zotlabs/Module/Setup.php:618
+#: ../../Zotlabs/Module/Setup.php:615
msgid "store is writable"
msgstr "store ist schreibbar"
-#: ../../Zotlabs/Module/Setup.php:650
+#: ../../Zotlabs/Module/Setup.php:647
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 deaktiviere den HTTPS-Zugriff auf diesen Server."
-#: ../../Zotlabs/Module/Setup.php:651
+#: ../../Zotlabs/Module/Setup.php:648
msgid ""
"If you have https access to your website or allow connections to TCP port "
"443 (the https: port), you MUST use a browser-valid certificate. You MUST "
"NOT use self-signed certificates!"
msgstr "Wenn Du via HTTPS auf Deinen Server zugreifen möchtest, also Verbindungen über den Port 443 möglich sein sollen, ist ein SSL-Zertifikat einer Zertifizierungsstelle (CA) notwendig, das von den Browsern ohne Sicherheitsabfrage akzeptiert wird. Die Verwendung eines selbst signierten Zertifikates ist nicht möglich."
-#: ../../Zotlabs/Module/Setup.php:652
+#: ../../Zotlabs/Module/Setup.php:649
msgid ""
"This restriction is incorporated because public posts from you may for "
"example contain references to images on your own hub."
msgstr "Diese Einschränkung wurde eingebaut, weil Deine öffentlichen Beiträge zum Beispiel Verweise auf Bilder auf Deinem eigenen Hub enthalten können."
-#: ../../Zotlabs/Module/Setup.php:653
+#: ../../Zotlabs/Module/Setup.php:650
msgid ""
"If your certificate is not recognized, members of other sites (who may "
"themselves have valid certificates) will get a warning message on their own "
"site complaining about security issues."
msgstr "Wenn Dein Zertifikat nicht von jedem Browser akzeptiert wird, erhalten die Mitglieder anderer $Projectname-Hubs (die mit korrekten Zertifikaten ausgestattet sind) Sicherheits-Warnmeldungen, obwohl sie gar nicht direkt auf Deinem Server unterwegs sind (zum Beispiel, wenn ein Bild aus einem Deiner Beiträge angezeigt wird)."
-#: ../../Zotlabs/Module/Setup.php:654
+#: ../../Zotlabs/Module/Setup.php:651
msgid ""
"This can cause usability issues elsewhere (not just on your own site) so we "
"must insist on this requirement."
msgstr "Dies kann Probleme für andere Nutzer (nicht nur auf Deinem eigenen Server) verursachen, so dass wir auf dieser Forderung bestehen müssen."
-#: ../../Zotlabs/Module/Setup.php:655
+#: ../../Zotlabs/Module/Setup.php:652
msgid ""
"Providers are available that issue free certificates which are browser-"
"valid."
msgstr "Es gibt einige Zertifizierungsstellen (CAs), bei denen solche Zertifikate kostenlos zu haben sind."
-#: ../../Zotlabs/Module/Setup.php:657
+#: ../../Zotlabs/Module/Setup.php:654
msgid ""
"If you are confident that the certificate is valid and signed by a trusted "
"authority, check to see if you have failed to install an intermediate cert. "
@@ -1819,37 +2034,37 @@ msgid ""
"server communications."
msgstr "Wenn Du sicher bist, dass das Zertifikat gültig und von einer vertrauenswürdigen Zertifizierungsstelle signiert ist, prüfe auf ggf. noch zu installierende Zwischenzertifikate (intermediate). Diese werden nicht unbedingt von Browsern benötigt, aber sehr wohl für die Kommunikation zwischen Servern."
-#: ../../Zotlabs/Module/Setup.php:659
+#: ../../Zotlabs/Module/Setup.php:656
msgid "SSL certificate validation"
msgstr "SSL Zertifikatverifizierung"
-#: ../../Zotlabs/Module/Setup.php:665
+#: ../../Zotlabs/Module/Setup.php:662
msgid ""
"Url rewrite in .htaccess is not working. Check your server "
"configuration.Test: "
msgstr "Das Umschreiben von URLs (rewrite) per .htaccess funktioniert nicht. Bitte prüfe die Server-Konfiguration. Test:"
-#: ../../Zotlabs/Module/Setup.php:668
+#: ../../Zotlabs/Module/Setup.php:665
msgid "Url rewrite is working"
msgstr "Url rewrite funktioniert"
-#: ../../Zotlabs/Module/Setup.php:682
+#: ../../Zotlabs/Module/Setup.php:679
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."
-#: ../../Zotlabs/Module/Setup.php:706
-#: ../../addon/rendezvous/rendezvous.php:401 ../../addon/cdav/cdav.php:41
+#: ../../Zotlabs/Module/Setup.php:703
+#: ../../addon/rendezvous/rendezvous.php:401
msgid "Errors encountered creating database tables."
msgstr "Fehler beim Anlegen der Datenbank-Tabellen aufgetreten."
-#: ../../Zotlabs/Module/Setup.php:746
-msgid "<h1>What next</h1>"
-msgstr "<h1>Was als Nächstes</h1>"
+#: ../../Zotlabs/Module/Setup.php:743
+msgid "<h1>What next?</h1>"
+msgstr "<h1>Wie geht es jetzt weiter?</h1>"
-#: ../../Zotlabs/Module/Setup.php:747
+#: ../../Zotlabs/Module/Setup.php:744
msgid ""
"IMPORTANT: You will need to [manually] setup a scheduled task for the "
"poller."
@@ -1990,8 +2205,8 @@ msgstr "Versuche, diesen Updateschritt automatisch auszuführen"
#: ../../Zotlabs/Module/Admin/Plugins.php:259
#: ../../Zotlabs/Module/Admin/Themes.php:72 ../../Zotlabs/Module/Thing.php:89
#: ../../Zotlabs/Module/Viewsrc.php:25 ../../Zotlabs/Module/Display.php:35
-#: ../../Zotlabs/Module/Filestorage.php:32 ../../Zotlabs/Module/Admin.php:60
-#: ../../include/items.php:3391
+#: ../../Zotlabs/Module/Filestorage.php:24 ../../Zotlabs/Module/Admin.php:62
+#: ../../include/items.php:3361
msgid "Item not found."
msgstr "Element nicht gefunden."
@@ -2022,9 +2237,9 @@ msgstr "Aktivieren"
#: ../../Zotlabs/Module/Admin/Channels.php:145
#: ../../Zotlabs/Module/Admin/Themes.php:122
#: ../../Zotlabs/Module/Admin/Themes.php:156
-#: ../../Zotlabs/Module/Admin/Site.php:277
+#: ../../Zotlabs/Module/Admin/Site.php:269
#: ../../Zotlabs/Module/Admin/Security.php:86
-#: ../../Zotlabs/Module/Admin.php:137
+#: ../../Zotlabs/Module/Admin.php:136
msgid "Administration"
msgstr "Administration"
@@ -2040,8 +2255,8 @@ msgid "Toggle"
msgstr "Umschalten"
#: ../../Zotlabs/Module/Admin/Plugins.php:344
-#: ../../Zotlabs/Module/Admin/Themes.php:125 ../../Zotlabs/Lib/Apps.php:223
-#: ../../Zotlabs/Widget/Settings_menu.php:131 ../../include/nav.php:207
+#: ../../Zotlabs/Module/Admin/Themes.php:125 ../../Zotlabs/Lib/Apps.php:236
+#: ../../Zotlabs/Widget/Settings_menu.php:133 ../../include/nav.php:201
msgid "Settings"
msgstr "Einstellungen"
@@ -2104,25 +2319,10 @@ msgstr "Plugin-Repository herunterladen"
msgid "Install new repo"
msgstr "Neues Repository installieren"
-#: ../../Zotlabs/Module/Admin/Plugins.php:422 ../../Zotlabs/Lib/Apps.php:358
+#: ../../Zotlabs/Module/Admin/Plugins.php:422 ../../Zotlabs/Lib/Apps.php:384
msgid "Install"
msgstr "Installieren"
-#: ../../Zotlabs/Module/Admin/Plugins.php:423
-#: ../../Zotlabs/Module/Settings/Oauth.php:88
-#: ../../Zotlabs/Module/Settings/Oauth.php:114
-#: ../../Zotlabs/Module/Wiki.php:265 ../../Zotlabs/Module/Wiki.php:290
-#: ../../Zotlabs/Module/Connedit.php:920 ../../Zotlabs/Module/Fbrowser.php:66
-#: ../../Zotlabs/Module/Fbrowser.php:88 ../../Zotlabs/Module/Profiles.php:804
-#: ../../Zotlabs/Module/Filer.php:55 ../../Zotlabs/Module/Tagrm.php:15
-#: ../../Zotlabs/Module/Tagrm.php:138 ../../addon/cdav/Mod_Cdav.php:866
-#: ../../addon/cdav/Mod_Cdav.php:1154 ../../addon/js_upload/js_upload.php:46
-#: ../../addon/gitwiki/Mod_Gitwiki.php:244
-#: ../../addon/gitwiki/Mod_Gitwiki.php:267 ../../include/conversation.php:1327
-#: ../../include/conversation.php:1376
-msgid "Cancel"
-msgstr "Abbrechen"
-
#: ../../Zotlabs/Module/Admin/Plugins.php:445
msgid "Manage Repos"
msgstr "Repositorien verwalten"
@@ -2135,20 +2335,12 @@ msgstr "Installierte Plugin-Repositorien"
msgid "Install a New Plugin Repository"
msgstr "Ein neues Plugin-Repository installieren"
-#: ../../Zotlabs/Module/Admin/Plugins.php:453
-#: ../../Zotlabs/Module/Settings/Oauth.php:42
-#: ../../Zotlabs/Module/Settings/Oauth.php:113
-#: ../../Zotlabs/Module/Connedit.php:918 ../../Zotlabs/Module/Profiles.php:802
-#: ../../Zotlabs/Lib/Apps.php:358 ../../addon/cdav/Mod_Cdav.php:1152
-msgid "Update"
-msgstr "Aktualisieren"
-
#: ../../Zotlabs/Module/Admin/Plugins.php:454
msgid "Switch branch"
msgstr "Zweig/Branch wechseln"
#: ../../Zotlabs/Module/Admin/Plugins.php:455
-#: ../../Zotlabs/Module/Photos.php:960 ../../Zotlabs/Module/Tagrm.php:137
+#: ../../Zotlabs/Module/Photos.php:962 ../../Zotlabs/Module/Tagrm.php:137
#: ../../addon/superblock/superblock.php:116
msgid "Remove"
msgstr "Entfernen"
@@ -2188,7 +2380,7 @@ msgstr "Konto '%s' freigegeben"
#: ../../Zotlabs/Module/Admin/Accounts.php:165
#: ../../Zotlabs/Module/Admin/Accounts.php:178
-#: ../../Zotlabs/Widget/Admin.php:23
+#: ../../Zotlabs/Module/Admin.php:96 ../../Zotlabs/Widget/Admin.php:23
msgid "Accounts"
msgstr "Konten"
@@ -2205,21 +2397,12 @@ msgstr "Registrierungen warten auf Bestätigung"
msgid "Request date"
msgstr "Antragsdatum"
-#: ../../Zotlabs/Module/Admin/Accounts.php:169
-#: ../../Zotlabs/Module/Admin/Accounts.php:181
-#: ../../Zotlabs/Module/Connedit.php:906 ../../Zotlabs/Module/Profiles.php:790
-#: ../../addon/cdav/Mod_Cdav.php:1140 ../../addon/openid/MysqlProvider.php:56
-#: ../../addon/openid/MysqlProvider.php:57 ../../addon/rtof/rtof.php:93
-#: ../../addon/redred/redred.php:107 ../../include/network.php:2315
-msgid "Email"
-msgstr "E-Mail"
-
#: ../../Zotlabs/Module/Admin/Accounts.php:170
msgid "No registrations."
msgstr "Keine Registrierungen."
#: ../../Zotlabs/Module/Admin/Accounts.php:171
-#: ../../Zotlabs/Module/Connections.php:281
+#: ../../Zotlabs/Module/Connections.php:282 ../../include/conversation.php:685
msgid "Approve"
msgstr "Genehmigen"
@@ -2241,7 +2424,7 @@ msgstr "Freigeben"
msgid "ID"
msgstr "ID"
-#: ../../Zotlabs/Module/Admin/Accounts.php:182 ../../include/group.php:287
+#: ../../Zotlabs/Module/Admin/Accounts.php:182 ../../include/group.php:288
msgid "All Channels"
msgstr "Alle Kanäle"
@@ -2355,7 +2538,7 @@ msgid "Channel '%s' code disallowed"
msgstr "Code für Kanal '%s' gesperrt"
#: ../../Zotlabs/Module/Admin/Channels.php:146
-#: ../../Zotlabs/Widget/Admin.php:24
+#: ../../Zotlabs/Module/Admin.php:110 ../../Zotlabs/Widget/Admin.php:24
msgid "Channels"
msgstr "Kanäle"
@@ -2376,7 +2559,7 @@ msgid "Disallow Code"
msgstr "Code sperren"
#: ../../Zotlabs/Module/Admin/Channels.php:154
-#: ../../include/conversation.php:1760 ../../include/nav.php:369
+#: ../../include/conversation.php:1757 ../../include/nav.php:355
msgid "Channel"
msgstr "Kanal"
@@ -2398,11 +2581,11 @@ msgstr "Der Kanal {0} wird gelöscht!\\n\\nAlles was von diesem Kanal auf diesem
#: ../../Zotlabs/Module/Admin/Themes.php:26
msgid "Theme settings updated."
-msgstr "Theme-Einstellungen aktualisiert."
+msgstr "Design-Einstellungen aktualisiert."
#: ../../Zotlabs/Module/Admin/Themes.php:61
msgid "No themes found."
-msgstr "Keine Theme gefunden."
+msgstr "Keine Designs gefunden."
#: ../../Zotlabs/Module/Admin/Themes.php:116
msgid "Screenshot"
@@ -2411,7 +2594,7 @@ msgstr "Bildschirmfoto"
#: ../../Zotlabs/Module/Admin/Themes.php:123
#: ../../Zotlabs/Module/Admin/Themes.php:157 ../../Zotlabs/Widget/Admin.php:28
msgid "Themes"
-msgstr "Themes"
+msgstr "Designs"
#: ../../Zotlabs/Module/Admin/Themes.php:162
msgid "[Experimental]"
@@ -2421,381 +2604,382 @@ msgstr "[Experimentell]"
msgid "[Unsupported]"
msgstr "[Nicht unterstützt]"
-#: ../../Zotlabs/Module/Admin/Site.php:144
+#: ../../Zotlabs/Module/Admin/Site.php:142
msgid "Site settings updated."
msgstr "Site-Einstellungen aktualisiert."
-#: ../../Zotlabs/Module/Admin/Site.php:170 ../../include/text.php:2915
+#: ../../Zotlabs/Module/Admin/Site.php:168
+#: ../../view/theme/redbasic/php/config.php:15 ../../include/text.php:2928
msgid "Default"
msgstr "Standard"
-#: ../../Zotlabs/Module/Admin/Site.php:181
+#: ../../Zotlabs/Module/Admin/Site.php:179
#: ../../Zotlabs/Module/Settings/Display.php:137
#, php-format
msgid "%s - (Incompatible)"
msgstr "%s - (Inkompatibel)"
-#: ../../Zotlabs/Module/Admin/Site.php:188
+#: ../../Zotlabs/Module/Admin/Site.php:186
#: ../../Zotlabs/Module/Settings/Display.php:151
msgid "mobile"
msgstr "mobil"
-#: ../../Zotlabs/Module/Admin/Site.php:190
+#: ../../Zotlabs/Module/Admin/Site.php:188
msgid "experimental"
msgstr "experimentell"
-#: ../../Zotlabs/Module/Admin/Site.php:192
+#: ../../Zotlabs/Module/Admin/Site.php:190
msgid "unsupported"
msgstr "nicht unterstützt"
-#: ../../Zotlabs/Module/Admin/Site.php:238
+#: ../../Zotlabs/Module/Admin/Site.php:236
msgid "Yes - with approval"
msgstr "Ja - mit Zustimmung"
-#: ../../Zotlabs/Module/Admin/Site.php:244
+#: ../../Zotlabs/Module/Admin/Site.php:242
msgid "My site is not a public server"
msgstr "Mein Server ist kein öffentlicher Server"
-#: ../../Zotlabs/Module/Admin/Site.php:245
+#: ../../Zotlabs/Module/Admin/Site.php:243
msgid "My site has paid access only"
msgstr "Meine Seite hat nur bezahlten Zugriff"
-#: ../../Zotlabs/Module/Admin/Site.php:246
+#: ../../Zotlabs/Module/Admin/Site.php:244
msgid "My site has free access only"
msgstr "Meine Seite hat nur freien Zugriff"
-#: ../../Zotlabs/Module/Admin/Site.php:247
+#: ../../Zotlabs/Module/Admin/Site.php:245
msgid "My site offers free accounts with optional paid upgrades"
msgstr "Mein Server bietet kostenlose Konten mit der Möglichkeit zu bezahlten Upgrades"
-#: ../../Zotlabs/Module/Admin/Site.php:264 ../../Zotlabs/Lib/Techlevels.php:10
+#: ../../Zotlabs/Module/Admin/Site.php:256
msgid "Beginner/Basic"
msgstr "Anfänger/Basis"
-#: ../../Zotlabs/Module/Admin/Site.php:265 ../../Zotlabs/Lib/Techlevels.php:11
+#: ../../Zotlabs/Module/Admin/Site.php:257
msgid "Novice - not skilled but willing to learn"
msgstr "Anfänger - unerfahren, aber bereit zu lernen"
-#: ../../Zotlabs/Module/Admin/Site.php:266 ../../Zotlabs/Lib/Techlevels.php:12
+#: ../../Zotlabs/Module/Admin/Site.php:258
msgid "Intermediate - somewhat comfortable"
msgstr "Fortgeschritten - relativ komfortabel"
-#: ../../Zotlabs/Module/Admin/Site.php:267 ../../Zotlabs/Lib/Techlevels.php:13
+#: ../../Zotlabs/Module/Admin/Site.php:259
msgid "Advanced - very comfortable"
msgstr "Fortgeschritten - sehr komfortabel"
-#: ../../Zotlabs/Module/Admin/Site.php:268 ../../Zotlabs/Lib/Techlevels.php:14
+#: ../../Zotlabs/Module/Admin/Site.php:260
msgid "Expert - I can write computer code"
msgstr "Experte - Ich kann Computercode schreiben"
-#: ../../Zotlabs/Module/Admin/Site.php:269 ../../Zotlabs/Lib/Techlevels.php:15
+#: ../../Zotlabs/Module/Admin/Site.php:261
msgid "Wizard - I probably know more than you do"
msgstr "Zauberer - ich kann wahrscheinlich mehr als Du"
-#: ../../Zotlabs/Module/Admin/Site.php:278 ../../Zotlabs/Widget/Admin.php:22
+#: ../../Zotlabs/Module/Admin/Site.php:270 ../../Zotlabs/Widget/Admin.php:22
msgid "Site"
msgstr "Seite"
-#: ../../Zotlabs/Module/Admin/Site.php:280
-#: ../../Zotlabs/Module/Register.php:253
+#: ../../Zotlabs/Module/Admin/Site.php:272
+#: ../../Zotlabs/Module/Register.php:251
msgid "Registration"
msgstr "Registrierung"
-#: ../../Zotlabs/Module/Admin/Site.php:281
+#: ../../Zotlabs/Module/Admin/Site.php:273
msgid "File upload"
msgstr "Dateiupload"
-#: ../../Zotlabs/Module/Admin/Site.php:282
+#: ../../Zotlabs/Module/Admin/Site.php:274
msgid "Policies"
msgstr "Richtlinien"
-#: ../../Zotlabs/Module/Admin/Site.php:283
+#: ../../Zotlabs/Module/Admin/Site.php:275
#: ../../include/contact_widgets.php:16
msgid "Advanced"
msgstr "Fortgeschritten"
-#: ../../Zotlabs/Module/Admin/Site.php:287
+#: ../../Zotlabs/Module/Admin/Site.php:279
#: ../../addon/statusnet/statusnet.php:890
msgid "Site name"
msgstr "Seitenname"
-#: ../../Zotlabs/Module/Admin/Site.php:291
+#: ../../Zotlabs/Module/Admin/Site.php:281
msgid "Site default technical skill level"
msgstr "Standard-Qualifikationsstufe der Website"
-#: ../../Zotlabs/Module/Admin/Site.php:291
+#: ../../Zotlabs/Module/Admin/Site.php:281
msgid "Used to provide a member experience matched to technical comfort level"
msgstr "Dies wird verwendet, um eine Benutzererfahrung passend zur technischen Qualifikationsstufe zu bieten."
-#: ../../Zotlabs/Module/Admin/Site.php:293
+#: ../../Zotlabs/Module/Admin/Site.php:283
msgid "Lock the technical skill level setting"
msgstr "Sperre die technische Qualifikationsstufe"
-#: ../../Zotlabs/Module/Admin/Site.php:293
+#: ../../Zotlabs/Module/Admin/Site.php:283
msgid "Members can set their own technical comfort level by default"
msgstr "Benutzer können standardmäßig ihre eigene technische Qualifikationsstufe einstellen"
-#: ../../Zotlabs/Module/Admin/Site.php:295
+#: ../../Zotlabs/Module/Admin/Site.php:285
msgid "Banner/Logo"
msgstr "Banner/Logo"
-#: ../../Zotlabs/Module/Admin/Site.php:296
+#: ../../Zotlabs/Module/Admin/Site.php:286
msgid "Administrator Information"
msgstr "Administrator-Informationen"
-#: ../../Zotlabs/Module/Admin/Site.php:296
+#: ../../Zotlabs/Module/Admin/Site.php:286
msgid ""
"Contact information for site administrators. Displayed on siteinfo page. "
"BBCode can be used here"
msgstr "Kontaktinformationen für Administratoren des Servers. Wird auf der siteinfo-Seite angezeigt. BBCode kann verwendet werden."
-#: ../../Zotlabs/Module/Admin/Site.php:297
-#: ../../Zotlabs/Module/Siteinfo.php:23
+#: ../../Zotlabs/Module/Admin/Site.php:287
+#: ../../Zotlabs/Module/Siteinfo.php:22
msgid "Site Information"
msgstr "Seiteninformationen"
-#: ../../Zotlabs/Module/Admin/Site.php:297
+#: ../../Zotlabs/Module/Admin/Site.php:287
msgid ""
"Publicly visible description of this site. Displayed on siteinfo page. "
"BBCode can be used here"
msgstr "Öffentlich sichtbare Beschreibung dieses Servers. Wird auf der siteinfo-Seite angezeigt. BBCode kann hier verwendet werden."
-#: ../../Zotlabs/Module/Admin/Site.php:298
+#: ../../Zotlabs/Module/Admin/Site.php:288
msgid "System language"
msgstr "System-Sprache"
-#: ../../Zotlabs/Module/Admin/Site.php:299
+#: ../../Zotlabs/Module/Admin/Site.php:289
msgid "System theme"
-msgstr "System-Theme"
+msgstr "System-Design"
-#: ../../Zotlabs/Module/Admin/Site.php:299
+#: ../../Zotlabs/Module/Admin/Site.php:289
msgid ""
"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>"
+msgstr "Standard-System-Design – kann durch Nutzerprofile überschieben werden – <a href='#' id='cnftheme'>Design-Einstellungen ändern</a>"
-#: ../../Zotlabs/Module/Admin/Site.php:300
+#: ../../Zotlabs/Module/Admin/Site.php:290
msgid "Mobile system theme"
-msgstr "Mobile System-Theme:"
+msgstr "System-Design für mobile Geräte:"
-#: ../../Zotlabs/Module/Admin/Site.php:300
+#: ../../Zotlabs/Module/Admin/Site.php:290
msgid "Theme for mobile devices"
msgstr "Theme für mobile Geräte"
-#: ../../Zotlabs/Module/Admin/Site.php:302
+#: ../../Zotlabs/Module/Admin/Site.php:292
msgid "Allow Feeds as Connections"
msgstr "Feeds als Verbindungen erlauben"
-#: ../../Zotlabs/Module/Admin/Site.php:302
+#: ../../Zotlabs/Module/Admin/Site.php:292
msgid "(Heavy system resource usage)"
msgstr "(führt zu hoher Systemlast)"
-#: ../../Zotlabs/Module/Admin/Site.php:303
+#: ../../Zotlabs/Module/Admin/Site.php:293
msgid "Maximum image size"
msgstr "Maximale Bildgröße"
-#: ../../Zotlabs/Module/Admin/Site.php:303
+#: ../../Zotlabs/Module/Admin/Site.php:293
msgid ""
"Maximum size in bytes of uploaded images. Default is 0, which means no "
"limits."
msgstr "Maximale Größe hochgeladener Bilder in Bytes. Standard ist 0 (keine Einschränkung)."
-#: ../../Zotlabs/Module/Admin/Site.php:304
+#: ../../Zotlabs/Module/Admin/Site.php:294
msgid "Does this site allow new member registration?"
msgstr "Erlaubt dieser Server die Registrierung neuer Nutzer?"
-#: ../../Zotlabs/Module/Admin/Site.php:305
+#: ../../Zotlabs/Module/Admin/Site.php:295
msgid "Invitation only"
msgstr "Nur mit Einladung"
-#: ../../Zotlabs/Module/Admin/Site.php:305
+#: ../../Zotlabs/Module/Admin/Site.php:295
msgid ""
"Only allow new member registrations with an invitation code. Above register "
"policy must be set to Yes."
msgstr "Erlaube die Neuregistrierung von Mitglieder nur mit einem Einladungscode. Die Registrierungs-Politik muss oben auf Ja gesetzt werden."
-#: ../../Zotlabs/Module/Admin/Site.php:306
+#: ../../Zotlabs/Module/Admin/Site.php:296
msgid "Which best describes the types of account offered by this hub?"
msgstr "Was ist die passendste Beschreibung der Konten auf diesem Hub?"
-#: ../../Zotlabs/Module/Admin/Site.php:307
+#: ../../Zotlabs/Module/Admin/Site.php:297
msgid "Register text"
msgstr "Registrierungstext"
-#: ../../Zotlabs/Module/Admin/Site.php:307
+#: ../../Zotlabs/Module/Admin/Site.php:297
msgid "Will be displayed prominently on the registration page."
msgstr "Wird gut sichtbar auf der Registrierungs-Seite angezeigt."
-#: ../../Zotlabs/Module/Admin/Site.php:308
+#: ../../Zotlabs/Module/Admin/Site.php:298
msgid "Site homepage to show visitors (default: login box)"
msgstr "Homepage des Hubs, die Besuchern angezeigt wird (Voreinstellung: Anmeldemaske)"
-#: ../../Zotlabs/Module/Admin/Site.php:308
+#: ../../Zotlabs/Module/Admin/Site.php:298
msgid ""
"example: 'public' to show public stream, 'page/sys/home' to show a system "
"webpage called 'home' or 'include:home.html' to include a file."
msgstr "Beispiele: 'public', um den Stream aller öffentlichen Beiträge anzuzeigen, 'page/sys/home', um eine System-Webseite namens 'home' anzuzeigen, 'include:home.html', um eine Datei einzufügen."
-#: ../../Zotlabs/Module/Admin/Site.php:309
+#: ../../Zotlabs/Module/Admin/Site.php:299
msgid "Preserve site homepage URL"
msgstr "Homepage-URL schützen"
-#: ../../Zotlabs/Module/Admin/Site.php:309
+#: ../../Zotlabs/Module/Admin/Site.php:299
msgid ""
"Present the site homepage in a frame at the original location instead of "
"redirecting"
msgstr "Zeigt die Homepage an der Original-URL in einem Frame an, statt auf die eigentliche Adresse der Seite umzuleiten."
-#: ../../Zotlabs/Module/Admin/Site.php:310
+#: ../../Zotlabs/Module/Admin/Site.php:300
msgid "Accounts abandoned after x days"
msgstr "Konten gelten nach X Tagen als unbenutzt"
-#: ../../Zotlabs/Module/Admin/Site.php:310
+#: ../../Zotlabs/Module/Admin/Site.php:300
msgid ""
"Will not waste system resources polling external sites for abandonded "
"accounts. Enter 0 for no time limit."
msgstr "Verschwende keine Systemressourcen auf das Pollen von externen Seiten, wenn das Konto nicht mehr benutzt wird. Trage hier 0 für kein zeitliches Limit."
-#: ../../Zotlabs/Module/Admin/Site.php:311
+#: ../../Zotlabs/Module/Admin/Site.php:301
msgid "Allowed friend domains"
msgstr "Erlaubte Domains für Kontakte"
-#: ../../Zotlabs/Module/Admin/Site.php:311
+#: ../../Zotlabs/Module/Admin/Site.php:301
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."
-#: ../../Zotlabs/Module/Admin/Site.php:312
+#: ../../Zotlabs/Module/Admin/Site.php:302
msgid "Verify Email Addresses"
msgstr "E-Mail-Adressen überprüfen"
-#: ../../Zotlabs/Module/Admin/Site.php:312
+#: ../../Zotlabs/Module/Admin/Site.php:302
msgid ""
"Check to verify email addresses used in account registration (recommended)."
msgstr "Aktivieren, um die Überprüfung von E-Mail-Adressen bei der Registrierung von Benutzerkonten zu aktivieren (empfohlen)."
-#: ../../Zotlabs/Module/Admin/Site.php:313
+#: ../../Zotlabs/Module/Admin/Site.php:303
msgid "Force publish"
msgstr "Veröffentlichung erzwingen"
-#: ../../Zotlabs/Module/Admin/Site.php:313
+#: ../../Zotlabs/Module/Admin/Site.php:303
msgid ""
"Check to force all profiles on this site to be listed in the site directory."
msgstr "Die Veröffentlichung aller Profile dieses Servers im Verzeichnis erzwingen."
-#: ../../Zotlabs/Module/Admin/Site.php:314
+#: ../../Zotlabs/Module/Admin/Site.php:304
msgid "Import Public Streams"
msgstr "Öffentliche Beiträge importieren"
-#: ../../Zotlabs/Module/Admin/Site.php:314
+#: ../../Zotlabs/Module/Admin/Site.php:304
msgid ""
"Import and allow access to public content pulled from other sites. Warning: "
"this content is unmoderated."
msgstr "Öffentliche Beiträge von anderen Servern importieren und zur Verfügung stellen. Warnung: Diese Inhalte sind nicht moderiert."
-#: ../../Zotlabs/Module/Admin/Site.php:315
+#: ../../Zotlabs/Module/Admin/Site.php:305
msgid "Login on Homepage"
msgstr "Log-in auf der Startseite"
-#: ../../Zotlabs/Module/Admin/Site.php:315
+#: ../../Zotlabs/Module/Admin/Site.php:305
msgid ""
"Present a login box to visitors on the home page if no other content has "
"been configured."
msgstr "Zeigt Besuchern der Homepage eine Anmeldemaske, falls keine anderen Inhalte konfiguriert wurden."
-#: ../../Zotlabs/Module/Admin/Site.php:316
+#: ../../Zotlabs/Module/Admin/Site.php:306
msgid "Enable context help"
msgstr "Kontext-Hilfe aktivieren"
-#: ../../Zotlabs/Module/Admin/Site.php:316
+#: ../../Zotlabs/Module/Admin/Site.php:306
msgid ""
"Display contextual help for the current page when the help button is "
"pressed."
msgstr "Zeigt Kontext-sensitive Hilfe für die aktuelle Seite an, wenn der Hilfe-Knopf geklickt wird."
-#: ../../Zotlabs/Module/Admin/Site.php:318
+#: ../../Zotlabs/Module/Admin/Site.php:308
msgid "Reply-to email address for system generated email."
msgstr "Antwortadresse (reply-to) für Emails, die vom System generiert wurden."
-#: ../../Zotlabs/Module/Admin/Site.php:319
+#: ../../Zotlabs/Module/Admin/Site.php:309
msgid "Sender (From) email address for system generated email."
msgstr "Absenderadresse (from) für Emails, die vom System generiert wurden."
-#: ../../Zotlabs/Module/Admin/Site.php:320
+#: ../../Zotlabs/Module/Admin/Site.php:310
msgid "Name of email sender for system generated email."
msgstr "Name des Versenders von Emails, die vom System generiert wurden."
-#: ../../Zotlabs/Module/Admin/Site.php:322
+#: ../../Zotlabs/Module/Admin/Site.php:312
msgid "Directory Server URL"
msgstr "Verzeichnisserver-URL"
-#: ../../Zotlabs/Module/Admin/Site.php:322
+#: ../../Zotlabs/Module/Admin/Site.php:312
msgid "Default directory server"
msgstr "Standard-Verzeichnisserver"
-#: ../../Zotlabs/Module/Admin/Site.php:324
+#: ../../Zotlabs/Module/Admin/Site.php:314
msgid "Proxy user"
msgstr "Proxy Benutzer"
-#: ../../Zotlabs/Module/Admin/Site.php:325
+#: ../../Zotlabs/Module/Admin/Site.php:315
msgid "Proxy URL"
msgstr "Proxy URL"
-#: ../../Zotlabs/Module/Admin/Site.php:326
+#: ../../Zotlabs/Module/Admin/Site.php:316
msgid "Network timeout"
msgstr "Netzwerk-Timeout"
-#: ../../Zotlabs/Module/Admin/Site.php:326
+#: ../../Zotlabs/Module/Admin/Site.php:316
msgid "Value is in seconds. Set to 0 for unlimited (not recommended)."
msgstr "Wert in Sekunden. 0 für unbegrenzt (nicht empfohlen)."
-#: ../../Zotlabs/Module/Admin/Site.php:327
+#: ../../Zotlabs/Module/Admin/Site.php:317
msgid "Delivery interval"
msgstr "Auslieferung Intervall"
-#: ../../Zotlabs/Module/Admin/Site.php:327
+#: ../../Zotlabs/Module/Admin/Site.php:317
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 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."
-#: ../../Zotlabs/Module/Admin/Site.php:328
+#: ../../Zotlabs/Module/Admin/Site.php:318
msgid "Deliveries per process"
msgstr "Zustellungen pro Prozess"
-#: ../../Zotlabs/Module/Admin/Site.php:328
+#: ../../Zotlabs/Module/Admin/Site.php:318
msgid ""
"Number of deliveries to attempt in a single operating system process. Adjust"
" if necessary to tune system performance. Recommend: 1-5."
msgstr "Anzahl der Zustellungen, die innerhalb eines einzelnen Betriebssystemprozesses versucht werden. Anpassen, falls nötig, um die System-Performance zu verbessern. Empfehlung: 1-5."
-#: ../../Zotlabs/Module/Admin/Site.php:329
+#: ../../Zotlabs/Module/Admin/Site.php:319
msgid "Poll interval"
msgstr "Abfrageintervall"
-#: ../../Zotlabs/Module/Admin/Site.php:329
+#: ../../Zotlabs/Module/Admin/Site.php:319
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 Sekunden, um die Systemlast zu reduzieren. Bei 0 wird das Auslieferungsintervall verwendet."
-#: ../../Zotlabs/Module/Admin/Site.php:330
+#: ../../Zotlabs/Module/Admin/Site.php:320
msgid "Maximum Load Average"
msgstr "Maximales Load Average"
-#: ../../Zotlabs/Module/Admin/Site.php:330
+#: ../../Zotlabs/Module/Admin/Site.php:320
msgid ""
"Maximum system load before delivery and poll processes are deferred - "
"default 50."
msgstr "Maximale Systemlast, bevor Verteil- und Empfangsprozesse verschoben werden – Standard 50"
-#: ../../Zotlabs/Module/Admin/Site.php:331
+#: ../../Zotlabs/Module/Admin/Site.php:321
msgid "Expiration period in days for imported (grid/network) content"
msgstr "Setze den Zeitraum (in Tagen), ab wann importierte (aus dem Netzwerk) Inhalte ablaufen sollen"
-#: ../../Zotlabs/Module/Admin/Site.php:331
+#: ../../Zotlabs/Module/Admin/Site.php:321
msgid "0 for no expiration of imported content"
msgstr "0 = keine Löschung importierter Inhalte"
@@ -2841,8 +3025,8 @@ msgstr "Zusätzliche Informationen (optional)"
#: ../../Zotlabs/Module/Admin/Profs.php:74
#: ../../Zotlabs/Module/Admin/Profs.php:94 ../../Zotlabs/Module/Rbmark.php:32
#: ../../Zotlabs/Module/Rbmark.php:104 ../../Zotlabs/Module/Filer.php:53
-#: ../../Zotlabs/Widget/Notes.php:18 ../../include/text.php:1028
-#: ../../include/text.php:1040
+#: ../../Zotlabs/Widget/Notes.php:18 ../../include/text.php:1022
+#: ../../include/text.php:1034
msgid "Save"
msgstr "Speichern"
@@ -3046,6 +3230,14 @@ msgctxt "acl"
msgid "Profile"
msgstr "Profil"
+#: ../../Zotlabs/Module/Moderate.php:37
+msgid "Comment approved"
+msgstr "Kommentar bestätigt"
+
+#: ../../Zotlabs/Module/Moderate.php:41
+msgid "Comment deleted"
+msgstr "Kommentar gelöscht"
+
#: ../../Zotlabs/Module/Settings/Permcats.php:37
msgid "Permission category saved."
msgstr "Berechtigungsrolle gespeichert."
@@ -3066,25 +3258,25 @@ msgstr "Name der Berechtigungsrolle"
#: ../../Zotlabs/Module/Settings/Permcats.php:103
#: ../../Zotlabs/Module/Settings/Tokens.php:161
-#: ../../Zotlabs/Module/Connedit.php:886
+#: ../../Zotlabs/Module/Connedit.php:904
msgid "My Settings"
msgstr "Meine Einstellungen"
#: ../../Zotlabs/Module/Settings/Permcats.php:105
#: ../../Zotlabs/Module/Settings/Tokens.php:163
-#: ../../Zotlabs/Module/Connedit.php:881
+#: ../../Zotlabs/Module/Connedit.php:899
msgid "inherited"
msgstr "geerbt"
#: ../../Zotlabs/Module/Settings/Permcats.php:108
#: ../../Zotlabs/Module/Settings/Tokens.php:166
-#: ../../Zotlabs/Module/Connedit.php:888
+#: ../../Zotlabs/Module/Connedit.php:906
msgid "Individual Permissions"
msgstr "Individuelle Zugriffsrechte"
#: ../../Zotlabs/Module/Settings/Permcats.php:109
#: ../../Zotlabs/Module/Settings/Tokens.php:167
-#: ../../Zotlabs/Module/Connedit.php:889
+#: ../../Zotlabs/Module/Connedit.php:907
msgid ""
"Some permissions may be inherited from your channel's <a "
"href=\"settings\"><strong>privacy settings</strong></a>, which have higher "
@@ -3098,12 +3290,12 @@ msgstr "Einige Berechtigungen werden möglicherweise von den globalen <a href=\"
#: ../../Zotlabs/Module/Settings/Channel.php:70
#: ../../Zotlabs/Module/Settings/Channel.php:81
#: ../../Zotlabs/Module/Connedit.php:707 ../../Zotlabs/Widget/Affinity.php:28
-#: ../../include/selectors.php:123 ../../include/channel.php:406
-#: ../../include/channel.php:407 ../../include/channel.php:414
+#: ../../include/selectors.php:123 ../../include/channel.php:408
+#: ../../include/channel.php:409 ../../include/channel.php:416
msgid "Friends"
msgstr "Freunde"
-#: ../../Zotlabs/Module/Settings/Channel.php:251
+#: ../../Zotlabs/Module/Settings/Channel.php:255
#: ../../addon/rendezvous/rendezvous.php:82
#: ../../addon/openstreetmap/openstreetmap.php:184
#: ../../addon/msgfooter/msgfooter.php:54 ../../addon/logrot/logrot.php:54
@@ -3112,380 +3304,388 @@ msgstr "Freunde"
msgid "Settings updated."
msgstr "Einstellungen aktualisiert."
-#: ../../Zotlabs/Module/Settings/Channel.php:312
+#: ../../Zotlabs/Module/Settings/Channel.php:316
msgid "Nobody except yourself"
msgstr "Niemand außer Dir selbst"
-#: ../../Zotlabs/Module/Settings/Channel.php:313
+#: ../../Zotlabs/Module/Settings/Channel.php:317
msgid "Only those you specifically allow"
msgstr "Nur die, denen Du es explizit erlaubst"
-#: ../../Zotlabs/Module/Settings/Channel.php:314
+#: ../../Zotlabs/Module/Settings/Channel.php:318
msgid "Approved connections"
msgstr "Angenommene Verbindungen"
-#: ../../Zotlabs/Module/Settings/Channel.php:315
+#: ../../Zotlabs/Module/Settings/Channel.php:319
msgid "Any connections"
msgstr "Beliebige Verbindungen"
-#: ../../Zotlabs/Module/Settings/Channel.php:316
+#: ../../Zotlabs/Module/Settings/Channel.php:320
msgid "Anybody on this website"
msgstr "Jeder auf dieser Website"
-#: ../../Zotlabs/Module/Settings/Channel.php:317
+#: ../../Zotlabs/Module/Settings/Channel.php:321
msgid "Anybody in this network"
msgstr "Alle $Projectname-Mitglieder"
-#: ../../Zotlabs/Module/Settings/Channel.php:318
+#: ../../Zotlabs/Module/Settings/Channel.php:322
msgid "Anybody authenticated"
msgstr "Jeder authentifizierte"
-#: ../../Zotlabs/Module/Settings/Channel.php:319
+#: ../../Zotlabs/Module/Settings/Channel.php:323
msgid "Anybody on the internet"
msgstr "Jeder im Internet"
-#: ../../Zotlabs/Module/Settings/Channel.php:395
+#: ../../Zotlabs/Module/Settings/Channel.php:399
msgid "Publish your default profile in the network directory"
msgstr "Standard-Profil im Netzwerk-Verzeichnis veröffentlichen"
-#: ../../Zotlabs/Module/Settings/Channel.php:400
+#: ../../Zotlabs/Module/Settings/Channel.php:404
msgid "Allow us to suggest you as a potential friend to new members?"
msgstr "Dürfen wir Dich neuen Mitgliedern als potentiellen Kontakt vorschlagen?"
-#: ../../Zotlabs/Module/Settings/Channel.php:404
+#: ../../Zotlabs/Module/Settings/Channel.php:408
#: ../../Zotlabs/Module/Profile_photo.php:429
#: ../../Zotlabs/Module/Cover_photo.php:365
msgid "or"
msgstr "oder"
-#: ../../Zotlabs/Module/Settings/Channel.php:409
+#: ../../Zotlabs/Module/Settings/Channel.php:413
msgid "Your channel address is"
msgstr "Deine Kanal-Adresse lautet"
-#: ../../Zotlabs/Module/Settings/Channel.php:412
+#: ../../Zotlabs/Module/Settings/Channel.php:416
msgid "Your files/photos are accessible via WebDAV at"
msgstr "Deine Dateien/Fotos sind via WebDAV verfügbar auf"
-#: ../../Zotlabs/Module/Settings/Channel.php:474
+#: ../../Zotlabs/Module/Settings/Channel.php:478
msgid "Channel Settings"
msgstr "Kanal-Einstellungen"
-#: ../../Zotlabs/Module/Settings/Channel.php:481
+#: ../../Zotlabs/Module/Settings/Channel.php:485
msgid "Basic Settings"
msgstr "Grundeinstellungen"
-#: ../../Zotlabs/Module/Settings/Channel.php:482
-#: ../../include/channel.php:1250
+#: ../../Zotlabs/Module/Settings/Channel.php:486
+#: ../../include/channel.php:1373
msgid "Full Name:"
msgstr "Voller Name:"
-#: ../../Zotlabs/Module/Settings/Channel.php:483
+#: ../../Zotlabs/Module/Settings/Channel.php:487
#: ../../Zotlabs/Module/Settings/Account.php:119
msgid "Email Address:"
msgstr "Email Adresse:"
-#: ../../Zotlabs/Module/Settings/Channel.php:484
+#: ../../Zotlabs/Module/Settings/Channel.php:488
msgid "Your Timezone:"
msgstr "Ihre Zeitzone:"
-#: ../../Zotlabs/Module/Settings/Channel.php:485
+#: ../../Zotlabs/Module/Settings/Channel.php:489
msgid "Default Post Location:"
msgstr "Standardstandort:"
-#: ../../Zotlabs/Module/Settings/Channel.php:485
+#: ../../Zotlabs/Module/Settings/Channel.php:489
msgid "Geographical location to display on your posts"
msgstr "Geografischer Ort, der bei Deinen Beiträgen angezeigt werden soll"
-#: ../../Zotlabs/Module/Settings/Channel.php:486
+#: ../../Zotlabs/Module/Settings/Channel.php:490
msgid "Use Browser Location:"
msgstr "Standort des Browsers verwenden:"
-#: ../../Zotlabs/Module/Settings/Channel.php:488
+#: ../../Zotlabs/Module/Settings/Channel.php:492
msgid "Adult Content"
msgstr "Nicht jugendfreie Inhalte"
-#: ../../Zotlabs/Module/Settings/Channel.php:488
+#: ../../Zotlabs/Module/Settings/Channel.php:492
msgid ""
"This channel frequently or regularly publishes adult content. (Please tag "
"any adult material and/or nudity with #NSFW)"
msgstr "Dieser Kanal veröffentlicht regelmäßig Inhalte, die für Minderjährige ungeeignet sind. (Bitte markiere solche Inhalte mit dem Schlagwort #NSFW)"
-#: ../../Zotlabs/Module/Settings/Channel.php:490
+#: ../../Zotlabs/Module/Settings/Channel.php:494
msgid "Security and Privacy Settings"
msgstr "Sicherheits- und Datenschutz-Einstellungen"
-#: ../../Zotlabs/Module/Settings/Channel.php:493
+#: ../../Zotlabs/Module/Settings/Channel.php:496
msgid "Your permissions are already configured. Click to view/adjust"
msgstr "Deine Zugriffsrechte sind schon konfiguriert. Klicke hier, um sie zu betrachten oder zu ändern"
-#: ../../Zotlabs/Module/Settings/Channel.php:495
+#: ../../Zotlabs/Module/Settings/Channel.php:498
msgid "Hide my online presence"
msgstr "Meine Online-Präsenz verbergen"
-#: ../../Zotlabs/Module/Settings/Channel.php:495
+#: ../../Zotlabs/Module/Settings/Channel.php:498
msgid "Prevents displaying in your profile that you are online"
msgstr "Verhindert die Anzeige Deines Online-Status in deinem Profil"
-#: ../../Zotlabs/Module/Settings/Channel.php:497
+#: ../../Zotlabs/Module/Settings/Channel.php:500
msgid "Simple Privacy Settings:"
msgstr "Einfache Privatsphäre-Einstellungen"
-#: ../../Zotlabs/Module/Settings/Channel.php:498
+#: ../../Zotlabs/Module/Settings/Channel.php:501
msgid ""
"Very Public - <em>extremely permissive (should be used with caution)</em>"
msgstr "Komplett offen – <em>extrem ungeschützt (mit großer Vorsicht verwenden!)</em>"
-#: ../../Zotlabs/Module/Settings/Channel.php:499
+#: ../../Zotlabs/Module/Settings/Channel.php:502
msgid ""
"Typical - <em>default public, privacy when desired (similar to social "
"network permissions but with improved privacy)</em>"
msgstr "Typisch – <em>Standard öffentlich, Privatsphäre, wo sie erwünscht ist (ähnlich den Einstellungen in sozialen Netzwerken, aber mit besser geschützter Privatsphäre)</em>"
-#: ../../Zotlabs/Module/Settings/Channel.php:500
+#: ../../Zotlabs/Module/Settings/Channel.php:503
msgid "Private - <em>default private, never open or public</em>"
msgstr "Privat – <em>Standard privat, nie offen oder öffentlich</em>"
-#: ../../Zotlabs/Module/Settings/Channel.php:501
+#: ../../Zotlabs/Module/Settings/Channel.php:504
msgid "Blocked - <em>default blocked to/from everybody</em>"
msgstr "Blockiert – <em>Alle standardmäßig blockiert</em>"
-#: ../../Zotlabs/Module/Settings/Channel.php:503
+#: ../../Zotlabs/Module/Settings/Channel.php:506
msgid "Allow others to tag your posts"
msgstr "Erlaube anderen, Deine Beiträge zu verschlagworten"
-#: ../../Zotlabs/Module/Settings/Channel.php:503
+#: ../../Zotlabs/Module/Settings/Channel.php:506
msgid ""
"Often used by the community to retro-actively flag inappropriate content"
msgstr "Wird oft von der Community genutzt um rückwirkend anstößigen Inhalt zu markieren"
-#: ../../Zotlabs/Module/Settings/Channel.php:505
+#: ../../Zotlabs/Module/Settings/Channel.php:508
msgid "Channel Permission Limits"
msgstr "Kanal-Berechtigungslimits"
-#: ../../Zotlabs/Module/Settings/Channel.php:507
+#: ../../Zotlabs/Module/Settings/Channel.php:510
msgid "Expire other channel content after this many days"
msgstr "Den Inhalt anderer Kanäle nach dieser Anzahl Tage verfallen lassen"
-#: ../../Zotlabs/Module/Settings/Channel.php:507
+#: ../../Zotlabs/Module/Settings/Channel.php:510
msgid "0 or blank to use the website limit."
msgstr "0 oder leer lassen, um den voreingestellten Wert der Webseite zu verwenden."
-#: ../../Zotlabs/Module/Settings/Channel.php:507
+#: ../../Zotlabs/Module/Settings/Channel.php:510
#, php-format
msgid "This website expires after %d days."
msgstr "Diese Webseite läuft nach %d Tagen ab."
-#: ../../Zotlabs/Module/Settings/Channel.php:507
+#: ../../Zotlabs/Module/Settings/Channel.php:510
msgid "This website does not expire imported content."
msgstr "Diese Webseite lässt importierte Inhalte nicht verfallen."
-#: ../../Zotlabs/Module/Settings/Channel.php:507
+#: ../../Zotlabs/Module/Settings/Channel.php:510
msgid "The website limit takes precedence if lower than your limit."
msgstr "Das Verfallslimit der Webseite hat Vorrang, wenn es niedriger als Deines hier ist."
-#: ../../Zotlabs/Module/Settings/Channel.php:508
+#: ../../Zotlabs/Module/Settings/Channel.php:511
msgid "Maximum Friend Requests/Day:"
msgstr "Maximale Kontaktanfragen pro Tag:"
-#: ../../Zotlabs/Module/Settings/Channel.php:508
+#: ../../Zotlabs/Module/Settings/Channel.php:511
msgid "May reduce spam activity"
msgstr "Kann die Spam-Aktivität verringern"
-#: ../../Zotlabs/Module/Settings/Channel.php:509
+#: ../../Zotlabs/Module/Settings/Channel.php:512
msgid "Default Access Control List (ACL)"
msgstr "Standard-Zugriffsberechtigungsliste (ACL)"
-#: ../../Zotlabs/Module/Settings/Channel.php:511
+#: ../../Zotlabs/Module/Settings/Channel.php:514
msgid "Use my default audience setting for the type of object published"
msgstr "Verwende Deine eingestellte Standard-Zielgruppe des jeweiligen Inhaltstyps"
-#: ../../Zotlabs/Module/Settings/Channel.php:518
+#: ../../Zotlabs/Module/Settings/Channel.php:521
msgid "Channel permissions category:"
msgstr "Zugriffsrechte-Kategorie des Kanals:"
-#: ../../Zotlabs/Module/Settings/Channel.php:519
+#: ../../Zotlabs/Module/Settings/Channel.php:522
msgid "Default Permissions Group"
msgstr "Standard-Berechtigungsgruppe"
-#: ../../Zotlabs/Module/Settings/Channel.php:525
+#: ../../Zotlabs/Module/Settings/Channel.php:528
msgid "Maximum private messages per day from unknown people:"
msgstr "Maximale Anzahl privater Nachrichten pro Tag von unbekannten Leuten:"
-#: ../../Zotlabs/Module/Settings/Channel.php:525
+#: ../../Zotlabs/Module/Settings/Channel.php:528
msgid "Useful to reduce spamming"
msgstr "Nützlich, um Spam zu verringern"
-#: ../../Zotlabs/Module/Settings/Channel.php:528
+#: ../../Zotlabs/Module/Settings/Channel.php:531
msgid "Notification Settings"
msgstr "Benachrichtigungs-Einstellungen"
-#: ../../Zotlabs/Module/Settings/Channel.php:529
+#: ../../Zotlabs/Module/Settings/Channel.php:532
msgid "By default post a status message when:"
msgstr "Sende standardmäßig Status-Nachrichten, wenn:"
-#: ../../Zotlabs/Module/Settings/Channel.php:530
+#: ../../Zotlabs/Module/Settings/Channel.php:533
msgid "accepting a friend request"
msgstr "Du eine Verbindungsanfrage annimmst"
-#: ../../Zotlabs/Module/Settings/Channel.php:531
+#: ../../Zotlabs/Module/Settings/Channel.php:534
msgid "joining a forum/community"
msgstr "Du einem Forum beitrittst"
-#: ../../Zotlabs/Module/Settings/Channel.php:532
+#: ../../Zotlabs/Module/Settings/Channel.php:535
msgid "making an <em>interesting</em> profile change"
msgstr "Du eine <em>interessante</em> Änderung an Deinem Profil vornimmst"
-#: ../../Zotlabs/Module/Settings/Channel.php:533
+#: ../../Zotlabs/Module/Settings/Channel.php:536
msgid "Send a notification email when:"
msgstr "Eine E-Mail-Benachrichtigung senden, wenn:"
-#: ../../Zotlabs/Module/Settings/Channel.php:534
+#: ../../Zotlabs/Module/Settings/Channel.php:537
msgid "You receive a connection request"
msgstr "Du eine Verbindungsanfrage erhältst"
-#: ../../Zotlabs/Module/Settings/Channel.php:535
+#: ../../Zotlabs/Module/Settings/Channel.php:538
msgid "Your connections are confirmed"
msgstr "Eine Verbindung bestätigt wurde"
-#: ../../Zotlabs/Module/Settings/Channel.php:536
+#: ../../Zotlabs/Module/Settings/Channel.php:539
msgid "Someone writes on your profile wall"
msgstr "Jemand auf Deine Pinnwand schreibt"
-#: ../../Zotlabs/Module/Settings/Channel.php:537
+#: ../../Zotlabs/Module/Settings/Channel.php:540
msgid "Someone writes a followup comment"
msgstr "Jemand einen Beitrag kommentiert"
-#: ../../Zotlabs/Module/Settings/Channel.php:538
+#: ../../Zotlabs/Module/Settings/Channel.php:541
msgid "You receive a private message"
msgstr "Du eine private Nachricht erhältst"
-#: ../../Zotlabs/Module/Settings/Channel.php:539
+#: ../../Zotlabs/Module/Settings/Channel.php:542
msgid "You receive a friend suggestion"
msgstr "Du einen Kontaktvorschlag erhältst"
-#: ../../Zotlabs/Module/Settings/Channel.php:540
+#: ../../Zotlabs/Module/Settings/Channel.php:543
msgid "You are tagged in a post"
msgstr "Du in einem Beitrag erwähnt wurdest"
-#: ../../Zotlabs/Module/Settings/Channel.php:541
+#: ../../Zotlabs/Module/Settings/Channel.php:544
msgid "You are poked/prodded/etc. in a post"
msgstr "Du in einem Beitrag angestupst/geknufft/o.ä. wurdest"
-#: ../../Zotlabs/Module/Settings/Channel.php:543
+#: ../../Zotlabs/Module/Settings/Channel.php:546
msgid "Someone likes your post/comment"
msgstr "Jemand mag Ihren Beitrag/Kommentar"
-#: ../../Zotlabs/Module/Settings/Channel.php:546
+#: ../../Zotlabs/Module/Settings/Channel.php:549
msgid "Show visual notifications including:"
msgstr "Visuelle Benachrichtigungen anzeigen für:"
-#: ../../Zotlabs/Module/Settings/Channel.php:548
+#: ../../Zotlabs/Module/Settings/Channel.php:551
msgid "Unseen grid activity"
msgstr "Ungesehene Netzwerk-Aktivität"
-#: ../../Zotlabs/Module/Settings/Channel.php:549
+#: ../../Zotlabs/Module/Settings/Channel.php:552
msgid "Unseen channel activity"
msgstr "Ungesehene Kanal-Aktivität"
-#: ../../Zotlabs/Module/Settings/Channel.php:550
+#: ../../Zotlabs/Module/Settings/Channel.php:553
msgid "Unseen private messages"
msgstr "Ungelesene persönliche Nachrichten"
-#: ../../Zotlabs/Module/Settings/Channel.php:550
-#: ../../Zotlabs/Module/Settings/Channel.php:555
-#: ../../Zotlabs/Module/Settings/Channel.php:556
-#: ../../Zotlabs/Module/Settings/Channel.php:557
+#: ../../Zotlabs/Module/Settings/Channel.php:553
+#: ../../Zotlabs/Module/Settings/Channel.php:558
+#: ../../Zotlabs/Module/Settings/Channel.php:559
+#: ../../Zotlabs/Module/Settings/Channel.php:560
#: ../../addon/jappixmini/jappixmini.php:343
msgid "Recommended"
msgstr "Empfohlen"
-#: ../../Zotlabs/Module/Settings/Channel.php:551
+#: ../../Zotlabs/Module/Settings/Channel.php:554
msgid "Upcoming events"
msgstr "Baldige Termine"
-#: ../../Zotlabs/Module/Settings/Channel.php:552
+#: ../../Zotlabs/Module/Settings/Channel.php:555
msgid "Events today"
msgstr "Heutige Termine"
-#: ../../Zotlabs/Module/Settings/Channel.php:553
+#: ../../Zotlabs/Module/Settings/Channel.php:556
msgid "Upcoming birthdays"
msgstr "Baldige Geburtstage"
-#: ../../Zotlabs/Module/Settings/Channel.php:553
+#: ../../Zotlabs/Module/Settings/Channel.php:556
msgid "Not available in all themes"
-msgstr "Nicht in allen Themes verfügbar"
+msgstr "Nicht in allen Designs verfügbar"
-#: ../../Zotlabs/Module/Settings/Channel.php:554
+#: ../../Zotlabs/Module/Settings/Channel.php:557
msgid "System (personal) notifications"
msgstr "System – (persönliche) Benachrichtigungen"
-#: ../../Zotlabs/Module/Settings/Channel.php:555
+#: ../../Zotlabs/Module/Settings/Channel.php:558
msgid "System info messages"
msgstr "System – Info-Nachrichten"
-#: ../../Zotlabs/Module/Settings/Channel.php:556
+#: ../../Zotlabs/Module/Settings/Channel.php:559
msgid "System critical alerts"
msgstr "System – kritische Warnungen"
-#: ../../Zotlabs/Module/Settings/Channel.php:557
+#: ../../Zotlabs/Module/Settings/Channel.php:560
msgid "New connections"
msgstr "Neue Verbindungen"
-#: ../../Zotlabs/Module/Settings/Channel.php:558
+#: ../../Zotlabs/Module/Settings/Channel.php:561
msgid "System Registrations"
msgstr "System – Registrierungen"
-#: ../../Zotlabs/Module/Settings/Channel.php:559
+#: ../../Zotlabs/Module/Settings/Channel.php:562
+msgid "Unseen shared files"
+msgstr "Ungesehene geteilte Dateien"
+
+#: ../../Zotlabs/Module/Settings/Channel.php:563
+msgid "Unseen public activity"
+msgstr "Ungesehene öffentliche Aktivität"
+
+#: ../../Zotlabs/Module/Settings/Channel.php:564
msgid ""
"Also show new wall posts, private messages and connections under Notices"
msgstr "Neue Pinnwand-Nachrichten, private Nachrichten und Verbindungen unter Benachrichtigungen anzeigen"
-#: ../../Zotlabs/Module/Settings/Channel.php:561
+#: ../../Zotlabs/Module/Settings/Channel.php:566
msgid "Notify me of events this many days in advance"
msgstr "Benachrichtige mich zu Terminen so viele Tage im Voraus"
-#: ../../Zotlabs/Module/Settings/Channel.php:561
+#: ../../Zotlabs/Module/Settings/Channel.php:566
msgid "Must be greater than 0"
msgstr "Muss größer als 0 sein"
-#: ../../Zotlabs/Module/Settings/Channel.php:567
+#: ../../Zotlabs/Module/Settings/Channel.php:572
msgid "Advanced Account/Page Type Settings"
msgstr "Erweiterte Account- und Seitenart-Einstellungen"
-#: ../../Zotlabs/Module/Settings/Channel.php:568
+#: ../../Zotlabs/Module/Settings/Channel.php:573
msgid "Change the behaviour of this account for special situations"
msgstr "Ändere das Verhalten dieses Accounts unter speziellen Umständen"
-#: ../../Zotlabs/Module/Settings/Channel.php:570
+#: ../../Zotlabs/Module/Settings/Channel.php:575
msgid "Miscellaneous Settings"
msgstr "Sonstige Einstellungen"
-#: ../../Zotlabs/Module/Settings/Channel.php:571
+#: ../../Zotlabs/Module/Settings/Channel.php:576
msgid "Default photo upload folder"
msgstr "Voreingestellter Ordner für hochgeladene Fotos"
-#: ../../Zotlabs/Module/Settings/Channel.php:571
-#: ../../Zotlabs/Module/Settings/Channel.php:572
+#: ../../Zotlabs/Module/Settings/Channel.php:576
+#: ../../Zotlabs/Module/Settings/Channel.php:577
msgid "%Y - current year, %m - current month"
msgstr "%Y - aktuelles Jahr, %m - aktueller Monat"
-#: ../../Zotlabs/Module/Settings/Channel.php:572
+#: ../../Zotlabs/Module/Settings/Channel.php:577
msgid "Default file upload folder"
msgstr "Voreingestellter Ordner für hochgeladene Dateien"
-#: ../../Zotlabs/Module/Settings/Channel.php:574
+#: ../../Zotlabs/Module/Settings/Channel.php:579
msgid "Personal menu to display in your channel pages"
msgstr "Eigenes Menü zur Anzeige auf den Seiten deines Kanals"
-#: ../../Zotlabs/Module/Settings/Channel.php:576
+#: ../../Zotlabs/Module/Settings/Channel.php:581
msgid "Remove this channel."
msgstr "Diesen Kanal löschen"
-#: ../../Zotlabs/Module/Settings/Channel.php:577
+#: ../../Zotlabs/Module/Settings/Channel.php:582
msgid "Firefox Share $Projectname provider"
msgstr "$Projectname-Provider für Firefox Share"
-#: ../../Zotlabs/Module/Settings/Channel.php:578
+#: ../../Zotlabs/Module/Settings/Channel.php:583
msgid "Start calendar week on Monday"
msgstr "Beginne die kalendarische Woche am Montag"
@@ -3521,7 +3721,7 @@ msgid ""
msgstr "Du kannst auch <em>Dropbox</em>-ähnliche Zugriffslinks an Andere weitergeben, indem du das Login-Passwort an eine entsprechende URL anhängst wie nachfolgend gezeigt. Beispiele:"
#: ../../Zotlabs/Module/Settings/Tokens.php:150
-#: ../../Zotlabs/Widget/Settings_menu.php:90
+#: ../../Zotlabs/Widget/Settings_menu.php:92
msgid "Guest Access Tokens"
msgstr "Gastzugangstoken"
@@ -3538,7 +3738,7 @@ msgid "Expires (yyyy-mm-dd)"
msgstr "Läuft ab (jjjj-mm-tt)"
#: ../../Zotlabs/Module/Settings/Tokens.php:160
-#: ../../Zotlabs/Module/Connedit.php:885
+#: ../../Zotlabs/Module/Connedit.php:903
msgid "Their Settings"
msgstr "Deren Einstellungen"
@@ -3615,33 +3815,33 @@ msgstr "Konto entfernen"
msgid "Remove this account including all its channels"
msgstr "Dieses Konto inklusive all seiner Kanäle löschen"
-#: ../../Zotlabs/Module/Settings/Featured.php:20
+#: ../../Zotlabs/Module/Settings/Featured.php:21
msgid "Affinity Slider settings updated."
msgstr "Die Beziehungsgrad-Schieberegler-Einstellungen wurden aktualisiert."
-#: ../../Zotlabs/Module/Settings/Featured.php:34
+#: ../../Zotlabs/Module/Settings/Featured.php:36
msgid "No feature settings configured"
msgstr "Keine Funktions-Einstellungen konfiguriert"
-#: ../../Zotlabs/Module/Settings/Featured.php:41
+#: ../../Zotlabs/Module/Settings/Featured.php:43
msgid "Default maximum affinity level"
msgstr "Voreinstellung für maximalen Beziehungsgrad"
-#: ../../Zotlabs/Module/Settings/Featured.php:46
+#: ../../Zotlabs/Module/Settings/Featured.php:48
msgid "Default minimum affinity level"
msgstr "Voreinstellung für minimalen Beziehungsgrad"
-#: ../../Zotlabs/Module/Settings/Featured.php:50
+#: ../../Zotlabs/Module/Settings/Featured.php:52
msgid "Affinity Slider Settings"
msgstr "Beziehungsgrad-Schieberegler-Einstellungen"
-#: ../../Zotlabs/Module/Settings/Featured.php:60
+#: ../../Zotlabs/Module/Settings/Featured.php:62
msgid "Feature/Addon Settings"
msgstr "Funktions-/Addon-Einstellungen"
#: ../../Zotlabs/Module/Settings/Display.php:145
msgid "No special theme for mobile devices"
-msgstr "Keine spezielle Theme für mobile Geräte"
+msgstr "Kein spezielles Design für mobile Geräte"
#: ../../Zotlabs/Module/Settings/Display.php:148
#, php-format
@@ -3654,11 +3854,11 @@ msgstr "Anzeige-Einstellungen"
#: ../../Zotlabs/Module/Settings/Display.php:199
msgid "Theme Settings"
-msgstr "Theme-Einstellungen"
+msgstr "Design-Einstellungen"
#: ../../Zotlabs/Module/Settings/Display.php:200
msgid "Custom Theme Settings"
-msgstr "Benutzerdefinierte Theme-Einstellungen"
+msgstr "Benutzerdefinierte Design-Einstellungen"
#: ../../Zotlabs/Module/Settings/Display.php:201
msgid "Content Settings"
@@ -3666,7 +3866,7 @@ msgstr "Inhaltseinstellungen"
#: ../../Zotlabs/Module/Settings/Display.php:207
msgid "Display Theme:"
-msgstr "Anzeige-Theme:"
+msgstr "Anzeige-Design:"
#: ../../Zotlabs/Module/Settings/Display.php:208
msgid "Select scheme"
@@ -3674,7 +3874,7 @@ msgstr "Schema wählen"
#: ../../Zotlabs/Module/Settings/Display.php:210
msgid "Mobile Theme:"
-msgstr "Mobile Theme:"
+msgstr "Design für mobile Geräte:"
#: ../../Zotlabs/Module/Settings/Display.php:211
msgid "Preload images before rendering the page"
@@ -3829,32 +4029,24 @@ msgid "Remove authorization"
msgstr "Authorisierung aufheben"
#: ../../Zotlabs/Module/Embedphotos.php:140
-#: ../../Zotlabs/Module/Photos.php:751 ../../Zotlabs/Module/Photos.php:1290
-#: ../../Zotlabs/Widget/Album.php:78
+#: ../../Zotlabs/Module/Photos.php:753 ../../Zotlabs/Module/Photos.php:1292
+#: ../../Zotlabs/Widget/Portfolio.php:78 ../../Zotlabs/Widget/Album.php:78
msgid "View Photo"
msgstr "Foto ansehen"
-#: ../../Zotlabs/Module/Embedphotos.php:146
-#: ../../Zotlabs/Module/Photos.php:757 ../../Zotlabs/Module/Photos.php:1213
-#: ../../Zotlabs/Lib/Apps.php:571 ../../Zotlabs/Lib/Apps.php:649
-#: ../../Zotlabs/Storage/Browser.php:163 ../../Zotlabs/Widget/Album.php:84
-#: ../../addon/cdav/Mod_Cdav.php:745 ../../addon/cdav/Mod_Cdav.php:746
-#: ../../addon/cdav/Mod_Cdav.php:753 ../../include/conversation.php:1110
-msgid "Unknown"
-msgstr "Unbekannt"
-
#: ../../Zotlabs/Module/Embedphotos.php:156
-#: ../../Zotlabs/Module/Photos.php:782 ../../Zotlabs/Widget/Album.php:95
+#: ../../Zotlabs/Module/Photos.php:784 ../../Zotlabs/Widget/Portfolio.php:97
+#: ../../Zotlabs/Widget/Album.php:95
msgid "Edit Album"
msgstr "Album bearbeiten"
#: ../../Zotlabs/Module/Embedphotos.php:158
-#: ../../Zotlabs/Module/Photos.php:784 ../../Zotlabs/Module/Photos.php:1321
+#: ../../Zotlabs/Module/Photos.php:786 ../../Zotlabs/Module/Photos.php:1323
#: ../../Zotlabs/Module/Profile_photo.php:423
#: ../../Zotlabs/Module/Cover_photo.php:361
-#: ../../Zotlabs/Storage/Browser.php:229 ../../Zotlabs/Storage/Browser.php:334
-#: ../../Zotlabs/Widget/Album.php:97 ../../addon/cdav/include/widgets.php:132
-#: ../../addon/cdav/include/widgets.php:168
+#: ../../Zotlabs/Storage/Browser.php:230 ../../Zotlabs/Storage/Browser.php:337
+#: ../../Zotlabs/Widget/Cdav.php:132 ../../Zotlabs/Widget/Cdav.php:168
+#: ../../Zotlabs/Widget/Portfolio.php:99 ../../Zotlabs/Widget/Album.php:97
msgid "Upload"
msgstr "Hochladen"
@@ -3916,9 +4108,9 @@ msgid "URL for photo of thing (optional)"
msgstr "URL eines Fotos der Sache (optional)"
#: ../../Zotlabs/Module/Thing.php:313 ../../Zotlabs/Module/Thing.php:363
-#: ../../Zotlabs/Module/Photos.php:647 ../../Zotlabs/Module/Photos.php:1011
-#: ../../Zotlabs/Module/Connedit.php:672 ../../Zotlabs/Module/Chat.php:233
-#: ../../Zotlabs/Module/Filestorage.php:152
+#: ../../Zotlabs/Module/Photos.php:649 ../../Zotlabs/Module/Photos.php:1013
+#: ../../Zotlabs/Module/Connedit.php:672 ../../Zotlabs/Module/Chat.php:235
+#: ../../Zotlabs/Module/Filestorage.php:142
#: ../../include/acl_selectors.php:218
msgid "Permissions"
msgstr "Berechtigungen"
@@ -3941,52 +4133,52 @@ msgstr "System-Benachrichtigungen"
msgid "Channel added."
msgstr "Kanal hinzugefügt."
-#: ../../Zotlabs/Module/Import.php:144
+#: ../../Zotlabs/Module/Import.php:143
#, php-format
msgid "Your service plan only allows %d channels."
msgstr "Dein Vertrag erlaubt nur %d Kanäle."
-#: ../../Zotlabs/Module/Import.php:158
+#: ../../Zotlabs/Module/Import.php:157
msgid "No channel. Import failed."
msgstr "Kein Kanal. Import fehlgeschlagen."
-#: ../../Zotlabs/Module/Import.php:466
+#: ../../Zotlabs/Module/Import.php:470
#: ../../addon/diaspora/import_diaspora.php:142
msgid "Import completed."
msgstr "Import abgeschlossen."
-#: ../../Zotlabs/Module/Import.php:494
+#: ../../Zotlabs/Module/Import.php:498
msgid "You must be logged in to use this feature."
msgstr "Du musst angemeldet sein um diese Funktion zu nutzen."
-#: ../../Zotlabs/Module/Import.php:499
+#: ../../Zotlabs/Module/Import.php:503
msgid "Import Channel"
msgstr "Kanal importieren"
-#: ../../Zotlabs/Module/Import.php:500
+#: ../../Zotlabs/Module/Import.php:504
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."
msgstr "Verwende dieses Formular, um einen existierenden Kanal von einem anderen Hub zu importieren. Du kannst den Kanal direkt vom bisherigen Hub über das Netzwerk oder aus einer exportierten Sicherheitskopie importieren."
-#: ../../Zotlabs/Module/Import.php:502
+#: ../../Zotlabs/Module/Import.php:506
msgid "Or provide the old server/hub details"
msgstr "Oder gib die Details Deines bisherigen $Projectname-Hubs ein"
-#: ../../Zotlabs/Module/Import.php:503
+#: ../../Zotlabs/Module/Import.php:507
msgid "Your old identity address (xyz@example.com)"
msgstr "Bisherige Kanal-Adresse (xyz@example.com)"
-#: ../../Zotlabs/Module/Import.php:504
+#: ../../Zotlabs/Module/Import.php:508
msgid "Your old login email address"
msgstr "Deine alte Login-E-Mail-Adresse"
-#: ../../Zotlabs/Module/Import.php:505
+#: ../../Zotlabs/Module/Import.php:509
msgid "Your old login password"
msgstr "Dein altes Passwort"
-#: ../../Zotlabs/Module/Import.php:506
+#: ../../Zotlabs/Module/Import.php:510
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"
@@ -3994,19 +4186,19 @@ msgid ""
"primary location for files, photos, and media."
msgstr "Egal, welche Option Du wählst – bitte lege fest, ob dieser Server die neue primäre Adresse dieses Kanals sein soll, oder ob der bisherige $Projectname-Hub diese Rolle weiterhin wahrnimmt. Du kannst von beiden Servern aus posten, aber nur einer kann der primäre Ort Deiner Dateien, Fotos und Medien sein."
-#: ../../Zotlabs/Module/Import.php:507
+#: ../../Zotlabs/Module/Import.php:511
msgid "Make this hub my primary location"
msgstr "Dieser $Pojectname-Hub ist mein primärer Hub."
-#: ../../Zotlabs/Module/Import.php:508
+#: ../../Zotlabs/Module/Import.php:512
msgid "Move this channel (disable all previous locations)"
msgstr "Verschiebe diesen Kanal (deaktiviere alle vorherigen Adressen/Klone)"
-#: ../../Zotlabs/Module/Import.php:509
+#: ../../Zotlabs/Module/Import.php:513
msgid "Import a few months of posts if possible (limited by available memory"
msgstr "Importiere die Beiträge einiger Monate, sofern möglich (beschränkt durch verfügbaren Speicher)"
-#: ../../Zotlabs/Module/Import.php:510
+#: ../../Zotlabs/Module/Import.php:514
msgid ""
"This process may take several minutes to complete. Please submit the form "
"only once and leave this page open until finished."
@@ -4016,21 +4208,21 @@ msgstr "Dieser Vorgang kann einige Minuten dauern. Bitte sende das Formular nur
msgid "Authentication failed."
msgstr "Authentifizierung fehlgeschlagen."
-#: ../../Zotlabs/Module/Rmagic.php:75 ../../include/channel.php:1984
+#: ../../Zotlabs/Module/Rmagic.php:75 ../../include/channel.php:2102
msgid "Remote Authentication"
msgstr "Entfernte Authentifizierung"
-#: ../../Zotlabs/Module/Rmagic.php:76 ../../include/channel.php:1985
+#: ../../Zotlabs/Module/Rmagic.php:76 ../../include/channel.php:2103
msgid "Enter your channel address (e.g. channel@example.com)"
msgstr "Deine Kanal-Adresse (z. B. channel@example.com)"
-#: ../../Zotlabs/Module/Rmagic.php:77 ../../include/channel.php:1986
+#: ../../Zotlabs/Module/Rmagic.php:77 ../../include/channel.php:2104
msgid "Authenticate"
msgstr "Authentifizieren"
#: ../../Zotlabs/Module/Cal.php:62 ../../Zotlabs/Module/Chanview.php:96
-#: ../../Zotlabs/Module/Page.php:56 ../../Zotlabs/Module/Wall_upload.php:31
-#: ../../Zotlabs/Module/Block.php:43
+#: ../../Zotlabs/Module/Page.php:75 ../../Zotlabs/Module/Wall_upload.php:31
+#: ../../Zotlabs/Module/Block.php:41
msgid "Channel not found."
msgstr "Kanal nicht gefunden."
@@ -4038,39 +4230,39 @@ msgstr "Kanal nicht gefunden."
msgid "Permissions denied."
msgstr "Berechtigung verweigert."
-#: ../../Zotlabs/Module/Cal.php:342 ../../include/text.php:2291
+#: ../../Zotlabs/Module/Cal.php:342 ../../include/text.php:2304
msgid "Import"
msgstr "Import"
-#: ../../Zotlabs/Module/Api.php:72 ../../Zotlabs/Module/Api.php:93
-msgid "Authorize application connection"
-msgstr "Zugriff für die Anwendung autorisieren"
+#: ../../Zotlabs/Module/Notify.php:61
+#: ../../Zotlabs/Module/Notifications.php:42
+msgid "System Notifications"
+msgstr "System-Benachrichtigungen"
-#: ../../Zotlabs/Module/Api.php:73
-msgid "Return to your app and insert this Security Code:"
-msgstr "Gehen Sie zu Ihrer App zurück und tragen Sie diesen Sicherheitscode ein:"
+#: ../../Zotlabs/Module/Follow.php:31
+msgid "Channel added."
+msgstr "Kanal hinzugefügt."
-#: ../../Zotlabs/Module/Api.php:83
-msgid "Please login to continue."
-msgstr "Zum Weitermachen, bitte einloggen."
+#: ../../Zotlabs/Module/Import.php:144
+#, php-format
+msgid "Your service plan only allows %d channels."
+msgstr "Dein Vertrag erlaubt nur %d Kanäle."
-#: ../../Zotlabs/Module/Api.php:95
-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 erlauben, Deine Nachrichten und Kontakte abzurufen und/oder neue Nachrichten für Dich zu erstellen?"
+#: ../../Zotlabs/Module/Import.php:158
+msgid "No channel. Import failed."
+msgstr "Kein Kanal. Import fehlgeschlagen."
#: ../../Zotlabs/Module/Attach.php:13
msgid "Item not available."
msgstr "Element nicht verfügbar."
-#: ../../Zotlabs/Module/Editblock.php:116 ../../Zotlabs/Module/Chat.php:205
-#: ../../Zotlabs/Module/Editwebpage.php:143 ../../Zotlabs/Module/Mail.php:306
-#: ../../Zotlabs/Module/Mail.php:448 ../../include/conversation.php:1228
+#: ../../Zotlabs/Module/Editblock.php:116 ../../Zotlabs/Module/Chat.php:207
+#: ../../Zotlabs/Module/Editwebpage.php:143 ../../Zotlabs/Module/Mail.php:288
+#: ../../Zotlabs/Module/Mail.php:430 ../../include/conversation.php:1225
msgid "Insert web link"
msgstr "Link einfügen"
-#: ../../Zotlabs/Module/Editblock.php:129 ../../include/conversation.php:1339
+#: ../../Zotlabs/Module/Editblock.php:129 ../../include/conversation.php:1336
msgid "Title (optional)"
msgstr "Titel (optional)"
@@ -4078,11 +4270,11 @@ msgstr "Titel (optional)"
msgid "Edit Block"
msgstr "Block bearbeiten"
-#: ../../Zotlabs/Module/Profile.php:91
+#: ../../Zotlabs/Module/Profile.php:93
msgid "vcard"
msgstr "VCard"
-#: ../../Zotlabs/Module/Apps.php:45
+#: ../../Zotlabs/Module/Apps.php:45 ../../Zotlabs/Lib/Apps.php:224
msgid "Apps"
msgstr "Apps"
@@ -4100,7 +4292,8 @@ msgctxt "mood"
msgid "%1$s is %2$s"
msgstr "%1$s ist %2$s"
-#: ../../Zotlabs/Module/Mood.php:135 ../../Zotlabs/Lib/Apps.php:234
+#: ../../Zotlabs/Module/Mood.php:120 ../../Zotlabs/Module/Mood.php:135
+#: ../../Zotlabs/Lib/Apps.php:247
msgid "Mood"
msgstr "Laune"
@@ -4108,74 +4301,87 @@ msgstr "Laune"
msgid "Set your current mood and tell your friends"
msgstr "Wähle Deine aktuelle Stimmung und teile sie mit Deinen Freunden"
-#: ../../Zotlabs/Module/Connections.php:52
-#: ../../Zotlabs/Module/Connections.php:157
-#: ../../Zotlabs/Module/Connections.php:246
+#: ../../Zotlabs/Module/Connections.php:33
+#: ../../Zotlabs/Module/Connections.php:309 ../../Zotlabs/Lib/Apps.php:229
+#: ../../include/text.php:951 ../../include/nav.php:180
+msgid "Connections"
+msgstr "Verbindungen"
+
+#: ../../Zotlabs/Module/Connections.php:54
+#: ../../Zotlabs/Module/Connections.php:156
+#: ../../Zotlabs/Module/Connections.php:245
msgid "Blocked"
msgstr "Blockiert"
-#: ../../Zotlabs/Module/Connections.php:57
-#: ../../Zotlabs/Module/Connections.php:164
-#: ../../Zotlabs/Module/Connections.php:245
+#: ../../Zotlabs/Module/Connections.php:59
+#: ../../Zotlabs/Module/Connections.php:163
+#: ../../Zotlabs/Module/Connections.php:244
msgid "Ignored"
msgstr "Ignoriert"
-#: ../../Zotlabs/Module/Connections.php:62
-#: ../../Zotlabs/Module/Connections.php:178
-#: ../../Zotlabs/Module/Connections.php:244
+#: ../../Zotlabs/Module/Connections.php:64
+#: ../../Zotlabs/Module/Connections.php:177
+#: ../../Zotlabs/Module/Connections.php:243
msgid "Hidden"
msgstr "Versteckt"
-#: ../../Zotlabs/Module/Connections.php:67
-#: ../../Zotlabs/Module/Connections.php:171
-#: ../../Zotlabs/Module/Connections.php:243
-msgid "Archived"
-msgstr "Archiviert"
+#: ../../Zotlabs/Module/Connections.php:69
+#: ../../Zotlabs/Module/Connections.php:170
+msgid "Archived/Unreachable"
+msgstr "Archiviert/Unerreichbar"
-#: ../../Zotlabs/Module/Connections.php:72
-#: ../../Zotlabs/Module/Connections.php:82 ../../Zotlabs/Module/Menu.php:116
-#: ../../include/conversation.php:1666
+#: ../../Zotlabs/Module/Connections.php:74
+#: ../../Zotlabs/Module/Connections.php:83 ../../Zotlabs/Module/Menu.php:116
+#: ../../include/conversation.php:1663
msgid "New"
msgstr "Neu"
#: ../../Zotlabs/Module/Connections.php:88
-#: ../../Zotlabs/Module/Connections.php:103
+#: ../../Zotlabs/Module/Connections.php:102
#: ../../Zotlabs/Module/Connedit.php:709 ../../Zotlabs/Widget/Affinity.php:30
msgid "All"
msgstr "Alle"
-#: ../../Zotlabs/Module/Connections.php:134
+#: ../../Zotlabs/Module/Connections.php:133
msgid "New Connections"
msgstr "Neue Verbindungen"
-#: ../../Zotlabs/Module/Connections.php:137
+#: ../../Zotlabs/Module/Connections.php:136
msgid "Show pending (new) connections"
msgstr "Ausstehende (neue) Verbindungsanfragen anzeigen"
-#: ../../Zotlabs/Module/Connections.php:144
+#: ../../Zotlabs/Module/Connections.php:143
msgid "Show all connections"
msgstr "Alle Verbindungen anzeigen"
-#: ../../Zotlabs/Module/Connections.php:160
+#: ../../Zotlabs/Module/Connections.php:159
msgid "Only show blocked connections"
msgstr "Nur blockierte Verbindungen anzeigen"
-#: ../../Zotlabs/Module/Connections.php:167
+#: ../../Zotlabs/Module/Connections.php:166
msgid "Only show ignored connections"
msgstr "Nur ignorierte Verbindungen anzeigen"
-#: ../../Zotlabs/Module/Connections.php:174
-msgid "Only show archived connections"
-msgstr "Nur archivierte Verbindungen anzeigen"
+#: ../../Zotlabs/Module/Connections.php:173
+msgid "Only show archived/unreachable connections"
+msgstr "Nur archivierte/unerreichbare Verbindungen anzeigen"
-#: ../../Zotlabs/Module/Connections.php:181
+#: ../../Zotlabs/Module/Connections.php:180
msgid "Only show hidden connections"
msgstr "Nur versteckte Verbindungen anzeigen"
-#: ../../Zotlabs/Module/Connections.php:242
+#: ../../Zotlabs/Module/Connections.php:241
msgid "Pending approval"
msgstr "Wartet auf Genehmigung"
+#: ../../Zotlabs/Module/Connections.php:242
+msgid "Archived"
+msgstr "Archiviert"
+
+#: ../../Zotlabs/Module/Connections.php:246
+msgid "Not connected at this location"
+msgstr "An diesem Ort nicht verbunden"
+
#: ../../Zotlabs/Module/Connections.php:258
#, php-format
msgid "%1$s [%2$s]"
@@ -4185,61 +4391,56 @@ msgstr "%1$s [%2$s]"
msgid "Edit connection"
msgstr "Verbindung bearbeiten"
-#: ../../Zotlabs/Module/Connections.php:260
+#: ../../Zotlabs/Module/Connections.php:261
msgid "Delete connection"
msgstr "Verbindung löschen"
-#: ../../Zotlabs/Module/Connections.php:269
+#: ../../Zotlabs/Module/Connections.php:270
msgid "Channel address"
msgstr "Kanaladresse"
-#: ../../Zotlabs/Module/Connections.php:271
+#: ../../Zotlabs/Module/Connections.php:272
msgid "Network"
msgstr "Netzwerk"
-#: ../../Zotlabs/Module/Connections.php:274
+#: ../../Zotlabs/Module/Connections.php:275
msgid "Call"
msgstr "Anruf"
-#: ../../Zotlabs/Module/Connections.php:276
+#: ../../Zotlabs/Module/Connections.php:277
msgid "Status"
msgstr "Status"
-#: ../../Zotlabs/Module/Connections.php:278
+#: ../../Zotlabs/Module/Connections.php:279
msgid "Connected"
msgstr "Verbunden"
-#: ../../Zotlabs/Module/Connections.php:280
+#: ../../Zotlabs/Module/Connections.php:281
msgid "Approve connection"
msgstr "Verbindung genehmigen"
-#: ../../Zotlabs/Module/Connections.php:282
+#: ../../Zotlabs/Module/Connections.php:283
msgid "Ignore connection"
msgstr "Verbindung ignorieren"
-#: ../../Zotlabs/Module/Connections.php:283
+#: ../../Zotlabs/Module/Connections.php:284
#: ../../Zotlabs/Module/Connedit.php:626
msgid "Ignore"
msgstr "Ignorieren"
-#: ../../Zotlabs/Module/Connections.php:284
+#: ../../Zotlabs/Module/Connections.php:285
msgid "Recent activity"
msgstr "Kürzliche Aktivitäten"
-#: ../../Zotlabs/Module/Connections.php:308 ../../Zotlabs/Lib/Apps.php:216
-#: ../../include/text.php:957 ../../include/nav.php:185
-msgid "Connections"
-msgstr "Verbindungen"
-
-#: ../../Zotlabs/Module/Connections.php:313
+#: ../../Zotlabs/Module/Connections.php:314
msgid "Search your connections"
msgstr "Verbindungen durchsuchen"
-#: ../../Zotlabs/Module/Connections.php:314
+#: ../../Zotlabs/Module/Connections.php:315
msgid "Connections search"
msgstr "Verbindung suchen"
-#: ../../Zotlabs/Module/Connections.php:315
+#: ../../Zotlabs/Module/Connections.php:316
#: ../../Zotlabs/Module/Directory.php:391
#: ../../Zotlabs/Module/Directory.php:396 ../../include/contact_widgets.php:23
msgid "Find"
@@ -4247,21 +4448,25 @@ msgstr "Finde"
#: ../../Zotlabs/Module/Viewsrc.php:43
msgid "item"
-msgstr ""
+msgstr "Beitrag"
#: ../../Zotlabs/Module/Viewsrc.php:55
msgid "Source of Item"
msgstr "Quelle des Elements"
-#: ../../Zotlabs/Module/Bookmarks.php:53
+#: ../../Zotlabs/Module/Bookmarks.php:11 ../../Zotlabs/Lib/Apps.php:227
+msgid "View Bookmarks"
+msgstr "Lesezeichen ansehen"
+
+#: ../../Zotlabs/Module/Bookmarks.php:56
msgid "Bookmark added"
msgstr "Lesezeichen hinzugefügt"
-#: ../../Zotlabs/Module/Bookmarks.php:76
+#: ../../Zotlabs/Module/Bookmarks.php:79
msgid "My Bookmarks"
msgstr "Meine Lesezeichen"
-#: ../../Zotlabs/Module/Bookmarks.php:87
+#: ../../Zotlabs/Module/Bookmarks.php:90
msgid "My Connections Bookmarks"
msgstr "Lesezeichen meiner Kontakte"
@@ -4305,7 +4510,7 @@ msgstr "Album nicht gefunden."
msgid "Delete Album"
msgstr "Album löschen"
-#: ../../Zotlabs/Module/Photos.php:174 ../../Zotlabs/Module/Photos.php:1023
+#: ../../Zotlabs/Module/Photos.php:174 ../../Zotlabs/Module/Photos.php:1025
msgid "Delete Photo"
msgstr "Foto löschen"
@@ -4317,226 +4522,232 @@ msgstr "Keine Fotos ausgewählt"
msgid "Access to this item is restricted."
msgstr "Der Zugriff auf dieses Foto ist eingeschränkt."
-#: ../../Zotlabs/Module/Photos.php:591
+#: ../../Zotlabs/Module/Photos.php:558 ../../Zotlabs/Module/Fbrowser.php:29
+#: ../../Zotlabs/Lib/Apps.php:242 ../../include/conversation.php:1780
+#: ../../include/nav.php:378
+msgid "Photos"
+msgstr "Fotos"
+
+#: ../../Zotlabs/Module/Photos.php:593
#, php-format
msgid "%1$.2f MB of %2$.2f MB photo storage used."
msgstr "%1$.2f MB von %2$.2f MB Foto-Speicher belegt."
-#: ../../Zotlabs/Module/Photos.php:594
+#: ../../Zotlabs/Module/Photos.php:596
#, php-format
msgid "%1$.2f MB photo storage used."
msgstr "%1$.2f MB Foto-Speicher belegt."
-#: ../../Zotlabs/Module/Photos.php:636
+#: ../../Zotlabs/Module/Photos.php:638
msgid "Upload Photos"
msgstr "Fotos hochladen"
-#: ../../Zotlabs/Module/Photos.php:640
+#: ../../Zotlabs/Module/Photos.php:642
msgid "Enter an album name"
msgstr "Namen für ein neues Album eingeben"
-#: ../../Zotlabs/Module/Photos.php:641
+#: ../../Zotlabs/Module/Photos.php:643
msgid "or select an existing album (doubleclick)"
msgstr "oder ein bereits vorhandenes auswählen (Doppelklick)"
-#: ../../Zotlabs/Module/Photos.php:642
+#: ../../Zotlabs/Module/Photos.php:644
msgid "Create a status post for this upload"
msgstr "Einen Statusbeitrag für diesen Upload erzeugen"
-#: ../../Zotlabs/Module/Photos.php:643
+#: ../../Zotlabs/Module/Photos.php:645
msgid "Caption (optional):"
msgstr "Beschriftung (optional):"
-#: ../../Zotlabs/Module/Photos.php:644
+#: ../../Zotlabs/Module/Photos.php:646
msgid "Description (optional):"
msgstr "Beschreibung (optional):"
-#: ../../Zotlabs/Module/Photos.php:725
+#: ../../Zotlabs/Module/Photos.php:727
msgid "Show Newest First"
msgstr "Neueste zuerst anzeigen"
-#: ../../Zotlabs/Module/Photos.php:727
+#: ../../Zotlabs/Module/Photos.php:729
msgid "Show Oldest First"
msgstr "Älteste zuerst anzeigen"
-#: ../../Zotlabs/Module/Photos.php:832
+#: ../../Zotlabs/Module/Photos.php:834
msgid "Permission denied. Access to this item may be restricted."
msgstr "Berechtigung verweigert. Der Zugriff ist wahrscheinlich eingeschränkt worden."
-#: ../../Zotlabs/Module/Photos.php:834
+#: ../../Zotlabs/Module/Photos.php:836
msgid "Photo not available"
msgstr "Foto nicht verfügbar"
-#: ../../Zotlabs/Module/Photos.php:892
+#: ../../Zotlabs/Module/Photos.php:894
msgid "Use as profile photo"
msgstr "Als Profilfoto verwenden"
-#: ../../Zotlabs/Module/Photos.php:893
+#: ../../Zotlabs/Module/Photos.php:895
msgid "Use as cover photo"
msgstr "Als Titelbild verwenden"
-#: ../../Zotlabs/Module/Photos.php:900
+#: ../../Zotlabs/Module/Photos.php:902
msgid "Private Photo"
msgstr "Privates Foto"
-#: ../../Zotlabs/Module/Photos.php:915
+#: ../../Zotlabs/Module/Photos.php:917
msgid "View Full Size"
msgstr "In voller Größe anzeigen"
-#: ../../Zotlabs/Module/Photos.php:997
+#: ../../Zotlabs/Module/Photos.php:999
msgid "Edit photo"
msgstr "Foto bearbeiten"
-#: ../../Zotlabs/Module/Photos.php:999
+#: ../../Zotlabs/Module/Photos.php:1001
msgid "Rotate CW (right)"
msgstr "Drehen im UZS (rechts)"
-#: ../../Zotlabs/Module/Photos.php:1000
+#: ../../Zotlabs/Module/Photos.php:1002
msgid "Rotate CCW (left)"
msgstr "Drehen gegen UZS (links)"
-#: ../../Zotlabs/Module/Photos.php:1003
+#: ../../Zotlabs/Module/Photos.php:1005
msgid "Move photo to album"
msgstr "Foto in Album verschieben"
-#: ../../Zotlabs/Module/Photos.php:1004
+#: ../../Zotlabs/Module/Photos.php:1006
msgid "Enter a new album name"
msgstr "Gib einen Namen für ein neues Album ein"
-#: ../../Zotlabs/Module/Photos.php:1005
+#: ../../Zotlabs/Module/Photos.php:1007
msgid "or select an existing one (doubleclick)"
msgstr "oder wähle ein bereits vorhandenes aus (Doppelklick)"
-#: ../../Zotlabs/Module/Photos.php:1008
+#: ../../Zotlabs/Module/Photos.php:1010
msgid "Caption"
msgstr "Bildunterschrift"
-#: ../../Zotlabs/Module/Photos.php:1010
+#: ../../Zotlabs/Module/Photos.php:1012
msgid "Add a Tag"
msgstr "Schlagwort hinzufügen"
-#: ../../Zotlabs/Module/Photos.php:1018
+#: ../../Zotlabs/Module/Photos.php:1020
msgid "Example: @bob, @Barbara_Jensen, @jim@example.com"
msgstr "Beispiele: @ben, @Karl_Prester, @lieschen@example.com"
-#: ../../Zotlabs/Module/Photos.php:1021
+#: ../../Zotlabs/Module/Photos.php:1023
msgid "Flag as adult in album view"
msgstr "In der Albumansicht als nicht jugendfrei markieren"
-#: ../../Zotlabs/Module/Photos.php:1040 ../../Zotlabs/Lib/ThreadItem.php:269
+#: ../../Zotlabs/Module/Photos.php:1042 ../../Zotlabs/Lib/ThreadItem.php:267
msgid "I like this (toggle)"
msgstr "Mir gefällt das (Umschalter)"
-#: ../../Zotlabs/Module/Photos.php:1041 ../../Zotlabs/Lib/ThreadItem.php:270
+#: ../../Zotlabs/Module/Photos.php:1043 ../../Zotlabs/Lib/ThreadItem.php:268
msgid "I don't like this (toggle)"
msgstr "Mir gefällt das nicht (Umschalter)"
-#: ../../Zotlabs/Module/Photos.php:1043 ../../Zotlabs/Lib/ThreadItem.php:412
-#: ../../include/conversation.php:739
+#: ../../Zotlabs/Module/Photos.php:1045 ../../Zotlabs/Lib/ThreadItem.php:410
+#: ../../include/conversation.php:736
msgid "Please wait"
msgstr "Bitte warten"
-#: ../../Zotlabs/Module/Photos.php:1059 ../../Zotlabs/Module/Photos.php:1177
-#: ../../Zotlabs/Lib/ThreadItem.php:729
+#: ../../Zotlabs/Module/Photos.php:1061 ../../Zotlabs/Module/Photos.php:1179
+#: ../../Zotlabs/Lib/ThreadItem.php:727
msgid "This is you"
msgstr "Das bist Du"
-#: ../../Zotlabs/Module/Photos.php:1061 ../../Zotlabs/Module/Photos.php:1179
-#: ../../Zotlabs/Lib/ThreadItem.php:731 ../../include/js_strings.php:6
+#: ../../Zotlabs/Module/Photos.php:1063 ../../Zotlabs/Module/Photos.php:1181
+#: ../../Zotlabs/Lib/ThreadItem.php:729 ../../include/js_strings.php:6
msgid "Comment"
msgstr "Kommentar"
-#: ../../Zotlabs/Module/Photos.php:1077 ../../include/conversation.php:574
+#: ../../Zotlabs/Module/Photos.php:1079 ../../include/conversation.php:569
msgctxt "title"
msgid "Likes"
msgstr "Gefällt mir"
-#: ../../Zotlabs/Module/Photos.php:1077 ../../include/conversation.php:574
+#: ../../Zotlabs/Module/Photos.php:1079 ../../include/conversation.php:569
msgctxt "title"
msgid "Dislikes"
msgstr "Gefällt mir nicht"
-#: ../../Zotlabs/Module/Photos.php:1078 ../../include/conversation.php:575
+#: ../../Zotlabs/Module/Photos.php:1080 ../../include/conversation.php:570
msgctxt "title"
msgid "Agree"
msgstr "Zustimmungen"
-#: ../../Zotlabs/Module/Photos.php:1078 ../../include/conversation.php:575
+#: ../../Zotlabs/Module/Photos.php:1080 ../../include/conversation.php:570
msgctxt "title"
msgid "Disagree"
msgstr "Ablehnungen"
-#: ../../Zotlabs/Module/Photos.php:1078 ../../include/conversation.php:575
+#: ../../Zotlabs/Module/Photos.php:1080 ../../include/conversation.php:570
msgctxt "title"
msgid "Abstain"
msgstr "Enthaltungen"
-#: ../../Zotlabs/Module/Photos.php:1079 ../../include/conversation.php:576
+#: ../../Zotlabs/Module/Photos.php:1081 ../../include/conversation.php:571
msgctxt "title"
msgid "Attending"
msgstr "Zusagen"
-#: ../../Zotlabs/Module/Photos.php:1079 ../../include/conversation.php:576
+#: ../../Zotlabs/Module/Photos.php:1081 ../../include/conversation.php:571
msgctxt "title"
msgid "Not attending"
msgstr "Absagen"
-#: ../../Zotlabs/Module/Photos.php:1079 ../../include/conversation.php:576
+#: ../../Zotlabs/Module/Photos.php:1081 ../../include/conversation.php:571
msgctxt "title"
msgid "Might attend"
msgstr "Vielleicht"
-#: ../../Zotlabs/Module/Photos.php:1096 ../../Zotlabs/Module/Photos.php:1108
+#: ../../Zotlabs/Module/Photos.php:1098 ../../Zotlabs/Module/Photos.php:1110
#: ../../Zotlabs/Lib/ThreadItem.php:187 ../../Zotlabs/Lib/ThreadItem.php:199
msgid "View all"
msgstr "Alles anzeigen"
-#: ../../Zotlabs/Module/Photos.php:1100 ../../Zotlabs/Lib/ThreadItem.php:191
-#: ../../include/conversation.php:1907 ../../include/channel.php:1268
-#: ../../include/taxonomy.php:403
+#: ../../Zotlabs/Module/Photos.php:1102 ../../Zotlabs/Lib/ThreadItem.php:191
+#: ../../include/conversation.php:1904 ../../include/channel.php:1391
+#: ../../include/taxonomy.php:442
msgctxt "noun"
msgid "Like"
msgid_plural "Likes"
msgstr[0] "Gefällt mir"
msgstr[1] "Gefällt mir"
-#: ../../Zotlabs/Module/Photos.php:1105 ../../Zotlabs/Lib/ThreadItem.php:196
-#: ../../include/conversation.php:1910
+#: ../../Zotlabs/Module/Photos.php:1107 ../../Zotlabs/Lib/ThreadItem.php:196
+#: ../../include/conversation.php:1907
msgctxt "noun"
msgid "Dislike"
msgid_plural "Dislikes"
msgstr[0] "Gefällt nicht"
msgstr[1] "Gefällt nicht"
-#: ../../Zotlabs/Module/Photos.php:1205
+#: ../../Zotlabs/Module/Photos.php:1207
msgid "Photo Tools"
msgstr "Fotowerkzeuge"
-#: ../../Zotlabs/Module/Photos.php:1214
+#: ../../Zotlabs/Module/Photos.php:1216
msgid "In This Photo:"
msgstr "Auf diesem Foto:"
-#: ../../Zotlabs/Module/Photos.php:1219
+#: ../../Zotlabs/Module/Photos.php:1221
msgid "Map"
msgstr "Karte"
-#: ../../Zotlabs/Module/Photos.php:1227 ../../Zotlabs/Lib/ThreadItem.php:401
+#: ../../Zotlabs/Module/Photos.php:1229 ../../Zotlabs/Lib/ThreadItem.php:399
msgctxt "noun"
msgid "Likes"
msgstr "Gefällt mir"
-#: ../../Zotlabs/Module/Photos.php:1228 ../../Zotlabs/Lib/ThreadItem.php:402
+#: ../../Zotlabs/Module/Photos.php:1230 ../../Zotlabs/Lib/ThreadItem.php:400
msgctxt "noun"
msgid "Dislikes"
msgstr "Gefällt nicht"
-#: ../../Zotlabs/Module/Photos.php:1233 ../../Zotlabs/Lib/ThreadItem.php:407
+#: ../../Zotlabs/Module/Photos.php:1235 ../../Zotlabs/Lib/ThreadItem.php:405
#: ../../include/acl_selectors.php:220
msgid "Close"
msgstr "Schließen"
-#: ../../Zotlabs/Module/Photos.php:1305 ../../Zotlabs/Module/Photos.php:1318
-#: ../../Zotlabs/Module/Photos.php:1319 ../../include/photos.php:529
+#: ../../Zotlabs/Module/Photos.php:1307 ../../Zotlabs/Module/Photos.php:1320
+#: ../../Zotlabs/Module/Photos.php:1321 ../../include/photos.php:526
msgid "Recent Photos"
msgstr "Neueste Fotos"
@@ -4552,163 +4763,169 @@ msgstr "Nicht gefunden"
msgid "Invalid channel"
msgstr "Ungültiger Kanal"
-#: ../../Zotlabs/Module/Wiki.php:160 ../../addon/gitwiki/Mod_Gitwiki.php:146
-#: ../../include/conversation.php:1854 ../../include/nav.php:462
+#: ../../Zotlabs/Module/Wiki.php:79 ../../Zotlabs/Lib/Apps.php:239
+#: ../../include/conversation.php:1854 ../../include/features.php:95
+#: ../../include/nav.php:451
+msgid "Wiki"
+msgstr "Wiki"
+
+#: ../../Zotlabs/Module/Wiki.php:162 ../../addon/gitwiki/Mod_Gitwiki.php:146
+#: ../../include/conversation.php:1851 ../../include/nav.php:448
msgid "Wikis"
msgstr "Wikis"
-#: ../../Zotlabs/Module/Wiki.php:166 ../../addon/gitwiki/Mod_Gitwiki.php:152
+#: ../../Zotlabs/Module/Wiki.php:168 ../../addon/gitwiki/Mod_Gitwiki.php:152
msgid "Download"
msgstr "Herunterladen"
-#: ../../Zotlabs/Module/Wiki.php:168 ../../Zotlabs/Module/Chat.php:254
-#: ../../Zotlabs/Module/Profiles.php:834 ../../Zotlabs/Module/Manage.php:143
+#: ../../Zotlabs/Module/Wiki.php:170 ../../Zotlabs/Module/Chat.php:256
+#: ../../Zotlabs/Module/Profiles.php:834 ../../Zotlabs/Module/Manage.php:145
#: ../../addon/gitwiki/Mod_Gitwiki.php:154
msgid "Create New"
msgstr "Neu anlegen"
-#: ../../Zotlabs/Module/Wiki.php:170 ../../addon/gitwiki/Mod_Gitwiki.php:156
+#: ../../Zotlabs/Module/Wiki.php:172 ../../addon/gitwiki/Mod_Gitwiki.php:156
msgid "Wiki name"
msgstr "Name des Wiki"
-#: ../../Zotlabs/Module/Wiki.php:171 ../../addon/gitwiki/Mod_Gitwiki.php:157
+#: ../../Zotlabs/Module/Wiki.php:173 ../../addon/gitwiki/Mod_Gitwiki.php:157
msgid "Content type"
msgstr "Inhaltstyp"
-#: ../../Zotlabs/Module/Wiki.php:173 ../../Zotlabs/Storage/Browser.php:234
+#: ../../Zotlabs/Module/Wiki.php:175 ../../Zotlabs/Storage/Browser.php:235
#: ../../addon/gitwiki/Mod_Gitwiki.php:159
msgid "Type"
msgstr "Typ"
-#: ../../Zotlabs/Module/Wiki.php:180 ../../addon/gitwiki/Mod_Gitwiki.php:166
+#: ../../Zotlabs/Module/Wiki.php:182 ../../addon/gitwiki/Mod_Gitwiki.php:166
msgid "Create a status post for this wiki"
msgstr "Erzeuge einen Statusbeitrag für dieses Wiki"
-#: ../../Zotlabs/Module/Wiki.php:205 ../../addon/gitwiki/Mod_Gitwiki.php:185
+#: ../../Zotlabs/Module/Wiki.php:224 ../../addon/gitwiki/Mod_Gitwiki.php:185
msgid "Wiki not found"
msgstr "Wiki nicht gefunden"
-#: ../../Zotlabs/Module/Wiki.php:229 ../../addon/gitwiki/Mod_Gitwiki.php:210
+#: ../../Zotlabs/Module/Wiki.php:248 ../../addon/gitwiki/Mod_Gitwiki.php:210
msgid "Rename page"
msgstr "Seite umbenennen"
-#: ../../Zotlabs/Module/Wiki.php:233 ../../addon/gitwiki/Mod_Gitwiki.php:214
+#: ../../Zotlabs/Module/Wiki.php:258 ../../addon/gitwiki/Mod_Gitwiki.php:214
msgid "Error retrieving page content"
msgstr "Fehler beim Abrufen des Seiteninhalts"
-#: ../../Zotlabs/Module/Wiki.php:239
+#: ../../Zotlabs/Module/Wiki.php:264
msgid "New page"
msgstr "Neue Seite"
-#: ../../Zotlabs/Module/Wiki.php:263 ../../addon/gitwiki/Mod_Gitwiki.php:242
+#: ../../Zotlabs/Module/Wiki.php:288 ../../addon/gitwiki/Mod_Gitwiki.php:242
msgid "Revision Comparison"
msgstr "Revisionsvergleich"
-#: ../../Zotlabs/Module/Wiki.php:264 ../../addon/gitwiki/Mod_Gitwiki.php:243
+#: ../../Zotlabs/Module/Wiki.php:289 ../../addon/gitwiki/Mod_Gitwiki.php:243
msgid "Revert"
msgstr "Rückgängig machen"
-#: ../../Zotlabs/Module/Wiki.php:268
+#: ../../Zotlabs/Module/Wiki.php:293
msgid "Short description of your changes (optional)"
msgstr "Kurze Beschreibung Ihrer Änderungen (optional)"
-#: ../../Zotlabs/Module/Wiki.php:275 ../../addon/gitwiki/Mod_Gitwiki.php:252
+#: ../../Zotlabs/Module/Wiki.php:300 ../../addon/gitwiki/Mod_Gitwiki.php:252
msgid "Source"
msgstr "Quelle"
-#: ../../Zotlabs/Module/Wiki.php:283 ../../addon/gitwiki/Mod_Gitwiki.php:260
+#: ../../Zotlabs/Module/Wiki.php:309 ../../addon/gitwiki/Mod_Gitwiki.php:260
msgid "New page name"
msgstr "Neuer Seitenname"
-#: ../../Zotlabs/Module/Wiki.php:288 ../../addon/gitwiki/Mod_Gitwiki.php:265
-#: ../../include/conversation.php:1232
+#: ../../Zotlabs/Module/Wiki.php:314 ../../addon/gitwiki/Mod_Gitwiki.php:265
+#: ../../include/conversation.php:1229
msgid "Embed image from photo albums"
msgstr "Bild aus Fotoalben einbetten"
-#: ../../Zotlabs/Module/Wiki.php:289 ../../addon/gitwiki/Mod_Gitwiki.php:266
-#: ../../include/conversation.php:1326
+#: ../../Zotlabs/Module/Wiki.php:315 ../../addon/gitwiki/Mod_Gitwiki.php:266
+#: ../../include/conversation.php:1323
msgid "Embed an image from your albums"
msgstr "Betten Sie ein Bild aus Ihren Alben ein"
-#: ../../Zotlabs/Module/Wiki.php:291 ../../addon/gitwiki/Mod_Gitwiki.php:268
-#: ../../include/conversation.php:1328 ../../include/conversation.php:1375
+#: ../../Zotlabs/Module/Wiki.php:317 ../../addon/gitwiki/Mod_Gitwiki.php:268
+#: ../../include/conversation.php:1325 ../../include/conversation.php:1372
msgid "OK"
msgstr "Ok"
-#: ../../Zotlabs/Module/Wiki.php:292 ../../addon/gitwiki/Mod_Gitwiki.php:269
-#: ../../include/conversation.php:1268
+#: ../../Zotlabs/Module/Wiki.php:318 ../../addon/gitwiki/Mod_Gitwiki.php:269
+#: ../../include/conversation.php:1265
msgid "Choose images to embed"
msgstr "Wählen Sie Bilder zum Einbetten aus"
-#: ../../Zotlabs/Module/Wiki.php:293 ../../addon/gitwiki/Mod_Gitwiki.php:270
-#: ../../include/conversation.php:1269
+#: ../../Zotlabs/Module/Wiki.php:319 ../../addon/gitwiki/Mod_Gitwiki.php:270
+#: ../../include/conversation.php:1266
msgid "Choose an album"
msgstr "Wählen Sie ein Album aus"
-#: ../../Zotlabs/Module/Wiki.php:294 ../../addon/gitwiki/Mod_Gitwiki.php:271
+#: ../../Zotlabs/Module/Wiki.php:320 ../../addon/gitwiki/Mod_Gitwiki.php:271
msgid "Choose a different album"
msgstr "Wählen Sie ein anderes Album aus"
-#: ../../Zotlabs/Module/Wiki.php:295 ../../addon/gitwiki/Mod_Gitwiki.php:272
-#: ../../include/conversation.php:1271
+#: ../../Zotlabs/Module/Wiki.php:321 ../../addon/gitwiki/Mod_Gitwiki.php:272
+#: ../../include/conversation.php:1268
msgid "Error getting album list"
msgstr "Fehler beim Holen der Albenliste"
-#: ../../Zotlabs/Module/Wiki.php:296 ../../addon/gitwiki/Mod_Gitwiki.php:273
-#: ../../include/conversation.php:1272
+#: ../../Zotlabs/Module/Wiki.php:322 ../../addon/gitwiki/Mod_Gitwiki.php:273
+#: ../../include/conversation.php:1269
msgid "Error getting photo link"
msgstr "Fehler beim Holen des Fotolinks"
-#: ../../Zotlabs/Module/Wiki.php:297 ../../addon/gitwiki/Mod_Gitwiki.php:274
-#: ../../include/conversation.php:1273
+#: ../../Zotlabs/Module/Wiki.php:323 ../../addon/gitwiki/Mod_Gitwiki.php:274
+#: ../../include/conversation.php:1270
msgid "Error getting album"
msgstr "Fehler beim Holen des Albums"
-#: ../../Zotlabs/Module/Wiki.php:364 ../../addon/gitwiki/Mod_Gitwiki.php:337
+#: ../../Zotlabs/Module/Wiki.php:391 ../../addon/gitwiki/Mod_Gitwiki.php:337
msgid "Error creating wiki. Invalid name."
msgstr "Fehler beim Erstellen des Wiki. Ungültiger Name."
-#: ../../Zotlabs/Module/Wiki.php:371
+#: ../../Zotlabs/Module/Wiki.php:398
msgid "A wiki with this name already exists."
msgstr "Es existiert bereits ein Wiki mit diesem Namen."
-#: ../../Zotlabs/Module/Wiki.php:384 ../../addon/gitwiki/Mod_Gitwiki.php:348
+#: ../../Zotlabs/Module/Wiki.php:411 ../../addon/gitwiki/Mod_Gitwiki.php:348
msgid "Wiki created, but error creating Home page."
msgstr "Das Wiki wurde erzeugt, aber es gab einen Fehler bei der Erstellung der Startseite"
-#: ../../Zotlabs/Module/Wiki.php:391 ../../addon/gitwiki/Mod_Gitwiki.php:353
+#: ../../Zotlabs/Module/Wiki.php:418 ../../addon/gitwiki/Mod_Gitwiki.php:353
msgid "Error creating wiki"
msgstr "Fehler beim Erstellen des Wiki"
-#: ../../Zotlabs/Module/Wiki.php:403
+#: ../../Zotlabs/Module/Wiki.php:430
msgid "Wiki delete permission denied."
msgstr "Wiki-Löschberechtigung verweigert."
-#: ../../Zotlabs/Module/Wiki.php:413
+#: ../../Zotlabs/Module/Wiki.php:440
msgid "Error deleting wiki"
msgstr "Fehler beim Löschen des Wiki"
-#: ../../Zotlabs/Module/Wiki.php:439 ../../addon/gitwiki/Mod_Gitwiki.php:400
+#: ../../Zotlabs/Module/Wiki.php:466 ../../addon/gitwiki/Mod_Gitwiki.php:400
msgid "New page created"
msgstr "Neue Seite erstellt"
-#: ../../Zotlabs/Module/Wiki.php:558
+#: ../../Zotlabs/Module/Wiki.php:587
msgid "Cannot delete Home"
msgstr "Kann die Startseite nicht löschen"
-#: ../../Zotlabs/Module/Wiki.php:622
+#: ../../Zotlabs/Module/Wiki.php:651
msgid "Current Revision"
msgstr "Aktuelle Revision"
-#: ../../Zotlabs/Module/Wiki.php:622
+#: ../../Zotlabs/Module/Wiki.php:651
msgid "Selected Revision"
msgstr "Ausgewählte Revision"
-#: ../../Zotlabs/Module/Wiki.php:672
+#: ../../Zotlabs/Module/Wiki.php:701
msgid "You must be authenticated."
msgstr "Sie müssen authenzifiziert sein."
-#: ../../Zotlabs/Module/Chanview.php:134
+#: ../../Zotlabs/Module/Chanview.php:139
msgid "toggle full screen mode"
msgstr "auf Vollbildmodus umschalten"
@@ -4716,7 +4933,7 @@ msgstr "auf Vollbildmodus umschalten"
msgid "Layout updated."
msgstr "Layout aktualisiert."
-#: ../../Zotlabs/Module/Pdledit.php:34 ../../Zotlabs/Module/Chat.php:217
+#: ../../Zotlabs/Module/Pdledit.php:34 ../../Zotlabs/Module/Chat.php:219
msgid "Feature disabled."
msgstr "Funktion deaktiviert."
@@ -4736,32 +4953,32 @@ msgstr "Modulname:"
msgid "Layout Help"
msgstr "Layout-Hilfe"
-#: ../../Zotlabs/Module/Poke.php:168 ../../Zotlabs/Lib/Apps.php:235
-#: ../../include/conversation.php:1042
+#: ../../Zotlabs/Module/Poke.php:153 ../../Zotlabs/Module/Poke.php:182
+#: ../../Zotlabs/Lib/Apps.php:248 ../../include/conversation.php:1039
msgid "Poke"
msgstr "Anstupsen"
-#: ../../Zotlabs/Module/Poke.php:169
+#: ../../Zotlabs/Module/Poke.php:183
msgid "Poke somebody"
msgstr "Jemanden anstupsen"
-#: ../../Zotlabs/Module/Poke.php:172
+#: ../../Zotlabs/Module/Poke.php:186
msgid "Poke/Prod"
msgstr "Anstupsen/Knuffen"
-#: ../../Zotlabs/Module/Poke.php:173
+#: ../../Zotlabs/Module/Poke.php:187
msgid "Poke, prod or do other things to somebody"
msgstr "Jemanden anstupsen, knuffen oder sonstiges"
-#: ../../Zotlabs/Module/Poke.php:180
+#: ../../Zotlabs/Module/Poke.php:194
msgid "Recipient"
msgstr "Empfänger"
-#: ../../Zotlabs/Module/Poke.php:181
+#: ../../Zotlabs/Module/Poke.php:195
msgid "Choose what you wish to do to recipient"
msgstr "Wähle, was Du mit dem/r Empfänger/in tun willst"
-#: ../../Zotlabs/Module/Poke.php:184 ../../Zotlabs/Module/Poke.php:185
+#: ../../Zotlabs/Module/Poke.php:198 ../../Zotlabs/Module/Poke.php:199
msgid "Make this post private"
msgstr "Diesen Beitrag privat machen"
@@ -4772,7 +4989,7 @@ msgstr "Bild hochgeladen, aber das Zurechtschneiden schlug fehl."
#: ../../Zotlabs/Module/Profile_photo.php:115
#: ../../Zotlabs/Module/Profile_photo.php:226
-#: ../../include/photo/photo_driver.php:647
+#: ../../include/photo/photo_driver.php:658
msgid "Profile Photos"
msgstr "Profilfotos"
@@ -4789,7 +5006,7 @@ msgid ""
msgstr "Leere den Browser Cache oder nutze Umschalten-Neu Laden, falls das neue Foto nicht sofort angezeigt wird."
#: ../../Zotlabs/Module/Profile_photo.php:203
-#: ../../Zotlabs/Module/Cover_photo.php:173 ../../include/photos.php:149
+#: ../../Zotlabs/Module/Cover_photo.php:173 ../../include/photos.php:145
msgid "Unable to process image"
msgstr "Kann Bild nicht verarbeiten"
@@ -4871,64 +5088,68 @@ msgstr "Online"
msgid "Unable to locate original post."
msgstr "Originalbeitrag nicht gefunden."
-#: ../../Zotlabs/Module/Item.php:451
+#: ../../Zotlabs/Module/Item.php:470
msgid "Empty post discarded."
msgstr "Leeren Beitrag verworfen."
-#: ../../Zotlabs/Module/Item.php:825
+#: ../../Zotlabs/Module/Item.php:844
msgid "Duplicate post suppressed."
msgstr "Doppelter Beitrag unterdrückt."
-#: ../../Zotlabs/Module/Item.php:955
+#: ../../Zotlabs/Module/Item.php:989
msgid "System error. Post not saved."
msgstr "Systemfehler. Beitrag nicht gespeichert."
-#: ../../Zotlabs/Module/Item.php:1085
+#: ../../Zotlabs/Module/Item.php:1025
+msgid "Your comment is awaiting approval."
+msgstr "Dein Kommentar muss noch bestätigt werden."
+
+#: ../../Zotlabs/Module/Item.php:1123
msgid "Unable to obtain post information from database."
msgstr "Beitragsinformationen können nicht aus der Datenbank abgerufen werden."
-#: ../../Zotlabs/Module/Item.php:1092
+#: ../../Zotlabs/Module/Item.php:1130
#, 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."
-#: ../../Zotlabs/Module/Item.php:1099
+#: ../../Zotlabs/Module/Item.php:1137
#, php-format
msgid "You have reached your limit of %1$.0f webpages."
msgstr "Du hast die maximale Anzahl von %1$.0f Webseiten erreicht."
-#: ../../Zotlabs/Module/Ping.php:254
+#: ../../Zotlabs/Module/Ping.php:280
msgid "sent you a private message"
msgstr "hat Dir eine private Nachricht geschickt"
-#: ../../Zotlabs/Module/Ping.php:302
+#: ../../Zotlabs/Module/Ping.php:331
msgid "added your channel"
msgstr "hat deinen Kanal hinzugefügt"
-#: ../../Zotlabs/Module/Ping.php:312
+#: ../../Zotlabs/Module/Ping.php:341
msgid "g A l F d"
msgstr "l, d. F, G:i \\U\\h\\r"
-#: ../../Zotlabs/Module/Ping.php:330
+#: ../../Zotlabs/Module/Ping.php:359
msgid "[today]"
msgstr "[Heute]"
-#: ../../Zotlabs/Module/Ping.php:339
+#: ../../Zotlabs/Module/Ping.php:368
msgid "posted an event"
msgstr "hat einen Termin veröffentlicht"
-#: ../../Zotlabs/Module/Page.php:40 ../../Zotlabs/Module/Block.php:31
+#: ../../Zotlabs/Module/Page.php:39 ../../Zotlabs/Module/Block.php:29
msgid "Invalid item."
msgstr "Ungültiges Element."
-#: ../../Zotlabs/Module/Page.php:94 ../../Zotlabs/Module/Block.php:79
+#: ../../Zotlabs/Module/Page.php:128 ../../Zotlabs/Module/Block.php:77
#: ../../Zotlabs/Module/Display.php:122
#: ../../Zotlabs/Lib/NativeWikiPage.php:500 ../../Zotlabs/Web/Router.php:146
#: ../../include/help.php:68
msgid "Page not found."
msgstr "Seite nicht gefunden."
-#: ../../Zotlabs/Module/Page.php:131
+#: ../../Zotlabs/Module/Page.php:165
msgid ""
"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod "
"tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam,"
@@ -4976,9 +5197,9 @@ msgstr "Konnte die Adressbuch-Parameter nicht setzen."
msgid "Connection has been removed."
msgstr "Verbindung wurde gelöscht."
-#: ../../Zotlabs/Module/Connedit.php:590 ../../Zotlabs/Lib/Apps.php:228
+#: ../../Zotlabs/Module/Connedit.php:590 ../../Zotlabs/Lib/Apps.php:241
#: ../../addon/openclipatar/openclipatar.php:57
-#: ../../include/conversation.php:982 ../../include/nav.php:106
+#: ../../include/conversation.php:979 ../../include/nav.php:102
msgid "View Profile"
msgstr "Profil ansehen"
@@ -5128,105 +5349,119 @@ msgstr "Profil festlegen"
msgid "Set Affinity & Profile"
msgstr "Beziehung und Profile festlegen"
-#: ../../Zotlabs/Module/Connedit.php:844
-msgid "none"
-msgstr "Keine"
+#: ../../Zotlabs/Module/Connedit.php:851
+msgid "This connection is unreachable from this location."
+msgstr "Diese Verbindung ist von diesem Ort unerreichbar."
+
+#: ../../Zotlabs/Module/Connedit.php:852
+msgid "This connection may be unreachable from other channel locations."
+msgstr "Diese Verbindung könnte von anderen Standpunkten des Kanals nicht erreichbar sein."
-#: ../../Zotlabs/Module/Connedit.php:847
-#: ../../Zotlabs/Widget/Settings_menu.php:107
+#: ../../Zotlabs/Module/Connedit.php:854
+msgid "Location independence is not supported by their network."
+msgstr "Standort Unabhängigkeit wird vom anderen Netzwerk nicht unterstützt."
+
+#: ../../Zotlabs/Module/Connedit.php:860
+msgid ""
+"This connection is unreachable from this location. Location independence is "
+"not supported by their network."
+msgstr "Diese Verbindung ist von diesem Standort aus unerreichbar. Standort Unabhängigkeit wird vom anderen Netzwerk nicht unterstützt."
+
+#: ../../Zotlabs/Module/Connedit.php:863
+#: ../../Zotlabs/Widget/Settings_menu.php:109
msgid "Connection Default Permissions"
msgstr "Standardzugriffsrechte für neue Verbindungen:"
-#: ../../Zotlabs/Module/Connedit.php:847 ../../include/items.php:3955
+#: ../../Zotlabs/Module/Connedit.php:863 ../../include/items.php:3925
#, php-format
msgid "Connection: %s"
msgstr "Verbindung: %s"
-#: ../../Zotlabs/Module/Connedit.php:848
+#: ../../Zotlabs/Module/Connedit.php:864
msgid "Apply these permissions automatically"
msgstr "Diese Berechtigungen automatisch anwenden"
-#: ../../Zotlabs/Module/Connedit.php:848
+#: ../../Zotlabs/Module/Connedit.php:864
msgid "Connection requests will be approved without your interaction"
msgstr "Verbindungsanfragen werden sofort bestätigt, ohne dass Deine aktive Zustimmung erforderlich ist."
-#: ../../Zotlabs/Module/Connedit.php:849
+#: ../../Zotlabs/Module/Connedit.php:865
msgid "Permission role"
msgstr "Berechtigungsrolle"
-#: ../../Zotlabs/Module/Connedit.php:850
+#: ../../Zotlabs/Module/Connedit.php:866
msgid "Add permission role"
msgstr "Berechtigungsrolle hinzufügen"
-#: ../../Zotlabs/Module/Connedit.php:856
+#: ../../Zotlabs/Module/Connedit.php:873
msgid "This connection's primary address is"
msgstr "Die Hauptadresse der Verbindung ist"
-#: ../../Zotlabs/Module/Connedit.php:857
+#: ../../Zotlabs/Module/Connedit.php:874
msgid "Available locations:"
msgstr "Verfügbare Klone:"
-#: ../../Zotlabs/Module/Connedit.php:861
+#: ../../Zotlabs/Module/Connedit.php:879
msgid ""
"The permissions indicated on this page will be applied to all new "
"connections."
msgstr "Die auf dieser Seite angegebenen Berechtigungen werden auf alle neuen Verbindungen angewendet."
-#: ../../Zotlabs/Module/Connedit.php:862
+#: ../../Zotlabs/Module/Connedit.php:880
msgid "Connection Tools"
msgstr "Verbindungswerkzeuge"
-#: ../../Zotlabs/Module/Connedit.php:864
+#: ../../Zotlabs/Module/Connedit.php:882
msgid "Slide to adjust your degree of friendship"
msgstr "Verschieben, um den Grad der Freundschaft zu einzustellen"
-#: ../../Zotlabs/Module/Connedit.php:865 ../../Zotlabs/Module/Rate.php:155
+#: ../../Zotlabs/Module/Connedit.php:883 ../../Zotlabs/Module/Rate.php:155
#: ../../include/js_strings.php:20
msgid "Rating"
msgstr "Bewertung"
-#: ../../Zotlabs/Module/Connedit.php:866
+#: ../../Zotlabs/Module/Connedit.php:884
msgid "Slide to adjust your rating"
msgstr "Verschieben, um Deine Bewertung einzustellen"
-#: ../../Zotlabs/Module/Connedit.php:867 ../../Zotlabs/Module/Connedit.php:872
+#: ../../Zotlabs/Module/Connedit.php:885 ../../Zotlabs/Module/Connedit.php:890
msgid "Optionally explain your rating"
msgstr "Optional kannst Du Deine Bewertung begründen"
-#: ../../Zotlabs/Module/Connedit.php:869
+#: ../../Zotlabs/Module/Connedit.php:887
msgid "Custom Filter"
msgstr "Benutzerdefinierter Filter"
-#: ../../Zotlabs/Module/Connedit.php:870
+#: ../../Zotlabs/Module/Connedit.php:888
msgid "Only import posts with this text"
msgstr "Nur Beiträge mit diesem Text importieren"
-#: ../../Zotlabs/Module/Connedit.php:870 ../../Zotlabs/Module/Connedit.php:871
+#: ../../Zotlabs/Module/Connedit.php:888 ../../Zotlabs/Module/Connedit.php:889
msgid ""
"words one per line or #tags or /patterns/ or lang=xx, leave blank to import "
"all posts"
msgstr "Einzelne Wörter pro Zeile, #Tags oder /Reguläre Ausdrücke/. lang=xx (z.B. lang=de) ermöglicht Filterung nach Sprache. Leer lassen, um alle Beiträge zu importieren."
-#: ../../Zotlabs/Module/Connedit.php:871
+#: ../../Zotlabs/Module/Connedit.php:889
msgid "Do not import posts with this text"
msgstr "Beiträge mit diesem Text nicht importieren"
-#: ../../Zotlabs/Module/Connedit.php:873
+#: ../../Zotlabs/Module/Connedit.php:891
msgid "This information is public!"
msgstr "Diese Information ist öffentlich!"
-#: ../../Zotlabs/Module/Connedit.php:878
+#: ../../Zotlabs/Module/Connedit.php:896
msgid "Connection Pending Approval"
msgstr "Verbindung wartet auf Bestätigung"
-#: ../../Zotlabs/Module/Connedit.php:883
+#: ../../Zotlabs/Module/Connedit.php:901
#, 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."
-#: ../../Zotlabs/Module/Connedit.php:890
+#: ../../Zotlabs/Module/Connedit.php:908
msgid ""
"Some permissions may be inherited from your channel's <a "
"href=\"settings\"><strong>privacy settings</strong></a>, which have higher "
@@ -5234,173 +5469,85 @@ msgid ""
"they wont have any impact unless the inherited setting changes."
msgstr "Einige Berechtigungen werden möglicherweise von den globalen <a href=\"settings\">Sicherheits- und Privatsphäre-Einstellungen</a> dieses Kanals geerbt. Diese haben eine höhere Priorität als die Einstellungen an der Verbindung. Werden geerbte Einstellungen hier geändert, hat dies keine Auswirkungen."
-#: ../../Zotlabs/Module/Connedit.php:891
+#: ../../Zotlabs/Module/Connedit.php:909
msgid "Last update:"
msgstr "Letzte Aktualisierung:"
-#: ../../Zotlabs/Module/Connedit.php:900
+#: ../../Zotlabs/Module/Connedit.php:918
msgid "Details"
msgstr "Details"
-#: ../../Zotlabs/Module/Connedit.php:903 ../../addon/cdav/Mod_Cdav.php:1137
-msgid "Organisation"
-msgstr "Organisation"
-
-#: ../../Zotlabs/Module/Connedit.php:904 ../../addon/cdav/Mod_Cdav.php:1138
-#: ../../include/page_widgets.php:46
-msgid "Title"
-msgstr "Titel"
-
-#: ../../Zotlabs/Module/Connedit.php:905 ../../Zotlabs/Module/Profiles.php:789
-#: ../../addon/cdav/Mod_Cdav.php:1139
-msgid "Phone"
-msgstr "Telefon"
-
-#: ../../Zotlabs/Module/Connedit.php:907 ../../Zotlabs/Module/Profiles.php:791
-#: ../../addon/cdav/Mod_Cdav.php:1141
-msgid "Instant messenger"
-msgstr "Sofortnachrichtendienst"
-
-#: ../../Zotlabs/Module/Connedit.php:908 ../../Zotlabs/Module/Profiles.php:792
-#: ../../addon/cdav/Mod_Cdav.php:1142
-msgid "Website"
-msgstr "Webseite"
-
-#: ../../Zotlabs/Module/Connedit.php:910 ../../Zotlabs/Module/Profiles.php:794
-#: ../../addon/cdav/Mod_Cdav.php:1144
-msgid "Note"
-msgstr "Hinweis"
-
-#: ../../Zotlabs/Module/Connedit.php:911 ../../Zotlabs/Module/Profiles.php:795
-#: ../../addon/cdav/Mod_Cdav.php:1145 ../../addon/cdav/cdav.php:270
-#: ../../include/connections.php:668
-msgid "Mobile"
-msgstr "Mobil"
-
-#: ../../Zotlabs/Module/Connedit.php:912 ../../Zotlabs/Module/Profiles.php:796
-#: ../../addon/cdav/Mod_Cdav.php:1146 ../../addon/cdav/cdav.php:271
-#: ../../include/connections.php:669
-msgid "Home"
-msgstr "Home"
-
-#: ../../Zotlabs/Module/Connedit.php:913 ../../Zotlabs/Module/Profiles.php:797
-#: ../../addon/cdav/Mod_Cdav.php:1147 ../../addon/cdav/cdav.php:274
-#: ../../include/connections.php:672
-msgid "Work"
-msgstr "Arbeit"
-
-#: ../../Zotlabs/Module/Connedit.php:915 ../../Zotlabs/Module/Profiles.php:799
-#: ../../addon/cdav/Mod_Cdav.php:1149
-#: ../../addon/jappixmini/jappixmini.php:368
-msgid "Add Contact"
-msgstr "Kontakt hinzufügen"
-
-#: ../../Zotlabs/Module/Connedit.php:916 ../../Zotlabs/Module/Profiles.php:800
-#: ../../addon/cdav/Mod_Cdav.php:1150
-msgid "Add Field"
-msgstr "Feld hinzufügen"
-
-#: ../../Zotlabs/Module/Connedit.php:921 ../../addon/cdav/Mod_Cdav.php:1155
-msgid "P.O. Box"
-msgstr "Postfach"
-
-#: ../../Zotlabs/Module/Connedit.php:922 ../../addon/cdav/Mod_Cdav.php:1156
-msgid "Additional"
-msgstr "Zusätzlich"
-
-#: ../../Zotlabs/Module/Connedit.php:923 ../../addon/cdav/Mod_Cdav.php:1157
-msgid "Street"
-msgstr "Straße"
-
-#: ../../Zotlabs/Module/Connedit.php:924 ../../addon/cdav/Mod_Cdav.php:1158
-msgid "Locality"
-msgstr "Ortschaft"
-
-#: ../../Zotlabs/Module/Connedit.php:925 ../../addon/cdav/Mod_Cdav.php:1159
-msgid "Region"
-msgstr "Region"
-
-#: ../../Zotlabs/Module/Connedit.php:926 ../../addon/cdav/Mod_Cdav.php:1160
-msgid "ZIP Code"
-msgstr "Postleitzahl"
-
-#: ../../Zotlabs/Module/Connedit.php:927 ../../Zotlabs/Module/Profiles.php:760
-#: ../../addon/cdav/Mod_Cdav.php:1161
-msgid "Country"
-msgstr "Land"
+#: ../../Zotlabs/Module/Chat.php:94 ../../Zotlabs/Lib/Apps.php:228
+msgid "My Chatrooms"
+msgstr "Meine Chaträume"
-#: ../../Zotlabs/Module/Chat.php:179
+#: ../../Zotlabs/Module/Chat.php:181
msgid "Room not found"
msgstr "Chatraum nicht gefunden"
-#: ../../Zotlabs/Module/Chat.php:195
+#: ../../Zotlabs/Module/Chat.php:197
msgid "Leave Room"
msgstr "Raum verlassen"
-#: ../../Zotlabs/Module/Chat.php:196
+#: ../../Zotlabs/Module/Chat.php:198
msgid "Delete Room"
msgstr "Raum löschen"
-#: ../../Zotlabs/Module/Chat.php:197
+#: ../../Zotlabs/Module/Chat.php:199
msgid "I am away right now"
msgstr "Ich bin gerade nicht da"
-#: ../../Zotlabs/Module/Chat.php:198
+#: ../../Zotlabs/Module/Chat.php:200
msgid "I am online"
msgstr "Ich bin online"
-#: ../../Zotlabs/Module/Chat.php:200
+#: ../../Zotlabs/Module/Chat.php:202
msgid "Bookmark this room"
msgstr "Lesezeichen für diesen Raum setzen"
-#: ../../Zotlabs/Module/Chat.php:203 ../../Zotlabs/Module/Mail.php:259
-#: ../../Zotlabs/Module/Mail.php:380 ../../include/conversation.php:1263
+#: ../../Zotlabs/Module/Chat.php:205 ../../Zotlabs/Module/Mail.php:241
+#: ../../Zotlabs/Module/Mail.php:362 ../../include/conversation.php:1260
msgid "Please enter a link URL:"
msgstr "Gib eine URL ein:"
-#: ../../Zotlabs/Module/Chat.php:204 ../../Zotlabs/Module/Mail.php:312
-#: ../../Zotlabs/Module/Mail.php:454 ../../Zotlabs/Lib/ThreadItem.php:744
-#: ../../include/conversation.php:1373
+#: ../../Zotlabs/Module/Chat.php:206 ../../Zotlabs/Module/Mail.php:294
+#: ../../Zotlabs/Module/Mail.php:436 ../../Zotlabs/Lib/ThreadItem.php:742
+#: ../../include/conversation.php:1370
msgid "Encrypt text"
msgstr "Text verschlüsseln"
-#: ../../Zotlabs/Module/Chat.php:230
+#: ../../Zotlabs/Module/Chat.php:232
msgid "New Chatroom"
msgstr "Neuer Chatraum"
-#: ../../Zotlabs/Module/Chat.php:231
+#: ../../Zotlabs/Module/Chat.php:233
msgid "Chatroom name"
msgstr "Chatraumname"
-#: ../../Zotlabs/Module/Chat.php:232
+#: ../../Zotlabs/Module/Chat.php:234
msgid "Expiration of chats (minutes)"
msgstr "Verfall von Chats (Minuten)"
-#: ../../Zotlabs/Module/Chat.php:248
+#: ../../Zotlabs/Module/Chat.php:250
#, php-format
msgid "%1$s's Chatrooms"
msgstr "%1$ss Chaträume"
-#: ../../Zotlabs/Module/Chat.php:253
+#: ../../Zotlabs/Module/Chat.php:255
msgid "No chatrooms available"
msgstr "Keine Chaträume verfügbar"
-#: ../../Zotlabs/Module/Chat.php:257
+#: ../../Zotlabs/Module/Chat.php:259
msgid "Expiration"
msgstr "Verfall"
-#: ../../Zotlabs/Module/Chat.php:258
+#: ../../Zotlabs/Module/Chat.php:260
msgid "min"
msgstr "min"
-#: ../../Zotlabs/Module/Fbrowser.php:29 ../../Zotlabs/Lib/Apps.php:229
-#: ../../include/conversation.php:1783 ../../include/nav.php:392
-msgid "Photos"
-msgstr "Fotos"
-
-#: ../../Zotlabs/Module/Fbrowser.php:85 ../../Zotlabs/Lib/Apps.php:224
-#: ../../Zotlabs/Storage/Browser.php:224 ../../include/conversation.php:1791
-#: ../../include/nav.php:400
+#: ../../Zotlabs/Module/Fbrowser.php:85 ../../Zotlabs/Lib/Apps.php:237
+#: ../../Zotlabs/Storage/Browser.php:225 ../../Zotlabs/Storage/Browser.php:247
+#: ../../include/conversation.php:1788 ../../include/nav.php:386
msgid "Files"
msgstr "Dateien"
@@ -5440,7 +5587,7 @@ msgstr "Im Menü können gespeicherte Lesezeichen abgelegt werden"
msgid "Submit and proceed"
msgstr "Absenden und fortfahren"
-#: ../../Zotlabs/Module/Menu.php:107 ../../include/text.php:2268
+#: ../../Zotlabs/Module/Menu.php:107 ../../include/text.php:2281
msgid "Menus"
msgstr "Menüs"
@@ -5492,13 +5639,14 @@ msgstr "Menü Titel wie er von anderen gesehen wird"
msgid "Allow bookmarks"
msgstr "Erlaube Lesezeichen"
-#: ../../Zotlabs/Module/Layouts.php:184 ../../include/text.php:2269
+#: ../../Zotlabs/Module/Layouts.php:184 ../../include/text.php:2282
msgid "Layouts"
msgstr "Layouts"
-#: ../../Zotlabs/Module/Layouts.php:186 ../../Zotlabs/Lib/Apps.php:232
-#: ../../include/nav.php:161 ../../include/nav.php:268
-#: ../../include/help.php:55 ../../include/help.php:61
+#: ../../Zotlabs/Module/Layouts.php:186 ../../Zotlabs/Module/Help.php:18
+#: ../../Zotlabs/Lib/Apps.php:245 ../../include/nav.php:157
+#: ../../include/nav.php:264 ../../include/help.php:55
+#: ../../include/help.php:61
msgid "Help"
msgstr "Hilfe"
@@ -5514,12 +5662,13 @@ msgstr "Layout-Beschreibung"
msgid "Download PDL file"
msgstr "PDL-Datei herunterladen"
-#: ../../Zotlabs/Module/Tagger.php:55 ../../include/bbcode.php:274
+#: ../../Zotlabs/Module/Tagger.php:55 ../../include/markdown.php:141
+#: ../../include/bbcode.php:334
msgid "post"
msgstr "Beitrag"
#: ../../Zotlabs/Module/Tagger.php:57 ../../include/conversation.php:146
-#: ../../include/text.php:1945
+#: ../../include/text.php:1938
msgid "comment"
msgstr "Kommentar"
@@ -5551,8 +5700,8 @@ msgstr "Gruppe wurde erstellt."
msgid "Could not create privacy group."
msgstr "Gruppe konnte nicht erstellt werden."
-#: ../../Zotlabs/Module/Group.php:42 ../../Zotlabs/Module/Group.php:141
-#: ../../include/items.php:3922
+#: ../../Zotlabs/Module/Group.php:42 ../../Zotlabs/Module/Group.php:143
+#: ../../include/items.php:3892
msgid "Privacy group not found."
msgstr "Gruppe nicht gefunden."
@@ -5560,39 +5709,39 @@ msgstr "Gruppe nicht gefunden."
msgid "Privacy group updated."
msgstr "Gruppe wurde aktualisiert."
-#: ../../Zotlabs/Module/Group.php:90
+#: ../../Zotlabs/Module/Group.php:92
msgid "Create a group of channels."
msgstr "Erstelle eine Gruppe für Kanäle."
-#: ../../Zotlabs/Module/Group.php:91 ../../Zotlabs/Module/Group.php:184
+#: ../../Zotlabs/Module/Group.php:93 ../../Zotlabs/Module/Group.php:186
msgid "Privacy group name: "
msgstr "Gruppenname:"
-#: ../../Zotlabs/Module/Group.php:93 ../../Zotlabs/Module/Group.php:187
+#: ../../Zotlabs/Module/Group.php:95 ../../Zotlabs/Module/Group.php:189
msgid "Members are visible to other channels"
msgstr "Mitglieder sind sichtbar für andere Kanäle"
-#: ../../Zotlabs/Module/Group.php:111
+#: ../../Zotlabs/Module/Group.php:113
msgid "Privacy group removed."
msgstr "Gruppe wurde entfernt."
-#: ../../Zotlabs/Module/Group.php:113
+#: ../../Zotlabs/Module/Group.php:115
msgid "Unable to remove privacy group."
msgstr "Gruppe konnte nicht entfernt werden."
-#: ../../Zotlabs/Module/Group.php:183
+#: ../../Zotlabs/Module/Group.php:185
msgid "Privacy group editor"
msgstr "Gruppeneditor"
-#: ../../Zotlabs/Module/Group.php:197 ../../Zotlabs/Module/Help.php:81
+#: ../../Zotlabs/Module/Group.php:199 ../../Zotlabs/Module/Help.php:81
msgid "Members"
msgstr "Mitglieder"
-#: ../../Zotlabs/Module/Group.php:199
+#: ../../Zotlabs/Module/Group.php:201
msgid "All Connected Channels"
msgstr "Alle verbundenen Kanäle"
-#: ../../Zotlabs/Module/Group.php:231
+#: ../../Zotlabs/Module/Group.php:233
msgid "Click on a channel to add or remove."
msgstr "Wähle einen Kanal zum hinzufügen oder entfernen aus."
@@ -5687,7 +5836,7 @@ msgid "View this profile"
msgstr "Dieses Profil ansehen"
#: ../../Zotlabs/Module/Profiles.php:728 ../../Zotlabs/Module/Profiles.php:827
-#: ../../include/channel.php:1066
+#: ../../include/channel.php:1183
msgid "Edit visibility"
msgstr "Sichtbarkeit bearbeiten"
@@ -5699,7 +5848,7 @@ msgstr "Profilwerkzeuge"
msgid "Change cover photo"
msgstr "Titelbild ändern"
-#: ../../Zotlabs/Module/Profiles.php:731 ../../include/channel.php:1037
+#: ../../Zotlabs/Module/Profiles.php:731 ../../include/channel.php:1154
msgid "Change profile photo"
msgstr "Profilfoto ändern"
@@ -5719,7 +5868,7 @@ msgstr "Dieses Profil löschen"
msgid "Add profile things"
msgstr "Sachen zum Profil hinzufügen"
-#: ../../Zotlabs/Module/Profiles.php:736 ../../include/conversation.php:1657
+#: ../../Zotlabs/Module/Profiles.php:736 ../../include/conversation.php:1654
msgid "Personal"
msgstr "Persönlich"
@@ -5864,12 +6013,12 @@ msgstr "Meine anderen Kanäle"
msgid "Communications"
msgstr "Kommunikation"
-#: ../../Zotlabs/Module/Profiles.php:823 ../../include/channel.php:1062
+#: ../../Zotlabs/Module/Profiles.php:823 ../../include/channel.php:1179
msgid "Profile Image"
msgstr "Profilfoto:"
-#: ../../Zotlabs/Module/Profiles.php:833 ../../include/channel.php:1044
-#: ../../include/nav.php:109
+#: ../../Zotlabs/Module/Profiles.php:833 ../../include/channel.php:1161
+#: ../../include/nav.php:105
msgid "Edit Profiles"
msgstr "Profile bearbeiten"
@@ -5881,42 +6030,42 @@ msgstr "Seiten-Link"
msgid "Edit Webpage"
msgstr "Webseite bearbeiten"
-#: ../../Zotlabs/Module/Manage.php:143
+#: ../../Zotlabs/Module/Manage.php:145
msgid "Create a new channel"
msgstr "Neuen Kanal anlegen"
-#: ../../Zotlabs/Module/Manage.php:168 ../../Zotlabs/Lib/Apps.php:221
-#: ../../include/nav.php:205
+#: ../../Zotlabs/Module/Manage.php:170 ../../Zotlabs/Lib/Apps.php:234
+#: ../../include/nav.php:199
msgid "Channel Manager"
msgstr "Kanal-Manager"
-#: ../../Zotlabs/Module/Manage.php:169
+#: ../../Zotlabs/Module/Manage.php:171
msgid "Current Channel"
msgstr "Aktueller Kanal"
-#: ../../Zotlabs/Module/Manage.php:171
+#: ../../Zotlabs/Module/Manage.php:173
msgid "Switch to one of your channels by selecting it."
msgstr "Wechsle zu einem Deiner Kanäle, indem Du auf ihn klickst."
-#: ../../Zotlabs/Module/Manage.php:172
+#: ../../Zotlabs/Module/Manage.php:174
msgid "Default Channel"
msgstr "Standard Kanal"
-#: ../../Zotlabs/Module/Manage.php:173
+#: ../../Zotlabs/Module/Manage.php:175
msgid "Make Default"
msgstr "Zum Standard machen"
-#: ../../Zotlabs/Module/Manage.php:176
+#: ../../Zotlabs/Module/Manage.php:178
#, php-format
msgid "%d new messages"
msgstr "%d neue Nachrichten"
-#: ../../Zotlabs/Module/Manage.php:177
+#: ../../Zotlabs/Module/Manage.php:179
#, php-format
msgid "%d new introductions"
msgstr "%d neue Vorstellungen"
-#: ../../Zotlabs/Module/Manage.php:179
+#: ../../Zotlabs/Module/Manage.php:181
msgid "Delegated Channel"
msgstr "Delegierte Kanäle"
@@ -5924,45 +6073,45 @@ msgstr "Delegierte Kanäle"
msgid "This directory server requires an access token"
msgstr "Dieser Verzeichnisserver benötigt einen Zugriffstoken"
-#: ../../Zotlabs/Module/Siteinfo.php:20
+#: ../../Zotlabs/Module/Siteinfo.php:19
msgid "About this site"
msgstr "Über diese Seite"
-#: ../../Zotlabs/Module/Siteinfo.php:21
+#: ../../Zotlabs/Module/Siteinfo.php:20
msgid "Site Name"
msgstr "Seitenname"
-#: ../../Zotlabs/Module/Siteinfo.php:25 ../../include/network.php:2025
+#: ../../Zotlabs/Module/Siteinfo.php:24
msgid "Administrator"
msgstr "Administrator"
-#: ../../Zotlabs/Module/Siteinfo.php:27 ../../Zotlabs/Module/Register.php:221
+#: ../../Zotlabs/Module/Siteinfo.php:26 ../../Zotlabs/Module/Register.php:221
msgid "Terms of Service"
msgstr "Nutzungsbedingungen"
-#: ../../Zotlabs/Module/Siteinfo.php:28
+#: ../../Zotlabs/Module/Siteinfo.php:27
msgid "Software and Project information"
msgstr "Software und Projektinformationen"
-#: ../../Zotlabs/Module/Siteinfo.php:29
+#: ../../Zotlabs/Module/Siteinfo.php:28
msgid "This site is powered by $Projectname"
msgstr "Diese Website wird bereitgestellt durch $Projectname"
-#: ../../Zotlabs/Module/Siteinfo.php:30
+#: ../../Zotlabs/Module/Siteinfo.php:29
msgid ""
"Federated and decentralised networking and identity services provided by Zot"
msgstr "Verbundene, dezentrale Netzwerk- und Identitätsdienste, ermöglicht mittels Zot"
-#: ../../Zotlabs/Module/Siteinfo.php:32
+#: ../../Zotlabs/Module/Siteinfo.php:31
#, php-format
msgid "Version %s"
msgstr "Version %s"
-#: ../../Zotlabs/Module/Siteinfo.php:33
+#: ../../Zotlabs/Module/Siteinfo.php:32
msgid "Project homepage"
msgstr "Projekt-Website"
-#: ../../Zotlabs/Module/Siteinfo.php:34
+#: ../../Zotlabs/Module/Siteinfo.php:33
msgid "Developer homepage"
msgstr "Entwickler-Website"
@@ -5971,7 +6120,7 @@ msgid "No ratings"
msgstr "Keine Bewertungen"
#: ../../Zotlabs/Module/Ratings.php:97 ../../Zotlabs/Module/Pubsites.php:35
-#: ../../include/conversation.php:1032
+#: ../../include/conversation.php:1029
msgid "Ratings"
msgstr "Bewertungen"
@@ -5987,64 +6136,65 @@ msgstr "Webseite: "
msgid "Description: "
msgstr "Beschreibung: "
-#: ../../Zotlabs/Module/Webpages.php:52
+#: ../../Zotlabs/Module/Webpages.php:38 ../../Zotlabs/Module/Webpages.php:237
+#: ../../Zotlabs/Lib/Apps.php:238 ../../include/conversation.php:1838
+#: ../../include/nav.php:435
+msgid "Webpages"
+msgstr "Webseiten"
+
+#: ../../Zotlabs/Module/Webpages.php:54
msgid "Import Webpage Elements"
msgstr "Webseitenelemente importieren"
-#: ../../Zotlabs/Module/Webpages.php:53
+#: ../../Zotlabs/Module/Webpages.php:55
msgid "Import selected"
msgstr "Import ausgewählt"
-#: ../../Zotlabs/Module/Webpages.php:76
+#: ../../Zotlabs/Module/Webpages.php:78
msgid "Export Webpage Elements"
msgstr "Webseitenelemente exportieren"
-#: ../../Zotlabs/Module/Webpages.php:77
+#: ../../Zotlabs/Module/Webpages.php:79
msgid "Export selected"
msgstr "Exportieren ausgewählt"
-#: ../../Zotlabs/Module/Webpages.php:242 ../../Zotlabs/Lib/Apps.php:225
-#: ../../include/conversation.php:1841 ../../include/nav.php:449
-msgid "Webpages"
-msgstr "Webseiten"
-
-#: ../../Zotlabs/Module/Webpages.php:253 ../../include/page_widgets.php:44
+#: ../../Zotlabs/Module/Webpages.php:248
msgid "Actions"
msgstr "Aktionen"
-#: ../../Zotlabs/Module/Webpages.php:254 ../../include/page_widgets.php:45
+#: ../../Zotlabs/Module/Webpages.php:249
msgid "Page Link"
msgstr "Seiten-Link"
-#: ../../Zotlabs/Module/Webpages.php:255
+#: ../../Zotlabs/Module/Webpages.php:250
msgid "Page Title"
msgstr "Seitentitel"
-#: ../../Zotlabs/Module/Webpages.php:285
+#: ../../Zotlabs/Module/Webpages.php:280
msgid "Invalid file type."
msgstr "Ungültiger Dateityp."
-#: ../../Zotlabs/Module/Webpages.php:297
+#: ../../Zotlabs/Module/Webpages.php:292
msgid "Error opening zip file"
msgstr "Fehler beim Öffnen der ZIP-Datei"
-#: ../../Zotlabs/Module/Webpages.php:308
+#: ../../Zotlabs/Module/Webpages.php:303
msgid "Invalid folder path."
msgstr "Ungültiger Ordnerpfad."
-#: ../../Zotlabs/Module/Webpages.php:335
+#: ../../Zotlabs/Module/Webpages.php:330
msgid "No webpage elements detected."
msgstr "Keine Webseitenelemente erkannt."
-#: ../../Zotlabs/Module/Webpages.php:410
+#: ../../Zotlabs/Module/Webpages.php:405
msgid "Import complete."
msgstr "Import abgeschlossen."
-#: ../../Zotlabs/Module/Editpost.php:38
+#: ../../Zotlabs/Module/Editpost.php:38 ../../Zotlabs/Module/Editpost.php:43
msgid "Item is not editable"
msgstr "Element kann nicht bearbeitet werden."
-#: ../../Zotlabs/Module/Editpost.php:103 ../../Zotlabs/Module/Rpost.php:138
+#: ../../Zotlabs/Module/Editpost.php:108 ../../Zotlabs/Module/Rpost.php:140
msgid "Edit post"
msgstr "Bearbeite Beitrag"
@@ -6130,7 +6280,7 @@ msgid "*"
msgstr "*"
#: ../../Zotlabs/Module/Sources.php:96
-#: ../../Zotlabs/Widget/Settings_menu.php:123 ../../include/features.php:213
+#: ../../Zotlabs/Widget/Settings_menu.php:125 ../../include/features.php:209
msgid "Channel Sources"
msgstr "Kanal-Quellen"
@@ -6186,6 +6336,10 @@ msgstr "Quelle gelöscht"
msgid "Unable to remove source."
msgstr "Konnte die Quelle nicht löschen."
+#: ../../Zotlabs/Module/Rpost.php:63 ../../Zotlabs/Lib/Apps.php:257
+msgid "Post"
+msgstr "Beitrag schreiben"
+
#: ../../Zotlabs/Module/Like.php:19
msgid "Like/Dislike"
msgstr "Mögen/Nicht mögen"
@@ -6221,55 +6375,59 @@ msgstr "Kanal nicht vorhanden."
msgid "Previous action reversed."
msgstr "Die vorherige Aktion wurde rückgängig gemacht."
-#: ../../Zotlabs/Module/Like.php:419 ../../addon/diaspora/inbound.php:1812
+#: ../../Zotlabs/Module/Like.php:423 ../../addon/diaspora/Receiver.php:1399
#: ../../include/conversation.php:160
#, php-format
msgid "%1$s likes %2$s's %3$s"
msgstr "%1$s gefällt %2$ss %3$s"
-#: ../../Zotlabs/Module/Like.php:421 ../../include/conversation.php:163
+#: ../../Zotlabs/Module/Like.php:425 ../../include/conversation.php:163
#, php-format
msgid "%1$s doesn't like %2$s's %3$s"
msgstr "%1$s gefällt %2$ss %3$s nicht"
-#: ../../Zotlabs/Module/Like.php:423
+#: ../../Zotlabs/Module/Like.php:427
#, php-format
msgid "%1$s agrees with %2$s's %3$s"
msgstr "%1$s stimmt %2$ss %3$s zu"
-#: ../../Zotlabs/Module/Like.php:425
+#: ../../Zotlabs/Module/Like.php:429
#, php-format
msgid "%1$s doesn't agree with %2$s's %3$s"
msgstr "%1$s lehnt %2$ss %3$s ab"
-#: ../../Zotlabs/Module/Like.php:427
+#: ../../Zotlabs/Module/Like.php:431
#, php-format
msgid "%1$s abstains from a decision on %2$s's %3$s"
msgstr "%1$s enthält sich zu %2$ss %3$s"
-#: ../../Zotlabs/Module/Like.php:429
+#: ../../Zotlabs/Module/Like.php:433
#, php-format
msgid "%1$s is attending %2$s's %3$s"
msgstr "%1$s nimmt an %2$ss %3$s teil"
-#: ../../Zotlabs/Module/Like.php:431
+#: ../../Zotlabs/Module/Like.php:435
#, php-format
msgid "%1$s is not attending %2$s's %3$s"
msgstr "%1$s nimmt an %2$ss %3$s nicht teil"
-#: ../../Zotlabs/Module/Like.php:433
+#: ../../Zotlabs/Module/Like.php:437
#, php-format
msgid "%1$s may attend %2$s's %3$s"
msgstr "%1$s nimmt vielleicht an %2$ss %3$s teil"
-#: ../../Zotlabs/Module/Like.php:538
+#: ../../Zotlabs/Module/Like.php:547
msgid "Action completed."
msgstr "Aktion durchgeführt."
-#: ../../Zotlabs/Module/Like.php:539
+#: ../../Zotlabs/Module/Like.php:548
msgid "Thank you."
msgstr "Vielen Dank."
+#: ../../Zotlabs/Module/Directory.php:80 ../../Zotlabs/Lib/Apps.php:244
+msgid "Directory"
+msgstr "Verzeichnis"
+
#: ../../Zotlabs/Module/Directory.php:245
#, php-format
msgid "%d rating"
@@ -6289,13 +6447,12 @@ msgstr "Status:"
msgid "Homepage: "
msgstr "Webseite:"
-#: ../../Zotlabs/Module/Directory.php:309 ../../include/channel.php:1293
+#: ../../Zotlabs/Module/Directory.php:309 ../../include/channel.php:1416
msgid "Age:"
msgstr "Alter:"
-#: ../../Zotlabs/Module/Directory.php:314 ../../include/markdown.php:560
-#: ../../include/channel.php:1134 ../../include/event.php:52
-#: ../../include/event.php:84
+#: ../../Zotlabs/Module/Directory.php:314 ../../include/channel.php:1251
+#: ../../include/event.php:52 ../../include/event.php:84
msgid "Location:"
msgstr "Ort:"
@@ -6303,18 +6460,18 @@ msgstr "Ort:"
msgid "Description:"
msgstr "Beschreibung:"
-#: ../../Zotlabs/Module/Directory.php:325 ../../include/channel.php:1309
+#: ../../Zotlabs/Module/Directory.php:325 ../../include/channel.php:1432
msgid "Hometown:"
msgstr "Heimatstadt:"
-#: ../../Zotlabs/Module/Directory.php:327 ../../include/channel.php:1317
+#: ../../Zotlabs/Module/Directory.php:327 ../../include/channel.php:1440
msgid "About:"
msgstr "Über:"
-#: ../../Zotlabs/Module/Directory.php:328 ../../Zotlabs/Module/Suggest.php:54
+#: ../../Zotlabs/Module/Directory.php:328 ../../Zotlabs/Module/Suggest.php:56
#: ../../Zotlabs/Widget/Follow.php:32 ../../Zotlabs/Widget/Suggestions.php:44
-#: ../../include/conversation.php:1002 ../../include/channel.php:1119
-#: ../../include/connections.php:110
+#: ../../include/conversation.php:999 ../../include/channel.php:1236
+#: ../../include/connections.php:111
msgid "Connect"
msgstr "Verbinden"
@@ -6346,7 +6503,7 @@ msgstr "Lokales Verzeichnis"
msgid "Finding:"
msgstr "Ergebnisse:"
-#: ../../Zotlabs/Module/Directory.php:395 ../../Zotlabs/Module/Suggest.php:62
+#: ../../Zotlabs/Module/Directory.php:395 ../../Zotlabs/Module/Suggest.php:64
#: ../../include/contact_widgets.php:24
msgid "Channel Suggestions"
msgstr "Kanal-Vorschläge"
@@ -6391,13 +6548,18 @@ msgstr "Xchan-Suche"
msgid "Lookup xchan beginning with (or webbie): "
msgstr "Nach xchans oder Webbies (Kanal-Adressen) suchen, die wie folgt beginnen:"
-#: ../../Zotlabs/Module/Suggest.php:37
+#: ../../Zotlabs/Module/Suggest.php:32 ../../Zotlabs/Lib/Apps.php:232
+#: ../../include/features.php:333
+msgid "Suggest Channels"
+msgstr "Kanäle vorschlagen"
+
+#: ../../Zotlabs/Module/Suggest.php:39
msgid ""
"No suggestions available. If this is a new site, please try again in 24 "
"hours."
msgstr "Keine Vorschläge vorhanden. Wenn das ein neuer Server ist, versuche es in 24 Stunden noch einmal."
-#: ../../Zotlabs/Module/Suggest.php:56 ../../Zotlabs/Widget/Suggestions.php:46
+#: ../../Zotlabs/Module/Suggest.php:58 ../../Zotlabs/Widget/Suggestions.php:46
msgid "Ignore/Hide"
msgstr "Ignorieren/Verstecken"
@@ -6409,103 +6571,108 @@ msgstr "Konnte Deinen Server nicht finden."
msgid "Post successful."
msgstr "Veröffentlichung erfolgreich."
-#: ../../Zotlabs/Module/Mail.php:65
+#: ../../Zotlabs/Module/Mail.php:73
msgid "Unable to lookup recipient."
msgstr "Konnte den Empfänger nicht finden."
-#: ../../Zotlabs/Module/Mail.php:72
+#: ../../Zotlabs/Module/Mail.php:80
msgid "Unable to communicate with requested channel."
msgstr "Die Kommunikation mit dem ausgewählten Kanal ist fehlgeschlagen."
-#: ../../Zotlabs/Module/Mail.php:79
+#: ../../Zotlabs/Module/Mail.php:87
msgid "Cannot verify requested channel."
msgstr "Verifizierung des angeforderten Kanals fehlgeschlagen."
-#: ../../Zotlabs/Module/Mail.php:97
+#: ../../Zotlabs/Module/Mail.php:105
msgid "Selected channel has private message restrictions. Send failed."
msgstr "Der ausgewählte Kanal hat Einschränkungen bzgl. privater Nachrichten. Senden fehlgeschlagen."
-#: ../../Zotlabs/Module/Mail.php:178
+#: ../../Zotlabs/Module/Mail.php:143 ../../Zotlabs/Lib/Apps.php:246
+#: ../../include/nav.php:187
+msgid "Mail"
+msgstr "Mail"
+
+#: ../../Zotlabs/Module/Mail.php:160
msgid "Messages"
msgstr "Nachrichten"
-#: ../../Zotlabs/Module/Mail.php:191
+#: ../../Zotlabs/Module/Mail.php:173
msgid "message"
msgstr "Nachricht"
-#: ../../Zotlabs/Module/Mail.php:232
+#: ../../Zotlabs/Module/Mail.php:214
msgid "Message recalled."
msgstr "Nachricht widerrufen."
-#: ../../Zotlabs/Module/Mail.php:245
+#: ../../Zotlabs/Module/Mail.php:227
msgid "Conversation removed."
msgstr "Unterhaltung gelöscht."
-#: ../../Zotlabs/Module/Mail.php:260 ../../Zotlabs/Module/Mail.php:381
+#: ../../Zotlabs/Module/Mail.php:242 ../../Zotlabs/Module/Mail.php:363
msgid "Expires YYYY-MM-DD HH:MM"
msgstr "Verfällt YYYY-MM-DD HH;MM"
-#: ../../Zotlabs/Module/Mail.php:288
+#: ../../Zotlabs/Module/Mail.php:270
msgid "Requested channel is not in this network"
msgstr "Angeforderter Kanal ist nicht in diesem Netzwerk."
-#: ../../Zotlabs/Module/Mail.php:296
+#: ../../Zotlabs/Module/Mail.php:278
msgid "Send Private Message"
msgstr "Private Nachricht senden"
-#: ../../Zotlabs/Module/Mail.php:297 ../../Zotlabs/Module/Mail.php:439
+#: ../../Zotlabs/Module/Mail.php:279 ../../Zotlabs/Module/Mail.php:421
msgid "To:"
msgstr "An:"
-#: ../../Zotlabs/Module/Mail.php:300 ../../Zotlabs/Module/Mail.php:441
+#: ../../Zotlabs/Module/Mail.php:282 ../../Zotlabs/Module/Mail.php:423
msgid "Subject:"
msgstr "Betreff:"
-#: ../../Zotlabs/Module/Mail.php:305 ../../Zotlabs/Module/Mail.php:447
-#: ../../include/conversation.php:1323
+#: ../../Zotlabs/Module/Mail.php:287 ../../Zotlabs/Module/Mail.php:429
+#: ../../include/conversation.php:1320
msgid "Attach file"
msgstr "Datei anhängen"
-#: ../../Zotlabs/Module/Mail.php:307
+#: ../../Zotlabs/Module/Mail.php:289
msgid "Send"
msgstr "Absenden"
-#: ../../Zotlabs/Module/Mail.php:310 ../../Zotlabs/Module/Mail.php:452
-#: ../../include/conversation.php:1368
+#: ../../Zotlabs/Module/Mail.php:292 ../../Zotlabs/Module/Mail.php:434
+#: ../../include/conversation.php:1365
msgid "Set expiration date"
msgstr "Verfallsdatum"
-#: ../../Zotlabs/Module/Mail.php:411
+#: ../../Zotlabs/Module/Mail.php:393
msgid "Delete message"
msgstr "Nachricht löschen"
-#: ../../Zotlabs/Module/Mail.php:412
+#: ../../Zotlabs/Module/Mail.php:394
msgid "Delivery report"
msgstr "Zustellungsbericht"
-#: ../../Zotlabs/Module/Mail.php:413
+#: ../../Zotlabs/Module/Mail.php:395
msgid "Recall message"
msgstr "Nachricht widerrufen"
-#: ../../Zotlabs/Module/Mail.php:415
+#: ../../Zotlabs/Module/Mail.php:397
msgid "Message has been recalled."
msgstr "Die Nachricht wurde widerrufen."
-#: ../../Zotlabs/Module/Mail.php:432
+#: ../../Zotlabs/Module/Mail.php:414
msgid "Delete Conversation"
msgstr "Unterhaltung löschen"
-#: ../../Zotlabs/Module/Mail.php:434
+#: ../../Zotlabs/Module/Mail.php:416
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 auf der Profilseite des Absenders antworten."
-#: ../../Zotlabs/Module/Mail.php:438
+#: ../../Zotlabs/Module/Mail.php:420
msgid "Send Reply"
msgstr "Antwort senden"
-#: ../../Zotlabs/Module/Mail.php:443
+#: ../../Zotlabs/Module/Mail.php:425
#, php-format
msgid "Your message for %s (%s):"
msgstr "Deine Nachricht für %s (%s):"
@@ -6547,19 +6714,19 @@ msgstr "Software"
msgid "Rate"
msgstr "Bewerten"
-#: ../../Zotlabs/Module/Impel.php:41 ../../include/bbcode.php:203
+#: ../../Zotlabs/Module/Impel.php:41 ../../include/bbcode.php:263
msgid "webpage"
msgstr "Webseite"
-#: ../../Zotlabs/Module/Impel.php:46 ../../include/bbcode.php:209
+#: ../../Zotlabs/Module/Impel.php:46 ../../include/bbcode.php:269
msgid "block"
msgstr "Block"
-#: ../../Zotlabs/Module/Impel.php:51 ../../include/bbcode.php:206
+#: ../../Zotlabs/Module/Impel.php:51 ../../include/bbcode.php:266
msgid "layout"
msgstr "Layout"
-#: ../../Zotlabs/Module/Impel.php:58 ../../include/bbcode.php:212
+#: ../../Zotlabs/Module/Impel.php:58 ../../include/bbcode.php:272
msgid "menu"
msgstr "Menü"
@@ -6601,7 +6768,11 @@ msgstr "oder wähle einen vorhanden Ordner aus (Doppelklick)"
msgid "Save to Folder"
msgstr "In Ordner speichern"
-#: ../../Zotlabs/Module/Probe.php:28 ../../Zotlabs/Module/Probe.php:32
+#: ../../Zotlabs/Module/Probe.php:11 ../../Zotlabs/Lib/Apps.php:231
+msgid "Remote Diagnostics"
+msgstr "Ferndiagnose"
+
+#: ../../Zotlabs/Module/Probe.php:30 ../../Zotlabs/Module/Probe.php:34
#, php-format
msgid "Fetching URL returns error: %1$s"
msgstr "Abrufen der URL gab einen Fehler zurück: %1$s"
@@ -6685,16 +6856,16 @@ msgstr "nein"
msgid "yes"
msgstr "ja"
-#: ../../Zotlabs/Module/Register.php:258
+#: ../../Zotlabs/Module/Register.php:256
msgid "Membership on this site is by invitation only."
msgstr "Mitgliedschaft auf dieser Seite ist nur nach vorheriger Einladung möglich."
-#: ../../Zotlabs/Module/Register.php:270 ../../boot.php:1610
-#: ../../include/nav.php:149
+#: ../../Zotlabs/Module/Register.php:268 ../../boot.php:1582
+#: ../../include/nav.php:145
msgid "Register"
msgstr "Registrieren"
-#: ../../Zotlabs/Module/Register.php:271
+#: ../../Zotlabs/Module/Register.php:269
msgid ""
"This site may require email verification after submitting this form. If you "
"are returned to a login page, please check your email for instructions."
@@ -6705,30 +6876,30 @@ msgstr "Diese Seite verlangt möglicherweise eine Emailbestätigung nach dem Abs
msgid "Cover Photos"
msgstr "Cover Foto"
-#: ../../Zotlabs/Module/Cover_photo.php:237 ../../include/items.php:4303
+#: ../../Zotlabs/Module/Cover_photo.php:237 ../../include/items.php:4273
msgid "female"
msgstr "weiblich"
-#: ../../Zotlabs/Module/Cover_photo.php:238 ../../include/items.php:4304
+#: ../../Zotlabs/Module/Cover_photo.php:238 ../../include/items.php:4274
#, php-format
msgid "%1$s updated her %2$s"
msgstr "%1$s hat ihr %2$s aktualisiert"
-#: ../../Zotlabs/Module/Cover_photo.php:239 ../../include/items.php:4305
+#: ../../Zotlabs/Module/Cover_photo.php:239 ../../include/items.php:4275
msgid "male"
msgstr "männlich"
-#: ../../Zotlabs/Module/Cover_photo.php:240 ../../include/items.php:4306
+#: ../../Zotlabs/Module/Cover_photo.php:240 ../../include/items.php:4276
#, php-format
msgid "%1$s updated his %2$s"
msgstr "%1$s hat sein %2$s aktualisiert"
-#: ../../Zotlabs/Module/Cover_photo.php:242 ../../include/items.php:4308
+#: ../../Zotlabs/Module/Cover_photo.php:242 ../../include/items.php:4278
#, php-format
msgid "%1$s updated their %2$s"
msgstr "%1$s hat sein/ihr %2$s aktualisiert"
-#: ../../Zotlabs/Module/Cover_photo.php:244 ../../include/channel.php:1759
+#: ../../Zotlabs/Module/Cover_photo.php:244 ../../include/channel.php:1878
msgid "cover photo"
msgstr "Cover Foto"
@@ -6740,8 +6911,8 @@ msgstr "Cover Foto hochladen"
msgid "Documentation Search"
msgstr "Suche in der Dokumentation"
-#: ../../Zotlabs/Module/Help.php:80 ../../include/conversation.php:1773
-#: ../../include/nav.php:382
+#: ../../Zotlabs/Module/Help.php:80 ../../include/conversation.php:1770
+#: ../../include/nav.php:368
msgid "About"
msgstr "Über"
@@ -6793,6 +6964,10 @@ msgstr "Forum"
msgid "Search Results For:"
msgstr "Suchergebnisse für:"
+#: ../../Zotlabs/Module/Network.php:157 ../../Zotlabs/Lib/Apps.php:235
+msgid "Activity"
+msgstr "Aktivität"
+
#: ../../Zotlabs/Module/Network.php:221
msgid "Privacy group is empty"
msgstr "Gruppe ist leer"
@@ -6827,49 +7002,50 @@ msgstr "$Projectname"
msgid "Welcome to %s"
msgstr "Willkommen auf %s"
-#: ../../Zotlabs/Module/Filestorage.php:87
+#: ../../Zotlabs/Module/Filestorage.php:79
msgid "Permission Denied."
msgstr "Zugriff verweigert."
-#: ../../Zotlabs/Module/Filestorage.php:103
+#: ../../Zotlabs/Module/Filestorage.php:95
msgid "File not found."
msgstr "Datei nicht gefunden."
-#: ../../Zotlabs/Module/Filestorage.php:146
+#: ../../Zotlabs/Module/Filestorage.php:137
msgid "Edit file permissions"
msgstr "Dateiberechtigungen bearbeiten"
-#: ../../Zotlabs/Module/Filestorage.php:159
+#: ../../Zotlabs/Module/Filestorage.php:149
msgid "Set/edit permissions"
msgstr "Berechtigungen setzen/ändern"
-#: ../../Zotlabs/Module/Filestorage.php:160
+#: ../../Zotlabs/Module/Filestorage.php:150
msgid "Include all files and sub folders"
msgstr "Alle Dateien und Unterverzeichnisse einbinden"
-#: ../../Zotlabs/Module/Filestorage.php:161
+#: ../../Zotlabs/Module/Filestorage.php:151
msgid "Return to file list"
msgstr "Zurück zur Dateiliste"
-#: ../../Zotlabs/Module/Filestorage.php:163
+#: ../../Zotlabs/Module/Filestorage.php:153
msgid "Copy/paste this code to attach file to a post"
msgstr "Diesen Code kopieren und einfügen, um die Datei an einen Beitrag anzuhängen"
-#: ../../Zotlabs/Module/Filestorage.php:164
+#: ../../Zotlabs/Module/Filestorage.php:154
msgid "Copy/paste this URL to link file from a web page"
msgstr "Diese URL verwenden, um von einer Webseite aus auf die Datei zu verlinken"
-#: ../../Zotlabs/Module/Filestorage.php:166
+#: ../../Zotlabs/Module/Filestorage.php:156
msgid "Share this file"
msgstr "Diese Datei freigeben"
-#: ../../Zotlabs/Module/Filestorage.php:167
+#: ../../Zotlabs/Module/Filestorage.php:157
msgid "Show URL to this file"
msgstr "URL zu dieser Datei anzeigen"
-#: ../../Zotlabs/Module/Filestorage.php:168
-msgid "Notify your contacts about this file"
-msgstr "Meine Kontakte über diese Datei benachrichtigen"
+#: ../../Zotlabs/Module/Filestorage.php:158
+#: ../../Zotlabs/Storage/Browser.php:351
+msgid "Show in your contacts shared folder"
+msgstr "Im geteilten Ordner Deiner Kontakte anzeigen"
#: ../../Zotlabs/Module/Common.php:14
msgid "No channel."
@@ -6896,71 +7072,59 @@ msgstr "%ss Profil [%s] besuchen"
msgid "View Connections"
msgstr "Verbindungen anzeigen"
-#: ../../Zotlabs/Module/Admin.php:94
-msgid "# Accounts"
-msgstr "Anzahl der Konten"
-
-#: ../../Zotlabs/Module/Admin.php:95
-msgid "# blocked accounts"
-msgstr "Anzahl der blockierten Konten"
-
-#: ../../Zotlabs/Module/Admin.php:96
-msgid "# expired accounts"
-msgstr "Anzahl der abgelaufenen Konten"
-
#: ../../Zotlabs/Module/Admin.php:97
-msgid "# expiring accounts"
-msgstr "Anzahl der ablaufenden Konten"
+msgid "Blocked accounts"
+msgstr "Blockierte Benutzerkonten"
-#: ../../Zotlabs/Module/Admin.php:108
-msgid "# Channels"
-msgstr "Anzahl der Kanäle"
+#: ../../Zotlabs/Module/Admin.php:98
+msgid "Expired accounts"
+msgstr "Abgelaufene Benutzerkonten"
-#: ../../Zotlabs/Module/Admin.php:109
-msgid "# primary"
-msgstr "Anzahl der primären Kanäle"
+#: ../../Zotlabs/Module/Admin.php:99
+msgid "Expiring accounts"
+msgstr "Ablaufende Benutzerkonten"
-#: ../../Zotlabs/Module/Admin.php:110
-msgid "# clones"
-msgstr "Anzahl der Klone"
+#: ../../Zotlabs/Module/Admin.php:112
+msgid "Clones"
+msgstr "Klone"
-#: ../../Zotlabs/Module/Admin.php:116
+#: ../../Zotlabs/Module/Admin.php:118
msgid "Message queues"
msgstr "Nachrichten-Warteschlangen"
-#: ../../Zotlabs/Module/Admin.php:133
+#: ../../Zotlabs/Module/Admin.php:132
msgid "Your software should be updated"
msgstr "Die installierte Software sollte aktualisiert werden"
-#: ../../Zotlabs/Module/Admin.php:138
+#: ../../Zotlabs/Module/Admin.php:137
msgid "Summary"
msgstr "Zusammenfassung"
-#: ../../Zotlabs/Module/Admin.php:141
+#: ../../Zotlabs/Module/Admin.php:140
msgid "Registered accounts"
msgstr "Registrierte Konten"
-#: ../../Zotlabs/Module/Admin.php:142
+#: ../../Zotlabs/Module/Admin.php:141
msgid "Pending registrations"
msgstr "Ausstehende Registrierungen"
-#: ../../Zotlabs/Module/Admin.php:143
+#: ../../Zotlabs/Module/Admin.php:142
msgid "Registered channels"
msgstr "Registrierte Kanäle"
-#: ../../Zotlabs/Module/Admin.php:144
+#: ../../Zotlabs/Module/Admin.php:143
msgid "Active plugins"
msgstr "Aktive Plug-Ins"
-#: ../../Zotlabs/Module/Admin.php:145
+#: ../../Zotlabs/Module/Admin.php:144
msgid "Version"
msgstr "Version"
-#: ../../Zotlabs/Module/Admin.php:146
+#: ../../Zotlabs/Module/Admin.php:145
msgid "Repository version (master)"
msgstr "Repository-Version (master)"
-#: ../../Zotlabs/Module/Admin.php:147
+#: ../../Zotlabs/Module/Admin.php:146
msgid "Repository version (dev)"
msgstr "Repository-Version (dev)"
@@ -7009,7 +7173,7 @@ msgid ""
"Password reset failed."
msgstr "Die Anfrage konnte nicht verifiziert werden. (Vielleicht hast Du schon einmal auf den Link in der E-Mail geklickt?) Passwort-Rücksetzung fehlgeschlagen."
-#: ../../Zotlabs/Module/Lostpass.php:91 ../../boot.php:1637
+#: ../../Zotlabs/Module/Lostpass.php:91 ../../boot.php:1609
msgid "Password Reset"
msgstr "Zurücksetzen des Kennworts"
@@ -7058,121 +7222,91 @@ msgstr "E-Mail Adresse"
msgid "Reset"
msgstr "Zurücksetzen"
-#: ../../Zotlabs/Module/Notifications.php:43 ../../include/nav.php:190
-msgid "Mark all system notifications seen"
-msgstr "Markiere alle System-Benachrichtigungen als gesehen"
+#: ../../Zotlabs/Module/Notifications.php:43
+#: ../../Zotlabs/Lib/ThreadItem.php:392
+msgid "Mark all seen"
+msgstr "Alle als gelesen markieren"
+
+#: ../../Zotlabs/Lib/Techlevels.php:10
+msgid "0. Beginner/Basic"
+msgstr "0. Einsteiger/Basis"
+
+#: ../../Zotlabs/Lib/Techlevels.php:11
+msgid "1. Novice - not skilled but willing to learn"
+msgstr "1. Anfänger - unerfahren, aber bereit zu lernen"
+
+#: ../../Zotlabs/Lib/Techlevels.php:12
+msgid "2. Intermediate - somewhat comfortable"
+msgstr "2. Fortgeschritten - relativ komfortabel"
+
+#: ../../Zotlabs/Lib/Techlevels.php:13
+msgid "3. Advanced - very comfortable"
+msgstr "3. Fortgeschritten - sehr komfortabel"
-#: ../../Zotlabs/Lib/Apps.php:212
+#: ../../Zotlabs/Lib/Techlevels.php:14
+msgid "4. Expert - I can write computer code"
+msgstr "4. Experte - Ich kann Computercode schreiben"
+
+#: ../../Zotlabs/Lib/Techlevels.php:15
+msgid "5. Wizard - I probably know more than you do"
+msgstr "5. Zauberer - ich kann wahrscheinlich mehr als Du"
+
+#: ../../Zotlabs/Lib/Apps.php:225
msgid "Site Admin"
msgstr "Hub-Administration"
-#: ../../Zotlabs/Lib/Apps.php:213 ../../addon/buglink/buglink.php:16
+#: ../../Zotlabs/Lib/Apps.php:226 ../../addon/buglink/buglink.php:16
msgid "Report Bug"
msgstr "Fehler melden"
-#: ../../Zotlabs/Lib/Apps.php:214
-msgid "View Bookmarks"
-msgstr "Lesezeichen ansehen"
-
-#: ../../Zotlabs/Lib/Apps.php:215
-msgid "My Chatrooms"
-msgstr "Meine Chaträume"
-
-#: ../../Zotlabs/Lib/Apps.php:217
+#: ../../Zotlabs/Lib/Apps.php:230
msgid "Firefox Share"
msgstr "Teilen-Knopf für Firefox"
-#: ../../Zotlabs/Lib/Apps.php:218
-msgid "Remote Diagnostics"
-msgstr "Ferndiagnose"
-
-#: ../../Zotlabs/Lib/Apps.php:219 ../../include/features.php:337
-msgid "Suggest Channels"
-msgstr "Kanäle vorschlagen"
-
-#: ../../Zotlabs/Lib/Apps.php:220 ../../boot.php:1629
-#: ../../include/nav.php:117
+#: ../../Zotlabs/Lib/Apps.php:233 ../../boot.php:1601
+#: ../../include/nav.php:113
msgid "Login"
msgstr "Anmelden"
-#: ../../Zotlabs/Lib/Apps.php:222
-msgid "Activity"
-msgstr "Aktivität"
-
-#: ../../Zotlabs/Lib/Apps.php:226 ../../include/conversation.php:1857
-#: ../../include/features.php:99 ../../include/nav.php:465
-msgid "Wiki"
-msgstr "Wiki"
-
-#: ../../Zotlabs/Lib/Apps.php:227 ../../include/nav.php:180
-msgid "Channel Home"
-msgstr "Mein Kanal"
-
-#: ../../Zotlabs/Lib/Apps.php:230 ../../include/conversation.php:1802
-#: ../../include/conversation.php:1805 ../../include/nav.php:200
-#: ../../include/nav.php:411 ../../include/nav.php:414
-msgid "Events"
-msgstr "Termine"
-
-#: ../../Zotlabs/Lib/Apps.php:231
-msgid "Directory"
-msgstr "Verzeichnis"
-
-#: ../../Zotlabs/Lib/Apps.php:233 ../../include/nav.php:192
-msgid "Mail"
-msgstr "Mail"
-
-#: ../../Zotlabs/Lib/Apps.php:236
+#: ../../Zotlabs/Lib/Apps.php:249
msgid "Chat"
msgstr "Chat"
-#: ../../Zotlabs/Lib/Apps.php:238
+#: ../../Zotlabs/Lib/Apps.php:251
msgid "Probe"
msgstr "Testen"
-#: ../../Zotlabs/Lib/Apps.php:239
+#: ../../Zotlabs/Lib/Apps.php:252
msgid "Suggest"
msgstr "Empfehlen"
-#: ../../Zotlabs/Lib/Apps.php:240
+#: ../../Zotlabs/Lib/Apps.php:253
msgid "Random Channel"
msgstr "Zufälliger Kanal"
-#: ../../Zotlabs/Lib/Apps.php:241
-msgid "Invite"
-msgstr "Einladen"
-
-#: ../../Zotlabs/Lib/Apps.php:242 ../../Zotlabs/Widget/Admin.php:26
+#: ../../Zotlabs/Lib/Apps.php:255 ../../Zotlabs/Widget/Admin.php:26
msgid "Features"
msgstr "Funktionen"
-#: ../../Zotlabs/Lib/Apps.php:243 ../../addon/openid/MysqlProvider.php:69
-msgid "Language"
-msgstr "Sprache"
-
-#: ../../Zotlabs/Lib/Apps.php:244
-msgid "Post"
-msgstr "Beitrag schreiben"
-
-#: ../../Zotlabs/Lib/Apps.php:245 ../../addon/openid/MysqlProvider.php:58
+#: ../../Zotlabs/Lib/Apps.php:258 ../../addon/openid/MysqlProvider.php:58
#: ../../addon/openid/MysqlProvider.php:59
#: ../../addon/openid/MysqlProvider.php:60
msgid "Profile Photo"
msgstr "Profilfoto"
-#: ../../Zotlabs/Lib/Apps.php:365
+#: ../../Zotlabs/Lib/Apps.php:391
msgid "Purchase"
msgstr "Kaufen"
-#: ../../Zotlabs/Lib/Apps.php:369
+#: ../../Zotlabs/Lib/Apps.php:395
msgid "Undelete"
msgstr "Wieder hergestellt"
-#: ../../Zotlabs/Lib/Apps.php:374
+#: ../../Zotlabs/Lib/Apps.php:401
msgid "Add to app-tray"
msgstr "Zum App-Menü hinzufügen"
-#: ../../Zotlabs/Lib/Apps.php:375
+#: ../../Zotlabs/Lib/Apps.php:402
msgid "Remove from app-tray"
msgstr "Aus dem App-Menü entfernen"
@@ -7260,8 +7394,8 @@ msgid "Message"
msgstr "Nachricht"
#: ../../Zotlabs/Lib/NativeWikiPage.php:578
-#: ../../addon/gitwiki/gitwiki_backend.php:579 ../../include/bbcode.php:610
-#: ../../include/bbcode.php:756
+#: ../../addon/gitwiki/gitwiki_backend.php:579 ../../include/bbcode.php:667
+#: ../../include/bbcode.php:813
msgid "Different viewers will see this text differently"
msgstr "Verschiedene Betrachter werden diesen Text unterschiedlich sehen"
@@ -7348,21 +7482,20 @@ msgstr "Chatraum konnte nicht gefunden werden."
msgid "Room is full"
msgstr "Der Chatraum ist voll"
-#: ../../Zotlabs/Lib/Enotify.php:60 ../../include/network.php:1977
+#: ../../Zotlabs/Lib/Enotify.php:60
msgid "$Projectname Notification"
msgstr "$Projectname-Benachrichtigung"
-#: ../../Zotlabs/Lib/Enotify.php:61 ../../addon/diaspora/util.php:218
-#: ../../addon/diaspora/util.php:231 ../../addon/diaspora/p.php:46
-#: ../../include/network.php:1978
+#: ../../Zotlabs/Lib/Enotify.php:61 ../../addon/diaspora/util.php:283
+#: ../../addon/diaspora/util.php:296 ../../addon/diaspora/p.php:46
msgid "$projectname"
msgstr "$projectname"
-#: ../../Zotlabs/Lib/Enotify.php:63 ../../include/network.php:1980
+#: ../../Zotlabs/Lib/Enotify.php:63
msgid "Thank You,"
msgstr "Danke."
-#: ../../Zotlabs/Lib/Enotify.php:65 ../../include/network.php:1982
+#: ../../Zotlabs/Lib/Enotify.php:65
#, php-format
msgid "%s Administrator"
msgstr "der Administrator von %s"
@@ -7396,176 +7529,186 @@ msgstr "eine private Nachricht"
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."
-#: ../../Zotlabs/Lib/Enotify.php:183
+#: ../../Zotlabs/Lib/Enotify.php:184
#, 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]einen %4$s[/zrl] kommentiert"
-#: ../../Zotlabs/Lib/Enotify.php:191
+#: ../../Zotlabs/Lib/Enotify.php:192
#, 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"
-#: ../../Zotlabs/Lib/Enotify.php:200
+#: ../../Zotlabs/Lib/Enotify.php:201
#, 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"
-#: ../../Zotlabs/Lib/Enotify.php:211
+#: ../../Zotlabs/Lib/Enotify.php:213
+#, php-format
+msgid "[$Projectname:Notify] Moderated Comment to conversation #%1$d by %2$s"
+msgstr "[$Projectname:Benachrichtigung] Moderierter Kommantar in Unterhaltung #%1$d von %2$s"
+
+#: ../../Zotlabs/Lib/Enotify.php:215
#, php-format
msgid "[$Projectname:Notify] Comment to conversation #%1$d by %2$s"
msgstr "[$Projectname:Benachrichtigung] Kommentar in Unterhaltung #%1$d von %2$s"
-#: ../../Zotlabs/Lib/Enotify.php:212
+#: ../../Zotlabs/Lib/Enotify.php:216
#, php-format
msgid "%1$s, %2$s commented on an item/conversation you have been following."
msgstr "%1$s, %2$s hat eine Unterhaltung kommentiert, der Du folgst."
-#: ../../Zotlabs/Lib/Enotify.php:215 ../../Zotlabs/Lib/Enotify.php:292
-#: ../../Zotlabs/Lib/Enotify.php:309 ../../Zotlabs/Lib/Enotify.php:335
-#: ../../Zotlabs/Lib/Enotify.php:353 ../../Zotlabs/Lib/Enotify.php:367
+#: ../../Zotlabs/Lib/Enotify.php:219 ../../Zotlabs/Lib/Enotify.php:301
+#: ../../Zotlabs/Lib/Enotify.php:318 ../../Zotlabs/Lib/Enotify.php:344
+#: ../../Zotlabs/Lib/Enotify.php:362 ../../Zotlabs/Lib/Enotify.php:376
#, php-format
msgid "Please visit %s to view and/or reply to the conversation."
msgstr "Bitte besuche %s, um die Unterhaltung anzusehen und/oder zu kommentieren."
-#: ../../Zotlabs/Lib/Enotify.php:273
+#: ../../Zotlabs/Lib/Enotify.php:223 ../../Zotlabs/Lib/Enotify.php:224
+#, php-format
+msgid "Please visit %s to approve or reject this comment."
+msgstr "Bitte besuche %s, um diesen Kommentar anzunehmen oder abzulehnen."
+
+#: ../../Zotlabs/Lib/Enotify.php:282
#, php-format
msgid "%1$s, %2$s liked [zrl=%3$s]your %4$s[/zrl]"
msgstr "%1$s, %2$s gefällt [zrl=%3$s]dein %4$s[/zrl]"
-#: ../../Zotlabs/Lib/Enotify.php:288
+#: ../../Zotlabs/Lib/Enotify.php:297
#, php-format
msgid "[$Projectname:Notify] Like received to conversation #%1$d by %2$s"
msgstr "[$Projectname:Benachrichtigung] Gefällt mir in Unterhaltung #%1$d von %2$s erhalten"
-#: ../../Zotlabs/Lib/Enotify.php:289
+#: ../../Zotlabs/Lib/Enotify.php:298
#, php-format
msgid "%1$s, %2$s liked an item/conversation you created."
msgstr "%1$s, %2$s gefällt ein Beitrag oder eine Unterhaltung von Dir"
-#: ../../Zotlabs/Lib/Enotify.php:300
+#: ../../Zotlabs/Lib/Enotify.php:309
#, php-format
msgid "[$Projectname:Notify] %s posted to your profile wall"
msgstr "[$Projectname:Benachrichtigung] %s schrieb auf Deine Pinnwand"
-#: ../../Zotlabs/Lib/Enotify.php:302
+#: ../../Zotlabs/Lib/Enotify.php:311
#, 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"
-#: ../../Zotlabs/Lib/Enotify.php:304
+#: ../../Zotlabs/Lib/Enotify.php:313
#, 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"
-#: ../../Zotlabs/Lib/Enotify.php:328
+#: ../../Zotlabs/Lib/Enotify.php:337
#, php-format
msgid "[$Projectname:Notify] %s tagged you"
msgstr "[$Projectname:Benachrichtigung] %s hat Dich erwähnt"
-#: ../../Zotlabs/Lib/Enotify.php:329
+#: ../../Zotlabs/Lib/Enotify.php:338
#, php-format
msgid "%1$s, %2$s tagged you at %3$s"
msgstr "%1$s, %2$s hat Dich auf %3$s erwähnt"
-#: ../../Zotlabs/Lib/Enotify.php:330
+#: ../../Zotlabs/Lib/Enotify.php:339
#, 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]."
-#: ../../Zotlabs/Lib/Enotify.php:342
+#: ../../Zotlabs/Lib/Enotify.php:351
#, php-format
msgid "[$Projectname:Notify] %1$s poked you"
msgstr "[$Projectname:Benachrichtigung] %1$s hat Dich angestupst"
-#: ../../Zotlabs/Lib/Enotify.php:343
+#: ../../Zotlabs/Lib/Enotify.php:352
#, php-format
msgid "%1$s, %2$s poked you at %3$s"
msgstr "%1$s, %2$s hat Dich auf %3$s angestupst"
-#: ../../Zotlabs/Lib/Enotify.php:344
+#: ../../Zotlabs/Lib/Enotify.php:353
#, 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]."
-#: ../../Zotlabs/Lib/Enotify.php:360
+#: ../../Zotlabs/Lib/Enotify.php:369
#, php-format
msgid "[$Projectname:Notify] %s tagged your post"
msgstr "[$Projectname:Benachrichtigung] %s hat Deinen Beitrag verschlagwortet"
-#: ../../Zotlabs/Lib/Enotify.php:361
+#: ../../Zotlabs/Lib/Enotify.php:370
#, php-format
msgid "%1$s, %2$s tagged your post at %3$s"
msgstr "%1$s, %2$s hat Deinen Beitrag auf %3$s verschlagwortet"
-#: ../../Zotlabs/Lib/Enotify.php:362
+#: ../../Zotlabs/Lib/Enotify.php:371
#, 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] verschlagwortet"
-#: ../../Zotlabs/Lib/Enotify.php:374
+#: ../../Zotlabs/Lib/Enotify.php:383
msgid "[$Projectname:Notify] Introduction received"
msgstr "[$Projectname:Benachrichtigung] Verbindungsanfrage erhalten"
-#: ../../Zotlabs/Lib/Enotify.php:375
+#: ../../Zotlabs/Lib/Enotify.php:384
#, php-format
msgid "%1$s, you've received an new connection request from '%2$s' at %3$s"
msgstr "%1$s, Du hast eine neue Verbindungsanfrage von '%2$s' auf %3$s erhalten"
-#: ../../Zotlabs/Lib/Enotify.php:376
+#: ../../Zotlabs/Lib/Enotify.php:385
#, php-format
msgid ""
"%1$s, you've received [zrl=%2$s]a new connection request[/zrl] from %3$s."
msgstr "%1$s, Du hast [zrl=%2$s]eine neue Verbindungsanfrage[/zrl] von %3$s erhalten."
-#: ../../Zotlabs/Lib/Enotify.php:380 ../../Zotlabs/Lib/Enotify.php:399
+#: ../../Zotlabs/Lib/Enotify.php:389 ../../Zotlabs/Lib/Enotify.php:408
#, php-format
msgid "You may visit their profile at %s"
msgstr "Du kannst Dir das Profil unter %s ansehen"
-#: ../../Zotlabs/Lib/Enotify.php:382
+#: ../../Zotlabs/Lib/Enotify.php:391
#, php-format
msgid "Please visit %s to approve or reject the connection request."
msgstr "Bitte besuche %s , um die Verbindungsanfrage anzunehmen oder abzulehnen."
-#: ../../Zotlabs/Lib/Enotify.php:389
+#: ../../Zotlabs/Lib/Enotify.php:398
msgid "[$Projectname:Notify] Friend suggestion received"
msgstr "[$Projectname:Benachrichtigung] Freundschaftsvorschlag erhalten"
-#: ../../Zotlabs/Lib/Enotify.php:390
+#: ../../Zotlabs/Lib/Enotify.php:399
#, php-format
msgid "%1$s, you've received a friend suggestion from '%2$s' at %3$s"
msgstr "%1$s, Du hast einen Kontaktvorschlag von „%2$s“ auf %3$s erhalten"
-#: ../../Zotlabs/Lib/Enotify.php:391
+#: ../../Zotlabs/Lib/Enotify.php:400
#, 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 Kontaktvorschlag[/zrl] für %3$s von %4$s erhalten."
-#: ../../Zotlabs/Lib/Enotify.php:397
+#: ../../Zotlabs/Lib/Enotify.php:406
msgid "Name:"
msgstr "Name:"
-#: ../../Zotlabs/Lib/Enotify.php:398
+#: ../../Zotlabs/Lib/Enotify.php:407
msgid "Photo:"
msgstr "Foto:"
-#: ../../Zotlabs/Lib/Enotify.php:401
+#: ../../Zotlabs/Lib/Enotify.php:410
#, php-format
msgid "Please visit %s to approve or reject the suggestion."
msgstr "Bitte besuche %s um den Vorschlag zu akzeptieren oder abzulehnen."
-#: ../../Zotlabs/Lib/Enotify.php:620
+#: ../../Zotlabs/Lib/Enotify.php:629
msgid "[$Projectname:Notify]"
msgstr "[$Projectname:Benachrichtigung]"
-#: ../../Zotlabs/Lib/Enotify.php:780
+#: ../../Zotlabs/Lib/Enotify.php:789
msgid "created a new post"
msgstr "Neuer Beitrag wurde erzeugt"
-#: ../../Zotlabs/Lib/Enotify.php:781
+#: ../../Zotlabs/Lib/Enotify.php:790
#, php-format
msgid "commented on %s's post"
msgstr "hat %s's Beitrag kommentiert"
@@ -7574,21 +7717,21 @@ msgstr "hat %s's Beitrag kommentiert"
msgid "Wiki files deleted successfully"
msgstr "Wiki-Dateien erfolgreich gelöscht"
-#: ../../Zotlabs/Lib/DB_Upgrade.php:93
+#: ../../Zotlabs/Lib/DB_Upgrade.php:95
#, php-format
msgid "Update Error at %s"
msgstr "Aktualisierungsfehler auf %s"
-#: ../../Zotlabs/Lib/DB_Upgrade.php:99
+#: ../../Zotlabs/Lib/DB_Upgrade.php:101
#, php-format
msgid "Update %s failed. See error logs."
msgstr "Aktualisierung %s fehlgeschlagen. Details in den Fehlerprotokollen."
-#: ../../Zotlabs/Lib/ThreadItem.php:96 ../../include/conversation.php:661
+#: ../../Zotlabs/Lib/ThreadItem.php:96 ../../include/conversation.php:656
msgid "Private Message"
msgstr "Private Nachricht"
-#: ../../Zotlabs/Lib/ThreadItem.php:133 ../../include/conversation.php:653
+#: ../../Zotlabs/Lib/ThreadItem.php:133 ../../include/conversation.php:648
msgid "Select"
msgstr "Auswählen"
@@ -7632,11 +7775,11 @@ msgstr "Markierungsstatus (Stern) umschalten"
msgid "starred"
msgstr "markiert"
-#: ../../Zotlabs/Lib/ThreadItem.php:240 ../../include/conversation.php:668
+#: ../../Zotlabs/Lib/ThreadItem.php:240 ../../include/conversation.php:663
msgid "Message signature validated"
msgstr "Signatur überprüft"
-#: ../../Zotlabs/Lib/ThreadItem.php:241 ../../include/conversation.php:669
+#: ../../Zotlabs/Lib/ThreadItem.php:241 ../../include/conversation.php:664
msgid "Message signature incorrect"
msgstr "Signatur nicht korrekt"
@@ -7644,135 +7787,143 @@ msgstr "Signatur nicht korrekt"
msgid "Add Tag"
msgstr "Tag hinzufügen"
-#: ../../Zotlabs/Lib/ThreadItem.php:269 ../../include/taxonomy.php:316
+#: ../../Zotlabs/Lib/ThreadItem.php:267 ../../include/taxonomy.php:355
msgid "like"
msgstr "mag"
-#: ../../Zotlabs/Lib/ThreadItem.php:270 ../../include/taxonomy.php:317
+#: ../../Zotlabs/Lib/ThreadItem.php:268 ../../include/taxonomy.php:356
msgid "dislike"
msgstr "verurteile"
-#: ../../Zotlabs/Lib/ThreadItem.php:274
+#: ../../Zotlabs/Lib/ThreadItem.php:272
msgid "Share This"
msgstr "Teilen"
-#: ../../Zotlabs/Lib/ThreadItem.php:274
+#: ../../Zotlabs/Lib/ThreadItem.php:272
msgid "share"
msgstr "Teilen"
-#: ../../Zotlabs/Lib/ThreadItem.php:283
+#: ../../Zotlabs/Lib/ThreadItem.php:281
msgid "Delivery Report"
msgstr "Zustellungsbericht"
-#: ../../Zotlabs/Lib/ThreadItem.php:301
+#: ../../Zotlabs/Lib/ThreadItem.php:299
#, php-format
msgid "%d comment"
msgid_plural "%d comments"
msgstr[0] "%d Kommentar"
msgstr[1] "%d Kommentare"
-#: ../../Zotlabs/Lib/ThreadItem.php:330 ../../Zotlabs/Lib/ThreadItem.php:331
+#: ../../Zotlabs/Lib/ThreadItem.php:328 ../../Zotlabs/Lib/ThreadItem.php:329
#, php-format
msgid "View %s's profile - %s"
msgstr "Schaue Dir %ss Profil an – %s"
-#: ../../Zotlabs/Lib/ThreadItem.php:334
+#: ../../Zotlabs/Lib/ThreadItem.php:332
msgid "to"
msgstr "an"
-#: ../../Zotlabs/Lib/ThreadItem.php:335
+#: ../../Zotlabs/Lib/ThreadItem.php:333
msgid "via"
msgstr "via"
-#: ../../Zotlabs/Lib/ThreadItem.php:336
+#: ../../Zotlabs/Lib/ThreadItem.php:334
msgid "Wall-to-Wall"
msgstr "Wall-to-Wall"
-#: ../../Zotlabs/Lib/ThreadItem.php:337
+#: ../../Zotlabs/Lib/ThreadItem.php:335
msgid "via Wall-To-Wall:"
msgstr "via Wall-To-Wall:"
-#: ../../Zotlabs/Lib/ThreadItem.php:350 ../../include/conversation.php:718
+#: ../../Zotlabs/Lib/ThreadItem.php:348 ../../include/conversation.php:715
#, php-format
msgid "from %s"
msgstr "via %s"
-#: ../../Zotlabs/Lib/ThreadItem.php:353 ../../include/conversation.php:721
+#: ../../Zotlabs/Lib/ThreadItem.php:351 ../../include/conversation.php:718
#, php-format
msgid "last edited: %s"
msgstr "zuletzt bearbeitet: %s"
-#: ../../Zotlabs/Lib/ThreadItem.php:354 ../../include/conversation.php:722
+#: ../../Zotlabs/Lib/ThreadItem.php:352 ../../include/conversation.php:719
#, php-format
msgid "Expires: %s"
msgstr "Verfällt: %s"
-#: ../../Zotlabs/Lib/ThreadItem.php:360
+#: ../../Zotlabs/Lib/ThreadItem.php:358
msgid "Attend"
msgstr "Zusagen"
-#: ../../Zotlabs/Lib/ThreadItem.php:361
+#: ../../Zotlabs/Lib/ThreadItem.php:359
msgid "Attendance Options"
msgstr "Zusageoptionen"
-#: ../../Zotlabs/Lib/ThreadItem.php:362
+#: ../../Zotlabs/Lib/ThreadItem.php:360
msgid "Vote"
msgstr "Abstimmen"
-#: ../../Zotlabs/Lib/ThreadItem.php:363
+#: ../../Zotlabs/Lib/ThreadItem.php:361
msgid "Voting Options"
msgstr "Abstimmungsoptionen"
-#: ../../Zotlabs/Lib/ThreadItem.php:384
+#: ../../Zotlabs/Lib/ThreadItem.php:382
#: ../../addon/bookmarker/bookmarker.php:38
msgid "Save Bookmarks"
msgstr "Favoriten speichern"
-#: ../../Zotlabs/Lib/ThreadItem.php:385
+#: ../../Zotlabs/Lib/ThreadItem.php:383
msgid "Add to Calendar"
msgstr "Zum Kalender hinzufügen"
-#: ../../Zotlabs/Lib/ThreadItem.php:394
-msgid "Mark all seen"
-msgstr "Alle als gelesen markieren"
-
-#: ../../Zotlabs/Lib/ThreadItem.php:443 ../../include/js_strings.php:7
+#: ../../Zotlabs/Lib/ThreadItem.php:441 ../../include/js_strings.php:7
#, php-format
msgid "%s show all"
msgstr "%s mehr anzeigen"
-#: ../../Zotlabs/Lib/ThreadItem.php:733 ../../include/conversation.php:1318
+#: ../../Zotlabs/Lib/ThreadItem.php:731 ../../include/conversation.php:1315
msgid "Bold"
msgstr "Fett"
-#: ../../Zotlabs/Lib/ThreadItem.php:734 ../../include/conversation.php:1319
+#: ../../Zotlabs/Lib/ThreadItem.php:732 ../../include/conversation.php:1316
msgid "Italic"
msgstr "Kursiv"
-#: ../../Zotlabs/Lib/ThreadItem.php:735 ../../include/conversation.php:1320
+#: ../../Zotlabs/Lib/ThreadItem.php:733 ../../include/conversation.php:1317
msgid "Underline"
msgstr "Unterstrichen"
-#: ../../Zotlabs/Lib/ThreadItem.php:736 ../../include/conversation.php:1321
+#: ../../Zotlabs/Lib/ThreadItem.php:734 ../../include/conversation.php:1318
msgid "Quote"
msgstr "Zitat"
-#: ../../Zotlabs/Lib/ThreadItem.php:737 ../../include/conversation.php:1322
+#: ../../Zotlabs/Lib/ThreadItem.php:735 ../../include/conversation.php:1319
msgid "Code"
msgstr "Code"
-#: ../../Zotlabs/Lib/ThreadItem.php:738
+#: ../../Zotlabs/Lib/ThreadItem.php:736
msgid "Image"
msgstr "Bild"
-#: ../../Zotlabs/Lib/ThreadItem.php:739
+#: ../../Zotlabs/Lib/ThreadItem.php:737
msgid "Insert Link"
msgstr "Link einfügen"
-#: ../../Zotlabs/Lib/ThreadItem.php:740
+#: ../../Zotlabs/Lib/ThreadItem.php:738
msgid "Video"
msgstr "Video"
+#: ../../Zotlabs/Lib/ThreadItem.php:747
+msgid "Your full name (required)"
+msgstr "Ihr vollständiger Name (erforderlich)"
+
+#: ../../Zotlabs/Lib/ThreadItem.php:748
+msgid "Your email address (required)"
+msgstr "Ihre E-Mail-Adresse (erforderlich)"
+
+#: ../../Zotlabs/Lib/ThreadItem.php:749
+msgid "Your website URL (optional)"
+msgstr "Ihre Webseiten-URL (optional)"
+
#: ../../Zotlabs/Zot/Auth.php:138
msgid ""
"Remote authentication blocked. You are logged into this site locally. Please"
@@ -7785,72 +7936,72 @@ msgstr "Fern-Authentifizierung blockiert. Du bist lokal auf diesem Server angeme
msgid "Welcome %s. Remote authentication successful."
msgstr "Willkommen %s. Entfernte Authentifizierung erfolgreich."
-#: ../../Zotlabs/Storage/Browser.php:106 ../../Zotlabs/Storage/Browser.php:237
+#: ../../Zotlabs/Storage/Browser.php:107 ../../Zotlabs/Storage/Browser.php:238
msgid "parent"
msgstr "Übergeordnetes Verzeichnis"
-#: ../../Zotlabs/Storage/Browser.php:130 ../../include/text.php:2679
+#: ../../Zotlabs/Storage/Browser.php:131 ../../include/text.php:2692
msgid "Collection"
msgstr "Sammlung"
-#: ../../Zotlabs/Storage/Browser.php:133
+#: ../../Zotlabs/Storage/Browser.php:134
msgid "Principal"
msgstr "Prinzipal"
-#: ../../Zotlabs/Storage/Browser.php:136
+#: ../../Zotlabs/Storage/Browser.php:137
msgid "Addressbook"
msgstr "Adressbuch"
-#: ../../Zotlabs/Storage/Browser.php:139
+#: ../../Zotlabs/Storage/Browser.php:140
msgid "Calendar"
msgstr "Kalender"
-#: ../../Zotlabs/Storage/Browser.php:142
+#: ../../Zotlabs/Storage/Browser.php:143
msgid "Schedule Inbox"
msgstr "Posteingang für überwachte Kalender"
-#: ../../Zotlabs/Storage/Browser.php:145
+#: ../../Zotlabs/Storage/Browser.php:146
msgid "Schedule Outbox"
msgstr "Postausgang für überwachte Kalender"
-#: ../../Zotlabs/Storage/Browser.php:225
+#: ../../Zotlabs/Storage/Browser.php:226
msgid "Total"
msgstr "Summe"
-#: ../../Zotlabs/Storage/Browser.php:227
+#: ../../Zotlabs/Storage/Browser.php:228
msgid "Shared"
msgstr "Geteilt"
-#: ../../Zotlabs/Storage/Browser.php:301
+#: ../../Zotlabs/Storage/Browser.php:304
#, php-format
msgid "You are using %1$s of your available file storage."
msgstr "Sie verwenden %1$s von Ihrem verfügbaren Dateispeicher."
-#: ../../Zotlabs/Storage/Browser.php:306
+#: ../../Zotlabs/Storage/Browser.php:309
#, php-format
msgid "You are using %1$s of %2$s available file storage. (%3$s&#37;)"
msgstr "Sie verwenden %1$s von %2$s verfügbarem Dateispeicher. (%3$s&#37;)"
-#: ../../Zotlabs/Storage/Browser.php:317
+#: ../../Zotlabs/Storage/Browser.php:320
msgid "WARNING:"
msgstr "WARNUNG:"
-#: ../../Zotlabs/Storage/Browser.php:327
+#: ../../Zotlabs/Storage/Browser.php:330
msgid ""
"Please use DAV to upload large (video, audio) files.<br>See <a class=\"zrl\""
" href=\"help/member/member_guide#Cloud_Desktop_Clients\">Cloud Desktop "
"Clients</a>"
msgstr "Bitte verwende DAV, um große Dateien (Audio, Video) hochzuladen.<br>Für weitere Informationen siehe <a class=\"zrl\" href=\"help/member/member_guide#Cloud_Desktop_Clients\">Cloud Desktop Clients</a>"
-#: ../../Zotlabs/Storage/Browser.php:331
+#: ../../Zotlabs/Storage/Browser.php:334
msgid "Create new folder"
msgstr "Neuen Ordner anlegen"
-#: ../../Zotlabs/Storage/Browser.php:333
+#: ../../Zotlabs/Storage/Browser.php:336
msgid "Upload file"
msgstr "Datei hochladen"
-#: ../../Zotlabs/Storage/Browser.php:347
+#: ../../Zotlabs/Storage/Browser.php:350
msgid "Drop files here to immediately upload"
msgstr "Dateien zum sofortigen Hochladen hier fallen lassen"
@@ -7858,9 +8009,85 @@ msgstr "Dateien zum sofortigen Hochladen hier fallen lassen"
msgid "Forums"
msgstr "Foren"
+#: ../../Zotlabs/Widget/Cdav.php:37
+msgid "Select Channel"
+msgstr "Kanal auswählen"
+
+#: ../../Zotlabs/Widget/Cdav.php:42
+msgid "Read-write"
+msgstr "Lesen-schreiben"
+
+#: ../../Zotlabs/Widget/Cdav.php:43
+msgid "Read-only"
+msgstr "Nur Lesen"
+
+#: ../../Zotlabs/Widget/Cdav.php:116
+msgid "My Calendars"
+msgstr "Meine Kalender"
+
+#: ../../Zotlabs/Widget/Cdav.php:118
+msgid "Shared Calendars"
+msgstr "Geteilte Kalender"
+
+#: ../../Zotlabs/Widget/Cdav.php:122
+msgid "Share this calendar"
+msgstr "Diesen Kalender teilen"
+
+#: ../../Zotlabs/Widget/Cdav.php:124
+msgid "Calendar name and color"
+msgstr "Kalendername und -farbe"
+
+#: ../../Zotlabs/Widget/Cdav.php:126
+msgid "Create new calendar"
+msgstr "Neuen Kalender erstellen"
+
+#: ../../Zotlabs/Widget/Cdav.php:128
+msgid "Calendar Name"
+msgstr "Kalendername"
+
+#: ../../Zotlabs/Widget/Cdav.php:129
+msgid "Calendar Tools"
+msgstr "Kalenderwerkzeuge"
+
+#: ../../Zotlabs/Widget/Cdav.php:130
+msgid "Import calendar"
+msgstr "Kalender importieren"
+
+#: ../../Zotlabs/Widget/Cdav.php:131
+msgid "Select a calendar to import to"
+msgstr "Kalender zum Hineinimportieren auswählen"
+
+#: ../../Zotlabs/Widget/Cdav.php:158
+msgid "Addressbooks"
+msgstr "Adressbücher"
+
+#: ../../Zotlabs/Widget/Cdav.php:160
+msgid "Addressbook name"
+msgstr "Adressbuchname"
+
+#: ../../Zotlabs/Widget/Cdav.php:162
+msgid "Create new addressbook"
+msgstr "Neues Adressbuch erstellen"
+
+#: ../../Zotlabs/Widget/Cdav.php:163
+msgid "Addressbook Name"
+msgstr "Adressbuchname"
+
+#: ../../Zotlabs/Widget/Cdav.php:165
+msgid "Addressbook Tools"
+msgstr "Adressbuchwerkzeuge"
+
+#: ../../Zotlabs/Widget/Cdav.php:166
+msgid "Import addressbook"
+msgstr "Adressbuch importieren"
+
+#: ../../Zotlabs/Widget/Cdav.php:167
+msgid "Select an addressbook to import to"
+msgstr "Adressbuch zum Hineinimportieren auswählen"
+
#: ../../Zotlabs/Widget/Appcategories.php:39
#: ../../Zotlabs/Widget/Tagcloud.php:25 ../../include/contact_widgets.php:91
-#: ../../include/taxonomy.php:188 ../../include/taxonomy.php:270
+#: ../../include/taxonomy.php:227 ../../include/taxonomy.php:309
msgid "Categories"
msgstr "Kategorien"
@@ -7893,21 +8120,21 @@ msgstr "Private Nachrichten"
msgid "Combined View"
msgstr "Kombinierte Anzeige"
-#: ../../Zotlabs/Widget/Mailmenu.php:20 ../../include/nav.php:195
+#: ../../Zotlabs/Widget/Mailmenu.php:20 ../../include/nav.php:190
msgid "Inbox"
msgstr "Eingang"
-#: ../../Zotlabs/Widget/Mailmenu.php:25 ../../include/nav.php:196
+#: ../../Zotlabs/Widget/Mailmenu.php:25 ../../include/nav.php:191
msgid "Outbox"
msgstr "Ausgang"
-#: ../../Zotlabs/Widget/Mailmenu.php:30 ../../include/nav.php:197
+#: ../../Zotlabs/Widget/Mailmenu.php:30 ../../include/nav.php:192
msgid "New Message"
msgstr "Neue Nachricht"
#: ../../Zotlabs/Widget/Chatroom_list.php:16
-#: ../../include/conversation.php:1816 ../../include/conversation.php:1819
-#: ../../include/nav.php:425 ../../include/nav.php:428
+#: ../../include/conversation.php:1813 ../../include/conversation.php:1816
+#: ../../include/nav.php:411 ../../include/nav.php:414
msgid "Chatrooms"
msgstr "Chaträume"
@@ -7958,23 +8185,22 @@ msgid "Archives"
msgstr "Archive"
#: ../../Zotlabs/Widget/Conversations.php:17
-#: ../../Zotlabs/Widget/Conversations.php:29
-msgid "Conversations"
-msgstr "Konversationen"
-
-#: ../../Zotlabs/Widget/Conversations.php:21
msgid "Received Messages"
msgstr "Erhaltene Nachrichten"
-#: ../../Zotlabs/Widget/Conversations.php:25
+#: ../../Zotlabs/Widget/Conversations.php:21
msgid "Sent Messages"
msgstr "Gesendete Nachrichten"
-#: ../../Zotlabs/Widget/Conversations.php:39
+#: ../../Zotlabs/Widget/Conversations.php:25
+msgid "Conversations"
+msgstr "Konversationen"
+
+#: ../../Zotlabs/Widget/Conversations.php:35
msgid "No messages."
msgstr "Keine Nachrichten."
-#: ../../Zotlabs/Widget/Conversations.php:57
+#: ../../Zotlabs/Widget/Conversations.php:55
msgid "Delete conversation"
msgstr "Unterhaltung löschen"
@@ -7990,11 +8216,11 @@ msgstr "Foto/Bild"
msgid "Remove term"
msgstr "Eintrag löschen"
-#: ../../Zotlabs/Widget/Savedsearch.php:83 ../../include/features.php:301
+#: ../../Zotlabs/Widget/Savedsearch.php:83 ../../include/features.php:297
msgid "Saved Searches"
msgstr "Gespeicherte Suchanfragen"
-#: ../../Zotlabs/Widget/Savedsearch.php:84 ../../include/group.php:336
+#: ../../Zotlabs/Widget/Savedsearch.php:84 ../../include/group.php:337
msgid "add"
msgstr "hinzufügen"
@@ -8002,15 +8228,15 @@ msgstr "hinzufügen"
msgid "Notes"
msgstr "Notizen"
-#: ../../Zotlabs/Widget/Wiki_pages.php:54 ../../addon/gitwiki/gitwiki.php:76
+#: ../../Zotlabs/Widget/Wiki_pages.php:52 ../../addon/gitwiki/gitwiki.php:76
msgid "Wiki Pages"
msgstr "Wikiseiten"
-#: ../../Zotlabs/Widget/Wiki_pages.php:60 ../../addon/gitwiki/gitwiki.php:81
+#: ../../Zotlabs/Widget/Wiki_pages.php:58 ../../addon/gitwiki/gitwiki.php:81
msgid "Add new page"
msgstr "Neue Seite hinzufügen"
-#: ../../Zotlabs/Widget/Wiki_pages.php:61 ../../addon/gitwiki/gitwiki.php:82
+#: ../../Zotlabs/Widget/Wiki_pages.php:59 ../../addon/gitwiki/gitwiki.php:82
msgid "Page name"
msgstr "Seitenname"
@@ -8031,7 +8257,7 @@ msgid "See more..."
msgstr "Mehr anzeigen …"
#: ../../Zotlabs/Widget/Filer.php:28 ../../include/contact_widgets.php:53
-#: ../../include/features.php:390
+#: ../../include/features.php:386
msgid "Saved Folders"
msgstr "Gespeicherte Ordner"
@@ -8087,15 +8313,15 @@ msgstr "Klon-Adressen verwalten"
msgid "Export channel"
msgstr "Kanal exportieren"
-#: ../../Zotlabs/Widget/Settings_menu.php:83
+#: ../../Zotlabs/Widget/Settings_menu.php:84
msgid "Connected apps"
msgstr "Verbundene Apps"
-#: ../../Zotlabs/Widget/Settings_menu.php:98 ../../include/features.php:153
+#: ../../Zotlabs/Widget/Settings_menu.php:100 ../../include/features.php:149
msgid "Permission Groups"
msgstr "Berechtigungsrollen"
-#: ../../Zotlabs/Widget/Settings_menu.php:115
+#: ../../Zotlabs/Widget/Settings_menu.php:117
msgid "Premium Channel Settings"
msgstr "Premium-Kanal-Einstellungen"
@@ -8107,156 +8333,147 @@ msgstr "Gespeicherte Chatrooms"
msgid "Source channel not found."
msgstr "Quellkanal nicht gefunden."
-#: ../../boot.php:1162 ../../addon/opensearch/opensearch.php:26
-#, php-format
-msgctxt "opensearch"
-msgid "Search %1$s (%2$s)"
-msgstr "Suche %1$s (%2$s)"
-
-#: ../../boot.php:1162 ../../addon/opensearch/opensearch.php:28
-msgctxt "opensearch"
-msgid "$Projectname"
-msgstr "$Projectname"
-
-#: ../../boot.php:1609
+#: ../../boot.php:1581
msgid "Create an account to access services and applications"
msgstr "Erstelle ein Konto, um auf Dienste und Anwendungen zugreifen zu können."
-#: ../../boot.php:1628 ../../include/nav.php:103 ../../include/nav.php:127
+#: ../../boot.php:1600 ../../include/nav.php:99 ../../include/nav.php:123
+#: ../../include/nav.php:140
msgid "Logout"
msgstr "Abmelden"
-#: ../../boot.php:1631
+#: ../../boot.php:1603
msgid "Login/Email"
msgstr "Anmelden/E-Mail"
-#: ../../boot.php:1632
+#: ../../boot.php:1604
msgid "Password"
msgstr "Kennwort"
-#: ../../boot.php:1633
+#: ../../boot.php:1605
msgid "Remember me"
msgstr "Angaben speichern"
-#: ../../boot.php:1636
+#: ../../boot.php:1608
msgid "Forgot your password?"
msgstr "Passwort vergessen?"
-#: ../../boot.php:2174
+#: ../../boot.php:2146
msgid "toggle mobile"
msgstr "auf/von mobile Ansicht wechseln"
-#: ../../boot.php:2327
+#: ../../boot.php:2299
#, php-format
msgid "[$Projectname] Website SSL error for %s"
msgstr "[$Projectname] Webseiten-SSL-Fehler für %s"
-#: ../../boot.php:2332
+#: ../../boot.php:2304
msgid "Website SSL certificate is not valid. Please correct."
msgstr "Das SSL-Zertifikat der Website ist nicht gültig. Bitte beheben."
-#: ../../boot.php:2450
+#: ../../boot.php:2423
#, php-format
msgid "[$Projectname] Cron tasks not running on %s"
msgstr "[$Projectname] Cron-Jobs laufen nicht auf %s"
-#: ../../boot.php:2455
+#: ../../boot.php:2428
msgid "Cron/Scheduled tasks not running."
msgstr "Cron-Aufgaben laufen nicht."
-#: ../../boot.php:2456 ../../include/datetime.php:286
+#: ../../boot.php:2429 ../../include/datetime.php:286
msgid "never"
msgstr "Nie"
-#: ../../view/theme/redbasic/php/config.php:9
+#: ../../view/theme/redbasic/php/config.php:16
+#: ../../view/theme/redbasic/php/config.php:19
msgid "Focus (Hubzilla default)"
msgstr "Focus (Voreinstellung für Hubzilla)"
-#: ../../view/theme/redbasic/php/config.php:88
+#: ../../view/theme/redbasic/php/config.php:99
msgid "Theme settings"
-msgstr "Theme-Einstellungen"
+msgstr "Design-Einstellungen"
-#: ../../view/theme/redbasic/php/config.php:89
+#: ../../view/theme/redbasic/php/config.php:100
msgid "Narrow navbar"
msgstr "Schmale Navigationsleiste"
-#: ../../view/theme/redbasic/php/config.php:90
+#: ../../view/theme/redbasic/php/config.php:101
msgid "Navigation bar background color"
msgstr "Hintergrundfarbe der Navigationsleiste"
-#: ../../view/theme/redbasic/php/config.php:91
+#: ../../view/theme/redbasic/php/config.php:102
msgid "Navigation bar icon color "
msgstr "Farbe für die Icons der Navigationsleiste"
-#: ../../view/theme/redbasic/php/config.php:92
+#: ../../view/theme/redbasic/php/config.php:103
msgid "Navigation bar active icon color "
msgstr "Farbe für aktive Icons der Navigationsleiste"
-#: ../../view/theme/redbasic/php/config.php:93
+#: ../../view/theme/redbasic/php/config.php:104
msgid "Link color"
msgstr "Linkfarbe"
-#: ../../view/theme/redbasic/php/config.php:94
+#: ../../view/theme/redbasic/php/config.php:105
msgid "Set font-color for banner"
msgstr "Farbe der Schrift des Banners"
-#: ../../view/theme/redbasic/php/config.php:95
+#: ../../view/theme/redbasic/php/config.php:106
msgid "Set the background color"
msgstr "Hintergrundfarbe"
-#: ../../view/theme/redbasic/php/config.php:96
+#: ../../view/theme/redbasic/php/config.php:107
msgid "Set the background image"
msgstr "Hintergrundbild"
-#: ../../view/theme/redbasic/php/config.php:97
+#: ../../view/theme/redbasic/php/config.php:108
msgid "Set the background color of items"
msgstr "Hintergrundfarbe für Beiträge"
-#: ../../view/theme/redbasic/php/config.php:98
+#: ../../view/theme/redbasic/php/config.php:109
msgid "Set the background color of comments"
msgstr "Hintergrundfarbe für Kommentare"
-#: ../../view/theme/redbasic/php/config.php:99
+#: ../../view/theme/redbasic/php/config.php:110
msgid "Set font-size for the entire application"
msgstr "Schriftgröße für die gesamte Anwendung"
-#: ../../view/theme/redbasic/php/config.php:99
+#: ../../view/theme/redbasic/php/config.php:110
msgid "Examples: 1rem, 100%, 16px"
msgstr "Beispiele: 1rem, 100%, 16px"
-#: ../../view/theme/redbasic/php/config.php:100
+#: ../../view/theme/redbasic/php/config.php:111
msgid "Set font-color for posts and comments"
msgstr "Schriftfarbe für Beiträge und Kommentare"
-#: ../../view/theme/redbasic/php/config.php:101
+#: ../../view/theme/redbasic/php/config.php:112
msgid "Set radius of corners"
msgstr "Ecken-Radius"
-#: ../../view/theme/redbasic/php/config.php:101
+#: ../../view/theme/redbasic/php/config.php:112
msgid "Example: 4px"
msgstr "Beispiel: 4px"
-#: ../../view/theme/redbasic/php/config.php:102
+#: ../../view/theme/redbasic/php/config.php:113
msgid "Set shadow depth of photos"
msgstr "Schattentiefe von Fotos"
-#: ../../view/theme/redbasic/php/config.php:103
+#: ../../view/theme/redbasic/php/config.php:114
msgid "Set maximum width of content region in pixel"
msgstr "Maximalbreite des Inhaltsbereichs in Pixel festlegen"
-#: ../../view/theme/redbasic/php/config.php:103
+#: ../../view/theme/redbasic/php/config.php:114
msgid "Leave empty for default width"
msgstr "Leer lassen für Standardbreite"
-#: ../../view/theme/redbasic/php/config.php:104
+#: ../../view/theme/redbasic/php/config.php:115
msgid "Left align page content"
msgstr "Seiteninhalt linksbündig anzeigen"
-#: ../../view/theme/redbasic/php/config.php:105
+#: ../../view/theme/redbasic/php/config.php:116
msgid "Set size of conversation author photo"
msgstr "Größe der Avatare von Themenstartern"
-#: ../../view/theme/redbasic/php/config.php:106
+#: ../../view/theme/redbasic/php/config.php:117
msgid "Set size of followup author photos"
msgstr "Größe der Avatare von Kommentatoren"
@@ -8398,232 +8615,43 @@ msgstr "Eine Einstellung"
msgid "Skeleton Settings"
msgstr "Skeleton Einstellungen"
-#: ../../addon/gnusoc/gnusoc.php:119
+#: ../../addon/gnusoc/gnusoc.php:200
msgid "GNU-Social Protocol Settings updated."
msgstr "GNU social Protokoll Einstellungen aktualisiert"
-#: ../../addon/gnusoc/gnusoc.php:130
+#: ../../addon/gnusoc/gnusoc.php:219
+msgid ""
+"The GNU-Social protocol does not support location independence. Connections "
+"you make within that network may be unreachable from alternate channel "
+"locations."
+msgstr "Das GNU-Social-Protokoll unterstützt keine Server-unabhängigen Identitäten. Verbindungen, die Du mit diesem Netzwerk eingehst, können von anderen Orten (Klonen) dieses Kanals aus unerreichbar sein."
+
+#: ../../addon/gnusoc/gnusoc.php:222
msgid "Enable the GNU-Social protocol for this channel"
msgstr "Aktiviere das GNU social Protokoll für diesen Kanal"
-#: ../../addon/gnusoc/gnusoc.php:134
+#: ../../addon/gnusoc/gnusoc.php:226
msgid "GNU-Social Protocol Settings"
msgstr "GNU social Protokoll Einstellungen"
-#: ../../addon/gnusoc/gnusoc.php:324
+#: ../../addon/gnusoc/gnusoc.php:417
msgid "Follow"
msgstr "Folgen"
-#: ../../addon/gnusoc/gnusoc.php:327
+#: ../../addon/gnusoc/gnusoc.php:420
#, php-format
msgid "%1$s is now following %2$s"
msgstr "%1$s folgt nun %2$s"
-#: ../../addon/cdav/Mod_Cdav.php:744
-msgid "INVALID EVENT DISMISSED!"
-msgstr "UNGÜLTIGEN TERMIN ABGELEHNT!"
-
-#: ../../addon/cdav/Mod_Cdav.php:745
-msgid "Summary: "
-msgstr "Zusammenfassung:"
-
-#: ../../addon/cdav/Mod_Cdav.php:746
-msgid "Date: "
-msgstr "Datum:"
-
-#: ../../addon/cdav/Mod_Cdav.php:747 ../../addon/cdav/Mod_Cdav.php:754
-msgid "Reason: "
-msgstr "Grund:"
-
-#: ../../addon/cdav/Mod_Cdav.php:752
-msgid "INVALID CARD DISMISSED!"
-msgstr "UNGÜLTIGE KARTE ABGELEHNT!"
-
-#: ../../addon/cdav/Mod_Cdav.php:753
-msgid "Name: "
-msgstr "Name: "
-
-#: ../../addon/cdav/Mod_Cdav.php:770
-msgid ""
-"You have to enable this plugin in Feature/Addon Settings > CalDAV/CardDAV "
-"Settings before you can use it."
-msgstr "Du musst dieses Plugin zunächst in Einstellungen > Plugin-Einstellungen > CalDAV/CardDAV-Einstellungen aktivieren, bevor Du es verwenden kannst."
-
-#: ../../addon/cdav/Mod_Cdav.php:836 ../../addon/cdav/Mod_Cdav.php:837
-msgid "Example: YYYY-MM-DD HH:mm"
-msgstr "Beispiel: JJJJ-MM-TT HH:mm"
-
-#: ../../addon/cdav/Mod_Cdav.php:837
-msgid "End date and time"
-msgstr "Enddatum und -zeit"
-
-#: ../../addon/cdav/Mod_Cdav.php:852
-msgid "List month"
-msgstr "Liste Monat"
-
-#: ../../addon/cdav/Mod_Cdav.php:853
-msgid "List week"
-msgstr "Liste Woche"
-
-#: ../../addon/cdav/Mod_Cdav.php:854
-msgid "List day"
-msgstr "Liste Tag"
-
-#: ../../addon/cdav/Mod_Cdav.php:861
-msgid "More"
-msgstr "Mehr"
-
-#: ../../addon/cdav/Mod_Cdav.php:862
-msgid "Less"
-msgstr "Weniger"
-
-#: ../../addon/cdav/Mod_Cdav.php:863
-msgid "Select calendar"
-msgstr "Kalender auswählen"
-
-#: ../../addon/cdav/Mod_Cdav.php:865
-msgid "Delete all"
-msgstr "Alles löschen"
-
-#: ../../addon/cdav/Mod_Cdav.php:867
-msgid "Sorry! Editing of recurrent events is not yet implemented."
-msgstr "Entschuldigung, aber das Bearbeiten von wiederkehrenden Veranstaltungen ist leider noch nicht implementiert."
-
-#: ../../addon/cdav/cdav.php:36
-msgid "Errors encountered creating database table: "
-msgstr "Fehler beim Anlegen der Datenbank-Tabellen aufgetreten."
-
-#: ../../addon/cdav/cdav.php:197
-msgid "Default Calendar"
-msgstr "Standardkalender"
-
-#: ../../addon/cdav/cdav.php:206
-msgid "Default Addressbook"
-msgstr "Standardadressbuch"
-
-#: ../../addon/cdav/cdav.php:215
-msgid "CalDAV/CardDAV Settings saved."
-msgstr "CalDAV/CardDAV-Einstellungen gespeichert."
-
-#: ../../addon/cdav/cdav.php:234
-msgid "Enable CalDAV/CardDAV Server for this channel"
-msgstr "Aktiviere den CalDAV/CardDAV Server für diesen Kanal"
-
-#: ../../addon/cdav/cdav.php:237
-#, php-format
-msgid "Your CalDAV resources are located at %s "
-msgstr "Deine CalDAV Resourcen sind unter %s verfügbar"
-
-#: ../../addon/cdav/cdav.php:240
-#, php-format
-msgid "Your CardDAV resources are located at %s "
-msgstr "Deine CardDAV Ressourcen sind unter %s verfügbar"
-
-#: ../../addon/cdav/cdav.php:246
-msgid "CalDAV/CardDAV Settings"
-msgstr "CalDAV/CardDAV-Einstellungen"
-
-#: ../../addon/cdav/cdav.php:272 ../../include/connections.php:670
-msgid "Home, Voice"
-msgstr "Zuhause, Sprache"
-
-#: ../../addon/cdav/cdav.php:273 ../../include/connections.php:671
-msgid "Home, Fax"
-msgstr "Zuhause, Fax"
-
-#: ../../addon/cdav/cdav.php:275 ../../include/connections.php:673
-msgid "Work, Voice"
-msgstr "Arbeit, Sprache"
-
-#: ../../addon/cdav/cdav.php:276 ../../include/connections.php:674
-msgid "Work, Fax"
-msgstr "Arbeit, Fax"
-
-#: ../../addon/cdav/include/widgets.php:37
-msgid "Select Channel"
-msgstr "Kanal auswählen"
-
-#: ../../addon/cdav/include/widgets.php:42
-msgid "Read-write"
-msgstr "Lesen-schreiben"
-
-#: ../../addon/cdav/include/widgets.php:43
-msgid "Read-only"
-msgstr "Nur Lesen"
-
-#: ../../addon/cdav/include/widgets.php:116
-msgid "My Calendars"
-msgstr "Meine Kalender"
-
-#: ../../addon/cdav/include/widgets.php:118
-msgid "Shared Calendars"
-msgstr "Geteilte Kalender"
-
-#: ../../addon/cdav/include/widgets.php:122
-msgid "Share this calendar"
-msgstr "Diesen Kalender teilen"
-
-#: ../../addon/cdav/include/widgets.php:124
-msgid "Calendar name and color"
-msgstr "Kalendername und -farbe"
-
-#: ../../addon/cdav/include/widgets.php:126
-msgid "Create new calendar"
-msgstr "Neuen Kalender erstellen"
-
-#: ../../addon/cdav/include/widgets.php:128
-msgid "Calendar Name"
-msgstr "Kalendername"
-
-#: ../../addon/cdav/include/widgets.php:129
-msgid "Calendar Tools"
-msgstr "Kalenderwerkzeuge"
-
-#: ../../addon/cdav/include/widgets.php:130
-msgid "Import calendar"
-msgstr "Kalender importieren"
-
-#: ../../addon/cdav/include/widgets.php:131
-msgid "Select a calendar to import to"
-msgstr "Kalender zum Hineinimportieren auswählen"
-
-#: ../../addon/cdav/include/widgets.php:158
-msgid "Addressbooks"
-msgstr "Adressbücher"
-
-#: ../../addon/cdav/include/widgets.php:160
-msgid "Addressbook name"
-msgstr "Adressbuchname"
-
-#: ../../addon/cdav/include/widgets.php:162
-msgid "Create new addressbook"
-msgstr "Neues Adressbuch erstellen"
-
-#: ../../addon/cdav/include/widgets.php:163
-msgid "Addressbook Name"
-msgstr "Adressbuchname"
-
-#: ../../addon/cdav/include/widgets.php:165
-msgid "Addressbook Tools"
-msgstr "Adressbuchwerkzeuge"
-
-#: ../../addon/cdav/include/widgets.php:166
-msgid "Import addressbook"
-msgstr "Adressbuch importieren"
-
-#: ../../addon/cdav/include/widgets.php:167
-msgid "Select an addressbook to import to"
-msgstr "Adressbuch zum Hineinimportieren auswählen"
-
#: ../../addon/planets/planets.php:121
msgid "Planets Settings updated."
msgstr "Planeten Einstellungen aktualisiert"
-#: ../../addon/planets/planets.php:153
+#: ../../addon/planets/planets.php:149
msgid "Enable Planets Plugin"
msgstr "Aktiviere Planeten Plugin"
-#: ../../addon/planets/planets.php:157
+#: ../../addon/planets/planets.php:153
msgid "Planets Settings"
msgstr "Planeten Einstellungen"
@@ -8656,8 +8684,8 @@ msgstr "Zurückkehren nach"
msgid "Page to load after image selection."
msgstr "Die Seite, die nach Auswahl eines Bildes geladen werden soll."
-#: ../../addon/openclipatar/openclipatar.php:58 ../../include/channel.php:1048
-#: ../../include/nav.php:111
+#: ../../addon/openclipatar/openclipatar.php:58 ../../include/channel.php:1165
+#: ../../include/nav.php:107
msgid "Edit Profile"
msgstr "Profil bearbeiten"
@@ -8796,7 +8824,7 @@ msgid ""
"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 ""
+msgstr "Dieses Plugin sucht in Beiträgen nach Wörtern oder Textbausteinen, die Du hier unterhalb einträgst, und faltet alle Beiträge zusammen, in denen es diese Bausteine findet. Auf diese Weise wird verhindert, dass Inhalte, wie z.B. sexuelle Anspielungen, in unpassenden Momenten angezeigt werden. Es gilt als höflich und empfohlen, den #NSFW Tag für Beiträge zu verwenden, bei denen Du davon ausgehen kannst, dass andere sie anstößig finden könnten. Du kannst aber auch beliebige andere Wörter in der Liste angeben und das Plugin so als allgemeinen Inhaltsfilter verwenden."
#: ../../addon/nsfw/nsfw.php:84
msgid "Enable Content filter"
@@ -8808,7 +8836,7 @@ msgstr "Kommaseparierte Liste von Schlüsselworten die verborgen werden sollen."
#: ../../addon/nsfw/nsfw.php:88
msgid "Word, /regular-expression/, lang=xx, lang!=xx"
-msgstr ""
+msgstr "Wort, /regular-expression/, lang=xx, lang!=xx"
#: ../../addon/nsfw/nsfw.php:92
msgid "Not Safe For Work Settings"
@@ -8917,7 +8945,7 @@ msgstr "Dreamwidth-Beitragseinstellungen"
#: ../../addon/firefox/firefox.php:23
msgid "Install Firefox Sharing Tools"
-msgstr ""
+msgstr "Installiere das Firefox Sharing Werkzeug"
#: ../../addon/firefox/firefox.php:34
msgid "Share content from Firefox to $Projectname"
@@ -8925,7 +8953,7 @@ msgstr "Inhalte von Firefox nach $Projectname teilen"
#: ../../addon/firefox/firefox.php:37
msgid "Install Firefox Sharing Tools to this web browser"
-msgstr ""
+msgstr "Installiere das Firefox Sharing Werkzeug in diesen Webbrowser"
#: ../../addon/dirstats/dirstats.php:94
msgid "Hubzilla Directory Stats"
@@ -9196,12 +9224,12 @@ msgid "Login failed."
msgstr "Login fehlgeschlagen."
#: ../../addon/openid/Mod_Id.php:85 ../../include/selectors.php:49
-#: ../../include/selectors.php:66
+#: ../../include/selectors.php:66 ../../include/channel.php:1332
msgid "Male"
msgstr "Männlich"
#: ../../addon/openid/Mod_Id.php:87 ../../include/selectors.php:49
-#: ../../include/selectors.php:66
+#: ../../include/selectors.php:66 ../../include/channel.php:1330
msgid "Female"
msgstr "Weiblich"
@@ -9388,33 +9416,45 @@ msgstr ""
msgid "declared undying love for"
msgstr ""
-#: ../../addon/diaspora/diaspora.php:675
+#: ../../addon/diaspora/diaspora.php:715
msgid "Diaspora Protocol Settings updated."
-msgstr ""
+msgstr "Diaspora Protokoll Einstellungen aktualisiert"
+
+#: ../../addon/diaspora/diaspora.php:734
+msgid ""
+"The Diaspora protocol does not support location independence. Connections "
+"you make within that network may be unreachable from alternate channel "
+"locations."
+msgstr "Das Diaspora-Protokoll unterstützt keine Server-unabhängigen Identitäten. Verbindungen, die Du mit diesem Netzwerk eingehst, können von anderen Orten (Klonen) dieses Kanals aus unerreichbar sein."
-#: ../../addon/diaspora/diaspora.php:694
+#: ../../addon/diaspora/diaspora.php:737
msgid "Enable the Diaspora protocol for this channel"
-msgstr ""
+msgstr "Das Diaspora Protokoll für diesen Kanal aktivieren"
-#: ../../addon/diaspora/diaspora.php:698
+#: ../../addon/diaspora/diaspora.php:741
msgid "Allow any Diaspora member to comment on your public posts"
-msgstr ""
+msgstr "Erlaube jedem Diaspora Nutzer deine öffentlichen Beiträge zu kommentieren"
-#: ../../addon/diaspora/diaspora.php:702
+#: ../../addon/diaspora/diaspora.php:745
msgid "Prevent your hashtags from being redirected to other sites"
-msgstr ""
+msgstr "Verhindern, dass Deine Hashtags zu anderen Seiten umgeleitet werden"
+
+#: ../../addon/diaspora/diaspora.php:749
+msgid ""
+"Sign and forward posts and comments with no existing Diaspora signature"
+msgstr "Signieren und Weiterleiten von Beiträgen und Kommentaren ohne vorhandene Diaspora-Signatur"
-#: ../../addon/diaspora/diaspora.php:707
+#: ../../addon/diaspora/diaspora.php:754
msgid "Followed hashtags (comma separated, do not include the #)"
-msgstr ""
+msgstr "Verfolgte Hashtags (Komma separierte Liste, ohne die #)"
-#: ../../addon/diaspora/diaspora.php:712
+#: ../../addon/diaspora/diaspora.php:759
msgid "Diaspora Protocol Settings"
-msgstr ""
+msgstr "Diaspora Protokoll Einstellungen"
#: ../../addon/diaspora/import_diaspora.php:16
msgid "No username found in import file."
-msgstr ""
+msgstr "Es wurde kein Nutzername in der importierten Datei gefunden."
#: ../../addon/diaspora/import_diaspora.php:41 ../../include/import.php:62
msgid "Unable to create a unique channel address. Import failed."
@@ -9534,25 +9574,6 @@ msgstr "Mail Test"
msgid "Message subject"
msgstr "Betreff der Nachricht"
-#: ../../addon/diaspora_reconnect/diaspora_reconnect.php:44
-#, php-format
-msgid "Reconnecting %d connections"
-msgstr ""
-
-#: ../../addon/diaspora_reconnect/diaspora_reconnect.php:63
-msgid "Diaspora Reconnect"
-msgstr ""
-
-#: ../../addon/diaspora_reconnect/diaspora_reconnect.php:65
-msgid ""
-"Use this form to re-establish Diaspora connections which were initially made"
-" from a different hub."
-msgstr ""
-
-#: ../../addon/diaspora_reconnect/diaspora_reconnect.php:70
-msgid "Reconnect"
-msgstr ""
-
#: ../../addon/openstreetmap/openstreetmap.php:146
msgid "View Larger"
msgstr "Größer anzeigen"
@@ -9636,10 +9657,10 @@ msgstr "Friendica-Passwort"
#: ../../addon/rtof/rtof.php:101
msgid "Hubzilla to Friendica Post Settings"
-msgstr ""
+msgstr "Hubzilla-zu-Friendica Beitragseinstellungen"
-#: ../../addon/jappixmini/jappixmini.php:305 ../../include/channel.php:1139
-#: ../../include/channel.php:1296
+#: ../../addon/jappixmini/jappixmini.php:305 ../../include/channel.php:1256
+#: ../../include/channel.php:1419
msgid "Status:"
msgstr "Status:"
@@ -9678,7 +9699,7 @@ msgstr "Hubzilla-Passwort"
#: ../../addon/jappixmini/jappixmini.php:351
#: ../../addon/jappixmini/jappixmini.php:355
msgid "Approve subscription requests from Hubzilla contacts automatically"
-msgstr ""
+msgstr "Verbindungsanfragen von Hubzilla-Kontakten automatisch annehmen"
#: ../../addon/jappixmini/jappixmini.php:359
msgid "Purge internal list of jabber addresses of contacts"
@@ -9714,7 +9735,7 @@ msgstr "Superblock Einstellungen aktualisiert"
#: ../../addon/nofed/nofed.php:42
msgid "Federate"
-msgstr ""
+msgstr "Beitrag verteilen"
#: ../../addon/nofed/nofed.php:56
msgid "nofed Settings saved."
@@ -9722,11 +9743,11 @@ msgstr "nofed Einstellungen gespeichert"
#: ../../addon/nofed/nofed.php:72
msgid "Allow Federation Toggle"
-msgstr ""
+msgstr "Umschalter zur Beitragsverteilung bereitstellen"
#: ../../addon/nofed/nofed.php:76
msgid "Federate posts by default"
-msgstr ""
+msgstr "Beiträge standardmäßig verteilen"
#: ../../addon/nofed/nofed.php:80
msgid "NoFed Settings"
@@ -10194,7 +10215,7 @@ msgstr "Sie müssen weiß oder schwarz auswählen."
msgid "Error creating new game."
msgstr "Fehler beim Erstellen eines neuen Spiels."
-#: ../../addon/chess/chess.php:381 ../../include/channel.php:899
+#: ../../addon/chess/chess.php:381 ../../include/channel.php:1016
msgid "Requested channel is not available."
msgstr "Angeforderte Kanal nicht verfügbar."
@@ -10227,7 +10248,7 @@ msgid ""
"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 ""
+msgstr "Auf diesem Hubzilla-Server ist das Twitter-Plugin aktiviert, aber Du hast Dich hier noch nicht mit Deinem Twitter-Konto verbunden. Um dies zu tun, klicke die Schaltfläche unten, um eine PIN von Twitter zu erhalten, die Du dann in das Eingabefeld darunter einfügen und das Formular bestätigen musst. Nur Deine <strong>öffentlichen</strong> Beiträge werden auf Twitter geteilt."
#: ../../addon/twitter/twitter.php:207
msgid "Log in with Twitter"
@@ -10243,7 +10264,7 @@ msgid ""
"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 ""
+msgstr "<strong>Hinweis:</strong> Entsprechend Deiner Privatsphären-Einstellungen (<em>Profil-Details vor nicht angemeldeten Besuchern verbergen?</em>) kann ein ggf. zu Twitter geteilter Link Besucher auf eine leere Seite führen, die darüber informiert, dass der Zugriff zu Deinem Profil eingeschränkt ist."
#: ../../addon/twitter/twitter.php:242
msgid "Allow posting to Twitter"
@@ -10269,15 +10290,15 @@ msgstr "Wenn aktiv können deine öffentlichen Beiträge bei dem verbundenen Twi
msgid "Twitter Post Settings"
msgstr "Twitter-Beitragseinstellungen"
-#: ../../addon/smileybutton/smileybutton.php:273
+#: ../../addon/smileybutton/smileybutton.php:211
msgid "Deactivate the feature"
msgstr "Diese Funktion abschalten"
-#: ../../addon/smileybutton/smileybutton.php:277
+#: ../../addon/smileybutton/smileybutton.php:215
msgid "Hide the button and show the smilies directly."
msgstr "Verstecke die Schaltfläche und zeige die Smilies direkt an."
-#: ../../addon/smileybutton/smileybutton.php:281
+#: ../../addon/smileybutton/smileybutton.php:219
msgid "Smileybutton Settings"
msgstr "Smileyknopf-Einstellungen"
@@ -10490,7 +10511,7 @@ msgstr "Erweitertes Teilen von Identitäten"
msgid ""
"Share your identity with all websites on the internet. When disabled, "
"identity is only shared with sites in the matrix."
-msgstr ""
+msgstr "Teile Deine Identität mit allen Webseiten im Internet. Ist dies deaktiviert, wird Deine Identität nur mit Hubzilla-Servern geteilt."
#: ../../addon/tictac/tictac.php:21
msgid "Three Dimensional Tic-Tac-Toe"
@@ -10558,6 +10579,22 @@ msgstr "Nachrichtenkopf-Einstellungen"
msgid "pageheader Settings saved."
msgstr "Nachrichtenkopf-Einstellungen gespeichert."
+#: ../../addon/authchoose/authchoose.php:67
+msgid "Only authenticate automatically to sites of your friends"
+msgstr "Authentifiziere Dich nur auf Seiten deiner Freunde automatisch"
+
+#: ../../addon/authchoose/authchoose.php:67
+msgid "By default you are automatically authenticated anywhere in the network"
+msgstr "Authentifiziere Dich standardmäßig bei allen Seiten im Netzwerk automatisch"
+
+#: ../../addon/authchoose/authchoose.php:71
+msgid "Authchoose Settings"
+msgstr "Einstellungen für automatische Authentifizierung"
+
+#: ../../addon/authchoose/authchoose.php:85
+msgid "Atuhchoose Settings updated."
+msgstr "Einstellungen für automatische Authentifizierung aktualisiert."
+
#: ../../addon/moremoods/moremoods.php:19
msgid "lonely"
msgstr "einsam"
@@ -10753,6 +10790,17 @@ msgstr "Ein Konto wurde für Sie erstellt."
msgid "Authentication successful but rejected: account creation is disabled."
msgstr "Authentifizierung war erfolgreich wurde aber abgewiesen! Das Anlegen von Accounts wurde deaktiviert."
+#: ../../addon/opensearch/opensearch.php:26
+#, php-format
+msgctxt "opensearch"
+msgid "Search %1$s (%2$s)"
+msgstr "Suche %1$s (%2$s)"
+
+#: ../../addon/opensearch/opensearch.php:28
+msgctxt "opensearch"
+msgid "$Projectname"
+msgstr "$Projectname"
+
#: ../../addon/opensearch/opensearch.php:43
msgid "Search $Projectname"
msgstr "$Projectname suchen"
@@ -10851,11 +10899,11 @@ msgstr "Transsexuell"
msgid "Hermaphrodite"
msgstr "Zwitter"
-#: ../../include/selectors.php:49
+#: ../../include/selectors.php:49 ../../include/channel.php:1336
msgid "Neuter"
msgstr "Geschlechtslos"
-#: ../../include/selectors.php:49
+#: ../../include/selectors.php:49 ../../include/channel.php:1338
msgid "Non-specific"
msgstr "unklar"
@@ -11045,341 +11093,288 @@ msgstr "%1$s ist jetzt mit %2$s verbunden"
msgid "%1$s poked %2$s"
msgstr "%1$s stupste %2$s an"
-#: ../../include/conversation.php:239 ../../include/text.php:1115
-#: ../../include/text.php:1120
+#: ../../include/conversation.php:239 ../../include/text.php:1096
+#: ../../include/text.php:1101
msgid "poked"
msgstr "stupste"
-#: ../../include/conversation.php:691
+#: ../../include/conversation.php:688
#, php-format
msgid "View %s's profile @ %s"
msgstr "%ss Profil auf %s ansehen"
-#: ../../include/conversation.php:711
+#: ../../include/conversation.php:708
msgid "Categories:"
msgstr "Kategorien:"
-#: ../../include/conversation.php:712
+#: ../../include/conversation.php:709
msgid "Filed under:"
msgstr "Gespeichert unter:"
-#: ../../include/conversation.php:737
+#: ../../include/conversation.php:734
msgid "View in context"
msgstr "Im Zusammenhang anschauen"
-#: ../../include/conversation.php:834
+#: ../../include/conversation.php:831
msgid "remove"
msgstr "lösche"
-#: ../../include/conversation.php:838 ../../include/nav.php:272
+#: ../../include/conversation.php:835 ../../include/nav.php:268
msgid "Loading..."
msgstr "Lädt ..."
-#: ../../include/conversation.php:839
+#: ../../include/conversation.php:836
msgid "Delete Selected Items"
msgstr "Lösche die ausgewählten Elemente"
-#: ../../include/conversation.php:882
+#: ../../include/conversation.php:879
msgid "View Source"
msgstr "Quelle anzeigen"
-#: ../../include/conversation.php:892
+#: ../../include/conversation.php:889
msgid "Follow Thread"
msgstr "Unterhaltung folgen"
-#: ../../include/conversation.php:901
+#: ../../include/conversation.php:898
msgid "Unfollow Thread"
msgstr "Unterhaltung nicht mehr folgen"
-#: ../../include/conversation.php:992
+#: ../../include/conversation.php:989
msgid "Activity/Posts"
msgstr "Aktivitäten/Beiträge"
-#: ../../include/conversation.php:1012
+#: ../../include/conversation.php:1009
msgid "Edit Connection"
msgstr "Verbindung bearbeiten"
-#: ../../include/conversation.php:1022
+#: ../../include/conversation.php:1019
msgid "Message"
msgstr "Nachricht"
-#: ../../include/conversation.php:1156
+#: ../../include/conversation.php:1153
#, php-format
msgid "%s likes this."
msgstr "%s gefällt das."
-#: ../../include/conversation.php:1156
+#: ../../include/conversation.php:1153
#, php-format
msgid "%s doesn't like this."
msgstr "%s gefällt das nicht."
-#: ../../include/conversation.php:1160
+#: ../../include/conversation.php:1157
#, 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."
-#: ../../include/conversation.php:1162
+#: ../../include/conversation.php:1159
#, 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."
-#: ../../include/conversation.php:1168
+#: ../../include/conversation.php:1165
msgid "and"
msgstr "und"
-#: ../../include/conversation.php:1171
+#: ../../include/conversation.php:1168
#, php-format
msgid ", and %d other people"
msgid_plural ", and %d other people"
msgstr[0] ""
msgstr[1] ", und %d andere"
-#: ../../include/conversation.php:1172
+#: ../../include/conversation.php:1169
#, php-format
msgid "%s like this."
msgstr "%s gefällt das."
-#: ../../include/conversation.php:1172
+#: ../../include/conversation.php:1169
#, php-format
msgid "%s don't like this."
msgstr "%s gefällt das nicht."
-#: ../../include/conversation.php:1215
+#: ../../include/conversation.php:1212
msgid "Set your location"
msgstr "Standort"
-#: ../../include/conversation.php:1216
+#: ../../include/conversation.php:1213
msgid "Clear browser location"
msgstr "Browser-Standort löschen"
-#: ../../include/conversation.php:1264
+#: ../../include/conversation.php:1261
msgid "Tag term:"
msgstr "Schlagwort:"
-#: ../../include/conversation.php:1265
+#: ../../include/conversation.php:1262
msgid "Where are you right now?"
msgstr "Wo bist Du jetzt grade?"
-#: ../../include/conversation.php:1270
+#: ../../include/conversation.php:1267
msgid "Choose a different album..."
msgstr "Wählen Sie ein anderes Album aus..."
-#: ../../include/conversation.php:1274
+#: ../../include/conversation.php:1271
msgid "Comments enabled"
msgstr "Kommentare aktiviert"
-#: ../../include/conversation.php:1275
+#: ../../include/conversation.php:1272
msgid "Comments disabled"
msgstr "Kommentare deaktiviert"
-#: ../../include/conversation.php:1313
+#: ../../include/conversation.php:1310
msgid "Page link name"
msgstr "Link zur Seite"
-#: ../../include/conversation.php:1316
+#: ../../include/conversation.php:1313
msgid "Post as"
msgstr "Veröffentlichen als"
-#: ../../include/conversation.php:1330
+#: ../../include/conversation.php:1327
msgid "Toggle voting"
msgstr "Umfragewerkzeug aktivieren"
-#: ../../include/conversation.php:1333
+#: ../../include/conversation.php:1330
msgid "Disable comments"
msgstr "Kommentare deaktivieren"
-#: ../../include/conversation.php:1334
+#: ../../include/conversation.php:1331
msgid "Toggle comments"
msgstr "Kommentare umschalten"
-#: ../../include/conversation.php:1342
+#: ../../include/conversation.php:1339
msgid "Categories (optional, comma-separated list)"
msgstr "Kategorien (optional, kommagetrennte Liste)"
-#: ../../include/conversation.php:1365
+#: ../../include/conversation.php:1362
msgid "Other networks and post services"
msgstr "Andere Netzwerke und Platformen"
-#: ../../include/conversation.php:1371
+#: ../../include/conversation.php:1368
msgid "Set publish date"
msgstr "Veröffentlichungsdatum festlegen"
-#: ../../include/conversation.php:1634
+#: ../../include/conversation.php:1631
msgid "Discover"
msgstr "Entdecken"
-#: ../../include/conversation.php:1637
+#: ../../include/conversation.php:1634
msgid "Imported public streams"
msgstr "Importierte öffentliche Beiträge"
-#: ../../include/conversation.php:1642
+#: ../../include/conversation.php:1639
msgid "Commented Order"
msgstr "Neueste Kommentare"
-#: ../../include/conversation.php:1645
+#: ../../include/conversation.php:1642
msgid "Sort by Comment Date"
msgstr "Nach Kommentardatum sortiert"
-#: ../../include/conversation.php:1649
+#: ../../include/conversation.php:1646
msgid "Posted Order"
msgstr "Neueste Beiträge"
-#: ../../include/conversation.php:1652
+#: ../../include/conversation.php:1649
msgid "Sort by Post Date"
msgstr "Nach Beitragsdatum sortiert"
-#: ../../include/conversation.php:1660
+#: ../../include/conversation.php:1657
msgid "Posts that mention or involve you"
msgstr "Beiträge mit Beteiligung Deinerseits"
-#: ../../include/conversation.php:1669
+#: ../../include/conversation.php:1666
msgid "Activity Stream - by date"
msgstr "Activity Stream – nach Datum sortiert"
-#: ../../include/conversation.php:1675
+#: ../../include/conversation.php:1672
msgid "Starred"
msgstr "Markiert"
-#: ../../include/conversation.php:1678
+#: ../../include/conversation.php:1675
msgid "Favourite Posts"
msgstr "Markierte Beiträge"
-#: ../../include/conversation.php:1685
+#: ../../include/conversation.php:1682
msgid "Spam"
msgstr "Spam"
-#: ../../include/conversation.php:1688
+#: ../../include/conversation.php:1685
msgid "Posts flagged as SPAM"
msgstr "Nachrichten, die als SPAM markiert wurden"
-#: ../../include/conversation.php:1763 ../../include/nav.php:372
+#: ../../include/conversation.php:1760 ../../include/nav.php:358
msgid "Status Messages and Posts"
msgstr "Statusnachrichten und Beiträge"
-#: ../../include/conversation.php:1776 ../../include/nav.php:385
+#: ../../include/conversation.php:1773 ../../include/nav.php:371
msgid "Profile Details"
msgstr "Profil-Details"
-#: ../../include/conversation.php:1786 ../../include/nav.php:395
-#: ../../include/photos.php:528
+#: ../../include/conversation.php:1783 ../../include/nav.php:381
+#: ../../include/photos.php:525
msgid "Photo Albums"
msgstr "Fotoalben"
-#: ../../include/conversation.php:1794 ../../include/nav.php:403
+#: ../../include/conversation.php:1791 ../../include/nav.php:389
msgid "Files and Storage"
msgstr "Dateien und Speicher"
-#: ../../include/conversation.php:1830 ../../include/nav.php:438
+#: ../../include/conversation.php:1827 ../../include/nav.php:424
msgid "Bookmarks"
msgstr "Lesezeichen"
-#: ../../include/conversation.php:1833 ../../include/nav.php:441
+#: ../../include/conversation.php:1830 ../../include/nav.php:427
msgid "Saved Bookmarks"
msgstr "Gespeicherte Lesezeichen"
-#: ../../include/conversation.php:1844 ../../include/nav.php:452
+#: ../../include/conversation.php:1841 ../../include/nav.php:438
msgid "View Webpages"
msgstr "Webseiten anzeigen"
-#: ../../include/conversation.php:1913
+#: ../../include/conversation.php:1910
msgctxt "noun"
msgid "Attending"
msgid_plural "Attending"
msgstr[0] "Zusage"
msgstr[1] "Zusagen"
-#: ../../include/conversation.php:1916
+#: ../../include/conversation.php:1913
msgctxt "noun"
msgid "Not Attending"
msgid_plural "Not Attending"
msgstr[0] "Absage"
msgstr[1] "Absagen"
-#: ../../include/conversation.php:1919
+#: ../../include/conversation.php:1916
msgctxt "noun"
msgid "Undecided"
msgid_plural "Undecided"
msgstr[0] " Unentschlossen"
msgstr[1] "Unentschlossene"
-#: ../../include/conversation.php:1922
+#: ../../include/conversation.php:1919
msgctxt "noun"
msgid "Agree"
msgid_plural "Agrees"
msgstr[0] "Zustimmung"
msgstr[1] "Zustimmungen"
-#: ../../include/conversation.php:1925
+#: ../../include/conversation.php:1922
msgctxt "noun"
msgid "Disagree"
msgid_plural "Disagrees"
msgstr[0] "Ablehnung"
msgstr[1] "Ablehnungen"
-#: ../../include/conversation.php:1928
+#: ../../include/conversation.php:1925
msgctxt "noun"
msgid "Abstain"
msgid_plural "Abstains"
msgstr[0] "Enthaltung"
msgstr[1] "Enthaltungen"
-#: ../../include/permissions.php:35
-msgid "Can view my normal stream and posts"
-msgstr "Kann meine normalen Beiträge sehen"
-
-#: ../../include/permissions.php:39
-msgid "Can view my webpages"
-msgstr "Kann meine Webseiten sehen"
-
-#: ../../include/permissions.php:43
-msgid "Can post on my channel page (\"wall\")"
-msgstr "Kann auf meiner Kanal-Seite (\"wall\") Beiträge veröffentlichen"
-
-#: ../../include/permissions.php:46
-msgid "Can like/dislike stuff"
-msgstr "Kann andere Elemente mögen/nicht mögen"
-
-#: ../../include/permissions.php:46
-msgid "Profiles and things other than posts/comments"
-msgstr "Profile und alles außer Beiträge und Kommentare"
-
-#: ../../include/permissions.php:48
-msgid "Can forward to all my channel contacts via post @mentions"
-msgstr "Kann an alle meine Kontakte via @-Erwähnung Nachrichten weiterleiten"
-
-#: ../../include/permissions.php:48
-msgid "Advanced - useful for creating group forum channels"
-msgstr "Fortgeschritten - sinnvoll, um Gruppen-Kanäle/-Foren zu erstellen"
-
-#: ../../include/permissions.php:49
-msgid "Can chat with me (when available)"
-msgstr "Kann mit mir chatten (wenn verfügbar)"
-
-#: ../../include/permissions.php:50
-msgid "Can write to my file storage and photos"
-msgstr "Kann in meine Datei- und Bilderordner schreiben"
-
-#: ../../include/permissions.php:51
-msgid "Can edit my webpages"
-msgstr "Kann meine Webseiten bearbeiten"
-
-#: ../../include/permissions.php:53
-msgid "Somewhat advanced - very useful in open communities"
-msgstr "Etwas fortgeschritten – sehr nützlich in offenen Gemeinschaften"
-
-#: ../../include/permissions.php:55
-msgid "Can administer my channel resources"
-msgstr "Kann meine Kanäle administrieren"
-
-#: ../../include/permissions.php:55
-msgid ""
-"Extremely advanced. Leave this alone unless you know what you are doing"
-msgstr "Sehr fortgeschritten. Bearbeite das nur, wenn Du genau weißt, was Du tust"
-
#: ../../include/dir_fns.php:141
msgid "Directory Options"
msgstr "Verzeichnisoptionen"
@@ -11434,320 +11429,328 @@ msgstr "älter"
msgid "newer"
msgstr "neuer"
-#: ../../include/text.php:945
+#: ../../include/text.php:939
msgid "No connections"
msgstr "Keine Verbindungen"
-#: ../../include/text.php:970
+#: ../../include/text.php:964
#, php-format
msgid "View all %s connections"
msgstr "Alle Verbindungen von %s anzeigen"
-#: ../../include/text.php:1115 ../../include/text.php:1120
+#: ../../include/text.php:1096 ../../include/text.php:1101
msgid "poke"
msgstr "anstupsen"
-#: ../../include/text.php:1121
+#: ../../include/text.php:1102
msgid "ping"
msgstr "anpingen"
-#: ../../include/text.php:1121
+#: ../../include/text.php:1102
msgid "pinged"
msgstr "pingte"
-#: ../../include/text.php:1122
+#: ../../include/text.php:1103
msgid "prod"
msgstr "knuffen"
-#: ../../include/text.php:1122
+#: ../../include/text.php:1103
msgid "prodded"
msgstr "knuffte"
-#: ../../include/text.php:1123
+#: ../../include/text.php:1104
msgid "slap"
msgstr "ohrfeigen"
-#: ../../include/text.php:1123
+#: ../../include/text.php:1104
msgid "slapped"
msgstr "ohrfeigte"
-#: ../../include/text.php:1124
+#: ../../include/text.php:1105
msgid "finger"
msgstr "befummeln"
-#: ../../include/text.php:1124
+#: ../../include/text.php:1105
msgid "fingered"
msgstr "befummelte"
-#: ../../include/text.php:1125
+#: ../../include/text.php:1106
msgid "rebuff"
msgstr "eine Abfuhr erteilen"
-#: ../../include/text.php:1125
+#: ../../include/text.php:1106
msgid "rebuffed"
msgstr "zurückgewiesen"
-#: ../../include/text.php:1137
+#: ../../include/text.php:1118
msgid "happy"
msgstr "glücklich"
-#: ../../include/text.php:1138
+#: ../../include/text.php:1119
msgid "sad"
msgstr "traurig"
-#: ../../include/text.php:1139
+#: ../../include/text.php:1120
msgid "mellow"
msgstr "sanft"
-#: ../../include/text.php:1140
+#: ../../include/text.php:1121
msgid "tired"
msgstr "müde"
-#: ../../include/text.php:1141
+#: ../../include/text.php:1122
msgid "perky"
msgstr "frech"
-#: ../../include/text.php:1142
+#: ../../include/text.php:1123
msgid "angry"
msgstr "sauer"
-#: ../../include/text.php:1143
+#: ../../include/text.php:1124
msgid "stupefied"
msgstr "verblüfft"
-#: ../../include/text.php:1144
+#: ../../include/text.php:1125
msgid "puzzled"
msgstr "verwirrt"
-#: ../../include/text.php:1145
+#: ../../include/text.php:1126
msgid "interested"
msgstr "interessiert"
-#: ../../include/text.php:1146
+#: ../../include/text.php:1127
msgid "bitter"
msgstr "verbittert"
-#: ../../include/text.php:1147
+#: ../../include/text.php:1128
msgid "cheerful"
msgstr "fröhlich"
-#: ../../include/text.php:1148
+#: ../../include/text.php:1129
msgid "alive"
msgstr "lebendig"
-#: ../../include/text.php:1149
+#: ../../include/text.php:1130
msgid "annoyed"
msgstr "verärgert"
-#: ../../include/text.php:1150
+#: ../../include/text.php:1131
msgid "anxious"
msgstr "unruhig"
-#: ../../include/text.php:1151
+#: ../../include/text.php:1132
msgid "cranky"
msgstr "schrullig"
-#: ../../include/text.php:1152
+#: ../../include/text.php:1133
msgid "disturbed"
msgstr "verstört"
-#: ../../include/text.php:1153
+#: ../../include/text.php:1134
msgid "frustrated"
msgstr "frustriert"
-#: ../../include/text.php:1154
+#: ../../include/text.php:1135
msgid "depressed"
msgstr "deprimiert"
-#: ../../include/text.php:1155
+#: ../../include/text.php:1136
msgid "motivated"
msgstr "motiviert"
-#: ../../include/text.php:1156
+#: ../../include/text.php:1137
msgid "relaxed"
msgstr "entspannt"
-#: ../../include/text.php:1157
+#: ../../include/text.php:1138
msgid "surprised"
msgstr "überrascht"
-#: ../../include/text.php:1335 ../../include/js_strings.php:70
+#: ../../include/text.php:1312 ../../include/js_strings.php:70
msgid "Monday"
msgstr "Montag"
-#: ../../include/text.php:1335 ../../include/js_strings.php:71
+#: ../../include/text.php:1312 ../../include/js_strings.php:71
msgid "Tuesday"
msgstr "Dienstag"
-#: ../../include/text.php:1335 ../../include/js_strings.php:72
+#: ../../include/text.php:1312 ../../include/js_strings.php:72
msgid "Wednesday"
msgstr "Mittwoch"
-#: ../../include/text.php:1335 ../../include/js_strings.php:73
+#: ../../include/text.php:1312 ../../include/js_strings.php:73
msgid "Thursday"
msgstr "Donnerstag"
-#: ../../include/text.php:1335 ../../include/js_strings.php:74
+#: ../../include/text.php:1312 ../../include/js_strings.php:74
msgid "Friday"
msgstr "Freitag"
-#: ../../include/text.php:1335 ../../include/js_strings.php:75
+#: ../../include/text.php:1312 ../../include/js_strings.php:75
msgid "Saturday"
msgstr "Samstag"
-#: ../../include/text.php:1335 ../../include/js_strings.php:69
+#: ../../include/text.php:1312 ../../include/js_strings.php:69
msgid "Sunday"
msgstr "Sonntag"
-#: ../../include/text.php:1339 ../../include/js_strings.php:45
+#: ../../include/text.php:1316 ../../include/js_strings.php:45
msgid "January"
msgstr "Januar"
-#: ../../include/text.php:1339 ../../include/js_strings.php:46
+#: ../../include/text.php:1316 ../../include/js_strings.php:46
msgid "February"
msgstr "Februar"
-#: ../../include/text.php:1339 ../../include/js_strings.php:47
+#: ../../include/text.php:1316 ../../include/js_strings.php:47
msgid "March"
msgstr "März"
-#: ../../include/text.php:1339 ../../include/js_strings.php:48
+#: ../../include/text.php:1316 ../../include/js_strings.php:48
msgid "April"
msgstr "April"
-#: ../../include/text.php:1339
+#: ../../include/text.php:1316
msgid "May"
msgstr "Mai"
-#: ../../include/text.php:1339 ../../include/js_strings.php:50
+#: ../../include/text.php:1316 ../../include/js_strings.php:50
msgid "June"
msgstr "Juni"
-#: ../../include/text.php:1339 ../../include/js_strings.php:51
+#: ../../include/text.php:1316 ../../include/js_strings.php:51
msgid "July"
msgstr "Juli"
-#: ../../include/text.php:1339 ../../include/js_strings.php:52
+#: ../../include/text.php:1316 ../../include/js_strings.php:52
msgid "August"
msgstr "August"
-#: ../../include/text.php:1339 ../../include/js_strings.php:53
+#: ../../include/text.php:1316 ../../include/js_strings.php:53
msgid "September"
msgstr "September"
-#: ../../include/text.php:1339 ../../include/js_strings.php:54
+#: ../../include/text.php:1316 ../../include/js_strings.php:54
msgid "October"
msgstr "Oktober"
-#: ../../include/text.php:1339 ../../include/js_strings.php:55
+#: ../../include/text.php:1316 ../../include/js_strings.php:55
msgid "November"
msgstr "November"
-#: ../../include/text.php:1339 ../../include/js_strings.php:56
+#: ../../include/text.php:1316 ../../include/js_strings.php:56
msgid "December"
msgstr "Dezember"
-#: ../../include/text.php:1403 ../../include/text.php:1407
+#: ../../include/text.php:1380 ../../include/text.php:1384
msgid "Unknown Attachment"
msgstr "Unbekannter Anhang"
-#: ../../include/text.php:1409
+#: ../../include/text.php:1386 ../../include/feedutils.php:780
msgid "unknown"
msgstr "unbekannt"
-#: ../../include/text.php:1445
+#: ../../include/text.php:1422
msgid "remove category"
msgstr "Kategorie entfernen"
-#: ../../include/text.php:1519
+#: ../../include/text.php:1496
msgid "remove from file"
msgstr "aus der Datei entfernen"
-#: ../../include/text.php:1781 ../../include/language.php:367
+#: ../../include/text.php:1615 ../../include/message.php:12
+msgid "Download binary/encrypted content"
+msgstr "Binären/verschlüsselten Inhalt herunterladen"
+
+#: ../../include/text.php:1774 ../../include/language.php:367
msgid "default"
msgstr "Standard"
-#: ../../include/text.php:1789
+#: ../../include/text.php:1782
msgid "Page layout"
msgstr "Seiten-Layout"
-#: ../../include/text.php:1789
+#: ../../include/text.php:1782
msgid "You can create your own with the layouts tool"
msgstr "Mit dem Gestaltungswerkzeug kannst Du Deine eigenen Layouts erstellen"
-#: ../../include/text.php:1817
+#: ../../include/text.php:1810
msgid "Page content type"
msgstr "Art des Seiteninhalts"
-#: ../../include/text.php:1950
+#: ../../include/text.php:1943
msgid "activity"
msgstr "Aktivität"
-#: ../../include/text.php:2264
+#: ../../include/text.php:2006
+msgid "a-z, 0-9, -, _, and . only"
+msgstr "nur a-z, 0-9, -, _, und ."
+
+#: ../../include/text.php:2277
msgid "Design Tools"
msgstr "Gestaltungswerkzeuge"
-#: ../../include/text.php:2270
+#: ../../include/text.php:2283
msgid "Pages"
msgstr "Seiten"
-#: ../../include/text.php:2292
+#: ../../include/text.php:2305
msgid "Import website..."
msgstr "Webseite importieren..."
-#: ../../include/text.php:2293
+#: ../../include/text.php:2306
msgid "Select folder to import"
msgstr "Ordner zum Importieren auswählen"
-#: ../../include/text.php:2294
+#: ../../include/text.php:2307
msgid "Import from a zipped folder:"
msgstr "Aus einem gezippten Ordner importieren:"
-#: ../../include/text.php:2295
+#: ../../include/text.php:2308
msgid "Import from cloud files:"
msgstr "Aus Cloud-Dateien importieren:"
-#: ../../include/text.php:2296
+#: ../../include/text.php:2309
msgid "/cloud/channel/path/to/folder"
msgstr "/Cloud/Kanal/Pfad/zum/Ordner"
-#: ../../include/text.php:2297
+#: ../../include/text.php:2310
msgid "Enter path to website files"
msgstr "Pfad zu Webseitendateien eingeben"
-#: ../../include/text.php:2298
+#: ../../include/text.php:2311
msgid "Select folder"
msgstr "Ordner auswählen"
-#: ../../include/text.php:2299
+#: ../../include/text.php:2312
msgid "Export website..."
msgstr "Webseite exportieren..."
-#: ../../include/text.php:2300
+#: ../../include/text.php:2313
msgid "Export to a zip file"
msgstr "In eine ZIP-Datei exportieren"
-#: ../../include/text.php:2301
+#: ../../include/text.php:2314
msgid "website.zip"
msgstr "website.zip"
-#: ../../include/text.php:2302
+#: ../../include/text.php:2315
msgid "Enter a name for the zip file."
msgstr "Geben Sie einen für die ZIP-Datei ein."
-#: ../../include/text.php:2303
+#: ../../include/text.php:2316
msgid "Export to cloud files"
msgstr "In Cloud-Dateien exportieren"
-#: ../../include/text.php:2304
+#: ../../include/text.php:2317
msgid "/path/to/export/folder"
msgstr "/Pfad/zum/exportierenden/Ordner"
-#: ../../include/text.php:2305
+#: ../../include/text.php:2318
msgid "Enter a path to a cloud files destination."
msgstr "Gib den Pfad zu einem Datei-Speicherort in der Cloud ein."
-#: ../../include/text.php:2306
+#: ../../include/text.php:2319
msgid "Specify folder"
msgstr "Ordner angeben"
@@ -11797,28 +11800,10 @@ msgstr[1] "%d gemeinsame Verbindungen"
msgid "show more"
msgstr "mehr zeigen"
-#: ../../include/markdown.php:444
-msgid "Attachments:"
-msgstr "Anhänge:"
-
-#: ../../include/markdown.php:538 ../../include/event.php:22
-#: ../../include/event.php:69
-msgid "l F d, Y \\@ g:i A"
-msgstr "l, d. F Y, H:i"
-
-#: ../../include/markdown.php:540
-msgid "$Projectname event notification:"
-msgstr ""
-
-#: ../../include/markdown.php:544 ../../include/event.php:30
-#: ../../include/event.php:73
-msgid "Starts:"
-msgstr "Beginnt:"
-
-#: ../../include/markdown.php:552 ../../include/event.php:40
-#: ../../include/event.php:77
-msgid "Finishes:"
-msgstr "Endet:"
+#: ../../include/markdown.php:139 ../../include/bbcode.php:332
+#, php-format
+msgid "%1$s wrote the following %2$s %3$s"
+msgstr "%1$s schrieb den folgenden %2$s %3$s"
#: ../../include/follow.php:26
msgid "Channel is blocked on this site."
@@ -11844,7 +11829,7 @@ msgstr "Protokoll deaktiviert."
msgid "Channel discovery failed."
msgstr "Kanalsuche fehlgeschlagen"
-#: ../../include/follow.php:202
+#: ../../include/follow.php:186
msgid "Cannot connect to yourself."
msgstr "Du kannst Dich nicht mit Dir selbst verbinden."
@@ -11964,7 +11949,7 @@ msgstr "%d Tage"
#: ../../include/js_strings.php:38
msgid "about a month"
-msgstr "ungefähr ein Monat"
+msgstr "ungefähr einen Monat"
#: ../../include/js_strings.php:39
#, php-format
@@ -12095,19 +12080,19 @@ msgctxt "calendar"
msgid "All day"
msgstr "Ganztägig"
-#: ../../include/message.php:30
+#: ../../include/message.php:40
msgid "Unable to determine sender."
msgstr "Kann Absender nicht bestimmen."
-#: ../../include/message.php:69
+#: ../../include/message.php:79
msgid "No recipient provided."
msgstr "Kein Empfänger angegeben"
-#: ../../include/message.php:74
+#: ../../include/message.php:84
msgid "[no subject]"
msgstr "[no subject]"
-#: ../../include/message.php:227
+#: ../../include/message.php:214
msgid "Stored post could not be verified."
msgstr "Gespeicherter Beitrag konnten nicht überprüft werden."
@@ -12138,61 +12123,61 @@ msgstr "%1$s hat ein aktualisiertes %2$s, %3$s wurde verändert."
msgid "Item was not found."
msgstr "Beitrag wurde nicht gefunden."
-#: ../../include/attach.php:500
+#: ../../include/attach.php:501
msgid "No source file."
msgstr "Keine Quelldatei."
-#: ../../include/attach.php:522
+#: ../../include/attach.php:523
msgid "Cannot locate file to replace"
msgstr "Kann Datei zum Ersetzen nicht finden"
-#: ../../include/attach.php:540
+#: ../../include/attach.php:541
msgid "Cannot locate file to revise/update"
msgstr "Kann Datei zum Prüfen/Aktualisieren nicht finden"
-#: ../../include/attach.php:671
+#: ../../include/attach.php:674
#, php-format
msgid "File exceeds size limit of %d"
msgstr "Datei überschreitet das Größen-Limit von %d"
-#: ../../include/attach.php:685
+#: ../../include/attach.php:688
#, php-format
msgid "You have reached your limit of %1$.0f Mbytes attachment storage."
msgstr "Die Größe Deiner Datei-Anhänge hat das Maximum von %1$.0f MByte erreicht."
-#: ../../include/attach.php:855
+#: ../../include/attach.php:858
msgid "File upload failed. Possible system limit or action terminated."
msgstr "Datei-Upload fehlgeschlagen. Mögliche Systembegrenzung oder abgebrochener Prozess."
-#: ../../include/attach.php:868
+#: ../../include/attach.php:871
msgid "Stored file could not be verified. Upload failed."
msgstr "Gespeichert Datei konnte nicht verifiziert werden. Upload abgebrochen."
-#: ../../include/attach.php:923 ../../include/attach.php:939
+#: ../../include/attach.php:932 ../../include/attach.php:948
msgid "Path not available."
msgstr "Pfad nicht verfügbar."
-#: ../../include/attach.php:988 ../../include/attach.php:1153
+#: ../../include/attach.php:997 ../../include/attach.php:1162
msgid "Empty pathname"
msgstr "Leere Pfadangabe"
-#: ../../include/attach.php:1014
+#: ../../include/attach.php:1023
msgid "duplicate filename or path"
msgstr "doppelter Dateiname oder Pfad"
-#: ../../include/attach.php:1039
+#: ../../include/attach.php:1048
msgid "Path not found."
msgstr "Pfad nicht gefunden."
-#: ../../include/attach.php:1107
+#: ../../include/attach.php:1116
msgid "mkdir failed."
msgstr "mkdir fehlgeschlagen."
-#: ../../include/attach.php:1111
+#: ../../include/attach.php:1120
msgid "database storage failed."
msgstr "Speichern in der Datenbank fehlgeschlagen."
-#: ../../include/attach.php:1159
+#: ../../include/attach.php:1168
msgid "Empty path"
msgstr "Leere Pfadangabe"
@@ -12200,77 +12185,77 @@ msgstr "Leere Pfadangabe"
msgid "guest:"
msgstr "Gast:"
-#: ../../include/security.php:532
+#: ../../include/security.php:531
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 Security-Token des Formulars war nicht korrekt. Das ist wahrscheinlich passiert, weil das Formular zu lange (>3 Stunden) offen war, bevor es abgeschickt wurde."
-#: ../../include/items.php:869 ../../include/items.php:916
+#: ../../include/items.php:851 ../../include/items.php:903
msgid "(Unknown)"
msgstr "(Unbekannt)"
-#: ../../include/items.php:1110
+#: ../../include/items.php:1087
msgid "Visible to anybody on the internet."
msgstr "Für jeden im Internet sichtbar."
-#: ../../include/items.php:1112
+#: ../../include/items.php:1089
msgid "Visible to you only."
msgstr "Nur für Dich sichtbar."
-#: ../../include/items.php:1114
+#: ../../include/items.php:1091
msgid "Visible to anybody in this network."
msgstr "Für jedes $Projectname-Mitglied sichtbar."
-#: ../../include/items.php:1116
+#: ../../include/items.php:1093
msgid "Visible to anybody authenticated."
msgstr "Für jeden sichtbar, der angemeldet ist."
-#: ../../include/items.php:1118
+#: ../../include/items.php:1095
#, php-format
msgid "Visible to anybody on %s."
msgstr "Für jeden auf %s sichtbar."
-#: ../../include/items.php:1120
+#: ../../include/items.php:1097
msgid "Visible to all connections."
msgstr "Für alle Verbindungen sichtbar."
-#: ../../include/items.php:1122
+#: ../../include/items.php:1099
msgid "Visible to approved connections."
msgstr "Nur für akzeptierte Verbindungen sichtbar."
-#: ../../include/items.php:1124
+#: ../../include/items.php:1101
msgid "Visible to specific connections."
msgstr "Sichtbar für bestimmte Verbindungen."
-#: ../../include/items.php:3938
+#: ../../include/items.php:3908
msgid "Privacy group is empty."
msgstr "Gruppe ist leer."
-#: ../../include/items.php:3945
+#: ../../include/items.php:3915
#, php-format
msgid "Privacy group: %s"
msgstr "Gruppe: %s"
-#: ../../include/items.php:3957
+#: ../../include/items.php:3927
msgid "Connection not found."
msgstr "Die Verbindung wurde nicht gefunden."
-#: ../../include/items.php:4310
+#: ../../include/items.php:4280
msgid "profile photo"
msgstr "Profilfoto"
-#: ../../include/items.php:4506
+#: ../../include/items.php:4473
#, php-format
msgid "[Edited %s]"
msgstr "[%s wurde bearbeitet]"
-#: ../../include/items.php:4506
+#: ../../include/items.php:4473
msgctxt "edit_activity"
msgid "Post"
msgstr "Beitrag"
-#: ../../include/items.php:4506
+#: ../../include/items.php:4473
msgctxt "edit_activity"
msgid "Comment"
msgstr "Kommentar"
@@ -12279,229 +12264,261 @@ msgstr "Kommentar"
msgid "Unable to obtain identity information from database"
msgstr "Kann keine Identitäts-Informationen aus Datenbank beziehen"
-#: ../../include/channel.php:67
+#: ../../include/channel.php:68
msgid "Empty name"
msgstr "Namensfeld leer"
-#: ../../include/channel.php:70
+#: ../../include/channel.php:71
msgid "Name too long"
msgstr "Name ist zu lang"
-#: ../../include/channel.php:181
+#: ../../include/channel.php:182
msgid "No account identifier"
msgstr "Keine Account-Kennung"
-#: ../../include/channel.php:193
+#: ../../include/channel.php:194
msgid "Nickname is required."
msgstr "Spitzname ist erforderlich."
-#: ../../include/channel.php:207
+#: ../../include/channel.php:208
msgid "Reserved nickname. Please choose another."
msgstr "Reservierter Kurzname. Bitte wähle einen anderen."
-#: ../../include/channel.php:212
+#: ../../include/channel.php:213
msgid ""
"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."
-#: ../../include/channel.php:270
+#: ../../include/channel.php:272
msgid "Unable to retrieve created identity"
msgstr "Kann die erstellte Identität nicht empfangen"
-#: ../../include/channel.php:342
+#: ../../include/channel.php:344
msgid "Default Profile"
msgstr "Standard-Profil"
-#: ../../include/channel.php:1045
+#: ../../include/channel.php:497
+msgid "Unable to retrieve modified identity"
+msgstr "Geänderte Identität kann nicht empfangen werden"
+
+#: ../../include/channel.php:1162
msgid "Create New Profile"
msgstr "Neues Profil erstellen"
-#: ../../include/channel.php:1065
+#: ../../include/channel.php:1182
msgid "Visible to everybody"
msgstr "Für jeden sichtbar"
-#: ../../include/channel.php:1138 ../../include/channel.php:1252
+#: ../../include/channel.php:1255 ../../include/channel.php:1375
msgid "Gender:"
msgstr "Geschlecht:"
-#: ../../include/channel.php:1140 ../../include/channel.php:1307
+#: ../../include/channel.php:1257 ../../include/channel.php:1430
msgid "Homepage:"
msgstr "Homepage:"
-#: ../../include/channel.php:1141
+#: ../../include/channel.php:1258
msgid "Online Now"
msgstr "gerade online"
-#: ../../include/channel.php:1257
+#: ../../include/channel.php:1334
+msgid "Trans"
+msgstr ""
+
+#: ../../include/channel.php:1380
msgid "Like this channel"
msgstr "Dieser Kanal gefällt mir"
-#: ../../include/channel.php:1281
+#: ../../include/channel.php:1404
msgid "j F, Y"
msgstr "j. F Y"
-#: ../../include/channel.php:1282
+#: ../../include/channel.php:1405
msgid "j F"
msgstr "j. F"
-#: ../../include/channel.php:1289
+#: ../../include/channel.php:1412
msgid "Birthday:"
msgstr "Geburtstag:"
-#: ../../include/channel.php:1302
+#: ../../include/channel.php:1425
#, php-format
msgid "for %1$d %2$s"
msgstr "seit %1$d %2$s"
-#: ../../include/channel.php:1305
+#: ../../include/channel.php:1428
msgid "Sexual Preference:"
msgstr "Sexuelle Orientierung:"
-#: ../../include/channel.php:1311
+#: ../../include/channel.php:1434
msgid "Tags:"
msgstr "Schlagworte:"
-#: ../../include/channel.php:1313
+#: ../../include/channel.php:1436
msgid "Political Views:"
msgstr "Politische Ansichten:"
-#: ../../include/channel.php:1315
+#: ../../include/channel.php:1438
msgid "Religion:"
msgstr "Religion:"
-#: ../../include/channel.php:1319
+#: ../../include/channel.php:1442
msgid "Hobbies/Interests:"
msgstr "Hobbys/Interessen:"
-#: ../../include/channel.php:1321
+#: ../../include/channel.php:1444
msgid "Likes:"
msgstr "Gefällt:"
-#: ../../include/channel.php:1323
+#: ../../include/channel.php:1446
msgid "Dislikes:"
msgstr "Gefällt nicht:"
-#: ../../include/channel.php:1325
+#: ../../include/channel.php:1448
msgid "Contact information and Social Networks:"
msgstr "Kontaktinformation und soziale Netzwerke:"
-#: ../../include/channel.php:1327
+#: ../../include/channel.php:1450
msgid "My other channels:"
msgstr "Meine anderen Kanäle:"
-#: ../../include/channel.php:1329
+#: ../../include/channel.php:1452
msgid "Musical interests:"
msgstr "Musikalische Interessen:"
-#: ../../include/channel.php:1331
+#: ../../include/channel.php:1454
msgid "Books, literature:"
msgstr "Bücher, Literatur:"
-#: ../../include/channel.php:1333
+#: ../../include/channel.php:1456
msgid "Television:"
msgstr "Fernsehen:"
-#: ../../include/channel.php:1335
+#: ../../include/channel.php:1458
msgid "Film/dance/culture/entertainment:"
msgstr "Film/Tanz/Kultur/Unterhaltung:"
-#: ../../include/channel.php:1337
+#: ../../include/channel.php:1460
msgid "Love/Romance:"
msgstr "Liebe/Romantik:"
-#: ../../include/channel.php:1339
+#: ../../include/channel.php:1462
msgid "Work/employment:"
msgstr "Arbeit/Anstellung:"
-#: ../../include/channel.php:1341
+#: ../../include/channel.php:1464
msgid "School/education:"
msgstr "Schule/Ausbildung:"
-#: ../../include/channel.php:1364
+#: ../../include/channel.php:1487
msgid "Like this thing"
msgstr "Gefällt mir"
-#: ../../include/channel.php:2139
+#: ../../include/channel.php:2256
#, php-format
msgid "User '%s' deleted"
msgstr "Benutzer '%s' gelöscht"
-#: ../../include/event.php:1004
+#: ../../include/event.php:22 ../../include/event.php:69
+msgid "l F d, Y \\@ g:i A"
+msgstr "l, d. F Y, H:i"
+
+#: ../../include/event.php:30 ../../include/event.php:73
+msgid "Starts:"
+msgstr "Beginnt:"
+
+#: ../../include/event.php:40 ../../include/event.php:77
+msgid "Finishes:"
+msgstr "Endet:"
+
+#: ../../include/event.php:1008
msgid "This event has been added to your calendar."
msgstr "Dieser Termin wurde zu Deinem Kalender hinzugefügt"
-#: ../../include/event.php:1204
+#: ../../include/event.php:1208
msgid "Not specified"
msgstr "Keine Angabe"
-#: ../../include/event.php:1205
+#: ../../include/event.php:1209
msgid "Needs Action"
msgstr "Aktion erforderlich"
-#: ../../include/event.php:1206
+#: ../../include/event.php:1210
msgid "Completed"
msgstr "Abgeschlossen"
-#: ../../include/event.php:1207
+#: ../../include/event.php:1211
msgid "In Process"
msgstr "In Bearbeitung"
-#: ../../include/event.php:1208
+#: ../../include/event.php:1212
msgid "Cancelled"
msgstr "gestrichen"
-#: ../../include/network.php:776
+#: ../../include/event.php:1292 ../../include/connections.php:676
+msgid "Home, Voice"
+msgstr "Zuhause, Sprache"
+
+#: ../../include/event.php:1293 ../../include/connections.php:677
+msgid "Home, Fax"
+msgstr "Zuhause, Fax"
+
+#: ../../include/event.php:1295 ../../include/connections.php:679
+msgid "Work, Voice"
+msgstr "Arbeit, Sprache"
+
+#: ../../include/event.php:1296 ../../include/connections.php:680
+msgid "Work, Fax"
+msgstr "Arbeit, Fax"
+
+#: ../../include/network.php:751
msgid "view full size"
msgstr "In Vollbildansicht anschauen"
-#: ../../include/network.php:2042
-msgid "No Subject"
-msgstr "Kein Betreff"
-
-#: ../../include/network.php:2310 ../../include/network.php:2311
+#: ../../include/network.php:1691 ../../include/network.php:1692
msgid "Friendica"
msgstr "Friendica"
-#: ../../include/network.php:2312
+#: ../../include/network.php:1693
msgid "OStatus"
msgstr "OStatus"
-#: ../../include/network.php:2313
+#: ../../include/network.php:1694
msgid "GNU-Social"
msgstr "GNU-Social"
-#: ../../include/network.php:2314
+#: ../../include/network.php:1695
msgid "RSS/Atom"
msgstr "RSS/Atom"
-#: ../../include/network.php:2316
+#: ../../include/network.php:1696
+msgid "ActivityPub"
+msgstr "ActivityPub"
+
+#: ../../include/network.php:1698
msgid "Diaspora"
msgstr "Diaspora"
-#: ../../include/network.php:2317
+#: ../../include/network.php:1699
msgid "Facebook"
msgstr "Facebook"
-#: ../../include/network.php:2318
+#: ../../include/network.php:1700
msgid "Zot"
msgstr "Zot!"
-#: ../../include/network.php:2319
+#: ../../include/network.php:1701
msgid "LinkedIn"
msgstr "LinkedIn"
-#: ../../include/network.php:2320
+#: ../../include/network.php:1702
msgid "XMPP/IM"
msgstr "XMPP/IM"
-#: ../../include/network.php:2321
+#: ../../include/network.php:1703
msgid "MySpace"
msgstr "MySpace"
-#: ../../include/page_widgets.php:7
-msgid "New Page"
-msgstr "Neue Seite"
-
#: ../../include/language.php:380
msgid "Select an alternate language"
msgstr "Wähle eine alternative Sprache"
@@ -12535,404 +12552,399 @@ msgid ""
" permissions set who is allowed to view the post."
msgstr "Beitragsberechtigungen %s können nicht geändert werden %s, nachdem der Beitrag gesendet wurde.<br />Diese Berechtigungen bestimmen, wer den Beitrag sehen kann."
-#: ../../include/dba/dba_driver.php:189
+#: ../../include/dba/dba_driver.php:190
#, php-format
msgid "Cannot locate DNS info for database server '%s'"
msgstr "Kann die DNS-Informationen für den Datenbank-Server '%s' nicht finden"
-#: ../../include/bbcode.php:134 ../../include/bbcode.php:1040
-#: ../../include/bbcode.php:1043 ../../include/bbcode.php:1048
-#: ../../include/bbcode.php:1051 ../../include/bbcode.php:1054
-#: ../../include/bbcode.php:1057 ../../include/bbcode.php:1062
-#: ../../include/bbcode.php:1065 ../../include/bbcode.php:1070
-#: ../../include/bbcode.php:1073 ../../include/bbcode.php:1076
-#: ../../include/bbcode.php:1079
+#: ../../include/bbcode.php:194 ../../include/bbcode.php:1097
+#: ../../include/bbcode.php:1100 ../../include/bbcode.php:1105
+#: ../../include/bbcode.php:1108 ../../include/bbcode.php:1111
+#: ../../include/bbcode.php:1114 ../../include/bbcode.php:1119
+#: ../../include/bbcode.php:1122 ../../include/bbcode.php:1127
+#: ../../include/bbcode.php:1130 ../../include/bbcode.php:1133
+#: ../../include/bbcode.php:1136
msgid "Image/photo"
msgstr "Bild/Foto"
-#: ../../include/bbcode.php:173 ../../include/bbcode.php:1090
+#: ../../include/bbcode.php:233 ../../include/bbcode.php:1147
msgid "Encrypted content"
msgstr "Verschlüsselter Inhalt"
-#: ../../include/bbcode.php:189
+#: ../../include/bbcode.php:249
#, php-format
msgid "Install %s element: "
msgstr "Element %s installieren: "
-#: ../../include/bbcode.php:193
+#: ../../include/bbcode.php:253
#, php-format
msgid ""
"This post contains an installable %s element, however you lack permissions "
"to install it on this site."
msgstr "Dieser Beitrag beinhaltet ein installierbares %s Element, aber Du hast nicht die nötigen Rechte, um es auf diesem Hub zu installieren."
-#: ../../include/bbcode.php:272
-#, php-format
-msgid "%1$s wrote the following %2$s %3$s"
-msgstr "%1$s schrieb den folgenden %2$s %3$s"
-
-#: ../../include/bbcode.php:349 ../../include/bbcode.php:357
+#: ../../include/bbcode.php:409 ../../include/bbcode.php:417
msgid "Click to open/close"
msgstr "Klicke zum Öffnen/Schließen"
-#: ../../include/bbcode.php:357
+#: ../../include/bbcode.php:417
msgid "spoiler"
msgstr "Spoiler"
-#: ../../include/bbcode.php:1028
+#: ../../include/bbcode.php:1085
msgid "$1 wrote:"
msgstr "$1 schrieb:"
-#: ../../include/oembed.php:315
+#: ../../include/oembed.php:317
msgid " by "
msgstr "von"
-#: ../../include/oembed.php:316
+#: ../../include/oembed.php:318
msgid " on "
msgstr "am"
-#: ../../include/oembed.php:345
+#: ../../include/oembed.php:347
msgid "Embedded content"
msgstr "Eingebetteter Inhalt"
-#: ../../include/oembed.php:354
+#: ../../include/oembed.php:356
msgid "Embedding disabled"
msgstr "Einbetten deaktiviert"
-#: ../../include/features.php:58
+#: ../../include/features.php:54
msgid "General Features"
msgstr "Allgemeine Funktionen"
-#: ../../include/features.php:63
+#: ../../include/features.php:59
msgid "Multiple Profiles"
msgstr "Mehrfachprofile"
-#: ../../include/features.php:64
+#: ../../include/features.php:60
msgid "Ability to create multiple profiles"
msgstr "Ermöglicht das Anlegen mehrerer Profile pro Kanal"
-#: ../../include/features.php:72
+#: ../../include/features.php:68
msgid "Advanced Profiles"
msgstr "Erweiterte Profile"
-#: ../../include/features.php:73
+#: ../../include/features.php:69
msgid "Additional profile sections and selections"
msgstr "Stellt zusätzliche Bereiche und Felder im Profil zur Verfügung"
-#: ../../include/features.php:81
+#: ../../include/features.php:77
msgid "Profile Import/Export"
msgstr "Profil-Import/Export"
-#: ../../include/features.php:82
+#: ../../include/features.php:78
msgid "Save and load profile details across sites/channels"
msgstr "Ermöglicht das Speichern von Profilen, um sie in einen anderen Kanal zu importieren"
-#: ../../include/features.php:90
+#: ../../include/features.php:86
msgid "Web Pages"
msgstr "Webseiten"
-#: ../../include/features.php:91
+#: ../../include/features.php:87
msgid "Provide managed web pages on your channel"
msgstr "Ermöglicht das Erstellen von Webseiten in Deinem Kanal"
-#: ../../include/features.php:100
+#: ../../include/features.php:96
msgid "Provide a wiki for your channel"
msgstr "Stelle ein Wiki in Deinem Kanal zur Verfügung"
-#: ../../include/features.php:117
+#: ../../include/features.php:113
msgid "Private Notes"
msgstr "Private Notizen"
-#: ../../include/features.php:118
+#: ../../include/features.php:114
msgid "Enables a tool to store notes and reminders (note: not encrypted)"
msgstr "Aktiviert ein Werkzeug mit dem Notizen und Erinnerungen gespeichert werden können (Hinweis: nicht verschlüsselt)"
-#: ../../include/features.php:126
+#: ../../include/features.php:122
msgid "Navigation Channel Select"
msgstr "Kanal-Auswahl in der Navigationsleiste"
-#: ../../include/features.php:127
+#: ../../include/features.php:123
msgid "Change channels directly from within the navigation dropdown menu"
msgstr "Ermöglicht den direkten Wechsel zu anderen Kanälen über das Navigationsmenü"
-#: ../../include/features.php:135
+#: ../../include/features.php:131
msgid "Photo Location"
msgstr "Aufnahmeort"
-#: ../../include/features.php:136
+#: ../../include/features.php:132
msgid "If location data is available on uploaded photos, link this to a map."
msgstr "Verlinkt den Aufnahmeort von Fotos (falls verfügbar) auf einer Karte"
-#: ../../include/features.php:144
+#: ../../include/features.php:140
msgid "Access Controlled Chatrooms"
msgstr "Zugriffskontrollierte Chaträume"
-#: ../../include/features.php:145
+#: ../../include/features.php:141
msgid "Provide chatrooms and chat services with access control."
msgstr "Bieten Sie Chaträume und Chatdienste mit Zugriffskontrolle an."
-#: ../../include/features.php:154
+#: ../../include/features.php:150
msgid "Provide alternate connection permission roles."
msgstr "Stelle benutzerdefinierte Berechtigungsrollen für Verbindungen zur Verfügung."
-#: ../../include/features.php:162
+#: ../../include/features.php:158
msgid "Smart Birthdays"
msgstr "Smarte Geburtstage"
-#: ../../include/features.php:163
+#: ../../include/features.php:159
msgid ""
"Make birthday events timezone aware in case your friends are scattered "
"across the planet."
msgstr "Stellt für Geburtstage einen Zeitzonenbezug her, falls deine Freunde über den ganzen Planeten verstreut sind."
-#: ../../include/features.php:171
+#: ../../include/features.php:167
msgid "Event Timezone Selection"
msgstr "Termin-Zeitzonenauswahl"
-#: ../../include/features.php:172
+#: ../../include/features.php:168
msgid "Allow event creation in timezones other than your own."
msgstr "Ermögliche das Erstellen von Terminen in anderen Zeitzonen als Deiner eigenen."
-#: ../../include/features.php:180
+#: ../../include/features.php:176
msgid "Advanced Directory Search"
msgstr "Erweiterte Verzeichnissuche"
-#: ../../include/features.php:181
+#: ../../include/features.php:177
msgid "Allows creation of complex directory search queries"
msgstr "Ermöglicht die Erstellung komplexer Verzeichnis-Suchabfragen"
-#: ../../include/features.php:189
+#: ../../include/features.php:185
msgid "Advanced Theme and Layout Settings"
msgstr "Erweiterte Design- und Layout-Einstellungen"
-#: ../../include/features.php:190
+#: ../../include/features.php:186
msgid "Allows fine tuning of themes and page layouts"
msgstr "Erlaubt die Feineinstellung von Designs und Seitenlayouts"
-#: ../../include/features.php:200
+#: ../../include/features.php:196
msgid "Post Composition Features"
msgstr "Nachbearbeitungsfunktionen"
-#: ../../include/features.php:204
+#: ../../include/features.php:200
msgid "Large Photos"
msgstr "Große Fotos"
-#: ../../include/features.php:205
+#: ../../include/features.php:201
msgid ""
"Include large (1024px) photo thumbnails in posts. If not enabled, use small "
"(640px) photo thumbnails"
msgstr "Große Vorschaubilder (1024px) in Beiträgen anzeigen. Falls nicht aktiviert, werden kleine Vorschaubilder (640px) verwendet."
-#: ../../include/features.php:214
+#: ../../include/features.php:210
msgid "Automatically import channel content from other channels or feeds"
msgstr "Ermöglicht den automatischen Import von Inhalten für diesen Kanal von anderen Kanälen oder Feeds"
-#: ../../include/features.php:222
+#: ../../include/features.php:218
msgid "Even More Encryption"
msgstr "Noch mehr Verschlüsselung"
-#: ../../include/features.php:223
+#: ../../include/features.php:219
msgid ""
"Allow optional encryption of content end-to-end with a shared secret key"
msgstr "Ermöglicht optional die zusätzliche Verschlüsselung von Inhalten (Ende-zu-Ende mit geteiltem Schlüssel)"
-#: ../../include/features.php:231
+#: ../../include/features.php:227
msgid "Enable Voting Tools"
msgstr "Umfragewerkzeuge aktivieren"
-#: ../../include/features.php:232
+#: ../../include/features.php:228
msgid "Provide a class of post which others can vote on"
msgstr "Aktiviert die Umfragewerkzeuge, um anderen die Möglichkeit zu geben, einem Beitrag zuzustimmen, ihn abzulehnen oder sich zu enthalten. (Muss im Beitrag selbst noch aktiviert werden.)"
-#: ../../include/features.php:240
+#: ../../include/features.php:236
msgid "Disable Comments"
msgstr "Kommentare deaktivieren"
-#: ../../include/features.php:241
+#: ../../include/features.php:237
msgid "Provide the option to disable comments for a post"
msgstr "Ermöglicht, die Kommentarfunktion für einzelne Beiträge abzuschalten"
-#: ../../include/features.php:249
+#: ../../include/features.php:245
msgid "Delayed Posting"
msgstr "Verzögertes Senden"
-#: ../../include/features.php:250
+#: ../../include/features.php:246
msgid "Allow posts to be published at a later date"
msgstr "Ermöglicht es, Beiträge zu einem späteren Zeitpunkt zu veröffentlichen"
-#: ../../include/features.php:258
+#: ../../include/features.php:254
msgid "Content Expiration"
msgstr "Verfall von Inhalten"
-#: ../../include/features.php:259
+#: ../../include/features.php:255
msgid "Remove posts/comments and/or private messages at a future time"
msgstr "Ermöglicht das automatische Löschen von Beiträgen, Kommentaren und/oder privaten Nachrichten zu einem zukünftigen Datum."
-#: ../../include/features.php:267
+#: ../../include/features.php:263
msgid "Suppress Duplicate Posts/Comments"
msgstr "Doppelte Beiträge unterdrücken"
-#: ../../include/features.php:268
+#: ../../include/features.php:264
msgid ""
"Prevent posts with identical content to be published with less than two "
"minutes in between submissions."
msgstr "Verhindert, dass innerhalb von zwei Minuten Beiträge mit identischem Inhalt veröffentlicht werden."
-#: ../../include/features.php:279
+#: ../../include/features.php:275
msgid "Network and Stream Filtering"
msgstr "Netzwerk- und Stream-Filter"
-#: ../../include/features.php:283
+#: ../../include/features.php:279
msgid "Search by Date"
msgstr "Suche nach Datum"
-#: ../../include/features.php:284
+#: ../../include/features.php:280
msgid "Ability to select posts by date ranges"
msgstr "Möglichkeit, Beiträge nach Zeiträumen auszuwählen"
-#: ../../include/features.php:292 ../../include/group.php:331
+#: ../../include/features.php:288 ../../include/group.php:332
msgid "Privacy Groups"
msgstr "Gruppen"
-#: ../../include/features.php:293
+#: ../../include/features.php:289
msgid "Enable management and selection of privacy groups"
msgstr "Auswahl und Verwaltung von Gruppen für Kanäle aktivieren"
-#: ../../include/features.php:302
+#: ../../include/features.php:298
msgid "Save search terms for re-use"
msgstr "Ermöglicht das Abspeichern von Suchbegriffen zur Wiederverwendung"
-#: ../../include/features.php:310
+#: ../../include/features.php:306
msgid "Network Personal Tab"
msgstr "Persönlicher Netzwerkreiter"
-#: ../../include/features.php:311
+#: ../../include/features.php:307
msgid "Enable tab to display only Network posts that you've interacted on"
msgstr "Aktiviert einen Reiter in der Grid-Ansicht, der nur Netzwerk-Beiträge anzeigt, mit denen Du interagiert hast"
-#: ../../include/features.php:319
+#: ../../include/features.php:315
msgid "Network New Tab"
msgstr "Netzwerkreiter Neu"
-#: ../../include/features.php:320
+#: ../../include/features.php:316
msgid "Enable tab to display all new Network activity"
msgstr "Aktiviert einen Reiter in der Grid-Ansicht, der alle neuen Netzwerkaktivitäten anzeigt"
-#: ../../include/features.php:328
+#: ../../include/features.php:324
msgid "Affinity Tool"
msgstr "Beziehungs-Tool"
-#: ../../include/features.php:329
+#: ../../include/features.php:325
msgid "Filter stream activity by depth of relationships"
msgstr "Aktiviert ein Werkzeug in der Grid-Ansicht, das den Stream nach Grad der Beziehung filtern kann"
-#: ../../include/features.php:338
+#: ../../include/features.php:334
msgid "Show friend and connection suggestions"
msgstr "Freund- und Verbindungsvorschläge anzeigen"
-#: ../../include/features.php:346
+#: ../../include/features.php:342
msgid "Connection Filtering"
msgstr "Filter für Verbindungen"
-#: ../../include/features.php:347
+#: ../../include/features.php:343
msgid "Filter incoming posts from connections based on keywords/content"
msgstr "Ermöglicht die Filterung eingehender Beiträge anhand von Schlüsselwörtern (muss an der Verbindung konfiguriert werden)"
-#: ../../include/features.php:359
+#: ../../include/features.php:355
msgid "Post/Comment Tools"
msgstr "Beitrag-/Kommentar-Tools"
-#: ../../include/features.php:363
+#: ../../include/features.php:359
msgid "Community Tagging"
msgstr "Gemeinschaftliches Verschlagworten"
-#: ../../include/features.php:364
+#: ../../include/features.php:360
msgid "Ability to tag existing posts"
msgstr "Ermöglicht das Verschlagworten existierender Beiträge"
-#: ../../include/features.php:372
+#: ../../include/features.php:368
msgid "Post Categories"
msgstr "Beitrags-Kategorien"
-#: ../../include/features.php:373
+#: ../../include/features.php:369
msgid "Add categories to your posts"
msgstr "Aktiviert Kategorien für Beiträge"
-#: ../../include/features.php:381
+#: ../../include/features.php:377
msgid "Emoji Reactions"
msgstr "Emoji Reaktionen"
-#: ../../include/features.php:382
+#: ../../include/features.php:378
msgid "Add emoji reaction ability to posts"
msgstr "Aktiviert Emoji-Reaktionen für Beiträge"
-#: ../../include/features.php:391
+#: ../../include/features.php:387
msgid "Ability to file posts under folders"
msgstr "Möglichkeit, Beiträge in Verzeichnissen zu sammeln"
-#: ../../include/features.php:399
+#: ../../include/features.php:395
msgid "Dislike Posts"
msgstr "Gefällt-mir-nicht-Beiträge"
-#: ../../include/features.php:400
+#: ../../include/features.php:396
msgid "Ability to dislike posts/comments"
msgstr "Aktiviert die „Gefällt mir nicht“-Schaltfläche"
-#: ../../include/features.php:408
+#: ../../include/features.php:404
msgid "Star Posts"
msgstr "Beiträge mit Sternchen versehen"
-#: ../../include/features.php:409
+#: ../../include/features.php:405
msgid "Ability to mark special posts with a star indicator"
msgstr "Ermöglicht die lokale Markierung spezieller Beiträge mit einem Sternchen-Symbol"
-#: ../../include/features.php:417
+#: ../../include/features.php:413
msgid "Tag Cloud"
msgstr "Schlagwort-Wolke"
-#: ../../include/features.php:418
+#: ../../include/features.php:414
msgid "Provide a personal tag cloud on your channel page"
msgstr "Aktiviert die Anzeige einer Schlagwort-Wolke (Tag Cloud) auf Deiner Kanal-Seite"
-#: ../../include/features.php:430
+#: ../../include/features.php:425
msgid "Premium Channel"
msgstr "Premium-Kanal"
-#: ../../include/features.php:431
+#: ../../include/features.php:426
msgid ""
"Allows you to set restrictions and terms on those that connect with your "
"channel"
msgstr "Ermöglicht es, Einschränkungen und Bedingungen für Verbindungen dieses Kanals festzulegen"
-#: ../../include/taxonomy.php:228 ../../include/taxonomy.php:249
+#: ../../include/taxonomy.php:267 ../../include/taxonomy.php:288
msgid "Tags"
msgstr "Schlagwörter"
-#: ../../include/taxonomy.php:293
+#: ../../include/taxonomy.php:332
msgid "Keywords"
msgstr "Schlüsselwörter"
-#: ../../include/taxonomy.php:314
+#: ../../include/taxonomy.php:353
msgid "have"
msgstr "habe"
-#: ../../include/taxonomy.php:314
+#: ../../include/taxonomy.php:353
msgid "has"
msgstr "hat"
-#: ../../include/taxonomy.php:315
+#: ../../include/taxonomy.php:354
msgid "want"
msgstr "will"
-#: ../../include/taxonomy.php:315
+#: ../../include/taxonomy.php:354
msgid "wants"
msgstr "will"
-#: ../../include/taxonomy.php:316
+#: ../../include/taxonomy.php:355
msgid "likes"
msgstr "gefällt"
-#: ../../include/taxonomy.php:317
+#: ../../include/taxonomy.php:356
msgid "dislikes"
msgstr "missfällt"
@@ -12956,51 +12968,51 @@ msgstr "Eine Einladung wird benötigt."
msgid "Invitation could not be verified."
msgstr "Die Einladung konnte nicht bestätigt werden."
-#: ../../include/account.php:130
+#: ../../include/account.php:157
msgid "Please enter the required information."
msgstr "Bitte gib die benötigten Informationen ein."
-#: ../../include/account.php:198
+#: ../../include/account.php:224
msgid "Failed to store account information."
msgstr "Speichern der Nutzerkontodaten fehlgeschlagen."
-#: ../../include/account.php:263
+#: ../../include/account.php:291
#, php-format
msgid "Registration confirmation for %s"
msgstr "Registrierungsbestätigung für %s"
-#: ../../include/account.php:330
+#: ../../include/account.php:360
#, php-format
msgid "Registration request at %s"
msgstr "Registrierungsanfrage auf %s"
-#: ../../include/account.php:352
+#: ../../include/account.php:382
msgid "your registration password"
msgstr "Dein Registrierungspasswort"
-#: ../../include/account.php:358 ../../include/account.php:420
+#: ../../include/account.php:388 ../../include/account.php:450
#, php-format
msgid "Registration details for %s"
msgstr "Registrierungsdetails für %s"
-#: ../../include/account.php:431
+#: ../../include/account.php:461
msgid "Account approved."
msgstr "Nutzerkonto bestätigt."
-#: ../../include/account.php:471
+#: ../../include/account.php:501
#, php-format
msgid "Registration revoked for %s"
msgstr "Registrierung für %s wurde widerrufen"
-#: ../../include/account.php:756 ../../include/account.php:758
+#: ../../include/account.php:780 ../../include/account.php:782
msgid "Click here to upgrade."
msgstr "Klicke hier, um das Upgrade durchzuführen."
-#: ../../include/account.php:764
+#: ../../include/account.php:788
msgid "This action exceeds the limits set by your subscription plan."
msgstr "Diese Aktion überschreitet die Grenzen Ihres Abonnements."
-#: ../../include/account.php:769
+#: ../../include/account.php:793
msgid "This action is not available under your subscription plan."
msgstr "Diese Aktion ist in Ihrem Abonnement nicht verfügbar."
@@ -13085,183 +13097,211 @@ msgstr "%1$ss Geburtstag"
msgid "Happy Birthday %1$s"
msgstr "Alles Gute zum Geburtstag, %1$s"
-#: ../../include/nav.php:92
+#: ../../include/nav.php:90
msgid "Remote authentication"
msgstr "Über Konto auf anderem Server einloggen"
-#: ../../include/nav.php:92
+#: ../../include/nav.php:90
msgid "Click to authenticate to your home hub"
msgstr "Klicke, um Dich über Deinen Heimat-Server zu authentifizieren"
-#: ../../include/nav.php:103 ../../include/nav.php:127
+#: ../../include/nav.php:99 ../../include/nav.php:123
msgid "End this session"
msgstr "Beende diese Sitzung"
-#: ../../include/nav.php:106
+#: ../../include/nav.php:102
msgid "Your profile page"
msgstr "Deine Profilseite"
-#: ../../include/nav.php:109
+#: ../../include/nav.php:105
msgid "Manage/Edit profiles"
msgstr "Profile verwalten"
-#: ../../include/nav.php:111
+#: ../../include/nav.php:107
msgid "Edit your profile"
msgstr "Profil bearbeiten"
-#: ../../include/nav.php:117
+#: ../../include/nav.php:113
msgid "Sign in"
msgstr "Anmelden"
-#: ../../include/nav.php:142
+#: ../../include/nav.php:138
msgid "Take me home"
msgstr "Bringe mich nach Hause (eigener Kanal)"
-#: ../../include/nav.php:144
+#: ../../include/nav.php:140
msgid "Log me out of this site"
msgstr "Logge mich von dieser Seite aus"
-#: ../../include/nav.php:149
+#: ../../include/nav.php:145
msgid "Create an account"
msgstr "Erzeuge ein Konto"
-#: ../../include/nav.php:161
+#: ../../include/nav.php:157
msgid "Help and documentation"
msgstr "Hilfe und Dokumentation"
-#: ../../include/nav.php:164
+#: ../../include/nav.php:160
msgid "Search site @name, #tag, ?docs, content"
msgstr "Hub durchsuchen: @Name. #Schlagwort, ?Dokumentation, Inhalt"
-#: ../../include/nav.php:176
+#: ../../include/nav.php:171
msgid "Grid"
msgstr "Grid"
-#: ../../include/nav.php:176
+#: ../../include/nav.php:171
msgid "Your grid"
msgstr "Dein Grid"
-#: ../../include/nav.php:177
+#: ../../include/nav.php:172
msgid "View your network/grid"
msgstr "Zeige Dein Netzwerk/Grid an"
-#: ../../include/nav.php:178
+#: ../../include/nav.php:173
msgid "Mark all grid notifications seen"
msgstr "Alle Grid-Benachrichtigungen als angesehen markieren"
-#: ../../include/nav.php:180
+#: ../../include/nav.php:175
msgid "Channel home"
msgstr "Mein Kanal"
-#: ../../include/nav.php:181
+#: ../../include/nav.php:176
msgid "View your channel home"
msgstr "Zeige Deine Kanalseite an"
-#: ../../include/nav.php:182
+#: ../../include/nav.php:177
msgid "Mark all channel notifications seen"
msgstr "Markiere alle Kanal-Benachrichtigungen als angesehen"
-#: ../../include/nav.php:188
+#: ../../include/nav.php:183
msgid "Notices"
msgstr "Benachrichtigungen"
-#: ../../include/nav.php:188
+#: ../../include/nav.php:183
msgid "Notifications"
msgstr "Benachrichtigungen"
-#: ../../include/nav.php:189
+#: ../../include/nav.php:184
msgid "View all notifications"
msgstr "Alle Benachrichtigungen ansehen"
-#: ../../include/nav.php:192
+#: ../../include/nav.php:185
+msgid "Mark all system notifications seen"
+msgstr "Markiere alle System-Benachrichtigungen als gesehen"
+
+#: ../../include/nav.php:187
msgid "Private mail"
msgstr "Persönliche Mail"
-#: ../../include/nav.php:193
+#: ../../include/nav.php:188
msgid "View your private messages"
msgstr "Zeige Deine persönlichen Nachrichten an"
-#: ../../include/nav.php:194
+#: ../../include/nav.php:189
msgid "Mark all private messages seen"
msgstr "Markiere alle persönlichen Nachrichten als gesehen"
-#: ../../include/nav.php:200
+#: ../../include/nav.php:195
msgid "Event Calendar"
msgstr "Terminkalender"
-#: ../../include/nav.php:201
+#: ../../include/nav.php:196
msgid "View events"
msgstr "Termine ansehen"
-#: ../../include/nav.php:202
+#: ../../include/nav.php:197
msgid "Mark all events seen"
msgstr "Markiere alle Termine als gesehen"
-#: ../../include/nav.php:205
+#: ../../include/nav.php:199
msgid "Manage Your Channels"
msgstr "Verwalte Deine Kanäle"
-#: ../../include/nav.php:207
+#: ../../include/nav.php:201
msgid "Account/Channel Settings"
msgstr "Konto-/Kanal-Einstellungen"
+#: ../../include/nav.php:203
+msgid "Shared Files"
+msgstr "Geteilte Dateien"
+
+#: ../../include/nav.php:203
+msgid "New files shared with me"
+msgstr "Neue Dateien, die mit mir geteilt wurden"
+
+#: ../../include/nav.php:208
+msgid "Public stream"
+msgstr "Öffentlicher Beitrags-Stream"
+
+#: ../../include/nav.php:208
+msgid "Public stream activities"
+msgstr "Öffentliche Netzwerk-Aktivitäten"
+
#: ../../include/nav.php:215
msgid "Site Setup and Configuration"
msgstr "Seiten-Einrichtung und -Konfiguration"
-#: ../../include/nav.php:277
+#: ../../include/nav.php:274
msgid "@name, #tag, ?doc, content"
msgstr "@Name, #Schlagwort, ?Dokumentation, Inhalt"
-#: ../../include/nav.php:278
+#: ../../include/nav.php:275
msgid "Please wait..."
msgstr "Bitte warten..."
-#: ../../include/nav.php:280
+#: ../../include/nav.php:278
msgid "Add Apps"
msgstr "Apps hinzufügen"
-#: ../../include/photos.php:115
+#: ../../include/nav.php:279
+msgid "Arrange Apps"
+msgstr "Apps anordnen"
+
+#: ../../include/nav.php:280
+msgid "Toggle System Apps"
+msgstr "System-Apps umschalten"
+
+#: ../../include/photos.php:111
#, php-format
msgid "Image exceeds website size limit of %lu bytes"
msgstr "Bild überschreitet das Webseitenlimit von %lu Bytes"
-#: ../../include/photos.php:122
+#: ../../include/photos.php:118
msgid "Image file is empty."
msgstr "Bilddatei ist leer."
-#: ../../include/photos.php:261
+#: ../../include/photos.php:257
msgid "Photo storage failed."
msgstr "Fotospeicherung fehlgeschlagen."
-#: ../../include/photos.php:301
+#: ../../include/photos.php:297
msgid "a new photo"
msgstr "ein neues Foto"
-#: ../../include/photos.php:305
+#: ../../include/photos.php:301
#, php-format
msgctxt "photo_upload"
msgid "%1$s posted %2$s to %3$s"
msgstr "%1$s hat %2$s auf %3$s veröffentlicht"
-#: ../../include/photos.php:533
+#: ../../include/photos.php:530
msgid "Upload New Photos"
msgstr "Neue Fotos hochladen"
-#: ../../include/zot.php:646
+#: ../../include/zot.php:653
msgid "Invalid data packet"
msgstr "Ungültiges Datenpaket"
-#: ../../include/zot.php:662
+#: ../../include/zot.php:680
msgid "Unable to verify channel signature"
msgstr "Konnte die Signatur des Kanals nicht verifizieren"
-#: ../../include/zot.php:2313
+#: ../../include/zot.php:2338
#, php-format
msgid "Unable to verify site signature for %s"
msgstr "Kann die Signatur der Seite von %s nicht verifizieren"
-#: ../../include/zot.php:3764
+#: ../../include/zot.php:3946
msgid "invalid target signature"
msgstr "Ungültige Signatur des Ziels"
@@ -13276,27 +13316,27 @@ msgstr "Es hat früher schon einmal eine Gruppe mit diesem Namen existiert, die
msgid "Add new connections to this privacy group"
msgstr "Neue Verbindung zu dieser Gruppe hinzufügen"
-#: ../../include/group.php:309
+#: ../../include/group.php:310
msgid "edit"
msgstr "Bearbeiten"
-#: ../../include/group.php:332
+#: ../../include/group.php:333
msgid "Edit group"
msgstr "Gruppe ändern"
-#: ../../include/group.php:333
+#: ../../include/group.php:334
msgid "Add privacy group"
msgstr "Gruppe hinzufügen"
-#: ../../include/group.php:334
+#: ../../include/group.php:335
msgid "Channels not in any privacy group"
msgstr "Kanäle, die in keiner Gruppe sind"
-#: ../../include/connections.php:127
+#: ../../include/connections.php:128
msgid "New window"
msgstr "Neues Fenster"
-#: ../../include/connections.php:128
+#: ../../include/connections.php:129
msgid "Open the selected location in a different window or browser tab"
msgstr "Öffne die markierte Adresse in einem neuen Browserfenster oder Tab"
diff --git a/view/de/hstrings.php b/view/de/hstrings.php
index adeceacb9..2ee8d8a89 100644
--- a/view/de/hstrings.php
+++ b/view/de/hstrings.php
@@ -60,6 +60,7 @@ App::$strings["%d message sent."] = array(
0 => "%d Nachricht gesendet.",
1 => "%d Nachrichten gesendet.",
);
+App::$strings["Invite"] = "Einladen";
App::$strings["You have no more invitations available"] = "Du hast keine weiteren verfügbare Einladungen";
App::$strings["Send invitations"] = "Einladungen senden";
App::$strings["Enter email addresses, one per line:"] = "Email-Adressen eintragen, eine pro Zeile:";
@@ -82,11 +83,67 @@ App::$strings["Profile"] = "Profil";
App::$strings["Click on a contact to add or remove."] = "Klicke auf einen Kontakt, um ihn hinzuzufügen oder zu entfernen.";
App::$strings["Visible To"] = "Sichtbar für";
App::$strings["All Connections"] = "Alle Verbindungen";
+App::$strings["INVALID EVENT DISMISSED!"] = "UNGÜLTIGEN TERMIN ABGELEHNT!";
+App::$strings["Summary: "] = "Zusammenfassung:";
+App::$strings["Unknown"] = "Unbekannt";
+App::$strings["Date: "] = "Datum:";
+App::$strings["Reason: "] = "Grund:";
+App::$strings["INVALID CARD DISMISSED!"] = "UNGÜLTIGE KARTE ABGELEHNT!";
+App::$strings["Name: "] = "Name: ";
+App::$strings["CalDAV"] = "CalDAV";
+App::$strings["Event title"] = "Termintitel";
+App::$strings["Start date and time"] = "Startdatum und -zeit";
+App::$strings["Example: YYYY-MM-DD HH:mm"] = "Beispiel: JJJJ-MM-TT HH:mm";
+App::$strings["End date and time"] = "Enddatum und -zeit";
+App::$strings["Description"] = "Beschreibung";
+App::$strings["Location"] = "Ort";
+App::$strings["Previous"] = "Voriges";
+App::$strings["Next"] = "Nächste";
+App::$strings["Today"] = "Heute";
+App::$strings["Month"] = "Monat";
+App::$strings["Week"] = "Woche";
+App::$strings["Day"] = "Tag";
+App::$strings["List month"] = "Liste Monat";
+App::$strings["List week"] = "Liste Woche";
+App::$strings["List day"] = "Liste Tag";
+App::$strings["More"] = "Mehr";
+App::$strings["Less"] = "Weniger";
+App::$strings["Select calendar"] = "Kalender auswählen";
+App::$strings["Delete all"] = "Alles löschen";
+App::$strings["Cancel"] = "Abbrechen";
+App::$strings["Sorry! Editing of recurrent events is not yet implemented."] = "Entschuldigung, aber das Bearbeiten von wiederkehrenden Veranstaltungen ist leider noch nicht implementiert.";
+App::$strings["CardDAV"] = "CardDAV";
+App::$strings["Name"] = "Name";
+App::$strings["Organisation"] = "Organisation";
+App::$strings["Title"] = "Titel";
+App::$strings["Phone"] = "Telefon";
+App::$strings["Email"] = "E-Mail";
+App::$strings["Instant messenger"] = "Sofortnachrichtendienst";
+App::$strings["Website"] = "Webseite";
+App::$strings["Address"] = "Adresse";
+App::$strings["Note"] = "Hinweis";
+App::$strings["Mobile"] = "Mobil";
+App::$strings["Home"] = "Home";
+App::$strings["Work"] = "Arbeit";
+App::$strings["Add Contact"] = "Kontakt hinzufügen";
+App::$strings["Add Field"] = "Feld hinzufügen";
+App::$strings["Update"] = "Aktualisieren";
+App::$strings["P.O. Box"] = "Postfach";
+App::$strings["Additional"] = "Zusätzlich";
+App::$strings["Street"] = "Straße";
+App::$strings["Locality"] = "Ortschaft";
+App::$strings["Region"] = "Region";
+App::$strings["ZIP Code"] = "Postleitzahl";
+App::$strings["Country"] = "Land";
+App::$strings["Default Calendar"] = "Standardkalender";
+App::$strings["Default Addressbook"] = "Standardadressbuch";
App::$strings["This site is not a directory server"] = "Diese Webseite ist kein Verzeichnisserver";
App::$strings["You must be logged in to see this page."] = "Du musst angemeldet sein, um diese Seite betrachten zu können.";
App::$strings["Posts and comments"] = "Beiträge und Kommentare";
App::$strings["Only posts"] = "Nur Beiträge";
+App::$strings["Channel Home"] = "Mein Kanal";
App::$strings["Insufficient permissions. Request redirected to profile page."] = "Unzureichende Zugriffsrechte. Die Anfrage wurde zur Profil-Seite umgeleitet.";
+App::$strings["Language"] = "Sprache";
App::$strings["Export Channel"] = "Kanal exportieren";
App::$strings["Export your basic channel information to a file. This acts as a backup of your connections, permissions, profile and basic data, which can be used to import your data to a new server hub, but does not contain your content."] = "Exportiert die grundlegenden Kanal-Informationen in eine kleine Datei. Diese stellt eine Sicherung Deiner Verbindungen, Berechtigungen, Profile und Basisdaten bereit, die für den Import auf einem anderen Hub verwendet werden kann, aber nicht die Beiträge Deines Kanals enthält.";
App::$strings["Export Content"] = "Kanal und Inhalte exportieren";
@@ -106,14 +163,14 @@ App::$strings["Please select another location to become primary before removing
App::$strings["Syncing locations"] = "Synchronisiere Klone";
App::$strings["No locations found."] = "Keine Klon-Adressen gefunden.";
App::$strings["Manage Channel Locations"] = "Klon-Adressen verwalten";
-App::$strings["Location"] = "Ort";
-App::$strings["Address"] = "Adresse";
App::$strings["Primary"] = "Primär";
App::$strings["Drop"] = "Löschen";
App::$strings["Sync Now"] = "Jetzt synchronisieren";
App::$strings["Please wait several minutes between consecutive operations."] = "Bitte warte mehrere Minuten zwischen dem Ausführen zweier Operationen!";
App::$strings["When possible, drop a location by logging into that website/hub and removing your channel."] = "Wenn möglich, lösche einen Klon, indem Du Dich auf dem jeweiligen Hub einloggst und den Kanal dort löschst.";
App::$strings["Use this form to drop the location if the hub is no longer operating."] = "Benutze dieses Formular zum Löschen eines Klons, wenn es den Hub nicht mehr gibt.";
+App::$strings["Change Order of Navigation Apps"] = "App-Reihenfolge in der Navigation ändern";
+App::$strings["Use arrows to move the corresponding app up or down in the display list"] = "Benutze die Pfeiltasten, um die jeweilige App in der Anzeigeliste auf- oder abwärts zu bewegen.";
App::$strings["Menu not found."] = "Menü nicht gefunden";
App::$strings["Unable to create element."] = "Element konnte nicht erstellt werden.";
App::$strings["Unable to update menu element."] = "Kann Menü-Element nicht aktualisieren.";
@@ -154,21 +211,19 @@ App::$strings["Unable to generate preview."] = "Vorschau konnte nicht erzeugt we
App::$strings["Event title and start time are required."] = "Titel und Startzeit des Termins sind erforderlich.";
App::$strings["Event not found."] = "Termin nicht gefunden.";
App::$strings["event"] = "Termin";
+App::$strings["Events"] = "Termine";
App::$strings["Edit event title"] = "Termintitel bearbeiten";
-App::$strings["Event title"] = "Termintitel";
App::$strings["Required"] = "Benötigt";
App::$strings["Categories (comma-separated list)"] = "Kategorien (Kommagetrennte Liste)";
App::$strings["Edit Category"] = "Kategorie bearbeiten";
App::$strings["Category"] = "Kategorie";
App::$strings["Edit start date and time"] = "Startdatum und -zeit bearbeiten";
-App::$strings["Start date and time"] = "Startdatum und -zeit";
App::$strings["Finish date and time are not known or not relevant"] = "Enddatum und -zeit sind unbekannt oder irrelevant";
App::$strings["Edit finish date and time"] = "Enddatum und -zeit bearbeiten";
App::$strings["Finish date and time"] = "Enddatum und -zeit";
App::$strings["Adjust for viewer timezone"] = "An die Zeitzone des Betrachters anpassen";
App::$strings["Important for events that happen in a particular place. Not practical for global holidays."] = "Wichtig für Veranstaltungen die an bestimmten Orten stattfinden. Nicht sinnvoll für globale Feiertage / Ferien.";
App::$strings["Edit Description"] = "Beschreibung bearbeiten";
-App::$strings["Description"] = "Beschreibung";
App::$strings["Edit Location"] = "Ort bearbeiten";
App::$strings["Preview"] = "Vorschau";
App::$strings["Permission settings"] = "Berechtigungs-Einstellungen";
@@ -181,13 +236,7 @@ App::$strings["Link to Source"] = "Link zur Quelle";
App::$strings["calendar"] = "Kalender";
App::$strings["Edit Event"] = "Termin bearbeiten";
App::$strings["Create Event"] = "Termin anlegen";
-App::$strings["Previous"] = "Voriges";
-App::$strings["Next"] = "Nächste";
App::$strings["Export"] = "Exportieren";
-App::$strings["Month"] = "Monat";
-App::$strings["Week"] = "Woche";
-App::$strings["Day"] = "Tag";
-App::$strings["Today"] = "Heute";
App::$strings["Event removed"] = "Termin gelöscht";
App::$strings["Failed to remove event"] = "Termin konnte nicht gelöscht werden";
App::$strings["App installed."] = "App installiert.";
@@ -238,7 +287,6 @@ App::$strings["Remove this channel and all its clones from the network"] = "Lös
App::$strings["By default only the instance of the channel located on this hub will be removed from the network"] = "Standardmäßig wird der Kanal nur auf diesem Server gelöscht, seine Klone verbleiben im Netzwerk";
App::$strings["Remove Channel"] = "Kanal löschen";
App::$strings["Files: shared with me"] = "Dateien, die mit mir geteilt wurden";
-App::$strings["Name"] = "Name";
App::$strings["NEW"] = "NEU";
App::$strings["Size"] = "Größe";
App::$strings["Last Modified"] = "Zuletzt geändert";
@@ -270,11 +318,7 @@ App::$strings["Your account email address must match this in order to use the we
App::$strings["Website URL"] = "Webseiten-URL";
App::$strings["Please use SSL (https) URL if available."] = "Nutze wenn möglich eine SSL-URL (https).";
App::$strings["Please select a default timezone for your website"] = "Standard-Zeitzone für Deinen Server";
-App::$strings["Basic/Minimal Social Networking"] = "Einfaches/minimales soziales Netzwerken";
-App::$strings["Standard Configuration (default)"] = "Standardkonfiguration (Standard)";
-App::$strings["Professional"] = "Professionell";
App::$strings["Site settings"] = "Seiteneinstellungen";
-App::$strings["Server Configuration/Role"] = "Serverkonfiguration/Rolle";
App::$strings["PHP version 5.5 or greater is required."] = "PHP-Version 5.5 oder höher ist erforderlich.";
App::$strings["PHP version"] = "PHP-Version";
App::$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 Web-Servers finden.";
@@ -298,6 +342,7 @@ App::$strings["OpenSSL PHP module"] = "OpenSSL-PHP-Modul";
App::$strings["PDO database PHP module"] = "PDO-Datenbank-PHP-Modul";
App::$strings["mb_string PHP module"] = "mb_string-PHP-Modul";
App::$strings["xml PHP module"] = "xml-PHP-Modul";
+App::$strings["zip PHP module"] = "zip PHP Modul";
App::$strings["Apache mod_rewrite module"] = "Apache-mod_rewrite-Modul";
App::$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.";
App::$strings["exec"] = "exec";
@@ -310,6 +355,7 @@ App::$strings["Error: openssl PHP module required but not installed."] = "Fehler
App::$strings["Error: PDO database PHP module required but not installed."] = "Fehler: PDO-Datenbank-PHP-Modul ist erforderlich, aber nicht installiert.";
App::$strings["Error: mb_string PHP module required but not installed."] = "Fehler: Das PHP-Modul mb_string wird benötigt, ist aber nicht installiert.";
App::$strings["Error: xml PHP module required for DAV but not installed."] = "Fehler: Das xml-PHP-Modul wird für DAV benötigt, ist aber nicht installiert.";
+App::$strings["Error: zip PHP module required but not installed."] = "Fehler: Das zip PHP Modul ist erforderlich, ist aber nicht installiert.";
App::$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 er aber nicht.";
App::$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 das daran, dass der Nutzer, unter dem der Web-Server läuft, keine Schreibrechte in dem Verzeichnis hat – selbst wenn Du selbst das darfst.";
App::$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 dieses Vorgangs wird ein Text generiert, den Du unter dem Dateinamen .htconfig.php im Stammverzeichnis Deiner Hubzilla-Installation speichern musst.";
@@ -334,7 +380,7 @@ App::$strings["Url rewrite in .htaccess is not working. Check your server config
App::$strings["Url rewrite is working"] = "Url rewrite funktioniert";
App::$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.";
App::$strings["Errors encountered creating database tables."] = "Fehler beim Anlegen der Datenbank-Tabellen aufgetreten.";
-App::$strings["<h1>What next</h1>"] = "<h1>Was als Nächstes</h1>";
+App::$strings["<h1>What next?</h1>"] = "<h1>Wie geht es jetzt weiter?</h1>";
App::$strings["IMPORTANT: You will need to [manually] setup a scheduled task for the poller."] = "WICHTIG: Du musst [manuell] einen Cronjob für den Poller einrichten.";
App::$strings["Continue"] = "Fortfahren";
App::$strings["Premium Channel Setup"] = "Premium-Kanal-Einrichtung";
@@ -389,11 +435,9 @@ App::$strings["(optional)"] = "(optional)";
App::$strings["Download Plugin Repo"] = "Plugin-Repository herunterladen";
App::$strings["Install new repo"] = "Neues Repository installieren";
App::$strings["Install"] = "Installieren";
-App::$strings["Cancel"] = "Abbrechen";
App::$strings["Manage Repos"] = "Repositorien verwalten";
App::$strings["Installed Plugin Repositories"] = "Installierte Plugin-Repositorien";
App::$strings["Install a New Plugin Repository"] = "Ein neues Plugin-Repository installieren";
-App::$strings["Update"] = "Aktualisieren";
App::$strings["Switch branch"] = "Zweig/Branch wechseln";
App::$strings["Remove"] = "Entfernen";
App::$strings["%s account blocked/unblocked"] = array(
@@ -412,7 +456,6 @@ App::$strings["Accounts"] = "Konten";
App::$strings["select all"] = "Alle auswählen";
App::$strings["Registrations waiting for confirm"] = "Registrierungen warten auf Bestätigung";
App::$strings["Request date"] = "Antragsdatum";
-App::$strings["Email"] = "E-Mail";
App::$strings["No registrations."] = "Keine Registrierungen.";
App::$strings["Approve"] = "Genehmigen";
App::$strings["Deny"] = "Verweigern";
@@ -460,10 +503,10 @@ App::$strings["Channel"] = "Kanal";
App::$strings["UID"] = "UID";
App::$strings["Selected channels will be deleted!\\n\\nEverything that was posted in these channels on this site will be permanently deleted!\\n\\nAre you sure?"] = "Alle ausgewählten Kanäle werden gelöscht!\\n\\nAlles was von diesen Kanälen auf diesem Server geschrieben wurde, wird dauerhaft gelöscht!\\n\\nBist Du sicher?";
App::$strings["The channel {0} will be deleted!\\n\\nEverything that was posted in this channel on this site will be permanently deleted!\\n\\nAre you sure?"] = "Der Kanal {0} wird gelöscht!\\n\\nAlles was von diesem Kanal auf diesem Server geschrieben wurde, wird gelöscht!\\n\\nBist Du sicher?";
-App::$strings["Theme settings updated."] = "Theme-Einstellungen aktualisiert.";
-App::$strings["No themes found."] = "Keine Theme gefunden.";
+App::$strings["Theme settings updated."] = "Design-Einstellungen aktualisiert.";
+App::$strings["No themes found."] = "Keine Designs gefunden.";
App::$strings["Screenshot"] = "Bildschirmfoto";
-App::$strings["Themes"] = "Themes";
+App::$strings["Themes"] = "Designs";
App::$strings["[Experimental]"] = "[Experimentell]";
App::$strings["[Unsupported]"] = "[Nicht unterstützt]";
App::$strings["Site settings updated."] = "Site-Einstellungen aktualisiert.";
@@ -499,9 +542,9 @@ App::$strings["Contact information for site administrators. Displayed on sitein
App::$strings["Site Information"] = "Seiteninformationen";
App::$strings["Publicly visible description of this site. Displayed on siteinfo page. BBCode can be used here"] = "Öffentlich sichtbare Beschreibung dieses Servers. Wird auf der siteinfo-Seite angezeigt. BBCode kann hier verwendet werden.";
App::$strings["System language"] = "System-Sprache";
-App::$strings["System theme"] = "System-Theme";
-App::$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>";
-App::$strings["Mobile system theme"] = "Mobile System-Theme:";
+App::$strings["System theme"] = "System-Design";
+App::$strings["Default system theme - may be over-ridden by user profiles - <a href='#' id='cnftheme'>change theme settings</a>"] = "Standard-System-Design – kann durch Nutzerprofile überschieben werden – <a href='#' id='cnftheme'>Design-Einstellungen ändern</a>";
+App::$strings["Mobile system theme"] = "System-Design für mobile Geräte:";
App::$strings["Theme for mobile devices"] = "Theme für mobile Geräte";
App::$strings["Allow Feeds as Connections"] = "Feeds als Verbindungen erlauben";
App::$strings["(Heavy system resource usage)"] = "(führt zu hoher Systemlast)";
@@ -603,6 +646,8 @@ App::$strings["Block embedded HTML from these domains"] = "Eingebettete HTML Inh
App::$strings["Remote privacy information not available."] = "Privatsphäre-Einstellungen anderer Nutzer sind nicht verfügbar.";
App::$strings["Visible to:"] = "Sichtbar für:";
App::$strings["__ctx:acl__ Profile"] = "Profil";
+App::$strings["Comment approved"] = "Kommentar bestätigt";
+App::$strings["Comment deleted"] = "Kommentar gelöscht";
App::$strings["Permission category saved."] = "Berechtigungsrolle gespeichert.";
App::$strings["Use this form to create permission rules for various classes of people or connections."] = "Verwende dieses Formular, um Berechtigungsrollen für verschiedene Gruppen von Personen oder Verbindungen zu erstellen.";
App::$strings["Permission Categories"] = "Berechtigungsrollen";
@@ -684,12 +729,14 @@ App::$strings["Recommended"] = "Empfohlen";
App::$strings["Upcoming events"] = "Baldige Termine";
App::$strings["Events today"] = "Heutige Termine";
App::$strings["Upcoming birthdays"] = "Baldige Geburtstage";
-App::$strings["Not available in all themes"] = "Nicht in allen Themes verfügbar";
+App::$strings["Not available in all themes"] = "Nicht in allen Designs verfügbar";
App::$strings["System (personal) notifications"] = "System – (persönliche) Benachrichtigungen";
App::$strings["System info messages"] = "System – Info-Nachrichten";
App::$strings["System critical alerts"] = "System – kritische Warnungen";
App::$strings["New connections"] = "Neue Verbindungen";
App::$strings["System Registrations"] = "System – Registrierungen";
+App::$strings["Unseen shared files"] = "Ungesehene geteilte Dateien";
+App::$strings["Unseen public activity"] = "Ungesehene öffentliche Aktivität";
App::$strings["Also show new wall posts, private messages and connections under Notices"] = "Neue Pinnwand-Nachrichten, private Nachrichten und Verbindungen unter Benachrichtigungen anzeigen";
App::$strings["Notify me of events this many days in advance"] = "Benachrichtige mich zu Terminen so viele Tage im Voraus";
App::$strings["Must be greater than 0"] = "Muss größer als 0 sein";
@@ -738,15 +785,15 @@ App::$strings["Default maximum affinity level"] = "Voreinstellung für maximalen
App::$strings["Default minimum affinity level"] = "Voreinstellung für minimalen Beziehungsgrad";
App::$strings["Affinity Slider Settings"] = "Beziehungsgrad-Schieberegler-Einstellungen";
App::$strings["Feature/Addon Settings"] = "Funktions-/Addon-Einstellungen";
-App::$strings["No special theme for mobile devices"] = "Keine spezielle Theme für mobile Geräte";
+App::$strings["No special theme for mobile devices"] = "Kein spezielles Design für mobile Geräte";
App::$strings["%s - (Experimental)"] = "%s – (experimentell)";
App::$strings["Display Settings"] = "Anzeige-Einstellungen";
-App::$strings["Theme Settings"] = "Theme-Einstellungen";
-App::$strings["Custom Theme Settings"] = "Benutzerdefinierte Theme-Einstellungen";
+App::$strings["Theme Settings"] = "Design-Einstellungen";
+App::$strings["Custom Theme Settings"] = "Benutzerdefinierte Design-Einstellungen";
App::$strings["Content Settings"] = "Inhaltseinstellungen";
-App::$strings["Display Theme:"] = "Anzeige-Theme:";
+App::$strings["Display Theme:"] = "Anzeige-Design:";
App::$strings["Select scheme"] = "Schema wählen";
-App::$strings["Mobile Theme:"] = "Mobile Theme:";
+App::$strings["Mobile Theme:"] = "Design für mobile Geräte:";
App::$strings["Preload images before rendering the page"] = "Bilder im voraus laden, bevor die Seite angezeigt wird";
App::$strings["The subjective page load time will be longer but the page will be ready when displayed"] = "Die empfundene Ladezeit wird sich erhöhen, aber dafür ist das Layout stabil, sobald eine Seite angezeigt wird";
App::$strings["Enable user zoom on mobile devices"] = "Zoom auf Mobilgeräten aktivieren";
@@ -782,7 +829,6 @@ App::$strings["Client key starts with"] = "Client Key beginnt mit";
App::$strings["No name"] = "Kein Name";
App::$strings["Remove authorization"] = "Authorisierung aufheben";
App::$strings["View Photo"] = "Foto ansehen";
-App::$strings["Unknown"] = "Unbekannt";
App::$strings["Edit Album"] = "Album bearbeiten";
App::$strings["Upload"] = "Hochladen";
App::$strings["Some blurb about what to do when you're new here"] = "Ein Hinweis, was man tun kann, wenn man neu hier ist";
@@ -841,10 +887,11 @@ App::$strings["Create new app"] = "Neue App erstellen";
App::$strings["__ctx:mood__ %1\$s is %2\$s"] = "%1\$s ist %2\$s";
App::$strings["Mood"] = "Laune";
App::$strings["Set your current mood and tell your friends"] = "Wähle Deine aktuelle Stimmung und teile sie mit Deinen Freunden";
+App::$strings["Connections"] = "Verbindungen";
App::$strings["Blocked"] = "Blockiert";
App::$strings["Ignored"] = "Ignoriert";
App::$strings["Hidden"] = "Versteckt";
-App::$strings["Archived"] = "Archiviert";
+App::$strings["Archived/Unreachable"] = "Archiviert/Unerreichbar";
App::$strings["New"] = "Neu";
App::$strings["All"] = "Alle";
App::$strings["New Connections"] = "Neue Verbindungen";
@@ -852,9 +899,11 @@ App::$strings["Show pending (new) connections"] = "Ausstehende (neue) Verbindung
App::$strings["Show all connections"] = "Alle Verbindungen anzeigen";
App::$strings["Only show blocked connections"] = "Nur blockierte Verbindungen anzeigen";
App::$strings["Only show ignored connections"] = "Nur ignorierte Verbindungen anzeigen";
-App::$strings["Only show archived connections"] = "Nur archivierte Verbindungen anzeigen";
+App::$strings["Only show archived/unreachable connections"] = "Nur archivierte/unerreichbare Verbindungen anzeigen";
App::$strings["Only show hidden connections"] = "Nur versteckte Verbindungen anzeigen";
App::$strings["Pending approval"] = "Wartet auf Genehmigung";
+App::$strings["Archived"] = "Archiviert";
+App::$strings["Not connected at this location"] = "An diesem Ort nicht verbunden";
App::$strings["%1\$s [%2\$s]"] = "%1\$s [%2\$s]";
App::$strings["Edit connection"] = "Verbindung bearbeiten";
App::$strings["Delete connection"] = "Verbindung löschen";
@@ -867,12 +916,12 @@ App::$strings["Approve connection"] = "Verbindung genehmigen";
App::$strings["Ignore connection"] = "Verbindung ignorieren";
App::$strings["Ignore"] = "Ignorieren";
App::$strings["Recent activity"] = "Kürzliche Aktivitäten";
-App::$strings["Connections"] = "Verbindungen";
App::$strings["Search your connections"] = "Verbindungen durchsuchen";
App::$strings["Connections search"] = "Verbindung suchen";
App::$strings["Find"] = "Finde";
-App::$strings["item"] = "";
+App::$strings["item"] = "Beitrag";
App::$strings["Source of Item"] = "Quelle des Elements";
+App::$strings["View Bookmarks"] = "Lesezeichen ansehen";
App::$strings["Bookmark added"] = "Lesezeichen hinzugefügt";
App::$strings["My Bookmarks"] = "Meine Lesezeichen";
App::$strings["My Connections Bookmarks"] = "Lesezeichen meiner Kontakte";
@@ -887,6 +936,7 @@ App::$strings["Delete Album"] = "Album löschen";
App::$strings["Delete Photo"] = "Foto löschen";
App::$strings["No photos selected"] = "Keine Fotos ausgewählt";
App::$strings["Access to this item is restricted."] = "Der Zugriff auf dieses Foto ist eingeschränkt.";
+App::$strings["Photos"] = "Fotos";
App::$strings["%1$.2f MB of %2$.2f MB photo storage used."] = "%1$.2f MB von %2$.2f MB Foto-Speicher belegt.";
App::$strings["%1$.2f MB photo storage used."] = "%1$.2f MB Foto-Speicher belegt.";
App::$strings["Upload Photos"] = "Fotos hochladen";
@@ -945,6 +995,7 @@ App::$strings["Recent Photos"] = "Neueste Fotos";
App::$strings["Profile Unavailable."] = "Profil nicht verfügbar.";
App::$strings["Not found"] = "Nicht gefunden";
App::$strings["Invalid channel"] = "Ungültiger Kanal";
+App::$strings["Wiki"] = "Wiki";
App::$strings["Wikis"] = "Wikis";
App::$strings["Download"] = "Herunterladen";
App::$strings["Create New"] = "Neu anlegen";
@@ -1019,6 +1070,7 @@ App::$strings["Unable to locate original post."] = "Originalbeitrag nicht gefund
App::$strings["Empty post discarded."] = "Leeren Beitrag verworfen.";
App::$strings["Duplicate post suppressed."] = "Doppelter Beitrag unterdrückt.";
App::$strings["System error. Post not saved."] = "Systemfehler. Beitrag nicht gespeichert.";
+App::$strings["Your comment is awaiting approval."] = "Dein Kommentar muss noch bestätigt werden.";
App::$strings["Unable to obtain post information from database."] = "Beitragsinformationen können nicht aus der Datenbank abgerufen werden.";
App::$strings["You have reached your limit of %1$.0f top level posts."] = "Du hast die maximale Anzahl von %1$.0f Beiträgen erreicht.";
App::$strings["You have reached your limit of %1$.0f webpages."] = "Du hast die maximale Anzahl von %1$.0f Webseiten erreicht.";
@@ -1076,7 +1128,10 @@ App::$strings["Accept connection to allow communication"] = "Akzeptiere die Verb
App::$strings["Set Affinity"] = "Beziehung festlegen";
App::$strings["Set Profile"] = "Profil festlegen";
App::$strings["Set Affinity & Profile"] = "Beziehung und Profile festlegen";
-App::$strings["none"] = "Keine";
+App::$strings["This connection is unreachable from this location."] = "Diese Verbindung ist von diesem Ort unerreichbar.";
+App::$strings["This connection may be unreachable from other channel locations."] = "Diese Verbindung könnte von anderen Standpunkten des Kanals nicht erreichbar sein.";
+App::$strings["Location independence is not supported by their network."] = "Standort Unabhängigkeit wird vom anderen Netzwerk nicht unterstützt.";
+App::$strings["This connection is unreachable from this location. Location independence is not supported by their network."] = "Diese Verbindung ist von diesem Standort aus unerreichbar. Standort Unabhängigkeit wird vom anderen Netzwerk nicht unterstützt.";
App::$strings["Connection Default Permissions"] = "Standardzugriffsrechte für neue Verbindungen:";
App::$strings["Connection: %s"] = "Verbindung: %s";
App::$strings["Apply these permissions automatically"] = "Diese Berechtigungen automatisch anwenden";
@@ -1101,24 +1156,7 @@ App::$strings["Please choose the profile you would like to display to %s when vi
App::$strings["Some permissions may be inherited from your channel's <a href=\"settings\"><strong>privacy settings</strong></a>, which have higher priority than individual settings. You can change those settings here but they wont have any impact unless the inherited setting changes."] = "Einige Berechtigungen werden möglicherweise von den globalen <a href=\"settings\">Sicherheits- und Privatsphäre-Einstellungen</a> dieses Kanals geerbt. Diese haben eine höhere Priorität als die Einstellungen an der Verbindung. Werden geerbte Einstellungen hier geändert, hat dies keine Auswirkungen.";
App::$strings["Last update:"] = "Letzte Aktualisierung:";
App::$strings["Details"] = "Details";
-App::$strings["Organisation"] = "Organisation";
-App::$strings["Title"] = "Titel";
-App::$strings["Phone"] = "Telefon";
-App::$strings["Instant messenger"] = "Sofortnachrichtendienst";
-App::$strings["Website"] = "Webseite";
-App::$strings["Note"] = "Hinweis";
-App::$strings["Mobile"] = "Mobil";
-App::$strings["Home"] = "Home";
-App::$strings["Work"] = "Arbeit";
-App::$strings["Add Contact"] = "Kontakt hinzufügen";
-App::$strings["Add Field"] = "Feld hinzufügen";
-App::$strings["P.O. Box"] = "Postfach";
-App::$strings["Additional"] = "Zusätzlich";
-App::$strings["Street"] = "Straße";
-App::$strings["Locality"] = "Ortschaft";
-App::$strings["Region"] = "Region";
-App::$strings["ZIP Code"] = "Postleitzahl";
-App::$strings["Country"] = "Land";
+App::$strings["My Chatrooms"] = "Meine Chaträume";
App::$strings["Room not found"] = "Chatraum nicht gefunden";
App::$strings["Leave Room"] = "Raum verlassen";
App::$strings["Delete Room"] = "Raum löschen";
@@ -1134,7 +1172,6 @@ App::$strings["%1\$s's Chatrooms"] = "%1\$ss Chaträume";
App::$strings["No chatrooms available"] = "Keine Chaträume verfügbar";
App::$strings["Expiration"] = "Verfall";
App::$strings["min"] = "min";
-App::$strings["Photos"] = "Fotos";
App::$strings["Files"] = "Dateien";
App::$strings["Unable to update menu."] = "Kann Menü nicht aktualisieren.";
App::$strings["Unable to create menu."] = "Kann Menü nicht erstellen.";
@@ -1277,11 +1314,11 @@ App::$strings["Ratings"] = "Bewertungen";
App::$strings["Rating: "] = "Bewertung: ";
App::$strings["Website: "] = "Webseite: ";
App::$strings["Description: "] = "Beschreibung: ";
+App::$strings["Webpages"] = "Webseiten";
App::$strings["Import Webpage Elements"] = "Webseitenelemente importieren";
App::$strings["Import selected"] = "Import ausgewählt";
App::$strings["Export Webpage Elements"] = "Webseitenelemente exportieren";
App::$strings["Export selected"] = "Exportieren ausgewählt";
-App::$strings["Webpages"] = "Webseiten";
App::$strings["Actions"] = "Aktionen";
App::$strings["Page Link"] = "Seiten-Link";
App::$strings["Page Title"] = "Seitentitel";
@@ -1325,6 +1362,7 @@ App::$strings["Edit Source"] = "Quelle bearbeiten";
App::$strings["Delete Source"] = "Quelle löschen";
App::$strings["Source removed"] = "Quelle gelöscht";
App::$strings["Unable to remove source."] = "Konnte die Quelle nicht löschen.";
+App::$strings["Post"] = "Beitrag schreiben";
App::$strings["Like/Dislike"] = "Mögen/Nicht mögen";
App::$strings["This action is restricted to members."] = "Diese Aktion kann nur von Mitgliedern ausgeführt werden.";
App::$strings["Please <a href=\"rmagic\">login with your \$Projectname ID</a> or <a href=\"register\">register as a new \$Projectname member</a> to continue."] = "Um fortzufahren <a href=\"rmagic\">melde Dich bitte mit Deiner \$Projectname-ID an</a> oder <a href=\"register\">registriere Dich als neues \$Projectname-Mitglied</a>.";
@@ -1343,6 +1381,7 @@ App::$strings["%1\$s is not attending %2\$s's %3\$s"] = "%1\$s nimmt an %2\$ss %
App::$strings["%1\$s may attend %2\$s's %3\$s"] = "%1\$s nimmt vielleicht an %2\$ss %3\$s teil";
App::$strings["Action completed."] = "Aktion durchgeführt.";
App::$strings["Thank you."] = "Vielen Dank.";
+App::$strings["Directory"] = "Verzeichnis";
App::$strings["%d rating"] = array(
0 => "%d Bewertung",
1 => "%d Bewertungen",
@@ -1374,6 +1413,7 @@ App::$strings["Oldest to Newest"] = "Älteste zuerst";
App::$strings["No entries (some entries may be hidden)."] = "Keine Einträge gefunden (einige könnten versteckt sein).";
App::$strings["Xchan Lookup"] = "Xchan-Suche";
App::$strings["Lookup xchan beginning with (or webbie): "] = "Nach xchans oder Webbies (Kanal-Adressen) suchen, die wie folgt beginnen:";
+App::$strings["Suggest Channels"] = "Kanäle vorschlagen";
App::$strings["No suggestions available. If this is a new site, please try again in 24 hours."] = "Keine Vorschläge vorhanden. Wenn das ein neuer Server ist, versuche es in 24 Stunden noch einmal.";
App::$strings["Ignore/Hide"] = "Ignorieren/Verstecken";
App::$strings["Unable to find your hub."] = "Konnte Deinen Server nicht finden.";
@@ -1382,6 +1422,7 @@ App::$strings["Unable to lookup recipient."] = "Konnte den Empfänger nicht find
App::$strings["Unable to communicate with requested channel."] = "Die Kommunikation mit dem ausgewählten Kanal ist fehlgeschlagen.";
App::$strings["Cannot verify requested channel."] = "Verifizierung des angeforderten Kanals fehlgeschlagen.";
App::$strings["Selected channel has private message restrictions. Send failed."] = "Der ausgewählte Kanal hat Einschränkungen bzgl. privater Nachrichten. Senden fehlgeschlagen.";
+App::$strings["Mail"] = "Mail";
App::$strings["Messages"] = "Nachrichten";
App::$strings["message"] = "Nachricht";
App::$strings["Message recalled."] = "Nachricht widerrufen.";
@@ -1423,6 +1464,7 @@ App::$strings["Or enter new bookmark folder name"] = "Oder gib einen neuen Namen
App::$strings["Enter a folder name"] = "Gib einen Ordnernamen ein";
App::$strings["or select an existing folder (doubleclick)"] = "oder wähle einen vorhanden Ordner aus (Doppelklick)";
App::$strings["Save to Folder"] = "In Ordner speichern";
+App::$strings["Remote Diagnostics"] = "Ferndiagnose";
App::$strings["Fetching URL returns error: %1\$s"] = "Abrufen der URL gab einen Fehler zurück: %1\$s";
App::$strings["Maximum daily site registrations exceeded. Please try again tomorrow."] = "Maximale Anzahl täglicher Neuanmeldungen erreicht. Bitte versuche es morgen noch einmal.";
App::$strings["Please indicate acceptance of the Terms of Service. Registration failed."] = "Bitte stimme den Nutzungsbedingungen zu. Registrierung fehlgeschlagen.";
@@ -1467,6 +1509,7 @@ App::$strings["No such group"] = "Gruppe nicht gefunden";
App::$strings["No such channel"] = "Kanal nicht gefunden";
App::$strings["forum"] = "Forum";
App::$strings["Search Results For:"] = "Suchergebnisse für:";
+App::$strings["Activity"] = "Aktivität";
App::$strings["Privacy group is empty"] = "Gruppe ist leer";
App::$strings["Privacy group: "] = "Gruppe:";
App::$strings["Invalid connection."] = "Ungültige Verbindung.";
@@ -1485,20 +1528,17 @@ App::$strings["Copy/paste this code to attach file to a post"] = "Diesen Code ko
App::$strings["Copy/paste this URL to link file from a web page"] = "Diese URL verwenden, um von einer Webseite aus auf die Datei zu verlinken";
App::$strings["Share this file"] = "Diese Datei freigeben";
App::$strings["Show URL to this file"] = "URL zu dieser Datei anzeigen";
-App::$strings["Notify your contacts about this file"] = "Meine Kontakte über diese Datei benachrichtigen";
+App::$strings["Show in your contacts shared folder"] = "Im geteilten Ordner Deiner Kontakte anzeigen";
App::$strings["No channel."] = "Kein Kanal.";
App::$strings["Common connections"] = "Gemeinsame Verbindungen";
App::$strings["No connections in common."] = "Keine gemeinsamen Verbindungen.";
App::$strings["No connections."] = "Keine Verbindungen.";
App::$strings["Visit %s's profile [%s]"] = "%ss Profil [%s] besuchen";
App::$strings["View Connections"] = "Verbindungen anzeigen";
-App::$strings["# Accounts"] = "Anzahl der Konten";
-App::$strings["# blocked accounts"] = "Anzahl der blockierten Konten";
-App::$strings["# expired accounts"] = "Anzahl der abgelaufenen Konten";
-App::$strings["# expiring accounts"] = "Anzahl der ablaufenden Konten";
-App::$strings["# Channels"] = "Anzahl der Kanäle";
-App::$strings["# primary"] = "Anzahl der primären Kanäle";
-App::$strings["# clones"] = "Anzahl der Klone";
+App::$strings["Blocked accounts"] = "Blockierte Benutzerkonten";
+App::$strings["Expired accounts"] = "Abgelaufene Benutzerkonten";
+App::$strings["Expiring accounts"] = "Ablaufende Benutzerkonten";
+App::$strings["Clones"] = "Klone";
App::$strings["Message queues"] = "Nachrichten-Warteschlangen";
App::$strings["Your software should be updated"] = "Die installierte Software sollte aktualisiert werden";
App::$strings["Summary"] = "Zusammenfassung";
@@ -1530,29 +1570,22 @@ App::$strings["Forgot your Password?"] = "Kennwort vergessen?";
App::$strings["Enter your email address and submit to have your password reset. Then check your email for further instructions."] = "Gib Deine E-Mail-Adresse ein, um Dein Passwort zurücksetzen zu lassen. Du erhältst dann weitere Anweisungen per E-Mail.";
App::$strings["Email Address"] = "E-Mail Adresse";
App::$strings["Reset"] = "Zurücksetzen";
-App::$strings["Mark all system notifications seen"] = "Markiere alle System-Benachrichtigungen als gesehen";
+App::$strings["Mark all seen"] = "Alle als gelesen markieren";
+App::$strings["0. Beginner/Basic"] = "0. Einsteiger/Basis";
+App::$strings["1. Novice - not skilled but willing to learn"] = "1. Anfänger - unerfahren, aber bereit zu lernen";
+App::$strings["2. Intermediate - somewhat comfortable"] = "2. Fortgeschritten - relativ komfortabel";
+App::$strings["3. Advanced - very comfortable"] = "3. Fortgeschritten - sehr komfortabel";
+App::$strings["4. Expert - I can write computer code"] = "4. Experte - Ich kann Computercode schreiben";
+App::$strings["5. Wizard - I probably know more than you do"] = "5. Zauberer - ich kann wahrscheinlich mehr als Du";
App::$strings["Site Admin"] = "Hub-Administration";
App::$strings["Report Bug"] = "Fehler melden";
-App::$strings["View Bookmarks"] = "Lesezeichen ansehen";
-App::$strings["My Chatrooms"] = "Meine Chaträume";
App::$strings["Firefox Share"] = "Teilen-Knopf für Firefox";
-App::$strings["Remote Diagnostics"] = "Ferndiagnose";
-App::$strings["Suggest Channels"] = "Kanäle vorschlagen";
App::$strings["Login"] = "Anmelden";
-App::$strings["Activity"] = "Aktivität";
-App::$strings["Wiki"] = "Wiki";
-App::$strings["Channel Home"] = "Mein Kanal";
-App::$strings["Events"] = "Termine";
-App::$strings["Directory"] = "Verzeichnis";
-App::$strings["Mail"] = "Mail";
App::$strings["Chat"] = "Chat";
App::$strings["Probe"] = "Testen";
App::$strings["Suggest"] = "Empfehlen";
App::$strings["Random Channel"] = "Zufälliger Kanal";
-App::$strings["Invite"] = "Einladen";
App::$strings["Features"] = "Funktionen";
-App::$strings["Language"] = "Sprache";
-App::$strings["Post"] = "Beitrag schreiben";
App::$strings["Profile Photo"] = "Profilfoto";
App::$strings["Purchase"] = "Kaufen";
App::$strings["Undelete"] = "Wieder hergestellt";
@@ -1609,9 +1642,11 @@ App::$strings["Please visit %s to view and/or reply to your private messages."]
App::$strings["%1\$s, %2\$s commented on [zrl=%3\$s]a %4\$s[/zrl]"] = "%1\$s, %2\$s hat [zrl=%3\$s]einen %4\$s[/zrl] kommentiert";
App::$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";
App::$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";
+App::$strings["[\$Projectname:Notify] Moderated Comment to conversation #%1\$d by %2\$s"] = "[\$Projectname:Benachrichtigung] Moderierter Kommantar in Unterhaltung #%1\$d von %2\$s";
App::$strings["[\$Projectname:Notify] Comment to conversation #%1\$d by %2\$s"] = "[\$Projectname:Benachrichtigung] Kommentar in Unterhaltung #%1\$d von %2\$s";
App::$strings["%1\$s, %2\$s commented on an item/conversation you have been following."] = "%1\$s, %2\$s hat eine Unterhaltung kommentiert, der Du folgst.";
App::$strings["Please visit %s to view and/or reply to the conversation."] = "Bitte besuche %s, um die Unterhaltung anzusehen und/oder zu kommentieren.";
+App::$strings["Please visit %s to approve or reject this comment."] = "Bitte besuche %s, um diesen Kommentar anzunehmen oder abzulehnen.";
App::$strings["%1\$s, %2\$s liked [zrl=%3\$s]your %4\$s[/zrl]"] = "%1\$s, %2\$s gefällt [zrl=%3\$s]dein %4\$s[/zrl]";
App::$strings["[\$Projectname:Notify] Like received to conversation #%1\$d by %2\$s"] = "[\$Projectname:Benachrichtigung] Gefällt mir in Unterhaltung #%1\$d von %2\$s erhalten";
App::$strings["%1\$s, %2\$s liked an item/conversation you created."] = "%1\$s, %2\$s gefällt ein Beitrag oder eine Unterhaltung von Dir";
@@ -1682,7 +1717,6 @@ App::$strings["Vote"] = "Abstimmen";
App::$strings["Voting Options"] = "Abstimmungsoptionen";
App::$strings["Save Bookmarks"] = "Favoriten speichern";
App::$strings["Add to Calendar"] = "Zum Kalender hinzufügen";
-App::$strings["Mark all seen"] = "Alle als gelesen markieren";
App::$strings["%s show all"] = "%s mehr anzeigen";
App::$strings["Bold"] = "Fett";
App::$strings["Italic"] = "Kursiv";
@@ -1692,6 +1726,9 @@ App::$strings["Code"] = "Code";
App::$strings["Image"] = "Bild";
App::$strings["Insert Link"] = "Link einfügen";
App::$strings["Video"] = "Video";
+App::$strings["Your full name (required)"] = "Ihr vollständiger Name (erforderlich)";
+App::$strings["Your email address (required)"] = "Ihre E-Mail-Adresse (erforderlich)";
+App::$strings["Your website URL (optional)"] = "Ihre Webseiten-URL (optional)";
App::$strings["Remote authentication blocked. You are logged into this site locally. Please logout and retry."] = "Fern-Authentifizierung blockiert. Du bist lokal auf diesem Server angemeldet. Bitte melde Dich ab und versuche es erneut.";
App::$strings["Welcome %s. Remote authentication successful."] = "Willkommen %s. Entfernte Authentifizierung erfolgreich.";
App::$strings["parent"] = "Übergeordnetes Verzeichnis";
@@ -1711,6 +1748,25 @@ App::$strings["Create new folder"] = "Neuen Ordner anlegen";
App::$strings["Upload file"] = "Datei hochladen";
App::$strings["Drop files here to immediately upload"] = "Dateien zum sofortigen Hochladen hier fallen lassen";
App::$strings["Forums"] = "Foren";
+App::$strings["Select Channel"] = "Kanal auswählen";
+App::$strings["Read-write"] = "Lesen-schreiben";
+App::$strings["Read-only"] = "Nur Lesen";
+App::$strings["My Calendars"] = "Meine Kalender";
+App::$strings["Shared Calendars"] = "Geteilte Kalender";
+App::$strings["Share this calendar"] = "Diesen Kalender teilen";
+App::$strings["Calendar name and color"] = "Kalendername und -farbe";
+App::$strings["Create new calendar"] = "Neuen Kalender erstellen";
+App::$strings["Calendar Name"] = "Kalendername";
+App::$strings["Calendar Tools"] = "Kalenderwerkzeuge";
+App::$strings["Import calendar"] = "Kalender importieren";
+App::$strings["Select a calendar to import to"] = "Kalender zum Hineinimportieren auswählen";
+App::$strings["Addressbooks"] = "Adressbücher";
+App::$strings["Addressbook name"] = "Adressbuchname";
+App::$strings["Create new addressbook"] = "Neues Adressbuch erstellen";
+App::$strings["Addressbook Name"] = "Adressbuchname";
+App::$strings["Addressbook Tools"] = "Adressbuchwerkzeuge";
+App::$strings["Import addressbook"] = "Adressbuch importieren";
+App::$strings["Select an addressbook to import to"] = "Adressbuch zum Hineinimportieren auswählen";
App::$strings["Categories"] = "Kategorien";
App::$strings["Everything"] = "Alles";
App::$strings["Events Tools"] = "Kalenderwerkzeuge";
@@ -1734,9 +1790,9 @@ App::$strings["Enter channel address"] = "Adresse des Kanals eingeben";
App::$strings["Examples: bob@example.com, https://example.com/barbara"] = "Beispiele: bob@beispiel.com, http://beispiel.com/barbara";
App::$strings["Wiki List"] = "Wikiliste";
App::$strings["Archives"] = "Archive";
-App::$strings["Conversations"] = "Konversationen";
App::$strings["Received Messages"] = "Erhaltene Nachrichten";
App::$strings["Sent Messages"] = "Gesendete Nachrichten";
+App::$strings["Conversations"] = "Konversationen";
App::$strings["No messages."] = "Keine Nachrichten.";
App::$strings["Delete conversation"] = "Unterhaltung löschen";
App::$strings["Chat Members"] = "Chatmitglieder";
@@ -1771,8 +1827,6 @@ App::$strings["Permission Groups"] = "Berechtigungsrollen";
App::$strings["Premium Channel Settings"] = "Premium-Kanal-Einstellungen";
App::$strings["Bookmarked Chatrooms"] = "Gespeicherte Chatrooms";
App::$strings["Source channel not found."] = "Quellkanal nicht gefunden.";
-App::$strings["__ctx:opensearch__ Search %1\$s (%2\$s)"] = "Suche %1\$s (%2\$s)";
-App::$strings["__ctx:opensearch__ \$Projectname"] = "\$Projectname";
App::$strings["Create an account to access services and applications"] = "Erstelle ein Konto, um auf Dienste und Anwendungen zugreifen zu können.";
App::$strings["Logout"] = "Abmelden";
App::$strings["Login/Email"] = "Anmelden/E-Mail";
@@ -1786,7 +1840,7 @@ App::$strings["[\$Projectname] Cron tasks not running on %s"] = "[\$Projectname]
App::$strings["Cron/Scheduled tasks not running."] = "Cron-Aufgaben laufen nicht.";
App::$strings["never"] = "Nie";
App::$strings["Focus (Hubzilla default)"] = "Focus (Voreinstellung für Hubzilla)";
-App::$strings["Theme settings"] = "Theme-Einstellungen";
+App::$strings["Theme settings"] = "Design-Einstellungen";
App::$strings["Narrow navbar"] = "Schmale Navigationsleiste";
App::$strings["Navigation bar background color"] = "Hintergrundfarbe der Navigationsleiste";
App::$strings["Navigation bar icon color "] = "Farbe für die Icons der Navigationsleiste";
@@ -1838,58 +1892,11 @@ App::$strings["Some setting"] = "Einige Einstellungen";
App::$strings["A setting"] = "Eine Einstellung";
App::$strings["Skeleton Settings"] = "Skeleton Einstellungen";
App::$strings["GNU-Social Protocol Settings updated."] = "GNU social Protokoll Einstellungen aktualisiert";
+App::$strings["The GNU-Social protocol does not support location independence. Connections you make within that network may be unreachable from alternate channel locations."] = "Das GNU-Social-Protokoll unterstützt keine Server-unabhängigen Identitäten. Verbindungen, die Du mit diesem Netzwerk eingehst, können von anderen Orten (Klonen) dieses Kanals aus unerreichbar sein.";
App::$strings["Enable the GNU-Social protocol for this channel"] = "Aktiviere das GNU social Protokoll für diesen Kanal";
App::$strings["GNU-Social Protocol Settings"] = "GNU social Protokoll Einstellungen";
App::$strings["Follow"] = "Folgen";
App::$strings["%1\$s is now following %2\$s"] = "%1\$s folgt nun %2\$s";
-App::$strings["INVALID EVENT DISMISSED!"] = "UNGÜLTIGEN TERMIN ABGELEHNT!";
-App::$strings["Summary: "] = "Zusammenfassung:";
-App::$strings["Date: "] = "Datum:";
-App::$strings["Reason: "] = "Grund:";
-App::$strings["INVALID CARD DISMISSED!"] = "UNGÜLTIGE KARTE ABGELEHNT!";
-App::$strings["Name: "] = "Name: ";
-App::$strings["You have to enable this plugin in Feature/Addon Settings > CalDAV/CardDAV Settings before you can use it."] = "Du musst dieses Plugin zunächst in Einstellungen > Plugin-Einstellungen > CalDAV/CardDAV-Einstellungen aktivieren, bevor Du es verwenden kannst.";
-App::$strings["Example: YYYY-MM-DD HH:mm"] = "Beispiel: JJJJ-MM-TT HH:mm";
-App::$strings["End date and time"] = "Enddatum und -zeit";
-App::$strings["List month"] = "Liste Monat";
-App::$strings["List week"] = "Liste Woche";
-App::$strings["List day"] = "Liste Tag";
-App::$strings["More"] = "Mehr";
-App::$strings["Less"] = "Weniger";
-App::$strings["Select calendar"] = "Kalender auswählen";
-App::$strings["Delete all"] = "Alles löschen";
-App::$strings["Sorry! Editing of recurrent events is not yet implemented."] = "Entschuldigung, aber das Bearbeiten von wiederkehrenden Veranstaltungen ist leider noch nicht implementiert.";
-App::$strings["Errors encountered creating database table: "] = "Fehler beim Anlegen der Datenbank-Tabellen aufgetreten.";
-App::$strings["Default Calendar"] = "Standardkalender";
-App::$strings["Default Addressbook"] = "Standardadressbuch";
-App::$strings["CalDAV/CardDAV Settings saved."] = "CalDAV/CardDAV-Einstellungen gespeichert.";
-App::$strings["Enable CalDAV/CardDAV Server for this channel"] = "Aktiviere den CalDAV/CardDAV Server für diesen Kanal";
-App::$strings["Your CalDAV resources are located at %s "] = "Deine CalDAV Resourcen sind unter %s verfügbar";
-App::$strings["Your CardDAV resources are located at %s "] = "Deine CardDAV Ressourcen sind unter %s verfügbar";
-App::$strings["CalDAV/CardDAV Settings"] = "CalDAV/CardDAV-Einstellungen";
-App::$strings["Home, Voice"] = "Zuhause, Sprache";
-App::$strings["Home, Fax"] = "Zuhause, Fax";
-App::$strings["Work, Voice"] = "Arbeit, Sprache";
-App::$strings["Work, Fax"] = "Arbeit, Fax";
-App::$strings["Select Channel"] = "Kanal auswählen";
-App::$strings["Read-write"] = "Lesen-schreiben";
-App::$strings["Read-only"] = "Nur Lesen";
-App::$strings["My Calendars"] = "Meine Kalender";
-App::$strings["Shared Calendars"] = "Geteilte Kalender";
-App::$strings["Share this calendar"] = "Diesen Kalender teilen";
-App::$strings["Calendar name and color"] = "Kalendername und -farbe";
-App::$strings["Create new calendar"] = "Neuen Kalender erstellen";
-App::$strings["Calendar Name"] = "Kalendername";
-App::$strings["Calendar Tools"] = "Kalenderwerkzeuge";
-App::$strings["Import calendar"] = "Kalender importieren";
-App::$strings["Select a calendar to import to"] = "Kalender zum Hineinimportieren auswählen";
-App::$strings["Addressbooks"] = "Adressbücher";
-App::$strings["Addressbook name"] = "Adressbuchname";
-App::$strings["Create new addressbook"] = "Neues Adressbuch erstellen";
-App::$strings["Addressbook Name"] = "Adressbuchname";
-App::$strings["Addressbook Tools"] = "Adressbuchwerkzeuge";
-App::$strings["Import addressbook"] = "Adressbuch importieren";
-App::$strings["Select an addressbook to import to"] = "Adressbuch zum Hineinimportieren auswählen";
App::$strings["Planets Settings updated."] = "Planeten Einstellungen aktualisiert";
App::$strings["Enable Planets Plugin"] = "Aktiviere Planeten Plugin";
App::$strings["Planets Settings"] = "Planeten Einstellungen";
@@ -1932,10 +1939,10 @@ App::$strings["Post to WordPress by default"] = "Standardmäßig auf auf WordPre
App::$strings["Forward comments (requires hubzilla_wp plugin)"] = "Kommentare weiterleiten (benötigt hubzilla_wp Plugin)";
App::$strings["WordPress Post Settings"] = "WordPress-Beitragseinstellungen";
App::$strings["Wordpress Settings saved."] = "Wordpress-Einstellungen gespeichert.";
-App::$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."] = "";
+App::$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 Textbausteinen, die Du hier unterhalb einträgst, und faltet alle Beiträge zusammen, in denen es diese Bausteine findet. Auf diese Weise wird verhindert, dass Inhalte, wie z.B. sexuelle Anspielungen, in unpassenden Momenten angezeigt werden. Es gilt als höflich und empfohlen, den #NSFW Tag für Beiträge zu verwenden, bei denen Du davon ausgehen kannst, dass andere sie anstößig finden könnten. Du kannst aber auch beliebige andere Wörter in der Liste angeben und das Plugin so als allgemeinen Inhaltsfilter verwenden.";
App::$strings["Enable Content filter"] = "Inhaltsfilter aktivieren";
App::$strings["Comma separated list of keywords to hide"] = "Kommaseparierte Liste von Schlüsselworten die verborgen werden sollen.";
-App::$strings["Word, /regular-expression/, lang=xx, lang!=xx"] = "";
+App::$strings["Word, /regular-expression/, lang=xx, lang!=xx"] = "Wort, /regular-expression/, lang=xx, lang!=xx";
App::$strings["Not Safe For Work Settings"] = "Not Safe For Work Einstellungen";
App::$strings["General Purpose Content Filter"] = "Allzweck-Inhaltsfilter";
App::$strings["NSFW Settings saved."] = "NSFW-Einstellungen gespeichert.";
@@ -1962,9 +1969,9 @@ App::$strings["Dreamwidth username"] = "Dreamwidth-Benutzername";
App::$strings["Dreamwidth password"] = "Dreamwidth-Passwort";
App::$strings["Post to Dreamwidth by default"] = "Standardmäßig auf auf Dreamwidth posten";
App::$strings["Dreamwidth Post Settings"] = "Dreamwidth-Beitragseinstellungen";
-App::$strings["Install Firefox Sharing Tools"] = "";
+App::$strings["Install Firefox Sharing Tools"] = "Installiere das Firefox Sharing Werkzeug";
App::$strings["Share content from Firefox to \$Projectname"] = "Inhalte von Firefox nach \$Projectname teilen";
-App::$strings["Install Firefox Sharing Tools to this web browser"] = "";
+App::$strings["Install Firefox Sharing Tools to this web browser"] = "Installiere das Firefox Sharing Werkzeug in diesen Webbrowser";
App::$strings["Hubzilla Directory Stats"] = "Hubzilla-Verzeichnisstatistiken";
App::$strings["Total Hubs"] = "Hubs insgesamt";
App::$strings["Hubzilla Hubs"] = "Hubzilla Hubs";
@@ -2077,13 +2084,15 @@ App::$strings["bonk"] = "";
App::$strings["bonked"] = "";
App::$strings["declare undying love for"] = "";
App::$strings["declared undying love for"] = "";
-App::$strings["Diaspora Protocol Settings updated."] = "";
-App::$strings["Enable the Diaspora protocol for this channel"] = "";
-App::$strings["Allow any Diaspora member to comment on your public posts"] = "";
-App::$strings["Prevent your hashtags from being redirected to other sites"] = "";
-App::$strings["Followed hashtags (comma separated, do not include the #)"] = "";
-App::$strings["Diaspora Protocol Settings"] = "";
-App::$strings["No username found in import file."] = "";
+App::$strings["Diaspora Protocol Settings updated."] = "Diaspora Protokoll Einstellungen aktualisiert";
+App::$strings["The Diaspora protocol does not support location independence. Connections you make within that network may be unreachable from alternate channel locations."] = "Das Diaspora-Protokoll unterstützt keine Server-unabhängigen Identitäten. Verbindungen, die Du mit diesem Netzwerk eingehst, können von anderen Orten (Klonen) dieses Kanals aus unerreichbar sein.";
+App::$strings["Enable the Diaspora protocol for this channel"] = "Das Diaspora Protokoll für diesen Kanal aktivieren";
+App::$strings["Allow any Diaspora member to comment on your public posts"] = "Erlaube jedem Diaspora Nutzer deine öffentlichen Beiträge zu kommentieren";
+App::$strings["Prevent your hashtags from being redirected to other sites"] = "Verhindern, dass Deine Hashtags zu anderen Seiten umgeleitet werden";
+App::$strings["Sign and forward posts and comments with no existing Diaspora signature"] = "Signieren und Weiterleiten von Beiträgen und Kommentaren ohne vorhandene Diaspora-Signatur";
+App::$strings["Followed hashtags (comma separated, do not include the #)"] = "Verfolgte Hashtags (Komma separierte Liste, ohne die #)";
+App::$strings["Diaspora Protocol Settings"] = "Diaspora Protokoll Einstellungen";
+App::$strings["No username found in import file."] = "Es wurde kein Nutzername in der importierten Datei gefunden.";
App::$strings["Unable to create a unique channel address. Import failed."] = "Es war nicht möglich, eine eindeutige Kanal-Adresse zu erzeugen. Der Import ist fehlgeschlagen.";
App::$strings["Error retrieving wiki"] = "Fehler beim Abrufen des Wiki";
App::$strings["Error creating zip file export folder"] = "Fehler bei der Erzeugung des Zip-Datei Export-Verzeichnisses ";
@@ -2113,10 +2122,6 @@ App::$strings["Mail sent."] = "Mail gesendet.";
App::$strings["Sending of mail failed."] = "Senden der E-Mail fehlgeschlagen.";
App::$strings["Mail Test"] = "Mail Test";
App::$strings["Message subject"] = "Betreff der Nachricht";
-App::$strings["Reconnecting %d connections"] = "";
-App::$strings["Diaspora Reconnect"] = "";
-App::$strings["Use this form to re-establish Diaspora connections which were initially made from a different hub."] = "";
-App::$strings["Reconnect"] = "";
App::$strings["View Larger"] = "Größer anzeigen";
App::$strings["Tile Server URL"] = "Kachelserver-URL";
App::$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 Kachelserver</a>";
@@ -2136,7 +2141,7 @@ App::$strings["Friendica API Path"] = "Friendica-API-Pfad";
App::$strings["https://{sitename}/api"] = "https://{sitename}/api";
App::$strings["Friendica login name"] = "Friendica-Anmeldename";
App::$strings["Friendica password"] = "Friendica-Passwort";
-App::$strings["Hubzilla to Friendica Post Settings"] = "";
+App::$strings["Hubzilla to Friendica Post Settings"] = "Hubzilla-zu-Friendica Beitragseinstellungen";
App::$strings["Status:"] = "Status:";
App::$strings["Activate addon"] = "Addon aktiviren";
App::$strings["Hide Jappixmini Chat-Widget from the webinterface"] = "Jappix Mini Chat-Widget von der Weboberfläche verbergen";
@@ -2146,7 +2151,7 @@ App::$strings["Jabber BOSH host URL"] = "Jabber BOSH Host URL";
App::$strings["Jabber password"] = "Jabber-Passwort";
App::$strings["Encrypt Jabber password with Hubzilla password"] = "Jabber-Passwort mit Hubzilla-Passwort verschlüsseln";
App::$strings["Hubzilla password"] = "Hubzilla-Passwort";
-App::$strings["Approve subscription requests from Hubzilla contacts automatically"] = "";
+App::$strings["Approve subscription requests from Hubzilla contacts automatically"] = "Verbindungsanfragen von Hubzilla-Kontakten automatisch annehmen";
App::$strings["Purge internal list of jabber addresses of contacts"] = "Interne Liste der Jabber Adressen von Kontakten löschen";
App::$strings["Configuration Help"] = "Konfigurationshilfe";
App::$strings["Jappix Mini Settings"] = "Jappix Mini Einstellungen";
@@ -2155,10 +2160,10 @@ App::$strings["No channels currently blocked"] = "Momentan sind keine Kanäle bl
App::$strings["\"Superblock\" Settings"] = "\"Superblock\"-Einstellungen";
App::$strings["Block Completely"] = "Vollständig blockieren";
App::$strings["superblock settings updated"] = "Superblock Einstellungen aktualisiert";
-App::$strings["Federate"] = "";
+App::$strings["Federate"] = "Beitrag verteilen";
App::$strings["nofed Settings saved."] = "nofed Einstellungen gespeichert";
-App::$strings["Allow Federation Toggle"] = "";
-App::$strings["Federate posts by default"] = "";
+App::$strings["Allow Federation Toggle"] = "Umschalter zur Beitragsverteilung bereitstellen";
+App::$strings["Federate posts by default"] = "Beiträge standardmäßig verteilen";
App::$strings["NoFed Settings"] = "NoFed-Einstellungen";
App::$strings["Post to Red"] = "";
App::$strings["Channel is required."] = "Kanal ist erforderlich.";
@@ -2269,10 +2274,10 @@ App::$strings["Enable notifications"] = "Benachrichtigungen aktivieren";
App::$strings["Post to Twitter"] = "Bei Twitter veröffentlichen";
App::$strings["Twitter settings updated."] = "Twitter-Einstellungen aktualisiert.";
App::$strings["No consumer key pair for Twitter found. Please contact your site administrator."] = "Es wurde kein Consumer-Schlüsselpaar für Twitter gefunden. Bitte kontaktiere deinen Seiten-Administrator.";
-App::$strings["At this Hubzilla 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."] = "";
+App::$strings["At this Hubzilla 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 Hubzilla-Server ist das Twitter-Plugin aktiviert, aber Du hast Dich hier noch nicht mit Deinem Twitter-Konto verbunden. Um dies zu tun, klicke die Schaltfläche unten, um eine PIN von Twitter zu erhalten, die Du dann in das Eingabefeld darunter einfügen und das Formular bestätigen musst. Nur Deine <strong>öffentlichen</strong> Beiträge werden auf Twitter geteilt.";
App::$strings["Log in with Twitter"] = "Mit Twitter anmelden";
App::$strings["Copy the PIN from Twitter here"] = "PIN von Twitter hier her kopieren";
-App::$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."] = "";
+App::$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> Entsprechend Deiner Privatsphären-Einstellungen (<em>Profil-Details vor nicht angemeldeten Besuchern verbergen?</em>) kann ein ggf. zu Twitter geteilter Link Besucher auf eine leere Seite führen, die darüber informiert, dass der Zugriff zu Deinem Profil eingeschränkt ist.";
App::$strings["Allow posting to Twitter"] = "Erlaube die Veröffentlichung bei Twitter";
App::$strings["If enabled your public postings can be posted to the associated Twitter account"] = "Wenn aktiv können deine öffentlichen Beiträge bei dem verbundenen Twitter Account veröffentlicht werden.";
App::$strings["Send public postings to Twitter by default"] = "Standardmäßig öffentliche Beiträge bei Twitter veröffentlichen";
@@ -2326,7 +2331,7 @@ App::$strings["If you see this icon you can be sure that the sender is who it sa
App::$strings["Danger! It seems someone tried to forge a message! This message is not necessarily from who it says it is from!"] = "Vorsicht! Es kann sein, dass jemand versucht, eine Nachricht zu fälschen! Diese Nachricht muss nicht unbedingt vom angegebenen Absender stammen!";
App::$strings["Welcome to Hubzilla! Would you like to see a tour of the UI?</p> <p>You can pause it at any time and continue where you left off by reloading the page, or navigting to another page.</p><p>You can also advance by pressing the return key"] = "Willkommen zu Hubzilla! Möchtest Du eine Tour der Benutzeroberfläche angezeigt bekommen?</p><p>Du kannst zu jeder Zeit pausieren und fortsetzen, wo Du aufgehört hast, indem Du die Seite neu lädtst, oder zu einer anderen Seite springst.</p><p>Du kannst auc durch das Drücken der Enter-Taste weitergehen.";
App::$strings["Extended Identity Sharing"] = "Erweitertes Teilen von Identitäten";
-App::$strings["Share your identity with all websites on the internet. When disabled, identity is only shared with sites in the matrix."] = "";
+App::$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 Hubzilla-Servern geteilt.";
App::$strings["Three Dimensional Tic-Tac-Toe"] = "Dreidimensionales Tic-Tac-Toe";
App::$strings["3D Tic-Tac-Toe"] = "3D Tic-Tac-Toe";
App::$strings["New game"] = "Neues Spiel";
@@ -2342,6 +2347,10 @@ App::$strings["I won!"] = "Ich habe gewonnen!";
App::$strings["Message to display on every page on this server"] = "Nachricht, die auf jeder Seite dieses Servers angezeigt werden soll";
App::$strings["Pageheader Settings"] = "Nachrichtenkopf-Einstellungen";
App::$strings["pageheader Settings saved."] = "Nachrichtenkopf-Einstellungen gespeichert.";
+App::$strings["Only authenticate automatically to sites of your friends"] = "Authentifiziere Dich nur auf Seiten deiner Freunde automatisch";
+App::$strings["By default you are automatically authenticated anywhere in the network"] = "Authentifiziere Dich standardmäßig bei allen Seiten im Netzwerk automatisch";
+App::$strings["Authchoose Settings"] = "Einstellungen für automatische Authentifizierung";
+App::$strings["Atuhchoose Settings updated."] = "Einstellungen für automatische Authentifizierung aktualisiert.";
App::$strings["lonely"] = "einsam";
App::$strings["drunk"] = "betrunken";
App::$strings["horny"] = "geil";
@@ -2390,6 +2399,8 @@ App::$strings["Pump.io Post Settings"] = "Pump.io-Beitragseinstellungen";
App::$strings["PumpIO Settings saved."] = "PumpIO-Einstellungen gespeichert.";
App::$strings["An account has been created for you."] = "Ein Konto wurde für Sie erstellt.";
App::$strings["Authentication successful but rejected: account creation is disabled."] = "Authentifizierung war erfolgreich wurde aber abgewiesen! Das Anlegen von Accounts wurde deaktiviert.";
+App::$strings["__ctx:opensearch__ Search %1\$s (%2\$s)"] = "Suche %1\$s (%2\$s)";
+App::$strings["__ctx:opensearch__ \$Projectname"] = "\$Projectname";
App::$strings["Search \$Projectname"] = "\$Projectname suchen";
App::$strings["Redmatrix File Storage Import"] = "";
App::$strings["This will import all your Redmatrix cloud files to this channel."] = "Hiermit werden alle deine Daten aus der Redmatrix Cloud in diesen Kanal importiert.";
@@ -2551,19 +2562,6 @@ App::$strings["__ctx:noun__ Abstain"] = array(
0 => "Enthaltung",
1 => "Enthaltungen",
);
-App::$strings["Can view my normal stream and posts"] = "Kann meine normalen Beiträge sehen";
-App::$strings["Can view my webpages"] = "Kann meine Webseiten sehen";
-App::$strings["Can post on my channel page (\"wall\")"] = "Kann auf meiner Kanal-Seite (\"wall\") Beiträge veröffentlichen";
-App::$strings["Can like/dislike stuff"] = "Kann andere Elemente mögen/nicht mögen";
-App::$strings["Profiles and things other than posts/comments"] = "Profile und alles außer Beiträge und Kommentare";
-App::$strings["Can forward to all my channel contacts via post @mentions"] = "Kann an alle meine Kontakte via @-Erwähnung Nachrichten weiterleiten";
-App::$strings["Advanced - useful for creating group forum channels"] = "Fortgeschritten - sinnvoll, um Gruppen-Kanäle/-Foren zu erstellen";
-App::$strings["Can chat with me (when available)"] = "Kann mit mir chatten (wenn verfügbar)";
-App::$strings["Can write to my file storage and photos"] = "Kann in meine Datei- und Bilderordner schreiben";
-App::$strings["Can edit my webpages"] = "Kann meine Webseiten bearbeiten";
-App::$strings["Somewhat advanced - very useful in open communities"] = "Etwas fortgeschritten – sehr nützlich in offenen Gemeinschaften";
-App::$strings["Can administer my channel resources"] = "Kann meine Kanäle administrieren";
-App::$strings["Extremely advanced. Leave this alone unless you know what you are doing"] = "Sehr fortgeschritten. Bearbeite das nur, wenn Du genau weißt, was Du tust";
App::$strings["Directory Options"] = "Verzeichnisoptionen";
App::$strings["Safe Mode"] = "Sicherer Modus";
App::$strings["Public Forums Only"] = "Nur öffentliche Foren";
@@ -2634,11 +2632,13 @@ App::$strings["Unknown Attachment"] = "Unbekannter Anhang";
App::$strings["unknown"] = "unbekannt";
App::$strings["remove category"] = "Kategorie entfernen";
App::$strings["remove from file"] = "aus der Datei entfernen";
+App::$strings["Download binary/encrypted content"] = "Binären/verschlüsselten Inhalt herunterladen";
App::$strings["default"] = "Standard";
App::$strings["Page layout"] = "Seiten-Layout";
App::$strings["You can create your own with the layouts tool"] = "Mit dem Gestaltungswerkzeug kannst Du Deine eigenen Layouts erstellen";
App::$strings["Page content type"] = "Art des Seiteninhalts";
App::$strings["activity"] = "Aktivität";
+App::$strings["a-z, 0-9, -, _, and . only"] = "nur a-z, 0-9, -, _, und .";
App::$strings["Design Tools"] = "Gestaltungswerkzeuge";
App::$strings["Pages"] = "Seiten";
App::$strings["Import website..."] = "Webseite importieren...";
@@ -2672,11 +2672,7 @@ App::$strings["%d connection in common"] = array(
1 => "%d gemeinsame Verbindungen",
);
App::$strings["show more"] = "mehr zeigen";
-App::$strings["Attachments:"] = "Anhänge:";
-App::$strings["l F d, Y \\@ g:i A"] = "l, d. F Y, H:i";
-App::$strings["\$Projectname event notification:"] = "";
-App::$strings["Starts:"] = "Beginnt:";
-App::$strings["Finishes:"] = "Endet:";
+App::$strings["%1\$s wrote the following %2\$s %3\$s"] = "%1\$s schrieb den folgenden %2\$s %3\$s";
App::$strings["Channel is blocked on this site."] = "Der Kanal ist auf dieser Seite blockiert ";
App::$strings["Channel location missing."] = "Adresse des Kanals fehlt.";
App::$strings["Response from remote channel was incomplete."] = "Antwort des entfernten Kanals war unvollständig.";
@@ -2711,7 +2707,7 @@ App::$strings["about an hour"] = "ungefähr eine Stunde";
App::$strings["about %d hours"] = "ungefähr %d Stunden";
App::$strings["a day"] = "ein Tag";
App::$strings["%d days"] = "%d Tage";
-App::$strings["about a month"] = "ungefähr ein Monat";
+App::$strings["about a month"] = "ungefähr einen Monat";
App::$strings["%d months"] = "%d Monate";
App::$strings["about a year"] = "ungefähr ein Jahr";
App::$strings["%d years"] = "%d Jahre";
@@ -2793,11 +2789,13 @@ App::$strings["Reserved nickname. Please choose another."] = "Reservierter Kurzn
App::$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.";
App::$strings["Unable to retrieve created identity"] = "Kann die erstellte Identität nicht empfangen";
App::$strings["Default Profile"] = "Standard-Profil";
+App::$strings["Unable to retrieve modified identity"] = "Geänderte Identität kann nicht empfangen werden";
App::$strings["Create New Profile"] = "Neues Profil erstellen";
App::$strings["Visible to everybody"] = "Für jeden sichtbar";
App::$strings["Gender:"] = "Geschlecht:";
App::$strings["Homepage:"] = "Homepage:";
App::$strings["Online Now"] = "gerade online";
+App::$strings["Trans"] = "";
App::$strings["Like this channel"] = "Dieser Kanal gefällt mir";
App::$strings["j F, Y"] = "j. F Y";
App::$strings["j F"] = "j. F";
@@ -2821,25 +2819,31 @@ App::$strings["Work/employment:"] = "Arbeit/Anstellung:";
App::$strings["School/education:"] = "Schule/Ausbildung:";
App::$strings["Like this thing"] = "Gefällt mir";
App::$strings["User '%s' deleted"] = "Benutzer '%s' gelöscht";
+App::$strings["l F d, Y \\@ g:i A"] = "l, d. F Y, H:i";
+App::$strings["Starts:"] = "Beginnt:";
+App::$strings["Finishes:"] = "Endet:";
App::$strings["This event has been added to your calendar."] = "Dieser Termin wurde zu Deinem Kalender hinzugefügt";
App::$strings["Not specified"] = "Keine Angabe";
App::$strings["Needs Action"] = "Aktion erforderlich";
App::$strings["Completed"] = "Abgeschlossen";
App::$strings["In Process"] = "In Bearbeitung";
App::$strings["Cancelled"] = "gestrichen";
+App::$strings["Home, Voice"] = "Zuhause, Sprache";
+App::$strings["Home, Fax"] = "Zuhause, Fax";
+App::$strings["Work, Voice"] = "Arbeit, Sprache";
+App::$strings["Work, Fax"] = "Arbeit, Fax";
App::$strings["view full size"] = "In Vollbildansicht anschauen";
-App::$strings["No Subject"] = "Kein Betreff";
App::$strings["Friendica"] = "Friendica";
App::$strings["OStatus"] = "OStatus";
App::$strings["GNU-Social"] = "GNU-Social";
App::$strings["RSS/Atom"] = "RSS/Atom";
+App::$strings["ActivityPub"] = "ActivityPub";
App::$strings["Diaspora"] = "Diaspora";
App::$strings["Facebook"] = "Facebook";
App::$strings["Zot"] = "Zot!";
App::$strings["LinkedIn"] = "LinkedIn";
App::$strings["XMPP/IM"] = "XMPP/IM";
App::$strings["MySpace"] = "MySpace";
-App::$strings["New Page"] = "Neue Seite";
App::$strings["Select an alternate language"] = "Wähle eine alternative Sprache";
App::$strings["Who can see this?"] = "Wer kann das sehen?";
App::$strings["Custom selection"] = "Benutzerdefinierte Auswahl";
@@ -2852,7 +2856,6 @@ App::$strings["Image/photo"] = "Bild/Foto";
App::$strings["Encrypted content"] = "Verschlüsselter Inhalt";
App::$strings["Install %s element: "] = "Element %s installieren: ";
App::$strings["This post contains an installable %s element, however you lack permissions to install it on this site."] = "Dieser Beitrag beinhaltet ein installierbares %s Element, aber Du hast nicht die nötigen Rechte, um es auf diesem Hub zu installieren.";
-App::$strings["%1\$s wrote the following %2\$s %3\$s"] = "%1\$s schrieb den folgenden %2\$s %3\$s";
App::$strings["Click to open/close"] = "Klicke zum Öffnen/Schließen";
App::$strings["spoiler"] = "Spoiler";
App::$strings["$1 wrote:"] = "$1 schrieb:";
@@ -3015,6 +3018,7 @@ App::$strings["Mark all channel notifications seen"] = "Markiere alle Kanal-Bena
App::$strings["Notices"] = "Benachrichtigungen";
App::$strings["Notifications"] = "Benachrichtigungen";
App::$strings["View all notifications"] = "Alle Benachrichtigungen ansehen";
+App::$strings["Mark all system notifications seen"] = "Markiere alle System-Benachrichtigungen als gesehen";
App::$strings["Private mail"] = "Persönliche Mail";
App::$strings["View your private messages"] = "Zeige Deine persönlichen Nachrichten an";
App::$strings["Mark all private messages seen"] = "Markiere alle persönlichen Nachrichten als gesehen";
@@ -3023,10 +3027,16 @@ App::$strings["View events"] = "Termine ansehen";
App::$strings["Mark all events seen"] = "Markiere alle Termine als gesehen";
App::$strings["Manage Your Channels"] = "Verwalte Deine Kanäle";
App::$strings["Account/Channel Settings"] = "Konto-/Kanal-Einstellungen";
+App::$strings["Shared Files"] = "Geteilte Dateien";
+App::$strings["New files shared with me"] = "Neue Dateien, die mit mir geteilt wurden";
+App::$strings["Public stream"] = "Öffentlicher Beitrags-Stream";
+App::$strings["Public stream activities"] = "Öffentliche Netzwerk-Aktivitäten";
App::$strings["Site Setup and Configuration"] = "Seiten-Einrichtung und -Konfiguration";
App::$strings["@name, #tag, ?doc, content"] = "@Name, #Schlagwort, ?Dokumentation, Inhalt";
App::$strings["Please wait..."] = "Bitte warten...";
App::$strings["Add Apps"] = "Apps hinzufügen";
+App::$strings["Arrange Apps"] = "Apps anordnen";
+App::$strings["Toggle System Apps"] = "System-Apps umschalten";
App::$strings["Image exceeds website size limit of %lu bytes"] = "Bild überschreitet das Webseitenlimit von %lu Bytes";
App::$strings["Image file is empty."] = "Bilddatei ist leer.";
App::$strings["Photo storage failed."] = "Fotospeicherung fehlgeschlagen.";
diff --git a/view/de/htconfig.tpl b/view/de/htconfig.tpl
index 9d4333fb0..46bf0de14 100644
--- a/view/de/htconfig.tpl
+++ b/view/de/htconfig.tpl
@@ -34,13 +34,6 @@ App::$config['system']['baseurl'] = '{{$siteurl}}';
App::$config['system']['sitename'] = "Hubzilla";
App::$config['system']['location_hash'] = '{{$site_id}}';
-// Choices are 'basic', 'standard', and 'pro'.
-// basic sets up the sevrer for basic social networking and removes "complicated" features
-// standard provides most desired features except e-commerce
-// pro gives you access to everything
-
-App::$config['system']['server_role'] = '{{$server_role}}';
-
// These lines set additional security headers to be sent with all responses
// You may wish to set transport_security_header to 0 if your server already sends
// this header. content_security_policy may need to be disabled if you wish to
diff --git a/view/en-au/htconfig.tpl b/view/en-au/htconfig.tpl
index 090bbf06f..cefcba727 100644
--- a/view/en-au/htconfig.tpl
+++ b/view/en-au/htconfig.tpl
@@ -34,13 +34,6 @@ App::$config['system']['baseurl'] = '{{$siteurl}}';
App::$config['system']['sitename'] = "Hubzilla";
App::$config['system']['location_hash'] = '{{$site_id}}';
-// Choices are 'basic', 'standard', and 'pro'.
-// basic sets up the sevrer for basic social networking and removes "complicated" features
-// standard provides most desired features except e-commerce
-// pro gives you access to everything
-
-App::$config['system']['server_role'] = '{{$server_role}}';
-
// These lines set additional security headers to be sent with all responses
// You may wish to set transport_security_header to 0 if your server already sends
// this header. content_security_policy may need to be disabled if you wish to
diff --git a/view/en-gb/htconfig.tpl b/view/en-gb/htconfig.tpl
index 515957b36..ea458d664 100644
--- a/view/en-gb/htconfig.tpl
+++ b/view/en-gb/htconfig.tpl
@@ -34,14 +34,6 @@ App::$config['system']['baseurl'] = '{{$siteurl}}';
App::$config['system']['sitename'] = "Hubzilla";
App::$config['system']['location_hash'] = '{{$site_id}}';
-
-// Choices are 'basic', 'standard', and 'pro'.
-// basic sets up the sevrer for basic social networking and removes "complicated" features
-// standard provides most desired features except e-commerce
-// pro gives you access to everything
-
-App::$config['system']['server_role'] = '{{$server_role}}';
-
// These lines set additional security headers to be sent with all responses
// You may wish to set transport_security_header to 0 if your server already sends
// this header. content_security_policy may need to be disabled if you wish to
diff --git a/view/en/htconfig.tpl b/view/en/htconfig.tpl
index 042c89797..8159b6d44 100644
--- a/view/en/htconfig.tpl
+++ b/view/en/htconfig.tpl
@@ -34,15 +34,6 @@ App::$config['system']['baseurl'] = '{{$siteurl}}';
App::$config['system']['sitename'] = "Hubzilla";
App::$config['system']['location_hash'] = '{{$site_id}}';
-// Choices are 'basic', 'standard', and 'pro'.
-// basic sets up the server for basic social networking and removes "complicated" features
-// standard provides most desired features except e-commerce
-// pro disables protocol federation plugins and only supports the zot protocol
-// if you are in doubt or are unsure, it is strongly advised that you select 'standard'.
-
-App::$config['system']['server_role'] = '{{$server_role}}';
-
-
// These lines set additional security headers to be sent with all responses
// You may wish to set transport_security_header to 0 if your server already sends
// this header. content_security_policy may need to be disabled if you wish to
diff --git a/view/es-es/hmessages.po b/view/es-es/hmessages.po
index a2341b272..44c5309a4 100644
--- a/view/es-es/hmessages.po
+++ b/view/es-es/hmessages.po
@@ -13,8 +13,8 @@ msgid ""
msgstr ""
"Project-Id-Version: Redmatrix\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2017-05-01 15:36+0200\n"
-"PO-Revision-Date: 2017-05-04 10:22+0000\n"
+"POT-Creation-Date: 2017-08-01 12:13+0200\n"
+"PO-Revision-Date: 2017-08-02 06:49+0000\n"
"Last-Translator: Manuel Jiménez Friaza <mjfriaza@openmailbox.org>\n"
"Language-Team: Spanish (Spain) (http://www.transifex.com/Friendica/red-matrix/language/es_ES/)\n"
"MIME-Version: 1.0\n"
@@ -23,163 +23,147 @@ msgstr ""
"Language: es_ES\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
-#: ../../Zotlabs/Access/Permissions.php:46
+#: ../../Zotlabs/Access/Permissions.php:53
msgid "Can view my channel stream and posts"
msgstr "Pueden verse la actividad y publicaciones de mi canal"
-#: ../../Zotlabs/Access/Permissions.php:47 ../../include/permissions.php:42
+#: ../../Zotlabs/Access/Permissions.php:54
msgid "Can send me their channel stream and posts"
msgstr "Se me pueden enviar entradas y contenido de un canal"
-#: ../../Zotlabs/Access/Permissions.php:48 ../../include/permissions.php:36
+#: ../../Zotlabs/Access/Permissions.php:55
msgid "Can view my default channel profile"
msgstr "Puede verse mi perfil de canal predeterminado."
-#: ../../Zotlabs/Access/Permissions.php:49 ../../include/permissions.php:37
+#: ../../Zotlabs/Access/Permissions.php:56
msgid "Can view my connections"
msgstr "Pueden verse mis conexiones"
-#: ../../Zotlabs/Access/Permissions.php:50 ../../include/permissions.php:38
+#: ../../Zotlabs/Access/Permissions.php:57
msgid "Can view my file storage and photos"
msgstr "Pueden verse mi repositorio de ficheros y mis fotos"
-#: ../../Zotlabs/Access/Permissions.php:51
+#: ../../Zotlabs/Access/Permissions.php:58
msgid "Can upload/modify my file storage and photos"
msgstr "Se pueden subir / modificar elementos en mi repositorio de ficheros y fotos"
-#: ../../Zotlabs/Access/Permissions.php:52
+#: ../../Zotlabs/Access/Permissions.php:59
msgid "Can view my channel webpages"
msgstr "Pueden verse las páginas personales de mi canal"
-#: ../../Zotlabs/Access/Permissions.php:53
+#: ../../Zotlabs/Access/Permissions.php:60
msgid "Can view my wiki pages"
msgstr "Pueden verse mis páginas wiki"
-#: ../../Zotlabs/Access/Permissions.php:54
+#: ../../Zotlabs/Access/Permissions.php:61
msgid "Can create/edit my channel webpages"
msgstr "Pueden crearse / modificarse páginas personales en mi canal"
-#: ../../Zotlabs/Access/Permissions.php:55
+#: ../../Zotlabs/Access/Permissions.php:62
msgid "Can write to my wiki pages"
msgstr "Se pueden modificar las páginas de mi wiki"
-#: ../../Zotlabs/Access/Permissions.php:56
+#: ../../Zotlabs/Access/Permissions.php:63
msgid "Can post on my channel (wall) page"
msgstr "Pueden crearse entradas en mi página de inicio del canal (“muro”)"
-#: ../../Zotlabs/Access/Permissions.php:57 ../../include/permissions.php:44
+#: ../../Zotlabs/Access/Permissions.php:64
msgid "Can comment on or like my posts"
msgstr "Pueden publicarse comentarios en mis publicaciones o marcar mis entradas con 'me gusta'."
-#: ../../Zotlabs/Access/Permissions.php:58 ../../include/permissions.php:45
+#: ../../Zotlabs/Access/Permissions.php:65
msgid "Can send me private mail messages"
msgstr "Se me pueden enviar mensajes privados"
-#: ../../Zotlabs/Access/Permissions.php:59
+#: ../../Zotlabs/Access/Permissions.php:66
msgid "Can like/dislike profiles and profile things"
msgstr "Se puede mostrar agrado o desagrado (Me gusta / No me gusta) en mis perfiles y sus distintos apartados"
-#: ../../Zotlabs/Access/Permissions.php:60
+#: ../../Zotlabs/Access/Permissions.php:67
msgid "Can forward to all my channel connections via @+ mentions in posts"
msgstr "Pueden reenviarse publicaciones a todas las conexiones de mi canal a través de @+ menciones en las entradas"
-#: ../../Zotlabs/Access/Permissions.php:61
+#: ../../Zotlabs/Access/Permissions.php:68
msgid "Can chat with me"
msgstr "Se puede chatear conmigo"
-#: ../../Zotlabs/Access/Permissions.php:62 ../../include/permissions.php:53
+#: ../../Zotlabs/Access/Permissions.php:69
msgid "Can source my public posts in derived channels"
msgstr "Pueden utilizarse mis entradas públicas como origen de contenidos en canales derivados"
-#: ../../Zotlabs/Access/Permissions.php:63
+#: ../../Zotlabs/Access/Permissions.php:70
msgid "Can administer my channel"
msgstr "Se puede administrar mi canal"
#: ../../Zotlabs/Access/PermissionRoles.php:248
-#: ../../include/permissions.php:946
msgid "Social Networking"
msgstr "Redes sociales"
#: ../../Zotlabs/Access/PermissionRoles.php:249
-#: ../../include/permissions.php:946
msgid "Social - Mostly Public"
msgstr "Social - Público en su mayor parte"
#: ../../Zotlabs/Access/PermissionRoles.php:250
-#: ../../include/permissions.php:946
msgid "Social - Restricted"
msgstr "Social - Restringido"
#: ../../Zotlabs/Access/PermissionRoles.php:251
-#: ../../include/permissions.php:946
msgid "Social - Private"
msgstr "Social - Privado"
#: ../../Zotlabs/Access/PermissionRoles.php:254
-#: ../../include/permissions.php:947
msgid "Community Forum"
msgstr "Foro de discusión"
#: ../../Zotlabs/Access/PermissionRoles.php:255
-#: ../../include/permissions.php:947
msgid "Forum - Mostly Public"
msgstr "Foro - Público en su mayor parte"
#: ../../Zotlabs/Access/PermissionRoles.php:256
-#: ../../include/permissions.php:947
msgid "Forum - Restricted"
msgstr "Foro - Restringido"
#: ../../Zotlabs/Access/PermissionRoles.php:257
-#: ../../include/permissions.php:947
msgid "Forum - Private"
msgstr "Foro - Privado"
#: ../../Zotlabs/Access/PermissionRoles.php:260
-#: ../../include/permissions.php:948
msgid "Feed Republish"
msgstr "Republicar un \"feed\""
#: ../../Zotlabs/Access/PermissionRoles.php:261
-#: ../../include/permissions.php:948
msgid "Feed - Mostly Public"
msgstr "Feed - Público en su mayor parte"
#: ../../Zotlabs/Access/PermissionRoles.php:262
-#: ../../include/permissions.php:948
msgid "Feed - Restricted"
msgstr "Feed - Restringido"
#: ../../Zotlabs/Access/PermissionRoles.php:265
-#: ../../include/permissions.php:949
msgid "Special Purpose"
msgstr "Propósito especial"
#: ../../Zotlabs/Access/PermissionRoles.php:266
-#: ../../include/permissions.php:949
msgid "Special - Celebrity/Soapbox"
msgstr "Especial - Celebridad / Tribuna improvisada"
#: ../../Zotlabs/Access/PermissionRoles.php:267
-#: ../../include/permissions.php:949
msgid "Special - Group Repository"
msgstr "Especial - Repositorio de grupo"
#: ../../Zotlabs/Access/PermissionRoles.php:270
-#: ../../Zotlabs/Module/New_channel.php:132
-#: ../../Zotlabs/Module/Settings/Channel.php:463
-#: ../../Zotlabs/Module/Connedit.php:914 ../../Zotlabs/Module/Profiles.php:798
-#: ../../Zotlabs/Module/Register.php:213 ../../addon/cdav/Mod_Cdav.php:1148
-#: ../../addon/cdav/cdav.php:277 ../../addon/cdav/cdav.php:284
-#: ../../include/selectors.php:49 ../../include/selectors.php:66
-#: ../../include/selectors.php:104 ../../include/selectors.php:140
-#: ../../include/permissions.php:950 ../../include/connections.php:675
-#: ../../include/connections.php:682
+#: ../../Zotlabs/Module/Cdav.php:1123 ../../Zotlabs/Module/New_channel.php:132
+#: ../../Zotlabs/Module/Settings/Channel.php:467
+#: ../../Zotlabs/Module/Connedit.php:932 ../../Zotlabs/Module/Profiles.php:798
+#: ../../Zotlabs/Module/Register.php:213 ../../include/selectors.php:49
+#: ../../include/selectors.php:66 ../../include/selectors.php:104
+#: ../../include/selectors.php:140 ../../include/event.php:1297
+#: ../../include/event.php:1304 ../../include/connections.php:681
+#: ../../include/connections.php:688
msgid "Other"
msgstr "Otro"
#: ../../Zotlabs/Access/PermissionRoles.php:271
-#: ../../include/permissions.php:950
msgid "Custom/Expert Mode"
msgstr "Modo personalizado/experto"
@@ -189,7 +173,7 @@ msgstr "Modo personalizado/experto"
#: ../../Zotlabs/Module/Editblock.php:31 ../../Zotlabs/Module/Profile.php:20
#: ../../Zotlabs/Module/Layouts.php:31 ../../Zotlabs/Module/Editwebpage.php:32
#: ../../Zotlabs/Module/Webpages.php:33
-#: ../../Zotlabs/Module/Filestorage.php:59 ../../include/channel.php:945
+#: ../../Zotlabs/Module/Filestorage.php:51 ../../include/channel.php:1062
msgid "Requested profile is not available."
msgstr "El perfil solicitado no está disponible."
@@ -203,41 +187,43 @@ msgstr "El perfil solicitado no está disponible."
#: ../../Zotlabs/Module/Appman.php:82 ../../Zotlabs/Module/Regmod.php:21
#: ../../Zotlabs/Module/New_channel.php:77
#: ../../Zotlabs/Module/New_channel.php:104
-#: ../../Zotlabs/Module/Sharedwithme.php:11 ../../Zotlabs/Module/Setup.php:212
+#: ../../Zotlabs/Module/Sharedwithme.php:16 ../../Zotlabs/Module/Setup.php:209
+#: ../../Zotlabs/Module/Moderate.php:13
#: ../../Zotlabs/Module/Achievements.php:34 ../../Zotlabs/Module/Thing.php:274
#: ../../Zotlabs/Module/Thing.php:294 ../../Zotlabs/Module/Thing.php:335
#: ../../Zotlabs/Module/Api.php:24 ../../Zotlabs/Module/Editblock.php:67
-#: ../../Zotlabs/Module/Profile.php:83 ../../Zotlabs/Module/Profile.php:100
+#: ../../Zotlabs/Module/Profile.php:85 ../../Zotlabs/Module/Profile.php:102
#: ../../Zotlabs/Module/Mood.php:116 ../../Zotlabs/Module/Connections.php:29
-#: ../../Zotlabs/Module/Viewsrc.php:19 ../../Zotlabs/Module/Bookmarks.php:61
+#: ../../Zotlabs/Module/Viewsrc.php:19 ../../Zotlabs/Module/Bookmarks.php:64
#: ../../Zotlabs/Module/Photos.php:69 ../../Zotlabs/Module/Wiki.php:50
-#: ../../Zotlabs/Module/Wiki.php:216 ../../Zotlabs/Module/Wiki.php:315
-#: ../../Zotlabs/Module/Pdledit.php:29 ../../Zotlabs/Module/Poke.php:137
+#: ../../Zotlabs/Module/Wiki.php:235 ../../Zotlabs/Module/Wiki.php:341
+#: ../../Zotlabs/Module/Pdledit.php:29 ../../Zotlabs/Module/Poke.php:149
#: ../../Zotlabs/Module/Profile_photo.php:280
#: ../../Zotlabs/Module/Profile_photo.php:293
-#: ../../Zotlabs/Module/Authtest.php:16 ../../Zotlabs/Module/Item.php:221
-#: ../../Zotlabs/Module/Item.php:231 ../../Zotlabs/Module/Item.php:1038
-#: ../../Zotlabs/Module/Page.php:35 ../../Zotlabs/Module/Page.php:91
-#: ../../Zotlabs/Module/Connedit.php:385 ../../Zotlabs/Module/Chat.php:98
-#: ../../Zotlabs/Module/Chat.php:103 ../../Zotlabs/Module/Menu.php:78
-#: ../../Zotlabs/Module/Layouts.php:71 ../../Zotlabs/Module/Layouts.php:78
-#: ../../Zotlabs/Module/Layouts.php:89 ../../Zotlabs/Module/Group.php:13
-#: ../../Zotlabs/Module/Profiles.php:198 ../../Zotlabs/Module/Profiles.php:635
+#: ../../Zotlabs/Module/Authtest.php:16 ../../Zotlabs/Module/Item.php:223
+#: ../../Zotlabs/Module/Item.php:240 ../../Zotlabs/Module/Item.php:250
+#: ../../Zotlabs/Module/Item.php:1076 ../../Zotlabs/Module/Page.php:34
+#: ../../Zotlabs/Module/Page.php:125 ../../Zotlabs/Module/Connedit.php:385
+#: ../../Zotlabs/Module/Chat.php:100 ../../Zotlabs/Module/Chat.php:105
+#: ../../Zotlabs/Module/Menu.php:78 ../../Zotlabs/Module/Layouts.php:71
+#: ../../Zotlabs/Module/Layouts.php:78 ../../Zotlabs/Module/Layouts.php:89
+#: ../../Zotlabs/Module/Group.php:13 ../../Zotlabs/Module/Profiles.php:198
+#: ../../Zotlabs/Module/Profiles.php:635
#: ../../Zotlabs/Module/Editwebpage.php:68
#: ../../Zotlabs/Module/Editwebpage.php:89
#: ../../Zotlabs/Module/Editwebpage.php:107
#: ../../Zotlabs/Module/Editwebpage.php:121 ../../Zotlabs/Module/Manage.php:10
-#: ../../Zotlabs/Module/Webpages.php:116 ../../Zotlabs/Module/Block.php:26
-#: ../../Zotlabs/Module/Block.php:76 ../../Zotlabs/Module/Editpost.php:17
+#: ../../Zotlabs/Module/Webpages.php:118 ../../Zotlabs/Module/Block.php:24
+#: ../../Zotlabs/Module/Block.php:74 ../../Zotlabs/Module/Editpost.php:17
#: ../../Zotlabs/Module/Sources.php:74 ../../Zotlabs/Module/Like.php:181
#: ../../Zotlabs/Module/Suggest.php:28 ../../Zotlabs/Module/Message.php:18
-#: ../../Zotlabs/Module/Mail.php:164 ../../Zotlabs/Module/Register.php:77
+#: ../../Zotlabs/Module/Mail.php:146 ../../Zotlabs/Module/Register.php:77
#: ../../Zotlabs/Module/Cover_photo.php:281
#: ../../Zotlabs/Module/Cover_photo.php:294
-#: ../../Zotlabs/Module/Network.php:15 ../../Zotlabs/Module/Filestorage.php:23
-#: ../../Zotlabs/Module/Filestorage.php:78
-#: ../../Zotlabs/Module/Filestorage.php:93
-#: ../../Zotlabs/Module/Filestorage.php:120 ../../Zotlabs/Module/Common.php:39
+#: ../../Zotlabs/Module/Network.php:15 ../../Zotlabs/Module/Filestorage.php:15
+#: ../../Zotlabs/Module/Filestorage.php:70
+#: ../../Zotlabs/Module/Filestorage.php:85
+#: ../../Zotlabs/Module/Filestorage.php:112 ../../Zotlabs/Module/Common.php:39
#: ../../Zotlabs/Module/Viewconnections.php:28
#: ../../Zotlabs/Module/Viewconnections.php:33
#: ../../Zotlabs/Module/Service_limits.php:11
@@ -245,16 +231,14 @@ msgstr "El perfil solicitado no está disponible."
#: ../../Zotlabs/Lib/Chatroom.php:137 ../../Zotlabs/Web/WebServer.php:131
#: ../../addon/keepout/keepout.php:36 ../../addon/openid/Mod_Id.php:53
#: ../../addon/gitwiki/Mod_Gitwiki.php:196
-#: ../../addon/gitwiki/Mod_Gitwiki.php:292
-#: ../../addon/diaspora_reconnect/diaspora_reconnect.php:58
-#: ../../addon/pumpio/pumpio.php:40 ../../include/attach.php:144
-#: ../../include/attach.php:191 ../../include/attach.php:255
-#: ../../include/attach.php:269 ../../include/attach.php:276
-#: ../../include/attach.php:344 ../../include/attach.php:358
-#: ../../include/attach.php:365 ../../include/attach.php:442
-#: ../../include/attach.php:909 ../../include/attach.php:983
-#: ../../include/attach.php:1148 ../../include/items.php:3470
-#: ../../include/photos.php:27
+#: ../../addon/gitwiki/Mod_Gitwiki.php:292 ../../addon/pumpio/pumpio.php:40
+#: ../../include/attach.php:144 ../../include/attach.php:191
+#: ../../include/attach.php:255 ../../include/attach.php:269
+#: ../../include/attach.php:276 ../../include/attach.php:344
+#: ../../include/attach.php:358 ../../include/attach.php:365
+#: ../../include/attach.php:443 ../../include/attach.php:918
+#: ../../include/attach.php:992 ../../include/attach.php:1157
+#: ../../include/items.php:3440 ../../include/photos.php:28
msgid "Permission denied."
msgstr "Acceso denegado."
@@ -263,7 +247,7 @@ msgstr "Acceso denegado."
msgid "Block Name"
msgstr "Nombre del bloque"
-#: ../../Zotlabs/Module/Blocks.php:154 ../../include/text.php:2267
+#: ../../Zotlabs/Module/Blocks.php:154 ../../include/text.php:2280
msgid "Blocks"
msgstr "Bloques"
@@ -272,25 +256,22 @@ msgid "Block Title"
msgstr "Título del bloque"
#: ../../Zotlabs/Module/Blocks.php:157 ../../Zotlabs/Module/Menu.php:114
-#: ../../Zotlabs/Module/Layouts.php:191 ../../Zotlabs/Module/Webpages.php:256
-#: ../../include/page_widgets.php:47
+#: ../../Zotlabs/Module/Layouts.php:191 ../../Zotlabs/Module/Webpages.php:251
msgid "Created"
msgstr "Creado"
#: ../../Zotlabs/Module/Blocks.php:158 ../../Zotlabs/Module/Menu.php:115
-#: ../../Zotlabs/Module/Layouts.php:192 ../../Zotlabs/Module/Webpages.php:257
-#: ../../include/page_widgets.php:48
+#: ../../Zotlabs/Module/Layouts.php:192 ../../Zotlabs/Module/Webpages.php:252
msgid "Edited"
msgstr "Editado"
-#: ../../Zotlabs/Module/Blocks.php:159
+#: ../../Zotlabs/Module/Blocks.php:159 ../../Zotlabs/Module/Cdav.php:1126
#: ../../Zotlabs/Module/New_channel.php:147
-#: ../../Zotlabs/Module/Connedit.php:917 ../../Zotlabs/Module/Menu.php:118
+#: ../../Zotlabs/Module/Connedit.php:935 ../../Zotlabs/Module/Menu.php:118
#: ../../Zotlabs/Module/Layouts.php:185 ../../Zotlabs/Module/Profiles.php:801
-#: ../../Zotlabs/Module/Webpages.php:244 ../../Zotlabs/Storage/Browser.php:228
-#: ../../Zotlabs/Storage/Browser.php:332 ../../addon/cdav/Mod_Cdav.php:1151
-#: ../../addon/cdav/include/widgets.php:127
-#: ../../addon/cdav/include/widgets.php:164
+#: ../../Zotlabs/Module/Webpages.php:239 ../../Zotlabs/Storage/Browser.php:229
+#: ../../Zotlabs/Storage/Browser.php:335 ../../Zotlabs/Widget/Cdav.php:127
+#: ../../Zotlabs/Widget/Cdav.php:164
msgid "Create"
msgstr "Crear"
@@ -298,52 +279,49 @@ msgstr "Crear"
#: ../../Zotlabs/Module/Admin/Profs.php:154
#: ../../Zotlabs/Module/Settings/Oauth.php:149
#: ../../Zotlabs/Module/Thing.php:260 ../../Zotlabs/Module/Editblock.php:114
-#: ../../Zotlabs/Module/Connections.php:296
-#: ../../Zotlabs/Module/Connections.php:316 ../../Zotlabs/Module/Wiki.php:165
-#: ../../Zotlabs/Module/Wiki.php:275 ../../Zotlabs/Module/Menu.php:112
+#: ../../Zotlabs/Module/Connections.php:260
+#: ../../Zotlabs/Module/Connections.php:297
+#: ../../Zotlabs/Module/Connections.php:317 ../../Zotlabs/Module/Wiki.php:167
+#: ../../Zotlabs/Module/Wiki.php:300 ../../Zotlabs/Module/Menu.php:112
#: ../../Zotlabs/Module/Layouts.php:193
#: ../../Zotlabs/Module/Editwebpage.php:142
-#: ../../Zotlabs/Module/Webpages.php:245 ../../Zotlabs/Module/Editpost.php:80
-#: ../../Zotlabs/Lib/Apps.php:367 ../../Zotlabs/Lib/ThreadItem.php:107
-#: ../../Zotlabs/Storage/Browser.php:238
-#: ../../addon/cdav/include/widgets.php:125
-#: ../../addon/cdav/include/widgets.php:161
-#: ../../addon/gitwiki/Mod_Gitwiki.php:151
-#: ../../addon/gitwiki/Mod_Gitwiki.php:252 ../../include/channel.php:1044
-#: ../../include/channel.php:1048 ../../include/menu.php:113
-#: ../../include/page_widgets.php:9 ../../include/page_widgets.php:39
+#: ../../Zotlabs/Module/Webpages.php:240 ../../Zotlabs/Module/Editpost.php:85
+#: ../../Zotlabs/Lib/Apps.php:393 ../../Zotlabs/Lib/ThreadItem.php:107
+#: ../../Zotlabs/Storage/Browser.php:239 ../../Zotlabs/Widget/Cdav.php:125
+#: ../../Zotlabs/Widget/Cdav.php:161 ../../addon/gitwiki/Mod_Gitwiki.php:151
+#: ../../addon/gitwiki/Mod_Gitwiki.php:252 ../../include/channel.php:1161
+#: ../../include/channel.php:1165 ../../include/menu.php:113
msgid "Edit"
msgstr "Editar"
-#: ../../Zotlabs/Module/Blocks.php:161 ../../Zotlabs/Module/Photos.php:1042
-#: ../../Zotlabs/Module/Layouts.php:194 ../../Zotlabs/Module/Webpages.php:246
-#: ../../addon/cdav/include/widgets.php:123
-#: ../../include/conversation.php:1311
+#: ../../Zotlabs/Module/Blocks.php:161 ../../Zotlabs/Module/Photos.php:1044
+#: ../../Zotlabs/Module/Layouts.php:194 ../../Zotlabs/Module/Webpages.php:241
+#: ../../Zotlabs/Widget/Cdav.php:123 ../../include/conversation.php:1308
msgid "Share"
msgstr "Compartir"
#: ../../Zotlabs/Module/Blocks.php:162 ../../Zotlabs/Module/Editlayout.php:138
+#: ../../Zotlabs/Module/Cdav.php:838 ../../Zotlabs/Module/Cdav.php:1128
#: ../../Zotlabs/Module/Admin/Accounts.php:173
#: ../../Zotlabs/Module/Admin/Channels.php:149
#: ../../Zotlabs/Module/Admin/Profs.php:155
#: ../../Zotlabs/Module/Settings/Oauth.php:150
#: ../../Zotlabs/Module/Thing.php:261 ../../Zotlabs/Module/Editblock.php:139
-#: ../../Zotlabs/Module/Connections.php:267
-#: ../../Zotlabs/Module/Photos.php:1143 ../../Zotlabs/Module/Connedit.php:650
-#: ../../Zotlabs/Module/Connedit.php:919 ../../Zotlabs/Module/Group.php:177
+#: ../../Zotlabs/Module/Connections.php:268
+#: ../../Zotlabs/Module/Photos.php:1145 ../../Zotlabs/Module/Connedit.php:650
+#: ../../Zotlabs/Module/Connedit.php:937 ../../Zotlabs/Module/Group.php:179
#: ../../Zotlabs/Module/Profiles.php:803
#: ../../Zotlabs/Module/Editwebpage.php:167
-#: ../../Zotlabs/Module/Webpages.php:247 ../../Zotlabs/Lib/Apps.php:368
-#: ../../Zotlabs/Lib/ThreadItem.php:127 ../../Zotlabs/Storage/Browser.php:239
-#: ../../addon/cdav/Mod_Cdav.php:864 ../../addon/cdav/Mod_Cdav.php:1153
-#: ../../include/conversation.php:654
+#: ../../Zotlabs/Module/Webpages.php:242 ../../Zotlabs/Lib/Apps.php:394
+#: ../../Zotlabs/Lib/ThreadItem.php:127 ../../Zotlabs/Storage/Browser.php:240
+#: ../../include/conversation.php:649 ../../include/conversation.php:686
msgid "Delete"
msgstr "Eliminar"
#: ../../Zotlabs/Module/Blocks.php:166 ../../Zotlabs/Module/Events.php:694
-#: ../../Zotlabs/Module/Wiki.php:167 ../../Zotlabs/Module/Layouts.php:198
-#: ../../Zotlabs/Module/Webpages.php:251 ../../Zotlabs/Module/Pubsites.php:59
-#: ../../addon/gitwiki/Mod_Gitwiki.php:153 ../../include/page_widgets.php:42
+#: ../../Zotlabs/Module/Wiki.php:169 ../../Zotlabs/Module/Layouts.php:198
+#: ../../Zotlabs/Module/Webpages.php:246 ../../Zotlabs/Module/Pubsites.php:59
+#: ../../addon/gitwiki/Mod_Gitwiki.php:153
msgid "View"
msgstr "Ver"
@@ -376,52 +354,56 @@ msgid_plural "%d messages sent."
msgstr[0] "%d mensajes enviados."
msgstr[1] "%d mensajes enviados."
-#: ../../Zotlabs/Module/Invite.php:105
+#: ../../Zotlabs/Module/Invite.php:98 ../../Zotlabs/Lib/Apps.php:254
+msgid "Invite"
+msgstr "Invitar"
+
+#: ../../Zotlabs/Module/Invite.php:107
msgid "You have no more invitations available"
msgstr "No tiene más invitaciones disponibles"
-#: ../../Zotlabs/Module/Invite.php:136
+#: ../../Zotlabs/Module/Invite.php:138
msgid "Send invitations"
msgstr "Enviar invitaciones"
-#: ../../Zotlabs/Module/Invite.php:137
+#: ../../Zotlabs/Module/Invite.php:139
msgid "Enter email addresses, one per line:"
msgstr "Introduzca las direcciones de correo electrónico, una por línea:"
-#: ../../Zotlabs/Module/Invite.php:138 ../../Zotlabs/Module/Mail.php:303
+#: ../../Zotlabs/Module/Invite.php:140 ../../Zotlabs/Module/Mail.php:285
msgid "Your message:"
msgstr "Su mensaje:"
-#: ../../Zotlabs/Module/Invite.php:139
+#: ../../Zotlabs/Module/Invite.php:141
msgid "Please join my community on $Projectname."
msgstr "Por favor, únase a mi comunidad en $Projectname."
-#: ../../Zotlabs/Module/Invite.php:141
+#: ../../Zotlabs/Module/Invite.php:143
msgid "You will need to supply this invitation code:"
msgstr "Tendrá que suministrar este código de invitación:"
-#: ../../Zotlabs/Module/Invite.php:142
+#: ../../Zotlabs/Module/Invite.php:144
msgid ""
"1. Register at any $Projectname location (they are all inter-connected)"
msgstr "1. Regístrese en cualquier sitio de $Projectname (están todos interconectados)"
-#: ../../Zotlabs/Module/Invite.php:144
+#: ../../Zotlabs/Module/Invite.php:146
msgid "2. Enter my $Projectname network address into the site searchbar."
msgstr "2. Introduzca mi dirección $Projectname en la caja de búsqueda del sitio."
-#: ../../Zotlabs/Module/Invite.php:145
+#: ../../Zotlabs/Module/Invite.php:147
msgid "or visit"
msgstr "o visitar"
-#: ../../Zotlabs/Module/Invite.php:147
+#: ../../Zotlabs/Module/Invite.php:149
msgid "3. Click [Connect]"
msgstr "3. Pulse [conectar]"
-#: ../../Zotlabs/Module/Invite.php:149 ../../Zotlabs/Module/Locs.php:121
+#: ../../Zotlabs/Module/Invite.php:151 ../../Zotlabs/Module/Locs.php:121
#: ../../Zotlabs/Module/Mitem.php:243 ../../Zotlabs/Module/Events.php:493
-#: ../../Zotlabs/Module/Appman.php:134
+#: ../../Zotlabs/Module/Appman.php:148
#: ../../Zotlabs/Module/Import_items.php:129
-#: ../../Zotlabs/Module/Setup.php:309 ../../Zotlabs/Module/Setup.php:357
+#: ../../Zotlabs/Module/Setup.php:308 ../../Zotlabs/Module/Setup.php:349
#: ../../Zotlabs/Module/Connect.php:98
#: ../../Zotlabs/Module/Admin/Features.php:66
#: ../../Zotlabs/Module/Admin/Plugins.php:438
@@ -429,35 +411,35 @@ msgstr "3. Pulse [conectar]"
#: ../../Zotlabs/Module/Admin/Logs.php:84
#: ../../Zotlabs/Module/Admin/Channels.php:147
#: ../../Zotlabs/Module/Admin/Themes.php:158
-#: ../../Zotlabs/Module/Admin/Site.php:279
+#: ../../Zotlabs/Module/Admin/Site.php:271
#: ../../Zotlabs/Module/Admin/Profs.php:157
#: ../../Zotlabs/Module/Admin/Account_edit.php:74
#: ../../Zotlabs/Module/Admin/Security.php:104
#: ../../Zotlabs/Module/Settings/Permcats.php:110
-#: ../../Zotlabs/Module/Settings/Channel.php:476
+#: ../../Zotlabs/Module/Settings/Channel.php:480
#: ../../Zotlabs/Module/Settings/Features.php:47
#: ../../Zotlabs/Module/Settings/Tokens.php:168
#: ../../Zotlabs/Module/Settings/Account.php:118
-#: ../../Zotlabs/Module/Settings/Featured.php:50
+#: ../../Zotlabs/Module/Settings/Featured.php:52
#: ../../Zotlabs/Module/Settings/Display.php:203
#: ../../Zotlabs/Module/Settings/Oauth.php:87
#: ../../Zotlabs/Module/Thing.php:320 ../../Zotlabs/Module/Thing.php:370
-#: ../../Zotlabs/Module/Import.php:514 ../../Zotlabs/Module/Cal.php:343
-#: ../../Zotlabs/Module/Mood.php:139 ../../Zotlabs/Module/Photos.php:657
-#: ../../Zotlabs/Module/Photos.php:1022 ../../Zotlabs/Module/Photos.php:1062
-#: ../../Zotlabs/Module/Photos.php:1180 ../../Zotlabs/Module/Wiki.php:169
-#: ../../Zotlabs/Module/Pdledit.php:74 ../../Zotlabs/Module/Poke.php:186
-#: ../../Zotlabs/Module/Connedit.php:882 ../../Zotlabs/Module/Chat.php:194
-#: ../../Zotlabs/Module/Chat.php:240 ../../Zotlabs/Module/Pconfig.php:107
-#: ../../Zotlabs/Module/Group.php:85 ../../Zotlabs/Module/Profiles.php:726
+#: ../../Zotlabs/Module/Import.php:518 ../../Zotlabs/Module/Cal.php:343
+#: ../../Zotlabs/Module/Mood.php:139 ../../Zotlabs/Module/Photos.php:659
+#: ../../Zotlabs/Module/Photos.php:1024 ../../Zotlabs/Module/Photos.php:1064
+#: ../../Zotlabs/Module/Photos.php:1182 ../../Zotlabs/Module/Wiki.php:171
+#: ../../Zotlabs/Module/Pdledit.php:74 ../../Zotlabs/Module/Poke.php:200
+#: ../../Zotlabs/Module/Connedit.php:900 ../../Zotlabs/Module/Chat.php:196
+#: ../../Zotlabs/Module/Chat.php:242 ../../Zotlabs/Module/Pconfig.php:107
+#: ../../Zotlabs/Module/Group.php:87 ../../Zotlabs/Module/Profiles.php:726
#: ../../Zotlabs/Module/Sources.php:114 ../../Zotlabs/Module/Sources.php:149
-#: ../../Zotlabs/Module/Xchan.php:15 ../../Zotlabs/Module/Mail.php:449
-#: ../../Zotlabs/Module/Filestorage.php:165 ../../Zotlabs/Module/Rate.php:166
-#: ../../Zotlabs/Lib/ThreadItem.php:732
+#: ../../Zotlabs/Module/Xchan.php:15 ../../Zotlabs/Module/Mail.php:431
+#: ../../Zotlabs/Module/Filestorage.php:155 ../../Zotlabs/Module/Rate.php:166
+#: ../../Zotlabs/Lib/ThreadItem.php:730
#: ../../Zotlabs/Widget/Eventstools.php:16
-#: ../../view/theme/redbasic/php/config.php:84
-#: ../../addon/skeleton/skeleton.php:65 ../../addon/gnusoc/gnusoc.php:134
-#: ../../addon/cdav/cdav.php:246 ../../addon/planets/planets.php:157
+#: ../../view/theme/redbasic/php/config.php:95
+#: ../../addon/skeleton/skeleton.php:65 ../../addon/gnusoc/gnusoc.php:226
+#: ../../addon/planets/planets.php:153
#: ../../addon/openclipatar/openclipatar.php:53
#: ../../addon/wppost/wppost.php:113 ../../addon/nsfw/nsfw.php:92
#: ../../addon/ijpost/ijpost.php:89 ../../addon/dwpost/dwpost.php:89
@@ -465,7 +447,7 @@ msgstr "3. Pulse [conectar]"
#: ../../addon/likebanner/likebanner.php:57
#: ../../addon/redphotos/redphotos.php:136 ../../addon/irc/irc.php:53
#: ../../addon/ljpost/ljpost.php:86 ../../addon/startpage/startpage.php:113
-#: ../../addon/diaspora/diaspora.php:712
+#: ../../addon/diaspora/diaspora.php:759
#: ../../addon/gitwiki/Mod_Gitwiki.php:155
#: ../../addon/rainbowtag/rainbowtag.php:85 ../../addon/visage/visage.php:170
#: ../../addon/nsabait/nsabait.php:161 ../../addon/mailtest/mailtest.php:100
@@ -481,11 +463,11 @@ msgstr "3. Pulse [conectar]"
#: ../../addon/statusnet/statusnet.php:432
#: ../../addon/statusnet/statusnet.php:899 ../../addon/twitter/twitter.php:217
#: ../../addon/twitter/twitter.php:259
-#: ../../addon/smileybutton/smileybutton.php:281
+#: ../../addon/smileybutton/smileybutton.php:219
#: ../../addon/piwik/piwik.php:95 ../../addon/pageheader/pageheader.php:48
-#: ../../addon/xmpp/xmpp.php:69 ../../addon/pumpio/pumpio.php:237
-#: ../../addon/redfiles/redfiles.php:124 ../../addon/hubwall/hubwall.php:95
-#: ../../include/js_strings.php:22
+#: ../../addon/authchoose/authchoose.php:71 ../../addon/xmpp/xmpp.php:69
+#: ../../addon/pumpio/pumpio.php:237 ../../addon/redfiles/redfiles.php:124
+#: ../../addon/hubwall/hubwall.php:95 ../../include/js_strings.php:22
msgid "Submit"
msgstr "Enviar"
@@ -511,12 +493,12 @@ msgid "Edit Layout"
msgstr "Modificar la plantilla"
#: ../../Zotlabs/Module/Profperm.php:28 ../../Zotlabs/Module/Subthread.php:62
-#: ../../Zotlabs/Module/Import_items.php:120 ../../Zotlabs/Module/Group.php:72
+#: ../../Zotlabs/Module/Import_items.php:120 ../../Zotlabs/Module/Group.php:74
#: ../../Zotlabs/Module/Dreport.php:10 ../../Zotlabs/Module/Dreport.php:68
#: ../../Zotlabs/Module/Like.php:283 ../../Zotlabs/Web/WebServer.php:130
#: ../../addon/redphotos/redphotos.php:119
#: ../../addon/frphotos/frphotos.php:81 ../../addon/redfiles/redfiles.php:109
-#: ../../include/items.php:327
+#: ../../include/items.php:340
msgid "Permission denied"
msgstr "Permiso denegado"
@@ -528,7 +510,7 @@ msgstr "Identificador del perfil no válido"
msgid "Profile Visibility Editor"
msgstr "Editor de visibilidad del perfil"
-#: ../../Zotlabs/Module/Profperm.php:113 ../../include/channel.php:1362
+#: ../../Zotlabs/Module/Profperm.php:113 ../../include/channel.php:1485
msgid "Profile"
msgstr "Perfil"
@@ -541,10 +523,291 @@ msgid "Visible To"
msgstr "Visible para"
#: ../../Zotlabs/Module/Profperm.php:140
-#: ../../Zotlabs/Module/Connections.php:141
+#: ../../Zotlabs/Module/Connections.php:140
msgid "All Connections"
msgstr "Todas las conexiones"
+#: ../../Zotlabs/Module/Cdav.php:726
+msgid "INVALID EVENT DISMISSED!"
+msgstr "¡EVENTO NO VÁLIDO RECHAZADO!"
+
+#: ../../Zotlabs/Module/Cdav.php:727
+msgid "Summary: "
+msgstr "Resumen: "
+
+#: ../../Zotlabs/Module/Cdav.php:727 ../../Zotlabs/Module/Cdav.php:728
+#: ../../Zotlabs/Module/Cdav.php:735 ../../Zotlabs/Module/Embedphotos.php:146
+#: ../../Zotlabs/Module/Photos.php:759 ../../Zotlabs/Module/Photos.php:1215
+#: ../../Zotlabs/Lib/Apps.php:721 ../../Zotlabs/Lib/Apps.php:799
+#: ../../Zotlabs/Storage/Browser.php:164 ../../Zotlabs/Widget/Portfolio.php:86
+#: ../../Zotlabs/Widget/Album.php:84 ../../include/conversation.php:1107
+msgid "Unknown"
+msgstr "Desconocido"
+
+#: ../../Zotlabs/Module/Cdav.php:728
+msgid "Date: "
+msgstr "Fecha: "
+
+#: ../../Zotlabs/Module/Cdav.php:729 ../../Zotlabs/Module/Cdav.php:736
+msgid "Reason: "
+msgstr "Razón: "
+
+#: ../../Zotlabs/Module/Cdav.php:734
+msgid "INVALID CARD DISMISSED!"
+msgstr "¡TARJETA NO VÁLIDA RECHAZADA!"
+
+#: ../../Zotlabs/Module/Cdav.php:735
+msgid "Name: "
+msgstr "Nombre: "
+
+#: ../../Zotlabs/Module/Cdav.php:768
+msgid "CalDAV"
+msgstr "CalDAV"
+
+#: ../../Zotlabs/Module/Cdav.php:809 ../../Zotlabs/Module/Events.php:460
+msgid "Event title"
+msgstr "Título del evento"
+
+#: ../../Zotlabs/Module/Cdav.php:810 ../../Zotlabs/Module/Events.php:466
+msgid "Start date and time"
+msgstr "Fecha y hora de comienzo"
+
+#: ../../Zotlabs/Module/Cdav.php:810 ../../Zotlabs/Module/Cdav.php:811
+msgid "Example: YYYY-MM-DD HH:mm"
+msgstr "Ejemplo: YYYY-MM-DD HH:mm"
+
+#: ../../Zotlabs/Module/Cdav.php:811
+msgid "End date and time"
+msgstr "Fecha y hora de finalización"
+
+#: ../../Zotlabs/Module/Cdav.php:812 ../../Zotlabs/Module/Events.php:473
+#: ../../Zotlabs/Module/Appman.php:138 ../../Zotlabs/Module/Rbmark.php:101
+#: ../../addon/rendezvous/rendezvous.php:173
+msgid "Description"
+msgstr "Descripción"
+
+#: ../../Zotlabs/Module/Cdav.php:813 ../../Zotlabs/Module/Locs.php:117
+#: ../../Zotlabs/Module/Events.php:475 ../../Zotlabs/Module/Profiles.php:509
+#: ../../Zotlabs/Module/Profiles.php:737 ../../Zotlabs/Module/Pubsites.php:51
+#: ../../include/js_strings.php:25
+msgid "Location"
+msgstr "Ubicación"
+
+#: ../../Zotlabs/Module/Cdav.php:820 ../../Zotlabs/Module/Events.php:689
+#: ../../Zotlabs/Module/Events.php:698 ../../Zotlabs/Module/Cal.php:337
+#: ../../Zotlabs/Module/Cal.php:344 ../../Zotlabs/Module/Photos.php:913
+msgid "Previous"
+msgstr "Anterior"
+
+#: ../../Zotlabs/Module/Cdav.php:821 ../../Zotlabs/Module/Events.php:690
+#: ../../Zotlabs/Module/Events.php:699 ../../Zotlabs/Module/Setup.php:263
+#: ../../Zotlabs/Module/Cal.php:338 ../../Zotlabs/Module/Cal.php:345
+#: ../../Zotlabs/Module/Photos.php:922
+msgid "Next"
+msgstr "Siguiente"
+
+#: ../../Zotlabs/Module/Cdav.php:822 ../../Zotlabs/Module/Events.php:700
+#: ../../Zotlabs/Module/Cal.php:346
+msgid "Today"
+msgstr "Hoy"
+
+#: ../../Zotlabs/Module/Cdav.php:823 ../../Zotlabs/Module/Events.php:695
+msgid "Month"
+msgstr "Mes"
+
+#: ../../Zotlabs/Module/Cdav.php:824 ../../Zotlabs/Module/Events.php:696
+msgid "Week"
+msgstr "Semana"
+
+#: ../../Zotlabs/Module/Cdav.php:825 ../../Zotlabs/Module/Events.php:697
+msgid "Day"
+msgstr "Día"
+
+#: ../../Zotlabs/Module/Cdav.php:826
+msgid "List month"
+msgstr "Lista mensual"
+
+#: ../../Zotlabs/Module/Cdav.php:827
+msgid "List week"
+msgstr "Lista semanal"
+
+#: ../../Zotlabs/Module/Cdav.php:828
+msgid "List day"
+msgstr "Lista diaria"
+
+#: ../../Zotlabs/Module/Cdav.php:835
+msgid "More"
+msgstr "Más"
+
+#: ../../Zotlabs/Module/Cdav.php:836
+msgid "Less"
+msgstr "Menos"
+
+#: ../../Zotlabs/Module/Cdav.php:837
+msgid "Select calendar"
+msgstr "Seleccionar un calendario"
+
+#: ../../Zotlabs/Module/Cdav.php:839
+msgid "Delete all"
+msgstr "Eliminar todos"
+
+#: ../../Zotlabs/Module/Cdav.php:840 ../../Zotlabs/Module/Cdav.php:1129
+#: ../../Zotlabs/Module/Admin/Plugins.php:423
+#: ../../Zotlabs/Module/Settings/Oauth.php:88
+#: ../../Zotlabs/Module/Settings/Oauth.php:114
+#: ../../Zotlabs/Module/Wiki.php:290 ../../Zotlabs/Module/Wiki.php:316
+#: ../../Zotlabs/Module/Connedit.php:938 ../../Zotlabs/Module/Fbrowser.php:66
+#: ../../Zotlabs/Module/Fbrowser.php:88 ../../Zotlabs/Module/Profiles.php:804
+#: ../../Zotlabs/Module/Filer.php:55 ../../Zotlabs/Module/Tagrm.php:15
+#: ../../Zotlabs/Module/Tagrm.php:138 ../../addon/js_upload/js_upload.php:46
+#: ../../addon/gitwiki/Mod_Gitwiki.php:244
+#: ../../addon/gitwiki/Mod_Gitwiki.php:267 ../../include/conversation.php:1324
+#: ../../include/conversation.php:1373
+msgid "Cancel"
+msgstr "Cancelar"
+
+#: ../../Zotlabs/Module/Cdav.php:841
+msgid "Sorry! Editing of recurrent events is not yet implemented."
+msgstr "¡Disculpas! La edición de eventos recurrentes aún no se ha implementado."
+
+#: ../../Zotlabs/Module/Cdav.php:969
+msgid "CardDAV"
+msgstr "CardDAV"
+
+#: ../../Zotlabs/Module/Cdav.php:1111
+#: ../../Zotlabs/Module/Sharedwithme.php:105
+#: ../../Zotlabs/Module/Admin/Channels.php:159
+#: ../../Zotlabs/Module/Settings/Oauth.php:89
+#: ../../Zotlabs/Module/Settings/Oauth.php:115
+#: ../../Zotlabs/Module/Wiki.php:174 ../../Zotlabs/Module/Connedit.php:920
+#: ../../Zotlabs/Module/Chat.php:251 ../../Zotlabs/Lib/NativeWikiPage.php:539
+#: ../../Zotlabs/Storage/Browser.php:234
+#: ../../Zotlabs/Widget/Wiki_page_history.php:22
+#: ../../addon/rendezvous/rendezvous.php:172
+#: ../../addon/gitwiki/Mod_Gitwiki.php:158
+msgid "Name"
+msgstr "Nombre"
+
+#: ../../Zotlabs/Module/Cdav.php:1112 ../../Zotlabs/Module/Connedit.php:921
+msgid "Organisation"
+msgstr "Organización"
+
+#: ../../Zotlabs/Module/Cdav.php:1113 ../../Zotlabs/Module/Connedit.php:922
+msgid "Title"
+msgstr "Título"
+
+#: ../../Zotlabs/Module/Cdav.php:1114 ../../Zotlabs/Module/Connedit.php:923
+#: ../../Zotlabs/Module/Profiles.php:789
+msgid "Phone"
+msgstr "Teléfono"
+
+#: ../../Zotlabs/Module/Cdav.php:1115
+#: ../../Zotlabs/Module/Admin/Accounts.php:169
+#: ../../Zotlabs/Module/Admin/Accounts.php:181
+#: ../../Zotlabs/Module/Connedit.php:924 ../../Zotlabs/Module/Profiles.php:790
+#: ../../addon/openid/MysqlProvider.php:56
+#: ../../addon/openid/MysqlProvider.php:57 ../../addon/rtof/rtof.php:93
+#: ../../addon/redred/redred.php:107 ../../include/network.php:1697
+msgid "Email"
+msgstr "Correo electrónico"
+
+#: ../../Zotlabs/Module/Cdav.php:1116 ../../Zotlabs/Module/Connedit.php:925
+#: ../../Zotlabs/Module/Profiles.php:791
+msgid "Instant messenger"
+msgstr "Mensajería instantánea"
+
+#: ../../Zotlabs/Module/Cdav.php:1117 ../../Zotlabs/Module/Connedit.php:926
+#: ../../Zotlabs/Module/Profiles.php:792
+msgid "Website"
+msgstr "Sitio web"
+
+#: ../../Zotlabs/Module/Cdav.php:1118 ../../Zotlabs/Module/Locs.php:118
+#: ../../Zotlabs/Module/Admin/Channels.php:160
+#: ../../Zotlabs/Module/Connedit.php:927 ../../Zotlabs/Module/Profiles.php:502
+#: ../../Zotlabs/Module/Profiles.php:793
+msgid "Address"
+msgstr "Dirección"
+
+#: ../../Zotlabs/Module/Cdav.php:1119 ../../Zotlabs/Module/Connedit.php:928
+#: ../../Zotlabs/Module/Profiles.php:794
+msgid "Note"
+msgstr "Nota"
+
+#: ../../Zotlabs/Module/Cdav.php:1120 ../../Zotlabs/Module/Connedit.php:929
+#: ../../Zotlabs/Module/Profiles.php:795 ../../include/event.php:1290
+#: ../../include/connections.php:674
+msgid "Mobile"
+msgstr "Móvil"
+
+#: ../../Zotlabs/Module/Cdav.php:1121 ../../Zotlabs/Module/Connedit.php:930
+#: ../../Zotlabs/Module/Profiles.php:796 ../../include/event.php:1291
+#: ../../include/connections.php:675
+msgid "Home"
+msgstr "Inicio"
+
+#: ../../Zotlabs/Module/Cdav.php:1122 ../../Zotlabs/Module/Connedit.php:931
+#: ../../Zotlabs/Module/Profiles.php:797 ../../include/event.php:1294
+#: ../../include/connections.php:678
+msgid "Work"
+msgstr "Trabajo"
+
+#: ../../Zotlabs/Module/Cdav.php:1124 ../../Zotlabs/Module/Connedit.php:933
+#: ../../Zotlabs/Module/Profiles.php:799
+#: ../../addon/jappixmini/jappixmini.php:368
+msgid "Add Contact"
+msgstr "Añadir un contacto"
+
+#: ../../Zotlabs/Module/Cdav.php:1125 ../../Zotlabs/Module/Connedit.php:934
+#: ../../Zotlabs/Module/Profiles.php:800
+msgid "Add Field"
+msgstr "Añadir un campo"
+
+#: ../../Zotlabs/Module/Cdav.php:1127
+#: ../../Zotlabs/Module/Admin/Plugins.php:453
+#: ../../Zotlabs/Module/Settings/Oauth.php:42
+#: ../../Zotlabs/Module/Settings/Oauth.php:113
+#: ../../Zotlabs/Module/Connedit.php:936 ../../Zotlabs/Module/Profiles.php:802
+#: ../../Zotlabs/Lib/Apps.php:384
+msgid "Update"
+msgstr "Actualizar"
+
+#: ../../Zotlabs/Module/Cdav.php:1130 ../../Zotlabs/Module/Connedit.php:939
+msgid "P.O. Box"
+msgstr "Buzón de correos"
+
+#: ../../Zotlabs/Module/Cdav.php:1131 ../../Zotlabs/Module/Connedit.php:940
+msgid "Additional"
+msgstr "Adicional"
+
+#: ../../Zotlabs/Module/Cdav.php:1132 ../../Zotlabs/Module/Connedit.php:941
+msgid "Street"
+msgstr "Calle"
+
+#: ../../Zotlabs/Module/Cdav.php:1133 ../../Zotlabs/Module/Connedit.php:942
+msgid "Locality"
+msgstr "Localidad"
+
+#: ../../Zotlabs/Module/Cdav.php:1134 ../../Zotlabs/Module/Connedit.php:943
+msgid "Region"
+msgstr "Provincia, región o estado"
+
+#: ../../Zotlabs/Module/Cdav.php:1135 ../../Zotlabs/Module/Connedit.php:944
+msgid "ZIP Code"
+msgstr "Código postal"
+
+#: ../../Zotlabs/Module/Cdav.php:1136 ../../Zotlabs/Module/Connedit.php:945
+#: ../../Zotlabs/Module/Profiles.php:760
+msgid "Country"
+msgstr "País"
+
+#: ../../Zotlabs/Module/Cdav.php:1183
+msgid "Default Calendar"
+msgstr "Calendario por defecto"
+
+#: ../../Zotlabs/Module/Cdav.php:1193
+msgid "Default Addressbook"
+msgstr "Agenda de direcciones por defecto"
+
#: ../../Zotlabs/Module/Regdir.php:49 ../../Zotlabs/Module/Dirsearch.php:25
msgid "This site is not a directory server"
msgstr "Este sitio no es un servidor de directorio"
@@ -554,20 +817,30 @@ msgstr "Este sitio no es un servidor de directorio"
msgid "You must be logged in to see this page."
msgstr "Debe haber iniciado sesión para poder ver esta página."
-#: ../../Zotlabs/Module/Channel.php:47 ../../Zotlabs/Module/Hcard.php:35
-#: ../../Zotlabs/Module/Profile.php:43
+#: ../../Zotlabs/Module/Channel.php:47 ../../Zotlabs/Module/Hcard.php:37
+#: ../../Zotlabs/Module/Profile.php:45
msgid "Posts and comments"
msgstr "Publicaciones y comentarios"
-#: ../../Zotlabs/Module/Channel.php:54 ../../Zotlabs/Module/Hcard.php:42
-#: ../../Zotlabs/Module/Profile.php:50
+#: ../../Zotlabs/Module/Channel.php:54 ../../Zotlabs/Module/Hcard.php:44
+#: ../../Zotlabs/Module/Profile.php:52
msgid "Only posts"
msgstr "Solo publicaciones"
+#: ../../Zotlabs/Module/Channel.php:97 ../../Zotlabs/Lib/Apps.php:240
+#: ../../include/nav.php:175
+msgid "Channel Home"
+msgstr "Mi canal"
+
#: ../../Zotlabs/Module/Channel.php:112
msgid "Insufficient permissions. Request redirected to profile page."
msgstr "Permisos insuficientes. Petición redirigida a la página del perfil."
+#: ../../Zotlabs/Module/Lang.php:8 ../../Zotlabs/Lib/Apps.php:256
+#: ../../addon/openid/MysqlProvider.php:69
+msgid "Language"
+msgstr "Idioma"
+
#: ../../Zotlabs/Module/Uexport.php:57 ../../Zotlabs/Module/Uexport.php:58
msgid "Export Channel"
msgstr "Exportar el canal"
@@ -633,19 +906,20 @@ msgstr "Estos ficheros pueden ser importados o restaurados visitando <a href=\"%
msgid "Public access denied."
msgstr "Acceso público denegado."
-#: ../../Zotlabs/Module/Search.php:44 ../../Zotlabs/Module/Connections.php:312
-#: ../../Zotlabs/Lib/Apps.php:237 ../../Zotlabs/Widget/Sitesearch.php:31
-#: ../../include/text.php:1027 ../../include/text.php:1039
-#: ../../include/acl_selectors.php:213 ../../include/nav.php:164
+#: ../../Zotlabs/Module/Search.php:25 ../../Zotlabs/Module/Search.php:44
+#: ../../Zotlabs/Module/Connections.php:313 ../../Zotlabs/Lib/Apps.php:250
+#: ../../Zotlabs/Widget/Sitesearch.php:31 ../../include/text.php:1021
+#: ../../include/text.php:1033 ../../include/acl_selectors.php:213
+#: ../../include/nav.php:160
msgid "Search"
msgstr "Buscar"
-#: ../../Zotlabs/Module/Search.php:224
+#: ../../Zotlabs/Module/Search.php:225
#, php-format
msgid "Items tagged with: %s"
msgstr "elementos etiquetados con: %s"
-#: ../../Zotlabs/Module/Search.php:226
+#: ../../Zotlabs/Module/Search.php:227
#, php-format
msgid "Search results for: %s"
msgstr "Resultados de la búsqueda para: %s"
@@ -676,21 +950,7 @@ msgstr "No encontrada ninguna dirección."
msgid "Manage Channel Locations"
msgstr "Gestionar las direcciones del canal"
-#: ../../Zotlabs/Module/Locs.php:117 ../../Zotlabs/Module/Events.php:475
-#: ../../Zotlabs/Module/Profiles.php:509 ../../Zotlabs/Module/Profiles.php:737
-#: ../../Zotlabs/Module/Pubsites.php:51 ../../addon/cdav/Mod_Cdav.php:839
-#: ../../include/js_strings.php:25
-msgid "Location"
-msgstr "Ubicación"
-
-#: ../../Zotlabs/Module/Locs.php:118
-#: ../../Zotlabs/Module/Admin/Channels.php:160
-#: ../../Zotlabs/Module/Connedit.php:909 ../../Zotlabs/Module/Profiles.php:502
-#: ../../Zotlabs/Module/Profiles.php:793 ../../addon/cdav/Mod_Cdav.php:1143
-msgid "Address"
-msgstr "Dirección"
-
-#: ../../Zotlabs/Module/Locs.php:119
+#: ../../Zotlabs/Module/Locs.php:119 ../../Zotlabs/Module/Admin.php:111
msgid "Primary"
msgstr "Primario"
@@ -716,6 +976,15 @@ msgstr "Cuando sea posible, elimine una ubicación iniciando sesión en el sitio
msgid "Use this form to drop the location if the hub is no longer operating."
msgstr "Utilice este formulario para eliminar la dirección si el \"hub\" no está funcionando desde hace tiempo."
+#: ../../Zotlabs/Module/Apporder.php:34
+msgid "Change Order of Navigation Apps"
+msgstr "Cambiar el orden de las aplicaciones en la barra de navegación"
+
+#: ../../Zotlabs/Module/Apporder.php:35
+msgid ""
+"Use arrows to move the corresponding app up or down in the display list"
+msgstr "Utilizar las flechas para mover la aplicación correspondiente hacia arriba o hacia abajo en la lista de visualización"
+
#: ../../Zotlabs/Module/Mitem.php:28 ../../Zotlabs/Module/Menu.php:144
msgid "Menu not found."
msgstr "Menú no encontrado"
@@ -742,7 +1011,7 @@ msgid "Menu Item Permissions"
msgstr "Permisos del elemento del menú"
#: ../../Zotlabs/Module/Mitem.php:154 ../../Zotlabs/Module/Mitem.php:231
-#: ../../Zotlabs/Module/Settings/Channel.php:510
+#: ../../Zotlabs/Module/Settings/Channel.php:513
msgid "(click to open/close)"
msgstr "(pulsar para abrir o cerrar)"
@@ -766,18 +1035,19 @@ msgstr "Usar la autenticación mágica si está disponible"
#: ../../Zotlabs/Module/Mitem.php:240 ../../Zotlabs/Module/Mitem.php:241
#: ../../Zotlabs/Module/Events.php:470 ../../Zotlabs/Module/Events.php:471
#: ../../Zotlabs/Module/Removeme.php:63
-#: ../../Zotlabs/Module/Admin/Site.php:237
-#: ../../Zotlabs/Module/Settings/Channel.php:294
+#: ../../Zotlabs/Module/Admin/Site.php:235
+#: ../../Zotlabs/Module/Settings/Channel.php:298
#: ../../Zotlabs/Module/Settings/Display.php:103
-#: ../../Zotlabs/Module/Api.php:97 ../../Zotlabs/Module/Photos.php:642
-#: ../../Zotlabs/Module/Wiki.php:180 ../../Zotlabs/Module/Connedit.php:392
+#: ../../Zotlabs/Module/Api.php:97 ../../Zotlabs/Module/Photos.php:644
+#: ../../Zotlabs/Module/Wiki.php:182 ../../Zotlabs/Module/Connedit.php:392
#: ../../Zotlabs/Module/Connedit.php:775 ../../Zotlabs/Module/Menu.php:100
#: ../../Zotlabs/Module/Menu.php:157 ../../Zotlabs/Module/Profiles.php:681
-#: ../../Zotlabs/Module/Filestorage.php:160
-#: ../../Zotlabs/Module/Filestorage.php:168 ../../boot.php:1633
-#: ../../view/theme/redbasic/php/config.php:89
-#: ../../view/theme/redbasic/php/config.php:104 ../../addon/cdav/cdav.php:234
-#: ../../addon/planets/planets.php:153 ../../addon/wppost/wppost.php:82
+#: ../../Zotlabs/Module/Filestorage.php:150
+#: ../../Zotlabs/Module/Filestorage.php:158
+#: ../../Zotlabs/Storage/Browser.php:351 ../../boot.php:1605
+#: ../../view/theme/redbasic/php/config.php:100
+#: ../../view/theme/redbasic/php/config.php:115
+#: ../../addon/planets/planets.php:149 ../../addon/wppost/wppost.php:82
#: ../../addon/wppost/wppost.php:105 ../../addon/wppost/wppost.php:109
#: ../../addon/nsfw/nsfw.php:84 ../../addon/ijpost/ijpost.php:73
#: ../../addon/ijpost/ijpost.php:85 ../../addon/dwpost/dwpost.php:73
@@ -800,8 +1070,9 @@ msgstr "Usar la autenticación mágica si está disponible"
#: ../../addon/statusnet/statusnet.php:415
#: ../../addon/statusnet/statusnet.php:424 ../../addon/twitter/twitter.php:242
#: ../../addon/twitter/twitter.php:246 ../../addon/twitter/twitter.php:255
-#: ../../addon/smileybutton/smileybutton.php:273
-#: ../../addon/smileybutton/smileybutton.php:277 ../../addon/xmpp/xmpp.php:53
+#: ../../addon/smileybutton/smileybutton.php:211
+#: ../../addon/smileybutton/smileybutton.php:215
+#: ../../addon/authchoose/authchoose.php:67 ../../addon/xmpp/xmpp.php:53
#: ../../addon/pumpio/pumpio.php:219 ../../addon/pumpio/pumpio.php:223
#: ../../addon/pumpio/pumpio.php:227 ../../addon/pumpio/pumpio.php:231
#: ../../include/dir_fns.php:143 ../../include/dir_fns.php:144
@@ -813,18 +1084,19 @@ msgstr "No"
#: ../../Zotlabs/Module/Mitem.php:240 ../../Zotlabs/Module/Mitem.php:241
#: ../../Zotlabs/Module/Events.php:470 ../../Zotlabs/Module/Events.php:471
#: ../../Zotlabs/Module/Removeme.php:63
-#: ../../Zotlabs/Module/Admin/Site.php:239
-#: ../../Zotlabs/Module/Settings/Channel.php:294
+#: ../../Zotlabs/Module/Admin/Site.php:237
+#: ../../Zotlabs/Module/Settings/Channel.php:298
#: ../../Zotlabs/Module/Settings/Display.php:103
-#: ../../Zotlabs/Module/Api.php:96 ../../Zotlabs/Module/Photos.php:642
-#: ../../Zotlabs/Module/Wiki.php:180 ../../Zotlabs/Module/Connedit.php:392
+#: ../../Zotlabs/Module/Api.php:96 ../../Zotlabs/Module/Photos.php:644
+#: ../../Zotlabs/Module/Wiki.php:182 ../../Zotlabs/Module/Connedit.php:392
#: ../../Zotlabs/Module/Menu.php:100 ../../Zotlabs/Module/Menu.php:157
#: ../../Zotlabs/Module/Profiles.php:681
-#: ../../Zotlabs/Module/Filestorage.php:160
-#: ../../Zotlabs/Module/Filestorage.php:168 ../../boot.php:1633
-#: ../../view/theme/redbasic/php/config.php:89
-#: ../../view/theme/redbasic/php/config.php:104 ../../addon/cdav/cdav.php:234
-#: ../../addon/planets/planets.php:153 ../../addon/wppost/wppost.php:82
+#: ../../Zotlabs/Module/Filestorage.php:150
+#: ../../Zotlabs/Module/Filestorage.php:158
+#: ../../Zotlabs/Storage/Browser.php:351 ../../boot.php:1605
+#: ../../view/theme/redbasic/php/config.php:100
+#: ../../view/theme/redbasic/php/config.php:115
+#: ../../addon/planets/planets.php:149 ../../addon/wppost/wppost.php:82
#: ../../addon/wppost/wppost.php:105 ../../addon/wppost/wppost.php:109
#: ../../addon/nsfw/nsfw.php:84 ../../addon/ijpost/ijpost.php:73
#: ../../addon/ijpost/ijpost.php:85 ../../addon/dwpost/dwpost.php:73
@@ -847,8 +1119,9 @@ msgstr "No"
#: ../../addon/statusnet/statusnet.php:415
#: ../../addon/statusnet/statusnet.php:424 ../../addon/twitter/twitter.php:242
#: ../../addon/twitter/twitter.php:246 ../../addon/twitter/twitter.php:255
-#: ../../addon/smileybutton/smileybutton.php:273
-#: ../../addon/smileybutton/smileybutton.php:277 ../../addon/xmpp/xmpp.php:53
+#: ../../addon/smileybutton/smileybutton.php:211
+#: ../../addon/smileybutton/smileybutton.php:215
+#: ../../addon/authchoose/authchoose.php:67 ../../addon/xmpp/xmpp.php:53
#: ../../addon/pumpio/pumpio.php:219 ../../addon/pumpio/pumpio.php:223
#: ../../addon/pumpio/pumpio.php:227 ../../addon/pumpio/pumpio.php:231
#: ../../include/dir_fns.php:143 ../../include/dir_fns.php:144
@@ -963,20 +1236,23 @@ msgstr "Evento no encontrado."
#: ../../Zotlabs/Module/Events.php:260 ../../Zotlabs/Module/Tagger.php:51
#: ../../Zotlabs/Module/Like.php:372 ../../include/conversation.php:119
-#: ../../include/text.php:1940 ../../include/event.php:1141
+#: ../../include/text.php:1933 ../../include/event.php:1145
msgid "event"
msgstr "evento"
+#: ../../Zotlabs/Module/Events.php:275 ../../Zotlabs/Lib/Apps.php:243
+#: ../../include/conversation.php:1799 ../../include/conversation.php:1802
+#: ../../include/nav.php:195 ../../include/nav.php:397
+#: ../../include/nav.php:400
+msgid "Events"
+msgstr "Eventos"
+
#: ../../Zotlabs/Module/Events.php:460
msgid "Edit event title"
msgstr "Editar el título del evento"
-#: ../../Zotlabs/Module/Events.php:460 ../../addon/cdav/Mod_Cdav.php:835
-msgid "Event title"
-msgstr "Título del evento"
-
#: ../../Zotlabs/Module/Events.php:460 ../../Zotlabs/Module/Events.php:465
-#: ../../Zotlabs/Module/Appman.php:122 ../../Zotlabs/Module/Appman.php:123
+#: ../../Zotlabs/Module/Appman.php:136 ../../Zotlabs/Module/Appman.php:137
#: ../../Zotlabs/Module/Profiles.php:748 ../../Zotlabs/Module/Profiles.php:752
#: ../../include/datetime.php:259
msgid "Required"
@@ -998,10 +1274,6 @@ msgstr "Tema"
msgid "Edit start date and time"
msgstr "Modificar la fecha y hora de comienzo"
-#: ../../Zotlabs/Module/Events.php:466 ../../addon/cdav/Mod_Cdav.php:836
-msgid "Start date and time"
-msgstr "Fecha y hora de comienzo"
-
#: ../../Zotlabs/Module/Events.php:467 ../../Zotlabs/Module/Events.php:470
msgid "Finish date and time are not known or not relevant"
msgstr "La fecha y hora de terminación no se conocen o no son relevantes"
@@ -1028,23 +1300,17 @@ msgstr "Importante para los eventos que suceden en un lugar determinado. No es p
msgid "Edit Description"
msgstr "Editar la descripción"
-#: ../../Zotlabs/Module/Events.php:473 ../../Zotlabs/Module/Appman.php:124
-#: ../../Zotlabs/Module/Rbmark.php:101
-#: ../../addon/rendezvous/rendezvous.php:173 ../../addon/cdav/Mod_Cdav.php:838
-msgid "Description"
-msgstr "Descripción"
-
#: ../../Zotlabs/Module/Events.php:475
msgid "Edit Location"
msgstr "Modificar la dirección"
-#: ../../Zotlabs/Module/Events.php:478 ../../Zotlabs/Module/Photos.php:1063
-#: ../../Zotlabs/Module/Webpages.php:252 ../../Zotlabs/Lib/ThreadItem.php:741
-#: ../../include/conversation.php:1280 ../../include/page_widgets.php:43
+#: ../../Zotlabs/Module/Events.php:478 ../../Zotlabs/Module/Photos.php:1065
+#: ../../Zotlabs/Module/Webpages.php:247 ../../Zotlabs/Lib/ThreadItem.php:739
+#: ../../include/conversation.php:1277
msgid "Preview"
msgstr "Previsualizar"
-#: ../../Zotlabs/Module/Events.php:479 ../../include/conversation.php:1343
+#: ../../Zotlabs/Module/Events.php:479 ../../include/conversation.php:1340
msgid "Permission settings"
msgstr "Configuración de permisos"
@@ -1069,7 +1335,7 @@ msgid "Delete event"
msgstr "Borrar evento"
#: ../../Zotlabs/Module/Events.php:660 ../../Zotlabs/Module/Cal.php:313
-#: ../../include/text.php:1759
+#: ../../include/text.php:1752
msgid "Link to Source"
msgstr "Enlazar con la entrada en su ubicación original"
@@ -1085,41 +1351,11 @@ msgstr "Editar el evento"
msgid "Create Event"
msgstr "Crear un evento"
-#: ../../Zotlabs/Module/Events.php:689 ../../Zotlabs/Module/Events.php:698
-#: ../../Zotlabs/Module/Cal.php:337 ../../Zotlabs/Module/Cal.php:344
-#: ../../Zotlabs/Module/Photos.php:911 ../../addon/cdav/Mod_Cdav.php:846
-msgid "Previous"
-msgstr "Anterior"
-
-#: ../../Zotlabs/Module/Events.php:690 ../../Zotlabs/Module/Events.php:699
-#: ../../Zotlabs/Module/Setup.php:264 ../../Zotlabs/Module/Cal.php:338
-#: ../../Zotlabs/Module/Cal.php:345 ../../Zotlabs/Module/Photos.php:920
-#: ../../addon/cdav/Mod_Cdav.php:847
-msgid "Next"
-msgstr "Siguiente"
-
#: ../../Zotlabs/Module/Events.php:691 ../../Zotlabs/Module/Cal.php:339
-#: ../../include/channel.php:1365
+#: ../../include/channel.php:1488
msgid "Export"
msgstr "Exportar"
-#: ../../Zotlabs/Module/Events.php:695 ../../addon/cdav/Mod_Cdav.php:849
-msgid "Month"
-msgstr "Mes"
-
-#: ../../Zotlabs/Module/Events.php:696 ../../addon/cdav/Mod_Cdav.php:850
-msgid "Week"
-msgstr "Semana"
-
-#: ../../Zotlabs/Module/Events.php:697 ../../addon/cdav/Mod_Cdav.php:851
-msgid "Day"
-msgstr "Día"
-
-#: ../../Zotlabs/Module/Events.php:700 ../../Zotlabs/Module/Cal.php:346
-#: ../../addon/cdav/Mod_Cdav.php:848
-msgid "Today"
-msgstr "Hoy"
-
#: ../../Zotlabs/Module/Events.php:731
msgid "Event removed"
msgstr "Evento borrado"
@@ -1136,47 +1372,47 @@ msgstr "Aplicación instalada."
msgid "Malformed app."
msgstr "Aplicación con errores"
-#: ../../Zotlabs/Module/Appman.php:111
+#: ../../Zotlabs/Module/Appman.php:125
msgid "Embed code"
msgstr "Código incorporado"
-#: ../../Zotlabs/Module/Appman.php:117
+#: ../../Zotlabs/Module/Appman.php:131
msgid "Edit App"
msgstr "Modificar la aplicación"
-#: ../../Zotlabs/Module/Appman.php:117
+#: ../../Zotlabs/Module/Appman.php:131
msgid "Create App"
msgstr "Crear una aplicación"
-#: ../../Zotlabs/Module/Appman.php:122
+#: ../../Zotlabs/Module/Appman.php:136
msgid "Name of app"
msgstr "Nombre de la aplicación"
-#: ../../Zotlabs/Module/Appman.php:123
+#: ../../Zotlabs/Module/Appman.php:137
msgid "Location (URL) of app"
msgstr "Dirección (URL) de la aplicación"
-#: ../../Zotlabs/Module/Appman.php:125
+#: ../../Zotlabs/Module/Appman.php:139
msgid "Photo icon URL"
msgstr "Dirección del icono"
-#: ../../Zotlabs/Module/Appman.php:125
+#: ../../Zotlabs/Module/Appman.php:139
msgid "80 x 80 pixels - optional"
msgstr "80 x 80 pixels - opcional"
-#: ../../Zotlabs/Module/Appman.php:126
+#: ../../Zotlabs/Module/Appman.php:140
msgid "Categories (optional, comma separated list)"
msgstr "Temas (opcional, lista separada por comas)"
-#: ../../Zotlabs/Module/Appman.php:127
+#: ../../Zotlabs/Module/Appman.php:141
msgid "Version ID"
msgstr "Versión"
-#: ../../Zotlabs/Module/Appman.php:128
+#: ../../Zotlabs/Module/Appman.php:142
msgid "Price of app"
msgstr "Precio de la aplicación"
-#: ../../Zotlabs/Module/Appman.php:129
+#: ../../Zotlabs/Module/Appman.php:143
msgid "Location (URL) to purchase app"
msgstr "Dirección (URL) donde adquirir la aplicación"
@@ -1191,14 +1427,14 @@ msgstr "Servidor no encontrado"
#: ../../Zotlabs/Module/Subthread.php:87 ../../Zotlabs/Module/Tagger.php:47
#: ../../Zotlabs/Module/Like.php:370
#: ../../addon/redphotos/redphotohelper.php:71
-#: ../../addon/diaspora/inbound.php:1783 ../../include/conversation.php:116
-#: ../../include/text.php:1937
+#: ../../addon/diaspora/Receiver.php:1370 ../../include/conversation.php:116
+#: ../../include/text.php:1930
msgid "photo"
msgstr "foto"
#: ../../Zotlabs/Module/Subthread.php:87 ../../Zotlabs/Module/Like.php:370
-#: ../../addon/diaspora/inbound.php:1783 ../../include/conversation.php:144
-#: ../../include/text.php:1943
+#: ../../addon/diaspora/Receiver.php:1370 ../../include/conversation.php:144
+#: ../../include/text.php:1936
msgid "status"
msgstr "el mensaje de estado"
@@ -1246,12 +1482,12 @@ msgid ""
msgstr "Utilice este formulario para importar entradas existentes y contenido desde un archivo de exportación."
#: ../../Zotlabs/Module/Import_items.php:127
-#: ../../Zotlabs/Module/Import.php:501
+#: ../../Zotlabs/Module/Import.php:505
msgid "File to Upload"
msgstr "Fichero para subir"
#: ../../Zotlabs/Module/New_channel.php:121
-#: ../../Zotlabs/Module/Manage.php:136
+#: ../../Zotlabs/Module/Manage.php:138
#, php-format
msgid "You have created %1$.0f of %2$.0f allowed channels."
msgstr "Ha creado %1$.0f de %2$.0f canales permitidos."
@@ -1350,456 +1586,435 @@ msgid ""
msgstr "Por defecto, solo la instancia del canal alojado en este servidor será eliminado de la red"
#: ../../Zotlabs/Module/Removeme.php:64
-#: ../../Zotlabs/Module/Settings/Channel.php:575
+#: ../../Zotlabs/Module/Settings/Channel.php:580
msgid "Remove Channel"
msgstr "Eliminar el canal"
-#: ../../Zotlabs/Module/Sharedwithme.php:99
+#: ../../Zotlabs/Module/Sharedwithme.php:104
msgid "Files: shared with me"
msgstr "Ficheros: compartidos conmigo"
-#: ../../Zotlabs/Module/Sharedwithme.php:100
-#: ../../Zotlabs/Module/Admin/Channels.php:159
-#: ../../Zotlabs/Module/Settings/Oauth.php:89
-#: ../../Zotlabs/Module/Settings/Oauth.php:115
-#: ../../Zotlabs/Module/Wiki.php:172 ../../Zotlabs/Module/Connedit.php:902
-#: ../../Zotlabs/Module/Chat.php:249 ../../Zotlabs/Lib/NativeWikiPage.php:539
-#: ../../Zotlabs/Storage/Browser.php:233
-#: ../../Zotlabs/Widget/Wiki_page_history.php:22
-#: ../../addon/rendezvous/rendezvous.php:172
-#: ../../addon/cdav/Mod_Cdav.php:1136 ../../addon/gitwiki/Mod_Gitwiki.php:158
-msgid "Name"
-msgstr "Nombre"
-
-#: ../../Zotlabs/Module/Sharedwithme.php:101
+#: ../../Zotlabs/Module/Sharedwithme.php:106
msgid "NEW"
msgstr "NUEVO"
-#: ../../Zotlabs/Module/Sharedwithme.php:102
-#: ../../Zotlabs/Storage/Browser.php:235 ../../include/text.php:1409
+#: ../../Zotlabs/Module/Sharedwithme.php:107
+#: ../../Zotlabs/Storage/Browser.php:236 ../../include/text.php:1386
msgid "Size"
msgstr "Tamaño"
-#: ../../Zotlabs/Module/Sharedwithme.php:103
-#: ../../Zotlabs/Storage/Browser.php:236
+#: ../../Zotlabs/Module/Sharedwithme.php:108
+#: ../../Zotlabs/Storage/Browser.php:237
msgid "Last Modified"
msgstr "Última modificación"
-#: ../../Zotlabs/Module/Sharedwithme.php:104
+#: ../../Zotlabs/Module/Sharedwithme.php:109
msgid "Remove all files"
msgstr "Eliminar todos los ficheros"
-#: ../../Zotlabs/Module/Sharedwithme.php:105
+#: ../../Zotlabs/Module/Sharedwithme.php:110
msgid "Remove this file"
msgstr "Eliminar este fichero"
-#: ../../Zotlabs/Module/Setup.php:176
+#: ../../Zotlabs/Module/Setup.php:170
msgid "$Projectname Server - Setup"
msgstr "Servidor $Projectname - Instalación"
-#: ../../Zotlabs/Module/Setup.php:180
+#: ../../Zotlabs/Module/Setup.php:174
msgid "Could not connect to database."
msgstr "No se ha podido conectar a la base de datos."
-#: ../../Zotlabs/Module/Setup.php:184
+#: ../../Zotlabs/Module/Setup.php:178
msgid ""
"Could not connect to specified site URL. Possible SSL certificate or DNS "
"issue."
msgstr "No se puede conectar con la dirección del sitio indicada. Podría tratarse de un problema de SSL o DNS."
-#: ../../Zotlabs/Module/Setup.php:191
+#: ../../Zotlabs/Module/Setup.php:185
msgid "Could not create table."
msgstr "No se puede crear la tabla."
-#: ../../Zotlabs/Module/Setup.php:196
+#: ../../Zotlabs/Module/Setup.php:191
msgid "Your site database has been installed."
msgstr "La base de datos del sitio ha sido instalada."
-#: ../../Zotlabs/Module/Setup.php:200
+#: ../../Zotlabs/Module/Setup.php:197
msgid ""
"You may need to import the file \"install/schema_xxx.sql\" manually using a "
"database client."
msgstr "Podría tener que importar manualmente el fichero \"install/schema_xxx.sql\" usando un cliente de base de datos."
-#: ../../Zotlabs/Module/Setup.php:201 ../../Zotlabs/Module/Setup.php:263
-#: ../../Zotlabs/Module/Setup.php:748
+#: ../../Zotlabs/Module/Setup.php:198 ../../Zotlabs/Module/Setup.php:262
+#: ../../Zotlabs/Module/Setup.php:745
msgid "Please see the file \"install/INSTALL.txt\"."
msgstr "Por favor, lea el fichero \"install/INSTALL.txt\"."
-#: ../../Zotlabs/Module/Setup.php:260
+#: ../../Zotlabs/Module/Setup.php:259
msgid "System check"
msgstr "Verificación del sistema"
-#: ../../Zotlabs/Module/Setup.php:265
+#: ../../Zotlabs/Module/Setup.php:264
msgid "Check again"
msgstr "Verificar de nuevo"
-#: ../../Zotlabs/Module/Setup.php:287
+#: ../../Zotlabs/Module/Setup.php:286
msgid "Database connection"
msgstr "Conexión a la base de datos"
-#: ../../Zotlabs/Module/Setup.php:288
+#: ../../Zotlabs/Module/Setup.php:287
msgid ""
"In order to install $Projectname we need to know how to connect to your "
"database."
msgstr "Para instalar $Projectname es necesario saber cómo conectar con su base de datos."
-#: ../../Zotlabs/Module/Setup.php:289
+#: ../../Zotlabs/Module/Setup.php:288
msgid ""
"Please contact your hosting provider or site administrator if you have "
"questions about these settings."
msgstr "Por favor, contacte con el proveedor de servicios o el administrador del sitio si tiene dudas sobre estos ajustes."
-#: ../../Zotlabs/Module/Setup.php:290
+#: ../../Zotlabs/Module/Setup.php:289
msgid ""
"The database you specify below should already exist. If it does not, please "
"create it before continuing."
msgstr "La base de datos que especifique a continuación debe existir ya. Si no es así, por favor, créela antes de seguir."
-#: ../../Zotlabs/Module/Setup.php:294
+#: ../../Zotlabs/Module/Setup.php:293
msgid "Database Server Name"
msgstr "Nombre del servidor de base de datos"
-#: ../../Zotlabs/Module/Setup.php:294
+#: ../../Zotlabs/Module/Setup.php:293
msgid "Default is 127.0.0.1"
msgstr "De forma predeterminada es 127.0.0.1"
-#: ../../Zotlabs/Module/Setup.php:295
+#: ../../Zotlabs/Module/Setup.php:294
msgid "Database Port"
msgstr "Puerto de la base de datos"
-#: ../../Zotlabs/Module/Setup.php:295
+#: ../../Zotlabs/Module/Setup.php:294
msgid "Communication port number - use 0 for default"
msgstr "Número del puerto de comunicaciones - use 0 como valor por defecto"
-#: ../../Zotlabs/Module/Setup.php:296
+#: ../../Zotlabs/Module/Setup.php:295
msgid "Database Login Name"
msgstr "Usuario de la base de datos"
-#: ../../Zotlabs/Module/Setup.php:297
+#: ../../Zotlabs/Module/Setup.php:296
msgid "Database Login Password"
msgstr "Contraseña de acceso a la base de datos"
-#: ../../Zotlabs/Module/Setup.php:298
+#: ../../Zotlabs/Module/Setup.php:297
msgid "Database Name"
msgstr "Nombre de la base de datos"
-#: ../../Zotlabs/Module/Setup.php:299
+#: ../../Zotlabs/Module/Setup.php:298
msgid "Database Type"
msgstr "Tipo de base de datos"
-#: ../../Zotlabs/Module/Setup.php:301 ../../Zotlabs/Module/Setup.php:347
+#: ../../Zotlabs/Module/Setup.php:300 ../../Zotlabs/Module/Setup.php:341
msgid "Site administrator email address"
msgstr "Dirección de correo electrónico del administrador del sitio"
-#: ../../Zotlabs/Module/Setup.php:301 ../../Zotlabs/Module/Setup.php:347
+#: ../../Zotlabs/Module/Setup.php:300 ../../Zotlabs/Module/Setup.php:341
msgid ""
"Your account email address must match this in order to use the web admin "
"panel."
msgstr "Su cuenta deberá usar la misma dirección de correo electrónico para poder utilizar el panel de administración web."
-#: ../../Zotlabs/Module/Setup.php:302 ../../Zotlabs/Module/Setup.php:349
+#: ../../Zotlabs/Module/Setup.php:301 ../../Zotlabs/Module/Setup.php:343
msgid "Website URL"
msgstr "Dirección del sitio web"
-#: ../../Zotlabs/Module/Setup.php:302 ../../Zotlabs/Module/Setup.php:349
+#: ../../Zotlabs/Module/Setup.php:301 ../../Zotlabs/Module/Setup.php:343
msgid "Please use SSL (https) URL if available."
msgstr "Por favor, use SSL (https) si está disponible."
-#: ../../Zotlabs/Module/Setup.php:303 ../../Zotlabs/Module/Setup.php:353
+#: ../../Zotlabs/Module/Setup.php:302 ../../Zotlabs/Module/Setup.php:345
msgid "Please select a default timezone for your website"
msgstr "Por favor, selecciones el huso horario por defecto de su sitio web"
-#: ../../Zotlabs/Module/Setup.php:328 ../../Zotlabs/Module/Admin/Site.php:258
-msgid "Basic/Minimal Social Networking"
-msgstr "Red social básica o mínima"
-
-#: ../../Zotlabs/Module/Setup.php:329 ../../Zotlabs/Module/Admin/Site.php:259
-msgid "Standard Configuration (default)"
-msgstr "Configuración estándar (por defecto)"
-
-#: ../../Zotlabs/Module/Setup.php:330 ../../Zotlabs/Module/Admin/Site.php:260
-msgid "Professional"
-msgstr "Profesional"
-
-#: ../../Zotlabs/Module/Setup.php:336
+#: ../../Zotlabs/Module/Setup.php:330
msgid "Site settings"
msgstr "Ajustes del sitio"
-#: ../../Zotlabs/Module/Setup.php:351 ../../Zotlabs/Module/Admin/Site.php:289
-msgid "Server Configuration/Role"
-msgstr "Configuración del servidor"
-
-#: ../../Zotlabs/Module/Setup.php:392
+#: ../../Zotlabs/Module/Setup.php:384
msgid "PHP version 5.5 or greater is required."
msgstr "Se requiere la versión 5.5, o superior, de PHP."
-#: ../../Zotlabs/Module/Setup.php:393
+#: ../../Zotlabs/Module/Setup.php:385
msgid "PHP version"
msgstr "Versión de PHP"
-#: ../../Zotlabs/Module/Setup.php:409
+#: ../../Zotlabs/Module/Setup.php:401
msgid "Could not find a command line version of PHP in the web server PATH."
msgstr "No se puede encontrar una versión en línea de comandos de PHP en la ruta del servidor web."
-#: ../../Zotlabs/Module/Setup.php:410
+#: ../../Zotlabs/Module/Setup.php:402
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 "Si no tiene instalada la versión de línea de comandos de PHP en su servidor, no podrá realizar envíos en segundo plano mediante cron."
-#: ../../Zotlabs/Module/Setup.php:414
+#: ../../Zotlabs/Module/Setup.php:406
msgid "PHP executable path"
msgstr "Ruta del ejecutable PHP"
-#: ../../Zotlabs/Module/Setup.php:414
+#: ../../Zotlabs/Module/Setup.php:406
msgid ""
"Enter full path to php executable. You can leave this blank to continue the "
"installation."
msgstr "Introducir la ruta completa del ejecutable PHP. Puede dejar la línea en blanco para continuar la instalación."
-#: ../../Zotlabs/Module/Setup.php:419
+#: ../../Zotlabs/Module/Setup.php:411
msgid "Command line PHP"
msgstr "PHP en línea de comandos"
-#: ../../Zotlabs/Module/Setup.php:429
+#: ../../Zotlabs/Module/Setup.php:421
msgid ""
"Unable to check command line PHP, as shell_exec() is disabled. This is "
"required."
msgstr "No se puede comprobar la línea de comandos PHP, ya que shell_exec() está deshabilitado. Es necesario que esté activado."
-#: ../../Zotlabs/Module/Setup.php:432
+#: ../../Zotlabs/Module/Setup.php:424
msgid ""
"The command line version of PHP on your system does not have "
"\"register_argc_argv\" enabled."
msgstr "La línea de comandos PHP de su sistema no tiene activado \"register_argc_argv\"."
-#: ../../Zotlabs/Module/Setup.php:433
+#: ../../Zotlabs/Module/Setup.php:425
msgid "This is required for message delivery to work."
msgstr "Esto es necesario para que funcione la transmisión de mensajes."
-#: ../../Zotlabs/Module/Setup.php:436
+#: ../../Zotlabs/Module/Setup.php:428
msgid "PHP register_argc_argv"
msgstr "PHP register_argc_argv"
-#: ../../Zotlabs/Module/Setup.php:454
+#: ../../Zotlabs/Module/Setup.php:446
#, php-format
msgid ""
"Your max allowed total upload size is set to %s. Maximum size of one file to"
" upload is set to %s. You are allowed to upload up to %d files at once."
msgstr "La carga máxima que se le permite subir está establecida en %s. El tamaño máximo de un fichero está establecido en %s. Está permitido subir hasta un máximo de %d ficheros de una sola vez."
-#: ../../Zotlabs/Module/Setup.php:459
+#: ../../Zotlabs/Module/Setup.php:451
msgid "You can adjust these settings in the server php.ini file."
msgstr "Puede ajustar estos valores en el fichero php.ini de su servidor."
-#: ../../Zotlabs/Module/Setup.php:461
+#: ../../Zotlabs/Module/Setup.php:453
msgid "PHP upload limits"
msgstr "Límites PHP de subida"
-#: ../../Zotlabs/Module/Setup.php:484
+#: ../../Zotlabs/Module/Setup.php:476
msgid ""
"Error: the \"openssl_pkey_new\" function on this system is not able to "
"generate encryption keys"
msgstr "Error: La función \"openssl_pkey_new\" en este sistema no es capaz de general claves de cifrado."
-#: ../../Zotlabs/Module/Setup.php:485
+#: ../../Zotlabs/Module/Setup.php:477
msgid ""
"If running under Windows, please see "
"\"http://www.php.net/manual/en/openssl.installation.php\"."
msgstr "Si está en un servidor Windows, por favor, lea \"http://www.php.net/manual/en/openssl.installation.php\"."
-#: ../../Zotlabs/Module/Setup.php:488
+#: ../../Zotlabs/Module/Setup.php:480
msgid "Generate encryption keys"
msgstr "Generar claves de cifrado"
-#: ../../Zotlabs/Module/Setup.php:505
+#: ../../Zotlabs/Module/Setup.php:497
msgid "libCurl PHP module"
msgstr "módulo libCurl PHP"
-#: ../../Zotlabs/Module/Setup.php:506
+#: ../../Zotlabs/Module/Setup.php:498
msgid "GD graphics PHP module"
msgstr "módulo PHP GD graphics"
-#: ../../Zotlabs/Module/Setup.php:507
+#: ../../Zotlabs/Module/Setup.php:499
msgid "OpenSSL PHP module"
msgstr "módulo PHP OpenSSL"
-#: ../../Zotlabs/Module/Setup.php:508
+#: ../../Zotlabs/Module/Setup.php:500
msgid "PDO database PHP module"
msgstr "Módulo PHP de la base de datos PDO "
-#: ../../Zotlabs/Module/Setup.php:509
+#: ../../Zotlabs/Module/Setup.php:501
msgid "mb_string PHP module"
msgstr "módulo PHP mb_string"
-#: ../../Zotlabs/Module/Setup.php:510
+#: ../../Zotlabs/Module/Setup.php:502
msgid "xml PHP module"
msgstr "módulo PHP xml"
-#: ../../Zotlabs/Module/Setup.php:514 ../../Zotlabs/Module/Setup.php:516
+#: ../../Zotlabs/Module/Setup.php:503
+msgid "zip PHP module"
+msgstr "Módulo zip PHP"
+
+#: ../../Zotlabs/Module/Setup.php:507 ../../Zotlabs/Module/Setup.php:509
msgid "Apache mod_rewrite module"
msgstr "módulo Apache mod_rewrite "
-#: ../../Zotlabs/Module/Setup.php:514
+#: ../../Zotlabs/Module/Setup.php:507
msgid ""
"Error: Apache webserver mod-rewrite module is required but not installed."
msgstr "Error: se necesita el módulo del servidor web Apache mod-rewrite pero no está instalado."
-#: ../../Zotlabs/Module/Setup.php:520 ../../Zotlabs/Module/Setup.php:523
+#: ../../Zotlabs/Module/Setup.php:513 ../../Zotlabs/Module/Setup.php:516
msgid "exec"
msgstr "ejecutable"
-#: ../../Zotlabs/Module/Setup.php:520
+#: ../../Zotlabs/Module/Setup.php:513
msgid ""
"Error: exec is required but is either not installed or has been disabled in "
"php.ini"
msgstr "Error: se necesita un ejecutable pero o no se instaló o está deshabilitado en php.ini"
-#: ../../Zotlabs/Module/Setup.php:526 ../../Zotlabs/Module/Setup.php:529
+#: ../../Zotlabs/Module/Setup.php:519 ../../Zotlabs/Module/Setup.php:522
msgid "shell_exec"
msgstr "shell_exec"
-#: ../../Zotlabs/Module/Setup.php:526
+#: ../../Zotlabs/Module/Setup.php:519
msgid ""
"Error: shell_exec is required but is either not installed or has been "
"disabled in php.ini"
msgstr "Error: se necesita shell_exec pero o no se instaló o está deshabilitado en php.ini"
-#: ../../Zotlabs/Module/Setup.php:534
+#: ../../Zotlabs/Module/Setup.php:527
msgid "Error: libCURL PHP module required but not installed."
msgstr "Error: se necesita el módulo PHP libCURL pero no está instalado."
-#: ../../Zotlabs/Module/Setup.php:538
+#: ../../Zotlabs/Module/Setup.php:531
msgid ""
"Error: GD graphics PHP module with JPEG support required but not installed."
msgstr "Error: el módulo PHP GD graphics es necesario, pero no está instalado."
-#: ../../Zotlabs/Module/Setup.php:542
+#: ../../Zotlabs/Module/Setup.php:535
msgid "Error: openssl PHP module required but not installed."
msgstr "Error: el módulo PHP openssl es necesario, pero no está instalado."
-#: ../../Zotlabs/Module/Setup.php:546
+#: ../../Zotlabs/Module/Setup.php:539
msgid "Error: PDO database PHP module required but not installed."
msgstr "Error: se necesita el módulo PHP de la base de datos PDO, pero no está instalado."
-#: ../../Zotlabs/Module/Setup.php:550
+#: ../../Zotlabs/Module/Setup.php:543
msgid "Error: mb_string PHP module required but not installed."
msgstr "Error: el módulo PHP mb_string es necesario, pero no está instalado."
-#: ../../Zotlabs/Module/Setup.php:554
+#: ../../Zotlabs/Module/Setup.php:547
msgid "Error: xml PHP module required for DAV but not installed."
msgstr "Error: el módulo PHP xml es necesario para DAV, pero no está instalado."
-#: ../../Zotlabs/Module/Setup.php:572
+#: ../../Zotlabs/Module/Setup.php:551
+msgid "Error: zip PHP module required but not installed."
+msgstr "Error: se requiere el módulo zip PHP pero no está instalado."
+
+#: ../../Zotlabs/Module/Setup.php:569
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 "El instalador web no ha podido crear un fichero llamado “.htconfig.php” en la carpeta base de su servidor."
-#: ../../Zotlabs/Module/Setup.php:573
+#: ../../Zotlabs/Module/Setup.php:570
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 "Esto está generalmente ligado a un problema de permisos, a causa del cual el servidor web tiene prohibido modificar ficheros en su carpeta - incluso si usted mismo tiene esos permisos."
-#: ../../Zotlabs/Module/Setup.php:574
+#: ../../Zotlabs/Module/Setup.php:571
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 "Al término de este procedimiento, podemos crear un fichero de texto para guardar con el nombre .htconfig.php en el directorio raíz de su instalación de Hubzilla."
-#: ../../Zotlabs/Module/Setup.php:575
+#: ../../Zotlabs/Module/Setup.php:572
msgid ""
"You can alternatively skip this procedure and perform a manual installation."
" Please see the file \"install/INSTALL.txt\" for instructions."
msgstr "Como alternativa, puede dejar este procedimiento e intentar realizar una instalación manual. Lea, por favor, el fichero\"install/INSTALL.txt\" para las instrucciones."
-#: ../../Zotlabs/Module/Setup.php:578
+#: ../../Zotlabs/Module/Setup.php:575
msgid ".htconfig.php is writable"
msgstr ".htconfig.php tiene permisos de escritura"
-#: ../../Zotlabs/Module/Setup.php:592
+#: ../../Zotlabs/Module/Setup.php:589
msgid ""
"This software uses the Smarty3 template engine to render its web views. "
"Smarty3 compiles templates to PHP to speed up rendering."
msgstr "Este software hace uso del motor de plantillas Smarty3 para diseñar sus plantillas gráficas. Smarty3 compila las plantillas a PHP para acelerar la renderización."
-#: ../../Zotlabs/Module/Setup.php:593
+#: ../../Zotlabs/Module/Setup.php:590
#, php-format
msgid ""
"In order to store these compiled templates, the web server needs to have "
"write access to the directory %s under the top level web folder."
msgstr "Para poder guardar las plantillas compiladas, el servidor web necesita permisos para acceder al directorio %s en la carpeta web principal."
-#: ../../Zotlabs/Module/Setup.php:594 ../../Zotlabs/Module/Setup.php:615
+#: ../../Zotlabs/Module/Setup.php:591 ../../Zotlabs/Module/Setup.php:612
msgid ""
"Please ensure that the user that your web server runs as (e.g. www-data) has"
" write access to this folder."
msgstr "Por favor, asegúrese de que el servidor web está siendo ejecutado por un usuario que tenga permisos de escritura sobre esta carpeta (por ejemplo, www-data)."
-#: ../../Zotlabs/Module/Setup.php:595
+#: ../../Zotlabs/Module/Setup.php:592
#, php-format
msgid ""
"Note: as a security measure, you should give the web server write access to "
"%s only--not the template files (.tpl) that it contains."
msgstr "Nota: como medida de seguridad, debe dar al servidor web permisos de escritura solo sobre %s - no sobre el fichero de plantilla (.tpl) que contiene."
-#: ../../Zotlabs/Module/Setup.php:598
+#: ../../Zotlabs/Module/Setup.php:595
#, php-format
msgid "%s is writable"
msgstr "%s tiene permisos de escritura"
-#: ../../Zotlabs/Module/Setup.php:614
+#: ../../Zotlabs/Module/Setup.php:611
msgid ""
"This software uses the store directory to save uploaded files. The web "
"server needs to have write access to the store directory under the top level"
" web folder"
msgstr "Este software utiliza el directorio de almacenamiento para guardar los ficheros subidos. El servidor web debe tener acceso de escritura a este directorio en la carpeta de nivel superior"
-#: ../../Zotlabs/Module/Setup.php:618
+#: ../../Zotlabs/Module/Setup.php:615
msgid "store is writable"
msgstr "\"store\" tiene permisos de escritura"
-#: ../../Zotlabs/Module/Setup.php:650
+#: ../../Zotlabs/Module/Setup.php:647
msgid ""
"SSL certificate cannot be validated. Fix certificate or disable https access"
" to this site."
msgstr "El certificado SSL no ha podido ser validado. Corrija este problema o desactive el acceso https a este sitio."
-#: ../../Zotlabs/Module/Setup.php:651
+#: ../../Zotlabs/Module/Setup.php:648
msgid ""
"If you have https access to your website or allow connections to TCP port "
"443 (the https: port), you MUST use a browser-valid certificate. You MUST "
"NOT use self-signed certificates!"
msgstr "Si su servidor soporta conexiones cifradas SSL o si permite conexiones al puerto TCP 443 (el puerto usado por el protocolo https), debe utilizar un certificado válido. No debe usar un certificado firmado por usted mismo."
-#: ../../Zotlabs/Module/Setup.php:652
+#: ../../Zotlabs/Module/Setup.php:649
msgid ""
"This restriction is incorporated because public posts from you may for "
"example contain references to images on your own hub."
msgstr "Se ha incorporado esta restricción para evitar que sus entradas públicas hagan referencia a imágenes en su propio servidor."
-#: ../../Zotlabs/Module/Setup.php:653
+#: ../../Zotlabs/Module/Setup.php:650
msgid ""
"If your certificate is not recognized, members of other sites (who may "
"themselves have valid certificates) will get a warning message on their own "
"site complaining about security issues."
msgstr "Si su certificado no ha sido reconocido, los miembros de otros sitios (con certificados válidos) recibirán mensajes de aviso en sus propios sitios web."
-#: ../../Zotlabs/Module/Setup.php:654
+#: ../../Zotlabs/Module/Setup.php:651
msgid ""
"This can cause usability issues elsewhere (not just on your own site) so we "
"must insist on this requirement."
msgstr "Por razones de compatibilidad (sobre el conjunto de la red, no solo sobre su propio sitio), debemos insistir en estos requisitos."
-#: ../../Zotlabs/Module/Setup.php:655
+#: ../../Zotlabs/Module/Setup.php:652
msgid ""
"Providers are available that issue free certificates which are browser-"
"valid."
msgstr "Existen varias Autoridades de Certificación que le pueden proporcionar certificados válidos."
-#: ../../Zotlabs/Module/Setup.php:657
+#: ../../Zotlabs/Module/Setup.php:654
msgid ""
"If you are confident that the certificate is valid and signed by a trusted "
"authority, check to see if you have failed to install an intermediate cert. "
@@ -1807,37 +2022,37 @@ msgid ""
"server communications."
msgstr "Si se tiene la certeza de que el certificado es válido y está firmado por una autoridad de confianza, comprobar para ver si hubo un error al instalar un certificado intermedio. Estos no son normalmente requeridos por los navegadores, pero son necesarios para las comunicaciones de servidor a servidor."
-#: ../../Zotlabs/Module/Setup.php:659
+#: ../../Zotlabs/Module/Setup.php:656
msgid "SSL certificate validation"
msgstr "validación del certificado SSL"
-#: ../../Zotlabs/Module/Setup.php:665
+#: ../../Zotlabs/Module/Setup.php:662
msgid ""
"Url rewrite in .htaccess is not working. Check your server "
"configuration.Test: "
msgstr "No se pueden reescribir las direcciones web en .htaccess. Compruebe la configuración de su servidor:"
-#: ../../Zotlabs/Module/Setup.php:668
+#: ../../Zotlabs/Module/Setup.php:665
msgid "Url rewrite is working"
msgstr "La reescritura de las direcciones funciona correctamente"
-#: ../../Zotlabs/Module/Setup.php:682
+#: ../../Zotlabs/Module/Setup.php:679
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 "El fichero de configuración de la base de datos .htconfig.php no se ha podido modificar. Por favor, copie el texto generado en un fichero con ese nombre en el directorio raíz de su servidor."
-#: ../../Zotlabs/Module/Setup.php:706
-#: ../../addon/rendezvous/rendezvous.php:401 ../../addon/cdav/cdav.php:41
+#: ../../Zotlabs/Module/Setup.php:703
+#: ../../addon/rendezvous/rendezvous.php:401
msgid "Errors encountered creating database tables."
msgstr "Se han encontrado errores al crear las tablas de la base de datos."
-#: ../../Zotlabs/Module/Setup.php:746
-msgid "<h1>What next</h1>"
-msgstr "<h1>Siguiente paso</h1>"
+#: ../../Zotlabs/Module/Setup.php:743
+msgid "<h1>What next?</h1>"
+msgstr "<h1>¿Qué sigue?</h1>"
-#: ../../Zotlabs/Module/Setup.php:747
+#: ../../Zotlabs/Module/Setup.php:744
msgid ""
"IMPORTANT: You will need to [manually] setup a scheduled task for the "
"poller."
@@ -1978,8 +2193,8 @@ msgstr "Intentar ejecutar este paso de actualización automáticamente"
#: ../../Zotlabs/Module/Admin/Plugins.php:259
#: ../../Zotlabs/Module/Admin/Themes.php:72 ../../Zotlabs/Module/Thing.php:89
#: ../../Zotlabs/Module/Viewsrc.php:25 ../../Zotlabs/Module/Display.php:35
-#: ../../Zotlabs/Module/Filestorage.php:32 ../../Zotlabs/Module/Admin.php:60
-#: ../../include/items.php:3391
+#: ../../Zotlabs/Module/Filestorage.php:24 ../../Zotlabs/Module/Admin.php:62
+#: ../../include/items.php:3361
msgid "Item not found."
msgstr "Elemento no encontrado."
@@ -2010,9 +2225,9 @@ msgstr "Activar"
#: ../../Zotlabs/Module/Admin/Channels.php:145
#: ../../Zotlabs/Module/Admin/Themes.php:122
#: ../../Zotlabs/Module/Admin/Themes.php:156
-#: ../../Zotlabs/Module/Admin/Site.php:277
+#: ../../Zotlabs/Module/Admin/Site.php:269
#: ../../Zotlabs/Module/Admin/Security.php:86
-#: ../../Zotlabs/Module/Admin.php:137
+#: ../../Zotlabs/Module/Admin.php:136
msgid "Administration"
msgstr "Administración"
@@ -2028,8 +2243,8 @@ msgid "Toggle"
msgstr "Cambiar"
#: ../../Zotlabs/Module/Admin/Plugins.php:344
-#: ../../Zotlabs/Module/Admin/Themes.php:125 ../../Zotlabs/Lib/Apps.php:223
-#: ../../Zotlabs/Widget/Settings_menu.php:131 ../../include/nav.php:207
+#: ../../Zotlabs/Module/Admin/Themes.php:125 ../../Zotlabs/Lib/Apps.php:236
+#: ../../Zotlabs/Widget/Settings_menu.php:133 ../../include/nav.php:201
msgid "Settings"
msgstr "Ajustes"
@@ -2092,25 +2307,10 @@ msgstr "Descargar el repositorio"
msgid "Install new repo"
msgstr "Instalar un nuevo repositorio"
-#: ../../Zotlabs/Module/Admin/Plugins.php:422 ../../Zotlabs/Lib/Apps.php:358
+#: ../../Zotlabs/Module/Admin/Plugins.php:422 ../../Zotlabs/Lib/Apps.php:384
msgid "Install"
msgstr "Instalar"
-#: ../../Zotlabs/Module/Admin/Plugins.php:423
-#: ../../Zotlabs/Module/Settings/Oauth.php:88
-#: ../../Zotlabs/Module/Settings/Oauth.php:114
-#: ../../Zotlabs/Module/Wiki.php:265 ../../Zotlabs/Module/Wiki.php:290
-#: ../../Zotlabs/Module/Connedit.php:920 ../../Zotlabs/Module/Fbrowser.php:66
-#: ../../Zotlabs/Module/Fbrowser.php:88 ../../Zotlabs/Module/Profiles.php:804
-#: ../../Zotlabs/Module/Filer.php:55 ../../Zotlabs/Module/Tagrm.php:15
-#: ../../Zotlabs/Module/Tagrm.php:138 ../../addon/cdav/Mod_Cdav.php:866
-#: ../../addon/cdav/Mod_Cdav.php:1154 ../../addon/js_upload/js_upload.php:46
-#: ../../addon/gitwiki/Mod_Gitwiki.php:244
-#: ../../addon/gitwiki/Mod_Gitwiki.php:267 ../../include/conversation.php:1327
-#: ../../include/conversation.php:1376
-msgid "Cancel"
-msgstr "Cancelar"
-
#: ../../Zotlabs/Module/Admin/Plugins.php:445
msgid "Manage Repos"
msgstr "Gestionar los repositorios"
@@ -2123,20 +2323,12 @@ msgstr "Repositorios de los plugins instalados"
msgid "Install a New Plugin Repository"
msgstr "Instalar un nuevo repositorio de plugins"
-#: ../../Zotlabs/Module/Admin/Plugins.php:453
-#: ../../Zotlabs/Module/Settings/Oauth.php:42
-#: ../../Zotlabs/Module/Settings/Oauth.php:113
-#: ../../Zotlabs/Module/Connedit.php:918 ../../Zotlabs/Module/Profiles.php:802
-#: ../../Zotlabs/Lib/Apps.php:358 ../../addon/cdav/Mod_Cdav.php:1152
-msgid "Update"
-msgstr "Actualizar"
-
#: ../../Zotlabs/Module/Admin/Plugins.php:454
msgid "Switch branch"
msgstr "Cambiar la rama"
#: ../../Zotlabs/Module/Admin/Plugins.php:455
-#: ../../Zotlabs/Module/Photos.php:960 ../../Zotlabs/Module/Tagrm.php:137
+#: ../../Zotlabs/Module/Photos.php:962 ../../Zotlabs/Module/Tagrm.php:137
#: ../../addon/superblock/superblock.php:116
msgid "Remove"
msgstr "Eliminar"
@@ -2176,7 +2368,7 @@ msgstr "La cuenta '%s' ha sido desbloqueada"
#: ../../Zotlabs/Module/Admin/Accounts.php:165
#: ../../Zotlabs/Module/Admin/Accounts.php:178
-#: ../../Zotlabs/Widget/Admin.php:23
+#: ../../Zotlabs/Module/Admin.php:96 ../../Zotlabs/Widget/Admin.php:23
msgid "Accounts"
msgstr "Cuentas"
@@ -2193,21 +2385,12 @@ msgstr "Inscripciones en espera de confirmación"
msgid "Request date"
msgstr "Fecha de solicitud"
-#: ../../Zotlabs/Module/Admin/Accounts.php:169
-#: ../../Zotlabs/Module/Admin/Accounts.php:181
-#: ../../Zotlabs/Module/Connedit.php:906 ../../Zotlabs/Module/Profiles.php:790
-#: ../../addon/cdav/Mod_Cdav.php:1140 ../../addon/openid/MysqlProvider.php:56
-#: ../../addon/openid/MysqlProvider.php:57 ../../addon/rtof/rtof.php:93
-#: ../../addon/redred/redred.php:107 ../../include/network.php:2315
-msgid "Email"
-msgstr "Correo electrónico"
-
#: ../../Zotlabs/Module/Admin/Accounts.php:170
msgid "No registrations."
msgstr "Sin registros."
#: ../../Zotlabs/Module/Admin/Accounts.php:171
-#: ../../Zotlabs/Module/Connections.php:281
+#: ../../Zotlabs/Module/Connections.php:282 ../../include/conversation.php:685
msgid "Approve"
msgstr "Aprobar"
@@ -2229,7 +2412,7 @@ msgstr "Desbloquear"
msgid "ID"
msgstr "ID"
-#: ../../Zotlabs/Module/Admin/Accounts.php:182 ../../include/group.php:287
+#: ../../Zotlabs/Module/Admin/Accounts.php:182 ../../include/group.php:288
msgid "All Channels"
msgstr "Todos los canales"
@@ -2343,7 +2526,7 @@ msgid "Channel '%s' code disallowed"
msgstr "Código no permitido al canal '%s'"
#: ../../Zotlabs/Module/Admin/Channels.php:146
-#: ../../Zotlabs/Widget/Admin.php:24
+#: ../../Zotlabs/Module/Admin.php:110 ../../Zotlabs/Widget/Admin.php:24
msgid "Channels"
msgstr "Canales"
@@ -2364,7 +2547,7 @@ msgid "Disallow Code"
msgstr "No permitir código"
#: ../../Zotlabs/Module/Admin/Channels.php:154
-#: ../../include/conversation.php:1760 ../../include/nav.php:369
+#: ../../include/conversation.php:1757 ../../include/nav.php:355
msgid "Channel"
msgstr "Canal"
@@ -2409,381 +2592,382 @@ msgstr "[Experimental]"
msgid "[Unsupported]"
msgstr "[No soportado]"
-#: ../../Zotlabs/Module/Admin/Site.php:144
+#: ../../Zotlabs/Module/Admin/Site.php:142
msgid "Site settings updated."
msgstr "Ajustes del sitio actualizados."
-#: ../../Zotlabs/Module/Admin/Site.php:170 ../../include/text.php:2915
+#: ../../Zotlabs/Module/Admin/Site.php:168
+#: ../../view/theme/redbasic/php/config.php:15 ../../include/text.php:2928
msgid "Default"
msgstr "Predeterminado"
-#: ../../Zotlabs/Module/Admin/Site.php:181
+#: ../../Zotlabs/Module/Admin/Site.php:179
#: ../../Zotlabs/Module/Settings/Display.php:137
#, php-format
msgid "%s - (Incompatible)"
msgstr "%s - (Incompatible)"
-#: ../../Zotlabs/Module/Admin/Site.php:188
+#: ../../Zotlabs/Module/Admin/Site.php:186
#: ../../Zotlabs/Module/Settings/Display.php:151
msgid "mobile"
msgstr "móvil"
-#: ../../Zotlabs/Module/Admin/Site.php:190
+#: ../../Zotlabs/Module/Admin/Site.php:188
msgid "experimental"
msgstr "experimental"
-#: ../../Zotlabs/Module/Admin/Site.php:192
+#: ../../Zotlabs/Module/Admin/Site.php:190
msgid "unsupported"
msgstr "no soportado"
-#: ../../Zotlabs/Module/Admin/Site.php:238
+#: ../../Zotlabs/Module/Admin/Site.php:236
msgid "Yes - with approval"
msgstr "Sí - con aprobación"
-#: ../../Zotlabs/Module/Admin/Site.php:244
+#: ../../Zotlabs/Module/Admin/Site.php:242
msgid "My site is not a public server"
msgstr "Mi sitio no es un servidor público"
-#: ../../Zotlabs/Module/Admin/Site.php:245
+#: ../../Zotlabs/Module/Admin/Site.php:243
msgid "My site has paid access only"
msgstr "Mi sitio es un servicio de pago"
-#: ../../Zotlabs/Module/Admin/Site.php:246
+#: ../../Zotlabs/Module/Admin/Site.php:244
msgid "My site has free access only"
msgstr "Mi sitio es un servicio gratuito"
-#: ../../Zotlabs/Module/Admin/Site.php:247
+#: ../../Zotlabs/Module/Admin/Site.php:245
msgid "My site offers free accounts with optional paid upgrades"
msgstr "Mi sitio ofrece cuentas gratuitas con opciones extra de pago"
-#: ../../Zotlabs/Module/Admin/Site.php:264 ../../Zotlabs/Lib/Techlevels.php:10
+#: ../../Zotlabs/Module/Admin/Site.php:256
msgid "Beginner/Basic"
msgstr "Principiante / Básico"
-#: ../../Zotlabs/Module/Admin/Site.php:265 ../../Zotlabs/Lib/Techlevels.php:11
+#: ../../Zotlabs/Module/Admin/Site.php:257
msgid "Novice - not skilled but willing to learn"
msgstr "Novato: no cualificado, pero dispuesto a aprender"
-#: ../../Zotlabs/Module/Admin/Site.php:266 ../../Zotlabs/Lib/Techlevels.php:12
+#: ../../Zotlabs/Module/Admin/Site.php:258
msgid "Intermediate - somewhat comfortable"
msgstr "Intermedio: bastante cómodo"
-#: ../../Zotlabs/Module/Admin/Site.php:267 ../../Zotlabs/Lib/Techlevels.php:13
+#: ../../Zotlabs/Module/Admin/Site.php:259
msgid "Advanced - very comfortable"
msgstr "Avanzado: muy cómodo"
-#: ../../Zotlabs/Module/Admin/Site.php:268 ../../Zotlabs/Lib/Techlevels.php:14
+#: ../../Zotlabs/Module/Admin/Site.php:260
msgid "Expert - I can write computer code"
msgstr "Experto: puedo escribir código informático"
-#: ../../Zotlabs/Module/Admin/Site.php:269 ../../Zotlabs/Lib/Techlevels.php:15
+#: ../../Zotlabs/Module/Admin/Site.php:261
msgid "Wizard - I probably know more than you do"
msgstr "Asistente: probablemente sé más que tú"
-#: ../../Zotlabs/Module/Admin/Site.php:278 ../../Zotlabs/Widget/Admin.php:22
+#: ../../Zotlabs/Module/Admin/Site.php:270 ../../Zotlabs/Widget/Admin.php:22
msgid "Site"
msgstr "Sitio"
-#: ../../Zotlabs/Module/Admin/Site.php:280
-#: ../../Zotlabs/Module/Register.php:253
+#: ../../Zotlabs/Module/Admin/Site.php:272
+#: ../../Zotlabs/Module/Register.php:251
msgid "Registration"
msgstr "Registro"
-#: ../../Zotlabs/Module/Admin/Site.php:281
+#: ../../Zotlabs/Module/Admin/Site.php:273
msgid "File upload"
msgstr "Subir fichero"
-#: ../../Zotlabs/Module/Admin/Site.php:282
+#: ../../Zotlabs/Module/Admin/Site.php:274
msgid "Policies"
msgstr "Políticas"
-#: ../../Zotlabs/Module/Admin/Site.php:283
+#: ../../Zotlabs/Module/Admin/Site.php:275
#: ../../include/contact_widgets.php:16
msgid "Advanced"
msgstr "Avanzado"
-#: ../../Zotlabs/Module/Admin/Site.php:287
+#: ../../Zotlabs/Module/Admin/Site.php:279
#: ../../addon/statusnet/statusnet.php:890
msgid "Site name"
msgstr "Nombre del sitio"
-#: ../../Zotlabs/Module/Admin/Site.php:291
+#: ../../Zotlabs/Module/Admin/Site.php:281
msgid "Site default technical skill level"
msgstr "Nivel de habilidad técnica predeterminado del sitio"
-#: ../../Zotlabs/Module/Admin/Site.php:291
+#: ../../Zotlabs/Module/Admin/Site.php:281
msgid "Used to provide a member experience matched to technical comfort level"
msgstr "Se utiliza para proporcionar una experiencia a los miembros adaptada a su nivel de comodidad técnica"
-#: ../../Zotlabs/Module/Admin/Site.php:293
+#: ../../Zotlabs/Module/Admin/Site.php:283
msgid "Lock the technical skill level setting"
msgstr "Bloquear el ajuste del nivel de habilidad técnica"
-#: ../../Zotlabs/Module/Admin/Site.php:293
+#: ../../Zotlabs/Module/Admin/Site.php:283
msgid "Members can set their own technical comfort level by default"
msgstr "Los miembros pueden configurar su nivel de comodidad técnica por defecto"
-#: ../../Zotlabs/Module/Admin/Site.php:295
+#: ../../Zotlabs/Module/Admin/Site.php:285
msgid "Banner/Logo"
msgstr "Banner/Logo"
-#: ../../Zotlabs/Module/Admin/Site.php:296
+#: ../../Zotlabs/Module/Admin/Site.php:286
msgid "Administrator Information"
msgstr "Información del Administrador"
-#: ../../Zotlabs/Module/Admin/Site.php:296
+#: ../../Zotlabs/Module/Admin/Site.php:286
msgid ""
"Contact information for site administrators. Displayed on siteinfo page. "
"BBCode can be used here"
msgstr "Información de contacto de los administradores del sitio. Visible en la página \"siteinfo\". Se puede usar BBCode"
-#: ../../Zotlabs/Module/Admin/Site.php:297
-#: ../../Zotlabs/Module/Siteinfo.php:23
+#: ../../Zotlabs/Module/Admin/Site.php:287
+#: ../../Zotlabs/Module/Siteinfo.php:22
msgid "Site Information"
msgstr "Información sobre el sitio"
-#: ../../Zotlabs/Module/Admin/Site.php:297
+#: ../../Zotlabs/Module/Admin/Site.php:287
msgid ""
"Publicly visible description of this site. Displayed on siteinfo page. "
"BBCode can be used here"
msgstr "Descripción pública de este sitio. Visible en la página \"siteinfo\". Se puede usar BBCode"
-#: ../../Zotlabs/Module/Admin/Site.php:298
+#: ../../Zotlabs/Module/Admin/Site.php:288
msgid "System language"
msgstr "Idioma del sistema"
-#: ../../Zotlabs/Module/Admin/Site.php:299
+#: ../../Zotlabs/Module/Admin/Site.php:289
msgid "System theme"
msgstr "Tema gráfico del sistema"
-#: ../../Zotlabs/Module/Admin/Site.php:299
+#: ../../Zotlabs/Module/Admin/Site.php:289
msgid ""
"Default system theme - may be over-ridden by user profiles - <a href='#' "
"id='cnftheme'>change theme settings</a>"
msgstr "Tema del sistema por defecto - se puede cambiar por cada perfil de usuario - <a href='#' id='cnftheme'>modificar los ajustes del tema</a>"
-#: ../../Zotlabs/Module/Admin/Site.php:300
+#: ../../Zotlabs/Module/Admin/Site.php:290
msgid "Mobile system theme"
msgstr "Tema del sistema para móviles"
-#: ../../Zotlabs/Module/Admin/Site.php:300
+#: ../../Zotlabs/Module/Admin/Site.php:290
msgid "Theme for mobile devices"
msgstr "Tema para dispositivos móviles"
-#: ../../Zotlabs/Module/Admin/Site.php:302
+#: ../../Zotlabs/Module/Admin/Site.php:292
msgid "Allow Feeds as Connections"
msgstr "Permitir contenidos RSS como conexiones"
-#: ../../Zotlabs/Module/Admin/Site.php:302
+#: ../../Zotlabs/Module/Admin/Site.php:292
msgid "(Heavy system resource usage)"
msgstr "(Uso intenso de los recursos del sistema)"
-#: ../../Zotlabs/Module/Admin/Site.php:303
+#: ../../Zotlabs/Module/Admin/Site.php:293
msgid "Maximum image size"
msgstr "Tamaño máximo de la imagen"
-#: ../../Zotlabs/Module/Admin/Site.php:303
+#: ../../Zotlabs/Module/Admin/Site.php:293
msgid ""
"Maximum size in bytes of uploaded images. Default is 0, which means no "
"limits."
msgstr "Tamaño máximo en bytes de la imagen subida. Por defecto, es 0, lo que significa que no hay límites."
-#: ../../Zotlabs/Module/Admin/Site.php:304
+#: ../../Zotlabs/Module/Admin/Site.php:294
msgid "Does this site allow new member registration?"
msgstr "¿Debe este sitio permitir el registro de nuevos miembros?"
-#: ../../Zotlabs/Module/Admin/Site.php:305
+#: ../../Zotlabs/Module/Admin/Site.php:295
msgid "Invitation only"
msgstr "Solo con una invitación"
-#: ../../Zotlabs/Module/Admin/Site.php:305
+#: ../../Zotlabs/Module/Admin/Site.php:295
msgid ""
"Only allow new member registrations with an invitation code. Above register "
"policy must be set to Yes."
msgstr "Solo se permiten inscripciones de nuevos miembros con un código de invitación. Además, deben aceptarse los términos del registro marcando \"Sí\"."
-#: ../../Zotlabs/Module/Admin/Site.php:306
+#: ../../Zotlabs/Module/Admin/Site.php:296
msgid "Which best describes the types of account offered by this hub?"
msgstr "¿Cómo describiría el tipo de servicio ofrecido por este servidor?"
-#: ../../Zotlabs/Module/Admin/Site.php:307
+#: ../../Zotlabs/Module/Admin/Site.php:297
msgid "Register text"
msgstr "Texto del registro"
-#: ../../Zotlabs/Module/Admin/Site.php:307
+#: ../../Zotlabs/Module/Admin/Site.php:297
msgid "Will be displayed prominently on the registration page."
msgstr "Se mostrará de forma destacada en la página de registro."
-#: ../../Zotlabs/Module/Admin/Site.php:308
+#: ../../Zotlabs/Module/Admin/Site.php:298
msgid "Site homepage to show visitors (default: login box)"
msgstr "Página personal que se mostrará a los visitantes (por defecto: la página de identificación)"
-#: ../../Zotlabs/Module/Admin/Site.php:308
+#: ../../Zotlabs/Module/Admin/Site.php:298
msgid ""
"example: 'public' to show public stream, 'page/sys/home' to show a system "
"webpage called 'home' or 'include:home.html' to include a file."
msgstr "ejemplo: 'public' para mostrar contenido público, 'page/sys/home' para mostrar la página web definida como \"home\" o 'include:home.html' para mostrar el contenido de un fichero."
-#: ../../Zotlabs/Module/Admin/Site.php:309
+#: ../../Zotlabs/Module/Admin/Site.php:299
msgid "Preserve site homepage URL"
msgstr "Preservar la dirección de la página personal"
-#: ../../Zotlabs/Module/Admin/Site.php:309
+#: ../../Zotlabs/Module/Admin/Site.php:299
msgid ""
"Present the site homepage in a frame at the original location instead of "
"redirecting"
msgstr "Presenta la página personal del sitio en un marco en la ubicación original, en vez de redirigirla."
-#: ../../Zotlabs/Module/Admin/Site.php:310
+#: ../../Zotlabs/Module/Admin/Site.php:300
msgid "Accounts abandoned after x days"
msgstr "Cuentas abandonadas después de x días"
-#: ../../Zotlabs/Module/Admin/Site.php:310
+#: ../../Zotlabs/Module/Admin/Site.php:300
msgid ""
"Will not waste system resources polling external sites for abandonded "
"accounts. Enter 0 for no time limit."
msgstr "Para evitar consumir recursos del sistema intentando poner al día las cuentas abandonadas. Introduzca 0 para no tener límite de tiempo."
-#: ../../Zotlabs/Module/Admin/Site.php:311
+#: ../../Zotlabs/Module/Admin/Site.php:301
msgid "Allowed friend domains"
msgstr "Dominios amigos permitidos"
-#: ../../Zotlabs/Module/Admin/Site.php:311
+#: ../../Zotlabs/Module/Admin/Site.php:301
msgid ""
"Comma separated list of domains which are allowed to establish friendships "
"with this site. Wildcards are accepted. Empty to allow any domains"
msgstr "Lista separada por comas de dominios a los que está permitido establecer relaciones de amistad con este sitio. Se permiten comodines. Dejar en claro para aceptar cualquier dominio."
-#: ../../Zotlabs/Module/Admin/Site.php:312
+#: ../../Zotlabs/Module/Admin/Site.php:302
msgid "Verify Email Addresses"
msgstr "Verificar las direcciones de correo electrónico"
-#: ../../Zotlabs/Module/Admin/Site.php:312
+#: ../../Zotlabs/Module/Admin/Site.php:302
msgid ""
"Check to verify email addresses used in account registration (recommended)."
msgstr "Activar para la verificación de la dirección de correo electrónico en el registro de una cuenta (recomendado)."
-#: ../../Zotlabs/Module/Admin/Site.php:313
+#: ../../Zotlabs/Module/Admin/Site.php:303
msgid "Force publish"
msgstr "Forzar la publicación"
-#: ../../Zotlabs/Module/Admin/Site.php:313
+#: ../../Zotlabs/Module/Admin/Site.php:303
msgid ""
"Check to force all profiles on this site to be listed in the site directory."
msgstr "Intentar forzar todos los perfiles para que sean listados en el directorio de este sitio."
-#: ../../Zotlabs/Module/Admin/Site.php:314
+#: ../../Zotlabs/Module/Admin/Site.php:304
msgid "Import Public Streams"
msgstr "Importar contenido público"
-#: ../../Zotlabs/Module/Admin/Site.php:314
+#: ../../Zotlabs/Module/Admin/Site.php:304
msgid ""
"Import and allow access to public content pulled from other sites. Warning: "
"this content is unmoderated."
msgstr "Importar y permitir acceso al contenido público sacado de otros sitios. Advertencia: este contenido no está moderado, por lo que podría encontrar cosas inapropiadas u ofensivas."
-#: ../../Zotlabs/Module/Admin/Site.php:315
+#: ../../Zotlabs/Module/Admin/Site.php:305
msgid "Login on Homepage"
msgstr "Iniciar sesión en la página personal"
-#: ../../Zotlabs/Module/Admin/Site.php:315
+#: ../../Zotlabs/Module/Admin/Site.php:305
msgid ""
"Present a login box to visitors on the home page if no other content has "
"been configured."
msgstr "Presentar a los visitantes una casilla de identificación en la página de inicio, si no se ha configurado otro tipo de contenido."
-#: ../../Zotlabs/Module/Admin/Site.php:316
+#: ../../Zotlabs/Module/Admin/Site.php:306
msgid "Enable context help"
msgstr "Habilitar la ayuda contextual"
-#: ../../Zotlabs/Module/Admin/Site.php:316
+#: ../../Zotlabs/Module/Admin/Site.php:306
msgid ""
"Display contextual help for the current page when the help button is "
"pressed."
msgstr "Ver la ayuda contextual para la página actual cuando se pulse el botón de Ayuda."
-#: ../../Zotlabs/Module/Admin/Site.php:318
+#: ../../Zotlabs/Module/Admin/Site.php:308
msgid "Reply-to email address for system generated email."
msgstr "Dirección de respuesta para el correo electrónico generado por el sistema."
-#: ../../Zotlabs/Module/Admin/Site.php:319
+#: ../../Zotlabs/Module/Admin/Site.php:309
msgid "Sender (From) email address for system generated email."
msgstr "Dirección del remitente (From) para el correo electrónico generado por el sistema."
-#: ../../Zotlabs/Module/Admin/Site.php:320
+#: ../../Zotlabs/Module/Admin/Site.php:310
msgid "Name of email sender for system generated email."
msgstr "Nombre del remitente del correo electrónico generado por el sistema."
-#: ../../Zotlabs/Module/Admin/Site.php:322
+#: ../../Zotlabs/Module/Admin/Site.php:312
msgid "Directory Server URL"
msgstr "URL del servidor de directorio"
-#: ../../Zotlabs/Module/Admin/Site.php:322
+#: ../../Zotlabs/Module/Admin/Site.php:312
msgid "Default directory server"
msgstr "Servidor de directorio predeterminado"
-#: ../../Zotlabs/Module/Admin/Site.php:324
+#: ../../Zotlabs/Module/Admin/Site.php:314
msgid "Proxy user"
msgstr "Usuario del proxy"
-#: ../../Zotlabs/Module/Admin/Site.php:325
+#: ../../Zotlabs/Module/Admin/Site.php:315
msgid "Proxy URL"
msgstr "Dirección del proxy"
-#: ../../Zotlabs/Module/Admin/Site.php:326
+#: ../../Zotlabs/Module/Admin/Site.php:316
msgid "Network timeout"
msgstr "Tiempo de espera de la red"
-#: ../../Zotlabs/Module/Admin/Site.php:326
+#: ../../Zotlabs/Module/Admin/Site.php:316
msgid "Value is in seconds. Set to 0 for unlimited (not recommended)."
msgstr "Valor en segundos. Poner a 0 para que no haya tiempo límite (no recomendado)"
-#: ../../Zotlabs/Module/Admin/Site.php:327
+#: ../../Zotlabs/Module/Admin/Site.php:317
msgid "Delivery interval"
msgstr "Intervalo de entrega"
-#: ../../Zotlabs/Module/Admin/Site.php:327
+#: ../../Zotlabs/Module/Admin/Site.php:317
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 "Retrasar los procesos de transmisión en segundo plano por esta cantidad de segundos para reducir la carga del sistema. Recomendado: 4-5 para sitios compartidos, 2-3 para servidores virtuales privados, 0-1 para grandes servidores dedicados."
-#: ../../Zotlabs/Module/Admin/Site.php:328
+#: ../../Zotlabs/Module/Admin/Site.php:318
msgid "Deliveries per process"
msgstr "Intentos de envío por proceso"
-#: ../../Zotlabs/Module/Admin/Site.php:328
+#: ../../Zotlabs/Module/Admin/Site.php:318
msgid ""
"Number of deliveries to attempt in a single operating system process. Adjust"
" if necessary to tune system performance. Recommend: 1-5."
msgstr "Numero de envíos a intentar en un único proceso del sistema operativo. Ajustar si es necesario mejorar el rendimiento. Se recomienda: 1-5."
-#: ../../Zotlabs/Module/Admin/Site.php:329
+#: ../../Zotlabs/Module/Admin/Site.php:319
msgid "Poll interval"
msgstr "Intervalo máximo de tiempo entre dos mensajes sucesivos"
-#: ../../Zotlabs/Module/Admin/Site.php:329
+#: ../../Zotlabs/Module/Admin/Site.php:319
msgid ""
"Delay background polling processes by this many seconds to reduce system "
"load. If 0, use delivery interval."
msgstr "Retrasar el intervalo de envío en segundo plano, en esta cantidad de segundos, para reducir la carga del sistema. Si es 0, usar el intervalo de entrega."
-#: ../../Zotlabs/Module/Admin/Site.php:330
+#: ../../Zotlabs/Module/Admin/Site.php:320
msgid "Maximum Load Average"
msgstr "Carga media máxima"
-#: ../../Zotlabs/Module/Admin/Site.php:330
+#: ../../Zotlabs/Module/Admin/Site.php:320
msgid ""
"Maximum system load before delivery and poll processes are deferred - "
"default 50."
msgstr "Carga máxima del sistema antes de que los procesos de entrega y envío se hayan retardado - por defecto, 50."
-#: ../../Zotlabs/Module/Admin/Site.php:331
+#: ../../Zotlabs/Module/Admin/Site.php:321
msgid "Expiration period in days for imported (grid/network) content"
msgstr "Caducidad del contenido importado de otros sitios (en días)"
-#: ../../Zotlabs/Module/Admin/Site.php:331
+#: ../../Zotlabs/Module/Admin/Site.php:321
msgid "0 for no expiration of imported content"
msgstr "0 para que no caduque el contenido importado"
@@ -2829,8 +3013,8 @@ msgstr "Información adicional (opcional)"
#: ../../Zotlabs/Module/Admin/Profs.php:74
#: ../../Zotlabs/Module/Admin/Profs.php:94 ../../Zotlabs/Module/Rbmark.php:32
#: ../../Zotlabs/Module/Rbmark.php:104 ../../Zotlabs/Module/Filer.php:53
-#: ../../Zotlabs/Widget/Notes.php:18 ../../include/text.php:1028
-#: ../../include/text.php:1040
+#: ../../Zotlabs/Widget/Notes.php:18 ../../include/text.php:1022
+#: ../../include/text.php:1034
msgid "Save"
msgstr "Guardar"
@@ -3036,6 +3220,14 @@ msgctxt "acl"
msgid "Profile"
msgstr "Perfil"
+#: ../../Zotlabs/Module/Moderate.php:37
+msgid "Comment approved"
+msgstr "El comentario ha sido aprobado"
+
+#: ../../Zotlabs/Module/Moderate.php:41
+msgid "Comment deleted"
+msgstr "Se ha eliminado el comentario"
+
#: ../../Zotlabs/Module/Settings/Permcats.php:37
msgid "Permission category saved."
msgstr "Se ha guardado la categoría del permiso."
@@ -3056,25 +3248,25 @@ msgstr "Nombre de la autorización"
#: ../../Zotlabs/Module/Settings/Permcats.php:103
#: ../../Zotlabs/Module/Settings/Tokens.php:161
-#: ../../Zotlabs/Module/Connedit.php:886
+#: ../../Zotlabs/Module/Connedit.php:904
msgid "My Settings"
msgstr "Mis ajustes"
#: ../../Zotlabs/Module/Settings/Permcats.php:105
#: ../../Zotlabs/Module/Settings/Tokens.php:163
-#: ../../Zotlabs/Module/Connedit.php:881
+#: ../../Zotlabs/Module/Connedit.php:899
msgid "inherited"
msgstr "heredado"
#: ../../Zotlabs/Module/Settings/Permcats.php:108
#: ../../Zotlabs/Module/Settings/Tokens.php:166
-#: ../../Zotlabs/Module/Connedit.php:888
+#: ../../Zotlabs/Module/Connedit.php:906
msgid "Individual Permissions"
msgstr "Permisos individuales"
#: ../../Zotlabs/Module/Settings/Permcats.php:109
#: ../../Zotlabs/Module/Settings/Tokens.php:167
-#: ../../Zotlabs/Module/Connedit.php:889
+#: ../../Zotlabs/Module/Connedit.php:907
msgid ""
"Some permissions may be inherited from your channel's <a "
"href=\"settings\"><strong>privacy settings</strong></a>, which have higher "
@@ -3088,12 +3280,12 @@ msgstr "Algunos permisos pueden ser heredados de los <a href=\"settings\"><stron
#: ../../Zotlabs/Module/Settings/Channel.php:70
#: ../../Zotlabs/Module/Settings/Channel.php:81
#: ../../Zotlabs/Module/Connedit.php:707 ../../Zotlabs/Widget/Affinity.php:28
-#: ../../include/selectors.php:123 ../../include/channel.php:406
-#: ../../include/channel.php:407 ../../include/channel.php:414
+#: ../../include/selectors.php:123 ../../include/channel.php:408
+#: ../../include/channel.php:409 ../../include/channel.php:416
msgid "Friends"
msgstr "Amigos/as"
-#: ../../Zotlabs/Module/Settings/Channel.php:251
+#: ../../Zotlabs/Module/Settings/Channel.php:255
#: ../../addon/rendezvous/rendezvous.php:82
#: ../../addon/openstreetmap/openstreetmap.php:184
#: ../../addon/msgfooter/msgfooter.php:54 ../../addon/logrot/logrot.php:54
@@ -3102,380 +3294,388 @@ msgstr "Amigos/as"
msgid "Settings updated."
msgstr "Ajustes actualizados."
-#: ../../Zotlabs/Module/Settings/Channel.php:312
+#: ../../Zotlabs/Module/Settings/Channel.php:316
msgid "Nobody except yourself"
msgstr "Nadie excepto usted"
-#: ../../Zotlabs/Module/Settings/Channel.php:313
+#: ../../Zotlabs/Module/Settings/Channel.php:317
msgid "Only those you specifically allow"
msgstr "Solo aquellos a los que usted permita explícitamente"
-#: ../../Zotlabs/Module/Settings/Channel.php:314
+#: ../../Zotlabs/Module/Settings/Channel.php:318
msgid "Approved connections"
msgstr "Conexiones aprobadas"
-#: ../../Zotlabs/Module/Settings/Channel.php:315
+#: ../../Zotlabs/Module/Settings/Channel.php:319
msgid "Any connections"
msgstr "Cualquier conexión"
-#: ../../Zotlabs/Module/Settings/Channel.php:316
+#: ../../Zotlabs/Module/Settings/Channel.php:320
msgid "Anybody on this website"
msgstr "Cualquiera en este sitio web"
-#: ../../Zotlabs/Module/Settings/Channel.php:317
+#: ../../Zotlabs/Module/Settings/Channel.php:321
msgid "Anybody in this network"
msgstr "Cualquiera en esta red"
-#: ../../Zotlabs/Module/Settings/Channel.php:318
+#: ../../Zotlabs/Module/Settings/Channel.php:322
msgid "Anybody authenticated"
msgstr "Cualquiera que esté autenticado"
-#: ../../Zotlabs/Module/Settings/Channel.php:319
+#: ../../Zotlabs/Module/Settings/Channel.php:323
msgid "Anybody on the internet"
msgstr "Cualquiera en internet"
-#: ../../Zotlabs/Module/Settings/Channel.php:395
+#: ../../Zotlabs/Module/Settings/Channel.php:399
msgid "Publish your default profile in the network directory"
msgstr "Publicar su perfil principal en el directorio de la red"
-#: ../../Zotlabs/Module/Settings/Channel.php:400
+#: ../../Zotlabs/Module/Settings/Channel.php:404
msgid "Allow us to suggest you as a potential friend to new members?"
msgstr "¿Nos permite sugerirle como amigo potencial a los nuevos miembros?"
-#: ../../Zotlabs/Module/Settings/Channel.php:404
+#: ../../Zotlabs/Module/Settings/Channel.php:408
#: ../../Zotlabs/Module/Profile_photo.php:429
#: ../../Zotlabs/Module/Cover_photo.php:365
msgid "or"
msgstr "o"
-#: ../../Zotlabs/Module/Settings/Channel.php:409
+#: ../../Zotlabs/Module/Settings/Channel.php:413
msgid "Your channel address is"
msgstr "Su dirección de canal es"
-#: ../../Zotlabs/Module/Settings/Channel.php:412
+#: ../../Zotlabs/Module/Settings/Channel.php:416
msgid "Your files/photos are accessible via WebDAV at"
msgstr "Sus archivos y fotos son accesibles a través de WebDAV en "
-#: ../../Zotlabs/Module/Settings/Channel.php:474
+#: ../../Zotlabs/Module/Settings/Channel.php:478
msgid "Channel Settings"
msgstr "Ajustes del canal"
-#: ../../Zotlabs/Module/Settings/Channel.php:481
+#: ../../Zotlabs/Module/Settings/Channel.php:485
msgid "Basic Settings"
msgstr "Configuración básica"
-#: ../../Zotlabs/Module/Settings/Channel.php:482
-#: ../../include/channel.php:1250
+#: ../../Zotlabs/Module/Settings/Channel.php:486
+#: ../../include/channel.php:1373
msgid "Full Name:"
msgstr "Nombre completo:"
-#: ../../Zotlabs/Module/Settings/Channel.php:483
+#: ../../Zotlabs/Module/Settings/Channel.php:487
#: ../../Zotlabs/Module/Settings/Account.php:119
msgid "Email Address:"
msgstr "Dirección de correo electrónico:"
-#: ../../Zotlabs/Module/Settings/Channel.php:484
+#: ../../Zotlabs/Module/Settings/Channel.php:488
msgid "Your Timezone:"
msgstr "Su huso horario:"
-#: ../../Zotlabs/Module/Settings/Channel.php:485
+#: ../../Zotlabs/Module/Settings/Channel.php:489
msgid "Default Post Location:"
msgstr "Localización geográfica predeterminada para sus publicaciones:"
-#: ../../Zotlabs/Module/Settings/Channel.php:485
+#: ../../Zotlabs/Module/Settings/Channel.php:489
msgid "Geographical location to display on your posts"
msgstr "Localización geográfica que debe mostrarse en sus publicaciones"
-#: ../../Zotlabs/Module/Settings/Channel.php:486
+#: ../../Zotlabs/Module/Settings/Channel.php:490
msgid "Use Browser Location:"
msgstr "Usar la localización geográfica del navegador:"
-#: ../../Zotlabs/Module/Settings/Channel.php:488
+#: ../../Zotlabs/Module/Settings/Channel.php:492
msgid "Adult Content"
msgstr "Contenido solo para adultos"
-#: ../../Zotlabs/Module/Settings/Channel.php:488
+#: ../../Zotlabs/Module/Settings/Channel.php:492
msgid ""
"This channel frequently or regularly publishes adult content. (Please tag "
"any adult material and/or nudity with #NSFW)"
msgstr "Este canal publica contenido solo para adultos con frecuencia o regularmente. (Por favor etiquete cualquier material para adultos con la etiqueta #NSFW)"
-#: ../../Zotlabs/Module/Settings/Channel.php:490
+#: ../../Zotlabs/Module/Settings/Channel.php:494
msgid "Security and Privacy Settings"
msgstr "Configuración de seguridad y privacidad"
-#: ../../Zotlabs/Module/Settings/Channel.php:493
+#: ../../Zotlabs/Module/Settings/Channel.php:496
msgid "Your permissions are already configured. Click to view/adjust"
msgstr "Sus permisos ya están configurados. Pulse para ver/ajustar"
-#: ../../Zotlabs/Module/Settings/Channel.php:495
+#: ../../Zotlabs/Module/Settings/Channel.php:498
msgid "Hide my online presence"
msgstr "Ocultar mi presencia en línea"
-#: ../../Zotlabs/Module/Settings/Channel.php:495
+#: ../../Zotlabs/Module/Settings/Channel.php:498
msgid "Prevents displaying in your profile that you are online"
msgstr "Evitar mostrar en su perfil que está en línea"
-#: ../../Zotlabs/Module/Settings/Channel.php:497
+#: ../../Zotlabs/Module/Settings/Channel.php:500
msgid "Simple Privacy Settings:"
msgstr "Configuración de privacidad sencilla:"
-#: ../../Zotlabs/Module/Settings/Channel.php:498
+#: ../../Zotlabs/Module/Settings/Channel.php:501
msgid ""
"Very Public - <em>extremely permissive (should be used with caution)</em>"
msgstr "Muy Público - <em>extremadamente permisivo (debería ser usado con precaución)</em>"
-#: ../../Zotlabs/Module/Settings/Channel.php:499
+#: ../../Zotlabs/Module/Settings/Channel.php:502
msgid ""
"Typical - <em>default public, privacy when desired (similar to social "
"network permissions but with improved privacy)</em>"
msgstr "Típico - <em>por defecto público, privado cuando se desee (similar a los permisos de una red social pero con privacidad mejorada)</em>"
-#: ../../Zotlabs/Module/Settings/Channel.php:500
+#: ../../Zotlabs/Module/Settings/Channel.php:503
msgid "Private - <em>default private, never open or public</em>"
msgstr "Privado - <em>por defecto, privado, nunca abierto o público</em>"
-#: ../../Zotlabs/Module/Settings/Channel.php:501
+#: ../../Zotlabs/Module/Settings/Channel.php:504
msgid "Blocked - <em>default blocked to/from everybody</em>"
msgstr "Bloqueado - <em>por defecto, bloqueado/a para cualquiera</em>"
-#: ../../Zotlabs/Module/Settings/Channel.php:503
+#: ../../Zotlabs/Module/Settings/Channel.php:506
msgid "Allow others to tag your posts"
msgstr "Permitir a otros etiquetar sus publicaciones"
-#: ../../Zotlabs/Module/Settings/Channel.php:503
+#: ../../Zotlabs/Module/Settings/Channel.php:506
msgid ""
"Often used by the community to retro-actively flag inappropriate content"
msgstr "A menudo usado por la comunidad para marcar contenido inapropiado de forma retroactiva."
-#: ../../Zotlabs/Module/Settings/Channel.php:505
+#: ../../Zotlabs/Module/Settings/Channel.php:508
msgid "Channel Permission Limits"
msgstr "Límites de los permisos del canal"
-#: ../../Zotlabs/Module/Settings/Channel.php:507
+#: ../../Zotlabs/Module/Settings/Channel.php:510
msgid "Expire other channel content after this many days"
msgstr "Caducar contenido de otros canales después de este número de días"
-#: ../../Zotlabs/Module/Settings/Channel.php:507
+#: ../../Zotlabs/Module/Settings/Channel.php:510
msgid "0 or blank to use the website limit."
msgstr "0 o en blanco para usar el límite del sitio web."
-#: ../../Zotlabs/Module/Settings/Channel.php:507
+#: ../../Zotlabs/Module/Settings/Channel.php:510
#, php-format
msgid "This website expires after %d days."
msgstr "Este sitio web caduca después de %d días."
-#: ../../Zotlabs/Module/Settings/Channel.php:507
+#: ../../Zotlabs/Module/Settings/Channel.php:510
msgid "This website does not expire imported content."
msgstr "Este sitio web no caduca el contenido importado."
-#: ../../Zotlabs/Module/Settings/Channel.php:507
+#: ../../Zotlabs/Module/Settings/Channel.php:510
msgid "The website limit takes precedence if lower than your limit."
msgstr "El límite del sitio web tiene prioridad si es inferior a su propio límite."
-#: ../../Zotlabs/Module/Settings/Channel.php:508
+#: ../../Zotlabs/Module/Settings/Channel.php:511
msgid "Maximum Friend Requests/Day:"
msgstr "Máximo de solicitudes de amistad por día:"
-#: ../../Zotlabs/Module/Settings/Channel.php:508
+#: ../../Zotlabs/Module/Settings/Channel.php:511
msgid "May reduce spam activity"
msgstr "Podría reducir la actividad de spam"
-#: ../../Zotlabs/Module/Settings/Channel.php:509
+#: ../../Zotlabs/Module/Settings/Channel.php:512
msgid "Default Access Control List (ACL)"
msgstr "Lista de control de acceso (ACL) por defecto"
-#: ../../Zotlabs/Module/Settings/Channel.php:511
+#: ../../Zotlabs/Module/Settings/Channel.php:514
msgid "Use my default audience setting for the type of object published"
msgstr "Usar los ajustes de mi audiencia predeterminada para el tipo de publicación"
-#: ../../Zotlabs/Module/Settings/Channel.php:518
+#: ../../Zotlabs/Module/Settings/Channel.php:521
msgid "Channel permissions category:"
msgstr "Categoría de los permisos del canal:"
-#: ../../Zotlabs/Module/Settings/Channel.php:519
+#: ../../Zotlabs/Module/Settings/Channel.php:522
msgid "Default Permissions Group"
msgstr "Grupo de permisos predeterminado"
-#: ../../Zotlabs/Module/Settings/Channel.php:525
+#: ../../Zotlabs/Module/Settings/Channel.php:528
msgid "Maximum private messages per day from unknown people:"
msgstr "Máximo de mensajes privados por día de gente desconocida:"
-#: ../../Zotlabs/Module/Settings/Channel.php:525
+#: ../../Zotlabs/Module/Settings/Channel.php:528
msgid "Useful to reduce spamming"
msgstr "Útil para reducir el envío de correo no deseado"
-#: ../../Zotlabs/Module/Settings/Channel.php:528
+#: ../../Zotlabs/Module/Settings/Channel.php:531
msgid "Notification Settings"
msgstr "Configuración de las notificaciones"
-#: ../../Zotlabs/Module/Settings/Channel.php:529
+#: ../../Zotlabs/Module/Settings/Channel.php:532
msgid "By default post a status message when:"
msgstr "Por defecto, enviar un mensaje de estado cuando:"
-#: ../../Zotlabs/Module/Settings/Channel.php:530
+#: ../../Zotlabs/Module/Settings/Channel.php:533
msgid "accepting a friend request"
msgstr "Acepte una solicitud de amistad"
-#: ../../Zotlabs/Module/Settings/Channel.php:531
+#: ../../Zotlabs/Module/Settings/Channel.php:534
msgid "joining a forum/community"
msgstr "al unirse a un foro o comunidad"
-#: ../../Zotlabs/Module/Settings/Channel.php:532
+#: ../../Zotlabs/Module/Settings/Channel.php:535
msgid "making an <em>interesting</em> profile change"
msgstr "Realice un cambio <em>interesante</em> en su perfil"
-#: ../../Zotlabs/Module/Settings/Channel.php:533
+#: ../../Zotlabs/Module/Settings/Channel.php:536
msgid "Send a notification email when:"
msgstr "Enviar una notificación por correo electrónico cuando:"
-#: ../../Zotlabs/Module/Settings/Channel.php:534
+#: ../../Zotlabs/Module/Settings/Channel.php:537
msgid "You receive a connection request"
msgstr "Reciba una solicitud de conexión"
-#: ../../Zotlabs/Module/Settings/Channel.php:535
+#: ../../Zotlabs/Module/Settings/Channel.php:538
msgid "Your connections are confirmed"
msgstr "Sus conexiones hayan sido confirmadas"
-#: ../../Zotlabs/Module/Settings/Channel.php:536
+#: ../../Zotlabs/Module/Settings/Channel.php:539
msgid "Someone writes on your profile wall"
msgstr "Alguien escriba en la página de su perfil (\"muro\")"
-#: ../../Zotlabs/Module/Settings/Channel.php:537
+#: ../../Zotlabs/Module/Settings/Channel.php:540
msgid "Someone writes a followup comment"
msgstr "Alguien escriba un comentario sobre sus publicaciones"
-#: ../../Zotlabs/Module/Settings/Channel.php:538
+#: ../../Zotlabs/Module/Settings/Channel.php:541
msgid "You receive a private message"
msgstr "Reciba un mensaje privado"
-#: ../../Zotlabs/Module/Settings/Channel.php:539
+#: ../../Zotlabs/Module/Settings/Channel.php:542
msgid "You receive a friend suggestion"
msgstr "Reciba una sugerencia de amistad"
-#: ../../Zotlabs/Module/Settings/Channel.php:540
+#: ../../Zotlabs/Module/Settings/Channel.php:543
msgid "You are tagged in a post"
msgstr "Usted sea etiquetado en una publicación"
-#: ../../Zotlabs/Module/Settings/Channel.php:541
+#: ../../Zotlabs/Module/Settings/Channel.php:544
msgid "You are poked/prodded/etc. in a post"
msgstr "Reciba un toque o incitación en una publicación"
-#: ../../Zotlabs/Module/Settings/Channel.php:543
+#: ../../Zotlabs/Module/Settings/Channel.php:546
msgid "Someone likes your post/comment"
msgstr "Alguien muestre agrado por su entrada o comentario"
-#: ../../Zotlabs/Module/Settings/Channel.php:546
+#: ../../Zotlabs/Module/Settings/Channel.php:549
msgid "Show visual notifications including:"
msgstr "Mostrar notificaciones visuales que incluyan:"
-#: ../../Zotlabs/Module/Settings/Channel.php:548
+#: ../../Zotlabs/Module/Settings/Channel.php:551
msgid "Unseen grid activity"
msgstr "Nueva actividad en la red"
-#: ../../Zotlabs/Module/Settings/Channel.php:549
+#: ../../Zotlabs/Module/Settings/Channel.php:552
msgid "Unseen channel activity"
msgstr "Actividad no vista en el canal"
-#: ../../Zotlabs/Module/Settings/Channel.php:550
+#: ../../Zotlabs/Module/Settings/Channel.php:553
msgid "Unseen private messages"
msgstr "Mensajes privados no leídos"
-#: ../../Zotlabs/Module/Settings/Channel.php:550
-#: ../../Zotlabs/Module/Settings/Channel.php:555
-#: ../../Zotlabs/Module/Settings/Channel.php:556
-#: ../../Zotlabs/Module/Settings/Channel.php:557
+#: ../../Zotlabs/Module/Settings/Channel.php:553
+#: ../../Zotlabs/Module/Settings/Channel.php:558
+#: ../../Zotlabs/Module/Settings/Channel.php:559
+#: ../../Zotlabs/Module/Settings/Channel.php:560
#: ../../addon/jappixmini/jappixmini.php:343
msgid "Recommended"
msgstr "Recomendado"
-#: ../../Zotlabs/Module/Settings/Channel.php:551
+#: ../../Zotlabs/Module/Settings/Channel.php:554
msgid "Upcoming events"
msgstr "Próximos eventos"
-#: ../../Zotlabs/Module/Settings/Channel.php:552
+#: ../../Zotlabs/Module/Settings/Channel.php:555
msgid "Events today"
msgstr "Eventos de hoy"
-#: ../../Zotlabs/Module/Settings/Channel.php:553
+#: ../../Zotlabs/Module/Settings/Channel.php:556
msgid "Upcoming birthdays"
msgstr "Próximos cumpleaños"
-#: ../../Zotlabs/Module/Settings/Channel.php:553
+#: ../../Zotlabs/Module/Settings/Channel.php:556
msgid "Not available in all themes"
msgstr "No disponible en todos los temas"
-#: ../../Zotlabs/Module/Settings/Channel.php:554
+#: ../../Zotlabs/Module/Settings/Channel.php:557
msgid "System (personal) notifications"
msgstr "Notificaciones del sistema (personales)"
-#: ../../Zotlabs/Module/Settings/Channel.php:555
+#: ../../Zotlabs/Module/Settings/Channel.php:558
msgid "System info messages"
msgstr "Mensajes de información del sistema"
-#: ../../Zotlabs/Module/Settings/Channel.php:556
+#: ../../Zotlabs/Module/Settings/Channel.php:559
msgid "System critical alerts"
msgstr "Alertas críticas del sistema"
-#: ../../Zotlabs/Module/Settings/Channel.php:557
+#: ../../Zotlabs/Module/Settings/Channel.php:560
msgid "New connections"
msgstr "Nuevas conexiones"
-#: ../../Zotlabs/Module/Settings/Channel.php:558
+#: ../../Zotlabs/Module/Settings/Channel.php:561
msgid "System Registrations"
msgstr "Registros del sistema"
-#: ../../Zotlabs/Module/Settings/Channel.php:559
+#: ../../Zotlabs/Module/Settings/Channel.php:562
+msgid "Unseen shared files"
+msgstr "Ficheros compartidos no vistos"
+
+#: ../../Zotlabs/Module/Settings/Channel.php:563
+msgid "Unseen public activity"
+msgstr "Actividad pública no vista"
+
+#: ../../Zotlabs/Module/Settings/Channel.php:564
msgid ""
"Also show new wall posts, private messages and connections under Notices"
msgstr "Mostrar también en Avisos las nuevas publicaciones, los mensajes privados y las conexiones"
-#: ../../Zotlabs/Module/Settings/Channel.php:561
+#: ../../Zotlabs/Module/Settings/Channel.php:566
msgid "Notify me of events this many days in advance"
msgstr "Avisarme de los eventos con algunos días de antelación"
-#: ../../Zotlabs/Module/Settings/Channel.php:561
+#: ../../Zotlabs/Module/Settings/Channel.php:566
msgid "Must be greater than 0"
msgstr "Debe ser mayor que 0"
-#: ../../Zotlabs/Module/Settings/Channel.php:567
+#: ../../Zotlabs/Module/Settings/Channel.php:572
msgid "Advanced Account/Page Type Settings"
msgstr "Ajustes avanzados de la cuenta y de los tipos de página"
-#: ../../Zotlabs/Module/Settings/Channel.php:568
+#: ../../Zotlabs/Module/Settings/Channel.php:573
msgid "Change the behaviour of this account for special situations"
msgstr "Cambiar el comportamiento de esta cuenta en situaciones especiales"
-#: ../../Zotlabs/Module/Settings/Channel.php:570
+#: ../../Zotlabs/Module/Settings/Channel.php:575
msgid "Miscellaneous Settings"
msgstr "Ajustes diversos"
-#: ../../Zotlabs/Module/Settings/Channel.php:571
+#: ../../Zotlabs/Module/Settings/Channel.php:576
msgid "Default photo upload folder"
msgstr "Carpeta por defecto de las fotos subidas"
-#: ../../Zotlabs/Module/Settings/Channel.php:571
-#: ../../Zotlabs/Module/Settings/Channel.php:572
+#: ../../Zotlabs/Module/Settings/Channel.php:576
+#: ../../Zotlabs/Module/Settings/Channel.php:577
msgid "%Y - current year, %m - current month"
msgstr "%Y - año en curso, %m - mes actual"
-#: ../../Zotlabs/Module/Settings/Channel.php:572
+#: ../../Zotlabs/Module/Settings/Channel.php:577
msgid "Default file upload folder"
msgstr "Carpeta por defecto de los ficheros subidos"
-#: ../../Zotlabs/Module/Settings/Channel.php:574
+#: ../../Zotlabs/Module/Settings/Channel.php:579
msgid "Personal menu to display in your channel pages"
msgstr "Menú personal que debe mostrarse en las páginas de su canal"
-#: ../../Zotlabs/Module/Settings/Channel.php:576
+#: ../../Zotlabs/Module/Settings/Channel.php:581
msgid "Remove this channel."
msgstr "Eliminar este canal."
-#: ../../Zotlabs/Module/Settings/Channel.php:577
+#: ../../Zotlabs/Module/Settings/Channel.php:582
msgid "Firefox Share $Projectname provider"
msgstr "Servicio de compartición de Firefox: proveedor $Projectname"
-#: ../../Zotlabs/Module/Settings/Channel.php:578
+#: ../../Zotlabs/Module/Settings/Channel.php:583
msgid "Start calendar week on Monday"
msgstr "Comenzar el calendario semanal por el lunes"
@@ -3511,7 +3711,7 @@ msgid ""
msgstr "También puede proporcionar, con el estilo <em>dropbox</em>, enlaces de acceso a sus amigos y asociados añadiendo la contraseña de inicio de sesión a cualquier dirección URL, como se muestra. Ejemplos: "
#: ../../Zotlabs/Module/Settings/Tokens.php:150
-#: ../../Zotlabs/Widget/Settings_menu.php:90
+#: ../../Zotlabs/Widget/Settings_menu.php:92
msgid "Guest Access Tokens"
msgstr "Tokens de acceso para invitados"
@@ -3528,7 +3728,7 @@ msgid "Expires (yyyy-mm-dd)"
msgstr "Expira (aaaa-mm-dd)"
#: ../../Zotlabs/Module/Settings/Tokens.php:160
-#: ../../Zotlabs/Module/Connedit.php:885
+#: ../../Zotlabs/Module/Connedit.php:903
msgid "Their Settings"
msgstr "Sus ajustes"
@@ -3605,27 +3805,27 @@ msgstr "Eliminar cuenta"
msgid "Remove this account including all its channels"
msgstr "Eliminar esta cuenta incluyendo todos sus canales"
-#: ../../Zotlabs/Module/Settings/Featured.php:20
+#: ../../Zotlabs/Module/Settings/Featured.php:21
msgid "Affinity Slider settings updated."
msgstr "Se han actualizado los ajustes del controlador de afinidad."
-#: ../../Zotlabs/Module/Settings/Featured.php:34
+#: ../../Zotlabs/Module/Settings/Featured.php:36
msgid "No feature settings configured"
msgstr "No se ha establecido la configuración de los complementos"
-#: ../../Zotlabs/Module/Settings/Featured.php:41
+#: ../../Zotlabs/Module/Settings/Featured.php:43
msgid "Default maximum affinity level"
msgstr "Nivel máximo de afinidad por defecto"
-#: ../../Zotlabs/Module/Settings/Featured.php:46
+#: ../../Zotlabs/Module/Settings/Featured.php:48
msgid "Default minimum affinity level"
msgstr "Nivel mínimo de afinidad por defecto"
-#: ../../Zotlabs/Module/Settings/Featured.php:50
+#: ../../Zotlabs/Module/Settings/Featured.php:52
msgid "Affinity Slider Settings"
msgstr "Ajustes del controlador de afinidad"
-#: ../../Zotlabs/Module/Settings/Featured.php:60
+#: ../../Zotlabs/Module/Settings/Featured.php:62
msgid "Feature/Addon Settings"
msgstr "Ajustes de los complementos"
@@ -3819,32 +4019,24 @@ msgid "Remove authorization"
msgstr "Eliminar autorización"
#: ../../Zotlabs/Module/Embedphotos.php:140
-#: ../../Zotlabs/Module/Photos.php:751 ../../Zotlabs/Module/Photos.php:1290
-#: ../../Zotlabs/Widget/Album.php:78
+#: ../../Zotlabs/Module/Photos.php:753 ../../Zotlabs/Module/Photos.php:1292
+#: ../../Zotlabs/Widget/Portfolio.php:78 ../../Zotlabs/Widget/Album.php:78
msgid "View Photo"
msgstr "Ver foto"
-#: ../../Zotlabs/Module/Embedphotos.php:146
-#: ../../Zotlabs/Module/Photos.php:757 ../../Zotlabs/Module/Photos.php:1213
-#: ../../Zotlabs/Lib/Apps.php:571 ../../Zotlabs/Lib/Apps.php:649
-#: ../../Zotlabs/Storage/Browser.php:163 ../../Zotlabs/Widget/Album.php:84
-#: ../../addon/cdav/Mod_Cdav.php:745 ../../addon/cdav/Mod_Cdav.php:746
-#: ../../addon/cdav/Mod_Cdav.php:753 ../../include/conversation.php:1110
-msgid "Unknown"
-msgstr "Desconocido"
-
#: ../../Zotlabs/Module/Embedphotos.php:156
-#: ../../Zotlabs/Module/Photos.php:782 ../../Zotlabs/Widget/Album.php:95
+#: ../../Zotlabs/Module/Photos.php:784 ../../Zotlabs/Widget/Portfolio.php:97
+#: ../../Zotlabs/Widget/Album.php:95
msgid "Edit Album"
msgstr "Editar álbum"
#: ../../Zotlabs/Module/Embedphotos.php:158
-#: ../../Zotlabs/Module/Photos.php:784 ../../Zotlabs/Module/Photos.php:1321
+#: ../../Zotlabs/Module/Photos.php:786 ../../Zotlabs/Module/Photos.php:1323
#: ../../Zotlabs/Module/Profile_photo.php:423
#: ../../Zotlabs/Module/Cover_photo.php:361
-#: ../../Zotlabs/Storage/Browser.php:229 ../../Zotlabs/Storage/Browser.php:334
-#: ../../Zotlabs/Widget/Album.php:97 ../../addon/cdav/include/widgets.php:132
-#: ../../addon/cdav/include/widgets.php:168
+#: ../../Zotlabs/Storage/Browser.php:230 ../../Zotlabs/Storage/Browser.php:337
+#: ../../Zotlabs/Widget/Cdav.php:132 ../../Zotlabs/Widget/Cdav.php:168
+#: ../../Zotlabs/Widget/Portfolio.php:99 ../../Zotlabs/Widget/Album.php:97
msgid "Upload"
msgstr "Subir"
@@ -3906,9 +4098,9 @@ msgid "URL for photo of thing (optional)"
msgstr "Dirección para la foto o elemento (opcional)"
#: ../../Zotlabs/Module/Thing.php:313 ../../Zotlabs/Module/Thing.php:363
-#: ../../Zotlabs/Module/Photos.php:647 ../../Zotlabs/Module/Photos.php:1011
-#: ../../Zotlabs/Module/Connedit.php:672 ../../Zotlabs/Module/Chat.php:233
-#: ../../Zotlabs/Module/Filestorage.php:152
+#: ../../Zotlabs/Module/Photos.php:649 ../../Zotlabs/Module/Photos.php:1013
+#: ../../Zotlabs/Module/Connedit.php:672 ../../Zotlabs/Module/Chat.php:235
+#: ../../Zotlabs/Module/Filestorage.php:142
#: ../../include/acl_selectors.php:218
msgid "Permissions"
msgstr "Permisos"
@@ -3931,52 +4123,52 @@ msgstr "Notificaciones del sistema"
msgid "Channel added."
msgstr "Canal añadido."
-#: ../../Zotlabs/Module/Import.php:144
+#: ../../Zotlabs/Module/Import.php:143
#, php-format
msgid "Your service plan only allows %d channels."
msgstr "Su paquete de servicios solo permite %d canales."
-#: ../../Zotlabs/Module/Import.php:158
+#: ../../Zotlabs/Module/Import.php:157
msgid "No channel. Import failed."
msgstr "No hay canal. La importación ha fallado"
-#: ../../Zotlabs/Module/Import.php:466
+#: ../../Zotlabs/Module/Import.php:470
#: ../../addon/diaspora/import_diaspora.php:142
msgid "Import completed."
msgstr "Importación completada."
-#: ../../Zotlabs/Module/Import.php:494
+#: ../../Zotlabs/Module/Import.php:498
msgid "You must be logged in to use this feature."
msgstr "Debe estar registrado para poder usar esta funcionalidad."
-#: ../../Zotlabs/Module/Import.php:499
+#: ../../Zotlabs/Module/Import.php:503
msgid "Import Channel"
msgstr "Importar canal"
-#: ../../Zotlabs/Module/Import.php:500
+#: ../../Zotlabs/Module/Import.php:504
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."
msgstr "Emplee este formulario para importar un canal desde un servidor/hub diferente. Puede recuperar el canal desde el antiguo servidor/hub a través de la red o proporcionando un fichero de exportación."
-#: ../../Zotlabs/Module/Import.php:502
+#: ../../Zotlabs/Module/Import.php:506
msgid "Or provide the old server/hub details"
msgstr "O proporcione los detalles de su antiguo servidor/hub"
-#: ../../Zotlabs/Module/Import.php:503
+#: ../../Zotlabs/Module/Import.php:507
msgid "Your old identity address (xyz@example.com)"
msgstr "Su identidad en el antiguo servidor (canal@ejemplo.com)"
-#: ../../Zotlabs/Module/Import.php:504
+#: ../../Zotlabs/Module/Import.php:508
msgid "Your old login email address"
msgstr "Su antigua dirección de correo electrónico"
-#: ../../Zotlabs/Module/Import.php:505
+#: ../../Zotlabs/Module/Import.php:509
msgid "Your old login password"
msgstr "Su antigua contraseña"
-#: ../../Zotlabs/Module/Import.php:506
+#: ../../Zotlabs/Module/Import.php:510
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"
@@ -3984,19 +4176,19 @@ msgid ""
"primary location for files, photos, and media."
msgstr "Para cualquiera de las opciones, elija si hacer de este servidor su nueva dirección primaria, o si su antigua dirección debe continuar con este papel. Usted podrá publicar desde cualquier ubicación, pero sólo una puede estar marcada como la ubicación principal para los ficheros, fotos y otras imágenes o vídeos."
-#: ../../Zotlabs/Module/Import.php:507
+#: ../../Zotlabs/Module/Import.php:511
msgid "Make this hub my primary location"
msgstr "Convertir este servidor en mi ubicación primaria"
-#: ../../Zotlabs/Module/Import.php:508
+#: ../../Zotlabs/Module/Import.php:512
msgid "Move this channel (disable all previous locations)"
msgstr "Mover este canal (desactivar todas las ubicaciones anteriores)"
-#: ../../Zotlabs/Module/Import.php:509
+#: ../../Zotlabs/Module/Import.php:513
msgid "Import a few months of posts if possible (limited by available memory"
msgstr "Importar unos meses de mensajes si es posible (limitado por la memoria disponible"
-#: ../../Zotlabs/Module/Import.php:510
+#: ../../Zotlabs/Module/Import.php:514
msgid ""
"This process may take several minutes to complete. Please submit the form "
"only once and leave this page open until finished."
@@ -4006,21 +4198,21 @@ msgstr "Este proceso puede tardar varios minutos en completarse. Por favor enví
msgid "Authentication failed."
msgstr "Falló la autenticación."
-#: ../../Zotlabs/Module/Rmagic.php:75 ../../include/channel.php:1984
+#: ../../Zotlabs/Module/Rmagic.php:75 ../../include/channel.php:2102
msgid "Remote Authentication"
msgstr "Acceso desde su servidor"
-#: ../../Zotlabs/Module/Rmagic.php:76 ../../include/channel.php:1985
+#: ../../Zotlabs/Module/Rmagic.php:76 ../../include/channel.php:2103
msgid "Enter your channel address (e.g. channel@example.com)"
msgstr "Introduzca la dirección del canal (p.ej. canal@ejemplo.com)"
-#: ../../Zotlabs/Module/Rmagic.php:77 ../../include/channel.php:1986
+#: ../../Zotlabs/Module/Rmagic.php:77 ../../include/channel.php:2104
msgid "Authenticate"
msgstr "Acceder"
#: ../../Zotlabs/Module/Cal.php:62 ../../Zotlabs/Module/Chanview.php:96
-#: ../../Zotlabs/Module/Page.php:56 ../../Zotlabs/Module/Wall_upload.php:31
-#: ../../Zotlabs/Module/Block.php:43
+#: ../../Zotlabs/Module/Page.php:75 ../../Zotlabs/Module/Wall_upload.php:31
+#: ../../Zotlabs/Module/Block.php:41
msgid "Channel not found."
msgstr "Canal no encontrado."
@@ -4028,7 +4220,7 @@ msgstr "Canal no encontrado."
msgid "Permissions denied."
msgstr "Permisos denegados."
-#: ../../Zotlabs/Module/Cal.php:342 ../../include/text.php:2291
+#: ../../Zotlabs/Module/Cal.php:342 ../../include/text.php:2304
msgid "Import"
msgstr "Importar"
@@ -4054,13 +4246,13 @@ msgstr "¿Desea autorizar a esta aplicación a acceder a sus publicaciones y con
msgid "Item not available."
msgstr "Elemento no disponible"
-#: ../../Zotlabs/Module/Editblock.php:116 ../../Zotlabs/Module/Chat.php:205
-#: ../../Zotlabs/Module/Editwebpage.php:143 ../../Zotlabs/Module/Mail.php:306
-#: ../../Zotlabs/Module/Mail.php:448 ../../include/conversation.php:1228
+#: ../../Zotlabs/Module/Editblock.php:116 ../../Zotlabs/Module/Chat.php:207
+#: ../../Zotlabs/Module/Editwebpage.php:143 ../../Zotlabs/Module/Mail.php:288
+#: ../../Zotlabs/Module/Mail.php:430 ../../include/conversation.php:1225
msgid "Insert web link"
msgstr "Insertar enlace web"
-#: ../../Zotlabs/Module/Editblock.php:129 ../../include/conversation.php:1339
+#: ../../Zotlabs/Module/Editblock.php:129 ../../include/conversation.php:1336
msgid "Title (optional)"
msgstr "Título (opcional)"
@@ -4068,11 +4260,11 @@ msgstr "Título (opcional)"
msgid "Edit Block"
msgstr "Modificar este bloque"
-#: ../../Zotlabs/Module/Profile.php:91
+#: ../../Zotlabs/Module/Profile.php:93
msgid "vcard"
msgstr "vcard"
-#: ../../Zotlabs/Module/Apps.php:45
+#: ../../Zotlabs/Module/Apps.php:45 ../../Zotlabs/Lib/Apps.php:224
msgid "Apps"
msgstr "Aplicaciones (apps)"
@@ -4090,7 +4282,8 @@ msgctxt "mood"
msgid "%1$s is %2$s"
msgstr "%1$s está %2$s"
-#: ../../Zotlabs/Module/Mood.php:135 ../../Zotlabs/Lib/Apps.php:234
+#: ../../Zotlabs/Module/Mood.php:120 ../../Zotlabs/Module/Mood.php:135
+#: ../../Zotlabs/Lib/Apps.php:247
msgid "Mood"
msgstr "Estado de ánimo"
@@ -4098,74 +4291,87 @@ msgstr "Estado de ánimo"
msgid "Set your current mood and tell your friends"
msgstr "Describir su estado de ánimo para comunicárselo a sus amigos"
-#: ../../Zotlabs/Module/Connections.php:52
-#: ../../Zotlabs/Module/Connections.php:157
-#: ../../Zotlabs/Module/Connections.php:246
+#: ../../Zotlabs/Module/Connections.php:33
+#: ../../Zotlabs/Module/Connections.php:309 ../../Zotlabs/Lib/Apps.php:229
+#: ../../include/text.php:951 ../../include/nav.php:180
+msgid "Connections"
+msgstr "Conexiones"
+
+#: ../../Zotlabs/Module/Connections.php:54
+#: ../../Zotlabs/Module/Connections.php:156
+#: ../../Zotlabs/Module/Connections.php:245
msgid "Blocked"
msgstr "Bloqueadas"
-#: ../../Zotlabs/Module/Connections.php:57
-#: ../../Zotlabs/Module/Connections.php:164
-#: ../../Zotlabs/Module/Connections.php:245
+#: ../../Zotlabs/Module/Connections.php:59
+#: ../../Zotlabs/Module/Connections.php:163
+#: ../../Zotlabs/Module/Connections.php:244
msgid "Ignored"
msgstr "Ignoradas"
-#: ../../Zotlabs/Module/Connections.php:62
-#: ../../Zotlabs/Module/Connections.php:178
-#: ../../Zotlabs/Module/Connections.php:244
+#: ../../Zotlabs/Module/Connections.php:64
+#: ../../Zotlabs/Module/Connections.php:177
+#: ../../Zotlabs/Module/Connections.php:243
msgid "Hidden"
msgstr "Ocultas"
-#: ../../Zotlabs/Module/Connections.php:67
-#: ../../Zotlabs/Module/Connections.php:171
-#: ../../Zotlabs/Module/Connections.php:243
-msgid "Archived"
-msgstr "Archivadas"
+#: ../../Zotlabs/Module/Connections.php:69
+#: ../../Zotlabs/Module/Connections.php:170
+msgid "Archived/Unreachable"
+msgstr "Archivada o inaccesible"
-#: ../../Zotlabs/Module/Connections.php:72
-#: ../../Zotlabs/Module/Connections.php:82 ../../Zotlabs/Module/Menu.php:116
-#: ../../include/conversation.php:1666
+#: ../../Zotlabs/Module/Connections.php:74
+#: ../../Zotlabs/Module/Connections.php:83 ../../Zotlabs/Module/Menu.php:116
+#: ../../include/conversation.php:1663
msgid "New"
msgstr "Nuevas"
#: ../../Zotlabs/Module/Connections.php:88
-#: ../../Zotlabs/Module/Connections.php:103
+#: ../../Zotlabs/Module/Connections.php:102
#: ../../Zotlabs/Module/Connedit.php:709 ../../Zotlabs/Widget/Affinity.php:30
msgid "All"
msgstr "Todos/as"
-#: ../../Zotlabs/Module/Connections.php:134
+#: ../../Zotlabs/Module/Connections.php:133
msgid "New Connections"
msgstr "Nuevas conexiones"
-#: ../../Zotlabs/Module/Connections.php:137
+#: ../../Zotlabs/Module/Connections.php:136
msgid "Show pending (new) connections"
msgstr "Mostrar conexiones (nuevas) pendientes"
-#: ../../Zotlabs/Module/Connections.php:144
+#: ../../Zotlabs/Module/Connections.php:143
msgid "Show all connections"
msgstr "Mostrar todas las conexiones"
-#: ../../Zotlabs/Module/Connections.php:160
+#: ../../Zotlabs/Module/Connections.php:159
msgid "Only show blocked connections"
msgstr "Mostrar solo las conexiones bloqueadas"
-#: ../../Zotlabs/Module/Connections.php:167
+#: ../../Zotlabs/Module/Connections.php:166
msgid "Only show ignored connections"
msgstr "Mostrar solo conexiones ignoradas"
-#: ../../Zotlabs/Module/Connections.php:174
-msgid "Only show archived connections"
-msgstr "Mostrar solo las conexiones archivadas"
+#: ../../Zotlabs/Module/Connections.php:173
+msgid "Only show archived/unreachable connections"
+msgstr "Mostrar solo las conexiones archivadas o inaccesibles"
-#: ../../Zotlabs/Module/Connections.php:181
+#: ../../Zotlabs/Module/Connections.php:180
msgid "Only show hidden connections"
msgstr "Mostrar solo las conexiones ocultas"
-#: ../../Zotlabs/Module/Connections.php:242
+#: ../../Zotlabs/Module/Connections.php:241
msgid "Pending approval"
msgstr "Pendiente de aprobación"
+#: ../../Zotlabs/Module/Connections.php:242
+msgid "Archived"
+msgstr "Archivadas"
+
+#: ../../Zotlabs/Module/Connections.php:246
+msgid "Not connected at this location"
+msgstr "No está conectado/a en esta ubicación"
+
#: ../../Zotlabs/Module/Connections.php:258
#, php-format
msgid "%1$s [%2$s]"
@@ -4175,61 +4381,56 @@ msgstr "%1$s [%2$s]"
msgid "Edit connection"
msgstr "Editar conexión"
-#: ../../Zotlabs/Module/Connections.php:260
+#: ../../Zotlabs/Module/Connections.php:261
msgid "Delete connection"
msgstr "Eliminar conexión"
-#: ../../Zotlabs/Module/Connections.php:269
+#: ../../Zotlabs/Module/Connections.php:270
msgid "Channel address"
msgstr "Dirección del canal"
-#: ../../Zotlabs/Module/Connections.php:271
+#: ../../Zotlabs/Module/Connections.php:272
msgid "Network"
msgstr "Red"
-#: ../../Zotlabs/Module/Connections.php:274
+#: ../../Zotlabs/Module/Connections.php:275
msgid "Call"
msgstr "Llamar"
-#: ../../Zotlabs/Module/Connections.php:276
+#: ../../Zotlabs/Module/Connections.php:277
msgid "Status"
msgstr "Estado"
-#: ../../Zotlabs/Module/Connections.php:278
+#: ../../Zotlabs/Module/Connections.php:279
msgid "Connected"
msgstr "Conectado/a"
-#: ../../Zotlabs/Module/Connections.php:280
+#: ../../Zotlabs/Module/Connections.php:281
msgid "Approve connection"
msgstr "Aprobar esta conexión"
-#: ../../Zotlabs/Module/Connections.php:282
+#: ../../Zotlabs/Module/Connections.php:283
msgid "Ignore connection"
msgstr "Ignorar esta conexión"
-#: ../../Zotlabs/Module/Connections.php:283
+#: ../../Zotlabs/Module/Connections.php:284
#: ../../Zotlabs/Module/Connedit.php:626
msgid "Ignore"
msgstr "Ignorar"
-#: ../../Zotlabs/Module/Connections.php:284
+#: ../../Zotlabs/Module/Connections.php:285
msgid "Recent activity"
msgstr "Actividad reciente"
-#: ../../Zotlabs/Module/Connections.php:308 ../../Zotlabs/Lib/Apps.php:216
-#: ../../include/text.php:957 ../../include/nav.php:185
-msgid "Connections"
-msgstr "Conexiones"
-
-#: ../../Zotlabs/Module/Connections.php:313
+#: ../../Zotlabs/Module/Connections.php:314
msgid "Search your connections"
msgstr "Buscar sus conexiones"
-#: ../../Zotlabs/Module/Connections.php:314
+#: ../../Zotlabs/Module/Connections.php:315
msgid "Connections search"
msgstr "Buscar conexiones"
-#: ../../Zotlabs/Module/Connections.php:315
+#: ../../Zotlabs/Module/Connections.php:316
#: ../../Zotlabs/Module/Directory.php:391
#: ../../Zotlabs/Module/Directory.php:396 ../../include/contact_widgets.php:23
msgid "Find"
@@ -4243,15 +4444,19 @@ msgstr "elemento"
msgid "Source of Item"
msgstr "Origen del elemento"
-#: ../../Zotlabs/Module/Bookmarks.php:53
+#: ../../Zotlabs/Module/Bookmarks.php:11 ../../Zotlabs/Lib/Apps.php:227
+msgid "View Bookmarks"
+msgstr "Ver los marcadores"
+
+#: ../../Zotlabs/Module/Bookmarks.php:56
msgid "Bookmark added"
msgstr "Marcador añadido"
-#: ../../Zotlabs/Module/Bookmarks.php:76
+#: ../../Zotlabs/Module/Bookmarks.php:79
msgid "My Bookmarks"
msgstr "Mis marcadores"
-#: ../../Zotlabs/Module/Bookmarks.php:87
+#: ../../Zotlabs/Module/Bookmarks.php:90
msgid "My Connections Bookmarks"
msgstr "Marcadores de mis conexiones"
@@ -4295,7 +4500,7 @@ msgstr "Álbum no encontrado."
msgid "Delete Album"
msgstr "Borrar álbum"
-#: ../../Zotlabs/Module/Photos.php:174 ../../Zotlabs/Module/Photos.php:1023
+#: ../../Zotlabs/Module/Photos.php:174 ../../Zotlabs/Module/Photos.php:1025
msgid "Delete Photo"
msgstr "Borrar foto"
@@ -4307,226 +4512,232 @@ msgstr "No hay fotos seleccionadas"
msgid "Access to this item is restricted."
msgstr "El acceso a este elemento está restringido."
-#: ../../Zotlabs/Module/Photos.php:591
+#: ../../Zotlabs/Module/Photos.php:558 ../../Zotlabs/Module/Fbrowser.php:29
+#: ../../Zotlabs/Lib/Apps.php:242 ../../include/conversation.php:1780
+#: ../../include/nav.php:378
+msgid "Photos"
+msgstr "Fotos"
+
+#: ../../Zotlabs/Module/Photos.php:593
#, php-format
msgid "%1$.2f MB of %2$.2f MB photo storage used."
msgstr "%1$.2f MB de %2$.2f MB de almacenamiento de fotos utilizado."
-#: ../../Zotlabs/Module/Photos.php:594
+#: ../../Zotlabs/Module/Photos.php:596
#, php-format
msgid "%1$.2f MB photo storage used."
msgstr "%1$.2f MB de almacenamiento de fotos utilizado."
-#: ../../Zotlabs/Module/Photos.php:636
+#: ../../Zotlabs/Module/Photos.php:638
msgid "Upload Photos"
msgstr "Subir fotos"
-#: ../../Zotlabs/Module/Photos.php:640
+#: ../../Zotlabs/Module/Photos.php:642
msgid "Enter an album name"
msgstr "Introducir un nombre de álbum"
-#: ../../Zotlabs/Module/Photos.php:641
+#: ../../Zotlabs/Module/Photos.php:643
msgid "or select an existing album (doubleclick)"
msgstr "o seleccionar uno existente (doble click)"
-#: ../../Zotlabs/Module/Photos.php:642
+#: ../../Zotlabs/Module/Photos.php:644
msgid "Create a status post for this upload"
msgstr "Crear un mensaje de estado para esta subida"
-#: ../../Zotlabs/Module/Photos.php:643
+#: ../../Zotlabs/Module/Photos.php:645
msgid "Caption (optional):"
msgstr "Título (opcional):"
-#: ../../Zotlabs/Module/Photos.php:644
+#: ../../Zotlabs/Module/Photos.php:646
msgid "Description (optional):"
msgstr "Descripción (opcional):"
-#: ../../Zotlabs/Module/Photos.php:725
+#: ../../Zotlabs/Module/Photos.php:727
msgid "Show Newest First"
msgstr "Mostrar lo más reciente primero"
-#: ../../Zotlabs/Module/Photos.php:727
+#: ../../Zotlabs/Module/Photos.php:729
msgid "Show Oldest First"
msgstr "Mostrar lo más antiguo primero"
-#: ../../Zotlabs/Module/Photos.php:832
+#: ../../Zotlabs/Module/Photos.php:834
msgid "Permission denied. Access to this item may be restricted."
msgstr "Permiso denegado. El acceso a este elemento puede estar restringido."
-#: ../../Zotlabs/Module/Photos.php:834
+#: ../../Zotlabs/Module/Photos.php:836
msgid "Photo not available"
msgstr "Foto no disponible"
-#: ../../Zotlabs/Module/Photos.php:892
+#: ../../Zotlabs/Module/Photos.php:894
msgid "Use as profile photo"
msgstr "Usar como foto del perfil"
-#: ../../Zotlabs/Module/Photos.php:893
+#: ../../Zotlabs/Module/Photos.php:895
msgid "Use as cover photo"
msgstr "Usar como imagen de portada del perfil"
-#: ../../Zotlabs/Module/Photos.php:900
+#: ../../Zotlabs/Module/Photos.php:902
msgid "Private Photo"
msgstr "Foto privada"
-#: ../../Zotlabs/Module/Photos.php:915
+#: ../../Zotlabs/Module/Photos.php:917
msgid "View Full Size"
msgstr "Ver tamaño completo"
-#: ../../Zotlabs/Module/Photos.php:997
+#: ../../Zotlabs/Module/Photos.php:999
msgid "Edit photo"
msgstr "Editar foto"
-#: ../../Zotlabs/Module/Photos.php:999
+#: ../../Zotlabs/Module/Photos.php:1001
msgid "Rotate CW (right)"
msgstr "Girar CW (a la derecha)"
-#: ../../Zotlabs/Module/Photos.php:1000
+#: ../../Zotlabs/Module/Photos.php:1002
msgid "Rotate CCW (left)"
msgstr "Girar CCW (a la izquierda)"
-#: ../../Zotlabs/Module/Photos.php:1003
+#: ../../Zotlabs/Module/Photos.php:1005
msgid "Move photo to album"
msgstr "Mover la foto a un álbum"
-#: ../../Zotlabs/Module/Photos.php:1004
+#: ../../Zotlabs/Module/Photos.php:1006
msgid "Enter a new album name"
msgstr "Introducir un nuevo nombre de álbum"
-#: ../../Zotlabs/Module/Photos.php:1005
+#: ../../Zotlabs/Module/Photos.php:1007
msgid "or select an existing one (doubleclick)"
msgstr "o seleccionar uno (doble click) existente"
-#: ../../Zotlabs/Module/Photos.php:1008
+#: ../../Zotlabs/Module/Photos.php:1010
msgid "Caption"
msgstr "Título"
-#: ../../Zotlabs/Module/Photos.php:1010
+#: ../../Zotlabs/Module/Photos.php:1012
msgid "Add a Tag"
msgstr "Añadir una etiqueta"
-#: ../../Zotlabs/Module/Photos.php:1018
+#: ../../Zotlabs/Module/Photos.php:1020
msgid "Example: @bob, @Barbara_Jensen, @jim@example.com"
msgstr "Ejemplos: @eva, @Carmen_Osuna, @jaime@ejemplo.com"
-#: ../../Zotlabs/Module/Photos.php:1021
+#: ../../Zotlabs/Module/Photos.php:1023
msgid "Flag as adult in album view"
msgstr "Marcar como \"solo para adultos\" en el álbum"
-#: ../../Zotlabs/Module/Photos.php:1040 ../../Zotlabs/Lib/ThreadItem.php:269
+#: ../../Zotlabs/Module/Photos.php:1042 ../../Zotlabs/Lib/ThreadItem.php:267
msgid "I like this (toggle)"
msgstr "Me gusta (cambiar)"
-#: ../../Zotlabs/Module/Photos.php:1041 ../../Zotlabs/Lib/ThreadItem.php:270
+#: ../../Zotlabs/Module/Photos.php:1043 ../../Zotlabs/Lib/ThreadItem.php:268
msgid "I don't like this (toggle)"
msgstr "No me gusta esto (cambiar)"
-#: ../../Zotlabs/Module/Photos.php:1043 ../../Zotlabs/Lib/ThreadItem.php:412
-#: ../../include/conversation.php:739
+#: ../../Zotlabs/Module/Photos.php:1045 ../../Zotlabs/Lib/ThreadItem.php:410
+#: ../../include/conversation.php:736
msgid "Please wait"
msgstr "Espere por favor"
-#: ../../Zotlabs/Module/Photos.php:1059 ../../Zotlabs/Module/Photos.php:1177
-#: ../../Zotlabs/Lib/ThreadItem.php:729
+#: ../../Zotlabs/Module/Photos.php:1061 ../../Zotlabs/Module/Photos.php:1179
+#: ../../Zotlabs/Lib/ThreadItem.php:727
msgid "This is you"
msgstr "Este es usted"
-#: ../../Zotlabs/Module/Photos.php:1061 ../../Zotlabs/Module/Photos.php:1179
-#: ../../Zotlabs/Lib/ThreadItem.php:731 ../../include/js_strings.php:6
+#: ../../Zotlabs/Module/Photos.php:1063 ../../Zotlabs/Module/Photos.php:1181
+#: ../../Zotlabs/Lib/ThreadItem.php:729 ../../include/js_strings.php:6
msgid "Comment"
msgstr "Comentar"
-#: ../../Zotlabs/Module/Photos.php:1077 ../../include/conversation.php:574
+#: ../../Zotlabs/Module/Photos.php:1079 ../../include/conversation.php:569
msgctxt "title"
msgid "Likes"
msgstr "Me gusta"
-#: ../../Zotlabs/Module/Photos.php:1077 ../../include/conversation.php:574
+#: ../../Zotlabs/Module/Photos.php:1079 ../../include/conversation.php:569
msgctxt "title"
msgid "Dislikes"
msgstr "No me gusta"
-#: ../../Zotlabs/Module/Photos.php:1078 ../../include/conversation.php:575
+#: ../../Zotlabs/Module/Photos.php:1080 ../../include/conversation.php:570
msgctxt "title"
msgid "Agree"
msgstr "De acuerdo"
-#: ../../Zotlabs/Module/Photos.php:1078 ../../include/conversation.php:575
+#: ../../Zotlabs/Module/Photos.php:1080 ../../include/conversation.php:570
msgctxt "title"
msgid "Disagree"
msgstr "En desacuerdo"
-#: ../../Zotlabs/Module/Photos.php:1078 ../../include/conversation.php:575
+#: ../../Zotlabs/Module/Photos.php:1080 ../../include/conversation.php:570
msgctxt "title"
msgid "Abstain"
msgstr "Abstención"
-#: ../../Zotlabs/Module/Photos.php:1079 ../../include/conversation.php:576
+#: ../../Zotlabs/Module/Photos.php:1081 ../../include/conversation.php:571
msgctxt "title"
msgid "Attending"
msgstr "Participaré"
-#: ../../Zotlabs/Module/Photos.php:1079 ../../include/conversation.php:576
+#: ../../Zotlabs/Module/Photos.php:1081 ../../include/conversation.php:571
msgctxt "title"
msgid "Not attending"
msgstr "No participaré"
-#: ../../Zotlabs/Module/Photos.php:1079 ../../include/conversation.php:576
+#: ../../Zotlabs/Module/Photos.php:1081 ../../include/conversation.php:571
msgctxt "title"
msgid "Might attend"
msgstr "Quizá participe"
-#: ../../Zotlabs/Module/Photos.php:1096 ../../Zotlabs/Module/Photos.php:1108
+#: ../../Zotlabs/Module/Photos.php:1098 ../../Zotlabs/Module/Photos.php:1110
#: ../../Zotlabs/Lib/ThreadItem.php:187 ../../Zotlabs/Lib/ThreadItem.php:199
msgid "View all"
msgstr "Ver todo"
-#: ../../Zotlabs/Module/Photos.php:1100 ../../Zotlabs/Lib/ThreadItem.php:191
-#: ../../include/conversation.php:1907 ../../include/channel.php:1268
-#: ../../include/taxonomy.php:403
+#: ../../Zotlabs/Module/Photos.php:1102 ../../Zotlabs/Lib/ThreadItem.php:191
+#: ../../include/conversation.php:1904 ../../include/channel.php:1391
+#: ../../include/taxonomy.php:442
msgctxt "noun"
msgid "Like"
msgid_plural "Likes"
msgstr[0] "Me gusta"
msgstr[1] "Me gusta"
-#: ../../Zotlabs/Module/Photos.php:1105 ../../Zotlabs/Lib/ThreadItem.php:196
-#: ../../include/conversation.php:1910
+#: ../../Zotlabs/Module/Photos.php:1107 ../../Zotlabs/Lib/ThreadItem.php:196
+#: ../../include/conversation.php:1907
msgctxt "noun"
msgid "Dislike"
msgid_plural "Dislikes"
msgstr[0] "No me gusta"
msgstr[1] "No me gusta"
-#: ../../Zotlabs/Module/Photos.php:1205
+#: ../../Zotlabs/Module/Photos.php:1207
msgid "Photo Tools"
msgstr "Gestión de las fotos"
-#: ../../Zotlabs/Module/Photos.php:1214
+#: ../../Zotlabs/Module/Photos.php:1216
msgid "In This Photo:"
msgstr "En esta foto:"
-#: ../../Zotlabs/Module/Photos.php:1219
+#: ../../Zotlabs/Module/Photos.php:1221
msgid "Map"
msgstr "Mapa"
-#: ../../Zotlabs/Module/Photos.php:1227 ../../Zotlabs/Lib/ThreadItem.php:401
+#: ../../Zotlabs/Module/Photos.php:1229 ../../Zotlabs/Lib/ThreadItem.php:399
msgctxt "noun"
msgid "Likes"
msgstr "Me gusta"
-#: ../../Zotlabs/Module/Photos.php:1228 ../../Zotlabs/Lib/ThreadItem.php:402
+#: ../../Zotlabs/Module/Photos.php:1230 ../../Zotlabs/Lib/ThreadItem.php:400
msgctxt "noun"
msgid "Dislikes"
msgstr "No me gusta"
-#: ../../Zotlabs/Module/Photos.php:1233 ../../Zotlabs/Lib/ThreadItem.php:407
+#: ../../Zotlabs/Module/Photos.php:1235 ../../Zotlabs/Lib/ThreadItem.php:405
#: ../../include/acl_selectors.php:220
msgid "Close"
msgstr "Cerrar"
-#: ../../Zotlabs/Module/Photos.php:1305 ../../Zotlabs/Module/Photos.php:1318
-#: ../../Zotlabs/Module/Photos.php:1319 ../../include/photos.php:529
+#: ../../Zotlabs/Module/Photos.php:1307 ../../Zotlabs/Module/Photos.php:1320
+#: ../../Zotlabs/Module/Photos.php:1321 ../../include/photos.php:526
msgid "Recent Photos"
msgstr "Fotos recientes"
@@ -4542,163 +4753,169 @@ msgstr "No encontrado"
msgid "Invalid channel"
msgstr "Canal no válido"
-#: ../../Zotlabs/Module/Wiki.php:160 ../../addon/gitwiki/Mod_Gitwiki.php:146
-#: ../../include/conversation.php:1854 ../../include/nav.php:462
+#: ../../Zotlabs/Module/Wiki.php:79 ../../Zotlabs/Lib/Apps.php:239
+#: ../../include/conversation.php:1854 ../../include/features.php:95
+#: ../../include/nav.php:451
+msgid "Wiki"
+msgstr "Wiki"
+
+#: ../../Zotlabs/Module/Wiki.php:162 ../../addon/gitwiki/Mod_Gitwiki.php:146
+#: ../../include/conversation.php:1851 ../../include/nav.php:448
msgid "Wikis"
msgstr "Wikis"
-#: ../../Zotlabs/Module/Wiki.php:166 ../../addon/gitwiki/Mod_Gitwiki.php:152
+#: ../../Zotlabs/Module/Wiki.php:168 ../../addon/gitwiki/Mod_Gitwiki.php:152
msgid "Download"
msgstr "Descargar"
-#: ../../Zotlabs/Module/Wiki.php:168 ../../Zotlabs/Module/Chat.php:254
-#: ../../Zotlabs/Module/Profiles.php:834 ../../Zotlabs/Module/Manage.php:143
+#: ../../Zotlabs/Module/Wiki.php:170 ../../Zotlabs/Module/Chat.php:256
+#: ../../Zotlabs/Module/Profiles.php:834 ../../Zotlabs/Module/Manage.php:145
#: ../../addon/gitwiki/Mod_Gitwiki.php:154
msgid "Create New"
msgstr "Crear"
-#: ../../Zotlabs/Module/Wiki.php:170 ../../addon/gitwiki/Mod_Gitwiki.php:156
+#: ../../Zotlabs/Module/Wiki.php:172 ../../addon/gitwiki/Mod_Gitwiki.php:156
msgid "Wiki name"
msgstr "Nombre del wiki"
-#: ../../Zotlabs/Module/Wiki.php:171 ../../addon/gitwiki/Mod_Gitwiki.php:157
+#: ../../Zotlabs/Module/Wiki.php:173 ../../addon/gitwiki/Mod_Gitwiki.php:157
msgid "Content type"
msgstr "Tipo de contenido"
-#: ../../Zotlabs/Module/Wiki.php:173 ../../Zotlabs/Storage/Browser.php:234
+#: ../../Zotlabs/Module/Wiki.php:175 ../../Zotlabs/Storage/Browser.php:235
#: ../../addon/gitwiki/Mod_Gitwiki.php:159
msgid "Type"
msgstr "Tipo"
-#: ../../Zotlabs/Module/Wiki.php:180 ../../addon/gitwiki/Mod_Gitwiki.php:166
+#: ../../Zotlabs/Module/Wiki.php:182 ../../addon/gitwiki/Mod_Gitwiki.php:166
msgid "Create a status post for this wiki"
msgstr "Crear un mensaje de estado para este wiki"
-#: ../../Zotlabs/Module/Wiki.php:205 ../../addon/gitwiki/Mod_Gitwiki.php:185
+#: ../../Zotlabs/Module/Wiki.php:224 ../../addon/gitwiki/Mod_Gitwiki.php:185
msgid "Wiki not found"
msgstr "Wiki no encontrado"
-#: ../../Zotlabs/Module/Wiki.php:229 ../../addon/gitwiki/Mod_Gitwiki.php:210
+#: ../../Zotlabs/Module/Wiki.php:248 ../../addon/gitwiki/Mod_Gitwiki.php:210
msgid "Rename page"
msgstr "Renombrar la página"
-#: ../../Zotlabs/Module/Wiki.php:233 ../../addon/gitwiki/Mod_Gitwiki.php:214
+#: ../../Zotlabs/Module/Wiki.php:258 ../../addon/gitwiki/Mod_Gitwiki.php:214
msgid "Error retrieving page content"
msgstr "Error al recuperar el contenido de la página"
-#: ../../Zotlabs/Module/Wiki.php:239
+#: ../../Zotlabs/Module/Wiki.php:264
msgid "New page"
msgstr "Nueva página"
-#: ../../Zotlabs/Module/Wiki.php:263 ../../addon/gitwiki/Mod_Gitwiki.php:242
+#: ../../Zotlabs/Module/Wiki.php:288 ../../addon/gitwiki/Mod_Gitwiki.php:242
msgid "Revision Comparison"
msgstr "Comparación de revisiones"
-#: ../../Zotlabs/Module/Wiki.php:264 ../../addon/gitwiki/Mod_Gitwiki.php:243
+#: ../../Zotlabs/Module/Wiki.php:289 ../../addon/gitwiki/Mod_Gitwiki.php:243
msgid "Revert"
msgstr "Revertir"
-#: ../../Zotlabs/Module/Wiki.php:268
+#: ../../Zotlabs/Module/Wiki.php:293
msgid "Short description of your changes (optional)"
msgstr "Breve descripción de sus cambios (opcional)"
-#: ../../Zotlabs/Module/Wiki.php:275 ../../addon/gitwiki/Mod_Gitwiki.php:252
+#: ../../Zotlabs/Module/Wiki.php:300 ../../addon/gitwiki/Mod_Gitwiki.php:252
msgid "Source"
msgstr "Fuente"
-#: ../../Zotlabs/Module/Wiki.php:283 ../../addon/gitwiki/Mod_Gitwiki.php:260
+#: ../../Zotlabs/Module/Wiki.php:309 ../../addon/gitwiki/Mod_Gitwiki.php:260
msgid "New page name"
msgstr "Nombre de la nueva página"
-#: ../../Zotlabs/Module/Wiki.php:288 ../../addon/gitwiki/Mod_Gitwiki.php:265
-#: ../../include/conversation.php:1232
+#: ../../Zotlabs/Module/Wiki.php:314 ../../addon/gitwiki/Mod_Gitwiki.php:265
+#: ../../include/conversation.php:1229
msgid "Embed image from photo albums"
msgstr "Incluir una imagen de los álbumes de fotos"
-#: ../../Zotlabs/Module/Wiki.php:289 ../../addon/gitwiki/Mod_Gitwiki.php:266
-#: ../../include/conversation.php:1326
+#: ../../Zotlabs/Module/Wiki.php:315 ../../addon/gitwiki/Mod_Gitwiki.php:266
+#: ../../include/conversation.php:1323
msgid "Embed an image from your albums"
msgstr "Incluir una imagen de sus álbumes"
-#: ../../Zotlabs/Module/Wiki.php:291 ../../addon/gitwiki/Mod_Gitwiki.php:268
-#: ../../include/conversation.php:1328 ../../include/conversation.php:1375
+#: ../../Zotlabs/Module/Wiki.php:317 ../../addon/gitwiki/Mod_Gitwiki.php:268
+#: ../../include/conversation.php:1325 ../../include/conversation.php:1372
msgid "OK"
msgstr "OK"
-#: ../../Zotlabs/Module/Wiki.php:292 ../../addon/gitwiki/Mod_Gitwiki.php:269
-#: ../../include/conversation.php:1268
+#: ../../Zotlabs/Module/Wiki.php:318 ../../addon/gitwiki/Mod_Gitwiki.php:269
+#: ../../include/conversation.php:1265
msgid "Choose images to embed"
msgstr "Elegir imágenes para incluir"
-#: ../../Zotlabs/Module/Wiki.php:293 ../../addon/gitwiki/Mod_Gitwiki.php:270
-#: ../../include/conversation.php:1269
+#: ../../Zotlabs/Module/Wiki.php:319 ../../addon/gitwiki/Mod_Gitwiki.php:270
+#: ../../include/conversation.php:1266
msgid "Choose an album"
msgstr "Elegir un álbum"
-#: ../../Zotlabs/Module/Wiki.php:294 ../../addon/gitwiki/Mod_Gitwiki.php:271
+#: ../../Zotlabs/Module/Wiki.php:320 ../../addon/gitwiki/Mod_Gitwiki.php:271
msgid "Choose a different album"
msgstr "Elegir un álbum diferente..."
-#: ../../Zotlabs/Module/Wiki.php:295 ../../addon/gitwiki/Mod_Gitwiki.php:272
-#: ../../include/conversation.php:1271
+#: ../../Zotlabs/Module/Wiki.php:321 ../../addon/gitwiki/Mod_Gitwiki.php:272
+#: ../../include/conversation.php:1268
msgid "Error getting album list"
msgstr "Error al obtener la lista de álbumes"
-#: ../../Zotlabs/Module/Wiki.php:296 ../../addon/gitwiki/Mod_Gitwiki.php:273
-#: ../../include/conversation.php:1272
+#: ../../Zotlabs/Module/Wiki.php:322 ../../addon/gitwiki/Mod_Gitwiki.php:273
+#: ../../include/conversation.php:1269
msgid "Error getting photo link"
msgstr "Error al obtener el enlace de la foto"
-#: ../../Zotlabs/Module/Wiki.php:297 ../../addon/gitwiki/Mod_Gitwiki.php:274
-#: ../../include/conversation.php:1273
+#: ../../Zotlabs/Module/Wiki.php:323 ../../addon/gitwiki/Mod_Gitwiki.php:274
+#: ../../include/conversation.php:1270
msgid "Error getting album"
msgstr "Error al obtener el álbum"
-#: ../../Zotlabs/Module/Wiki.php:364 ../../addon/gitwiki/Mod_Gitwiki.php:337
+#: ../../Zotlabs/Module/Wiki.php:391 ../../addon/gitwiki/Mod_Gitwiki.php:337
msgid "Error creating wiki. Invalid name."
msgstr "Error al crear el wiki: el nombre no es válido."
-#: ../../Zotlabs/Module/Wiki.php:371
+#: ../../Zotlabs/Module/Wiki.php:398
msgid "A wiki with this name already exists."
msgstr "Ya hay un wiki con este nombre."
-#: ../../Zotlabs/Module/Wiki.php:384 ../../addon/gitwiki/Mod_Gitwiki.php:348
+#: ../../Zotlabs/Module/Wiki.php:411 ../../addon/gitwiki/Mod_Gitwiki.php:348
msgid "Wiki created, but error creating Home page."
msgstr "Se ha creado el wiki, pero se ha producido un error al crear la página de inicio."
-#: ../../Zotlabs/Module/Wiki.php:391 ../../addon/gitwiki/Mod_Gitwiki.php:353
+#: ../../Zotlabs/Module/Wiki.php:418 ../../addon/gitwiki/Mod_Gitwiki.php:353
msgid "Error creating wiki"
msgstr "Error al crear el wiki"
-#: ../../Zotlabs/Module/Wiki.php:403
+#: ../../Zotlabs/Module/Wiki.php:430
msgid "Wiki delete permission denied."
msgstr "Se ha denegado el permiso para eliminar el wiki."
-#: ../../Zotlabs/Module/Wiki.php:413
+#: ../../Zotlabs/Module/Wiki.php:440
msgid "Error deleting wiki"
msgstr "Se ha producido un error al eliminar el wiki"
-#: ../../Zotlabs/Module/Wiki.php:439 ../../addon/gitwiki/Mod_Gitwiki.php:400
+#: ../../Zotlabs/Module/Wiki.php:466 ../../addon/gitwiki/Mod_Gitwiki.php:400
msgid "New page created"
msgstr "Se ha creado la nueva página"
-#: ../../Zotlabs/Module/Wiki.php:558
+#: ../../Zotlabs/Module/Wiki.php:587
msgid "Cannot delete Home"
msgstr "No se puede eliminar la página principal"
-#: ../../Zotlabs/Module/Wiki.php:622
+#: ../../Zotlabs/Module/Wiki.php:651
msgid "Current Revision"
msgstr "Revisión actual"
-#: ../../Zotlabs/Module/Wiki.php:622
+#: ../../Zotlabs/Module/Wiki.php:651
msgid "Selected Revision"
msgstr "Revisión seleccionada"
-#: ../../Zotlabs/Module/Wiki.php:672
+#: ../../Zotlabs/Module/Wiki.php:701
msgid "You must be authenticated."
msgstr "Debe estar autenticado."
-#: ../../Zotlabs/Module/Chanview.php:134
+#: ../../Zotlabs/Module/Chanview.php:139
msgid "toggle full screen mode"
msgstr "cambiar al modo de pantalla completa"
@@ -4706,7 +4923,7 @@ msgstr "cambiar al modo de pantalla completa"
msgid "Layout updated."
msgstr "Plantilla actualizada."
-#: ../../Zotlabs/Module/Pdledit.php:34 ../../Zotlabs/Module/Chat.php:217
+#: ../../Zotlabs/Module/Pdledit.php:34 ../../Zotlabs/Module/Chat.php:219
msgid "Feature disabled."
msgstr "Funcionalidad deshabilitada."
@@ -4726,32 +4943,32 @@ msgstr "Nombre del módulo:"
msgid "Layout Help"
msgstr "Ayuda para el diseño de plantillas de página"
-#: ../../Zotlabs/Module/Poke.php:168 ../../Zotlabs/Lib/Apps.php:235
-#: ../../include/conversation.php:1042
+#: ../../Zotlabs/Module/Poke.php:153 ../../Zotlabs/Module/Poke.php:182
+#: ../../Zotlabs/Lib/Apps.php:248 ../../include/conversation.php:1039
msgid "Poke"
msgstr "Toques y otras cosas"
-#: ../../Zotlabs/Module/Poke.php:169
+#: ../../Zotlabs/Module/Poke.php:183
msgid "Poke somebody"
msgstr "Dar un toque a alguien"
-#: ../../Zotlabs/Module/Poke.php:172
+#: ../../Zotlabs/Module/Poke.php:186
msgid "Poke/Prod"
msgstr "Toque/Incitación"
-#: ../../Zotlabs/Module/Poke.php:173
+#: ../../Zotlabs/Module/Poke.php:187
msgid "Poke, prod or do other things to somebody"
msgstr "Dar un toque, incitar o hacer otras cosas a alguien"
-#: ../../Zotlabs/Module/Poke.php:180
+#: ../../Zotlabs/Module/Poke.php:194
msgid "Recipient"
msgstr "Destinatario"
-#: ../../Zotlabs/Module/Poke.php:181
+#: ../../Zotlabs/Module/Poke.php:195
msgid "Choose what you wish to do to recipient"
msgstr "Elegir qué desea enviar al destinatario"
-#: ../../Zotlabs/Module/Poke.php:184 ../../Zotlabs/Module/Poke.php:185
+#: ../../Zotlabs/Module/Poke.php:198 ../../Zotlabs/Module/Poke.php:199
msgid "Make this post private"
msgstr "Convertir en privado este envío"
@@ -4762,7 +4979,7 @@ msgstr "Imagen actualizada, pero el recorte de la imagen ha fallado. "
#: ../../Zotlabs/Module/Profile_photo.php:115
#: ../../Zotlabs/Module/Profile_photo.php:226
-#: ../../include/photo/photo_driver.php:647
+#: ../../include/photo/photo_driver.php:658
msgid "Profile Photos"
msgstr "Fotos del perfil"
@@ -4779,7 +4996,7 @@ msgid ""
msgstr "Recargue la página o limpie el caché del navegador si la nueva foto no se muestra inmediatamente."
#: ../../Zotlabs/Module/Profile_photo.php:203
-#: ../../Zotlabs/Module/Cover_photo.php:173 ../../include/photos.php:149
+#: ../../Zotlabs/Module/Cover_photo.php:173 ../../include/photos.php:145
msgid "Unable to process image"
msgstr "No ha sido posible procesar la imagen"
@@ -4869,64 +5086,68 @@ msgstr "Origen del elemento"
msgid "Unable to locate original post."
msgstr "No ha sido posible encontrar la entrada original."
-#: ../../Zotlabs/Module/Item.php:451
+#: ../../Zotlabs/Module/Item.php:470
msgid "Empty post discarded."
msgstr "La entrada vacía ha sido desechada."
-#: ../../Zotlabs/Module/Item.php:825
+#: ../../Zotlabs/Module/Item.php:844
msgid "Duplicate post suppressed."
msgstr "Se ha suprimido la entrada duplicada."
-#: ../../Zotlabs/Module/Item.php:955
+#: ../../Zotlabs/Module/Item.php:989
msgid "System error. Post not saved."
msgstr "Error del sistema. La entrada no se ha podido salvar."
-#: ../../Zotlabs/Module/Item.php:1085
+#: ../../Zotlabs/Module/Item.php:1025
+msgid "Your comment is awaiting approval."
+msgstr "Su comentario está pendiente de aprobación."
+
+#: ../../Zotlabs/Module/Item.php:1123
msgid "Unable to obtain post information from database."
msgstr "No ha sido posible obtener información de la entrada en la base de datos."
-#: ../../Zotlabs/Module/Item.php:1092
+#: ../../Zotlabs/Module/Item.php:1130
#, php-format
msgid "You have reached your limit of %1$.0f top level posts."
msgstr "Ha alcanzado su límite de %1$.0f entradas en la página principal."
-#: ../../Zotlabs/Module/Item.php:1099
+#: ../../Zotlabs/Module/Item.php:1137
#, php-format
msgid "You have reached your limit of %1$.0f webpages."
msgstr "Ha alcanzado su límite de %1$.0f páginas web."
-#: ../../Zotlabs/Module/Ping.php:254
+#: ../../Zotlabs/Module/Ping.php:280
msgid "sent you a private message"
msgstr "le ha enviado un mensaje privado"
-#: ../../Zotlabs/Module/Ping.php:302
+#: ../../Zotlabs/Module/Ping.php:331
msgid "added your channel"
msgstr "añadió este canal a sus conexiones"
-#: ../../Zotlabs/Module/Ping.php:312
+#: ../../Zotlabs/Module/Ping.php:341
msgid "g A l F d"
msgstr "g A l d F"
-#: ../../Zotlabs/Module/Ping.php:330
+#: ../../Zotlabs/Module/Ping.php:359
msgid "[today]"
msgstr "[hoy]"
-#: ../../Zotlabs/Module/Ping.php:339
+#: ../../Zotlabs/Module/Ping.php:368
msgid "posted an event"
msgstr "publicó un evento"
-#: ../../Zotlabs/Module/Page.php:40 ../../Zotlabs/Module/Block.php:31
+#: ../../Zotlabs/Module/Page.php:39 ../../Zotlabs/Module/Block.php:29
msgid "Invalid item."
msgstr "Elemento no válido."
-#: ../../Zotlabs/Module/Page.php:94 ../../Zotlabs/Module/Block.php:79
+#: ../../Zotlabs/Module/Page.php:128 ../../Zotlabs/Module/Block.php:77
#: ../../Zotlabs/Module/Display.php:122
#: ../../Zotlabs/Lib/NativeWikiPage.php:500 ../../Zotlabs/Web/Router.php:146
#: ../../include/help.php:68
msgid "Page not found."
msgstr "Página no encontrada."
-#: ../../Zotlabs/Module/Page.php:131
+#: ../../Zotlabs/Module/Page.php:165
msgid ""
"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod "
"tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam,"
@@ -4974,9 +5195,9 @@ msgstr "No ha sido posible establecer los parámetros de la libreta de direccion
msgid "Connection has been removed."
msgstr "La conexión ha sido eliminada."
-#: ../../Zotlabs/Module/Connedit.php:590 ../../Zotlabs/Lib/Apps.php:228
+#: ../../Zotlabs/Module/Connedit.php:590 ../../Zotlabs/Lib/Apps.php:241
#: ../../addon/openclipatar/openclipatar.php:57
-#: ../../include/conversation.php:982 ../../include/nav.php:106
+#: ../../include/conversation.php:979 ../../include/nav.php:102
msgid "View Profile"
msgstr "Ver el perfil"
@@ -5126,105 +5347,119 @@ msgstr "Ajustar el perfil"
msgid "Set Affinity & Profile"
msgstr "Ajustar la afinidad y el perfil"
-#: ../../Zotlabs/Module/Connedit.php:844
-msgid "none"
-msgstr "-"
+#: ../../Zotlabs/Module/Connedit.php:851
+msgid "This connection is unreachable from this location."
+msgstr "No se puede acceder a la conexión desde este sitio."
+
+#: ../../Zotlabs/Module/Connedit.php:852
+msgid "This connection may be unreachable from other channel locations."
+msgstr "Esta conexión puede ser inaccesible desde otras ubicaciones del canal."
+
+#: ../../Zotlabs/Module/Connedit.php:854
+msgid "Location independence is not supported by their network."
+msgstr "La independencia de ubicación no es compatible con su red."
+
+#: ../../Zotlabs/Module/Connedit.php:860
+msgid ""
+"This connection is unreachable from this location. Location independence is "
+"not supported by their network."
+msgstr "Esta conexión no es accesible desde este sitio. La independencia de ubicación no es compatible con su red."
-#: ../../Zotlabs/Module/Connedit.php:847
-#: ../../Zotlabs/Widget/Settings_menu.php:107
+#: ../../Zotlabs/Module/Connedit.php:863
+#: ../../Zotlabs/Widget/Settings_menu.php:109
msgid "Connection Default Permissions"
msgstr "Permisos predeterminados de conexión"
-#: ../../Zotlabs/Module/Connedit.php:847 ../../include/items.php:3955
+#: ../../Zotlabs/Module/Connedit.php:863 ../../include/items.php:3925
#, php-format
msgid "Connection: %s"
msgstr "Conexión: %s"
-#: ../../Zotlabs/Module/Connedit.php:848
+#: ../../Zotlabs/Module/Connedit.php:864
msgid "Apply these permissions automatically"
msgstr "Aplicar estos permisos automaticamente"
-#: ../../Zotlabs/Module/Connedit.php:848
+#: ../../Zotlabs/Module/Connedit.php:864
msgid "Connection requests will be approved without your interaction"
msgstr "Las solicitudes de conexión serán aprobadas sin su intervención"
-#: ../../Zotlabs/Module/Connedit.php:849
+#: ../../Zotlabs/Module/Connedit.php:865
msgid "Permission role"
msgstr "Rol de acceso"
-#: ../../Zotlabs/Module/Connedit.php:850
+#: ../../Zotlabs/Module/Connedit.php:866
msgid "Add permission role"
msgstr "Añadir un rol de acceso"
-#: ../../Zotlabs/Module/Connedit.php:856
+#: ../../Zotlabs/Module/Connedit.php:873
msgid "This connection's primary address is"
msgstr "La dirección primaria de esta conexión es"
-#: ../../Zotlabs/Module/Connedit.php:857
+#: ../../Zotlabs/Module/Connedit.php:874
msgid "Available locations:"
msgstr "Ubicaciones disponibles:"
-#: ../../Zotlabs/Module/Connedit.php:861
+#: ../../Zotlabs/Module/Connedit.php:879
msgid ""
"The permissions indicated on this page will be applied to all new "
"connections."
msgstr "Los permisos indicados en esta página serán aplicados en todas las nuevas conexiones."
-#: ../../Zotlabs/Module/Connedit.php:862
+#: ../../Zotlabs/Module/Connedit.php:880
msgid "Connection Tools"
msgstr "Gestión de las conexiones"
-#: ../../Zotlabs/Module/Connedit.php:864
+#: ../../Zotlabs/Module/Connedit.php:882
msgid "Slide to adjust your degree of friendship"
msgstr "Deslizar para ajustar el grado de amistad"
-#: ../../Zotlabs/Module/Connedit.php:865 ../../Zotlabs/Module/Rate.php:155
+#: ../../Zotlabs/Module/Connedit.php:883 ../../Zotlabs/Module/Rate.php:155
#: ../../include/js_strings.php:20
msgid "Rating"
msgstr "Valoración"
-#: ../../Zotlabs/Module/Connedit.php:866
+#: ../../Zotlabs/Module/Connedit.php:884
msgid "Slide to adjust your rating"
msgstr "Deslizar para ajustar su valoración"
-#: ../../Zotlabs/Module/Connedit.php:867 ../../Zotlabs/Module/Connedit.php:872
+#: ../../Zotlabs/Module/Connedit.php:885 ../../Zotlabs/Module/Connedit.php:890
msgid "Optionally explain your rating"
msgstr "Opcionalmente, puede explicar su valoración"
-#: ../../Zotlabs/Module/Connedit.php:869
+#: ../../Zotlabs/Module/Connedit.php:887
msgid "Custom Filter"
msgstr "Filtro personalizado"
-#: ../../Zotlabs/Module/Connedit.php:870
+#: ../../Zotlabs/Module/Connedit.php:888
msgid "Only import posts with this text"
msgstr "Importar solo entradas que contengan este texto"
-#: ../../Zotlabs/Module/Connedit.php:870 ../../Zotlabs/Module/Connedit.php:871
+#: ../../Zotlabs/Module/Connedit.php:888 ../../Zotlabs/Module/Connedit.php:889
msgid ""
"words one per line or #tags or /patterns/ or lang=xx, leave blank to import "
"all posts"
msgstr "Una sola opción por línea: palabras, #etiquetas, /patrones/ o lang=xx. Dejar en blanco para importarlo todo"
-#: ../../Zotlabs/Module/Connedit.php:871
+#: ../../Zotlabs/Module/Connedit.php:889
msgid "Do not import posts with this text"
msgstr "No importar entradas que contengan este texto"
-#: ../../Zotlabs/Module/Connedit.php:873
+#: ../../Zotlabs/Module/Connedit.php:891
msgid "This information is public!"
msgstr "¡Esta información es pública!"
-#: ../../Zotlabs/Module/Connedit.php:878
+#: ../../Zotlabs/Module/Connedit.php:896
msgid "Connection Pending Approval"
msgstr "Conexión pendiente de aprobación"
-#: ../../Zotlabs/Module/Connedit.php:883
+#: ../../Zotlabs/Module/Connedit.php:901
#, php-format
msgid ""
"Please choose the profile you would like to display to %s when viewing your "
"profile securely."
msgstr "Por favor, escoja el perfil que quiere mostrar a %s cuando esté viendo su perfil de forma segura."
-#: ../../Zotlabs/Module/Connedit.php:890
+#: ../../Zotlabs/Module/Connedit.php:908
msgid ""
"Some permissions may be inherited from your channel's <a "
"href=\"settings\"><strong>privacy settings</strong></a>, which have higher "
@@ -5232,173 +5467,85 @@ msgid ""
"they wont have any impact unless the inherited setting changes."
msgstr "Algunos permisos pueden ser heredados de los <a href=\"settings\"><strong>ajustes de privacidad</strong></a> de sus canales, los cuales tienen una prioridad más alta que los ajustes individuales. Puede cambiar estos ajustes aquí, pero no tendrán ningún consecuencia hasta que cambie los ajustes heredados."
-#: ../../Zotlabs/Module/Connedit.php:891
+#: ../../Zotlabs/Module/Connedit.php:909
msgid "Last update:"
msgstr "Última actualización:"
-#: ../../Zotlabs/Module/Connedit.php:900
+#: ../../Zotlabs/Module/Connedit.php:918
msgid "Details"
msgstr "Detalles"
-#: ../../Zotlabs/Module/Connedit.php:903 ../../addon/cdav/Mod_Cdav.php:1137
-msgid "Organisation"
-msgstr "Organización"
-
-#: ../../Zotlabs/Module/Connedit.php:904 ../../addon/cdav/Mod_Cdav.php:1138
-#: ../../include/page_widgets.php:46
-msgid "Title"
-msgstr "Título"
-
-#: ../../Zotlabs/Module/Connedit.php:905 ../../Zotlabs/Module/Profiles.php:789
-#: ../../addon/cdav/Mod_Cdav.php:1139
-msgid "Phone"
-msgstr "Teléfono"
-
-#: ../../Zotlabs/Module/Connedit.php:907 ../../Zotlabs/Module/Profiles.php:791
-#: ../../addon/cdav/Mod_Cdav.php:1141
-msgid "Instant messenger"
-msgstr "Mensajería instantánea"
-
-#: ../../Zotlabs/Module/Connedit.php:908 ../../Zotlabs/Module/Profiles.php:792
-#: ../../addon/cdav/Mod_Cdav.php:1142
-msgid "Website"
-msgstr "Sitio web"
-
-#: ../../Zotlabs/Module/Connedit.php:910 ../../Zotlabs/Module/Profiles.php:794
-#: ../../addon/cdav/Mod_Cdav.php:1144
-msgid "Note"
-msgstr "Nota"
-
-#: ../../Zotlabs/Module/Connedit.php:911 ../../Zotlabs/Module/Profiles.php:795
-#: ../../addon/cdav/Mod_Cdav.php:1145 ../../addon/cdav/cdav.php:270
-#: ../../include/connections.php:668
-msgid "Mobile"
-msgstr "Móvil"
-
-#: ../../Zotlabs/Module/Connedit.php:912 ../../Zotlabs/Module/Profiles.php:796
-#: ../../addon/cdav/Mod_Cdav.php:1146 ../../addon/cdav/cdav.php:271
-#: ../../include/connections.php:669
-msgid "Home"
-msgstr "Inicio"
-
-#: ../../Zotlabs/Module/Connedit.php:913 ../../Zotlabs/Module/Profiles.php:797
-#: ../../addon/cdav/Mod_Cdav.php:1147 ../../addon/cdav/cdav.php:274
-#: ../../include/connections.php:672
-msgid "Work"
-msgstr "Trabajo"
-
-#: ../../Zotlabs/Module/Connedit.php:915 ../../Zotlabs/Module/Profiles.php:799
-#: ../../addon/cdav/Mod_Cdav.php:1149
-#: ../../addon/jappixmini/jappixmini.php:368
-msgid "Add Contact"
-msgstr "Añadir un contacto"
-
-#: ../../Zotlabs/Module/Connedit.php:916 ../../Zotlabs/Module/Profiles.php:800
-#: ../../addon/cdav/Mod_Cdav.php:1150
-msgid "Add Field"
-msgstr "Añadir un campo"
-
-#: ../../Zotlabs/Module/Connedit.php:921 ../../addon/cdav/Mod_Cdav.php:1155
-msgid "P.O. Box"
-msgstr "Buzón de correos"
-
-#: ../../Zotlabs/Module/Connedit.php:922 ../../addon/cdav/Mod_Cdav.php:1156
-msgid "Additional"
-msgstr "Adicional"
-
-#: ../../Zotlabs/Module/Connedit.php:923 ../../addon/cdav/Mod_Cdav.php:1157
-msgid "Street"
-msgstr "Calle"
-
-#: ../../Zotlabs/Module/Connedit.php:924 ../../addon/cdav/Mod_Cdav.php:1158
-msgid "Locality"
-msgstr "Localidad"
-
-#: ../../Zotlabs/Module/Connedit.php:925 ../../addon/cdav/Mod_Cdav.php:1159
-msgid "Region"
-msgstr "Provincia, región o estado"
-
-#: ../../Zotlabs/Module/Connedit.php:926 ../../addon/cdav/Mod_Cdav.php:1160
-msgid "ZIP Code"
-msgstr "Código postal"
-
-#: ../../Zotlabs/Module/Connedit.php:927 ../../Zotlabs/Module/Profiles.php:760
-#: ../../addon/cdav/Mod_Cdav.php:1161
-msgid "Country"
-msgstr "País"
+#: ../../Zotlabs/Module/Chat.php:94 ../../Zotlabs/Lib/Apps.php:228
+msgid "My Chatrooms"
+msgstr "Mis salas de chat"
-#: ../../Zotlabs/Module/Chat.php:179
+#: ../../Zotlabs/Module/Chat.php:181
msgid "Room not found"
msgstr "Sala no encontrada"
-#: ../../Zotlabs/Module/Chat.php:195
+#: ../../Zotlabs/Module/Chat.php:197
msgid "Leave Room"
msgstr "Abandonar la sala"
-#: ../../Zotlabs/Module/Chat.php:196
+#: ../../Zotlabs/Module/Chat.php:198
msgid "Delete Room"
msgstr "Eliminar esta sala"
-#: ../../Zotlabs/Module/Chat.php:197
+#: ../../Zotlabs/Module/Chat.php:199
msgid "I am away right now"
msgstr "Estoy ausente momentáneamente"
-#: ../../Zotlabs/Module/Chat.php:198
+#: ../../Zotlabs/Module/Chat.php:200
msgid "I am online"
msgstr "Estoy conectado/a"
-#: ../../Zotlabs/Module/Chat.php:200
+#: ../../Zotlabs/Module/Chat.php:202
msgid "Bookmark this room"
msgstr "Añadir esta sala a Marcadores"
-#: ../../Zotlabs/Module/Chat.php:203 ../../Zotlabs/Module/Mail.php:259
-#: ../../Zotlabs/Module/Mail.php:380 ../../include/conversation.php:1263
+#: ../../Zotlabs/Module/Chat.php:205 ../../Zotlabs/Module/Mail.php:241
+#: ../../Zotlabs/Module/Mail.php:362 ../../include/conversation.php:1260
msgid "Please enter a link URL:"
msgstr "Por favor, introduzca la dirección del enlace:"
-#: ../../Zotlabs/Module/Chat.php:204 ../../Zotlabs/Module/Mail.php:312
-#: ../../Zotlabs/Module/Mail.php:454 ../../Zotlabs/Lib/ThreadItem.php:744
-#: ../../include/conversation.php:1373
+#: ../../Zotlabs/Module/Chat.php:206 ../../Zotlabs/Module/Mail.php:294
+#: ../../Zotlabs/Module/Mail.php:436 ../../Zotlabs/Lib/ThreadItem.php:742
+#: ../../include/conversation.php:1370
msgid "Encrypt text"
msgstr "Cifrar texto"
-#: ../../Zotlabs/Module/Chat.php:230
+#: ../../Zotlabs/Module/Chat.php:232
msgid "New Chatroom"
msgstr "Nueva sala de chat"
-#: ../../Zotlabs/Module/Chat.php:231
+#: ../../Zotlabs/Module/Chat.php:233
msgid "Chatroom name"
msgstr "Nombre de la sala de chat"
-#: ../../Zotlabs/Module/Chat.php:232
+#: ../../Zotlabs/Module/Chat.php:234
msgid "Expiration of chats (minutes)"
msgstr "Caducidad de los mensajes en los chats (en minutos)"
-#: ../../Zotlabs/Module/Chat.php:248
+#: ../../Zotlabs/Module/Chat.php:250
#, php-format
msgid "%1$s's Chatrooms"
msgstr "Salas de chat de %1$s"
-#: ../../Zotlabs/Module/Chat.php:253
+#: ../../Zotlabs/Module/Chat.php:255
msgid "No chatrooms available"
msgstr "No hay salas de chat disponibles"
-#: ../../Zotlabs/Module/Chat.php:257
+#: ../../Zotlabs/Module/Chat.php:259
msgid "Expiration"
msgstr "Caducidad"
-#: ../../Zotlabs/Module/Chat.php:258
+#: ../../Zotlabs/Module/Chat.php:260
msgid "min"
msgstr "min"
-#: ../../Zotlabs/Module/Fbrowser.php:29 ../../Zotlabs/Lib/Apps.php:229
-#: ../../include/conversation.php:1783 ../../include/nav.php:392
-msgid "Photos"
-msgstr "Fotos"
-
-#: ../../Zotlabs/Module/Fbrowser.php:85 ../../Zotlabs/Lib/Apps.php:224
-#: ../../Zotlabs/Storage/Browser.php:224 ../../include/conversation.php:1791
-#: ../../include/nav.php:400
+#: ../../Zotlabs/Module/Fbrowser.php:85 ../../Zotlabs/Lib/Apps.php:237
+#: ../../Zotlabs/Storage/Browser.php:225 ../../Zotlabs/Storage/Browser.php:247
+#: ../../include/conversation.php:1788 ../../include/nav.php:386
msgid "Files"
msgstr "Ficheros"
@@ -5438,7 +5585,7 @@ msgstr "El menú se puede usar para guardar marcadores"
msgid "Submit and proceed"
msgstr "Enviar y proceder"
-#: ../../Zotlabs/Module/Menu.php:107 ../../include/text.php:2268
+#: ../../Zotlabs/Module/Menu.php:107 ../../include/text.php:2281
msgid "Menus"
msgstr "Menús"
@@ -5490,13 +5637,14 @@ msgstr "El título del menú tal como será visto por los demás"
msgid "Allow bookmarks"
msgstr "Permitir marcadores"
-#: ../../Zotlabs/Module/Layouts.php:184 ../../include/text.php:2269
+#: ../../Zotlabs/Module/Layouts.php:184 ../../include/text.php:2282
msgid "Layouts"
msgstr "Plantillas"
-#: ../../Zotlabs/Module/Layouts.php:186 ../../Zotlabs/Lib/Apps.php:232
-#: ../../include/nav.php:161 ../../include/nav.php:268
-#: ../../include/help.php:55 ../../include/help.php:61
+#: ../../Zotlabs/Module/Layouts.php:186 ../../Zotlabs/Module/Help.php:18
+#: ../../Zotlabs/Lib/Apps.php:245 ../../include/nav.php:157
+#: ../../include/nav.php:264 ../../include/help.php:55
+#: ../../include/help.php:61
msgid "Help"
msgstr "Ayuda"
@@ -5512,12 +5660,13 @@ msgstr "Descripción de la plantilla"
msgid "Download PDL file"
msgstr "Descargar el fichero PDL"
-#: ../../Zotlabs/Module/Tagger.php:55 ../../include/bbcode.php:274
+#: ../../Zotlabs/Module/Tagger.php:55 ../../include/markdown.php:141
+#: ../../include/bbcode.php:334
msgid "post"
msgstr "la entrada"
#: ../../Zotlabs/Module/Tagger.php:57 ../../include/conversation.php:146
-#: ../../include/text.php:1945
+#: ../../include/text.php:1938
msgid "comment"
msgstr "el comentario"
@@ -5549,8 +5698,8 @@ msgstr "El grupo de canales ha sido creado."
msgid "Could not create privacy group."
msgstr "No se puede crear el grupo de canales"
-#: ../../Zotlabs/Module/Group.php:42 ../../Zotlabs/Module/Group.php:141
-#: ../../include/items.php:3922
+#: ../../Zotlabs/Module/Group.php:42 ../../Zotlabs/Module/Group.php:143
+#: ../../include/items.php:3892
msgid "Privacy group not found."
msgstr "Grupo de canales no encontrado."
@@ -5558,39 +5707,39 @@ msgstr "Grupo de canales no encontrado."
msgid "Privacy group updated."
msgstr "Grupo de canales actualizado."
-#: ../../Zotlabs/Module/Group.php:90
+#: ../../Zotlabs/Module/Group.php:92
msgid "Create a group of channels."
msgstr "Crear un grupo de canales."
-#: ../../Zotlabs/Module/Group.php:91 ../../Zotlabs/Module/Group.php:184
+#: ../../Zotlabs/Module/Group.php:93 ../../Zotlabs/Module/Group.php:186
msgid "Privacy group name: "
msgstr "Nombre del grupo de canales:"
-#: ../../Zotlabs/Module/Group.php:93 ../../Zotlabs/Module/Group.php:187
+#: ../../Zotlabs/Module/Group.php:95 ../../Zotlabs/Module/Group.php:189
msgid "Members are visible to other channels"
msgstr "Los miembros son visibles para otros canales"
-#: ../../Zotlabs/Module/Group.php:111
+#: ../../Zotlabs/Module/Group.php:113
msgid "Privacy group removed."
msgstr "Grupo de canales eliminado."
-#: ../../Zotlabs/Module/Group.php:113
+#: ../../Zotlabs/Module/Group.php:115
msgid "Unable to remove privacy group."
msgstr "No se puede eliminar el grupo de canales."
-#: ../../Zotlabs/Module/Group.php:183
+#: ../../Zotlabs/Module/Group.php:185
msgid "Privacy group editor"
msgstr "Editor de grupos de canales"
-#: ../../Zotlabs/Module/Group.php:197 ../../Zotlabs/Module/Help.php:81
+#: ../../Zotlabs/Module/Group.php:199 ../../Zotlabs/Module/Help.php:81
msgid "Members"
msgstr "Miembros"
-#: ../../Zotlabs/Module/Group.php:199
+#: ../../Zotlabs/Module/Group.php:201
msgid "All Connected Channels"
msgstr "Todos los canales conectados"
-#: ../../Zotlabs/Module/Group.php:231
+#: ../../Zotlabs/Module/Group.php:233
msgid "Click on a channel to add or remove."
msgstr "Haga clic en un canal para agregarlo o quitarlo."
@@ -5685,7 +5834,7 @@ msgid "View this profile"
msgstr "Ver este perfil"
#: ../../Zotlabs/Module/Profiles.php:728 ../../Zotlabs/Module/Profiles.php:827
-#: ../../include/channel.php:1066
+#: ../../include/channel.php:1183
msgid "Edit visibility"
msgstr "Editar visibilidad"
@@ -5697,7 +5846,7 @@ msgstr "Gestión del perfil"
msgid "Change cover photo"
msgstr "Cambiar la imagen de portada del perfil"
-#: ../../Zotlabs/Module/Profiles.php:731 ../../include/channel.php:1037
+#: ../../Zotlabs/Module/Profiles.php:731 ../../include/channel.php:1154
msgid "Change profile photo"
msgstr "Cambiar la foto del perfil"
@@ -5717,7 +5866,7 @@ msgstr "Eliminar este perfil"
msgid "Add profile things"
msgstr "Añadir cosas al perfil"
-#: ../../Zotlabs/Module/Profiles.php:736 ../../include/conversation.php:1657
+#: ../../Zotlabs/Module/Profiles.php:736 ../../include/conversation.php:1654
msgid "Personal"
msgstr "Personales"
@@ -5862,12 +6011,12 @@ msgstr "Mis otros canales"
msgid "Communications"
msgstr "Comunicaciones"
-#: ../../Zotlabs/Module/Profiles.php:823 ../../include/channel.php:1062
+#: ../../Zotlabs/Module/Profiles.php:823 ../../include/channel.php:1179
msgid "Profile Image"
msgstr "Imagen del perfil"
-#: ../../Zotlabs/Module/Profiles.php:833 ../../include/channel.php:1044
-#: ../../include/nav.php:109
+#: ../../Zotlabs/Module/Profiles.php:833 ../../include/channel.php:1161
+#: ../../include/nav.php:105
msgid "Edit Profiles"
msgstr "Editar perfiles"
@@ -5879,42 +6028,42 @@ msgstr "Enlace de la página"
msgid "Edit Webpage"
msgstr "Editar la página web"
-#: ../../Zotlabs/Module/Manage.php:143
+#: ../../Zotlabs/Module/Manage.php:145
msgid "Create a new channel"
msgstr "Crear un nuevo canal"
-#: ../../Zotlabs/Module/Manage.php:168 ../../Zotlabs/Lib/Apps.php:221
-#: ../../include/nav.php:205
+#: ../../Zotlabs/Module/Manage.php:170 ../../Zotlabs/Lib/Apps.php:234
+#: ../../include/nav.php:199
msgid "Channel Manager"
msgstr "Administración de canales"
-#: ../../Zotlabs/Module/Manage.php:169
+#: ../../Zotlabs/Module/Manage.php:171
msgid "Current Channel"
msgstr "Canal actual"
-#: ../../Zotlabs/Module/Manage.php:171
+#: ../../Zotlabs/Module/Manage.php:173
msgid "Switch to one of your channels by selecting it."
msgstr "Cambiar a uno de sus canales seleccionándolo."
-#: ../../Zotlabs/Module/Manage.php:172
+#: ../../Zotlabs/Module/Manage.php:174
msgid "Default Channel"
msgstr "Canal principal"
-#: ../../Zotlabs/Module/Manage.php:173
+#: ../../Zotlabs/Module/Manage.php:175
msgid "Make Default"
msgstr "Convertir en predeterminado"
-#: ../../Zotlabs/Module/Manage.php:176
+#: ../../Zotlabs/Module/Manage.php:178
#, php-format
msgid "%d new messages"
msgstr "%d mensajes nuevos"
-#: ../../Zotlabs/Module/Manage.php:177
+#: ../../Zotlabs/Module/Manage.php:179
#, php-format
msgid "%d new introductions"
msgstr "%d nuevas solicitudes de conexión"
-#: ../../Zotlabs/Module/Manage.php:179
+#: ../../Zotlabs/Module/Manage.php:181
msgid "Delegated Channel"
msgstr "Canal delegado"
@@ -5922,45 +6071,45 @@ msgstr "Canal delegado"
msgid "This directory server requires an access token"
msgstr "El servidor de este directorio necesita un \"token\" de acceso"
-#: ../../Zotlabs/Module/Siteinfo.php:20
+#: ../../Zotlabs/Module/Siteinfo.php:19
msgid "About this site"
msgstr "Acerca de este sitio"
-#: ../../Zotlabs/Module/Siteinfo.php:21
+#: ../../Zotlabs/Module/Siteinfo.php:20
msgid "Site Name"
msgstr "Nombre del sitio"
-#: ../../Zotlabs/Module/Siteinfo.php:25 ../../include/network.php:2025
+#: ../../Zotlabs/Module/Siteinfo.php:24
msgid "Administrator"
msgstr "Administrador"
-#: ../../Zotlabs/Module/Siteinfo.php:27 ../../Zotlabs/Module/Register.php:221
+#: ../../Zotlabs/Module/Siteinfo.php:26 ../../Zotlabs/Module/Register.php:221
msgid "Terms of Service"
msgstr "Términos del servicio"
-#: ../../Zotlabs/Module/Siteinfo.php:28
+#: ../../Zotlabs/Module/Siteinfo.php:27
msgid "Software and Project information"
msgstr "Información sobre el software y el proyecto"
-#: ../../Zotlabs/Module/Siteinfo.php:29
+#: ../../Zotlabs/Module/Siteinfo.php:28
msgid "This site is powered by $Projectname"
msgstr "Este sitio funciona con $Projectname"
-#: ../../Zotlabs/Module/Siteinfo.php:30
+#: ../../Zotlabs/Module/Siteinfo.php:29
msgid ""
"Federated and decentralised networking and identity services provided by Zot"
msgstr "Servicios federados y descentralizados de identidad y redes proporcionados por Zot"
-#: ../../Zotlabs/Module/Siteinfo.php:32
+#: ../../Zotlabs/Module/Siteinfo.php:31
#, php-format
msgid "Version %s"
msgstr "Versión %s"
-#: ../../Zotlabs/Module/Siteinfo.php:33
+#: ../../Zotlabs/Module/Siteinfo.php:32
msgid "Project homepage"
msgstr "Página principal del proyecto"
-#: ../../Zotlabs/Module/Siteinfo.php:34
+#: ../../Zotlabs/Module/Siteinfo.php:33
msgid "Developer homepage"
msgstr "Página principal del desarrollador"
@@ -5969,7 +6118,7 @@ msgid "No ratings"
msgstr "Ninguna valoración"
#: ../../Zotlabs/Module/Ratings.php:97 ../../Zotlabs/Module/Pubsites.php:35
-#: ../../include/conversation.php:1032
+#: ../../include/conversation.php:1029
msgid "Ratings"
msgstr "Valoraciones"
@@ -5985,64 +6134,65 @@ msgstr "Sitio web:"
msgid "Description: "
msgstr "Descripción:"
-#: ../../Zotlabs/Module/Webpages.php:52
+#: ../../Zotlabs/Module/Webpages.php:38 ../../Zotlabs/Module/Webpages.php:237
+#: ../../Zotlabs/Lib/Apps.php:238 ../../include/conversation.php:1838
+#: ../../include/nav.php:435
+msgid "Webpages"
+msgstr "Páginas web"
+
+#: ../../Zotlabs/Module/Webpages.php:54
msgid "Import Webpage Elements"
msgstr "Importar elementos de una página web"
-#: ../../Zotlabs/Module/Webpages.php:53
+#: ../../Zotlabs/Module/Webpages.php:55
msgid "Import selected"
msgstr "Importar elementos seleccionados"
-#: ../../Zotlabs/Module/Webpages.php:76
+#: ../../Zotlabs/Module/Webpages.php:78
msgid "Export Webpage Elements"
msgstr "Exportar elementos de una página web"
-#: ../../Zotlabs/Module/Webpages.php:77
+#: ../../Zotlabs/Module/Webpages.php:79
msgid "Export selected"
msgstr "Exportar los elementos seleccionados"
-#: ../../Zotlabs/Module/Webpages.php:242 ../../Zotlabs/Lib/Apps.php:225
-#: ../../include/conversation.php:1841 ../../include/nav.php:449
-msgid "Webpages"
-msgstr "Páginas web"
-
-#: ../../Zotlabs/Module/Webpages.php:253 ../../include/page_widgets.php:44
+#: ../../Zotlabs/Module/Webpages.php:248
msgid "Actions"
msgstr "Acciones"
-#: ../../Zotlabs/Module/Webpages.php:254 ../../include/page_widgets.php:45
+#: ../../Zotlabs/Module/Webpages.php:249
msgid "Page Link"
msgstr "Vínculo de la página"
-#: ../../Zotlabs/Module/Webpages.php:255
+#: ../../Zotlabs/Module/Webpages.php:250
msgid "Page Title"
msgstr "Título de página"
-#: ../../Zotlabs/Module/Webpages.php:285
+#: ../../Zotlabs/Module/Webpages.php:280
msgid "Invalid file type."
msgstr "Tipo de fichero no válido."
-#: ../../Zotlabs/Module/Webpages.php:297
+#: ../../Zotlabs/Module/Webpages.php:292
msgid "Error opening zip file"
msgstr "Error al abrir el fichero comprimido zip"
-#: ../../Zotlabs/Module/Webpages.php:308
+#: ../../Zotlabs/Module/Webpages.php:303
msgid "Invalid folder path."
msgstr "La ruta de la carpeta no es válida."
-#: ../../Zotlabs/Module/Webpages.php:335
+#: ../../Zotlabs/Module/Webpages.php:330
msgid "No webpage elements detected."
msgstr "No se han detectado elementos de ninguna página web."
-#: ../../Zotlabs/Module/Webpages.php:410
+#: ../../Zotlabs/Module/Webpages.php:405
msgid "Import complete."
msgstr "Importación completada."
-#: ../../Zotlabs/Module/Editpost.php:38
+#: ../../Zotlabs/Module/Editpost.php:38 ../../Zotlabs/Module/Editpost.php:43
msgid "Item is not editable"
msgstr "El elemento no es editable"
-#: ../../Zotlabs/Module/Editpost.php:103 ../../Zotlabs/Module/Rpost.php:138
+#: ../../Zotlabs/Module/Editpost.php:108 ../../Zotlabs/Module/Rpost.php:140
msgid "Edit post"
msgstr "Editar la entrada"
@@ -6128,7 +6278,7 @@ msgid "*"
msgstr "*"
#: ../../Zotlabs/Module/Sources.php:96
-#: ../../Zotlabs/Widget/Settings_menu.php:123 ../../include/features.php:213
+#: ../../Zotlabs/Widget/Settings_menu.php:125 ../../include/features.php:209
msgid "Channel Sources"
msgstr "Orígenes de los contenidos del canal"
@@ -6184,6 +6334,10 @@ msgstr "Fuente eliminada"
msgid "Unable to remove source."
msgstr "No se puede eliminar la fuente."
+#: ../../Zotlabs/Module/Rpost.php:63 ../../Zotlabs/Lib/Apps.php:257
+msgid "Post"
+msgstr "Publicación"
+
#: ../../Zotlabs/Module/Like.php:19
msgid "Like/Dislike"
msgstr "Me gusta/No me gusta"
@@ -6219,55 +6373,59 @@ msgstr "Canal no disponible."
msgid "Previous action reversed."
msgstr "Acción anterior revocada."
-#: ../../Zotlabs/Module/Like.php:419 ../../addon/diaspora/inbound.php:1812
+#: ../../Zotlabs/Module/Like.php:423 ../../addon/diaspora/Receiver.php:1399
#: ../../include/conversation.php:160
#, php-format
msgid "%1$s likes %2$s's %3$s"
msgstr "A %1$s le gusta %3$s de %2$s"
-#: ../../Zotlabs/Module/Like.php:421 ../../include/conversation.php:163
+#: ../../Zotlabs/Module/Like.php:425 ../../include/conversation.php:163
#, php-format
msgid "%1$s doesn't like %2$s's %3$s"
msgstr "A %1$s no le gusta %3$s de %2$s"
-#: ../../Zotlabs/Module/Like.php:423
+#: ../../Zotlabs/Module/Like.php:427
#, php-format
msgid "%1$s agrees with %2$s's %3$s"
msgstr "%3$s de %2$s: %1$s está de acuerdo"
-#: ../../Zotlabs/Module/Like.php:425
+#: ../../Zotlabs/Module/Like.php:429
#, php-format
msgid "%1$s doesn't agree with %2$s's %3$s"
msgstr "%3$s de %2$s: %1$s no está de acuerdo"
-#: ../../Zotlabs/Module/Like.php:427
+#: ../../Zotlabs/Module/Like.php:431
#, php-format
msgid "%1$s abstains from a decision on %2$s's %3$s"
msgstr "%3$s de %2$s: %1$s se abstiene"
-#: ../../Zotlabs/Module/Like.php:429
+#: ../../Zotlabs/Module/Like.php:433
#, php-format
msgid "%1$s is attending %2$s's %3$s"
msgstr "%3$s de %2$s: %1$s participa"
-#: ../../Zotlabs/Module/Like.php:431
+#: ../../Zotlabs/Module/Like.php:435
#, php-format
msgid "%1$s is not attending %2$s's %3$s"
msgstr "%3$s de %2$s: %1$s no participa"
-#: ../../Zotlabs/Module/Like.php:433
+#: ../../Zotlabs/Module/Like.php:437
#, php-format
msgid "%1$s may attend %2$s's %3$s"
msgstr "%3$s de %2$s: %1$s quizá participe"
-#: ../../Zotlabs/Module/Like.php:538
+#: ../../Zotlabs/Module/Like.php:547
msgid "Action completed."
msgstr "Acción completada."
-#: ../../Zotlabs/Module/Like.php:539
+#: ../../Zotlabs/Module/Like.php:548
msgid "Thank you."
msgstr "Gracias."
+#: ../../Zotlabs/Module/Directory.php:80 ../../Zotlabs/Lib/Apps.php:244
+msgid "Directory"
+msgstr "Directorio"
+
#: ../../Zotlabs/Module/Directory.php:245
#, php-format
msgid "%d rating"
@@ -6287,13 +6445,12 @@ msgstr "Estado:"
msgid "Homepage: "
msgstr "Página personal:"
-#: ../../Zotlabs/Module/Directory.php:309 ../../include/channel.php:1293
+#: ../../Zotlabs/Module/Directory.php:309 ../../include/channel.php:1416
msgid "Age:"
msgstr "Edad:"
-#: ../../Zotlabs/Module/Directory.php:314 ../../include/markdown.php:560
-#: ../../include/channel.php:1134 ../../include/event.php:52
-#: ../../include/event.php:84
+#: ../../Zotlabs/Module/Directory.php:314 ../../include/channel.php:1251
+#: ../../include/event.php:52 ../../include/event.php:84
msgid "Location:"
msgstr "Ubicación:"
@@ -6301,18 +6458,18 @@ msgstr "Ubicación:"
msgid "Description:"
msgstr "Descripción:"
-#: ../../Zotlabs/Module/Directory.php:325 ../../include/channel.php:1309
+#: ../../Zotlabs/Module/Directory.php:325 ../../include/channel.php:1432
msgid "Hometown:"
msgstr "Lugar de nacimiento:"
-#: ../../Zotlabs/Module/Directory.php:327 ../../include/channel.php:1317
+#: ../../Zotlabs/Module/Directory.php:327 ../../include/channel.php:1440
msgid "About:"
msgstr "Sobre mí:"
-#: ../../Zotlabs/Module/Directory.php:328 ../../Zotlabs/Module/Suggest.php:54
+#: ../../Zotlabs/Module/Directory.php:328 ../../Zotlabs/Module/Suggest.php:56
#: ../../Zotlabs/Widget/Follow.php:32 ../../Zotlabs/Widget/Suggestions.php:44
-#: ../../include/conversation.php:1002 ../../include/channel.php:1119
-#: ../../include/connections.php:110
+#: ../../include/conversation.php:999 ../../include/channel.php:1236
+#: ../../include/connections.php:111
msgid "Connect"
msgstr "Conectar"
@@ -6344,7 +6501,7 @@ msgstr "Directorio local:"
msgid "Finding:"
msgstr "Encontrar:"
-#: ../../Zotlabs/Module/Directory.php:395 ../../Zotlabs/Module/Suggest.php:62
+#: ../../Zotlabs/Module/Directory.php:395 ../../Zotlabs/Module/Suggest.php:64
#: ../../include/contact_widgets.php:24
msgid "Channel Suggestions"
msgstr "Sugerencias de canales"
@@ -6389,13 +6546,18 @@ msgstr "Búsqueda de canales"
msgid "Lookup xchan beginning with (or webbie): "
msgstr "Buscar un canal (o un \"webbie\") que comience por:"
-#: ../../Zotlabs/Module/Suggest.php:37
+#: ../../Zotlabs/Module/Suggest.php:32 ../../Zotlabs/Lib/Apps.php:232
+#: ../../include/features.php:333
+msgid "Suggest Channels"
+msgstr "Sugerir canales"
+
+#: ../../Zotlabs/Module/Suggest.php:39
msgid ""
"No suggestions available. If this is a new site, please try again in 24 "
"hours."
msgstr "No hay sugerencias disponibles. Si es un sitio nuevo, espere 24 horas y pruebe de nuevo."
-#: ../../Zotlabs/Module/Suggest.php:56 ../../Zotlabs/Widget/Suggestions.php:46
+#: ../../Zotlabs/Module/Suggest.php:58 ../../Zotlabs/Widget/Suggestions.php:46
msgid "Ignore/Hide"
msgstr "Ignorar/Ocultar"
@@ -6407,103 +6569,108 @@ msgstr "No se puede encontrar su servidor."
msgid "Post successful."
msgstr "Enviado con éxito."
-#: ../../Zotlabs/Module/Mail.php:65
+#: ../../Zotlabs/Module/Mail.php:73
msgid "Unable to lookup recipient."
msgstr "No se puede asociar a un destinatario."
-#: ../../Zotlabs/Module/Mail.php:72
+#: ../../Zotlabs/Module/Mail.php:80
msgid "Unable to communicate with requested channel."
msgstr "No se puede establecer la comunicación con el canal solicitado."
-#: ../../Zotlabs/Module/Mail.php:79
+#: ../../Zotlabs/Module/Mail.php:87
msgid "Cannot verify requested channel."
msgstr "No se puede verificar el canal solicitado."
-#: ../../Zotlabs/Module/Mail.php:97
+#: ../../Zotlabs/Module/Mail.php:105
msgid "Selected channel has private message restrictions. Send failed."
msgstr "El canal seleccionado tiene restricciones sobre los mensajes privados. El envío falló."
-#: ../../Zotlabs/Module/Mail.php:178
+#: ../../Zotlabs/Module/Mail.php:143 ../../Zotlabs/Lib/Apps.php:246
+#: ../../include/nav.php:187
+msgid "Mail"
+msgstr "Correo"
+
+#: ../../Zotlabs/Module/Mail.php:160
msgid "Messages"
msgstr "Mensajes"
-#: ../../Zotlabs/Module/Mail.php:191
+#: ../../Zotlabs/Module/Mail.php:173
msgid "message"
msgstr "mensaje"
-#: ../../Zotlabs/Module/Mail.php:232
+#: ../../Zotlabs/Module/Mail.php:214
msgid "Message recalled."
msgstr "Mensaje revocado."
-#: ../../Zotlabs/Module/Mail.php:245
+#: ../../Zotlabs/Module/Mail.php:227
msgid "Conversation removed."
msgstr "Conversación eliminada."
-#: ../../Zotlabs/Module/Mail.php:260 ../../Zotlabs/Module/Mail.php:381
+#: ../../Zotlabs/Module/Mail.php:242 ../../Zotlabs/Module/Mail.php:363
msgid "Expires YYYY-MM-DD HH:MM"
msgstr "Caduca YYYY-MM-DD HH:MM"
-#: ../../Zotlabs/Module/Mail.php:288
+#: ../../Zotlabs/Module/Mail.php:270
msgid "Requested channel is not in this network"
msgstr "El canal solicitado no existe en esta red"
-#: ../../Zotlabs/Module/Mail.php:296
+#: ../../Zotlabs/Module/Mail.php:278
msgid "Send Private Message"
msgstr "Enviar un mensaje privado"
-#: ../../Zotlabs/Module/Mail.php:297 ../../Zotlabs/Module/Mail.php:439
+#: ../../Zotlabs/Module/Mail.php:279 ../../Zotlabs/Module/Mail.php:421
msgid "To:"
msgstr "Para:"
-#: ../../Zotlabs/Module/Mail.php:300 ../../Zotlabs/Module/Mail.php:441
+#: ../../Zotlabs/Module/Mail.php:282 ../../Zotlabs/Module/Mail.php:423
msgid "Subject:"
msgstr "Asunto:"
-#: ../../Zotlabs/Module/Mail.php:305 ../../Zotlabs/Module/Mail.php:447
-#: ../../include/conversation.php:1323
+#: ../../Zotlabs/Module/Mail.php:287 ../../Zotlabs/Module/Mail.php:429
+#: ../../include/conversation.php:1320
msgid "Attach file"
msgstr "Adjuntar fichero"
-#: ../../Zotlabs/Module/Mail.php:307
+#: ../../Zotlabs/Module/Mail.php:289
msgid "Send"
msgstr "Enviar"
-#: ../../Zotlabs/Module/Mail.php:310 ../../Zotlabs/Module/Mail.php:452
-#: ../../include/conversation.php:1368
+#: ../../Zotlabs/Module/Mail.php:292 ../../Zotlabs/Module/Mail.php:434
+#: ../../include/conversation.php:1365
msgid "Set expiration date"
msgstr "Configurar fecha de caducidad"
-#: ../../Zotlabs/Module/Mail.php:411
+#: ../../Zotlabs/Module/Mail.php:393
msgid "Delete message"
msgstr "Borrar mensaje"
-#: ../../Zotlabs/Module/Mail.php:412
+#: ../../Zotlabs/Module/Mail.php:394
msgid "Delivery report"
msgstr "Informe de transmisión"
-#: ../../Zotlabs/Module/Mail.php:413
+#: ../../Zotlabs/Module/Mail.php:395
msgid "Recall message"
msgstr "Revocar el mensaje"
-#: ../../Zotlabs/Module/Mail.php:415
+#: ../../Zotlabs/Module/Mail.php:397
msgid "Message has been recalled."
msgstr "El mensaje ha sido revocado."
-#: ../../Zotlabs/Module/Mail.php:432
+#: ../../Zotlabs/Module/Mail.php:414
msgid "Delete Conversation"
msgstr "Eliminar conversación"
-#: ../../Zotlabs/Module/Mail.php:434
+#: ../../Zotlabs/Module/Mail.php:416
msgid ""
"No secure communications available. You <strong>may</strong> be able to "
"respond from the sender's profile page."
msgstr "Comunicación segura no disponible. Pero <strong>puede</strong> responder desde la página del perfil del remitente."
-#: ../../Zotlabs/Module/Mail.php:438
+#: ../../Zotlabs/Module/Mail.php:420
msgid "Send Reply"
msgstr "Responder"
-#: ../../Zotlabs/Module/Mail.php:443
+#: ../../Zotlabs/Module/Mail.php:425
#, php-format
msgid "Your message for %s (%s):"
msgstr "Su mensaje para %s (%s):"
@@ -6545,19 +6712,19 @@ msgstr "Software"
msgid "Rate"
msgstr "Valorar"
-#: ../../Zotlabs/Module/Impel.php:41 ../../include/bbcode.php:203
+#: ../../Zotlabs/Module/Impel.php:41 ../../include/bbcode.php:263
msgid "webpage"
msgstr "página web"
-#: ../../Zotlabs/Module/Impel.php:46 ../../include/bbcode.php:209
+#: ../../Zotlabs/Module/Impel.php:46 ../../include/bbcode.php:269
msgid "block"
msgstr "bloque"
-#: ../../Zotlabs/Module/Impel.php:51 ../../include/bbcode.php:206
+#: ../../Zotlabs/Module/Impel.php:51 ../../include/bbcode.php:266
msgid "layout"
msgstr "plantilla"
-#: ../../Zotlabs/Module/Impel.php:58 ../../include/bbcode.php:212
+#: ../../Zotlabs/Module/Impel.php:58 ../../include/bbcode.php:272
msgid "menu"
msgstr "menú"
@@ -6599,7 +6766,11 @@ msgstr "o seleccione una (con un doble click)"
msgid "Save to Folder"
msgstr "Guardar en carpeta"
-#: ../../Zotlabs/Module/Probe.php:28 ../../Zotlabs/Module/Probe.php:32
+#: ../../Zotlabs/Module/Probe.php:11 ../../Zotlabs/Lib/Apps.php:231
+msgid "Remote Diagnostics"
+msgstr "Diagnóstico remoto"
+
+#: ../../Zotlabs/Module/Probe.php:30 ../../Zotlabs/Module/Probe.php:34
#, php-format
msgid "Fetching URL returns error: %1$s"
msgstr "Al intentar obtener la dirección, retorna el error: %1$s"
@@ -6683,16 +6854,16 @@ msgstr "no"
msgid "yes"
msgstr "sí"
-#: ../../Zotlabs/Module/Register.php:258
+#: ../../Zotlabs/Module/Register.php:256
msgid "Membership on this site is by invitation only."
msgstr "Para registrarse en este sitio es necesaria una invitación."
-#: ../../Zotlabs/Module/Register.php:270 ../../boot.php:1610
-#: ../../include/nav.php:149
+#: ../../Zotlabs/Module/Register.php:268 ../../boot.php:1582
+#: ../../include/nav.php:145
msgid "Register"
msgstr "Registrarse"
-#: ../../Zotlabs/Module/Register.php:271
+#: ../../Zotlabs/Module/Register.php:269
msgid ""
"This site may require email verification after submitting this form. If you "
"are returned to a login page, please check your email for instructions."
@@ -6703,30 +6874,30 @@ msgstr "Este sitio puede requerir una verificación de correo electrónico despu
msgid "Cover Photos"
msgstr "Imágenes de portada del perfil"
-#: ../../Zotlabs/Module/Cover_photo.php:237 ../../include/items.php:4303
+#: ../../Zotlabs/Module/Cover_photo.php:237 ../../include/items.php:4273
msgid "female"
msgstr "mujer"
-#: ../../Zotlabs/Module/Cover_photo.php:238 ../../include/items.php:4304
+#: ../../Zotlabs/Module/Cover_photo.php:238 ../../include/items.php:4274
#, php-format
msgid "%1$s updated her %2$s"
msgstr "%1$s ha actualizado su %2$s"
-#: ../../Zotlabs/Module/Cover_photo.php:239 ../../include/items.php:4305
+#: ../../Zotlabs/Module/Cover_photo.php:239 ../../include/items.php:4275
msgid "male"
msgstr "hombre"
-#: ../../Zotlabs/Module/Cover_photo.php:240 ../../include/items.php:4306
+#: ../../Zotlabs/Module/Cover_photo.php:240 ../../include/items.php:4276
#, php-format
msgid "%1$s updated his %2$s"
msgstr "%1$s ha actualizado su %2$s"
-#: ../../Zotlabs/Module/Cover_photo.php:242 ../../include/items.php:4308
+#: ../../Zotlabs/Module/Cover_photo.php:242 ../../include/items.php:4278
#, php-format
msgid "%1$s updated their %2$s"
msgstr "%1$s ha actualizado su %2$s"
-#: ../../Zotlabs/Module/Cover_photo.php:244 ../../include/channel.php:1759
+#: ../../Zotlabs/Module/Cover_photo.php:244 ../../include/channel.php:1878
msgid "cover photo"
msgstr "Imagen de portada del perfil"
@@ -6738,8 +6909,8 @@ msgstr "Subir imagen de portada del perfil"
msgid "Documentation Search"
msgstr "Búsqueda de Documentación"
-#: ../../Zotlabs/Module/Help.php:80 ../../include/conversation.php:1773
-#: ../../include/nav.php:382
+#: ../../Zotlabs/Module/Help.php:80 ../../include/conversation.php:1770
+#: ../../include/nav.php:368
msgid "About"
msgstr "Mi perfil"
@@ -6791,6 +6962,10 @@ msgstr "foro"
msgid "Search Results For:"
msgstr "Buscar resultados para:"
+#: ../../Zotlabs/Module/Network.php:157 ../../Zotlabs/Lib/Apps.php:235
+msgid "Activity"
+msgstr "Actividad"
+
#: ../../Zotlabs/Module/Network.php:221
msgid "Privacy group is empty"
msgstr "El grupo de canales está vacío"
@@ -6825,49 +7000,50 @@ msgstr "$Projectname"
msgid "Welcome to %s"
msgstr "Bienvenido a %s"
-#: ../../Zotlabs/Module/Filestorage.php:87
+#: ../../Zotlabs/Module/Filestorage.php:79
msgid "Permission Denied."
msgstr "Permiso denegado"
-#: ../../Zotlabs/Module/Filestorage.php:103
+#: ../../Zotlabs/Module/Filestorage.php:95
msgid "File not found."
msgstr "Fichero no encontrado."
-#: ../../Zotlabs/Module/Filestorage.php:146
+#: ../../Zotlabs/Module/Filestorage.php:137
msgid "Edit file permissions"
msgstr "Modificar los permisos del fichero"
-#: ../../Zotlabs/Module/Filestorage.php:159
+#: ../../Zotlabs/Module/Filestorage.php:149
msgid "Set/edit permissions"
msgstr "Establecer/editar los permisos"
-#: ../../Zotlabs/Module/Filestorage.php:160
+#: ../../Zotlabs/Module/Filestorage.php:150
msgid "Include all files and sub folders"
msgstr "Incluir todos los ficheros y subcarpetas"
-#: ../../Zotlabs/Module/Filestorage.php:161
+#: ../../Zotlabs/Module/Filestorage.php:151
msgid "Return to file list"
msgstr "Volver a la lista de ficheros"
-#: ../../Zotlabs/Module/Filestorage.php:163
+#: ../../Zotlabs/Module/Filestorage.php:153
msgid "Copy/paste this code to attach file to a post"
msgstr "Copiar/pegar este código para adjuntar el fichero al envío"
-#: ../../Zotlabs/Module/Filestorage.php:164
+#: ../../Zotlabs/Module/Filestorage.php:154
msgid "Copy/paste this URL to link file from a web page"
msgstr "Copiar/pegar esta dirección para enlazar el fichero desde una página web"
-#: ../../Zotlabs/Module/Filestorage.php:166
+#: ../../Zotlabs/Module/Filestorage.php:156
msgid "Share this file"
msgstr "Compartir este fichero"
-#: ../../Zotlabs/Module/Filestorage.php:167
+#: ../../Zotlabs/Module/Filestorage.php:157
msgid "Show URL to this file"
msgstr "Mostrar la dirección de este fichero"
-#: ../../Zotlabs/Module/Filestorage.php:168
-msgid "Notify your contacts about this file"
-msgstr "Avisar a sus contactos sobre este fichero"
+#: ../../Zotlabs/Module/Filestorage.php:158
+#: ../../Zotlabs/Storage/Browser.php:351
+msgid "Show in your contacts shared folder"
+msgstr "Mostrar en la carpeta compartida con sus contactos"
#: ../../Zotlabs/Module/Common.php:14
msgid "No channel."
@@ -6894,71 +7070,59 @@ msgstr "Visitar el perfil de %s [%s]"
msgid "View Connections"
msgstr "Ver conexiones"
-#: ../../Zotlabs/Module/Admin.php:94
-msgid "# Accounts"
-msgstr "# Cuentas"
-
-#: ../../Zotlabs/Module/Admin.php:95
-msgid "# blocked accounts"
-msgstr "# cuentas bloqueadas"
-
-#: ../../Zotlabs/Module/Admin.php:96
-msgid "# expired accounts"
-msgstr "# cuentas caducadas"
-
#: ../../Zotlabs/Module/Admin.php:97
-msgid "# expiring accounts"
-msgstr "# cuentas que caducan"
+msgid "Blocked accounts"
+msgstr "Cuentas bloqueadas"
-#: ../../Zotlabs/Module/Admin.php:108
-msgid "# Channels"
-msgstr "# Canales"
+#: ../../Zotlabs/Module/Admin.php:98
+msgid "Expired accounts"
+msgstr "Cuentas caducadas"
-#: ../../Zotlabs/Module/Admin.php:109
-msgid "# primary"
-msgstr "# primario"
+#: ../../Zotlabs/Module/Admin.php:99
+msgid "Expiring accounts"
+msgstr "Cuentas que caducan"
-#: ../../Zotlabs/Module/Admin.php:110
-msgid "# clones"
-msgstr "# clones"
+#: ../../Zotlabs/Module/Admin.php:112
+msgid "Clones"
+msgstr "Clones"
-#: ../../Zotlabs/Module/Admin.php:116
+#: ../../Zotlabs/Module/Admin.php:118
msgid "Message queues"
msgstr "Mensajes en cola"
-#: ../../Zotlabs/Module/Admin.php:133
+#: ../../Zotlabs/Module/Admin.php:132
msgid "Your software should be updated"
msgstr "Debe actualizar su software"
-#: ../../Zotlabs/Module/Admin.php:138
+#: ../../Zotlabs/Module/Admin.php:137
msgid "Summary"
msgstr "Sumario"
-#: ../../Zotlabs/Module/Admin.php:141
+#: ../../Zotlabs/Module/Admin.php:140
msgid "Registered accounts"
msgstr "Cuentas registradas"
-#: ../../Zotlabs/Module/Admin.php:142
+#: ../../Zotlabs/Module/Admin.php:141
msgid "Pending registrations"
msgstr "Registros pendientes"
-#: ../../Zotlabs/Module/Admin.php:143
+#: ../../Zotlabs/Module/Admin.php:142
msgid "Registered channels"
msgstr "Canales registrados"
-#: ../../Zotlabs/Module/Admin.php:144
+#: ../../Zotlabs/Module/Admin.php:143
msgid "Active plugins"
msgstr "Extensiones (plugins) activas"
-#: ../../Zotlabs/Module/Admin.php:145
+#: ../../Zotlabs/Module/Admin.php:144
msgid "Version"
msgstr "Versión"
-#: ../../Zotlabs/Module/Admin.php:146
+#: ../../Zotlabs/Module/Admin.php:145
msgid "Repository version (master)"
msgstr "Versión del repositorio (master)"
-#: ../../Zotlabs/Module/Admin.php:147
+#: ../../Zotlabs/Module/Admin.php:146
msgid "Repository version (dev)"
msgstr "Versión del repositorio (dev)"
@@ -7007,7 +7171,7 @@ msgid ""
"Password reset failed."
msgstr "La solicitud no ha podido ser verificada. (Puede que la haya enviado con anterioridad) El restablecimiento de la contraseña ha fallado."
-#: ../../Zotlabs/Module/Lostpass.php:91 ../../boot.php:1637
+#: ../../Zotlabs/Module/Lostpass.php:91 ../../boot.php:1609
msgid "Password Reset"
msgstr "Restablecer la contraseña"
@@ -7056,121 +7220,91 @@ msgstr "Dirección de correo electrónico"
msgid "Reset"
msgstr "Reiniciar"
-#: ../../Zotlabs/Module/Notifications.php:43 ../../include/nav.php:190
-msgid "Mark all system notifications seen"
-msgstr "Marcar todas las notificaciones del sistema como leídas"
+#: ../../Zotlabs/Module/Notifications.php:43
+#: ../../Zotlabs/Lib/ThreadItem.php:392
+msgid "Mark all seen"
+msgstr "Marcar todo como visto"
+
+#: ../../Zotlabs/Lib/Techlevels.php:10
+msgid "0. Beginner/Basic"
+msgstr "0. Principiante/Básico"
+
+#: ../../Zotlabs/Lib/Techlevels.php:11
+msgid "1. Novice - not skilled but willing to learn"
+msgstr "1. Novicio - no está preparado pero está dispuestos a aprender"
+
+#: ../../Zotlabs/Lib/Techlevels.php:12
+msgid "2. Intermediate - somewhat comfortable"
+msgstr "2. Intermedio - algo cómodo"
+
+#: ../../Zotlabs/Lib/Techlevels.php:13
+msgid "3. Advanced - very comfortable"
+msgstr "3. Avanzado - muy cómodo"
-#: ../../Zotlabs/Lib/Apps.php:212
+#: ../../Zotlabs/Lib/Techlevels.php:14
+msgid "4. Expert - I can write computer code"
+msgstr "4. Experto - Puedo escribir código informático"
+
+#: ../../Zotlabs/Lib/Techlevels.php:15
+msgid "5. Wizard - I probably know more than you do"
+msgstr "5. Asistente - probablemente sé más que tú"
+
+#: ../../Zotlabs/Lib/Apps.php:225
msgid "Site Admin"
msgstr "Administrador del sitio"
-#: ../../Zotlabs/Lib/Apps.php:213 ../../addon/buglink/buglink.php:16
+#: ../../Zotlabs/Lib/Apps.php:226 ../../addon/buglink/buglink.php:16
msgid "Report Bug"
msgstr "Informe de errores"
-#: ../../Zotlabs/Lib/Apps.php:214
-msgid "View Bookmarks"
-msgstr "Ver los marcadores"
-
-#: ../../Zotlabs/Lib/Apps.php:215
-msgid "My Chatrooms"
-msgstr "Mis salas de chat"
-
-#: ../../Zotlabs/Lib/Apps.php:217
+#: ../../Zotlabs/Lib/Apps.php:230
msgid "Firefox Share"
msgstr "Servicio de compartición de Firefox"
-#: ../../Zotlabs/Lib/Apps.php:218
-msgid "Remote Diagnostics"
-msgstr "Diagnóstico remoto"
-
-#: ../../Zotlabs/Lib/Apps.php:219 ../../include/features.php:337
-msgid "Suggest Channels"
-msgstr "Sugerir canales"
-
-#: ../../Zotlabs/Lib/Apps.php:220 ../../boot.php:1629
-#: ../../include/nav.php:117
+#: ../../Zotlabs/Lib/Apps.php:233 ../../boot.php:1601
+#: ../../include/nav.php:113
msgid "Login"
msgstr "Iniciar sesión"
-#: ../../Zotlabs/Lib/Apps.php:222
-msgid "Activity"
-msgstr "Actividad"
-
-#: ../../Zotlabs/Lib/Apps.php:226 ../../include/conversation.php:1857
-#: ../../include/features.php:99 ../../include/nav.php:465
-msgid "Wiki"
-msgstr "Wiki"
-
-#: ../../Zotlabs/Lib/Apps.php:227 ../../include/nav.php:180
-msgid "Channel Home"
-msgstr "Mi canal"
-
-#: ../../Zotlabs/Lib/Apps.php:230 ../../include/conversation.php:1802
-#: ../../include/conversation.php:1805 ../../include/nav.php:200
-#: ../../include/nav.php:411 ../../include/nav.php:414
-msgid "Events"
-msgstr "Eventos"
-
-#: ../../Zotlabs/Lib/Apps.php:231
-msgid "Directory"
-msgstr "Directorio"
-
-#: ../../Zotlabs/Lib/Apps.php:233 ../../include/nav.php:192
-msgid "Mail"
-msgstr "Correo"
-
-#: ../../Zotlabs/Lib/Apps.php:236
+#: ../../Zotlabs/Lib/Apps.php:249
msgid "Chat"
msgstr "Chat"
-#: ../../Zotlabs/Lib/Apps.php:238
+#: ../../Zotlabs/Lib/Apps.php:251
msgid "Probe"
msgstr "Probar"
-#: ../../Zotlabs/Lib/Apps.php:239
+#: ../../Zotlabs/Lib/Apps.php:252
msgid "Suggest"
msgstr "Sugerir"
-#: ../../Zotlabs/Lib/Apps.php:240
+#: ../../Zotlabs/Lib/Apps.php:253
msgid "Random Channel"
msgstr "Canal aleatorio"
-#: ../../Zotlabs/Lib/Apps.php:241
-msgid "Invite"
-msgstr "Invitar"
-
-#: ../../Zotlabs/Lib/Apps.php:242 ../../Zotlabs/Widget/Admin.php:26
+#: ../../Zotlabs/Lib/Apps.php:255 ../../Zotlabs/Widget/Admin.php:26
msgid "Features"
msgstr "Funcionalidades"
-#: ../../Zotlabs/Lib/Apps.php:243 ../../addon/openid/MysqlProvider.php:69
-msgid "Language"
-msgstr "Idioma"
-
-#: ../../Zotlabs/Lib/Apps.php:244
-msgid "Post"
-msgstr "Publicación"
-
-#: ../../Zotlabs/Lib/Apps.php:245 ../../addon/openid/MysqlProvider.php:58
+#: ../../Zotlabs/Lib/Apps.php:258 ../../addon/openid/MysqlProvider.php:58
#: ../../addon/openid/MysqlProvider.php:59
#: ../../addon/openid/MysqlProvider.php:60
msgid "Profile Photo"
msgstr "Foto del perfil"
-#: ../../Zotlabs/Lib/Apps.php:365
+#: ../../Zotlabs/Lib/Apps.php:391
msgid "Purchase"
msgstr "Comprar"
-#: ../../Zotlabs/Lib/Apps.php:369
+#: ../../Zotlabs/Lib/Apps.php:395
msgid "Undelete"
msgstr "Recuperar"
-#: ../../Zotlabs/Lib/Apps.php:374
+#: ../../Zotlabs/Lib/Apps.php:401
msgid "Add to app-tray"
msgstr "Añadir a la bandeja de aplicaciones"
-#: ../../Zotlabs/Lib/Apps.php:375
+#: ../../Zotlabs/Lib/Apps.php:402
msgid "Remove from app-tray"
msgstr "Quitar de la bandeja de aplicaciones"
@@ -7258,8 +7392,8 @@ msgid "Message"
msgstr "Mensaje"
#: ../../Zotlabs/Lib/NativeWikiPage.php:578
-#: ../../addon/gitwiki/gitwiki_backend.php:579 ../../include/bbcode.php:610
-#: ../../include/bbcode.php:756
+#: ../../addon/gitwiki/gitwiki_backend.php:579 ../../include/bbcode.php:667
+#: ../../include/bbcode.php:813
msgid "Different viewers will see this text differently"
msgstr "Visitantes diferentes verán este texto de forma distinta"
@@ -7346,21 +7480,20 @@ msgstr "Sala no encontrada."
msgid "Room is full"
msgstr "La sala está llena."
-#: ../../Zotlabs/Lib/Enotify.php:60 ../../include/network.php:1977
+#: ../../Zotlabs/Lib/Enotify.php:60
msgid "$Projectname Notification"
msgstr "Notificación de $Projectname"
-#: ../../Zotlabs/Lib/Enotify.php:61 ../../addon/diaspora/util.php:218
-#: ../../addon/diaspora/util.php:231 ../../addon/diaspora/p.php:46
-#: ../../include/network.php:1978
+#: ../../Zotlabs/Lib/Enotify.php:61 ../../addon/diaspora/util.php:283
+#: ../../addon/diaspora/util.php:296 ../../addon/diaspora/p.php:46
msgid "$projectname"
msgstr "$projectname"
-#: ../../Zotlabs/Lib/Enotify.php:63 ../../include/network.php:1980
+#: ../../Zotlabs/Lib/Enotify.php:63
msgid "Thank You,"
msgstr "Gracias,"
-#: ../../Zotlabs/Lib/Enotify.php:65 ../../include/network.php:1982
+#: ../../Zotlabs/Lib/Enotify.php:65
#, php-format
msgid "%s Administrator"
msgstr "%s Administrador"
@@ -7394,176 +7527,186 @@ msgstr "un mensaje privado"
msgid "Please visit %s to view and/or reply to your private messages."
msgstr "Por favor visite %s para ver y/o responder a su mensaje privado."
-#: ../../Zotlabs/Lib/Enotify.php:183
+#: ../../Zotlabs/Lib/Enotify.php:184
#, php-format
msgid "%1$s, %2$s commented on [zrl=%3$s]a %4$s[/zrl]"
msgstr "%1$s, %2$s ha comentado [zrl=%3$s]%4$s[/zrl]"
-#: ../../Zotlabs/Lib/Enotify.php:191
+#: ../../Zotlabs/Lib/Enotify.php:192
#, php-format
msgid "%1$s, %2$s commented on [zrl=%3$s]%4$s's %5$s[/zrl]"
msgstr "%1$s, %2$s ha comentado [zrl=%3$s]%5$s de %4$s[/zrl] "
-#: ../../Zotlabs/Lib/Enotify.php:200
+#: ../../Zotlabs/Lib/Enotify.php:201
#, php-format
msgid "%1$s, %2$s commented on [zrl=%3$s]your %4$s[/zrl]"
msgstr "%1$s, %2$s ha comentado [zrl=%3$s]%4$s creado por usted[/zrl]"
-#: ../../Zotlabs/Lib/Enotify.php:211
+#: ../../Zotlabs/Lib/Enotify.php:213
+#, php-format
+msgid "[$Projectname:Notify] Moderated Comment to conversation #%1$d by %2$s"
+msgstr "[$Projectname:Aviso] Comentario moderado en la conversación #%1$d por %2$s"
+
+#: ../../Zotlabs/Lib/Enotify.php:215
#, php-format
msgid "[$Projectname:Notify] Comment to conversation #%1$d by %2$s"
msgstr "[$Projectname:Aviso] Nuevo comentario de %2$s en la conversación #%1$d"
-#: ../../Zotlabs/Lib/Enotify.php:212
+#: ../../Zotlabs/Lib/Enotify.php:216
#, php-format
msgid "%1$s, %2$s commented on an item/conversation you have been following."
msgstr "%1$s, %2$s ha comentado un elemento/conversación que ha estado siguiendo."
-#: ../../Zotlabs/Lib/Enotify.php:215 ../../Zotlabs/Lib/Enotify.php:292
-#: ../../Zotlabs/Lib/Enotify.php:309 ../../Zotlabs/Lib/Enotify.php:335
-#: ../../Zotlabs/Lib/Enotify.php:353 ../../Zotlabs/Lib/Enotify.php:367
+#: ../../Zotlabs/Lib/Enotify.php:219 ../../Zotlabs/Lib/Enotify.php:301
+#: ../../Zotlabs/Lib/Enotify.php:318 ../../Zotlabs/Lib/Enotify.php:344
+#: ../../Zotlabs/Lib/Enotify.php:362 ../../Zotlabs/Lib/Enotify.php:376
#, php-format
msgid "Please visit %s to view and/or reply to the conversation."
msgstr "Para ver o comentar la conversación, visite %s"
-#: ../../Zotlabs/Lib/Enotify.php:273
+#: ../../Zotlabs/Lib/Enotify.php:223 ../../Zotlabs/Lib/Enotify.php:224
+#, php-format
+msgid "Please visit %s to approve or reject this comment."
+msgstr "Por favor, visite %spara aprobar o rechazar este comentario."
+
+#: ../../Zotlabs/Lib/Enotify.php:282
#, php-format
msgid "%1$s, %2$s liked [zrl=%3$s]your %4$s[/zrl]"
msgstr "%1$s, %2$s ha mostrado su agrado por [zrl=%3$s]%4$s creado por usted[/zrl]"
-#: ../../Zotlabs/Lib/Enotify.php:288
+#: ../../Zotlabs/Lib/Enotify.php:297
#, php-format
msgid "[$Projectname:Notify] Like received to conversation #%1$d by %2$s"
msgstr "[$Projectname:Aviso] \"Me gusta\" de %2$s en la conversación #%1$d"
-#: ../../Zotlabs/Lib/Enotify.php:289
+#: ../../Zotlabs/Lib/Enotify.php:298
#, php-format
msgid "%1$s, %2$s liked an item/conversation you created."
msgstr "%1$s, %2$s ha mostrado su agrado por un elemento o conversación que ha creado usted."
-#: ../../Zotlabs/Lib/Enotify.php:300
+#: ../../Zotlabs/Lib/Enotify.php:309
#, php-format
msgid "[$Projectname:Notify] %s posted to your profile wall"
msgstr "[$Projectname:Aviso] %s ha publicado una entrada en su página de inicio del perfil (\"muro\")"
-#: ../../Zotlabs/Lib/Enotify.php:302
+#: ../../Zotlabs/Lib/Enotify.php:311
#, php-format
msgid "%1$s, %2$s posted to your profile wall at %3$s"
msgstr "%1$s, %2$s ha publicado en su página del perfil en %3$s"
-#: ../../Zotlabs/Lib/Enotify.php:304
+#: ../../Zotlabs/Lib/Enotify.php:313
#, php-format
msgid "%1$s, %2$s posted to [zrl=%3$s]your wall[/zrl]"
msgstr "%1$s, %2$s ha publicado en [zrl=%3$s]su página del perfil[/zrl]"
-#: ../../Zotlabs/Lib/Enotify.php:328
+#: ../../Zotlabs/Lib/Enotify.php:337
#, php-format
msgid "[$Projectname:Notify] %s tagged you"
msgstr "[$Projectname:Aviso] %s le ha etiquetado"
-#: ../../Zotlabs/Lib/Enotify.php:329
+#: ../../Zotlabs/Lib/Enotify.php:338
#, php-format
msgid "%1$s, %2$s tagged you at %3$s"
msgstr "%1$s, %2$s le ha etiquetado en %3$s"
-#: ../../Zotlabs/Lib/Enotify.php:330
+#: ../../Zotlabs/Lib/Enotify.php:339
#, php-format
msgid "%1$s, %2$s [zrl=%3$s]tagged you[/zrl]."
msgstr "%1$s, %2$s [zrl=%3$s]le etiquetó[/zrl]."
-#: ../../Zotlabs/Lib/Enotify.php:342
+#: ../../Zotlabs/Lib/Enotify.php:351
#, php-format
msgid "[$Projectname:Notify] %1$s poked you"
msgstr "[$Projectname:Aviso] %1$s le ha dado un toque"
-#: ../../Zotlabs/Lib/Enotify.php:343
+#: ../../Zotlabs/Lib/Enotify.php:352
#, php-format
msgid "%1$s, %2$s poked you at %3$s"
msgstr "%1$s, %2$s le ha dado un toque en %3$s"
-#: ../../Zotlabs/Lib/Enotify.php:344
+#: ../../Zotlabs/Lib/Enotify.php:353
#, php-format
msgid "%1$s, %2$s [zrl=%2$s]poked you[/zrl]."
msgstr "%1$s, %2$s [zrl=%2$s]le ha dado un toque[/zrl]."
-#: ../../Zotlabs/Lib/Enotify.php:360
+#: ../../Zotlabs/Lib/Enotify.php:369
#, php-format
msgid "[$Projectname:Notify] %s tagged your post"
msgstr "[$Projectname:Aviso] %s ha etiquetado su entrada"
-#: ../../Zotlabs/Lib/Enotify.php:361
+#: ../../Zotlabs/Lib/Enotify.php:370
#, php-format
msgid "%1$s, %2$s tagged your post at %3$s"
msgstr "%1$s, %2$s ha etiquetado su publicación en %3$s"
-#: ../../Zotlabs/Lib/Enotify.php:362
+#: ../../Zotlabs/Lib/Enotify.php:371
#, php-format
msgid "%1$s, %2$s tagged [zrl=%3$s]your post[/zrl]"
msgstr "%1$s, %2$s ha etiquetado [zrl=%3$s]su publicación[/zrl]"
-#: ../../Zotlabs/Lib/Enotify.php:374
+#: ../../Zotlabs/Lib/Enotify.php:383
msgid "[$Projectname:Notify] Introduction received"
msgstr "[$Projectname:Aviso] Ha recibido una solicitud de conexión"
-#: ../../Zotlabs/Lib/Enotify.php:375
+#: ../../Zotlabs/Lib/Enotify.php:384
#, php-format
msgid "%1$s, you've received an new connection request from '%2$s' at %3$s"
msgstr "%1$s, ha recibido una nueva solicitud de conexión de '%2$s' en %3$s"
-#: ../../Zotlabs/Lib/Enotify.php:376
+#: ../../Zotlabs/Lib/Enotify.php:385
#, php-format
msgid ""
"%1$s, you've received [zrl=%2$s]a new connection request[/zrl] from %3$s."
msgstr "%1$s, ha recibido [zrl=%2$s]una nueva solicitud de conexión[/zrl] de %3$s."
-#: ../../Zotlabs/Lib/Enotify.php:380 ../../Zotlabs/Lib/Enotify.php:399
+#: ../../Zotlabs/Lib/Enotify.php:389 ../../Zotlabs/Lib/Enotify.php:408
#, php-format
msgid "You may visit their profile at %s"
msgstr "Puede visitar su perfil en %s"
-#: ../../Zotlabs/Lib/Enotify.php:382
+#: ../../Zotlabs/Lib/Enotify.php:391
#, php-format
msgid "Please visit %s to approve or reject the connection request."
msgstr "Por favor, visite %s para permitir o rechazar la solicitad de conexión."
-#: ../../Zotlabs/Lib/Enotify.php:389
+#: ../../Zotlabs/Lib/Enotify.php:398
msgid "[$Projectname:Notify] Friend suggestion received"
msgstr "[$Projectname:Aviso] Ha recibido una sugerencia de conexión"
-#: ../../Zotlabs/Lib/Enotify.php:390
+#: ../../Zotlabs/Lib/Enotify.php:399
#, php-format
msgid "%1$s, you've received a friend suggestion from '%2$s' at %3$s"
msgstr "%1$s, ha recibido una sugerencia de conexión de '%2$s' en %3$s"
-#: ../../Zotlabs/Lib/Enotify.php:391
+#: ../../Zotlabs/Lib/Enotify.php:400
#, php-format
msgid ""
"%1$s, you've received [zrl=%2$s]a friend suggestion[/zrl] for %3$s from "
"%4$s."
msgstr "%1$s, ha recibido [zrl=%2$s]una sugerencia de conexión[/zrl] para %3$s de %4$s."
-#: ../../Zotlabs/Lib/Enotify.php:397
+#: ../../Zotlabs/Lib/Enotify.php:406
msgid "Name:"
msgstr "Nombre:"
-#: ../../Zotlabs/Lib/Enotify.php:398
+#: ../../Zotlabs/Lib/Enotify.php:407
msgid "Photo:"
msgstr "Foto:"
-#: ../../Zotlabs/Lib/Enotify.php:401
+#: ../../Zotlabs/Lib/Enotify.php:410
#, php-format
msgid "Please visit %s to approve or reject the suggestion."
msgstr "Por favor, visite %s para aprobar o rechazar la sugerencia."
-#: ../../Zotlabs/Lib/Enotify.php:620
+#: ../../Zotlabs/Lib/Enotify.php:629
msgid "[$Projectname:Notify]"
msgstr "[$Projectname:Aviso]"
-#: ../../Zotlabs/Lib/Enotify.php:780
+#: ../../Zotlabs/Lib/Enotify.php:789
msgid "created a new post"
msgstr "ha creado una nueva entrada"
-#: ../../Zotlabs/Lib/Enotify.php:781
+#: ../../Zotlabs/Lib/Enotify.php:790
#, php-format
msgid "commented on %s's post"
msgstr "ha comentado la entrada de %s"
@@ -7572,21 +7715,21 @@ msgstr "ha comentado la entrada de %s"
msgid "Wiki files deleted successfully"
msgstr "Se han borrado con éxito los ficheros del wiki"
-#: ../../Zotlabs/Lib/DB_Upgrade.php:93
+#: ../../Zotlabs/Lib/DB_Upgrade.php:95
#, php-format
msgid "Update Error at %s"
msgstr "Error de actualización en %s"
-#: ../../Zotlabs/Lib/DB_Upgrade.php:99
+#: ../../Zotlabs/Lib/DB_Upgrade.php:101
#, php-format
msgid "Update %s failed. See error logs."
msgstr "La actualización %s ha fallado. Mire el informe de errores."
-#: ../../Zotlabs/Lib/ThreadItem.php:96 ../../include/conversation.php:661
+#: ../../Zotlabs/Lib/ThreadItem.php:96 ../../include/conversation.php:656
msgid "Private Message"
msgstr "Mensaje Privado"
-#: ../../Zotlabs/Lib/ThreadItem.php:133 ../../include/conversation.php:653
+#: ../../Zotlabs/Lib/ThreadItem.php:133 ../../include/conversation.php:648
msgid "Select"
msgstr "Seleccionar"
@@ -7630,11 +7773,11 @@ msgstr "Activar o desactivar el estado de entrada preferida"
msgid "starred"
msgstr "preferidas"
-#: ../../Zotlabs/Lib/ThreadItem.php:240 ../../include/conversation.php:668
+#: ../../Zotlabs/Lib/ThreadItem.php:240 ../../include/conversation.php:663
msgid "Message signature validated"
msgstr "Firma de mensaje validada"
-#: ../../Zotlabs/Lib/ThreadItem.php:241 ../../include/conversation.php:669
+#: ../../Zotlabs/Lib/ThreadItem.php:241 ../../include/conversation.php:664
msgid "Message signature incorrect"
msgstr "Firma de mensaje incorrecta"
@@ -7642,135 +7785,143 @@ msgstr "Firma de mensaje incorrecta"
msgid "Add Tag"
msgstr "Añadir etiqueta"
-#: ../../Zotlabs/Lib/ThreadItem.php:269 ../../include/taxonomy.php:316
+#: ../../Zotlabs/Lib/ThreadItem.php:267 ../../include/taxonomy.php:355
msgid "like"
msgstr "me gusta"
-#: ../../Zotlabs/Lib/ThreadItem.php:270 ../../include/taxonomy.php:317
+#: ../../Zotlabs/Lib/ThreadItem.php:268 ../../include/taxonomy.php:356
msgid "dislike"
msgstr "no me gusta"
-#: ../../Zotlabs/Lib/ThreadItem.php:274
+#: ../../Zotlabs/Lib/ThreadItem.php:272
msgid "Share This"
msgstr "Compartir esto"
-#: ../../Zotlabs/Lib/ThreadItem.php:274
+#: ../../Zotlabs/Lib/ThreadItem.php:272
msgid "share"
msgstr "compartir"
-#: ../../Zotlabs/Lib/ThreadItem.php:283
+#: ../../Zotlabs/Lib/ThreadItem.php:281
msgid "Delivery Report"
msgstr "Informe de transmisión"
-#: ../../Zotlabs/Lib/ThreadItem.php:301
+#: ../../Zotlabs/Lib/ThreadItem.php:299
#, php-format
msgid "%d comment"
msgid_plural "%d comments"
msgstr[0] "%d comentario"
msgstr[1] "%d comentarios"
-#: ../../Zotlabs/Lib/ThreadItem.php:330 ../../Zotlabs/Lib/ThreadItem.php:331
+#: ../../Zotlabs/Lib/ThreadItem.php:328 ../../Zotlabs/Lib/ThreadItem.php:329
#, php-format
msgid "View %s's profile - %s"
msgstr "Ver el perfil de %s - %s"
-#: ../../Zotlabs/Lib/ThreadItem.php:334
+#: ../../Zotlabs/Lib/ThreadItem.php:332
msgid "to"
msgstr "a"
-#: ../../Zotlabs/Lib/ThreadItem.php:335
+#: ../../Zotlabs/Lib/ThreadItem.php:333
msgid "via"
msgstr "mediante"
-#: ../../Zotlabs/Lib/ThreadItem.php:336
+#: ../../Zotlabs/Lib/ThreadItem.php:334
msgid "Wall-to-Wall"
msgstr "De página del perfil a página del perfil (de \"muro\" a \"muro\")"
-#: ../../Zotlabs/Lib/ThreadItem.php:337
+#: ../../Zotlabs/Lib/ThreadItem.php:335
msgid "via Wall-To-Wall:"
msgstr "Mediante el procedimiento página del perfil a página del perfil (de \"muro\" a \"muro\")"
-#: ../../Zotlabs/Lib/ThreadItem.php:350 ../../include/conversation.php:718
+#: ../../Zotlabs/Lib/ThreadItem.php:348 ../../include/conversation.php:715
#, php-format
msgid "from %s"
msgstr "desde %s"
-#: ../../Zotlabs/Lib/ThreadItem.php:353 ../../include/conversation.php:721
+#: ../../Zotlabs/Lib/ThreadItem.php:351 ../../include/conversation.php:718
#, php-format
msgid "last edited: %s"
msgstr "último cambio: %s"
-#: ../../Zotlabs/Lib/ThreadItem.php:354 ../../include/conversation.php:722
+#: ../../Zotlabs/Lib/ThreadItem.php:352 ../../include/conversation.php:719
#, php-format
msgid "Expires: %s"
msgstr "Caduca: %s"
-#: ../../Zotlabs/Lib/ThreadItem.php:360
+#: ../../Zotlabs/Lib/ThreadItem.php:358
msgid "Attend"
msgstr "Participar o asistir"
-#: ../../Zotlabs/Lib/ThreadItem.php:361
+#: ../../Zotlabs/Lib/ThreadItem.php:359
msgid "Attendance Options"
msgstr "Opciones de participación o asistencia"
-#: ../../Zotlabs/Lib/ThreadItem.php:362
+#: ../../Zotlabs/Lib/ThreadItem.php:360
msgid "Vote"
msgstr "Votar"
-#: ../../Zotlabs/Lib/ThreadItem.php:363
+#: ../../Zotlabs/Lib/ThreadItem.php:361
msgid "Voting Options"
msgstr "Opciones de votación"
-#: ../../Zotlabs/Lib/ThreadItem.php:384
+#: ../../Zotlabs/Lib/ThreadItem.php:382
#: ../../addon/bookmarker/bookmarker.php:38
msgid "Save Bookmarks"
msgstr "Guardar en Marcadores"
-#: ../../Zotlabs/Lib/ThreadItem.php:385
+#: ../../Zotlabs/Lib/ThreadItem.php:383
msgid "Add to Calendar"
msgstr "Añadir al calendario"
-#: ../../Zotlabs/Lib/ThreadItem.php:394
-msgid "Mark all seen"
-msgstr "Marcar todo como visto"
-
-#: ../../Zotlabs/Lib/ThreadItem.php:443 ../../include/js_strings.php:7
+#: ../../Zotlabs/Lib/ThreadItem.php:441 ../../include/js_strings.php:7
#, php-format
msgid "%s show all"
msgstr "%s mostrar todo"
-#: ../../Zotlabs/Lib/ThreadItem.php:733 ../../include/conversation.php:1318
+#: ../../Zotlabs/Lib/ThreadItem.php:731 ../../include/conversation.php:1315
msgid "Bold"
msgstr "Negrita"
-#: ../../Zotlabs/Lib/ThreadItem.php:734 ../../include/conversation.php:1319
+#: ../../Zotlabs/Lib/ThreadItem.php:732 ../../include/conversation.php:1316
msgid "Italic"
msgstr "Itálico "
-#: ../../Zotlabs/Lib/ThreadItem.php:735 ../../include/conversation.php:1320
+#: ../../Zotlabs/Lib/ThreadItem.php:733 ../../include/conversation.php:1317
msgid "Underline"
msgstr "Subrayar"
-#: ../../Zotlabs/Lib/ThreadItem.php:736 ../../include/conversation.php:1321
+#: ../../Zotlabs/Lib/ThreadItem.php:734 ../../include/conversation.php:1318
msgid "Quote"
msgstr "Citar"
-#: ../../Zotlabs/Lib/ThreadItem.php:737 ../../include/conversation.php:1322
+#: ../../Zotlabs/Lib/ThreadItem.php:735 ../../include/conversation.php:1319
msgid "Code"
msgstr "Código"
-#: ../../Zotlabs/Lib/ThreadItem.php:738
+#: ../../Zotlabs/Lib/ThreadItem.php:736
msgid "Image"
msgstr "Imagen"
-#: ../../Zotlabs/Lib/ThreadItem.php:739
+#: ../../Zotlabs/Lib/ThreadItem.php:737
msgid "Insert Link"
msgstr "Insertar enlace"
-#: ../../Zotlabs/Lib/ThreadItem.php:740
+#: ../../Zotlabs/Lib/ThreadItem.php:738
msgid "Video"
msgstr "Vídeo"
+#: ../../Zotlabs/Lib/ThreadItem.php:747
+msgid "Your full name (required)"
+msgstr "Su nombre completo (requerido)"
+
+#: ../../Zotlabs/Lib/ThreadItem.php:748
+msgid "Your email address (required)"
+msgstr "Su dirección de correo electrónico (requerido)"
+
+#: ../../Zotlabs/Lib/ThreadItem.php:749
+msgid "Your website URL (optional)"
+msgstr "La URL de su sitio web (opcional)"
+
#: ../../Zotlabs/Zot/Auth.php:138
msgid ""
"Remote authentication blocked. You are logged into this site locally. Please"
@@ -7783,72 +7934,72 @@ msgstr "La autenticación desde su servidor está bloqueada. Ha iniciado sesión
msgid "Welcome %s. Remote authentication successful."
msgstr "Bienvenido %s. La identificación desde su servidor se ha llevado a cabo correctamente."
-#: ../../Zotlabs/Storage/Browser.php:106 ../../Zotlabs/Storage/Browser.php:237
+#: ../../Zotlabs/Storage/Browser.php:107 ../../Zotlabs/Storage/Browser.php:238
msgid "parent"
msgstr "padre"
-#: ../../Zotlabs/Storage/Browser.php:130 ../../include/text.php:2679
+#: ../../Zotlabs/Storage/Browser.php:131 ../../include/text.php:2692
msgid "Collection"
msgstr "Colección"
-#: ../../Zotlabs/Storage/Browser.php:133
+#: ../../Zotlabs/Storage/Browser.php:134
msgid "Principal"
msgstr "Principal"
-#: ../../Zotlabs/Storage/Browser.php:136
+#: ../../Zotlabs/Storage/Browser.php:137
msgid "Addressbook"
msgstr "Libreta de direcciones"
-#: ../../Zotlabs/Storage/Browser.php:139
+#: ../../Zotlabs/Storage/Browser.php:140
msgid "Calendar"
msgstr "Calendario"
-#: ../../Zotlabs/Storage/Browser.php:142
+#: ../../Zotlabs/Storage/Browser.php:143
msgid "Schedule Inbox"
msgstr "Programar bandeja de entrada"
-#: ../../Zotlabs/Storage/Browser.php:145
+#: ../../Zotlabs/Storage/Browser.php:146
msgid "Schedule Outbox"
msgstr "Programar bandeja de salida"
-#: ../../Zotlabs/Storage/Browser.php:225
+#: ../../Zotlabs/Storage/Browser.php:226
msgid "Total"
msgstr "Total"
-#: ../../Zotlabs/Storage/Browser.php:227
+#: ../../Zotlabs/Storage/Browser.php:228
msgid "Shared"
msgstr "Compartido"
-#: ../../Zotlabs/Storage/Browser.php:301
+#: ../../Zotlabs/Storage/Browser.php:304
#, php-format
msgid "You are using %1$s of your available file storage."
msgstr "Está usando %1$s de su espacio disponible para ficheros."
-#: ../../Zotlabs/Storage/Browser.php:306
+#: ../../Zotlabs/Storage/Browser.php:309
#, php-format
msgid "You are using %1$s of %2$s available file storage. (%3$s&#37;)"
msgstr "Está usando %1$s de %2$s que tiene a su disposición para ficheros. (%3$s&#37;)"
-#: ../../Zotlabs/Storage/Browser.php:317
+#: ../../Zotlabs/Storage/Browser.php:320
msgid "WARNING:"
msgstr "ATENCIÓN: "
-#: ../../Zotlabs/Storage/Browser.php:327
+#: ../../Zotlabs/Storage/Browser.php:330
msgid ""
"Please use DAV to upload large (video, audio) files.<br>See <a class=\"zrl\""
" href=\"help/member/member_guide#Cloud_Desktop_Clients\">Cloud Desktop "
"Clients</a>"
msgstr "Por favor, use DAV para subir ficheros de gran tamaño (vídeo, audio).<br>Mire en <a class=\"zrl\" href=\"help/member/member_guide#Cloud_Desktop_Clients\">Cloud Desktop Clients</a>"
-#: ../../Zotlabs/Storage/Browser.php:331
+#: ../../Zotlabs/Storage/Browser.php:334
msgid "Create new folder"
msgstr "Crear nueva carpeta"
-#: ../../Zotlabs/Storage/Browser.php:333
+#: ../../Zotlabs/Storage/Browser.php:336
msgid "Upload file"
msgstr "Subir fichero"
-#: ../../Zotlabs/Storage/Browser.php:347
+#: ../../Zotlabs/Storage/Browser.php:350
msgid "Drop files here to immediately upload"
msgstr "Arrastre los ficheros aquí para subirlos de forma inmediata"
@@ -7856,9 +8007,85 @@ msgstr "Arrastre los ficheros aquí para subirlos de forma inmediata"
msgid "Forums"
msgstr "Foros"
+#: ../../Zotlabs/Widget/Cdav.php:37
+msgid "Select Channel"
+msgstr "Seleccionar un canal"
+
+#: ../../Zotlabs/Widget/Cdav.php:42
+msgid "Read-write"
+msgstr "Lectura y escritura"
+
+#: ../../Zotlabs/Widget/Cdav.php:43
+msgid "Read-only"
+msgstr "Sólo lectura"
+
+#: ../../Zotlabs/Widget/Cdav.php:116
+msgid "My Calendars"
+msgstr "Mis calendarios"
+
+#: ../../Zotlabs/Widget/Cdav.php:118
+msgid "Shared Calendars"
+msgstr "Calendarios compartidos"
+
+#: ../../Zotlabs/Widget/Cdav.php:122
+msgid "Share this calendar"
+msgstr "Compartir este calendario"
+
+#: ../../Zotlabs/Widget/Cdav.php:124
+msgid "Calendar name and color"
+msgstr "Nombre y color del calendario"
+
+#: ../../Zotlabs/Widget/Cdav.php:126
+msgid "Create new calendar"
+msgstr "Crear un nuevo calendario"
+
+#: ../../Zotlabs/Widget/Cdav.php:128
+msgid "Calendar Name"
+msgstr "Nombre del calendario"
+
+#: ../../Zotlabs/Widget/Cdav.php:129
+msgid "Calendar Tools"
+msgstr "Gestión de calendarios"
+
+#: ../../Zotlabs/Widget/Cdav.php:130
+msgid "Import calendar"
+msgstr "Importar un calendario"
+
+#: ../../Zotlabs/Widget/Cdav.php:131
+msgid "Select a calendar to import to"
+msgstr "Seleccionar un calendario para importarlo"
+
+#: ../../Zotlabs/Widget/Cdav.php:158
+msgid "Addressbooks"
+msgstr "Agenda de direcciones"
+
+#: ../../Zotlabs/Widget/Cdav.php:160
+msgid "Addressbook name"
+msgstr "Nombre de la agenda"
+
+#: ../../Zotlabs/Widget/Cdav.php:162
+msgid "Create new addressbook"
+msgstr "Crear una nueva agenda de direcciones"
+
+#: ../../Zotlabs/Widget/Cdav.php:163
+msgid "Addressbook Name"
+msgstr "Nombre de la agenda"
+
+#: ../../Zotlabs/Widget/Cdav.php:165
+msgid "Addressbook Tools"
+msgstr "Gestión de agendas de direcciones"
+
+#: ../../Zotlabs/Widget/Cdav.php:166
+msgid "Import addressbook"
+msgstr "Importar una agenda de direcciones"
+
+#: ../../Zotlabs/Widget/Cdav.php:167
+msgid "Select an addressbook to import to"
+msgstr "Seleccionar una agenda para importarla"
+
#: ../../Zotlabs/Widget/Appcategories.php:39
#: ../../Zotlabs/Widget/Tagcloud.php:25 ../../include/contact_widgets.php:91
-#: ../../include/taxonomy.php:188 ../../include/taxonomy.php:270
+#: ../../include/taxonomy.php:227 ../../include/taxonomy.php:309
msgid "Categories"
msgstr "Temas"
@@ -7891,21 +8118,21 @@ msgstr "Menú de correo privado"
msgid "Combined View"
msgstr "Vista combinada"
-#: ../../Zotlabs/Widget/Mailmenu.php:20 ../../include/nav.php:195
+#: ../../Zotlabs/Widget/Mailmenu.php:20 ../../include/nav.php:190
msgid "Inbox"
msgstr "Bandeja de entrada"
-#: ../../Zotlabs/Widget/Mailmenu.php:25 ../../include/nav.php:196
+#: ../../Zotlabs/Widget/Mailmenu.php:25 ../../include/nav.php:191
msgid "Outbox"
msgstr "Bandeja de salida"
-#: ../../Zotlabs/Widget/Mailmenu.php:30 ../../include/nav.php:197
+#: ../../Zotlabs/Widget/Mailmenu.php:30 ../../include/nav.php:192
msgid "New Message"
msgstr "Nuevo mensaje"
#: ../../Zotlabs/Widget/Chatroom_list.php:16
-#: ../../include/conversation.php:1816 ../../include/conversation.php:1819
-#: ../../include/nav.php:425 ../../include/nav.php:428
+#: ../../include/conversation.php:1813 ../../include/conversation.php:1816
+#: ../../include/nav.php:411 ../../include/nav.php:414
msgid "Chatrooms"
msgstr "Salas de chat"
@@ -7956,23 +8183,22 @@ msgid "Archives"
msgstr "Hemeroteca"
#: ../../Zotlabs/Widget/Conversations.php:17
-#: ../../Zotlabs/Widget/Conversations.php:29
-msgid "Conversations"
-msgstr "Conversaciones"
-
-#: ../../Zotlabs/Widget/Conversations.php:21
msgid "Received Messages"
msgstr "Mensajes recibidos"
-#: ../../Zotlabs/Widget/Conversations.php:25
+#: ../../Zotlabs/Widget/Conversations.php:21
msgid "Sent Messages"
msgstr "Enviar mensajes"
-#: ../../Zotlabs/Widget/Conversations.php:39
+#: ../../Zotlabs/Widget/Conversations.php:25
+msgid "Conversations"
+msgstr "Conversaciones"
+
+#: ../../Zotlabs/Widget/Conversations.php:35
msgid "No messages."
msgstr "Sin mensajes."
-#: ../../Zotlabs/Widget/Conversations.php:57
+#: ../../Zotlabs/Widget/Conversations.php:55
msgid "Delete conversation"
msgstr "Eliminar conversación"
@@ -7988,11 +8214,11 @@ msgstr "foto/imagen"
msgid "Remove term"
msgstr "Eliminar término"
-#: ../../Zotlabs/Widget/Savedsearch.php:83 ../../include/features.php:301
+#: ../../Zotlabs/Widget/Savedsearch.php:83 ../../include/features.php:297
msgid "Saved Searches"
msgstr "Búsquedas guardadas"
-#: ../../Zotlabs/Widget/Savedsearch.php:84 ../../include/group.php:336
+#: ../../Zotlabs/Widget/Savedsearch.php:84 ../../include/group.php:337
msgid "add"
msgstr "añadir"
@@ -8000,15 +8226,15 @@ msgstr "añadir"
msgid "Notes"
msgstr "Notas"
-#: ../../Zotlabs/Widget/Wiki_pages.php:54 ../../addon/gitwiki/gitwiki.php:76
+#: ../../Zotlabs/Widget/Wiki_pages.php:52 ../../addon/gitwiki/gitwiki.php:76
msgid "Wiki Pages"
msgstr "Páginas del wiki"
-#: ../../Zotlabs/Widget/Wiki_pages.php:60 ../../addon/gitwiki/gitwiki.php:81
+#: ../../Zotlabs/Widget/Wiki_pages.php:58 ../../addon/gitwiki/gitwiki.php:81
msgid "Add new page"
msgstr "Añadir una nueva página"
-#: ../../Zotlabs/Widget/Wiki_pages.php:61 ../../addon/gitwiki/gitwiki.php:82
+#: ../../Zotlabs/Widget/Wiki_pages.php:59 ../../addon/gitwiki/gitwiki.php:82
msgid "Page name"
msgstr "Nombre de la página"
@@ -8029,7 +8255,7 @@ msgid "See more..."
msgstr "Ver más..."
#: ../../Zotlabs/Widget/Filer.php:28 ../../include/contact_widgets.php:53
-#: ../../include/features.php:390
+#: ../../include/features.php:386
msgid "Saved Folders"
msgstr "Carpetas guardadas"
@@ -8085,15 +8311,15 @@ msgstr "Gestión de ubicaciones (clones) del canal"
msgid "Export channel"
msgstr "Exportar canal"
-#: ../../Zotlabs/Widget/Settings_menu.php:83
+#: ../../Zotlabs/Widget/Settings_menu.php:84
msgid "Connected apps"
msgstr "Aplicaciones (apps) conectadas"
-#: ../../Zotlabs/Widget/Settings_menu.php:98 ../../include/features.php:153
+#: ../../Zotlabs/Widget/Settings_menu.php:100 ../../include/features.php:149
msgid "Permission Groups"
msgstr "Grupos de permisos"
-#: ../../Zotlabs/Widget/Settings_menu.php:115
+#: ../../Zotlabs/Widget/Settings_menu.php:117
msgid "Premium Channel Settings"
msgstr "Configuración del canal premium"
@@ -8105,156 +8331,147 @@ msgstr "Salas de chat preferidas"
msgid "Source channel not found."
msgstr "No se ha encontrado el canal de origen."
-#: ../../boot.php:1162 ../../addon/opensearch/opensearch.php:26
-#, php-format
-msgctxt "opensearch"
-msgid "Search %1$s (%2$s)"
-msgstr "Buscar %1$s (%2$s)"
-
-#: ../../boot.php:1162 ../../addon/opensearch/opensearch.php:28
-msgctxt "opensearch"
-msgid "$Projectname"
-msgstr "$Projectname"
-
-#: ../../boot.php:1609
+#: ../../boot.php:1581
msgid "Create an account to access services and applications"
msgstr "Crear una cuenta para acceder a los servicios y aplicaciones"
-#: ../../boot.php:1628 ../../include/nav.php:103 ../../include/nav.php:127
+#: ../../boot.php:1600 ../../include/nav.php:99 ../../include/nav.php:123
+#: ../../include/nav.php:140
msgid "Logout"
msgstr "Finalizar sesión"
-#: ../../boot.php:1631
+#: ../../boot.php:1603
msgid "Login/Email"
msgstr "Inicio de sesión / Correo electrónico"
-#: ../../boot.php:1632
+#: ../../boot.php:1604
msgid "Password"
msgstr "Contraseña"
-#: ../../boot.php:1633
+#: ../../boot.php:1605
msgid "Remember me"
msgstr "Recordarme"
-#: ../../boot.php:1636
+#: ../../boot.php:1608
msgid "Forgot your password?"
msgstr "¿Olvidó su contraseña?"
-#: ../../boot.php:2174
+#: ../../boot.php:2146
msgid "toggle mobile"
msgstr "cambiar a modo móvil"
-#: ../../boot.php:2327
+#: ../../boot.php:2299
#, php-format
msgid "[$Projectname] Website SSL error for %s"
msgstr "[$Projectname] Error SSL del sitio web en %s"
-#: ../../boot.php:2332
+#: ../../boot.php:2304
msgid "Website SSL certificate is not valid. Please correct."
msgstr "El certificado SSL del sitio web no es válido. Por favor, solucione el problema."
-#: ../../boot.php:2450
+#: ../../boot.php:2423
#, php-format
msgid "[$Projectname] Cron tasks not running on %s"
msgstr "[$Projectname] Las tareas de Cron no están funcionando en %s"
-#: ../../boot.php:2455
+#: ../../boot.php:2428
msgid "Cron/Scheduled tasks not running."
msgstr "Las tareas del Planificador/Cron no están funcionando."
-#: ../../boot.php:2456 ../../include/datetime.php:286
+#: ../../boot.php:2429 ../../include/datetime.php:286
msgid "never"
msgstr "nunca"
-#: ../../view/theme/redbasic/php/config.php:9
+#: ../../view/theme/redbasic/php/config.php:16
+#: ../../view/theme/redbasic/php/config.php:19
msgid "Focus (Hubzilla default)"
msgstr "Focus (predefinido)"
-#: ../../view/theme/redbasic/php/config.php:88
+#: ../../view/theme/redbasic/php/config.php:99
msgid "Theme settings"
msgstr "Ajustes del tema"
-#: ../../view/theme/redbasic/php/config.php:89
+#: ../../view/theme/redbasic/php/config.php:100
msgid "Narrow navbar"
msgstr "Estrechar la barra de navegación"
-#: ../../view/theme/redbasic/php/config.php:90
+#: ../../view/theme/redbasic/php/config.php:101
msgid "Navigation bar background color"
msgstr "Color de fondo de la barra de navegación"
-#: ../../view/theme/redbasic/php/config.php:91
+#: ../../view/theme/redbasic/php/config.php:102
msgid "Navigation bar icon color "
msgstr "Color del icono de la barra de navegación"
-#: ../../view/theme/redbasic/php/config.php:92
+#: ../../view/theme/redbasic/php/config.php:103
msgid "Navigation bar active icon color "
msgstr "Color del icono activo de la barra de navegación"
-#: ../../view/theme/redbasic/php/config.php:93
+#: ../../view/theme/redbasic/php/config.php:104
msgid "Link color"
msgstr "Color del enlace"
-#: ../../view/theme/redbasic/php/config.php:94
+#: ../../view/theme/redbasic/php/config.php:105
msgid "Set font-color for banner"
msgstr "Ajustar el color del tipo de letra para el \"banner\""
-#: ../../view/theme/redbasic/php/config.php:95
+#: ../../view/theme/redbasic/php/config.php:106
msgid "Set the background color"
msgstr "Ajustar el color de fondo"
-#: ../../view/theme/redbasic/php/config.php:96
+#: ../../view/theme/redbasic/php/config.php:107
msgid "Set the background image"
msgstr "Ajustar la imagen de fondo"
-#: ../../view/theme/redbasic/php/config.php:97
+#: ../../view/theme/redbasic/php/config.php:108
msgid "Set the background color of items"
msgstr "Ajustar el color de los elementos de fondo"
-#: ../../view/theme/redbasic/php/config.php:98
+#: ../../view/theme/redbasic/php/config.php:109
msgid "Set the background color of comments"
msgstr "Ajustar el color de fondo de los comentarios"
-#: ../../view/theme/redbasic/php/config.php:99
+#: ../../view/theme/redbasic/php/config.php:110
msgid "Set font-size for the entire application"
msgstr "Ajustar el tamaño de letra para toda la aplicación"
-#: ../../view/theme/redbasic/php/config.php:99
+#: ../../view/theme/redbasic/php/config.php:110
msgid "Examples: 1rem, 100%, 16px"
msgstr "Ejemplos: 1rem, 100%, 16px"
-#: ../../view/theme/redbasic/php/config.php:100
+#: ../../view/theme/redbasic/php/config.php:111
msgid "Set font-color for posts and comments"
msgstr "Establecer el color de la letra para publicaciones y comentarios"
-#: ../../view/theme/redbasic/php/config.php:101
+#: ../../view/theme/redbasic/php/config.php:112
msgid "Set radius of corners"
msgstr "Establecer el radio de curvatura de las esquinas"
-#: ../../view/theme/redbasic/php/config.php:101
+#: ../../view/theme/redbasic/php/config.php:112
msgid "Example: 4px"
msgstr "Ejemplo: 4px"
-#: ../../view/theme/redbasic/php/config.php:102
+#: ../../view/theme/redbasic/php/config.php:113
msgid "Set shadow depth of photos"
msgstr "Ajustar la profundidad de sombras de las fotos"
-#: ../../view/theme/redbasic/php/config.php:103
+#: ../../view/theme/redbasic/php/config.php:114
msgid "Set maximum width of content region in pixel"
msgstr "Ajustar la anchura máxima de la región de contenido, en pixels"
-#: ../../view/theme/redbasic/php/config.php:103
+#: ../../view/theme/redbasic/php/config.php:114
msgid "Leave empty for default width"
msgstr "Dejar en blanco para la anchura predeterminada"
-#: ../../view/theme/redbasic/php/config.php:104
+#: ../../view/theme/redbasic/php/config.php:115
msgid "Left align page content"
msgstr "Alinear a la izquierda el contenido de la página"
-#: ../../view/theme/redbasic/php/config.php:105
+#: ../../view/theme/redbasic/php/config.php:116
msgid "Set size of conversation author photo"
msgstr "Ajustar el tamaño de la foto del autor de la conversación"
-#: ../../view/theme/redbasic/php/config.php:106
+#: ../../view/theme/redbasic/php/config.php:117
msgid "Set size of followup author photos"
msgstr "Ajustar el tamaño de foto de los seguidores del autor"
@@ -8396,232 +8613,43 @@ msgstr "Un ajuste"
msgid "Skeleton Settings"
msgstr "Ajustes de Skeleton"
-#: ../../addon/gnusoc/gnusoc.php:119
+#: ../../addon/gnusoc/gnusoc.php:200
msgid "GNU-Social Protocol Settings updated."
msgstr "Se han actualizado los ajustes del protocolo de GNU-Social."
-#: ../../addon/gnusoc/gnusoc.php:130
+#: ../../addon/gnusoc/gnusoc.php:219
+msgid ""
+"The GNU-Social protocol does not support location independence. Connections "
+"you make within that network may be unreachable from alternate channel "
+"locations."
+msgstr "El protocolo de GNU-Social no admite la independencia de la ubicación. Las\n conexiones que realice dentro de esa red pueden ser inaccesibles desde \nubicaciones de canales alternativos."
+
+#: ../../addon/gnusoc/gnusoc.php:222
msgid "Enable the GNU-Social protocol for this channel"
msgstr "Activar el protocolo de GNU-Social para este canal"
-#: ../../addon/gnusoc/gnusoc.php:134
+#: ../../addon/gnusoc/gnusoc.php:226
msgid "GNU-Social Protocol Settings"
msgstr "Ajustes del protocolo de GNU-Social"
-#: ../../addon/gnusoc/gnusoc.php:324
+#: ../../addon/gnusoc/gnusoc.php:417
msgid "Follow"
msgstr "Seguir"
-#: ../../addon/gnusoc/gnusoc.php:327
+#: ../../addon/gnusoc/gnusoc.php:420
#, php-format
msgid "%1$s is now following %2$s"
msgstr "%1$s está siguiendo ahora a %2$s"
-#: ../../addon/cdav/Mod_Cdav.php:744
-msgid "INVALID EVENT DISMISSED!"
-msgstr "¡EVENTO NO VÁLIDO RECHAZADO!"
-
-#: ../../addon/cdav/Mod_Cdav.php:745
-msgid "Summary: "
-msgstr "Resumen: "
-
-#: ../../addon/cdav/Mod_Cdav.php:746
-msgid "Date: "
-msgstr "Fecha: "
-
-#: ../../addon/cdav/Mod_Cdav.php:747 ../../addon/cdav/Mod_Cdav.php:754
-msgid "Reason: "
-msgstr "Razón: "
-
-#: ../../addon/cdav/Mod_Cdav.php:752
-msgid "INVALID CARD DISMISSED!"
-msgstr "¡TARJETA NO VÁLIDA RECHAZADA!"
-
-#: ../../addon/cdav/Mod_Cdav.php:753
-msgid "Name: "
-msgstr "Nombre: "
-
-#: ../../addon/cdav/Mod_Cdav.php:770
-msgid ""
-"You have to enable this plugin in Feature/Addon Settings > CalDAV/CardDAV "
-"Settings before you can use it."
-msgstr "Debe habilitar este complemento en Ajustes/Complementos>Configuración de CalDAV/CardDAV antes de poder utilizarlo."
-
-#: ../../addon/cdav/Mod_Cdav.php:836 ../../addon/cdav/Mod_Cdav.php:837
-msgid "Example: YYYY-MM-DD HH:mm"
-msgstr "Ejemplo: YYYY-MM-DD HH:mm"
-
-#: ../../addon/cdav/Mod_Cdav.php:837
-msgid "End date and time"
-msgstr "Fecha y hora de finalización"
-
-#: ../../addon/cdav/Mod_Cdav.php:852
-msgid "List month"
-msgstr "Lista mensual"
-
-#: ../../addon/cdav/Mod_Cdav.php:853
-msgid "List week"
-msgstr "Lista semanal"
-
-#: ../../addon/cdav/Mod_Cdav.php:854
-msgid "List day"
-msgstr "Lista diaria"
-
-#: ../../addon/cdav/Mod_Cdav.php:861
-msgid "More"
-msgstr "Más"
-
-#: ../../addon/cdav/Mod_Cdav.php:862
-msgid "Less"
-msgstr "Menos"
-
-#: ../../addon/cdav/Mod_Cdav.php:863
-msgid "Select calendar"
-msgstr "Seleccionar un calendario"
-
-#: ../../addon/cdav/Mod_Cdav.php:865
-msgid "Delete all"
-msgstr "Eliminar todos"
-
-#: ../../addon/cdav/Mod_Cdav.php:867
-msgid "Sorry! Editing of recurrent events is not yet implemented."
-msgstr "¡Disculpas! La edición de eventos recurrentes aún no se ha implementado."
-
-#: ../../addon/cdav/cdav.php:36
-msgid "Errors encountered creating database table: "
-msgstr "Errores encontrados al crear la tabla de la base de datos: "
-
-#: ../../addon/cdav/cdav.php:197
-msgid "Default Calendar"
-msgstr "Calendario por defecto"
-
-#: ../../addon/cdav/cdav.php:206
-msgid "Default Addressbook"
-msgstr "Agenda de direcciones por defecto"
-
-#: ../../addon/cdav/cdav.php:215
-msgid "CalDAV/CardDAV Settings saved."
-msgstr "Se ha guardado la configuración de CalDAV/CardDAV."
-
-#: ../../addon/cdav/cdav.php:234
-msgid "Enable CalDAV/CardDAV Server for this channel"
-msgstr "Habilitar el servidor CalDAV/CardDAV para este canal"
-
-#: ../../addon/cdav/cdav.php:237
-#, php-format
-msgid "Your CalDAV resources are located at %s "
-msgstr "Los recursos de CalDAV se encuentran en %s"
-
-#: ../../addon/cdav/cdav.php:240
-#, php-format
-msgid "Your CardDAV resources are located at %s "
-msgstr "Sus recursos de CalDAV están localizados en %s "
-
-#: ../../addon/cdav/cdav.php:246
-msgid "CalDAV/CardDAV Settings"
-msgstr "Configuración de CalDAV/CardDAV"
-
-#: ../../addon/cdav/cdav.php:272 ../../include/connections.php:670
-msgid "Home, Voice"
-msgstr "Llamadas particulares"
-
-#: ../../addon/cdav/cdav.php:273 ../../include/connections.php:671
-msgid "Home, Fax"
-msgstr "Fax particular"
-
-#: ../../addon/cdav/cdav.php:275 ../../include/connections.php:673
-msgid "Work, Voice"
-msgstr "Llamadas de trabajo"
-
-#: ../../addon/cdav/cdav.php:276 ../../include/connections.php:674
-msgid "Work, Fax"
-msgstr "Fax de trabajo"
-
-#: ../../addon/cdav/include/widgets.php:37
-msgid "Select Channel"
-msgstr "Seleccionar un canal"
-
-#: ../../addon/cdav/include/widgets.php:42
-msgid "Read-write"
-msgstr "Lectura y escritura"
-
-#: ../../addon/cdav/include/widgets.php:43
-msgid "Read-only"
-msgstr "Sólo lectura"
-
-#: ../../addon/cdav/include/widgets.php:116
-msgid "My Calendars"
-msgstr "Mis calendarios"
-
-#: ../../addon/cdav/include/widgets.php:118
-msgid "Shared Calendars"
-msgstr "Calendarios compartidos"
-
-#: ../../addon/cdav/include/widgets.php:122
-msgid "Share this calendar"
-msgstr "Compartir este calendario"
-
-#: ../../addon/cdav/include/widgets.php:124
-msgid "Calendar name and color"
-msgstr "Nombre y color del calendario"
-
-#: ../../addon/cdav/include/widgets.php:126
-msgid "Create new calendar"
-msgstr "Crear un nuevo calendario"
-
-#: ../../addon/cdav/include/widgets.php:128
-msgid "Calendar Name"
-msgstr "Nombre del calendario"
-
-#: ../../addon/cdav/include/widgets.php:129
-msgid "Calendar Tools"
-msgstr "Gestión de calendarios"
-
-#: ../../addon/cdav/include/widgets.php:130
-msgid "Import calendar"
-msgstr "Importar un calendario"
-
-#: ../../addon/cdav/include/widgets.php:131
-msgid "Select a calendar to import to"
-msgstr "Seleccionar un calendario para importarlo"
-
-#: ../../addon/cdav/include/widgets.php:158
-msgid "Addressbooks"
-msgstr "Agenda de direcciones"
-
-#: ../../addon/cdav/include/widgets.php:160
-msgid "Addressbook name"
-msgstr "Nombre de la agenda"
-
-#: ../../addon/cdav/include/widgets.php:162
-msgid "Create new addressbook"
-msgstr "Crear una nueva agenda de direcciones"
-
-#: ../../addon/cdav/include/widgets.php:163
-msgid "Addressbook Name"
-msgstr "Nombre de la agenda"
-
-#: ../../addon/cdav/include/widgets.php:165
-msgid "Addressbook Tools"
-msgstr "Gestión de agendas de direcciones"
-
-#: ../../addon/cdav/include/widgets.php:166
-msgid "Import addressbook"
-msgstr "Importar una agenda de direcciones"
-
-#: ../../addon/cdav/include/widgets.php:167
-msgid "Select an addressbook to import to"
-msgstr "Seleccionar una agenda para importarla"
-
#: ../../addon/planets/planets.php:121
msgid "Planets Settings updated."
msgstr "Se han guardado los ajustes de Planets."
-#: ../../addon/planets/planets.php:153
+#: ../../addon/planets/planets.php:149
msgid "Enable Planets Plugin"
msgstr "Habilitar el plugin Planets"
-#: ../../addon/planets/planets.php:157
+#: ../../addon/planets/planets.php:153
msgid "Planets Settings"
msgstr "Ajustes de Planets"
@@ -8654,8 +8682,8 @@ msgstr "Regresar después"
msgid "Page to load after image selection."
msgstr "Página para cargar después de la selección de imágenes."
-#: ../../addon/openclipatar/openclipatar.php:58 ../../include/channel.php:1048
-#: ../../include/nav.php:111
+#: ../../addon/openclipatar/openclipatar.php:58 ../../include/channel.php:1165
+#: ../../include/nav.php:107
msgid "Edit Profile"
msgstr "Editar el perfil"
@@ -9194,12 +9222,12 @@ msgid "Login failed."
msgstr "El acceso ha fallado."
#: ../../addon/openid/Mod_Id.php:85 ../../include/selectors.php:49
-#: ../../include/selectors.php:66
+#: ../../include/selectors.php:66 ../../include/channel.php:1332
msgid "Male"
msgstr "Hombre"
#: ../../addon/openid/Mod_Id.php:87 ../../include/selectors.php:49
-#: ../../include/selectors.php:66
+#: ../../include/selectors.php:66 ../../include/channel.php:1330
msgid "Female"
msgstr "Mujer"
@@ -9386,27 +9414,39 @@ msgstr "una declaración de amor eterno"
msgid "declared undying love for"
msgstr "ha declarado amor eterno a"
-#: ../../addon/diaspora/diaspora.php:675
+#: ../../addon/diaspora/diaspora.php:715
msgid "Diaspora Protocol Settings updated."
msgstr "Los ajustes del protocolo de Diaspora se han actualizado."
-#: ../../addon/diaspora/diaspora.php:694
+#: ../../addon/diaspora/diaspora.php:734
+msgid ""
+"The Diaspora protocol does not support location independence. Connections "
+"you make within that network may be unreachable from alternate channel "
+"locations."
+msgstr "El protocolo de Diaspora no admite la independencia de la ubicación. Las conexiones que realice dentro de esa red pueden ser inaccesibles desde ubicaciones de canales alternativos."
+
+#: ../../addon/diaspora/diaspora.php:737
msgid "Enable the Diaspora protocol for this channel"
msgstr "Activar el protocolo de Diaspora para este canal"
-#: ../../addon/diaspora/diaspora.php:698
+#: ../../addon/diaspora/diaspora.php:741
msgid "Allow any Diaspora member to comment on your public posts"
msgstr "Permitir a cualquier miembro de Diaspora comentar sus entradas públicas"
-#: ../../addon/diaspora/diaspora.php:702
+#: ../../addon/diaspora/diaspora.php:745
msgid "Prevent your hashtags from being redirected to other sites"
msgstr "Impedir que sus \"hashtags\" sean redirigidos a otros sitios "
-#: ../../addon/diaspora/diaspora.php:707
+#: ../../addon/diaspora/diaspora.php:749
+msgid ""
+"Sign and forward posts and comments with no existing Diaspora signature"
+msgstr "Firmar y enviar entradas y comentarios sin firma de Diaspora"
+
+#: ../../addon/diaspora/diaspora.php:754
msgid "Followed hashtags (comma separated, do not include the #)"
msgstr "\"Hashtags\" seguidos (separados por comas, sin incluir #)"
-#: ../../addon/diaspora/diaspora.php:712
+#: ../../addon/diaspora/diaspora.php:759
msgid "Diaspora Protocol Settings"
msgstr "Ajustes del protocolo de Diaspora"
@@ -9532,25 +9572,6 @@ msgstr "Prueba de correo"
msgid "Message subject"
msgstr "Asunto del mensaje"
-#: ../../addon/diaspora_reconnect/diaspora_reconnect.php:44
-#, php-format
-msgid "Reconnecting %d connections"
-msgstr "Reconectando %d conexiones"
-
-#: ../../addon/diaspora_reconnect/diaspora_reconnect.php:63
-msgid "Diaspora Reconnect"
-msgstr "Reconectar con Diaspora"
-
-#: ../../addon/diaspora_reconnect/diaspora_reconnect.php:65
-msgid ""
-"Use this form to re-establish Diaspora connections which were initially made"
-" from a different hub."
-msgstr "Utilice este formulario para restablecer las conexiones de diáspora que se hicieron inicialmente desde un hub diferente."
-
-#: ../../addon/diaspora_reconnect/diaspora_reconnect.php:70
-msgid "Reconnect"
-msgstr "Reconectar"
-
#: ../../addon/openstreetmap/openstreetmap.php:146
msgid "View Larger"
msgstr "Ver más grande"
@@ -9636,8 +9657,8 @@ msgstr "Contraseña de Friendica"
msgid "Hubzilla to Friendica Post Settings"
msgstr "Ajustes de publicación de Hubzilla a Friendica"
-#: ../../addon/jappixmini/jappixmini.php:305 ../../include/channel.php:1139
-#: ../../include/channel.php:1296
+#: ../../addon/jappixmini/jappixmini.php:305 ../../include/channel.php:1256
+#: ../../include/channel.php:1419
msgid "Status:"
msgstr "Estado:"
@@ -10192,7 +10213,7 @@ msgstr "Debe elegir blancas o negras."
msgid "Error creating new game."
msgstr "Error al crear un nuevo juego."
-#: ../../addon/chess/chess.php:381 ../../include/channel.php:899
+#: ../../addon/chess/chess.php:381 ../../include/channel.php:1016
msgid "Requested channel is not available."
msgstr "El canal solicitado no está disponible."
@@ -10267,15 +10288,15 @@ msgstr "Si está activado, sus entradas públicas se publicarán en la cuenta de
msgid "Twitter Post Settings"
msgstr "Ajustes de publicación en Twitter"
-#: ../../addon/smileybutton/smileybutton.php:273
+#: ../../addon/smileybutton/smileybutton.php:211
msgid "Deactivate the feature"
msgstr "Desactivar la funcionalidad"
-#: ../../addon/smileybutton/smileybutton.php:277
+#: ../../addon/smileybutton/smileybutton.php:215
msgid "Hide the button and show the smilies directly."
msgstr "Ocultar el botón y mostrar los smilies directamente."
-#: ../../addon/smileybutton/smileybutton.php:281
+#: ../../addon/smileybutton/smileybutton.php:219
msgid "Smileybutton Settings"
msgstr "Ajustes de Smileybutton"
@@ -10556,6 +10577,22 @@ msgstr "Ajustes del encabezado de página"
msgid "pageheader Settings saved."
msgstr "Se han guardado los ajustes del encabezado de página."
+#: ../../addon/authchoose/authchoose.php:67
+msgid "Only authenticate automatically to sites of your friends"
+msgstr "Autenticación automática solo en los sitios de sus amigos"
+
+#: ../../addon/authchoose/authchoose.php:67
+msgid "By default you are automatically authenticated anywhere in the network"
+msgstr "De forma predeterminada, se autenticará automáticamente en cualquier parte de la red"
+
+#: ../../addon/authchoose/authchoose.php:71
+msgid "Authchoose Settings"
+msgstr "Ajustes de Authchoose"
+
+#: ../../addon/authchoose/authchoose.php:85
+msgid "Atuhchoose Settings updated."
+msgstr "Se han actualizado los ajustes de Atuhchoose."
+
#: ../../addon/moremoods/moremoods.php:19
msgid "lonely"
msgstr "Solo/a"
@@ -10751,6 +10788,17 @@ msgstr "Se ha creado una cuenta para usted."
msgid "Authentication successful but rejected: account creation is disabled."
msgstr "Autenticación correcta pero rechazada: la creación de cuentas está deshabilitada."
+#: ../../addon/opensearch/opensearch.php:26
+#, php-format
+msgctxt "opensearch"
+msgid "Search %1$s (%2$s)"
+msgstr "Buscar %1$s (%2$s)"
+
+#: ../../addon/opensearch/opensearch.php:28
+msgctxt "opensearch"
+msgid "$Projectname"
+msgstr "$Projectname"
+
#: ../../addon/opensearch/opensearch.php:43
msgid "Search $Projectname"
msgstr "Buscar $Projectname"
@@ -10849,11 +10897,11 @@ msgstr "Transexual"
msgid "Hermaphrodite"
msgstr "Hermafrodita"
-#: ../../include/selectors.php:49
+#: ../../include/selectors.php:49 ../../include/channel.php:1336
msgid "Neuter"
msgstr "Neutral"
-#: ../../include/selectors.php:49
+#: ../../include/selectors.php:49 ../../include/channel.php:1338
msgid "Non-specific"
msgstr "No especificado"
@@ -11043,341 +11091,288 @@ msgstr "%1$s ahora está conectado/a con %2$s"
msgid "%1$s poked %2$s"
msgstr "%1$s ha dado un toque a %2$s"
-#: ../../include/conversation.php:239 ../../include/text.php:1115
-#: ../../include/text.php:1120
+#: ../../include/conversation.php:239 ../../include/text.php:1096
+#: ../../include/text.php:1101
msgid "poked"
msgstr "ha dado un toque a"
-#: ../../include/conversation.php:691
+#: ../../include/conversation.php:688
#, php-format
msgid "View %s's profile @ %s"
msgstr "Ver el perfil @ %s de %s"
-#: ../../include/conversation.php:711
+#: ../../include/conversation.php:708
msgid "Categories:"
msgstr "Temas:"
-#: ../../include/conversation.php:712
+#: ../../include/conversation.php:709
msgid "Filed under:"
msgstr "Archivado bajo:"
-#: ../../include/conversation.php:737
+#: ../../include/conversation.php:734
msgid "View in context"
msgstr "Mostrar en su contexto"
-#: ../../include/conversation.php:834
+#: ../../include/conversation.php:831
msgid "remove"
msgstr "eliminar"
-#: ../../include/conversation.php:838 ../../include/nav.php:272
+#: ../../include/conversation.php:835 ../../include/nav.php:268
msgid "Loading..."
msgstr "Cargando..."
-#: ../../include/conversation.php:839
+#: ../../include/conversation.php:836
msgid "Delete Selected Items"
msgstr "Eliminar elementos seleccionados"
-#: ../../include/conversation.php:882
+#: ../../include/conversation.php:879
msgid "View Source"
msgstr "Ver el código fuente de la entrada"
-#: ../../include/conversation.php:892
+#: ../../include/conversation.php:889
msgid "Follow Thread"
msgstr "Seguir este hilo"
-#: ../../include/conversation.php:901
+#: ../../include/conversation.php:898
msgid "Unfollow Thread"
msgstr "Dejar de seguir este hilo"
-#: ../../include/conversation.php:992
+#: ../../include/conversation.php:989
msgid "Activity/Posts"
msgstr "Actividad y publicaciones"
-#: ../../include/conversation.php:1012
+#: ../../include/conversation.php:1009
msgid "Edit Connection"
msgstr "Editar conexión"
-#: ../../include/conversation.php:1022
+#: ../../include/conversation.php:1019
msgid "Message"
msgstr "Mensaje"
-#: ../../include/conversation.php:1156
+#: ../../include/conversation.php:1153
#, php-format
msgid "%s likes this."
msgstr "A %s le gusta esto."
-#: ../../include/conversation.php:1156
+#: ../../include/conversation.php:1153
#, php-format
msgid "%s doesn't like this."
msgstr "A %s no le gusta esto."
-#: ../../include/conversation.php:1160
+#: ../../include/conversation.php:1157
#, 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] "a <span %1$s>%2$d personas</span> le gusta esto."
msgstr[1] "A <span %1$s>%2$d personas</span> les gusta esto."
-#: ../../include/conversation.php:1162
+#: ../../include/conversation.php:1159
#, 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] "a <span %1$s>%2$d personas</span> no les gusta esto."
msgstr[1] "A <span %1$s>%2$d personas</span> no les gusta esto."
-#: ../../include/conversation.php:1168
+#: ../../include/conversation.php:1165
msgid "and"
msgstr "y"
-#: ../../include/conversation.php:1171
+#: ../../include/conversation.php:1168
#, php-format
msgid ", and %d other people"
msgid_plural ", and %d other people"
msgstr[0] ", y %d persona más"
msgstr[1] ", y %d personas más"
-#: ../../include/conversation.php:1172
+#: ../../include/conversation.php:1169
#, php-format
msgid "%s like this."
msgstr "A %s le gusta esto."
-#: ../../include/conversation.php:1172
+#: ../../include/conversation.php:1169
#, php-format
msgid "%s don't like this."
msgstr "A %s no le gusta esto."
-#: ../../include/conversation.php:1215
+#: ../../include/conversation.php:1212
msgid "Set your location"
msgstr "Establecer su ubicación"
-#: ../../include/conversation.php:1216
+#: ../../include/conversation.php:1213
msgid "Clear browser location"
msgstr "Eliminar los datos de localización geográfica del navegador"
-#: ../../include/conversation.php:1264
+#: ../../include/conversation.php:1261
msgid "Tag term:"
msgstr "Término de la etiqueta:"
-#: ../../include/conversation.php:1265
+#: ../../include/conversation.php:1262
msgid "Where are you right now?"
msgstr "¿Donde está ahora?"
-#: ../../include/conversation.php:1270
+#: ../../include/conversation.php:1267
msgid "Choose a different album..."
msgstr "Elegir un álbum diferente..."
-#: ../../include/conversation.php:1274
+#: ../../include/conversation.php:1271
msgid "Comments enabled"
msgstr "Comentarios habilitados"
-#: ../../include/conversation.php:1275
+#: ../../include/conversation.php:1272
msgid "Comments disabled"
msgstr "Comentarios deshabilitados"
-#: ../../include/conversation.php:1313
+#: ../../include/conversation.php:1310
msgid "Page link name"
msgstr "Nombre del enlace de la página"
-#: ../../include/conversation.php:1316
+#: ../../include/conversation.php:1313
msgid "Post as"
msgstr "Publicar como"
-#: ../../include/conversation.php:1330
+#: ../../include/conversation.php:1327
msgid "Toggle voting"
msgstr "Cambiar votación"
-#: ../../include/conversation.php:1333
+#: ../../include/conversation.php:1330
msgid "Disable comments"
msgstr "Dehabilitar los comentarios"
-#: ../../include/conversation.php:1334
+#: ../../include/conversation.php:1331
msgid "Toggle comments"
msgstr "Activar o desactivar los comentarios"
-#: ../../include/conversation.php:1342
+#: ../../include/conversation.php:1339
msgid "Categories (optional, comma-separated list)"
msgstr "Temas (opcional, lista separada por comas)"
-#: ../../include/conversation.php:1365
+#: ../../include/conversation.php:1362
msgid "Other networks and post services"
msgstr "Otras redes y servicios de publicación"
-#: ../../include/conversation.php:1371
+#: ../../include/conversation.php:1368
msgid "Set publish date"
msgstr "Establecer la fecha de publicación"
-#: ../../include/conversation.php:1634
+#: ../../include/conversation.php:1631
msgid "Discover"
msgstr "Descubrir"
-#: ../../include/conversation.php:1637
+#: ../../include/conversation.php:1634
msgid "Imported public streams"
msgstr "Contenidos públicos importados"
-#: ../../include/conversation.php:1642
+#: ../../include/conversation.php:1639
msgid "Commented Order"
msgstr "Comentarios recientes"
-#: ../../include/conversation.php:1645
+#: ../../include/conversation.php:1642
msgid "Sort by Comment Date"
msgstr "Ordenar por fecha de comentario"
-#: ../../include/conversation.php:1649
+#: ../../include/conversation.php:1646
msgid "Posted Order"
msgstr "Publicaciones recientes"
-#: ../../include/conversation.php:1652
+#: ../../include/conversation.php:1649
msgid "Sort by Post Date"
msgstr "Ordenar por fecha de publicación"
-#: ../../include/conversation.php:1660
+#: ../../include/conversation.php:1657
msgid "Posts that mention or involve you"
msgstr "Publicaciones que le mencionan o involucran"
-#: ../../include/conversation.php:1669
+#: ../../include/conversation.php:1666
msgid "Activity Stream - by date"
msgstr "Contenido - por fecha"
-#: ../../include/conversation.php:1675
+#: ../../include/conversation.php:1672
msgid "Starred"
msgstr "Preferidas"
-#: ../../include/conversation.php:1678
+#: ../../include/conversation.php:1675
msgid "Favourite Posts"
msgstr "Publicaciones favoritas"
-#: ../../include/conversation.php:1685
+#: ../../include/conversation.php:1682
msgid "Spam"
msgstr "Correo basura"
-#: ../../include/conversation.php:1688
+#: ../../include/conversation.php:1685
msgid "Posts flagged as SPAM"
msgstr "Publicaciones marcadas como basura"
-#: ../../include/conversation.php:1763 ../../include/nav.php:372
+#: ../../include/conversation.php:1760 ../../include/nav.php:358
msgid "Status Messages and Posts"
msgstr "Mensajes de estado y publicaciones"
-#: ../../include/conversation.php:1776 ../../include/nav.php:385
+#: ../../include/conversation.php:1773 ../../include/nav.php:371
msgid "Profile Details"
msgstr "Detalles del perfil"
-#: ../../include/conversation.php:1786 ../../include/nav.php:395
-#: ../../include/photos.php:528
+#: ../../include/conversation.php:1783 ../../include/nav.php:381
+#: ../../include/photos.php:525
msgid "Photo Albums"
msgstr "Álbumes de fotos"
-#: ../../include/conversation.php:1794 ../../include/nav.php:403
+#: ../../include/conversation.php:1791 ../../include/nav.php:389
msgid "Files and Storage"
msgstr "Ficheros y repositorio"
-#: ../../include/conversation.php:1830 ../../include/nav.php:438
+#: ../../include/conversation.php:1827 ../../include/nav.php:424
msgid "Bookmarks"
msgstr "Marcadores"
-#: ../../include/conversation.php:1833 ../../include/nav.php:441
+#: ../../include/conversation.php:1830 ../../include/nav.php:427
msgid "Saved Bookmarks"
msgstr "Marcadores guardados"
-#: ../../include/conversation.php:1844 ../../include/nav.php:452
+#: ../../include/conversation.php:1841 ../../include/nav.php:438
msgid "View Webpages"
msgstr "Ver páginas web"
-#: ../../include/conversation.php:1913
+#: ../../include/conversation.php:1910
msgctxt "noun"
msgid "Attending"
msgid_plural "Attending"
msgstr[0] "Participaré"
msgstr[1] "Participaré"
-#: ../../include/conversation.php:1916
+#: ../../include/conversation.php:1913
msgctxt "noun"
msgid "Not Attending"
msgid_plural "Not Attending"
msgstr[0] "No participaré"
msgstr[1] "No participaré"
-#: ../../include/conversation.php:1919
+#: ../../include/conversation.php:1916
msgctxt "noun"
msgid "Undecided"
msgid_plural "Undecided"
msgstr[0] "Indeciso/a"
msgstr[1] "Indecisos/as"
-#: ../../include/conversation.php:1922
+#: ../../include/conversation.php:1919
msgctxt "noun"
msgid "Agree"
msgid_plural "Agrees"
msgstr[0] "De acuerdo"
msgstr[1] "De acuerdo"
-#: ../../include/conversation.php:1925
+#: ../../include/conversation.php:1922
msgctxt "noun"
msgid "Disagree"
msgid_plural "Disagrees"
msgstr[0] "En desacuerdo"
msgstr[1] "En desacuerdo"
-#: ../../include/conversation.php:1928
+#: ../../include/conversation.php:1925
msgctxt "noun"
msgid "Abstain"
msgid_plural "Abstains"
msgstr[0] "se abstiene"
msgstr[1] "Se abstienen"
-#: ../../include/permissions.php:35
-msgid "Can view my normal stream and posts"
-msgstr "Pueden verse mi actividad y publicaciones normales"
-
-#: ../../include/permissions.php:39
-msgid "Can view my webpages"
-msgstr "Pueden verse mis páginas web"
-
-#: ../../include/permissions.php:43
-msgid "Can post on my channel page (\"wall\")"
-msgstr "Pueden crearse entradas en mi página de inicio del canal (“muro”)"
-
-#: ../../include/permissions.php:46
-msgid "Can like/dislike stuff"
-msgstr "Puede marcarse contenido como me gusta/no me gusta"
-
-#: ../../include/permissions.php:46
-msgid "Profiles and things other than posts/comments"
-msgstr "Perfiles y otras cosas aparte de publicaciones/comentarios"
-
-#: ../../include/permissions.php:48
-msgid "Can forward to all my channel contacts via post @mentions"
-msgstr "Puede enviarse una entrada a todos mis contactos del canal mediante una @mención"
-
-#: ../../include/permissions.php:48
-msgid "Advanced - useful for creating group forum channels"
-msgstr "Avanzado - útil para crear canales de foros de discusión o grupos"
-
-#: ../../include/permissions.php:49
-msgid "Can chat with me (when available)"
-msgstr "Se puede charlar conmigo (cuando esté disponible)"
-
-#: ../../include/permissions.php:50
-msgid "Can write to my file storage and photos"
-msgstr "Puede escribirse en mi repositorio de ficheros y fotos"
-
-#: ../../include/permissions.php:51
-msgid "Can edit my webpages"
-msgstr "Pueden editarse mis páginas web"
-
-#: ../../include/permissions.php:53
-msgid "Somewhat advanced - very useful in open communities"
-msgstr "Algo avanzado - muy útil en comunidades abiertas"
-
-#: ../../include/permissions.php:55
-msgid "Can administer my channel resources"
-msgstr "Pueden administrarse mis recursos del canal"
-
-#: ../../include/permissions.php:55
-msgid ""
-"Extremely advanced. Leave this alone unless you know what you are doing"
-msgstr "Muy avanzado. Déjelo a no ser que sepa bien lo que está haciendo."
-
#: ../../include/dir_fns.php:141
msgid "Directory Options"
msgstr "Opciones del directorio"
@@ -11432,320 +11427,328 @@ msgstr "más antiguas"
msgid "newer"
msgstr "más recientes"
-#: ../../include/text.php:945
+#: ../../include/text.php:939
msgid "No connections"
msgstr "Sin conexiones"
-#: ../../include/text.php:970
+#: ../../include/text.php:964
#, php-format
msgid "View all %s connections"
msgstr "Ver todas las %s conexiones"
-#: ../../include/text.php:1115 ../../include/text.php:1120
+#: ../../include/text.php:1096 ../../include/text.php:1101
msgid "poke"
msgstr "un toque"
-#: ../../include/text.php:1121
+#: ../../include/text.php:1102
msgid "ping"
msgstr "un \"ping\""
-#: ../../include/text.php:1121
+#: ../../include/text.php:1102
msgid "pinged"
msgstr "ha enviado un \"ping\" a"
-#: ../../include/text.php:1122
+#: ../../include/text.php:1103
msgid "prod"
msgstr "una incitación "
-#: ../../include/text.php:1122
+#: ../../include/text.php:1103
msgid "prodded"
msgstr "ha incitado a "
-#: ../../include/text.php:1123
+#: ../../include/text.php:1104
msgid "slap"
msgstr "una bofetada "
-#: ../../include/text.php:1123
+#: ../../include/text.php:1104
msgid "slapped"
msgstr "ha abofeteado a "
-#: ../../include/text.php:1124
+#: ../../include/text.php:1105
msgid "finger"
msgstr "un \"finger\" "
-#: ../../include/text.php:1124
+#: ../../include/text.php:1105
msgid "fingered"
msgstr "envió un \"finger\" a"
-#: ../../include/text.php:1125
+#: ../../include/text.php:1106
msgid "rebuff"
msgstr "un reproche"
-#: ../../include/text.php:1125
+#: ../../include/text.php:1106
msgid "rebuffed"
msgstr "ha hecho un reproche a "
-#: ../../include/text.php:1137
+#: ../../include/text.php:1118
msgid "happy"
msgstr "feliz "
-#: ../../include/text.php:1138
+#: ../../include/text.php:1119
msgid "sad"
msgstr "triste "
-#: ../../include/text.php:1139
+#: ../../include/text.php:1120
msgid "mellow"
msgstr "tranquilo/a"
-#: ../../include/text.php:1140
+#: ../../include/text.php:1121
msgid "tired"
msgstr "cansado/a "
-#: ../../include/text.php:1141
+#: ../../include/text.php:1122
msgid "perky"
msgstr "vivaz"
-#: ../../include/text.php:1142
+#: ../../include/text.php:1123
msgid "angry"
msgstr "enfadado/a"
-#: ../../include/text.php:1143
+#: ../../include/text.php:1124
msgid "stupefied"
msgstr "asombrado/a"
-#: ../../include/text.php:1144
+#: ../../include/text.php:1125
msgid "puzzled"
msgstr "perplejo/a"
-#: ../../include/text.php:1145
+#: ../../include/text.php:1126
msgid "interested"
msgstr "interesado/a"
-#: ../../include/text.php:1146
+#: ../../include/text.php:1127
msgid "bitter"
msgstr "amargado/a"
-#: ../../include/text.php:1147
+#: ../../include/text.php:1128
msgid "cheerful"
msgstr "alegre"
-#: ../../include/text.php:1148
+#: ../../include/text.php:1129
msgid "alive"
msgstr "animado/a"
-#: ../../include/text.php:1149
+#: ../../include/text.php:1130
msgid "annoyed"
msgstr "molesto/a"
-#: ../../include/text.php:1150
+#: ../../include/text.php:1131
msgid "anxious"
msgstr "ansioso/a"
-#: ../../include/text.php:1151
+#: ../../include/text.php:1132
msgid "cranky"
msgstr "de mal humor"
-#: ../../include/text.php:1152
+#: ../../include/text.php:1133
msgid "disturbed"
msgstr "perturbado/a"
-#: ../../include/text.php:1153
+#: ../../include/text.php:1134
msgid "frustrated"
msgstr "frustrado/a"
-#: ../../include/text.php:1154
+#: ../../include/text.php:1135
msgid "depressed"
msgstr "deprimido/a"
-#: ../../include/text.php:1155
+#: ../../include/text.php:1136
msgid "motivated"
msgstr "motivado/a"
-#: ../../include/text.php:1156
+#: ../../include/text.php:1137
msgid "relaxed"
msgstr "relajado/a"
-#: ../../include/text.php:1157
+#: ../../include/text.php:1138
msgid "surprised"
msgstr "sorprendido/a"
-#: ../../include/text.php:1335 ../../include/js_strings.php:70
+#: ../../include/text.php:1312 ../../include/js_strings.php:70
msgid "Monday"
msgstr "lunes"
-#: ../../include/text.php:1335 ../../include/js_strings.php:71
+#: ../../include/text.php:1312 ../../include/js_strings.php:71
msgid "Tuesday"
msgstr "martes"
-#: ../../include/text.php:1335 ../../include/js_strings.php:72
+#: ../../include/text.php:1312 ../../include/js_strings.php:72
msgid "Wednesday"
msgstr "miércoles"
-#: ../../include/text.php:1335 ../../include/js_strings.php:73
+#: ../../include/text.php:1312 ../../include/js_strings.php:73
msgid "Thursday"
msgstr "jueves"
-#: ../../include/text.php:1335 ../../include/js_strings.php:74
+#: ../../include/text.php:1312 ../../include/js_strings.php:74
msgid "Friday"
msgstr "viernes"
-#: ../../include/text.php:1335 ../../include/js_strings.php:75
+#: ../../include/text.php:1312 ../../include/js_strings.php:75
msgid "Saturday"
msgstr "sábado"
-#: ../../include/text.php:1335 ../../include/js_strings.php:69
+#: ../../include/text.php:1312 ../../include/js_strings.php:69
msgid "Sunday"
msgstr "domingo"
-#: ../../include/text.php:1339 ../../include/js_strings.php:45
+#: ../../include/text.php:1316 ../../include/js_strings.php:45
msgid "January"
msgstr "enero"
-#: ../../include/text.php:1339 ../../include/js_strings.php:46
+#: ../../include/text.php:1316 ../../include/js_strings.php:46
msgid "February"
msgstr "febrero"
-#: ../../include/text.php:1339 ../../include/js_strings.php:47
+#: ../../include/text.php:1316 ../../include/js_strings.php:47
msgid "March"
msgstr "marzo"
-#: ../../include/text.php:1339 ../../include/js_strings.php:48
+#: ../../include/text.php:1316 ../../include/js_strings.php:48
msgid "April"
msgstr "abril"
-#: ../../include/text.php:1339
+#: ../../include/text.php:1316
msgid "May"
msgstr "mayo"
-#: ../../include/text.php:1339 ../../include/js_strings.php:50
+#: ../../include/text.php:1316 ../../include/js_strings.php:50
msgid "June"
msgstr "junio"
-#: ../../include/text.php:1339 ../../include/js_strings.php:51
+#: ../../include/text.php:1316 ../../include/js_strings.php:51
msgid "July"
msgstr "julio"
-#: ../../include/text.php:1339 ../../include/js_strings.php:52
+#: ../../include/text.php:1316 ../../include/js_strings.php:52
msgid "August"
msgstr "agosto"
-#: ../../include/text.php:1339 ../../include/js_strings.php:53
+#: ../../include/text.php:1316 ../../include/js_strings.php:53
msgid "September"
msgstr "septiembre"
-#: ../../include/text.php:1339 ../../include/js_strings.php:54
+#: ../../include/text.php:1316 ../../include/js_strings.php:54
msgid "October"
msgstr "octubre"
-#: ../../include/text.php:1339 ../../include/js_strings.php:55
+#: ../../include/text.php:1316 ../../include/js_strings.php:55
msgid "November"
msgstr "noviembre"
-#: ../../include/text.php:1339 ../../include/js_strings.php:56
+#: ../../include/text.php:1316 ../../include/js_strings.php:56
msgid "December"
msgstr "diciembre"
-#: ../../include/text.php:1403 ../../include/text.php:1407
+#: ../../include/text.php:1380 ../../include/text.php:1384
msgid "Unknown Attachment"
msgstr "Adjunto no reconocido"
-#: ../../include/text.php:1409
+#: ../../include/text.php:1386 ../../include/feedutils.php:780
msgid "unknown"
msgstr "desconocido"
-#: ../../include/text.php:1445
+#: ../../include/text.php:1422
msgid "remove category"
msgstr "eliminar el tema"
-#: ../../include/group.php:334
-msgid "Channels not in any privacy group"
-msgstr "Sin canales en ningún grupo"
+#: ../../include/text.php:1496
+msgid "remove from file"
+msgstr "eliminar del fichero"
-#: ../../include/text.php:1781 ../../include/language.php:367
+#: ../../include/text.php:1615 ../../include/message.php:12
+msgid "Download binary/encrypted content"
+msgstr "Descargar contenido binario o cifrado"
+
+#: ../../include/text.php:1774 ../../include/language.php:367
msgid "default"
msgstr "por defecto"
-#: ../../include/text.php:1789
+#: ../../include/text.php:1782
msgid "Page layout"
msgstr "Plantilla de la página"
-#: ../../include/text.php:1789
+#: ../../include/text.php:1782
msgid "You can create your own with the layouts tool"
msgstr "Puede crear su propia disposición gráfica con la herramienta de plantillas"
-#: ../../include/text.php:1817
+#: ../../include/text.php:1810
msgid "Page content type"
msgstr "Tipo de contenido de la página"
-#: ../../include/text.php:1950
+#: ../../include/text.php:1943
msgid "activity"
msgstr "la actividad"
-#: ../../include/text.php:2264
+#: ../../include/text.php:2006
+msgid "a-z, 0-9, -, _, and . only"
+msgstr "a-z, 0-9, -, _, and . only"
+
+#: ../../include/text.php:2277
msgid "Design Tools"
msgstr "Herramientas de diseño web"
-#: ../../include/text.php:2270
+#: ../../include/text.php:2283
msgid "Pages"
msgstr "Páginas"
-#: ../../include/text.php:2292
+#: ../../include/text.php:2305
msgid "Import website..."
msgstr "Importar un sitio web..."
-#: ../../include/text.php:2293
+#: ../../include/text.php:2306
msgid "Select folder to import"
msgstr "Seleccionar la carpeta que se va a importar"
-#: ../../include/text.php:2294
+#: ../../include/text.php:2307
msgid "Import from a zipped folder:"
msgstr "Importar desde una carpeta comprimida: "
-#: ../../include/text.php:2295
+#: ../../include/text.php:2308
msgid "Import from cloud files:"
msgstr "Importar desde los ficheros en la nube: "
-#: ../../include/text.php:2296
+#: ../../include/text.php:2309
msgid "/cloud/channel/path/to/folder"
msgstr "/cloud/canal/ruta/a la/carpeta"
-#: ../../include/text.php:2297
+#: ../../include/text.php:2310
msgid "Enter path to website files"
msgstr "Ruta a los ficheros del sitio web"
-#: ../../include/text.php:2298
+#: ../../include/text.php:2311
msgid "Select folder"
msgstr "Seleccionar la carpeta"
-#: ../../include/text.php:2299
+#: ../../include/text.php:2312
msgid "Export website..."
msgstr "Exportar un sitio web..."
-#: ../../include/text.php:2300
+#: ../../include/text.php:2313
msgid "Export to a zip file"
msgstr "Exportar a un fichero comprimido .zip"
-#: ../../include/text.php:2301
+#: ../../include/text.php:2314
msgid "website.zip"
msgstr "sitio_web.zip"
-#: ../../include/text.php:2302
+#: ../../include/text.php:2315
msgid "Enter a name for the zip file."
msgstr "Escriba un nombre para el fichero zip."
-#: ../../include/text.php:2303
+#: ../../include/text.php:2316
msgid "Export to cloud files"
msgstr "Exportar a la nube de ficheros"
-#: ../../include/text.php:2304
+#: ../../include/text.php:2317
msgid "/path/to/export/folder"
msgstr "/ruta/para/exportar/carpeta"
-#: ../../include/text.php:2305
+#: ../../include/text.php:2318
msgid "Enter a path to a cloud files destination."
msgstr "Escriba una ruta de destino a la nube de ficheros."
-#: ../../include/text.php:2306
+#: ../../include/text.php:2319
msgid "Specify folder"
msgstr "Especificar una carpeta"
@@ -11795,28 +11798,10 @@ msgstr[1] "%d conexiones en común"
msgid "show more"
msgstr "mostrar más"
-#: ../../include/markdown.php:444
-msgid "Attachments:"
-msgstr "Ficheros adjuntos: "
-
-#: ../../include/markdown.php:538 ../../include/event.php:22
-#: ../../include/event.php:69
-msgid "l F d, Y \\@ g:i A"
-msgstr "l d de F, Y \\@ G:i"
-
-#: ../../include/markdown.php:540
-msgid "$Projectname event notification:"
-msgstr "Notificación de eventos de $Projectname: "
-
-#: ../../include/markdown.php:544 ../../include/event.php:30
-#: ../../include/event.php:73
-msgid "Starts:"
-msgstr "Comienza:"
-
-#: ../../include/markdown.php:552 ../../include/event.php:40
-#: ../../include/event.php:77
-msgid "Finishes:"
-msgstr "Finaliza:"
+#: ../../include/markdown.php:139 ../../include/bbcode.php:332
+#, php-format
+msgid "%1$s wrote the following %2$s %3$s"
+msgstr "%1$s escribió %2$s siguiente %3$s"
#: ../../include/follow.php:26
msgid "Channel is blocked on this site."
@@ -11842,7 +11827,7 @@ msgstr "Protocolo deshabilitado."
msgid "Channel discovery failed."
msgstr "El intento de acceder al canal ha fallado."
-#: ../../include/follow.php:202
+#: ../../include/follow.php:186
msgid "Cannot connect to yourself."
msgstr "No puede conectarse consigo mismo."
@@ -12093,19 +12078,19 @@ msgctxt "calendar"
msgid "All day"
msgstr "Todos los días"
-#: ../../include/message.php:30
+#: ../../include/message.php:40
msgid "Unable to determine sender."
msgstr "No ha sido posible determinar el remitente. "
-#: ../../include/message.php:69
+#: ../../include/message.php:79
msgid "No recipient provided."
msgstr "No se ha especificado ningún destinatario."
-#: ../../include/message.php:74
+#: ../../include/message.php:84
msgid "[no subject]"
msgstr "[sin asunto]"
-#: ../../include/message.php:227
+#: ../../include/message.php:214
msgid "Stored post could not be verified."
msgstr "No se han podido verificar las publicaciones guardadas."
@@ -12133,61 +12118,61 @@ msgstr "un reproche"
msgid "Item was not found."
msgstr "Elemento no encontrado."
-#: ../../include/attach.php:500
+#: ../../include/attach.php:501
msgid "No source file."
msgstr "Ningún fichero de origen"
-#: ../../include/attach.php:522
+#: ../../include/attach.php:523
msgid "Cannot locate file to replace"
msgstr "No se puede localizar el fichero que va a ser sustituido."
-#: ../../include/attach.php:540
+#: ../../include/attach.php:541
msgid "Cannot locate file to revise/update"
msgstr "No se puede localizar el fichero para revisar/actualizar"
-#: ../../include/attach.php:671
+#: ../../include/attach.php:674
#, php-format
msgid "File exceeds size limit of %d"
msgstr "El fichero supera el limite de tamaño de %d"
-#: ../../include/attach.php:685
+#: ../../include/attach.php:688
#, php-format
msgid "You have reached your limit of %1$.0f Mbytes attachment storage."
msgstr "Ha alcanzado su límite de %1$.0f Mbytes de almacenamiento de adjuntos."
-#: ../../include/attach.php:855
+#: ../../include/attach.php:858
msgid "File upload failed. Possible system limit or action terminated."
msgstr "Error de carga, posiblemente por limite del sistema o porque la acción ha finalizado."
-#: ../../include/attach.php:868
+#: ../../include/attach.php:871
msgid "Stored file could not be verified. Upload failed."
msgstr "El fichero almacenado no ha podido ser verificado. El envío ha fallado."
-#: ../../include/attach.php:923 ../../include/attach.php:939
+#: ../../include/attach.php:932 ../../include/attach.php:948
msgid "Path not available."
msgstr "Ruta no disponible."
-#: ../../include/attach.php:988 ../../include/attach.php:1153
+#: ../../include/attach.php:997 ../../include/attach.php:1162
msgid "Empty pathname"
msgstr "Ruta vacía"
-#: ../../include/attach.php:1014
+#: ../../include/attach.php:1023
msgid "duplicate filename or path"
msgstr "Nombre duplicado de ruta o fichero"
-#: ../../include/attach.php:1039
+#: ../../include/attach.php:1048
msgid "Path not found."
msgstr "Ruta no encontrada"
-#: ../../include/attach.php:1107
+#: ../../include/attach.php:1116
msgid "mkdir failed."
msgstr "mkdir ha fallado."
-#: ../../include/attach.php:1111
+#: ../../include/attach.php:1120
msgid "database storage failed."
msgstr "el almacenamiento en la base de datos ha fallado."
-#: ../../include/attach.php:1159
+#: ../../include/attach.php:1168
msgid "Empty path"
msgstr "Ruta vacía"
@@ -12195,77 +12180,77 @@ msgstr "Ruta vacía"
msgid "guest:"
msgstr "invitado: "
-#: ../../include/security.php:532
+#: ../../include/security.php:531
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 "El \"token\" de seguridad del formulario no es correcto. Esto ha ocurrido probablemente porque el formulario ha estado abierto demasiado tiempo (>3 horas) antes de ser enviado"
-#: ../../include/items.php:869 ../../include/items.php:916
+#: ../../include/items.php:851 ../../include/items.php:903
msgid "(Unknown)"
msgstr "(Desconocido)"
-#: ../../include/items.php:1110
+#: ../../include/items.php:1087
msgid "Visible to anybody on the internet."
msgstr "Visible para cualquiera en internet."
-#: ../../include/items.php:1112
+#: ../../include/items.php:1089
msgid "Visible to you only."
msgstr "Visible sólo para usted."
-#: ../../include/items.php:1114
+#: ../../include/items.php:1091
msgid "Visible to anybody in this network."
msgstr "Visible para cualquiera en esta red."
-#: ../../include/items.php:1116
+#: ../../include/items.php:1093
msgid "Visible to anybody authenticated."
msgstr "Visible para cualquiera que esté autenticado."
-#: ../../include/items.php:1118
+#: ../../include/items.php:1095
#, php-format
msgid "Visible to anybody on %s."
msgstr "Visible para cualquiera en %s."
-#: ../../include/items.php:1120
+#: ../../include/items.php:1097
msgid "Visible to all connections."
msgstr "Visible para todas las conexiones."
-#: ../../include/items.php:1122
+#: ../../include/items.php:1099
msgid "Visible to approved connections."
msgstr "Visible para las conexiones permitidas."
-#: ../../include/items.php:1124
+#: ../../include/items.php:1101
msgid "Visible to specific connections."
msgstr "Visible para conexiones específicas."
-#: ../../include/items.php:3938
+#: ../../include/items.php:3908
msgid "Privacy group is empty."
msgstr "El grupo de canales está vacío."
-#: ../../include/items.php:3945
+#: ../../include/items.php:3915
#, php-format
msgid "Privacy group: %s"
msgstr "Grupo de canales: %s"
-#: ../../include/items.php:3957
+#: ../../include/items.php:3927
msgid "Connection not found."
msgstr "Conexión no encontrada"
-#: ../../include/items.php:4310
+#: ../../include/items.php:4280
msgid "profile photo"
msgstr "foto del perfil"
-#: ../../include/items.php:4506
+#: ../../include/items.php:4473
#, php-format
msgid "[Edited %s]"
msgstr "[se ha editado %s]"
-#: ../../include/items.php:4506
+#: ../../include/items.php:4473
msgctxt "edit_activity"
msgid "Post"
msgstr "Publicar"
-#: ../../include/items.php:4506
+#: ../../include/items.php:4473
msgctxt "edit_activity"
msgid "Comment"
msgstr "Comentar"
@@ -12274,227 +12259,261 @@ msgstr "Comentar"
msgid "interested"
msgstr "interesado/a"
-#: ../../include/text.php:1129
-msgid "bitter"
-msgstr "amargado/a"
+#: ../../include/channel.php:68
+msgid "Empty name"
+msgstr "Nombre vacío"
-#: ../../include/text.php:1130
-msgid "cheerful"
-msgstr "alegre"
+#: ../../include/channel.php:71
+msgid "Name too long"
+msgstr "Nombre demasiado largo"
-#: ../../include/text.php:1131
-msgid "alive"
-msgstr "animado/a"
+#: ../../include/channel.php:182
+msgid "No account identifier"
+msgstr "Ningún identificador de la cuenta"
-#: ../../include/text.php:1132
-msgid "annoyed"
-msgstr "molesto/a"
+#: ../../include/channel.php:194
+msgid "Nickname is required."
+msgstr "Se requiere un sobrenombre (alias)."
-#: ../../include/text.php:1133
-msgid "anxious"
-msgstr "ansioso/a"
+#: ../../include/channel.php:208
+msgid "Reserved nickname. Please choose another."
+msgstr "Sobrenombre en uso. Por favor, elija otro."
-#: ../../include/text.php:1134
-msgid "cranky"
-msgstr "de mal humor"
+#: ../../include/channel.php:213
+msgid ""
+"Nickname has unsupported characters or is already being used on this site."
+msgstr "El alias contiene caracteres no admitidos o está ya en uso por otros miembros de este sitio."
-#: ../../include/channel.php:270
+#: ../../include/channel.php:272
msgid "Unable to retrieve created identity"
msgstr "No ha sido posible recuperar la identidad creada"
-#: ../../include/channel.php:342
+#: ../../include/channel.php:344
msgid "Default Profile"
msgstr "Perfil principal"
-#: ../../include/channel.php:1045
+#: ../../include/channel.php:497
+msgid "Unable to retrieve modified identity"
+msgstr "No se puede recuperar la identidad modficada"
+
+#: ../../include/channel.php:1162
msgid "Create New Profile"
msgstr "Crear un nuevo perfil"
-#: ../../include/channel.php:1065
+#: ../../include/channel.php:1182
msgid "Visible to everybody"
msgstr "Visible para todos"
-#: ../../include/channel.php:1138 ../../include/channel.php:1252
+#: ../../include/channel.php:1255 ../../include/channel.php:1375
msgid "Gender:"
msgstr "Género:"
-#: ../../include/channel.php:1140 ../../include/channel.php:1307
+#: ../../include/channel.php:1257 ../../include/channel.php:1430
msgid "Homepage:"
msgstr "Página personal:"
-#: ../../include/channel.php:1141
+#: ../../include/channel.php:1258
msgid "Online Now"
msgstr "Ahora en línea"
-#: ../../include/text.php:1408 ../../include/text.php:1412
-msgid "Unknown Attachment"
-msgstr "Adjunto no reconocido"
+#: ../../include/channel.php:1334
+msgid "Trans"
+msgstr "Trans"
-#: ../../include/text.php:1414
-msgid "unknown"
-msgstr "desconocido"
+#: ../../include/channel.php:1380
+msgid "Like this channel"
+msgstr "Me gusta este canal"
-#: ../../include/text.php:1450
-msgid "remove category"
-msgstr "eliminar el tema"
+#: ../../include/channel.php:1404
+msgid "j F, Y"
+msgstr "j F Y"
-#: ../../include/text.php:1527
-msgid "remove from file"
-msgstr "eliminar del fichero"
+#: ../../include/channel.php:1405
+msgid "j F"
+msgstr "j F"
-#: ../../include/text.php:1796
-msgid "Page layout"
-msgstr "Plantilla de la página"
+#: ../../include/channel.php:1412
+msgid "Birthday:"
+msgstr "Cumpleaños:"
-#: ../../include/text.php:1796
-msgid "You can create your own with the layouts tool"
-msgstr "Puede crear su propia disposición gráfica con la herramienta de plantillas"
+#: ../../include/channel.php:1425
+#, php-format
+msgid "for %1$d %2$s"
+msgstr "por %1$d %2$s"
-#: ../../include/text.php:1838
-msgid "Page content type"
-msgstr "Tipo de contenido de la página"
+#: ../../include/channel.php:1428
+msgid "Sexual Preference:"
+msgstr "Orientación sexual:"
-#: ../../include/text.php:1971
-msgid "activity"
-msgstr "la actividad"
+#: ../../include/channel.php:1434
+msgid "Tags:"
+msgstr "Etiquetas:"
-#: ../../include/text.php:2285
-msgid "Design Tools"
-msgstr "Herramientas de diseño web"
+#: ../../include/channel.php:1436
+msgid "Political Views:"
+msgstr "Posición política:"
-#: ../../include/text.php:2291
-msgid "Pages"
-msgstr "Páginas"
+#: ../../include/channel.php:1438
+msgid "Religion:"
+msgstr "Religión:"
-#: ../../include/text.php:2313
-msgid "Import website..."
-msgstr "Importar un sitio web..."
+#: ../../include/channel.php:1442
+msgid "Hobbies/Interests:"
+msgstr "Aficciones o intereses:"
-#: ../../include/text.php:2314
-msgid "Select folder to import"
-msgstr "Seleccionar la carpeta que se va a importar"
+#: ../../include/channel.php:1444
+msgid "Likes:"
+msgstr "Me gusta:"
-#: ../../include/text.php:2315
-msgid "Import from a zipped folder:"
-msgstr "Importar desde una carpeta comprimida: "
+#: ../../include/channel.php:1446
+msgid "Dislikes:"
+msgstr "No me gusta:"
-#: ../../include/text.php:2316
-msgid "Import from cloud files:"
-msgstr "Importar desde los ficheros en la nube: "
+#: ../../include/channel.php:1448
+msgid "Contact information and Social Networks:"
+msgstr "Información de contacto y redes sociales:"
-#: ../../include/text.php:2317
-msgid "/cloud/channel/path/to/folder"
-msgstr "/cloud/canal/ruta/a la/carpeta"
+#: ../../include/channel.php:1450
+msgid "My other channels:"
+msgstr "Mis otros canales:"
-#: ../../include/text.php:2318
-msgid "Enter path to website files"
-msgstr "Ruta a los ficheros del sitio web"
+#: ../../include/channel.php:1452
+msgid "Musical interests:"
+msgstr "Preferencias musicales:"
-#: ../../include/text.php:2319
-msgid "Select folder"
-msgstr "Seleccionar la carpeta"
+#: ../../include/channel.php:1454
+msgid "Books, literature:"
+msgstr "Libros, literatura:"
-#: ../../include/text.php:2320
-msgid "Export website..."
-msgstr "Exportar un sitio web..."
+#: ../../include/channel.php:1456
+msgid "Television:"
+msgstr "Televisión:"
-#: ../../include/text.php:2321
-msgid "Export to a zip file"
-msgstr "Exportar a un fichero comprimido .zip"
+#: ../../include/channel.php:1458
+msgid "Film/dance/culture/entertainment:"
+msgstr "Cine, danza, cultura, entretenimiento:"
-#: ../../include/text.php:2322
-msgid "website.zip"
-msgstr "sitio_web.zip"
+#: ../../include/channel.php:1460
+msgid "Love/Romance:"
+msgstr "Vida sentimental o amorosa:"
-#: ../../include/text.php:2323
-msgid "Enter a name for the zip file."
-msgstr "Escriba un nombre para el fichero zip."
+#: ../../include/channel.php:1462
+msgid "Work/employment:"
+msgstr "Trabajo:"
-#: ../../include/text.php:2324
-msgid "Export to cloud files"
-msgstr "Exportar a la nube de ficheros"
+#: ../../include/channel.php:1464
+msgid "School/education:"
+msgstr "Estudios:"
+
+#: ../../include/channel.php:1487
+msgid "Like this thing"
+msgstr "Me gusta esto"
-#: ../../include/channel.php:2139
+#: ../../include/channel.php:2256
#, php-format
msgid "User '%s' deleted"
msgstr "El usuario '%s' ha sido eliminado"
-#: ../../include/event.php:1004
+#: ../../include/event.php:22 ../../include/event.php:69
+msgid "l F d, Y \\@ g:i A"
+msgstr "l d de F, Y \\@ G:i"
+
+#: ../../include/event.php:30 ../../include/event.php:73
+msgid "Starts:"
+msgstr "Comienza:"
+
+#: ../../include/event.php:40 ../../include/event.php:77
+msgid "Finishes:"
+msgstr "Finaliza:"
+
+#: ../../include/event.php:1008
msgid "This event has been added to your calendar."
msgstr "Este evento ha sido añadido a su calendario."
-#: ../../include/event.php:1204
+#: ../../include/event.php:1208
msgid "Not specified"
msgstr "Sin especificar"
-#: ../../include/event.php:1205
+#: ../../include/event.php:1209
msgid "Needs Action"
msgstr "Necesita de una intervención"
-#: ../../include/event.php:1206
+#: ../../include/event.php:1210
msgid "Completed"
msgstr "Completado/a"
-#: ../../include/event.php:1207
+#: ../../include/event.php:1211
msgid "In Process"
msgstr "En proceso"
-#: ../../include/event.php:1208
+#: ../../include/event.php:1212
msgid "Cancelled"
msgstr "Cancelado/a"
-#: ../../include/network.php:776
+#: ../../include/event.php:1292 ../../include/connections.php:676
+msgid "Home, Voice"
+msgstr "Llamadas particulares"
+
+#: ../../include/event.php:1293 ../../include/connections.php:677
+msgid "Home, Fax"
+msgstr "Fax particular"
+
+#: ../../include/event.php:1295 ../../include/connections.php:679
+msgid "Work, Voice"
+msgstr "Llamadas de trabajo"
+
+#: ../../include/event.php:1296 ../../include/connections.php:680
+msgid "Work, Fax"
+msgstr "Fax de trabajo"
+
+#: ../../include/network.php:751
msgid "view full size"
msgstr "Ver en el tamaño original"
-#: ../../include/network.php:2042
-msgid "No Subject"
-msgstr "Sin asunto"
-
-#: ../../include/network.php:2310 ../../include/network.php:2311
+#: ../../include/network.php:1691 ../../include/network.php:1692
msgid "Friendica"
msgstr "Friendica"
-#: ../../include/network.php:2312
+#: ../../include/network.php:1693
msgid "OStatus"
msgstr "OStatus"
-#: ../../include/network.php:2313
+#: ../../include/network.php:1694
msgid "GNU-Social"
msgstr "GNU Social"
-#: ../../include/network.php:2314
+#: ../../include/network.php:1695
msgid "RSS/Atom"
msgstr "RSS/Atom"
-#: ../../include/network.php:2316
+#: ../../include/network.php:1696
+msgid "ActivityPub"
+msgstr "ActivityPub"
+
+#: ../../include/network.php:1698
msgid "Diaspora"
msgstr "Diaspora"
-#: ../../include/network.php:2317
+#: ../../include/network.php:1699
msgid "Facebook"
msgstr "Facebook"
-#: ../../include/network.php:2318
+#: ../../include/network.php:1700
msgid "Zot"
msgstr "Zot"
-#: ../../include/network.php:2319
+#: ../../include/network.php:1701
msgid "LinkedIn"
msgstr "LinkedIn"
-#: ../../include/network.php:2320
+#: ../../include/network.php:1702
msgid "XMPP/IM"
msgstr "XMPP/IM"
-#: ../../include/network.php:2321
+#: ../../include/network.php:1703
msgid "MySpace"
msgstr "MySpace"
-#: ../../include/page_widgets.php:7
-msgid "New Page"
-msgstr "Nueva página"
-
#: ../../include/language.php:380
msgid "Select an alternate language"
msgstr "Seleccionar un idioma alternativo"
@@ -12528,404 +12547,399 @@ msgid ""
" permissions set who is allowed to view the post."
msgstr "Los permisos de la entrada %s no se pueden cambiar %s una vez que se ha compartido.</br /> Estos permisos establecen quién está autorizado para ver el mensaje."
-#: ../../include/dba/dba_driver.php:189
+#: ../../include/dba/dba_driver.php:190
#, php-format
msgid "Cannot locate DNS info for database server '%s'"
msgstr "No se ha podido localizar información de DNS para el servidor de base de datos “%s”"
-#: ../../include/bbcode.php:134 ../../include/bbcode.php:1040
-#: ../../include/bbcode.php:1043 ../../include/bbcode.php:1048
-#: ../../include/bbcode.php:1051 ../../include/bbcode.php:1054
-#: ../../include/bbcode.php:1057 ../../include/bbcode.php:1062
-#: ../../include/bbcode.php:1065 ../../include/bbcode.php:1070
-#: ../../include/bbcode.php:1073 ../../include/bbcode.php:1076
-#: ../../include/bbcode.php:1079
+#: ../../include/bbcode.php:194 ../../include/bbcode.php:1097
+#: ../../include/bbcode.php:1100 ../../include/bbcode.php:1105
+#: ../../include/bbcode.php:1108 ../../include/bbcode.php:1111
+#: ../../include/bbcode.php:1114 ../../include/bbcode.php:1119
+#: ../../include/bbcode.php:1122 ../../include/bbcode.php:1127
+#: ../../include/bbcode.php:1130 ../../include/bbcode.php:1133
+#: ../../include/bbcode.php:1136
msgid "Image/photo"
msgstr "Imagen/foto"
-#: ../../include/bbcode.php:173 ../../include/bbcode.php:1090
+#: ../../include/bbcode.php:233 ../../include/bbcode.php:1147
msgid "Encrypted content"
msgstr "Contenido cifrado"
-#: ../../include/bbcode.php:189
+#: ../../include/bbcode.php:249
#, php-format
msgid "Install %s element: "
msgstr "Instalar el elemento %s:"
-#: ../../include/bbcode.php:193
+#: ../../include/bbcode.php:253
#, php-format
msgid ""
"This post contains an installable %s element, however you lack permissions "
"to install it on this site."
msgstr "Esta entrada contiene el elemento instalable %s, sin embargo le faltan permisos para instalarlo en este sitio."
-#: ../../include/bbcode.php:272
-#, php-format
-msgid "%1$s wrote the following %2$s %3$s"
-msgstr "%1$s escribió %2$s siguiente %3$s"
-
-#: ../../include/bbcode.php:349 ../../include/bbcode.php:357
+#: ../../include/bbcode.php:409 ../../include/bbcode.php:417
msgid "Click to open/close"
msgstr "Pulsar para abrir/cerrar"
-#: ../../include/bbcode.php:357
+#: ../../include/bbcode.php:417
msgid "spoiler"
msgstr "spoiler"
-#: ../../include/bbcode.php:1028
+#: ../../include/bbcode.php:1085
msgid "$1 wrote:"
msgstr "$1 escribió:"
-#: ../../include/oembed.php:315
+#: ../../include/oembed.php:317
msgid " by "
msgstr "por"
-#: ../../include/oembed.php:316
+#: ../../include/oembed.php:318
msgid " on "
msgstr "en"
-#: ../../include/oembed.php:345
+#: ../../include/oembed.php:347
msgid "Embedded content"
msgstr "Contenido incorporado"
-#: ../../include/oembed.php:354
+#: ../../include/oembed.php:356
msgid "Embedding disabled"
msgstr "Incrustación deshabilitada"
-#: ../../include/features.php:58
+#: ../../include/features.php:54
msgid "General Features"
msgstr "Funcionalidades básicas"
-#: ../../include/features.php:63
+#: ../../include/features.php:59
msgid "Multiple Profiles"
msgstr "Múltiples perfiles"
-#: ../../include/features.php:64
+#: ../../include/features.php:60
msgid "Ability to create multiple profiles"
msgstr "Capacidad de crear múltiples perfiles"
-#: ../../include/features.php:72
+#: ../../include/features.php:68
msgid "Advanced Profiles"
msgstr "Perfiles avanzados"
-#: ../../include/features.php:73
+#: ../../include/features.php:69
msgid "Additional profile sections and selections"
msgstr "Secciones y selecciones de perfil adicionales"
-#: ../../include/features.php:81
+#: ../../include/features.php:77
msgid "Profile Import/Export"
msgstr "Importar/Exportar perfil"
-#: ../../include/features.php:82
+#: ../../include/features.php:78
msgid "Save and load profile details across sites/channels"
msgstr "Guardar y cargar detalles del perfil a través de sitios/canales"
-#: ../../include/features.php:90
+#: ../../include/features.php:86
msgid "Web Pages"
msgstr "Páginas web"
-#: ../../include/features.php:91
+#: ../../include/features.php:87
msgid "Provide managed web pages on your channel"
msgstr "Proveer páginas web gestionadas en su canal"
-#: ../../include/features.php:100
+#: ../../include/features.php:96
msgid "Provide a wiki for your channel"
msgstr "Proporcionar un wiki para su canal"
-#: ../../include/features.php:117
+#: ../../include/features.php:113
msgid "Private Notes"
msgstr "Notas privadas"
-#: ../../include/features.php:118
+#: ../../include/features.php:114
msgid "Enables a tool to store notes and reminders (note: not encrypted)"
msgstr "Habilita una herramienta para guardar notas y recordatorios (advertencia: las notas no estarán cifradas)"
-#: ../../include/features.php:126
+#: ../../include/features.php:122
msgid "Navigation Channel Select"
msgstr "Navegación por el selector de canales"
-#: ../../include/features.php:127
+#: ../../include/features.php:123
msgid "Change channels directly from within the navigation dropdown menu"
msgstr "Cambiar de canales directamente desde el menú de navegación desplegable"
-#: ../../include/features.php:135
+#: ../../include/features.php:131
msgid "Photo Location"
msgstr "Ubicación de las fotos"
-#: ../../include/features.php:136
+#: ../../include/features.php:132
msgid "If location data is available on uploaded photos, link this to a map."
msgstr "Si los datos de ubicación están disponibles en las fotos subidas, enlazar estas a un mapa."
-#: ../../include/features.php:144
+#: ../../include/features.php:140
msgid "Access Controlled Chatrooms"
msgstr "Salas de chat moderadas"
-#: ../../include/features.php:145
+#: ../../include/features.php:141
msgid "Provide chatrooms and chat services with access control."
msgstr "Proporcionar salas y servicios de chat moderados."
-#: ../../include/features.php:154
+#: ../../include/features.php:150
msgid "Provide alternate connection permission roles."
msgstr "Proporcionar roles de acceso alternativos para esta conexión."
-#: ../../include/features.php:162
+#: ../../include/features.php:158
msgid "Smart Birthdays"
msgstr "Cumpleaños inteligentes"
-#: ../../include/features.php:163
+#: ../../include/features.php:159
msgid ""
"Make birthday events timezone aware in case your friends are scattered "
"across the planet."
msgstr "Enlazar los eventos de cumpleaños con el huso horario en el caso de que sus amigos estén dispersos por el mundo."
-#: ../../include/features.php:171
+#: ../../include/features.php:167
msgid "Event Timezone Selection"
msgstr "Selección del huso horario del evento"
-#: ../../include/features.php:172
+#: ../../include/features.php:168
msgid "Allow event creation in timezones other than your own."
msgstr "Permitir la creación de eventos en husos horarios distintos del suyo."
-#: ../../include/features.php:180
+#: ../../include/features.php:176
msgid "Advanced Directory Search"
msgstr "Búsqueda avanzada en el directorio"
-#: ../../include/features.php:181
+#: ../../include/features.php:177
msgid "Allows creation of complex directory search queries"
msgstr "Permitir la creación de consultas complejas en las búsquedas en el directorio"
-#: ../../include/features.php:189
+#: ../../include/features.php:185
msgid "Advanced Theme and Layout Settings"
msgstr "Ajustes avanzados de temas y esquemas"
-#: ../../include/features.php:190
+#: ../../include/features.php:186
msgid "Allows fine tuning of themes and page layouts"
msgstr "Permitir el ajuste fino de temas y esquemas de páginas"
-#: ../../include/features.php:200
+#: ../../include/features.php:196
msgid "Post Composition Features"
msgstr "Opciones para la redacción de entradas"
-#: ../../include/features.php:204
+#: ../../include/features.php:200
msgid "Large Photos"
msgstr "Fotos de gran tamaño"
-#: ../../include/features.php:205
+#: ../../include/features.php:201
msgid ""
"Include large (1024px) photo thumbnails in posts. If not enabled, use small "
"(640px) photo thumbnails"
msgstr "Incluir miniaturas de fotos grandes (1024px) en publicaciones. Si no está habilitado, usar miniaturas pequeñas (640px)"
-#: ../../include/features.php:214
+#: ../../include/features.php:210
msgid "Automatically import channel content from other channels or feeds"
msgstr "Importar automáticamente contenido de otros canales o \"feeds\""
-#: ../../include/features.php:222
+#: ../../include/features.php:218
msgid "Even More Encryption"
msgstr "Más cifrado todavía"
-#: ../../include/features.php:223
+#: ../../include/features.php:219
msgid ""
"Allow optional encryption of content end-to-end with a shared secret key"
msgstr "Permitir cifrado adicional de contenido \"punto-a-punto\" con una clave secreta compartida."
-#: ../../include/features.php:231
+#: ../../include/features.php:227
msgid "Enable Voting Tools"
msgstr "Permitir entradas con votación"
-#: ../../include/features.php:232
+#: ../../include/features.php:228
msgid "Provide a class of post which others can vote on"
msgstr "Proveer una clase de publicación en la que otros puedan votar"
-#: ../../include/features.php:240
+#: ../../include/features.php:236
msgid "Disable Comments"
msgstr "Deshabilitar comentarios"
-#: ../../include/features.php:241
+#: ../../include/features.php:237
msgid "Provide the option to disable comments for a post"
msgstr "Proporcionar la opción de desactivar los comentarios para una entrada"
-#: ../../include/features.php:249
+#: ../../include/features.php:245
msgid "Delayed Posting"
msgstr "Publicación aplazada"
-#: ../../include/features.php:250
+#: ../../include/features.php:246
msgid "Allow posts to be published at a later date"
msgstr "Permitir mensajes que se publicarán en una fecha posterior"
-#: ../../include/features.php:258
+#: ../../include/features.php:254
msgid "Content Expiration"
msgstr "Caducidad del contenido"
-#: ../../include/features.php:259
+#: ../../include/features.php:255
msgid "Remove posts/comments and/or private messages at a future time"
msgstr "Eliminar publicaciones/comentarios y/o mensajes privados más adelante"
-#: ../../include/features.php:267
+#: ../../include/features.php:263
msgid "Suppress Duplicate Posts/Comments"
msgstr "Prevenir entradas o comentarios duplicados"
-#: ../../include/features.php:268
+#: ../../include/features.php:264
msgid ""
"Prevent posts with identical content to be published with less than two "
"minutes in between submissions."
msgstr "Prevenir que entradas con contenido idéntico se publiquen con menos de dos minutos de intervalo."
-#: ../../include/features.php:279
+#: ../../include/features.php:275
msgid "Network and Stream Filtering"
msgstr "Filtrado del contenido"
-#: ../../include/features.php:283
+#: ../../include/features.php:279
msgid "Search by Date"
msgstr "Buscar por fecha"
-#: ../../include/features.php:284
+#: ../../include/features.php:280
msgid "Ability to select posts by date ranges"
msgstr "Capacidad de seleccionar entradas por rango de fechas"
-#: ../../include/features.php:292 ../../include/group.php:331
+#: ../../include/features.php:288 ../../include/group.php:332
msgid "Privacy Groups"
msgstr "Grupos de canales"
-#: ../../include/features.php:293
+#: ../../include/features.php:289
msgid "Enable management and selection of privacy groups"
msgstr "Activar la gestión y selección de grupos de canales"
-#: ../../include/features.php:302
+#: ../../include/features.php:298
msgid "Save search terms for re-use"
msgstr "Guardar términos de búsqueda para su reutilización"
-#: ../../include/features.php:310
+#: ../../include/features.php:306
msgid "Network Personal Tab"
msgstr "Actividad personal"
-#: ../../include/features.php:311
+#: ../../include/features.php:307
msgid "Enable tab to display only Network posts that you've interacted on"
msgstr "Habilitar una pestaña en la cual se muestren solo las entradas en las que ha participado."
-#: ../../include/features.php:319
+#: ../../include/features.php:315
msgid "Network New Tab"
msgstr "Contenido nuevo"
-#: ../../include/features.php:320
+#: ../../include/features.php:316
msgid "Enable tab to display all new Network activity"
msgstr "Habilitar una pestaña en la que se muestre solo el contenido nuevo"
-#: ../../include/features.php:328
+#: ../../include/features.php:324
msgid "Affinity Tool"
msgstr "Herramienta de afinidad"
-#: ../../include/features.php:329
+#: ../../include/features.php:325
msgid "Filter stream activity by depth of relationships"
msgstr "Filtrar el contenido según la profundidad de las relaciones"
-#: ../../include/features.php:338
+#: ../../include/features.php:334
msgid "Show friend and connection suggestions"
msgstr "Mostrar sugerencias de amigos y conexiones"
-#: ../../include/features.php:346
+#: ../../include/features.php:342
msgid "Connection Filtering"
msgstr "Filtrado de conexiones"
-#: ../../include/features.php:347
+#: ../../include/features.php:343
msgid "Filter incoming posts from connections based on keywords/content"
msgstr "Filtrar publicaciones entrantes de conexiones por palabras clave o contenido"
-#: ../../include/features.php:359
+#: ../../include/features.php:355
msgid "Post/Comment Tools"
msgstr "Gestión de entradas y comentarios"
-#: ../../include/features.php:363
+#: ../../include/features.php:359
msgid "Community Tagging"
msgstr "Etiquetas de la comunidad"
-#: ../../include/features.php:364
+#: ../../include/features.php:360
msgid "Ability to tag existing posts"
msgstr "Capacidad de etiquetar entradas existentes"
-#: ../../include/features.php:372
+#: ../../include/features.php:368
msgid "Post Categories"
msgstr "Temas de las entradas"
-#: ../../include/features.php:373
+#: ../../include/features.php:369
msgid "Add categories to your posts"
msgstr "Añadir temas a sus publicaciones"
-#: ../../include/features.php:381
+#: ../../include/features.php:377
msgid "Emoji Reactions"
msgstr "Emoticonos \"emoji\""
-#: ../../include/features.php:382
+#: ../../include/features.php:378
msgid "Add emoji reaction ability to posts"
msgstr "Activar la capacidad de añadir un emoticono \"emoji\" a las entradas"
-#: ../../include/features.php:391
+#: ../../include/features.php:387
msgid "Ability to file posts under folders"
msgstr "Capacidad de archivar entradas en carpetas"
-#: ../../include/features.php:399
+#: ../../include/features.php:395
msgid "Dislike Posts"
msgstr "Desagrado de publicaciones"
-#: ../../include/features.php:400
+#: ../../include/features.php:396
msgid "Ability to dislike posts/comments"
msgstr "Capacidad de mostrar desacuerdo con el contenido de entradas y comentarios"
-#: ../../include/features.php:408
+#: ../../include/features.php:404
msgid "Star Posts"
msgstr "Entradas destacadas"
-#: ../../include/features.php:409
+#: ../../include/features.php:405
msgid "Ability to mark special posts with a star indicator"
msgstr "Capacidad de marcar entradas destacadas con un indicador de estrella"
-#: ../../include/features.php:417
+#: ../../include/features.php:413
msgid "Tag Cloud"
msgstr "Nube de etiquetas"
-#: ../../include/features.php:418
+#: ../../include/features.php:414
msgid "Provide a personal tag cloud on your channel page"
msgstr "Proveer nube de etiquetas personal en su página de canal"
-#: ../../include/features.php:430
+#: ../../include/features.php:425
msgid "Premium Channel"
msgstr "Canal premium"
-#: ../../include/features.php:431
+#: ../../include/features.php:426
msgid ""
"Allows you to set restrictions and terms on those that connect with your "
"channel"
msgstr "Le permite configurar restricciones y normas de uso a aquellos que conectan con su canal"
-#: ../../include/taxonomy.php:228 ../../include/taxonomy.php:249
+#: ../../include/taxonomy.php:267 ../../include/taxonomy.php:288
msgid "Tags"
msgstr "Etiquetas"
-#: ../../include/taxonomy.php:293
+#: ../../include/taxonomy.php:332
msgid "Keywords"
msgstr "Palabras clave"
-#: ../../include/taxonomy.php:314
+#: ../../include/taxonomy.php:353
msgid "have"
msgstr "tener"
-#: ../../include/taxonomy.php:314
+#: ../../include/taxonomy.php:353
msgid "has"
msgstr "tiene"
-#: ../../include/taxonomy.php:315
+#: ../../include/taxonomy.php:354
msgid "want"
msgstr "quiero"
-#: ../../include/taxonomy.php:315
+#: ../../include/taxonomy.php:354
msgid "wants"
msgstr "quiere"
-#: ../../include/taxonomy.php:316
+#: ../../include/taxonomy.php:355
msgid "likes"
msgstr "gusta de"
-#: ../../include/taxonomy.php:317
+#: ../../include/taxonomy.php:356
msgid "dislikes"
msgstr "no gusta de"
@@ -12949,51 +12963,51 @@ msgstr "Es obligatorio que le inviten."
msgid "Invitation could not be verified."
msgstr "No se ha podido verificar su invitación."
-#: ../../include/account.php:130
+#: ../../include/account.php:157
msgid "Please enter the required information."
msgstr "Por favor introduzca la información requerida."
-#: ../../include/account.php:198
+#: ../../include/account.php:224
msgid "Failed to store account information."
msgstr "La información de la cuenta no se ha podido guardar."
-#: ../../include/account.php:263
+#: ../../include/account.php:291
#, php-format
msgid "Registration confirmation for %s"
msgstr "Confirmación de registro para %s"
-#: ../../include/account.php:330
+#: ../../include/account.php:360
#, php-format
msgid "Registration request at %s"
msgstr "Solicitud de registro en %s"
-#: ../../include/account.php:352
+#: ../../include/account.php:382
msgid "your registration password"
msgstr "su contraseña de registro"
-#: ../../include/account.php:358 ../../include/account.php:420
+#: ../../include/account.php:388 ../../include/account.php:450
#, php-format
msgid "Registration details for %s"
msgstr "Detalles del registro de %s"
-#: ../../include/account.php:431
+#: ../../include/account.php:461
msgid "Account approved."
msgstr "Cuenta aprobada."
-#: ../../include/account.php:471
+#: ../../include/account.php:501
#, php-format
msgid "Registration revoked for %s"
msgstr "Registro revocado para %s"
-#: ../../include/account.php:756 ../../include/account.php:758
+#: ../../include/account.php:780 ../../include/account.php:782
msgid "Click here to upgrade."
msgstr "Pulse aquí para actualizar"
-#: ../../include/account.php:764
+#: ../../include/account.php:788
msgid "This action exceeds the limits set by your subscription plan."
msgstr "Esta acción supera los límites establecidos por su plan de suscripción "
-#: ../../include/account.php:769
+#: ../../include/account.php:793
msgid "This action is not available under your subscription plan."
msgstr "Esta acción no está disponible en su plan de suscripción."
@@ -13078,11 +13092,11 @@ msgstr "Cumpleaños de %1$s"
msgid "Happy Birthday %1$s"
msgstr "Feliz cumpleaños %1$s"
-#: ../../include/nav.php:92
+#: ../../include/nav.php:90
msgid "Remote authentication"
msgstr "Acceder desde su servidor"
-#: ../../include/nav.php:92
+#: ../../include/nav.php:90
msgid "Click to authenticate to your home hub"
msgstr "Pulsar para identificarse en su servidor de inicio"
@@ -13126,135 +13140,163 @@ msgstr "Ayuda y documentación"
msgid "Search site @name, #tag, ?docs, content"
msgstr "Buscar en el sitio por @nombre, #etiqueta, ?ayuda o contenido"
-#: ../../include/nav.php:176
+#: ../../include/nav.php:171
msgid "Grid"
msgstr "Red"
-#: ../../include/nav.php:176
+#: ../../include/nav.php:171
msgid "Your grid"
msgstr "Mi red"
-#: ../../include/nav.php:177
+#: ../../include/nav.php:172
msgid "View your network/grid"
msgstr "Ver su red"
-#: ../../include/nav.php:178
+#: ../../include/nav.php:173
msgid "Mark all grid notifications seen"
msgstr "Marcar todas las notificaciones de la red como vistas"
-#: ../../include/nav.php:180
+#: ../../include/nav.php:175
msgid "Channel home"
msgstr "Mi canal"
-#: ../../include/nav.php:181
+#: ../../include/nav.php:176
msgid "View your channel home"
msgstr "Ver su página principal del canal"
-#: ../../include/nav.php:182
+#: ../../include/nav.php:177
msgid "Mark all channel notifications seen"
msgstr "Marcar todas las notificaciones del canal como leídas"
-#: ../../include/nav.php:188
+#: ../../include/nav.php:183
msgid "Notices"
msgstr "Avisos"
-#: ../../include/nav.php:188
+#: ../../include/nav.php:183
msgid "Notifications"
msgstr "Notificaciones"
-#: ../../include/nav.php:189
+#: ../../include/nav.php:184
msgid "View all notifications"
msgstr "Ver todas las notificaciones"
-#: ../../include/nav.php:192
+#: ../../include/nav.php:185
+msgid "Mark all system notifications seen"
+msgstr "Marcar todas las notificaciones del sistema como leídas"
+
+#: ../../include/nav.php:187
msgid "Private mail"
msgstr "Correo privado"
-#: ../../include/nav.php:193
+#: ../../include/nav.php:188
msgid "View your private messages"
msgstr "Ver sus mensajes privados"
-#: ../../include/nav.php:194
+#: ../../include/nav.php:189
msgid "Mark all private messages seen"
msgstr "Marcar todos los mensajes privados como leídos"
-#: ../../include/nav.php:200
+#: ../../include/nav.php:195
msgid "Event Calendar"
msgstr "Calendario de eventos"
-#: ../../include/nav.php:201
+#: ../../include/nav.php:196
msgid "View events"
msgstr "Ver los eventos"
-#: ../../include/nav.php:202
+#: ../../include/nav.php:197
msgid "Mark all events seen"
msgstr "Marcar todos los eventos como leidos"
-#: ../../include/nav.php:205
+#: ../../include/nav.php:199
msgid "Manage Your Channels"
msgstr "Gestionar sus canales"
-#: ../../include/nav.php:207
+#: ../../include/nav.php:201
msgid "Account/Channel Settings"
msgstr "Ajustes de cuenta/canales"
+#: ../../include/nav.php:203
+msgid "Shared Files"
+msgstr "Ficheros compartidos"
+
+#: ../../include/nav.php:203
+msgid "New files shared with me"
+msgstr "Nuevos ficheros compartidos conmigo"
+
+#: ../../include/nav.php:208
+msgid "Public stream"
+msgstr "\"Stream\" público"
+
+#: ../../include/nav.php:208
+msgid "Public stream activities"
+msgstr "Actividades del \"stream\" público"
+
#: ../../include/nav.php:215
msgid "Site Setup and Configuration"
msgstr "Ajustes y configuración del sitio"
-#: ../../include/nav.php:277
+#: ../../include/nav.php:274
msgid "@name, #tag, ?doc, content"
msgstr "@nombre, #etiqueta, ?ayuda, contenido"
-#: ../../include/nav.php:278
+#: ../../include/nav.php:275
msgid "Please wait..."
msgstr "Espere por favor…"
-#: ../../include/nav.php:280
+#: ../../include/nav.php:278
msgid "Add Apps"
msgstr "Añadir aplicaciones"
-#: ../../include/photos.php:115
+#: ../../include/nav.php:279
+msgid "Arrange Apps"
+msgstr "Organizar aplicaciones"
+
+#: ../../include/nav.php:280
+msgid "Toggle System Apps"
+msgstr "Alternar aplicaciones de sistema"
+
+#: ../../include/photos.php:111
#, php-format
msgid "Image exceeds website size limit of %lu bytes"
msgstr "La imagen excede el límite de %lu bytes del sitio"
-#: ../../include/photos.php:122
+#: ../../include/photos.php:118
msgid "Image file is empty."
msgstr "El fichero de imagen está vacío. "
-#: ../../include/photos.php:261
+#: ../../include/photos.php:257
msgid "Photo storage failed."
msgstr "La foto no ha podido ser guardada."
-#: ../../include/photos.php:301
+#: ../../include/photos.php:297
msgid "a new photo"
msgstr "una nueva foto"
-#: ../../include/photos.php:305
+#: ../../include/photos.php:301
#, php-format
msgctxt "photo_upload"
msgid "%1$s posted %2$s to %3$s"
msgstr "%1$s ha publicado %2$s en %3$s"
-#: ../../include/photos.php:533
+#: ../../include/photos.php:530
msgid "Upload New Photos"
msgstr "Subir nuevas fotos"
-#: ../../include/zot.php:646
+#: ../../include/zot.php:653
msgid "Invalid data packet"
msgstr "Paquete de datos no válido"
-#: ../../include/zot.php:662
+#: ../../include/zot.php:680
msgid "Unable to verify channel signature"
msgstr "No ha sido posible de verificar la firma del canal"
-#: ../../include/zot.php:2313
+#: ../../include/zot.php:2338
#, php-format
msgid "Unable to verify site signature for %s"
msgstr "No ha sido posible de verificar la firma del sitio para %s"
-#: ../../include/zot.php:3764
+#: ../../include/zot.php:3946
msgid "invalid target signature"
msgstr "La firma recibida no es válida"
@@ -13269,27 +13311,27 @@ msgstr "Un grupo suprimido con este nombre ha sido restablecido. <strong>Es posi
msgid "Add new connections to this privacy group"
msgstr "Añadir conexiones nuevas a este grupo de canales"
-#: ../../include/group.php:309
+#: ../../include/group.php:310
msgid "edit"
msgstr "editar"
-#: ../../include/group.php:332
+#: ../../include/group.php:333
msgid "Edit group"
msgstr "Editar grupo"
-#: ../../include/group.php:333
+#: ../../include/group.php:334
msgid "Add privacy group"
msgstr "Añadir un grupo de canales"
-#: ../../include/group.php:334
+#: ../../include/group.php:335
msgid "Channels not in any privacy group"
msgstr "Sin canales en ningún grupo"
-#: ../../include/connections.php:127
+#: ../../include/connections.php:128
msgid "New window"
msgstr "Nueva ventana"
-#: ../../include/connections.php:128
+#: ../../include/connections.php:129
msgid "Open the selected location in a different window or browser tab"
msgstr "Abrir la dirección seleccionada en una ventana o pestaña aparte"
diff --git a/view/es-es/hstrings.php b/view/es-es/hstrings.php
index 59363f6ed..21e759cd2 100644
--- a/view/es-es/hstrings.php
+++ b/view/es-es/hstrings.php
@@ -60,6 +60,7 @@ App::$strings["%d message sent."] = array(
0 => "%d mensajes enviados.",
1 => "%d mensajes enviados.",
);
+App::$strings["Invite"] = "Invitar";
App::$strings["You have no more invitations available"] = "No tiene más invitaciones disponibles";
App::$strings["Send invitations"] = "Enviar invitaciones";
App::$strings["Enter email addresses, one per line:"] = "Introduzca las direcciones de correo electrónico, una por línea:";
@@ -82,11 +83,67 @@ App::$strings["Profile"] = "Perfil";
App::$strings["Click on a contact to add or remove."] = "Pulsar en un contacto para añadirlo o eliminarlo.";
App::$strings["Visible To"] = "Visible para";
App::$strings["All Connections"] = "Todas las conexiones";
+App::$strings["INVALID EVENT DISMISSED!"] = "¡EVENTO NO VÁLIDO RECHAZADO!";
+App::$strings["Summary: "] = "Resumen: ";
+App::$strings["Unknown"] = "Desconocido";
+App::$strings["Date: "] = "Fecha: ";
+App::$strings["Reason: "] = "Razón: ";
+App::$strings["INVALID CARD DISMISSED!"] = "¡TARJETA NO VÁLIDA RECHAZADA!";
+App::$strings["Name: "] = "Nombre: ";
+App::$strings["CalDAV"] = "CalDAV";
+App::$strings["Event title"] = "Título del evento";
+App::$strings["Start date and time"] = "Fecha y hora de comienzo";
+App::$strings["Example: YYYY-MM-DD HH:mm"] = "Ejemplo: YYYY-MM-DD HH:mm";
+App::$strings["End date and time"] = "Fecha y hora de finalización";
+App::$strings["Description"] = "Descripción";
+App::$strings["Location"] = "Ubicación";
+App::$strings["Previous"] = "Anterior";
+App::$strings["Next"] = "Siguiente";
+App::$strings["Today"] = "Hoy";
+App::$strings["Month"] = "Mes";
+App::$strings["Week"] = "Semana";
+App::$strings["Day"] = "Día";
+App::$strings["List month"] = "Lista mensual";
+App::$strings["List week"] = "Lista semanal";
+App::$strings["List day"] = "Lista diaria";
+App::$strings["More"] = "Más";
+App::$strings["Less"] = "Menos";
+App::$strings["Select calendar"] = "Seleccionar un calendario";
+App::$strings["Delete all"] = "Eliminar todos";
+App::$strings["Cancel"] = "Cancelar";
+App::$strings["Sorry! Editing of recurrent events is not yet implemented."] = "¡Disculpas! La edición de eventos recurrentes aún no se ha implementado.";
+App::$strings["CardDAV"] = "CardDAV";
+App::$strings["Name"] = "Nombre";
+App::$strings["Organisation"] = "Organización";
+App::$strings["Title"] = "Título";
+App::$strings["Phone"] = "Teléfono";
+App::$strings["Email"] = "Correo electrónico";
+App::$strings["Instant messenger"] = "Mensajería instantánea";
+App::$strings["Website"] = "Sitio web";
+App::$strings["Address"] = "Dirección";
+App::$strings["Note"] = "Nota";
+App::$strings["Mobile"] = "Móvil";
+App::$strings["Home"] = "Inicio";
+App::$strings["Work"] = "Trabajo";
+App::$strings["Add Contact"] = "Añadir un contacto";
+App::$strings["Add Field"] = "Añadir un campo";
+App::$strings["Update"] = "Actualizar";
+App::$strings["P.O. Box"] = "Buzón de correos";
+App::$strings["Additional"] = "Adicional";
+App::$strings["Street"] = "Calle";
+App::$strings["Locality"] = "Localidad";
+App::$strings["Region"] = "Provincia, región o estado";
+App::$strings["ZIP Code"] = "Código postal";
+App::$strings["Country"] = "País";
+App::$strings["Default Calendar"] = "Calendario por defecto";
+App::$strings["Default Addressbook"] = "Agenda de direcciones por defecto";
App::$strings["This site is not a directory server"] = "Este sitio no es un servidor de directorio";
App::$strings["You must be logged in to see this page."] = "Debe haber iniciado sesión para poder ver esta página.";
App::$strings["Posts and comments"] = "Publicaciones y comentarios";
App::$strings["Only posts"] = "Solo publicaciones";
+App::$strings["Channel Home"] = "Mi canal";
App::$strings["Insufficient permissions. Request redirected to profile page."] = "Permisos insuficientes. Petición redirigida a la página del perfil.";
+App::$strings["Language"] = "Idioma";
App::$strings["Export Channel"] = "Exportar el canal";
App::$strings["Export your basic channel information to a file. This acts as a backup of your connections, permissions, profile and basic data, which can be used to import your data to a new server hub, but does not contain your content."] = "Exportar la información básica del canal a un fichero. Este equivale a una copia de seguridad de sus conexiones, el perfil y datos fundamentales, que puede usarse para importar sus datos a un nuevo servidor, pero no incluye su contenido.";
App::$strings["Export Content"] = "Exportar contenidos";
@@ -106,14 +163,14 @@ App::$strings["Please select another location to become primary before removing
App::$strings["Syncing locations"] = "Sincronizando ubicaciones";
App::$strings["No locations found."] = "No encontrada ninguna dirección.";
App::$strings["Manage Channel Locations"] = "Gestionar las direcciones del canal";
-App::$strings["Location"] = "Ubicación";
-App::$strings["Address"] = "Dirección";
App::$strings["Primary"] = "Primario";
App::$strings["Drop"] = "Eliminar";
App::$strings["Sync Now"] = "Sincronizar ahora";
App::$strings["Please wait several minutes between consecutive operations."] = "Por favor, espere algunos minutos entre operaciones consecutivas.";
App::$strings["When possible, drop a location by logging into that website/hub and removing your channel."] = "Cuando sea posible, elimine una ubicación iniciando sesión en el sitio web o \"hub\" y borrando su canal.";
App::$strings["Use this form to drop the location if the hub is no longer operating."] = "Utilice este formulario para eliminar la dirección si el \"hub\" no está funcionando desde hace tiempo.";
+App::$strings["Change Order of Navigation Apps"] = "Cambiar el orden de las aplicaciones en la barra de navegación";
+App::$strings["Use arrows to move the corresponding app up or down in the display list"] = "Utilizar las flechas para mover la aplicación correspondiente hacia arriba o hacia abajo en la lista de visualización";
App::$strings["Menu not found."] = "Menú no encontrado";
App::$strings["Unable to create element."] = "No se puede crear el elemento.";
App::$strings["Unable to update menu element."] = "No es posible actualizar el elemento del menú.";
@@ -154,21 +211,19 @@ App::$strings["Unable to generate preview."] = "No se puede crear la vista previ
App::$strings["Event title and start time are required."] = "Se requieren el título del evento y su hora de inicio.";
App::$strings["Event not found."] = "Evento no encontrado.";
App::$strings["event"] = "evento";
+App::$strings["Events"] = "Eventos";
App::$strings["Edit event title"] = "Editar el título del evento";
-App::$strings["Event title"] = "Título del evento";
App::$strings["Required"] = "Obligatorio";
App::$strings["Categories (comma-separated list)"] = "Temas (lista separada por comas)";
App::$strings["Edit Category"] = "Modificar el tema";
App::$strings["Category"] = "Tema";
App::$strings["Edit start date and time"] = "Modificar la fecha y hora de comienzo";
-App::$strings["Start date and time"] = "Fecha y hora de comienzo";
App::$strings["Finish date and time are not known or not relevant"] = "La fecha y hora de terminación no se conocen o no son relevantes";
App::$strings["Edit finish date and time"] = "Modificar la fecha y hora de terminación";
App::$strings["Finish date and time"] = "Fecha y hora de terminación";
App::$strings["Adjust for viewer timezone"] = "Ajustar para obtener el visor de los husos horarios";
App::$strings["Important for events that happen in a particular place. Not practical for global holidays."] = "Importante para los eventos que suceden en un lugar determinado. No es práctico para los globales.";
App::$strings["Edit Description"] = "Editar la descripción";
-App::$strings["Description"] = "Descripción";
App::$strings["Edit Location"] = "Modificar la dirección";
App::$strings["Preview"] = "Previsualizar";
App::$strings["Permission settings"] = "Configuración de permisos";
@@ -181,13 +236,7 @@ App::$strings["Link to Source"] = "Enlazar con la entrada en su ubicación origi
App::$strings["calendar"] = "calendario";
App::$strings["Edit Event"] = "Editar el evento";
App::$strings["Create Event"] = "Crear un evento";
-App::$strings["Previous"] = "Anterior";
-App::$strings["Next"] = "Siguiente";
App::$strings["Export"] = "Exportar";
-App::$strings["Month"] = "Mes";
-App::$strings["Week"] = "Semana";
-App::$strings["Day"] = "Día";
-App::$strings["Today"] = "Hoy";
App::$strings["Event removed"] = "Evento borrado";
App::$strings["Failed to remove event"] = "Error al eliminar el evento";
App::$strings["App installed."] = "Aplicación instalada.";
@@ -238,7 +287,6 @@ App::$strings["Remove this channel and all its clones from the network"] = "Elim
App::$strings["By default only the instance of the channel located on this hub will be removed from the network"] = "Por defecto, solo la instancia del canal alojado en este servidor será eliminado de la red";
App::$strings["Remove Channel"] = "Eliminar el canal";
App::$strings["Files: shared with me"] = "Ficheros: compartidos conmigo";
-App::$strings["Name"] = "Nombre";
App::$strings["NEW"] = "NUEVO";
App::$strings["Size"] = "Tamaño";
App::$strings["Last Modified"] = "Última modificación";
@@ -270,11 +318,7 @@ App::$strings["Your account email address must match this in order to use the we
App::$strings["Website URL"] = "Dirección del sitio web";
App::$strings["Please use SSL (https) URL if available."] = "Por favor, use SSL (https) si está disponible.";
App::$strings["Please select a default timezone for your website"] = "Por favor, selecciones el huso horario por defecto de su sitio web";
-App::$strings["Basic/Minimal Social Networking"] = "Red social básica o mínima";
-App::$strings["Standard Configuration (default)"] = "Configuración estándar (por defecto)";
-App::$strings["Professional"] = "Profesional";
App::$strings["Site settings"] = "Ajustes del sitio";
-App::$strings["Server Configuration/Role"] = "Configuración del servidor";
App::$strings["PHP version 5.5 or greater is required."] = "Se requiere la versión 5.5, o superior, de PHP.";
App::$strings["PHP version"] = "Versión de PHP";
App::$strings["Could not find a command line version of PHP in the web server PATH."] = "No se puede encontrar una versión en línea de comandos de PHP en la ruta del servidor web.";
@@ -298,6 +342,7 @@ App::$strings["OpenSSL PHP module"] = "módulo PHP OpenSSL";
App::$strings["PDO database PHP module"] = "Módulo PHP de la base de datos PDO ";
App::$strings["mb_string PHP module"] = "módulo PHP mb_string";
App::$strings["xml PHP module"] = "módulo PHP xml";
+App::$strings["zip PHP module"] = "Módulo zip PHP";
App::$strings["Apache mod_rewrite module"] = "módulo Apache mod_rewrite ";
App::$strings["Error: Apache webserver mod-rewrite module is required but not installed."] = "Error: se necesita el módulo del servidor web Apache mod-rewrite pero no está instalado.";
App::$strings["exec"] = "ejecutable";
@@ -310,6 +355,7 @@ App::$strings["Error: openssl PHP module required but not installed."] = "Error:
App::$strings["Error: PDO database PHP module required but not installed."] = "Error: se necesita el módulo PHP de la base de datos PDO, pero no está instalado.";
App::$strings["Error: mb_string PHP module required but not installed."] = "Error: el módulo PHP mb_string es necesario, pero no está instalado.";
App::$strings["Error: xml PHP module required for DAV but not installed."] = "Error: el módulo PHP xml es necesario para DAV, pero no está instalado.";
+App::$strings["Error: zip PHP module required but not installed."] = "Error: se requiere el módulo zip PHP pero no está instalado.";
App::$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."] = "El instalador web no ha podido crear un fichero llamado “.htconfig.php” en la carpeta base de su servidor.";
App::$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."] = "Esto está generalmente ligado a un problema de permisos, a causa del cual el servidor web tiene prohibido modificar ficheros en su carpeta - incluso si usted mismo tiene esos permisos.";
App::$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."] = "Al término de este procedimiento, podemos crear un fichero de texto para guardar con el nombre .htconfig.php en el directorio raíz de su instalación de Hubzilla.";
@@ -334,7 +380,7 @@ App::$strings["Url rewrite in .htaccess is not working. Check your server config
App::$strings["Url rewrite is working"] = "La reescritura de las direcciones funciona correctamente";
App::$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."] = "El fichero de configuración de la base de datos .htconfig.php no se ha podido modificar. Por favor, copie el texto generado en un fichero con ese nombre en el directorio raíz de su servidor.";
App::$strings["Errors encountered creating database tables."] = "Se han encontrado errores al crear las tablas de la base de datos.";
-App::$strings["<h1>What next</h1>"] = "<h1>Siguiente paso</h1>";
+App::$strings["<h1>What next?</h1>"] = "<h1>¿Qué sigue?</h1>";
App::$strings["IMPORTANT: You will need to [manually] setup a scheduled task for the poller."] = "IMPORTANTE: Debe crear [manualmente] una tarea programada para el \"poller\".";
App::$strings["Continue"] = "Continuar";
App::$strings["Premium Channel Setup"] = "Configuración del canal premium";
@@ -389,11 +435,9 @@ App::$strings["(optional)"] = "(opcional)";
App::$strings["Download Plugin Repo"] = "Descargar el repositorio";
App::$strings["Install new repo"] = "Instalar un nuevo repositorio";
App::$strings["Install"] = "Instalar";
-App::$strings["Cancel"] = "Cancelar";
App::$strings["Manage Repos"] = "Gestionar los repositorios";
App::$strings["Installed Plugin Repositories"] = "Repositorios de los plugins instalados";
App::$strings["Install a New Plugin Repository"] = "Instalar un nuevo repositorio de plugins";
-App::$strings["Update"] = "Actualizar";
App::$strings["Switch branch"] = "Cambiar la rama";
App::$strings["Remove"] = "Eliminar";
App::$strings["%s account blocked/unblocked"] = array(
@@ -412,7 +456,6 @@ App::$strings["Accounts"] = "Cuentas";
App::$strings["select all"] = "seleccionar todo";
App::$strings["Registrations waiting for confirm"] = "Inscripciones en espera de confirmación";
App::$strings["Request date"] = "Fecha de solicitud";
-App::$strings["Email"] = "Correo electrónico";
App::$strings["No registrations."] = "Sin registros.";
App::$strings["Approve"] = "Aprobar";
App::$strings["Deny"] = "Rechazar";
@@ -605,6 +648,8 @@ App::$strings["Block embedded HTML from these domains"] = "Bloquear contenido co
App::$strings["Remote privacy information not available."] = "La información privada remota no está disponible.";
App::$strings["Visible to:"] = "Visible para:";
App::$strings["__ctx:acl__ Profile"] = "Perfil";
+App::$strings["Comment approved"] = "El comentario ha sido aprobado";
+App::$strings["Comment deleted"] = "Se ha eliminado el comentario";
App::$strings["Permission category saved."] = "Se ha guardado la categoría del permiso.";
App::$strings["Use this form to create permission rules for various classes of people or connections."] = "Utilice este formulario para crear reglas de permiso para varias clases de personas o conexiones.";
App::$strings["Permission Categories"] = "Categorías de autorización";
@@ -692,6 +737,8 @@ App::$strings["System info messages"] = "Mensajes de información del sistema";
App::$strings["System critical alerts"] = "Alertas críticas del sistema";
App::$strings["New connections"] = "Nuevas conexiones";
App::$strings["System Registrations"] = "Registros del sistema";
+App::$strings["Unseen shared files"] = "Ficheros compartidos no vistos";
+App::$strings["Unseen public activity"] = "Actividad pública no vista";
App::$strings["Also show new wall posts, private messages and connections under Notices"] = "Mostrar también en Avisos las nuevas publicaciones, los mensajes privados y las conexiones";
App::$strings["Notify me of events this many days in advance"] = "Avisarme de los eventos con algunos días de antelación";
App::$strings["Must be greater than 0"] = "Debe ser mayor que 0";
@@ -784,7 +831,6 @@ App::$strings["Client key starts with"] = "La \"client key\" empieza por";
App::$strings["No name"] = "Sin nombre";
App::$strings["Remove authorization"] = "Eliminar autorización";
App::$strings["View Photo"] = "Ver foto";
-App::$strings["Unknown"] = "Desconocido";
App::$strings["Edit Album"] = "Editar álbum";
App::$strings["Upload"] = "Subir";
App::$strings["Some blurb about what to do when you're new here"] = "Algunas propuestas para el nuevo usuario sobre qué se puede hacer aquí";
@@ -843,10 +889,11 @@ App::$strings["Create new app"] = "Crear una nueva aplicación";
App::$strings["__ctx:mood__ %1\$s is %2\$s"] = "%1\$s está %2\$s";
App::$strings["Mood"] = "Estado de ánimo";
App::$strings["Set your current mood and tell your friends"] = "Describir su estado de ánimo para comunicárselo a sus amigos";
+App::$strings["Connections"] = "Conexiones";
App::$strings["Blocked"] = "Bloqueadas";
App::$strings["Ignored"] = "Ignoradas";
App::$strings["Hidden"] = "Ocultas";
-App::$strings["Archived"] = "Archivadas";
+App::$strings["Archived/Unreachable"] = "Archivada o inaccesible";
App::$strings["New"] = "Nuevas";
App::$strings["All"] = "Todos/as";
App::$strings["New Connections"] = "Nuevas conexiones";
@@ -854,9 +901,11 @@ App::$strings["Show pending (new) connections"] = "Mostrar conexiones (nuevas) p
App::$strings["Show all connections"] = "Mostrar todas las conexiones";
App::$strings["Only show blocked connections"] = "Mostrar solo las conexiones bloqueadas";
App::$strings["Only show ignored connections"] = "Mostrar solo conexiones ignoradas";
-App::$strings["Only show archived connections"] = "Mostrar solo las conexiones archivadas";
+App::$strings["Only show archived/unreachable connections"] = "Mostrar solo las conexiones archivadas o inaccesibles";
App::$strings["Only show hidden connections"] = "Mostrar solo las conexiones ocultas";
App::$strings["Pending approval"] = "Pendiente de aprobación";
+App::$strings["Archived"] = "Archivadas";
+App::$strings["Not connected at this location"] = "No está conectado/a en esta ubicación";
App::$strings["%1\$s [%2\$s]"] = "%1\$s [%2\$s]";
App::$strings["Edit connection"] = "Editar conexión";
App::$strings["Delete connection"] = "Eliminar conexión";
@@ -869,12 +918,12 @@ App::$strings["Approve connection"] = "Aprobar esta conexión";
App::$strings["Ignore connection"] = "Ignorar esta conexión";
App::$strings["Ignore"] = "Ignorar";
App::$strings["Recent activity"] = "Actividad reciente";
-App::$strings["Connections"] = "Conexiones";
App::$strings["Search your connections"] = "Buscar sus conexiones";
App::$strings["Connections search"] = "Buscar conexiones";
App::$strings["Find"] = "Encontrar";
App::$strings["item"] = "elemento";
App::$strings["Source of Item"] = "Origen del elemento";
+App::$strings["View Bookmarks"] = "Ver los marcadores";
App::$strings["Bookmark added"] = "Marcador añadido";
App::$strings["My Bookmarks"] = "Mis marcadores";
App::$strings["My Connections Bookmarks"] = "Marcadores de mis conexiones";
@@ -889,6 +938,7 @@ App::$strings["Delete Album"] = "Borrar álbum";
App::$strings["Delete Photo"] = "Borrar foto";
App::$strings["No photos selected"] = "No hay fotos seleccionadas";
App::$strings["Access to this item is restricted."] = "El acceso a este elemento está restringido.";
+App::$strings["Photos"] = "Fotos";
App::$strings["%1$.2f MB of %2$.2f MB photo storage used."] = "%1$.2f MB de %2$.2f MB de almacenamiento de fotos utilizado.";
App::$strings["%1$.2f MB photo storage used."] = "%1$.2f MB de almacenamiento de fotos utilizado.";
App::$strings["Upload Photos"] = "Subir fotos";
@@ -947,6 +997,7 @@ App::$strings["Recent Photos"] = "Fotos recientes";
App::$strings["Profile Unavailable."] = "Perfil no disponible";
App::$strings["Not found"] = "No encontrado";
App::$strings["Invalid channel"] = "Canal no válido";
+App::$strings["Wiki"] = "Wiki";
App::$strings["Wikis"] = "Wikis";
App::$strings["Download"] = "Descargar";
App::$strings["Create New"] = "Crear";
@@ -1021,6 +1072,7 @@ App::$strings["Unable to locate original post."] = "No ha sido posible encontrar
App::$strings["Empty post discarded."] = "La entrada vacía ha sido desechada.";
App::$strings["Duplicate post suppressed."] = "Se ha suprimido la entrada duplicada.";
App::$strings["System error. Post not saved."] = "Error del sistema. La entrada no se ha podido salvar.";
+App::$strings["Your comment is awaiting approval."] = "Su comentario está pendiente de aprobación.";
App::$strings["Unable to obtain post information from database."] = "No ha sido posible obtener información de la entrada en la base de datos.";
App::$strings["You have reached your limit of %1$.0f top level posts."] = "Ha alcanzado su límite de %1$.0f entradas en la página principal.";
App::$strings["You have reached your limit of %1$.0f webpages."] = "Ha alcanzado su límite de %1$.0f páginas web.";
@@ -1078,7 +1130,10 @@ App::$strings["Accept connection to allow communication"] = "Aceptar la conexió
App::$strings["Set Affinity"] = "Ajustar la afinidad";
App::$strings["Set Profile"] = "Ajustar el perfil";
App::$strings["Set Affinity & Profile"] = "Ajustar la afinidad y el perfil";
-App::$strings["none"] = "-";
+App::$strings["This connection is unreachable from this location."] = "No se puede acceder a la conexión desde este sitio.";
+App::$strings["This connection may be unreachable from other channel locations."] = "Esta conexión puede ser inaccesible desde otras ubicaciones del canal.";
+App::$strings["Location independence is not supported by their network."] = "La independencia de ubicación no es compatible con su red.";
+App::$strings["This connection is unreachable from this location. Location independence is not supported by their network."] = "Esta conexión no es accesible desde este sitio. La independencia de ubicación no es compatible con su red.";
App::$strings["Connection Default Permissions"] = "Permisos predeterminados de conexión";
App::$strings["Connection: %s"] = "Conexión: %s";
App::$strings["Apply these permissions automatically"] = "Aplicar estos permisos automaticamente";
@@ -1103,24 +1158,7 @@ App::$strings["Please choose the profile you would like to display to %s when vi
App::$strings["Some permissions may be inherited from your channel's <a href=\"settings\"><strong>privacy settings</strong></a>, which have higher priority than individual settings. You can change those settings here but they wont have any impact unless the inherited setting changes."] = "Algunos permisos pueden ser heredados de los <a href=\"settings\"><strong>ajustes de privacidad</strong></a> de sus canales, los cuales tienen una prioridad más alta que los ajustes individuales. Puede cambiar estos ajustes aquí, pero no tendrán ningún consecuencia hasta que cambie los ajustes heredados.";
App::$strings["Last update:"] = "Última actualización:";
App::$strings["Details"] = "Detalles";
-App::$strings["Organisation"] = "Organización";
-App::$strings["Title"] = "Título";
-App::$strings["Phone"] = "Teléfono";
-App::$strings["Instant messenger"] = "Mensajería instantánea";
-App::$strings["Website"] = "Sitio web";
-App::$strings["Note"] = "Nota";
-App::$strings["Mobile"] = "Móvil";
-App::$strings["Home"] = "Inicio";
-App::$strings["Work"] = "Trabajo";
-App::$strings["Add Contact"] = "Añadir un contacto";
-App::$strings["Add Field"] = "Añadir un campo";
-App::$strings["P.O. Box"] = "Buzón de correos";
-App::$strings["Additional"] = "Adicional";
-App::$strings["Street"] = "Calle";
-App::$strings["Locality"] = "Localidad";
-App::$strings["Region"] = "Provincia, región o estado";
-App::$strings["ZIP Code"] = "Código postal";
-App::$strings["Country"] = "País";
+App::$strings["My Chatrooms"] = "Mis salas de chat";
App::$strings["Room not found"] = "Sala no encontrada";
App::$strings["Leave Room"] = "Abandonar la sala";
App::$strings["Delete Room"] = "Eliminar esta sala";
@@ -1136,7 +1174,6 @@ App::$strings["%1\$s's Chatrooms"] = "Salas de chat de %1\$s";
App::$strings["No chatrooms available"] = "No hay salas de chat disponibles";
App::$strings["Expiration"] = "Caducidad";
App::$strings["min"] = "min";
-App::$strings["Photos"] = "Fotos";
App::$strings["Files"] = "Ficheros";
App::$strings["Unable to update menu."] = "No se puede actualizar el menú.";
App::$strings["Unable to create menu."] = "No se puede crear el menú.";
@@ -1279,11 +1316,11 @@ App::$strings["Ratings"] = "Valoraciones";
App::$strings["Rating: "] = "Valoración:";
App::$strings["Website: "] = "Sitio web:";
App::$strings["Description: "] = "Descripción:";
+App::$strings["Webpages"] = "Páginas web";
App::$strings["Import Webpage Elements"] = "Importar elementos de una página web";
App::$strings["Import selected"] = "Importar elementos seleccionados";
App::$strings["Export Webpage Elements"] = "Exportar elementos de una página web";
App::$strings["Export selected"] = "Exportar los elementos seleccionados";
-App::$strings["Webpages"] = "Páginas web";
App::$strings["Actions"] = "Acciones";
App::$strings["Page Link"] = "Vínculo de la página";
App::$strings["Page Title"] = "Título de página";
@@ -1327,6 +1364,7 @@ App::$strings["Edit Source"] = "Editar fuente";
App::$strings["Delete Source"] = "Eliminar fuente";
App::$strings["Source removed"] = "Fuente eliminada";
App::$strings["Unable to remove source."] = "No se puede eliminar la fuente.";
+App::$strings["Post"] = "Publicación";
App::$strings["Like/Dislike"] = "Me gusta/No me gusta";
App::$strings["This action is restricted to members."] = "Esta acción está restringida solo para miembros.";
App::$strings["Please <a href=\"rmagic\">login with your \$Projectname ID</a> or <a href=\"register\">register as a new \$Projectname member</a> to continue."] = "Por favor, <a href=\"rmagic\">identifíquese con su \$Projectname ID</a> o <a href=\"register\">rregístrese como un nuevo \$Projectname member</a> para continuar.";
@@ -1345,6 +1383,7 @@ App::$strings["%1\$s is not attending %2\$s's %3\$s"] = "%3\$s de %2\$s: %1\$s n
App::$strings["%1\$s may attend %2\$s's %3\$s"] = "%3\$s de %2\$s: %1\$s quizá participe";
App::$strings["Action completed."] = "Acción completada.";
App::$strings["Thank you."] = "Gracias.";
+App::$strings["Directory"] = "Directorio";
App::$strings["%d rating"] = array(
0 => "%d valoración",
1 => "%d valoraciones",
@@ -1376,6 +1415,7 @@ App::$strings["Oldest to Newest"] = "De más antiguo a más nuevo";
App::$strings["No entries (some entries may be hidden)."] = "Sin entradas (algunas entradas pueden estar ocultas).";
App::$strings["Xchan Lookup"] = "Búsqueda de canales";
App::$strings["Lookup xchan beginning with (or webbie): "] = "Buscar un canal (o un \"webbie\") que comience por:";
+App::$strings["Suggest Channels"] = "Sugerir canales";
App::$strings["No suggestions available. If this is a new site, please try again in 24 hours."] = "No hay sugerencias disponibles. Si es un sitio nuevo, espere 24 horas y pruebe de nuevo.";
App::$strings["Ignore/Hide"] = "Ignorar/Ocultar";
App::$strings["Unable to find your hub."] = "No se puede encontrar su servidor.";
@@ -1384,6 +1424,7 @@ App::$strings["Unable to lookup recipient."] = "No se puede asociar a un destina
App::$strings["Unable to communicate with requested channel."] = "No se puede establecer la comunicación con el canal solicitado.";
App::$strings["Cannot verify requested channel."] = "No se puede verificar el canal solicitado.";
App::$strings["Selected channel has private message restrictions. Send failed."] = "El canal seleccionado tiene restricciones sobre los mensajes privados. El envío falló.";
+App::$strings["Mail"] = "Correo";
App::$strings["Messages"] = "Mensajes";
App::$strings["message"] = "mensaje";
App::$strings["Message recalled."] = "Mensaje revocado.";
@@ -1425,6 +1466,7 @@ App::$strings["Or enter new bookmark folder name"] = "O introduzca un nuevo nomb
App::$strings["Enter a folder name"] = "Escriba un nombre de carpeta";
App::$strings["or select an existing folder (doubleclick)"] = "o seleccione una (con un doble click)";
App::$strings["Save to Folder"] = "Guardar en carpeta";
+App::$strings["Remote Diagnostics"] = "Diagnóstico remoto";
App::$strings["Fetching URL returns error: %1\$s"] = "Al intentar obtener la dirección, retorna el error: %1\$s";
App::$strings["Maximum daily site registrations exceeded. Please try again tomorrow."] = "Se ha superado el límite máximo de inscripciones diarias de este sitio. Por favor, pruebe de nuevo mañana.";
App::$strings["Please indicate acceptance of the Terms of Service. Registration failed."] = "Por favor, confirme que acepta los Términos del servicio. El registro ha fallado.";
@@ -1469,6 +1511,7 @@ App::$strings["No such group"] = "No se encuentra el grupo";
App::$strings["No such channel"] = "No se encuentra el canal";
App::$strings["forum"] = "foro";
App::$strings["Search Results For:"] = "Buscar resultados para:";
+App::$strings["Activity"] = "Actividad";
App::$strings["Privacy group is empty"] = "El grupo de canales está vacío";
App::$strings["Privacy group: "] = "Grupo de canales: ";
App::$strings["Invalid connection."] = "Conexión no válida.";
@@ -1487,20 +1530,17 @@ App::$strings["Copy/paste this code to attach file to a post"] = "Copiar/pegar e
App::$strings["Copy/paste this URL to link file from a web page"] = "Copiar/pegar esta dirección para enlazar el fichero desde una página web";
App::$strings["Share this file"] = "Compartir este fichero";
App::$strings["Show URL to this file"] = "Mostrar la dirección de este fichero";
-App::$strings["Notify your contacts about this file"] = "Avisar a sus contactos sobre este fichero";
+App::$strings["Show in your contacts shared folder"] = "Mostrar en la carpeta compartida con sus contactos";
App::$strings["No channel."] = "Ningún canal.";
App::$strings["Common connections"] = "Conexiones comunes";
App::$strings["No connections in common."] = "Ninguna conexión en común.";
App::$strings["No connections."] = "Sin conexiones.";
App::$strings["Visit %s's profile [%s]"] = "Visitar el perfil de %s [%s]";
App::$strings["View Connections"] = "Ver conexiones";
-App::$strings["# Accounts"] = "# Cuentas";
-App::$strings["# blocked accounts"] = "# cuentas bloqueadas";
-App::$strings["# expired accounts"] = "# cuentas caducadas";
-App::$strings["# expiring accounts"] = "# cuentas que caducan";
-App::$strings["# Channels"] = "# Canales";
-App::$strings["# primary"] = "# primario";
-App::$strings["# clones"] = "# clones";
+App::$strings["Blocked accounts"] = "Cuentas bloqueadas";
+App::$strings["Expired accounts"] = "Cuentas caducadas";
+App::$strings["Expiring accounts"] = "Cuentas que caducan";
+App::$strings["Clones"] = "Clones";
App::$strings["Message queues"] = "Mensajes en cola";
App::$strings["Your software should be updated"] = "Debe actualizar su software";
App::$strings["Summary"] = "Sumario";
@@ -1532,29 +1572,22 @@ App::$strings["Forgot your Password?"] = "¿Ha olvidado su contraseña?";
App::$strings["Enter your email address and submit to have your password reset. Then check your email for further instructions."] = "Introduzca y envíe su dirección de correo electrónico para el restablecimiento de su contraseña. Luego revise su correo para obtener más instrucciones.";
App::$strings["Email Address"] = "Dirección de correo electrónico";
App::$strings["Reset"] = "Reiniciar";
-App::$strings["Mark all system notifications seen"] = "Marcar todas las notificaciones del sistema como leídas";
+App::$strings["Mark all seen"] = "Marcar todo como visto";
+App::$strings["0. Beginner/Basic"] = "0. Principiante/Básico";
+App::$strings["1. Novice - not skilled but willing to learn"] = "1. Novicio - no está preparado pero está dispuestos a aprender";
+App::$strings["2. Intermediate - somewhat comfortable"] = "2. Intermedio - algo cómodo";
+App::$strings["3. Advanced - very comfortable"] = "3. Avanzado - muy cómodo";
+App::$strings["4. Expert - I can write computer code"] = "4. Experto - Puedo escribir código informático";
+App::$strings["5. Wizard - I probably know more than you do"] = "5. Asistente - probablemente sé más que tú";
App::$strings["Site Admin"] = "Administrador del sitio";
App::$strings["Report Bug"] = "Informe de errores";
-App::$strings["View Bookmarks"] = "Ver los marcadores";
-App::$strings["My Chatrooms"] = "Mis salas de chat";
App::$strings["Firefox Share"] = "Servicio de compartición de Firefox";
-App::$strings["Remote Diagnostics"] = "Diagnóstico remoto";
-App::$strings["Suggest Channels"] = "Sugerir canales";
App::$strings["Login"] = "Iniciar sesión";
-App::$strings["Activity"] = "Actividad";
-App::$strings["Wiki"] = "Wiki";
-App::$strings["Channel Home"] = "Mi canal";
-App::$strings["Events"] = "Eventos";
-App::$strings["Directory"] = "Directorio";
-App::$strings["Mail"] = "Correo";
App::$strings["Chat"] = "Chat";
App::$strings["Probe"] = "Probar";
App::$strings["Suggest"] = "Sugerir";
App::$strings["Random Channel"] = "Canal aleatorio";
-App::$strings["Invite"] = "Invitar";
App::$strings["Features"] = "Funcionalidades";
-App::$strings["Language"] = "Idioma";
-App::$strings["Post"] = "Publicación";
App::$strings["Profile Photo"] = "Foto del perfil";
App::$strings["Purchase"] = "Comprar";
App::$strings["Undelete"] = "Recuperar";
@@ -1611,9 +1644,11 @@ App::$strings["Please visit %s to view and/or reply to your private messages."]
App::$strings["%1\$s, %2\$s commented on [zrl=%3\$s]a %4\$s[/zrl]"] = "%1\$s, %2\$s ha comentado [zrl=%3\$s]%4\$s[/zrl]";
App::$strings["%1\$s, %2\$s commented on [zrl=%3\$s]%4\$s's %5\$s[/zrl]"] = "%1\$s, %2\$s ha comentado [zrl=%3\$s]%5\$s de %4\$s[/zrl] ";
App::$strings["%1\$s, %2\$s commented on [zrl=%3\$s]your %4\$s[/zrl]"] = "%1\$s, %2\$s ha comentado [zrl=%3\$s]%4\$s creado por usted[/zrl]";
+App::$strings["[\$Projectname:Notify] Moderated Comment to conversation #%1\$d by %2\$s"] = "[\$Projectname:Aviso] Comentario moderado en la conversación #%1\$d por %2\$s";
App::$strings["[\$Projectname:Notify] Comment to conversation #%1\$d by %2\$s"] = "[\$Projectname:Aviso] Nuevo comentario de %2\$s en la conversación #%1\$d";
App::$strings["%1\$s, %2\$s commented on an item/conversation you have been following."] = "%1\$s, %2\$s ha comentado un elemento/conversación que ha estado siguiendo.";
App::$strings["Please visit %s to view and/or reply to the conversation."] = "Para ver o comentar la conversación, visite %s";
+App::$strings["Please visit %s to approve or reject this comment."] = "Por favor, visite %spara aprobar o rechazar este comentario.";
App::$strings["%1\$s, %2\$s liked [zrl=%3\$s]your %4\$s[/zrl]"] = "%1\$s, %2\$s ha mostrado su agrado por [zrl=%3\$s]%4\$s creado por usted[/zrl]";
App::$strings["[\$Projectname:Notify] Like received to conversation #%1\$d by %2\$s"] = "[\$Projectname:Aviso] \"Me gusta\" de %2\$s en la conversación #%1\$d";
App::$strings["%1\$s, %2\$s liked an item/conversation you created."] = "%1\$s, %2\$s ha mostrado su agrado por un elemento o conversación que ha creado usted.";
@@ -1684,7 +1719,6 @@ App::$strings["Vote"] = "Votar";
App::$strings["Voting Options"] = "Opciones de votación";
App::$strings["Save Bookmarks"] = "Guardar en Marcadores";
App::$strings["Add to Calendar"] = "Añadir al calendario";
-App::$strings["Mark all seen"] = "Marcar todo como visto";
App::$strings["%s show all"] = "%s mostrar todo";
App::$strings["Bold"] = "Negrita";
App::$strings["Italic"] = "Itálico ";
@@ -1694,6 +1728,9 @@ App::$strings["Code"] = "Código";
App::$strings["Image"] = "Imagen";
App::$strings["Insert Link"] = "Insertar enlace";
App::$strings["Video"] = "Vídeo";
+App::$strings["Your full name (required)"] = "Su nombre completo (requerido)";
+App::$strings["Your email address (required)"] = "Su dirección de correo electrónico (requerido)";
+App::$strings["Your website URL (optional)"] = "La URL de su sitio web (opcional)";
App::$strings["Remote authentication blocked. You are logged into this site locally. Please logout and retry."] = "La autenticación desde su servidor está bloqueada. Ha iniciado sesión localmente. Por favor, salga de la sesión y vuelva a intentarlo.";
App::$strings["Welcome %s. Remote authentication successful."] = "Bienvenido %s. La identificación desde su servidor se ha llevado a cabo correctamente.";
App::$strings["parent"] = "padre";
@@ -1713,6 +1750,25 @@ App::$strings["Create new folder"] = "Crear nueva carpeta";
App::$strings["Upload file"] = "Subir fichero";
App::$strings["Drop files here to immediately upload"] = "Arrastre los ficheros aquí para subirlos de forma inmediata";
App::$strings["Forums"] = "Foros";
+App::$strings["Select Channel"] = "Seleccionar un canal";
+App::$strings["Read-write"] = "Lectura y escritura";
+App::$strings["Read-only"] = "Sólo lectura";
+App::$strings["My Calendars"] = "Mis calendarios";
+App::$strings["Shared Calendars"] = "Calendarios compartidos";
+App::$strings["Share this calendar"] = "Compartir este calendario";
+App::$strings["Calendar name and color"] = "Nombre y color del calendario";
+App::$strings["Create new calendar"] = "Crear un nuevo calendario";
+App::$strings["Calendar Name"] = "Nombre del calendario";
+App::$strings["Calendar Tools"] = "Gestión de calendarios";
+App::$strings["Import calendar"] = "Importar un calendario";
+App::$strings["Select a calendar to import to"] = "Seleccionar un calendario para importarlo";
+App::$strings["Addressbooks"] = "Agenda de direcciones";
+App::$strings["Addressbook name"] = "Nombre de la agenda";
+App::$strings["Create new addressbook"] = "Crear una nueva agenda de direcciones";
+App::$strings["Addressbook Name"] = "Nombre de la agenda";
+App::$strings["Addressbook Tools"] = "Gestión de agendas de direcciones";
+App::$strings["Import addressbook"] = "Importar una agenda de direcciones";
+App::$strings["Select an addressbook to import to"] = "Seleccionar una agenda para importarla";
App::$strings["Categories"] = "Temas";
App::$strings["Everything"] = "Todo";
App::$strings["Events Tools"] = "Gestión de eventos";
@@ -1736,9 +1792,9 @@ App::$strings["Enter channel address"] = "Dirección del canal";
App::$strings["Examples: bob@example.com, https://example.com/barbara"] = "Ejemplos: manuel@ejemplo.com, https://ejemplo.com/carmen";
App::$strings["Wiki List"] = "Lista de wikis";
App::$strings["Archives"] = "Hemeroteca";
-App::$strings["Conversations"] = "Conversaciones";
App::$strings["Received Messages"] = "Mensajes recibidos";
App::$strings["Sent Messages"] = "Enviar mensajes";
+App::$strings["Conversations"] = "Conversaciones";
App::$strings["No messages."] = "Sin mensajes.";
App::$strings["Delete conversation"] = "Eliminar conversación";
App::$strings["Chat Members"] = "Miembros del chat";
@@ -1773,8 +1829,6 @@ App::$strings["Permission Groups"] = "Grupos de permisos";
App::$strings["Premium Channel Settings"] = "Configuración del canal premium";
App::$strings["Bookmarked Chatrooms"] = "Salas de chat preferidas";
App::$strings["Source channel not found."] = "No se ha encontrado el canal de origen.";
-App::$strings["__ctx:opensearch__ Search %1\$s (%2\$s)"] = "Buscar %1\$s (%2\$s)";
-App::$strings["__ctx:opensearch__ \$Projectname"] = "\$Projectname";
App::$strings["Create an account to access services and applications"] = "Crear una cuenta para acceder a los servicios y aplicaciones";
App::$strings["Logout"] = "Finalizar sesión";
App::$strings["Login/Email"] = "Inicio de sesión / Correo electrónico";
@@ -1840,58 +1894,11 @@ App::$strings["Some setting"] = "Algunos ajustes";
App::$strings["A setting"] = "Un ajuste";
App::$strings["Skeleton Settings"] = "Ajustes de Skeleton";
App::$strings["GNU-Social Protocol Settings updated."] = "Se han actualizado los ajustes del protocolo de GNU-Social.";
+App::$strings["The GNU-Social protocol does not support location independence. Connections you make within that network may be unreachable from alternate channel locations."] = "El protocolo de GNU-Social no admite la independencia de la ubicación. Las\n conexiones que realice dentro de esa red pueden ser inaccesibles desde \nubicaciones de canales alternativos.";
App::$strings["Enable the GNU-Social protocol for this channel"] = "Activar el protocolo de GNU-Social para este canal";
App::$strings["GNU-Social Protocol Settings"] = "Ajustes del protocolo de GNU-Social";
App::$strings["Follow"] = "Seguir";
App::$strings["%1\$s is now following %2\$s"] = "%1\$s está siguiendo ahora a %2\$s";
-App::$strings["INVALID EVENT DISMISSED!"] = "¡EVENTO NO VÁLIDO RECHAZADO!";
-App::$strings["Summary: "] = "Resumen: ";
-App::$strings["Date: "] = "Fecha: ";
-App::$strings["Reason: "] = "Razón: ";
-App::$strings["INVALID CARD DISMISSED!"] = "¡TARJETA NO VÁLIDA RECHAZADA!";
-App::$strings["Name: "] = "Nombre: ";
-App::$strings["You have to enable this plugin in Feature/Addon Settings > CalDAV/CardDAV Settings before you can use it."] = "Debe habilitar este complemento en Ajustes/Complementos>Configuración de CalDAV/CardDAV antes de poder utilizarlo.";
-App::$strings["Example: YYYY-MM-DD HH:mm"] = "Ejemplo: YYYY-MM-DD HH:mm";
-App::$strings["End date and time"] = "Fecha y hora de finalización";
-App::$strings["List month"] = "Lista mensual";
-App::$strings["List week"] = "Lista semanal";
-App::$strings["List day"] = "Lista diaria";
-App::$strings["More"] = "Más";
-App::$strings["Less"] = "Menos";
-App::$strings["Select calendar"] = "Seleccionar un calendario";
-App::$strings["Delete all"] = "Eliminar todos";
-App::$strings["Sorry! Editing of recurrent events is not yet implemented."] = "¡Disculpas! La edición de eventos recurrentes aún no se ha implementado.";
-App::$strings["Errors encountered creating database table: "] = "Errores encontrados al crear la tabla de la base de datos: ";
-App::$strings["Default Calendar"] = "Calendario por defecto";
-App::$strings["Default Addressbook"] = "Agenda de direcciones por defecto";
-App::$strings["CalDAV/CardDAV Settings saved."] = "Se ha guardado la configuración de CalDAV/CardDAV.";
-App::$strings["Enable CalDAV/CardDAV Server for this channel"] = "Habilitar el servidor CalDAV/CardDAV para este canal";
-App::$strings["Your CalDAV resources are located at %s "] = "Los recursos de CalDAV se encuentran en %s";
-App::$strings["Your CardDAV resources are located at %s "] = "Sus recursos de CalDAV están localizados en %s ";
-App::$strings["CalDAV/CardDAV Settings"] = "Configuración de CalDAV/CardDAV";
-App::$strings["Home, Voice"] = "Llamadas particulares";
-App::$strings["Home, Fax"] = "Fax particular";
-App::$strings["Work, Voice"] = "Llamadas de trabajo";
-App::$strings["Work, Fax"] = "Fax de trabajo";
-App::$strings["Select Channel"] = "Seleccionar un canal";
-App::$strings["Read-write"] = "Lectura y escritura";
-App::$strings["Read-only"] = "Sólo lectura";
-App::$strings["My Calendars"] = "Mis calendarios";
-App::$strings["Shared Calendars"] = "Calendarios compartidos";
-App::$strings["Share this calendar"] = "Compartir este calendario";
-App::$strings["Calendar name and color"] = "Nombre y color del calendario";
-App::$strings["Create new calendar"] = "Crear un nuevo calendario";
-App::$strings["Calendar Name"] = "Nombre del calendario";
-App::$strings["Calendar Tools"] = "Gestión de calendarios";
-App::$strings["Import calendar"] = "Importar un calendario";
-App::$strings["Select a calendar to import to"] = "Seleccionar un calendario para importarlo";
-App::$strings["Addressbooks"] = "Agenda de direcciones";
-App::$strings["Addressbook name"] = "Nombre de la agenda";
-App::$strings["Create new addressbook"] = "Crear una nueva agenda de direcciones";
-App::$strings["Addressbook Name"] = "Nombre de la agenda";
-App::$strings["Addressbook Tools"] = "Gestión de agendas de direcciones";
-App::$strings["Import addressbook"] = "Importar una agenda de direcciones";
-App::$strings["Select an addressbook to import to"] = "Seleccionar una agenda para importarla";
App::$strings["Planets Settings updated."] = "Se han guardado los ajustes de Planets.";
App::$strings["Enable Planets Plugin"] = "Habilitar el plugin Planets";
App::$strings["Planets Settings"] = "Ajustes de Planets";
@@ -2080,9 +2087,11 @@ App::$strings["bonked"] = "ha golpeado a";
App::$strings["declare undying love for"] = "una declaración de amor eterno";
App::$strings["declared undying love for"] = "ha declarado amor eterno a";
App::$strings["Diaspora Protocol Settings updated."] = "Los ajustes del protocolo de Diaspora se han actualizado.";
+App::$strings["The Diaspora protocol does not support location independence. Connections you make within that network may be unreachable from alternate channel locations."] = "El protocolo de Diaspora no admite la independencia de la ubicación. Las conexiones que realice dentro de esa red pueden ser inaccesibles desde ubicaciones de canales alternativos.";
App::$strings["Enable the Diaspora protocol for this channel"] = "Activar el protocolo de Diaspora para este canal";
App::$strings["Allow any Diaspora member to comment on your public posts"] = "Permitir a cualquier miembro de Diaspora comentar sus entradas públicas";
App::$strings["Prevent your hashtags from being redirected to other sites"] = "Impedir que sus \"hashtags\" sean redirigidos a otros sitios ";
+App::$strings["Sign and forward posts and comments with no existing Diaspora signature"] = "Firmar y enviar entradas y comentarios sin firma de Diaspora";
App::$strings["Followed hashtags (comma separated, do not include the #)"] = "\"Hashtags\" seguidos (separados por comas, sin incluir #)";
App::$strings["Diaspora Protocol Settings"] = "Ajustes del protocolo de Diaspora";
App::$strings["No username found in import file."] = "No se ha encontrado el nombre de usuario en el fichero de importación.";
@@ -2115,10 +2124,6 @@ App::$strings["Mail sent."] = "El correo electrónico ha sido enviado.";
App::$strings["Sending of mail failed."] = "No se pudo enviar el correo.";
App::$strings["Mail Test"] = "Prueba de correo";
App::$strings["Message subject"] = "Asunto del mensaje";
-App::$strings["Reconnecting %d connections"] = "Reconectando %d conexiones";
-App::$strings["Diaspora Reconnect"] = "Reconectar con Diaspora";
-App::$strings["Use this form to re-establish Diaspora connections which were initially made from a different hub."] = "Utilice este formulario para restablecer las conexiones de diáspora que se hicieron inicialmente desde un hub diferente.";
-App::$strings["Reconnect"] = "Reconectar";
App::$strings["View Larger"] = "Ver más grande";
App::$strings["Tile Server URL"] = "URL del servidor de mosaicos de imágenes ";
App::$strings["A list of <a href=\"http://wiki.openstreetmap.org/wiki/TMS\" target=\"_blank\">public tile servers</a>"] = "Una lista de <a href=\"http://wiki.openstreetmap.org/wiki/TMS\" target=\"_blank\">servidores públicos de mosaicos de imágenes</a>";
@@ -2344,6 +2349,10 @@ App::$strings["I won!"] = "¡He ganado yo!";
App::$strings["Message to display on every page on this server"] = "Mensaje para mostrar en todas las páginas de este servidor";
App::$strings["Pageheader Settings"] = "Ajustes del encabezado de página";
App::$strings["pageheader Settings saved."] = "Se han guardado los ajustes del encabezado de página.";
+App::$strings["Only authenticate automatically to sites of your friends"] = "Autenticación automática solo en los sitios de sus amigos";
+App::$strings["By default you are automatically authenticated anywhere in the network"] = "De forma predeterminada, se autenticará automáticamente en cualquier parte de la red";
+App::$strings["Authchoose Settings"] = "Ajustes de Authchoose";
+App::$strings["Atuhchoose Settings updated."] = "Se han actualizado los ajustes de Atuhchoose.";
App::$strings["lonely"] = "Solo/a";
App::$strings["drunk"] = "ebrio/a";
App::$strings["horny"] = "caliente";
@@ -2392,6 +2401,8 @@ App::$strings["Pump.io Post Settings"] = "Ajustes de publicación en pump.io";
App::$strings["PumpIO Settings saved."] = "Se han guardado los ajustes de PumpIO.";
App::$strings["An account has been created for you."] = "Se ha creado una cuenta para usted.";
App::$strings["Authentication successful but rejected: account creation is disabled."] = "Autenticación correcta pero rechazada: la creación de cuentas está deshabilitada.";
+App::$strings["__ctx:opensearch__ Search %1\$s (%2\$s)"] = "Buscar %1\$s (%2\$s)";
+App::$strings["__ctx:opensearch__ \$Projectname"] = "\$Projectname";
App::$strings["Search \$Projectname"] = "Buscar \$Projectname";
App::$strings["Redmatrix File Storage Import"] = "Importar repositorio de ficheros de Redmatrix";
App::$strings["This will import all your Redmatrix cloud files to this channel."] = "Esto importará todos sus ficheros de la nube de Redmatrix a este canal.";
@@ -2553,19 +2564,6 @@ App::$strings["__ctx:noun__ Abstain"] = array(
0 => "se abstiene",
1 => "Se abstienen",
);
-App::$strings["Can view my normal stream and posts"] = "Pueden verse mi actividad y publicaciones normales";
-App::$strings["Can view my webpages"] = "Pueden verse mis páginas web";
-App::$strings["Can post on my channel page (\"wall\")"] = "Pueden crearse entradas en mi página de inicio del canal (“muro”)";
-App::$strings["Can like/dislike stuff"] = "Puede marcarse contenido como me gusta/no me gusta";
-App::$strings["Profiles and things other than posts/comments"] = "Perfiles y otras cosas aparte de publicaciones/comentarios";
-App::$strings["Can forward to all my channel contacts via post @mentions"] = "Puede enviarse una entrada a todos mis contactos del canal mediante una @mención";
-App::$strings["Advanced - useful for creating group forum channels"] = "Avanzado - útil para crear canales de foros de discusión o grupos";
-App::$strings["Can chat with me (when available)"] = "Se puede charlar conmigo (cuando esté disponible)";
-App::$strings["Can write to my file storage and photos"] = "Puede escribirse en mi repositorio de ficheros y fotos";
-App::$strings["Can edit my webpages"] = "Pueden editarse mis páginas web";
-App::$strings["Somewhat advanced - very useful in open communities"] = "Algo avanzado - muy útil en comunidades abiertas";
-App::$strings["Can administer my channel resources"] = "Pueden administrarse mis recursos del canal";
-App::$strings["Extremely advanced. Leave this alone unless you know what you are doing"] = "Muy avanzado. Déjelo a no ser que sepa bien lo que está haciendo.";
App::$strings["Directory Options"] = "Opciones del directorio";
App::$strings["Safe Mode"] = "Modo seguro";
App::$strings["Public Forums Only"] = "Solo foros públicos";
@@ -2636,11 +2634,13 @@ App::$strings["Unknown Attachment"] = "Adjunto no reconocido";
App::$strings["unknown"] = "desconocido";
App::$strings["remove category"] = "eliminar el tema";
App::$strings["remove from file"] = "eliminar del fichero";
+App::$strings["Download binary/encrypted content"] = "Descargar contenido binario o cifrado";
App::$strings["default"] = "por defecto";
App::$strings["Page layout"] = "Plantilla de la página";
App::$strings["You can create your own with the layouts tool"] = "Puede crear su propia disposición gráfica con la herramienta de plantillas";
App::$strings["Page content type"] = "Tipo de contenido de la página";
App::$strings["activity"] = "la actividad";
+App::$strings["a-z, 0-9, -, _, and . only"] = "a-z, 0-9, -, _, and . only";
App::$strings["Design Tools"] = "Herramientas de diseño web";
App::$strings["Pages"] = "Páginas";
App::$strings["Import website..."] = "Importar un sitio web...";
@@ -2674,11 +2674,7 @@ App::$strings["%d connection in common"] = array(
1 => "%d conexiones en común",
);
App::$strings["show more"] = "mostrar más";
-App::$strings["Attachments:"] = "Ficheros adjuntos: ";
-App::$strings["l F d, Y \\@ g:i A"] = "l d de F, Y \\@ G:i";
-App::$strings["\$Projectname event notification:"] = "Notificación de eventos de \$Projectname: ";
-App::$strings["Starts:"] = "Comienza:";
-App::$strings["Finishes:"] = "Finaliza:";
+App::$strings["%1\$s wrote the following %2\$s %3\$s"] = "%1\$s escribió %2\$s siguiente %3\$s";
App::$strings["Channel is blocked on this site."] = "El canal está bloqueado en este sitio.";
App::$strings["Channel location missing."] = "Falta la dirección del canal.";
App::$strings["Response from remote channel was incomplete."] = "Respuesta incompleta del canal.";
@@ -2795,11 +2791,13 @@ App::$strings["Reserved nickname. Please choose another."] = "Sobrenombre en uso
App::$strings["Nickname has unsupported characters or is already being used on this site."] = "El alias contiene caracteres no admitidos o está ya en uso por otros miembros de este sitio.";
App::$strings["Unable to retrieve created identity"] = "No ha sido posible recuperar la identidad creada";
App::$strings["Default Profile"] = "Perfil principal";
+App::$strings["Unable to retrieve modified identity"] = "No se puede recuperar la identidad modficada";
App::$strings["Create New Profile"] = "Crear un nuevo perfil";
App::$strings["Visible to everybody"] = "Visible para todos";
App::$strings["Gender:"] = "Género:";
App::$strings["Homepage:"] = "Página personal:";
App::$strings["Online Now"] = "Ahora en línea";
+App::$strings["Trans"] = "Trans";
App::$strings["Like this channel"] = "Me gusta este canal";
App::$strings["j F, Y"] = "j F Y";
App::$strings["j F"] = "j F";
@@ -2823,25 +2821,31 @@ App::$strings["Work/employment:"] = "Trabajo:";
App::$strings["School/education:"] = "Estudios:";
App::$strings["Like this thing"] = "Me gusta esto";
App::$strings["User '%s' deleted"] = "El usuario '%s' ha sido eliminado";
+App::$strings["l F d, Y \\@ g:i A"] = "l d de F, Y \\@ G:i";
+App::$strings["Starts:"] = "Comienza:";
+App::$strings["Finishes:"] = "Finaliza:";
App::$strings["This event has been added to your calendar."] = "Este evento ha sido añadido a su calendario.";
App::$strings["Not specified"] = "Sin especificar";
App::$strings["Needs Action"] = "Necesita de una intervención";
App::$strings["Completed"] = "Completado/a";
App::$strings["In Process"] = "En proceso";
App::$strings["Cancelled"] = "Cancelado/a";
+App::$strings["Home, Voice"] = "Llamadas particulares";
+App::$strings["Home, Fax"] = "Fax particular";
+App::$strings["Work, Voice"] = "Llamadas de trabajo";
+App::$strings["Work, Fax"] = "Fax de trabajo";
App::$strings["view full size"] = "Ver en el tamaño original";
-App::$strings["No Subject"] = "Sin asunto";
App::$strings["Friendica"] = "Friendica";
App::$strings["OStatus"] = "OStatus";
App::$strings["GNU-Social"] = "GNU Social";
App::$strings["RSS/Atom"] = "RSS/Atom";
+App::$strings["ActivityPub"] = "ActivityPub";
App::$strings["Diaspora"] = "Diaspora";
App::$strings["Facebook"] = "Facebook";
App::$strings["Zot"] = "Zot";
App::$strings["LinkedIn"] = "LinkedIn";
App::$strings["XMPP/IM"] = "XMPP/IM";
App::$strings["MySpace"] = "MySpace";
-App::$strings["New Page"] = "Nueva página";
App::$strings["Select an alternate language"] = "Seleccionar un idioma alternativo";
App::$strings["Who can see this?"] = "¿Quién puede ver esto?";
App::$strings["Custom selection"] = "Selección personalizada";
@@ -2854,7 +2858,6 @@ App::$strings["Image/photo"] = "Imagen/foto";
App::$strings["Encrypted content"] = "Contenido cifrado";
App::$strings["Install %s element: "] = "Instalar el elemento %s:";
App::$strings["This post contains an installable %s element, however you lack permissions to install it on this site."] = "Esta entrada contiene el elemento instalable %s, sin embargo le faltan permisos para instalarlo en este sitio.";
-App::$strings["%1\$s wrote the following %2\$s %3\$s"] = "%1\$s escribió %2\$s siguiente %3\$s";
App::$strings["Click to open/close"] = "Pulsar para abrir/cerrar";
App::$strings["spoiler"] = "spoiler";
App::$strings["$1 wrote:"] = "$1 escribió:";
@@ -3017,6 +3020,7 @@ App::$strings["Mark all channel notifications seen"] = "Marcar todas las notific
App::$strings["Notices"] = "Avisos";
App::$strings["Notifications"] = "Notificaciones";
App::$strings["View all notifications"] = "Ver todas las notificaciones";
+App::$strings["Mark all system notifications seen"] = "Marcar todas las notificaciones del sistema como leídas";
App::$strings["Private mail"] = "Correo privado";
App::$strings["View your private messages"] = "Ver sus mensajes privados";
App::$strings["Mark all private messages seen"] = "Marcar todos los mensajes privados como leídos";
@@ -3025,10 +3029,16 @@ App::$strings["View events"] = "Ver los eventos";
App::$strings["Mark all events seen"] = "Marcar todos los eventos como leidos";
App::$strings["Manage Your Channels"] = "Gestionar sus canales";
App::$strings["Account/Channel Settings"] = "Ajustes de cuenta/canales";
+App::$strings["Shared Files"] = "Ficheros compartidos";
+App::$strings["New files shared with me"] = "Nuevos ficheros compartidos conmigo";
+App::$strings["Public stream"] = "\"Stream\" público";
+App::$strings["Public stream activities"] = "Actividades del \"stream\" público";
App::$strings["Site Setup and Configuration"] = "Ajustes y configuración del sitio";
App::$strings["@name, #tag, ?doc, content"] = "@nombre, #etiqueta, ?ayuda, contenido";
App::$strings["Please wait..."] = "Espere por favor…";
App::$strings["Add Apps"] = "Añadir aplicaciones";
+App::$strings["Arrange Apps"] = "Organizar aplicaciones";
+App::$strings["Toggle System Apps"] = "Alternar aplicaciones de sistema";
App::$strings["Image exceeds website size limit of %lu bytes"] = "La imagen excede el límite de %lu bytes del sitio";
App::$strings["Image file is empty."] = "El fichero de imagen está vacío. ";
App::$strings["Photo storage failed."] = "La foto no ha podido ser guardada.";
diff --git a/view/fr/htconfig.tpl b/view/fr/htconfig.tpl
index fae8e3f98..ddc1d1053 100644
--- a/view/fr/htconfig.tpl
+++ b/view/fr/htconfig.tpl
@@ -35,15 +35,6 @@ App::$config['system']['baseurl'] = '{{$siteurl}}';
App::$config['system']['sitename'] = "Hubzilla";
App::$config['system']['location_hash'] = '{{$site_id}}';
-// Choices are 'basic', 'standard', and 'pro'.
-// basic sets up the sevrer for basic social networking and removes "complicated" features
-// standard provides most desired features except e-commerce
-// pro gives you access to everything
-
-App::$config['system']['server_role'] = '{{$server_role}}';
-
-
-
// These lines set additional security headers to be sent with all responses
// You may wish to set transport_security_header to 0 if your server already sends
// this header. content_security_policy may need to be disabled if you wish to
diff --git a/view/it/htconfig.tpl b/view/it/htconfig.tpl
index ea3f5b5c2..5acb0ebe2 100644
--- a/view/it/htconfig.tpl
+++ b/view/it/htconfig.tpl
@@ -34,14 +34,6 @@ App::$config['system']['baseurl'] = '{{$siteurl}}';
App::$config['system']['sitename'] = "Hubzilla";
App::$config['system']['location_hash'] = '{{$site_id}}';
-// Choices are 'basic', 'standard', and 'pro'.
-// basic sets up the sevrer for basic social networking and removes "complicated" features
-// standard provides most desired features except e-commerce
-// pro gives you access to everything
-
-App::$config['system']['server_role'] = '{{$server_role}}';
-
-
// These lines set additional security headers to be sent with all responses
// You may wish to set transport_security_header to 0 if your server already sends
// this header. content_security_policy may need to be disabled if you wish to
diff --git a/view/js/main.js b/view/js/main.js
index 38b9754a1..8f981fe31 100644
--- a/view/js/main.js
+++ b/view/js/main.js
@@ -13,6 +13,7 @@ function commentOpenUI(obj, id) {
$("#comment-edit-text-" + id).attr('tabindex','9');
$("#comment-edit-submit-" + id).attr('tabindex','10');
$("#comment-tools-" + id).show();
+ $("#comment-edit-anon-" + id).show();
}
};
@@ -20,15 +21,20 @@ function commentOpenUI(obj, id) {
}
function commentCloseUI(obj, id) {
- $(document).unbind( "click.commentClose", handler );
+ var form_id = $(obj)[0].form.id;
+
+ $('#' + form_id).on('click', function(e) {
+ $(document).unbind( "click.commentClose", handler );
+ });
var handler = function() {
- if(obj.value === '') {
- obj.value = aStr.comment;
+ if($('#comment-edit-text-' + id).val() === '') {
+ $('#comment-edit-text-' + id).val(aStr.comment);
$("#comment-edit-text-" + id).removeClass("comment-edit-text-full").addClass("comment-edit-text-empty");
$("#comment-edit-text-" + id).removeAttr('tabindex');
$("#comment-edit-submit-" + id).removeAttr('tabindex');
$("#comment-tools-" + id).hide();
+ $("#comment-edit-anon-" + id).hide();
}
};
@@ -41,7 +47,8 @@ function commentOpen(obj, id) {
$("#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-tools-" + id);
+ $("#comment-tools-" + id).show();
+ $("#comment-edit-anon-" + id).show();
return true;
}
return false;
@@ -53,7 +60,8 @@ function commentClose(obj, id) {
$("#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-tools-" + id);
+ $("#comment-tools-" + id).hide();
+ $("#comment-edit-anon-" + id).hide();
return true;
}
return false;
@@ -373,7 +381,7 @@ function NavUpdate() {
}
else {
$('#notifications-btn').css('opacity', 0.5);
- $('#navbar-collapse-1').removeClass('in');
+ $('#navbar-collapse-1').removeClass('show');
}
if(data.network == 0) {
diff --git a/view/nb-no/htconfig.tpl b/view/nb-no/htconfig.tpl
index ea3f5b5c2..5acb0ebe2 100644
--- a/view/nb-no/htconfig.tpl
+++ b/view/nb-no/htconfig.tpl
@@ -34,14 +34,6 @@ App::$config['system']['baseurl'] = '{{$siteurl}}';
App::$config['system']['sitename'] = "Hubzilla";
App::$config['system']['location_hash'] = '{{$site_id}}';
-// Choices are 'basic', 'standard', and 'pro'.
-// basic sets up the sevrer for basic social networking and removes "complicated" features
-// standard provides most desired features except e-commerce
-// pro gives you access to everything
-
-App::$config['system']['server_role'] = '{{$server_role}}';
-
-
// These lines set additional security headers to be sent with all responses
// You may wish to set transport_security_header to 0 if your server already sends
// this header. content_security_policy may need to be disabled if you wish to
diff --git a/view/pdl/mod_cdav.pdl b/view/pdl/mod_cdav.pdl
new file mode 100644
index 000000000..ae26810c4
--- /dev/null
+++ b/view/pdl/mod_cdav.pdl
@@ -0,0 +1,3 @@
+[region=aside]
+[widget=cdav][/widget]
+[/region]
diff --git a/view/php/default.php b/view/php/default.php
index e4553a17f..bd4d7dc22 100644
--- a/view/php/default.php
+++ b/view/php/default.php
@@ -8,7 +8,7 @@
<body <?php if($page['direction']) echo 'dir="rtl"' ?> >
<?php if(x($page,'banner')) echo $page['banner']; ?>
<header><?php if(x($page,'header')) echo $page['header']; ?></header>
- <nav class="navbar fixed-top navbar-expand-md navbar-inverse bg-inverse"><?php if(x($page,'nav')) echo $page['nav']; ?></nav>
+ <nav class="navbar fixed-top navbar-expand-md navbar-dark bg-dark"><?php if(x($page,'nav')) echo $page['nav']; ?></nav>
<main>
<aside id="region_1"><div id="left_aside_spacer"><div id="left_aside_wrapper"><?php if(x($page,'aside')) echo $page['aside']; ?></div></div></aside>
<section id="region_2"><?php if(x($page,'content')) echo $page['content']; ?>
diff --git a/view/php/full.php b/view/php/full.php
index 64e32c5bd..094874766 100644
--- a/view/php/full.php
+++ b/view/php/full.php
@@ -7,7 +7,7 @@
</head>
<body>
<header><?php if(x($page,'header')) echo $page['header']; ?></header>
- <nav class="navbar fixed-top navbar-expand-md navbar-inverse bg-inverse"><?php if(x($page,'nav')) echo $page['nav']; ?></nav>
+ <nav class="navbar fixed-top navbar-expand-md navbar-dark bg-dark"><?php if(x($page,'nav')) echo $page['nav']; ?></nav>
<section><?php if(x($page,'content')) echo $page['content']; ?>
<div id="page-footer"></div>
</section>
diff --git a/view/php/mod_import.php b/view/php/mod_import.php
deleted file mode 100644
index 56c4eff86..000000000
--- a/view/php/mod_import.php
+++ /dev/null
@@ -1,2 +0,0 @@
-<?php
-App::$page['template'] = 'full';
diff --git a/view/php/mod_setup.php b/view/php/mod_setup.php
new file mode 100644
index 000000000..f0ed2742d
--- /dev/null
+++ b/view/php/mod_setup.php
@@ -0,0 +1,2 @@
+<?php
+App::$page['template'] = 'zen';
diff --git a/view/php/theme_init.php b/view/php/theme_init.php
index 869b97473..ff37023cf 100644
--- a/view/php/theme_init.php
+++ b/view/php/theme_init.php
@@ -10,7 +10,6 @@ head_add_css('/view/css/conversation.css');
head_add_css('/view/css/widgets.css');
head_add_css('/view/css/colorbox.css');
head_add_css('/library/justifiedGallery/justifiedGallery.min.css');
-head_add_css('/library/Text_Highlighter/sample.css');
head_add_js('jquery.js');
head_add_js('/library/justifiedGallery/jquery.justifiedGallery.min.js');
diff --git a/view/pt-br/htconfig.tpl b/view/pt-br/htconfig.tpl
index ea3f5b5c2..5acb0ebe2 100644
--- a/view/pt-br/htconfig.tpl
+++ b/view/pt-br/htconfig.tpl
@@ -34,14 +34,6 @@ App::$config['system']['baseurl'] = '{{$siteurl}}';
App::$config['system']['sitename'] = "Hubzilla";
App::$config['system']['location_hash'] = '{{$site_id}}';
-// Choices are 'basic', 'standard', and 'pro'.
-// basic sets up the sevrer for basic social networking and removes "complicated" features
-// standard provides most desired features except e-commerce
-// pro gives you access to everything
-
-App::$config['system']['server_role'] = '{{$server_role}}';
-
-
// These lines set additional security headers to be sent with all responses
// You may wish to set transport_security_header to 0 if your server already sends
// this header. content_security_policy may need to be disabled if you wish to
diff --git a/view/ru/htconfig.tpl b/view/ru/htconfig.tpl
index 00da08c91..58a18fbd0 100644
--- a/view/ru/htconfig.tpl
+++ b/view/ru/htconfig.tpl
@@ -34,13 +34,6 @@ App::$config['system']['baseurl'] = '{{$siteurl}}';
App::$config['system']['sitename'] = "Hubzilla";
App::$config['system']['location_hash'] = '{{$site_id}}';
-// Choices are 'basic', 'standard', and 'pro'.
-// basic sets up the sevrer for basic social networking and removes "complicated" features
-// standard provides most desired features except e-commerce
-// pro gives you access to everything
-
-App::$config['system']['server_role'] = '{{$server_role}}';
-
// 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
diff --git a/view/sv/htconfig.tpl b/view/sv/htconfig.tpl
index 00da08c91..58a18fbd0 100644
--- a/view/sv/htconfig.tpl
+++ b/view/sv/htconfig.tpl
@@ -34,13 +34,6 @@ App::$config['system']['baseurl'] = '{{$siteurl}}';
App::$config['system']['sitename'] = "Hubzilla";
App::$config['system']['location_hash'] = '{{$site_id}}';
-// Choices are 'basic', 'standard', and 'pro'.
-// basic sets up the sevrer for basic social networking and removes "complicated" features
-// standard provides most desired features except e-commerce
-// pro gives you access to everything
-
-App::$config['system']['server_role'] = '{{$server_role}}';
-
// 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
diff --git a/view/theme/redbasic/css/style.css b/view/theme/redbasic/css/style.css
index faa292fe5..fd2ceb2c9 100644
--- a/view/theme/redbasic/css/style.css
+++ b/view/theme/redbasic/css/style.css
@@ -484,6 +484,7 @@ footer {
#nav-search-text {
width: 280px;
+ padding: .15rem .5rem;
}
#nav-search-text::-webkit-input-placeholder {
@@ -1235,24 +1236,24 @@ img.mail-conv-sender-photo {
.section-content-info-wrapper {
padding: 21px 10px;
- color: #31708f;
- background-color: #d9edf7;
+ color: #0c5460;
+ background-color: #d1ecf1;
border-bottom: 3px solid $comment_item_colour;
text-align: center;
}
.section-content-warning-wrapper {
padding: 21px 10px;
- color: #8a6d3b;
- background-color: #fcf8e3;
+ color: #856404;
+ background-color: #fff3cd;
border-bottom: 3px solid $comment_item_colour;
text-align: center;
}
.section-content-danger-wrapper {
padding: 21px 10px;
- color: #a94442;
- background-color: #f2dede;
+ color: #721c24;
+ background-color: #f8d7da;
border-bottom: 3px solid $comment_item_colour;
text-align: center;
}
@@ -1339,6 +1340,18 @@ main.fullscreen .section-content-wrapper-np {
}
/* bootstrap overrides */
+.btn,
+.form-control,
+.nav-pills .nav-link,
+.nav-tabs .nav-link {
+ border-radius: $radius;
+}
+
+.rounded-top {
+ border-top-left-radius: $radius !important;
+ border-top-right-radius: $radius !important;
+}
+
blockquote {
font-size: 1rem;
font-style: italic;
@@ -1353,10 +1366,6 @@ blockquote {
border-radius: $radius;
}
-.dropdown-menu img {
- border-radius: $radius;
-}
-
.dropdown-item {
color: $font_colour;
}
@@ -1372,17 +1381,22 @@ blockquote {
background-color: $item_colour;
}
-.bg-inverse {
+.dropdown-item.active {
+ color: #fff;
+ background-color: #007bff;
+}
+
+.bg-dark {
background-color: $nav_bg !important;
}
-.navbar-inverse .navbar-nav .nav-link,
+.navbar-dark .navbar-nav .nav-link,
.usermenu i {
color: $nav_icon_colour;
}
-.navbar-inverse .navbar-nav .nav-link:focus,
-.navbar-inverse .navbar-nav .nav-link:hover,
+.navbar-dark .navbar-nav .nav-link:focus,
+.navbar-dark .navbar-nav .nav-link:hover,
.usermenu:focus i,
.usermenu:hover i {
color: $nav_active_icon_colour;
@@ -1491,7 +1505,7 @@ dl.bb-dl > dd > li {
.form-group.checkbox > div label {
display: block; overflow: hidden; cursor: pointer;
border: 1px solid #ccc;
- border-radius: 4px;
+ border-radius: $radius;
margin:0px;
-webkit-transition: border-color ease-in-out .15s, -webkit-box-shadow ease-in-out .15s;
-o-transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s;
diff --git a/view/theme/redbasic/js/redbasic.js b/view/theme/redbasic/js/redbasic.js
index 14b977b80..5a586b9f9 100644
--- a/view/theme/redbasic/js/redbasic.js
+++ b/view/theme/redbasic/js/redbasic.js
@@ -54,8 +54,20 @@ $(document).ready(function() {
}
});
+ $('#menu-btn').click(function() {
+ if($('#navbar-collapse-1').hasClass('show')){
+ $('#navbar-collapse-1').removeClass('show');
+ }
+ });
+
+ $('#notifications-btn').click(function() {
+ if($('#navbar-collapse-2').hasClass('show')){
+ $('#navbar-collapse-2').removeClass('show');
+ }
+ });
+
$("input[data-role=cat-tagsinput]").tagsinput({
- tagClass: 'badge badge-pill badge-warning'
+ tagClass: 'badge badge-pill badge-warning text-dark'
});
var doctitle = document.title;
diff --git a/view/theme/redbasic/php/style.php b/view/theme/redbasic/php/style.php
index 06cf23ba2..e5a6eb0cd 100644
--- a/view/theme/redbasic/php/style.php
+++ b/view/theme/redbasic/php/style.php
@@ -74,13 +74,13 @@ if ((!$schema) || ($schema == '---')) {
//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_bg)
- $nav_bg = '#222';
+ $nav_bg = '#343a40';
if (! $nav_icon_colour)
$nav_icon_colour = 'rgba(255, 255, 255, 0.5)';
if (! $nav_active_icon_colour)
$nav_active_icon_colour = 'rgba(255, 255, 255, 0.75)';
if (! $link_colour)
- $link_colour = '#0275d8';
+ $link_colour = '#007bff';
if (! $banner_colour)
$banner_colour = '#fff';
if (! $bgcolour)
diff --git a/view/theme/redbasic/php/theme.php b/view/theme/redbasic/php/theme.php
index a1147a5b4..2b90ae85f 100644
--- a/view/theme/redbasic/php/theme.php
+++ b/view/theme/redbasic/php/theme.php
@@ -5,7 +5,7 @@
* * Description: Hubzilla standard theme
* * Version: 2.1
* * MinVersion: 2.3.1
- * * MaxVersion: 3.0
+ * * MaxVersion: 6.0
* * Author: Fabrixxm
* * Maintainer: Mike Macgirvin
* * Maintainer: Mario Vavti
diff --git a/view/theme/redbasic/php/theme_init.php b/view/theme/redbasic/php/theme_init.php
index 020bda363..b12d80ea5 100644
--- a/view/theme/redbasic/php/theme_init.php
+++ b/view/theme/redbasic/php/theme_init.php
@@ -8,6 +8,7 @@ head_add_css('/library/datetimepicker/jquery.datetimepicker.css');
head_add_css('/library/bootstrap-colorpicker/dist/css/bootstrap-colorpicker.min.css');
require_once('view/php/theme_init.php');
+head_add_js('/library/popper/popper.min.js');
head_add_js('/library/bootstrap/js/bootstrap.min.js');
head_add_js('/library/bootbox/bootbox.min.js');
head_add_js('/library/bootstrap-tagsinput/bootstrap-tagsinput.js');
diff --git a/view/theme/redbasic/schema/bluegrid.css b/view/theme/redbasic/schema/bluegrid.css
deleted file mode 100644
index 46e28197e..000000000
--- a/view/theme/redbasic/schema/bluegrid.css
+++ /dev/null
@@ -1,515 +0,0 @@
-body {
- background-size: auto;
-}
-
-.generic-content-wrapper-styled {
- background-color: rgba(67,72,138,.8);
- color: #FFF;
-}
-
-.generic-content-wrapper-styled .btn-default:hover, #profile-jot-wrapper .btn-default:hover {
- border: 1px solid #FFF;
-}
-
-#profile-jot-wrapper {
- background-color: inherit;
- border: none;
-}
-
-.generic-content-wrapper-styled a:hover, .generic-content-wrapper-styled a:focus, .generic-content-wrapper-styled .field.checkbox:hover label, .generic-content-wrapper-styled .field.checkbox:focus label, .allcontact-link:hover, .allcontact-link:focus {
- color: rgba(255,255,255,.8);
-}
-
-.generic-content-wrapper, .profile-jot-text, .comment-edit-text-empty, .comment-edit-text-full, input.widget-input, .wall-item-content-wrapper, .section-title-wrapper, .section-content-wrapper {
- border-radius: 0px !important;
-}
-
-.generic-content-wrapper {
- background-color: rgba(255,255,255,.8);
- color: #4d4d4d;
-}
-
-.wall-item-content-wrapper {
- background-color: #FFF;
-}
-
-.hide-comments-outer, .wall-item-content-wrapper.comment, .wall-item-comment-wrapper {
- background-color: transparent;
-}
-
-.generic-content-wrapper-styled .generic-content-wrapper {
- color: #4D4D4D;
-}
-
-.generic-content-wrapper-styled .generic-content-wrapper a {
- color: #43488A;
-}
-
-.generic-content-wrapper #profile-jot-wrapper {
- background-color: transparent;
- color: #4D4D4D;
-}
-
-.generic-content-wrapper input#jot-title, .generic-content-wrapper input#jot-pagetitle {
- color: #4D4D4D;
-}
-
-.generic-content-wrapper input#jot-title:hover, .generic-content-wrapper input#jot-title:focus {
- color: #4D4D4D;
- border-radius: 0px;
-}
-
-
-.fn, .widget h3, .nav-tabs a, .generic-content-wrapper-styled a, .dropdown-menu > li > a, #channels-desc, input#jot-title {
- color: #fff;
- border-radius: 0px
-}
-
-ul.dropdown-menu.acpopup > li.textcomplete-item > a {
- color: #43488A;
-}
-
-ul.dropdown-menu.acpopup > li.textcomplete-item > a:hover, ul.dropdown-menu.acpopup > li.textcomplete-item > a:focus {
- background-color: #43488A;
- color: #FFF;
- cursor: pointer;
-}
-
-input#jot-title:hover, input#jot-title:focus {
- color: #43488A;
- border-radius: 0px;
-}
-
-.navbar-inverse {
- background-color: transparent;
- border-color: transparent;
- background-image: none;
-}
-
-.navbar-inverse .navbar-nav > .active > a {
- background-image: none;
- background: rgba(255,255,255,.5);
-}
-
-.navbar-inverse .navbar-nav > .active > a:hover, .navbar-inverse .navbar-nav > .active > a:focus {
- background: rgba(255,255,255,.5);
-}
-
-.navbar-inverse .navbar-nav > li > a:hover,
-.navbar-inverse .navbar-nav > li > a:focus {
- color: #43488A;
- background: rgba(255,255,255,.5);
-}
-
-.navbar-inverse .navbar-nav > .open > a,
-.navbar-inverse .navbar-nav > .open > a:hover,
-.navbar-inverse .navbar-nav > .open > a:focus {
- background-color: #43488A;
- color: #fff;
-}
-
-#nav-search-text {
- color: #fff;
- background-color: #43488A;
- border-radius: 0px;
- border-color: transparent;
-}
-
-nav .dropdown-menu, .wall-item-tools .dropdown-menu, .section-title-wrapper .dropdown-menu, .section-content-wrapper .dropdown-menu {
- background-color: #43488A;
- color: #fff;
- border-radius: 0;
- border: none;
- box-shadow: 0px 6px 12px rgba(45,48,92,.176);
-}
-
-.dropdown-menu > li > a:focus, .dropdown-menu > li > a:hover {
- color: #43488A;
- background-color: rgba(255,255,255,.7);
- text-decoration: underline;
-}
-
-.vcard .dropdown-menu {
- background-color: rgba(255,255,255,.97);
- border-radius: 0;
- border: none;
- box-shadow: 0px 6px 12px rgba(169,169,169,.176);
-}
-
-.vcard .dropdown-menu a, .fc-today {
- color: #43488A;
-}
-
-.vcard .dropdown-menu > li > a:focus, .vcard .dropdown-menu > li > a:hover {
- color: #43488A;
- background-color: rgba( 255,255,255,.7);
- text-decoration: underline;
-}
-
-nav .badge {
- background-color: rgba(255,255,255,.8);
- color: #43488A;
- border-radius: 0px !important;
-}
-
-nav .badge:hover, nav .badge:focus {
- background-color: rgba(67,72,138,.8);
- color: #FFF;
-}
-
-.field.checkbox > div > input:checked + label .onoffswitch-switch {
- background-color: #43488A;
-}
-
-.widget .field.checkbox:hover label {
- color: rgba(255,255,255,.8);
-}
-
-.widget .conv-participants {
- color: #BBB;
-}
-
-.widget .active:hover .conv-participants, .widget .active:focus .conv-participants {
- color: inherit;
-}
-
-.help-block, .comment-icon, .jot-icons, .admin-icons {
- color: inherit;
-}
-
-#adminpage table tr:hover, #adminpage table tr:hover a, #adminpage table tr td.tools a:hover, #adminpage table tr:focus, #adminpage table tr:focus a, #adminpage table tr td.tools a:focus {
- color: #43488A;
-}
-
-#adminpage table tr:hover .tools a, #adminpage table tr:focus .tools a, .generic-content-wrapper-styled > .descriptive-text {
- color: #FFF;
-}
-
-.generic-content-wrapper-styled > .sources-links {
- font-weight: bold;
-}
-
-.wall-item-tools .btn {
- border-color: #43488A;
-}
-
-.vcard, #contact-block, .widget {
- background-color: rgba(67,72,138,.8);
- color: #fff;
- border-radius: 0;
- border: none;
- box-shadow: 0px 6px 12px rgba(45,48,92,.176);
-}
-
-.tags a {
- color: inherit;
-}
-
-#profile-photo-wrapper {
- border: none;
-}
-
-.nav-tabs > li.active > a, .nav-tabs > li.active > a:hover, .nav-tabs > li.active > a:focus {
- color: #43488A;
- text-decoration: none;
- border: none;
-}
-
-.nav-tabs > li.active {
- background-color: rgba(255,255,255,.5);
-}
-
-.nav-tabs.nav-justified > .active > a, .nav-tabs.nav-justified > .active > a:hover {
- border-color: transparent;
-}
-
-.nav-tabs.nav-justified {
- background-color: rgba(67,72,138,.8);
- border-bottom: 1px solid rgba(255,255,255,.5);
- border-radius: 0px;
-}
-
-.nav-tabs.nav-justified > li > a {
- border-bottom: 1px solid transparent;
- border-radius: 0px;
-}
-
-.nav > li > a:focus, .nav > li > a:hover {
- text-decoration: underline;
- background-color: rgba(255,255,255,.5);
- color: #43488A;
- border-radius: 0;
- border-color: transparent;
-}
-
-.nav > li > a {
- color: #FFF;
- border-radius: 0px;
-}
-
-.fc-event {
- border: none !important;
- background-color: rgba(255,255,255,.7) !important;
- color: #43488A !important;
- text-shadow: none !important;
-}
-
-div.rateme {
- border-radius: 0px;
- font-weight: 400;
-}
-
-div.rateme:hover, div.rateme:focus, a.rateme:hover, a.rateme:focus {
- background-color: #43488A;
- border-radius: 0px;
- color: #FFF;
- font-weight: 400;
- -webkit-transition: all .3s ease-in-out;
- -moz-transition: all .3s ease-in-out;
- transition: all .3s ease-in-out;
-}
-
-.info {
- background: rgba(255,255,255,.7) url("/images/hz-32.png") no-repeat scroll 15px center !important;
- color: #43488A !important;
-}
-
-.notice {
- background: rgba(215,43,52,.7) url("/images/hz-white-32.png") no-repeat scroll 15px center !important;
- color: #FFF !important;
-}
-
-#chatTopBar {
- background-color: rgba(255,255,255,.8);
- color: #4d4d4d;
- height: 500px;
- width: 596px;
- overflow-y: auto;
-}
-
-.chat-item-text {
- border-radius: 0px;
- padding: 5px;
- background-color: #FFF;
-}
-
-input {
- border-radius: 0px;
-}
-
-.home-welcome {
- color: #FFF;
- margin-bottom: 30px;
-}
-
-#login-main {
- margin-top: 0;
- color: #EEE;
-}
-
-#remember_me_container label:hover, #remember_container label:hover {
- color: #FFF;
-}
-
-#login-main #lost-password-link, #login-main #register-link {
- color: #FFF;
-}
-
-#nav-login .modal-content {
- background-color: #43488A;
- background-image: url('/images/bggrid.png');
- box-shadow: 0 5px 15px rgba(0,0,0,.3);
- -webkit-box-shadow: 0 5px 15px rgba(0,0,0,.3);
-}
-
-#nav-login h3, #nav-login button.close {
- color: #EEE;
-}
-
-#nav-login .modal-header {
- border-bottom: none;
-}
-
-.directory-item {
- margin-bottom: 0px;
- padding-bottom: 20px;
- background-color: #FFF;
-}
-
-.directory-item.lframe {
- background-color: transparent !important;
-}
-
-.contact-entry-wrapper {
- border: 1px solid rgba(255,255,255,.5);
-}
-
-.contact-entry-edit:hover a, .contact-entry-edit:focus a, .generic-content-wrapper-styled > p > span.btn.btn-default > a:hover,.generic-content-wrapper-styled > p > span.btn.btn-default > a:focus, div#profile-edit-links a:hover, div#profile-edit-links a:focus {
- color: #43488A;
-}
-
-.profile-edit-side-link, input#profile-photo-upload, .allcontact-link, #newchannel-form .descriptive-paragraph {
- color: #FFF;
-}
-
-.profile-edit-side-link:hover, .profile-edit-side-link:focus {
- color: #FFF;
- text-decoration: none;
-}
-
-.section-content-info-wrapper {
- color: #fff;
- background-color: #43488A;
-}
-
-.section-content-info-wrapper a {
- color: #fff;
-}
-
-.btn, #event-edit-form .btn, input.directory-rating-submit {
- border: 1px solid #FFF;
- color: #FFF;
- background-color: #43488A;
- border-radius: 0;
- font-weight: 400;
- -webkit-transition: all .3s ease-in-out;
- -moz-transition: all .3s ease-in-out;
- transition: all .3s ease-in-out;
-}
-
-.btn:hover, .btn:focus, #event-edit-form .btn:hover, #event-edit-form .btn:focus {
- border: 1px solid #FFF;
- outline: 0;
- color: #43488A;
- background-color: #FFF;
-}
-
-.btn-default:hover, .btn-default:focus, .open > .dropdown-toggle.btn-default, input.directory-rating-submit:hover, input.directory-rating-submit:focus {
- border: 1px solid #43488A;
- outline: 0;
- color: #43488A;
- background-color: #FFF;
-}
-
-.btn-primary, input#event-submit, input#rmagic-submit-button, input#lostpass-submit-button, input#side-follow-submit, .profile-edit-submit-wrapper > input.profile-edit-submit-button, input#profile-photo-submit, form#chat-form > input, div#adminpage > form > div.submit > input, input.sources-submit, input.contact-edit-submit, input#dbtn-submit, input#newchannel-submit-button, input#contacts-search-submit, input#register-submit-button {
- background-color: #FFF;
- color: #43488A;
- border-radius: 0px;
- -webkit-transition: all .3s ease-in-out;
- -moz-transition: all .3s ease-in-out;
- transition: all .3s ease-in-out;
-}
-
-.btn-primary:hover, .btn-primary:focus, input#event-submit:hover, input#event-submit:focus, input#rmagic-submit-button:hover, input#rmagic-submit-button:focus, input#lostpass-submit-button:hover, input#lostpass-submit-button:focus, input#side-follow-submit:hover, input#side-follow-submit:focus, .profile-edit-submit-wrapper > input.profile-edit-submit-button:hover, .profile-edit-submit-wrapper > input.profile-edit-submit-button:focus, input#profile-photo-submit:hover, input#profile-photo-submit:focus, form#chat-form > input:hover, form#chat-form > input:focus, div#adminpage > form > div.submit > input:hover, div#adminpage > form > div.submit > input:focus, input.sources-submit:hover, input.sources-submit:focus, input.contact-edit-submit:focus, input.contact-edit-submit:hover, input#dbtn-submit:hover, input#dbtn-submit:focus, input#newchannel-submit-button:hover, input#newchannel-submit-button:focus, input#contacts-search-submit:hover, input#contacts-search-submit:focus, input#register-submit-button:hover, input#register-submit-button:focus {
- border-color: #FFF;
- background-color: #43488A;
- color: #FFF;
- border-radius: 0px;
-}
-
-.comment-tools .btn, #prvmail-tools .btn, .generic-content-wrapper .btn {
- border: 1px solid #43488A;
- color: #43488A;
- background-color: #FFF;
-}
-
-.comment-tools .btn:hover, .comment-tools .btn:focus, #prvmail-tools .btn:hover, #prvmail-tools .btn:focus, .generic-content-wrapper .btn:hover, .generic-content-wrapper .btn:focus {
- border: 1px solid #43488A !important;
- color: #FFF;
- background-color: #43488A;
-}
-
-.comment-tools .btn-primary, #prvmail-submit .btn-primary, .settings-submit-wrapper .btn-primary, .generic-content-wrapper .btn-primary {
- background-color: #43488A;
- color: #FFF;
- border: 1px solid #43488A;
-}
-
-.comment-tools .btn-primary:hover, .comment-tools .btn-primary:focus, #prvmail-submit .btn-primary:hover, #prvmail-submit .btn-primary:focus, .settings-submit-wrapper .btn-primary:hover, .settings-submit-wrapper .btn-primary:focus, .generic-content-wrapper .btn-primary:hover, .generic-content-wrapper .btn-primary:focus {
- border-color: #43488A;
- background-color: #FFF;
- color: #43488A;
-}
-
-.btn-success {
- color: #FFF !important;
- background-color: #5CB85C !important;
- border-color: #4CAE4C !important;
-}
-
-.btn-success:hover, .btn-success:focus {
- color: #FFF !important;
- background-color: #449D44 !important;
- border-color: #398439 !important;
-}
-
-.btn-warning {
- color: #FFF !important;
- background-color: #F0AD4E !important;
- border-color: #EEA236 !important;
-}
-
-.btn-warning:hover, .btn-warning:focus {
- color: #FFF !important;
- background-color: #EC971F !important;
- border-color: #D58512 !important;
-}
-
-.btn-danger, form#chat-destroy > input {
- background-color: #D9534F !important;
- border-color: #D43F3A !important;
- color: #FFF !important;
-}
-.btn-danger:hover, .btn-danger:focus, form#chat-destroy > input:hover, form#chat-destroy > input:focus {
- color: #FFF !important;
- background-color: #C9302C !important;
- border-color: #AC2925 !important;
-}
-
-a:hover > .fa-trash-o {
- color: #C9302C !important;
-}
-
-@media screen and (max-width: 767px) {
- .navbar-inverse .navbar-collapse {
- background-color: #43488A;
- border: none;
- }
- .navbar-inverse .navbar-toggle {
- border-color: #576295;
- background-color: #43488A;
- border-radius: 0px;
- }
- .navbar-inverse .navbar-toggle .icon-bar {
- background-color: #FFF;
- }
- .navbar-inverse .navbar-toggle .fa-arrow-circle-down, .navbar-inverse .navbar-toggle .fa-arrow-circle-right, .navbar-inverse .navbar-toggle .fa-arrow-circle-up, .navbar-inverse .navbar-toggle .fa-arrow-circle-left, .navbar-inverse .navbar-toggle .fa-question-circle {
- color: #FFF;
- }
- .navbar-inverse .navbar-toggle:hover .fa-arrow-circle-down, .navbar-inverse .navbar-toggle:focus .fa-arrow-circle-down, .navbar-inverse .navbar-toggle:hover .fa-arrow-circle-right, .navbar-inverse .navbar-toggle:focus .fa-arrow-circle-right, .navbar-inverse .navbar-toggle:hover .fa-arrow-circle-up, .navbar-inverse .navbar-toggle:focus .fa-arrow-circle-up, .navbar-inverse .navbar-toggle:hover .fa-arrow-circle-left, .navbar-inverse .navbar-toggle:focus .fa-arrow-circle-left {
- color: #43488A;
- }
- .navbar-inverse .navbar-toggle:hover, .navbar-inverse .navbar-toggle:focus {
- background-color: #FFF !important;
- }
- .navbar-toggle:hover .icon-bar , .navbar-toggle:focus .icon-bar {
- background-color: #43488A !important;
- }
-}
-
-.help-content {
- color: #FFF;
- border: none;
-}
-
-.help-content a {
- color: #FFF;
- font-weight: 600;
-}
-
-.help-content-open {
- -moz-box-shadow: none;
- -webkit-box-shadow: none;
- box-shadow: none;
-}
-
diff --git a/view/theme/redbasic/schema/bluegrid.php b/view/theme/redbasic/schema/bluegrid.php
deleted file mode 100644
index fdb552611..000000000
--- a/view/theme/redbasic/schema/bluegrid.php
+++ /dev/null
@@ -1,28 +0,0 @@
-<?php
-
- if (! $nav_bg)
- $nav_bg = "#FFF";
- if (! $nav_active_gradient_top)
- $nav_active_gradient_top = "#FFF";
- if (! $nav_active_gradient_bottom)
- $nav_active_gradient_bottom = "#43488A";
- if (! $nav_bd)
- $nav_bd = "#fff";
- if (! $nav_icon_colour)
- $nav_icon_colour = "#FFF";
- if (! $nav_active_icon_colour)
- $nav_active_icon_colour = "#43488A";
- if (! $banner_colour)
- $banner_colour = "#fff";
- if (! $bgcolour)
- $bgcolour = "#43488A";
- if (! $background_image)
- $background_image = "/images/bggrid.png";
- if (! $link_colour)
- $link_colour = "#43488A";
-
-
-
-
-
-
diff --git a/view/theme/redbasic/schema/dark.css b/view/theme/redbasic/schema/dark.css
index 4154c88fa..b1aa5e07a 100644
--- a/view/theme/redbasic/schema/dark.css
+++ b/view/theme/redbasic/schema/dark.css
@@ -139,6 +139,10 @@ option {
background-color: #111;
}
+.nav-link.active {
+ color:#000 !important;
+}
+
a.btn, aside a {
font-weight: 400 !important;
}
diff --git a/view/tpl/abook_edit.tpl b/view/tpl/abook_edit.tpl
index 9fb5c4b18..146030494 100755
--- a/view/tpl/abook_edit.tpl
+++ b/view/tpl/abook_edit.tpl
@@ -59,6 +59,12 @@
{{$loc_text}} {{$locstr}}
</div>
{{/if}}
+ {{if $unclonable}}
+ <div>
+ <br>{{$unclonable}}
+ </div>
+ <br>
+ {{/if}}
{{if $last_update}}
<div>
{{$lastupdtext}} {{$last_update}}
diff --git a/view/tpl/admin_account_edit.tpl b/view/tpl/admin_account_edit.tpl
index 82d137de4..239d9084a 100644
--- a/view/tpl/admin_account_edit.tpl
+++ b/view/tpl/admin_account_edit.tpl
@@ -8,12 +8,7 @@
{{include file="field_password.tpl" field=$pass1}}
{{include file="field_password.tpl" field=$pass2}}
-
-{{if $z_server_role == 'pro'}}
{{include file="field_select.tpl" field=$account_level}}
-{{else}}
-<input type="hidden" name="account_level" value="{{$account_level.2}}" />
-{{/if}}
{{include file="field_select.tpl" field=$account_language}}
{{include file="field_input.tpl" field=$service_class}}
diff --git a/view/tpl/admin_site.tpl b/view/tpl/admin_site.tpl
index 6fd0fd9ce..e995f82b2 100755
--- a/view/tpl/admin_site.tpl
+++ b/view/tpl/admin_site.tpl
@@ -41,12 +41,9 @@
<input type='hidden' name='form_security_token' value='{{$form_security_token}}'>
{{include file="field_input.tpl" field=$sitename}}
- {{include file="field_select.tpl" field=$server_role}}
- {{if $z_server_role == 'pro'}}
{{include file="field_select.tpl" field=$techlevel}}
{{include file="field_checkbox.tpl" field=$techlock}}
- {{/if}}
{{include file="field_textarea.tpl" field=$banner}}
{{include file="field_textarea.tpl" field=$siteinfo}}
diff --git a/view/tpl/admin_summary.tpl b/view/tpl/admin_summary.tpl
index ca94b0ef7..8125703d7 100755
--- a/view/tpl/admin_summary.tpl
+++ b/view/tpl/admin_summary.tpl
@@ -12,7 +12,7 @@
</dl>
<dl>
<dt>{{$accounts.0}}</dt>
- <dd>{{foreach from=$accounts.1 item=acc name=account}}<span title="{{$acc.label}}">{{$acc.val}}</span>{{if !$smarty.foreach.account.last}} / {{/if}}{{/foreach}}</dd>
+ <dd>{{foreach from=$accounts.1 item=acc name=account}}<span title="{{$acc.label}}">{{$acc.val}} {{$acc.label}}</span>{{if !$smarty.foreach.account.last}} / {{/if}}{{/foreach}}</dd>
</dl>
<dl>
<dt>{{$pending.0}}</dt>
@@ -20,7 +20,7 @@
</dl>
<dl>
<dt>{{$channels.0}}</dt>
- <dd>{{foreach from=$channels.1 item=ch name=chan}}<span title="{{$ch.label}}">{{$ch.val}}</span>{{if !$smarty.foreach.chan.last}} / {{/if}}{{/foreach}}</dd>
+ <dd>{{foreach from=$channels.1 item=ch name=chan}}<span title="{{$ch.label}}">{{$ch.val}} {{$ch.label}}</span>{{if !$smarty.foreach.chan.last}} / {{/if}}{{/foreach}}</dd>
</dl>
<dl>
<dt>{{$plugins.0}}</dt>
diff --git a/view/tpl/app.tpl b/view/tpl/app.tpl
index 28f28611e..ac5c18deb 100644
--- a/view/tpl/app.tpl
+++ b/view/tpl/app.tpl
@@ -1,4 +1,4 @@
-{{if !$navapps}}
+{{if ! ($navapps || $order)}}
<div class="app-container">
<div class="app-detail{{if $deleted}} app-deleted{{/if}}">
<a href="{{$app.url}}"{{if $app.target}} target="{{$app.target}}"{{/if}}{{if $app.desc}} title="{{$app.desc}}{{if $app.price}} ({{$app.price}}){{/if}}"{{else}}title="{{$app.name}}"{{/if}}>{{if $icon}}<i class="app-icon fa fa-fw fa-{{$icon}}"></i>{{else}}<img src="{{$app.photo}}" width="80" height="80" />{{/if}}
@@ -24,7 +24,13 @@
{{/if}}
{{/if}}
</div>
-{{else}}
-<a class="dropdown-item" href="{{$app.url}}">{{if $icon}}<i class="generic-icons-nav fa fa-fw fa-{{$icon}}"></i>{{else}}<img src="{{$app.photo}}" width="16" height="16" style="margin-right:9px;"/>{{/if}}{{$app.name}}</a>
+{{/if}}
+{{if $navapps}}
+<a class="dropdown-item{{if $app.active}} active{{/if}}" href="{{$app.url}}">{{if $icon}}<i class="generic-icons-nav fa fa-fw fa-{{$icon}}"></i>{{else}}<img src="{{$app.photo}}" width="16" height="16" style="margin-right:9px;"/>{{/if}}{{$app.name}}</a>
+{{/if}}
+{{if $order}}
+<a href="{{$hosturl}}appman/{{$app.guid}}/moveup" class="btn btn-outline-secondary btn-sm" style="margin-bottom: 5px;"><i class="generic-icons-nav fa fa-fw fa-arrow-up"></i></a>
+<a href="{{$hosturl}}appman/{{$app.guid}}/movedown" class="btn btn-outline-secondary btn-sm" style="margin-bottom: 5px;"><i class="generic-icons-nav fa fa-fw fa-arrow-down"></i></a>
+{{if $icon}}<i class="generic-icons-nav fa fa-fw fa-{{$icon}}"></i>{{else}}<img src="{{$app.photo}}" width="16" height="16" style="margin-right:9px;"/>{{/if}}{{$app.name}}<br>
{{/if}}
diff --git a/view/tpl/apporder.tpl b/view/tpl/apporder.tpl
new file mode 100644
index 000000000..fdb726131
--- /dev/null
+++ b/view/tpl/apporder.tpl
@@ -0,0 +1,7 @@
+<h2>{{$header}}</h2>
+
+<div class="descriptive-text">{{$desc}}</div>
+<br><br><br>
+{{foreach $nav_apps as $nav_app}}
+{{$nav_app}}
+{{/foreach}}
diff --git a/view/tpl/atom_feed.tpl b/view/tpl/atom_feed.tpl
index ba50867ff..fe38fdc80 100755
--- a/view/tpl/atom_feed.tpl
+++ b/view/tpl/atom_feed.tpl
@@ -22,9 +22,4 @@
<updated>{{$feed_updated}}</updated>
- <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>
+{{$owner}}
diff --git a/view/tpl/cdav_addressbook.tpl b/view/tpl/cdav_addressbook.tpl
new file mode 100644
index 000000000..587a95caa
--- /dev/null
+++ b/view/tpl/cdav_addressbook.tpl
@@ -0,0 +1,462 @@
+<script>
+$(document).ready(function() {
+
+ $(document).on('click', '.vcard-header, .vcard-cancel-btn', updateView);
+ $(document).on('click', '.add-field', doAdd);
+ $(document).on('click', '.remove-field', doRemove);
+
+ function updateView() {
+ var id = $(this).data('id');
+ var action = $(this).data('action');
+ var header = $('#vcard-header-' + id);
+ var cancel = $('#vcard-cancel-' + id);
+ var addField = $('#vcard-add-field-' + id);
+ var info = $('#vcard-info-' + id);
+ var vcardPreview = $('#vcard-preview-' + id);
+ var fn = $('#vcard-fn-' + id);
+
+ if(action === 'open') {
+ $(header).addClass('active');
+ $(cancel).show();
+ $(addField).show();
+ $(info).show();
+ $(fn).show();
+ $(vcardPreview).hide();
+ }
+ else {
+ $(header).removeClass('active');
+ $(cancel).hide();
+ $(addField).hide();
+ $(info).hide();
+ $(fn).hide();
+ $(vcardPreview).show();
+ }
+ }
+
+ function doAdd(e) {
+ e.preventDefault();
+ var what = $(this).data('add');
+ var id = $(this).data('id');
+ var element = '#template-form-' + what;
+ var where = '#card_form_' + id;
+
+ $(element + ' .remove-field').attr('data-id', id)
+
+ if(what === 'vcard-adr') {
+ var adrCount = $(where + ' .form-' + what).length;
+ var attrName = 'adr[' + adrCount + '][]';
+ $(element + ' input').attr('name', attrName);
+ }
+
+ if(what === 'vcard-org' || what === 'vcard-title' || what === 'vcard-note') {
+ $(where + ' .add-' + what).hide()
+ }
+
+ $(element).clone().removeAttr('id').appendTo(where + ' .form-' + what + '-wrapper');
+ }
+
+ function doRemove() {
+ var what = $(this).data('remove');
+ var element = $(this).parents('div.form-' + what);
+ var where = '#card_form_' + $(this).data('id');
+
+ if(what === 'vcard-org' || what === 'vcard-title' || what === 'vcard-note') {
+ $(where + ' .add-' + what).show()
+ }
+
+ $(element).remove();
+ }
+
+});
+</script>
+<div id="template-form-vcard-org" class="form-group form-vcard-org">
+ <div class="form-group form-vcard-org">
+ <input type="text" name="org" value="" placeholder="{{$org_label}}">
+ <i data-remove="vcard-org" data-id="" class="fa fa-trash-o remove-field drop-icons fakelink"></i>
+ </div>
+</div>
+
+<div id="template-form-vcard-title" class="form-group form-vcard-title">
+ <div class="form-group form-vcard-title">
+ <input type="text" name="title" value="" placeholder="{{$title_label}}">
+ <i data-remove="vcard-title" data-id="" class="fa fa-trash-o remove-field drop-icons fakelink"></i>
+ </div>
+</div>
+
+<div id="template-form-vcard-tel" class="form-group form-vcard-tel">
+ <select name="tel_type[]">
+ <option value="CELL">{{$mobile}}</option>
+ <option value="HOME">{{$home}}</option>
+ <option value="WORK">{{$work}}</option>
+ <option value="OTHER">{{$other}}</option>
+ </select>
+ <input type="text" name="tel[]" value="" placeholder="{{$tel_label}}">
+ <i data-remove="vcard-tel" data-id="" class="fa fa-trash-o remove-field drop-icons fakelink"></i>
+</div>
+
+<div id="template-form-vcard-email" class="form-group form-vcard-email">
+ <select name="email_type[]">
+ <option value="HOME">{{$home}}</option>
+ <option value="WORK">{{$work}}</option>
+ <option value="OTHER">{{$other}}</option>
+ </select>
+ <input type="text" name="email[]" value="" placeholder="{{$email_label}}">
+ <i data-remove="vcard-email" data-id="" class="fa fa-trash-o remove-field drop-icons fakelink"></i>
+</div>
+
+<div id="template-form-vcard-impp" class="form-group form-vcard-impp">
+ <select name="impp_type[]">
+ <option value="HOME">{{$home}}</option>
+ <option value="WORK">{{$work}}</option>
+ <option value="OTHER">{{$other}}</option>
+ </select>
+ <input type="text" name="impp[]" value="" placeholder="{{$impp_label}}">
+ <i data-remove="vcard-impp" data-id="" class="fa fa-trash-o remove-field drop-icons fakelink"></i>
+</div>
+
+<div id="template-form-vcard-url" class="form-group form-vcard-url">
+ <select name="url_type[]">
+ <option value="HOME">{{$home}}</option>
+ <option value="WORK">{{$work}}</option>
+ <option value="OTHER">{{$other}}</option>
+ </select>
+ <input type="text" name="url[]" value="" placeholder="{{$url_label}}">
+ <i data-remove="vcard-url" data-id="" class="fa fa-trash-o remove-field drop-icons fakelink"></i>
+</div>
+
+<div id="template-form-vcard-adr" class="form-group form-vcard-adr">
+ <div class="form-group">
+ <select name="adr_type[]">
+ <option value="HOME">{{$home}}</option>
+ <option value="WORK">{{$work}}</option>
+ <option value="OTHER">{{$other}}</option>
+ </select>
+ <label>{{$adr_label}}</label>
+ <i data-remove="vcard-adr" data-id="" class="fa fa-trash-o remove-field drop-icons fakelink"></i>
+ </div>
+ <div class="form-group">
+ <input type="text" name="" value="" placeholder="{{$po_box}}">
+ </div>
+ <div class="form-group">
+ <input type="text" name="" value="" placeholder="{{$extra}}">
+ </div>
+ <div class="form-group">
+ <input type="text" name="" value="" placeholder="{{$street}}">
+ </div>
+ <div class="form-group">
+ <input type="text" name="" value="" placeholder="{{$locality}}">
+ </div>
+ <div class="form-group">
+ <input type="text" name="" value="" placeholder="{{$region}}">
+ </div>
+ <div class="form-group">
+ <input type="text" name="" value="" placeholder="{{$zip_code}}">
+ </div>
+ <div class="form-group">
+ <input type="text" name="" value="" placeholder="{{$country}}">
+ </div>
+</div>
+
+<div id="template-form-vcard-note" class="form-group form-vcard-note">
+ <label>{{$note_label}}</label>
+ <i data-remove="vcard-note" data-id="" class="fa fa-trash-o remove-field drop-icons fakelink"></i>
+ <textarea name="note" class="form-control"></textarea>
+</div>
+
+<div class="generic-content-wrapper">
+ <div class="section-title-wrapper">
+ <button type="button" class="btn btn-success btn-sm float-right" onclick="openClose('create_form')"><i class="fa fa-plus-circle"></i> {{$add_card}}</button>
+ <h2>{{$displayname}}</h2>
+ </div>
+ <div id="create_form" class="section-content-tools-wrapper">
+ <form id="card_form_new" method="post" action="">
+ <input type="hidden" name="target" value="{{$id}}">
+ <div class="dropdown pull-right">
+ <button data-toggle="dropdown" type="button" class="btn btn-outline-secondary btn-sm dropdown-toggle"><i class="fa fa-plus"></i> {{$add_field}}</button>
+ <div class="dropdown-menu dropdown-menu-right">
+ <a class="dropdown-item add-vcard-org add-field" style="display: none" href="#" data-add="vcard-org" data-id="new">{{$org_label}}</a>
+ <a class="dropdown-item add-vcard-title add-field" style="display: none" href="#" data-add="vcard-title" data-id="new">{{$title_label}}</a>
+ <a class="dropdown-item add-vcard-tel add-field" href="#" data-add="vcard-tel" data-id="new">{{$tel_label}}</a>
+ <a class="dropdown-item add-vcard-email add-field" href="#" data-add="vcard-email" data-id="new">{{$email_label}}</a>
+ <a class="dropdown-item add-vcard-impp add-field" href="#" data-add="vcard-impp" data-id="new">{{$impp_label}}</a>
+ <a class="dropdown-item add-vcard-url add-field" href="#" data-add="vcard-url" data-id="new">{{$url_label}}</a>
+ <a class="dropdown-item add-vcard-adr add-field" href="#" data-add="vcard-adr" data-id="new">{{$adr_label}}</a>
+ <a class="dropdown-item add-vcard-note add-field" href="#" data-add="vcard-note" data-id="new">{{$note_label}}</a>
+ </div>
+ </div>
+
+ <div class="vcard-fn-create form-group">
+ <div class="form-vcard-fn-wrapper">
+ <div class="form-group form-vcard-fn">
+ <div class="vcard-nophoto"><i class="fa fa-user"></i></div><input type="text" name="fn" value="" placeholder="{{$name_label}}">
+ </div>
+ </div>
+ </div>
+
+ <div class="vcard-org form-group">
+ <div class="form-vcard-org-wrapper">
+ <div class="form-group form-vcard-org">
+ <input type="text" name="org" value="" placeholder="{{$org_label}}">
+ <i data-remove="vcard-org" data-id="new" class="fa fa-trash-o remove-field drop-icons fakelink"></i>
+ </div>
+ </div>
+ </div>
+
+ <div class="vcard-title form-group">
+ <div class="form-vcard-title-wrapper">
+ <div class="form-group form-vcard-title">
+ <input type="text" name="title" value="" placeholder="{{$title_label}}">
+ <i data-remove="vcard-title" data-id="new" class="fa fa-trash-o remove-field drop-icons fakelink"></i>
+ </div>
+ </div>
+ </div>
+
+ <div class="vcard-tel form-group">
+ <div class="form-vcard-tel-wrapper">
+ <div class="form-group form-vcard-tel">
+ <select name="tel_type[]">
+ <option value="CELL">{{$mobile}}</option>
+ <option value="HOME">{{$home}}</option>
+ <option value="WORK">{{$work}}</option>
+ <option value="OTHER">{{$other}}</option>
+ </select>
+ <input type="text" name="tel[]" value="" placeholder="{{$tel_label}}">
+ <i data-remove="vcard-tel" data-id="new" class="fa fa-trash-o remove-field drop-icons fakelink"></i>
+ </div>
+ </div>
+ </div>
+
+
+ <div class="vcard-email form-group">
+ <div class="form-vcard-email-wrapper">
+ <div class="form-group form-vcard-email">
+ <select name="email_type[]">
+ <option value="HOME">{{$home}}</option>
+ <option value="WORK">{{$work}}</option>
+ <option value="OTHER">{{$other}}</option>
+ </select>
+ <input type="text" name="email[]" value="" placeholder="{{$email_label}}">
+ <i data-remove="vcard-email" data-id="new" class="fa fa-trash-o remove-field drop-icons fakelink"></i>
+ </div>
+ </div>
+ </div>
+
+ <div class="vcard-impp form-group">
+ <div class="form-vcard-impp-wrapper">
+ </div>
+ </div>
+
+ <div class="vcard-url form-group">
+ <div class="form-vcard-url-wrapper">
+ </div>
+ </div>
+
+ <div class="vcard-adr form-group">
+ <div class="form-vcard-adr-wrapper">
+ </div>
+ </div>
+
+ <div class="vcard-note form-group">
+ <div class="form-vcard-note-wrapper">
+ </div>
+ </div>
+
+ <button type="submit" name="create" value="create_card" class="btn btn-primary btn-sm pull-right">{{$create}}</button>
+ <button type="button" class="btn btn-outline-secondary btn-sm" onclick="openClose('create_form')">{{$cancel}}</button>
+ <div class="clear"></div>
+ </form>
+ </div>
+
+ {{foreach $cards as $card}}
+ <form id="card_form_{{$card.id}}" method="post" action="">
+ <input type="hidden" name="target" value="{{$id}}">
+ <input type="hidden" name="uri" value="{{$card.uri}}">
+ <div class="section-content-wrapper-np">
+ <div id="vcard-cancel-{{$card.id}}" class="vcard-cancel vcard-cancel-btn" data-id="{{$card.id}}" data-action="cancel"><i class="fa fa-close"></i></div>
+ <div id="vcard-add-field-{{$card.id}}" class="dropdown pull-right vcard-add-field">
+ <button data-toggle="dropdown" type="button" class="btn btn-outline-secondary btn-sm dropdown-toggle"><i class="fa fa-plus"></i> {{$add_field}}</button>
+ <div class="dropdown-menu dropdown-menu-right">
+ <a class="dropdown-item add-vcard-org add-field"{{if $card.org}} style="display: none"{{/if}} href="#" data-add="vcard-org" data-id="{{$card.id}}">{{$org_label}}</a>
+ <a class="dropdown-item add-vcard-title add-field"{{if $card.title}} style="display: none"{{/if}} href="#" data-add="vcard-title" data-id="{{$card.id}}">{{$title_label}}</a>
+ <a class="dropdown-item add-vcard-tel add-field" href="#" data-add="vcard-tel" data-id="{{$card.id}}">{{$tel_label}}</a>
+ <a class="dropdown-item add-vcard-email add-field" href="#" data-add="vcard-email" data-id="{{$card.id}}">{{$email_label}}</a>
+ <a class="dropdown-item add-vcard-impp add-field" href="#" data-add="vcard-impp" data-id="{{$card.id}}">{{$impp_label}}</a>
+ <a class="dropdown-item add-vcard-url add-field" href="#" data-add="vcard-url" data-id="{{$card.id}}">{{$url_label}}</a>
+ <a class="dropdown-item add-vcard-adr add-field" href="#" data-add="vcard-adr" data-id="{{$card.id}}">{{$adr_label}}</a>
+ <a class="dropdown-item add-vcard-note add-field"{{if $card.note}} style="display: none"{{/if}} href="#" data-add="vcard-note" data-id="{{$card.id}}">{{$note_label}}</a>
+ </div>
+ </div>
+ <div id="vcard-header-{{$card.id}}" class="vcard-header" data-id="{{$card.id}}" data-action="open">
+ {{if $card.photo}}<img class="vcard-photo" src="{{$card.photo}}" width="32px" height="32px">{{else}}<div class="vcard-nophoto"><i class="fa fa-user"></i></div>{{/if}}
+ <span id="vcard-preview-{{$card.id}}" class="vcard-preview">
+ {{if $card.fn}}<span class="vcard-fn-preview">{{$card.fn}}</span>{{/if}}
+ {{if $card.emails.0.address}}<span class="vcard-email-preview hidden-xs">{{$card.emails.0.address}}</span>{{/if}}
+ {{if $card.tels.0}}<span class="vcard-tel-preview hidden-xs">{{$card.tels.0.nr}}</span>{{/if}}
+ </span>
+ <input id="vcard-fn-{{$card.id}}" class="vcard-fn" type="text" name="fn" value="{{$card.fn}}" size="{{$card.fn|count_characters:true}}" placeholder="{{$name_label}}">
+ </div>
+ </div>
+ <div id="vcard-info-{{$card.id}}" class="vcard-info section-content-wrapper">
+
+ <div class="vcard-org form-group">
+ <div class="form-vcard-org-wrapper">
+ {{if $card.org}}
+ <div class="form-group form-vcard-org">
+ <input type="text" name="org" value="{{$card.org}}" size="{{$card.org|count_characters:true}}" placeholder="{{$org_label}}">
+ <i data-remove="vcard-org" data-id="{{$card.id}}" class="fa fa-trash-o remove-field drop-icons fakelink"></i>
+ </div>
+ {{/if}}
+ </div>
+ </div>
+
+ <div class="vcard-title form-group">
+ <div class="form-vcard-title-wrapper">
+ {{if $card.title}}
+ <div class="form-group form-vcard-title">
+ <input type="text" name="title" value="{{$card.title}}" size="{{$card.title|count_characters:true}}" placeholder="{{$title_label}}">
+ <i data-remove="vcard-title" data-id="{{$card.id}}" class="fa fa-trash-o remove-field drop-icons fakelink"></i>
+ </div>
+ {{/if}}
+ </div>
+ </div>
+
+
+ <div class="vcard-tel form-group">
+ <div class="form-vcard-tel-wrapper">
+ {{if $card.tels}}
+ {{foreach $card.tels as $tel}}
+ <div class="form-group form-vcard-tel">
+ <select name="tel_type[]">
+ <option value=""{{if $tel.type.0 != 'CELL' && $tel.type.0 != 'HOME' && $tel.type.0 != 'WORK' && $tel.type.0 != 'OTHER'}} selected="selected"{{/if}}>{{$tel.type.1}}</option>
+ <option value="CELL"{{if $tel.type.0 == 'CELL'}} selected="selected"{{/if}}>{{$mobile}}</option>
+ <option value="HOME"{{if $tel.type.0 == 'HOME'}} selected="selected"{{/if}}>{{$home}}</option>
+ <option value="WORK"{{if $tel.type.0 == 'WORK'}} selected="selected"{{/if}}>{{$work}}</option>
+ <option value="OTHER"{{if $tel.type.0 == 'OTHER'}} selected="selected"{{/if}}>{{$other}}</option>
+ </select>
+ <input type="text" name="tel[]" value="{{$tel.nr}}" size="{{$tel.nr|count_characters:true}}" placeholder="{{$tel_label}}">
+ <i data-remove="vcard-tel" data-id="{{$card.id}}" class="fa fa-trash-o remove-field drop-icons fakelink"></i>
+ </div>
+ {{/foreach}}
+ {{/if}}
+ </div>
+ </div>
+
+
+ <div class="vcard-email form-group">
+ <div class="form-vcard-email-wrapper">
+ {{if $card.emails}}
+ {{foreach $card.emails as $email}}
+ <div class="form-group form-vcard-email">
+ <select name="email_type[]">
+ <option value=""{{if $email.type.0 != 'HOME' && $email.type.0 != 'WORK' && $email.type.0 != 'OTHER'}} selected="selected"{{/if}}>{{$email.type.1}}</option>
+ <option value="HOME"{{if $email.type.0 == 'HOME'}} selected="selected"{{/if}}>{{$home}}</option>
+ <option value="WORK"{{if $email.type.0 == 'WORK'}} selected="selected"{{/if}}>{{$work}}</option>
+ <option value="OTHER"{{if $email.type.0 == 'OTHER'}} selected="selected"{{/if}}>{{$other}}</option>
+ </select>
+ <input type="text" name="email[]" value="{{$email.address}}" size="{{$email.address|count_characters:true}}" placeholder="{{$email_label}}">
+ <i data-remove="vcard-email" data-id="{{$card.id}}" class="fa fa-trash-o remove-field drop-icons fakelink"></i>
+ </div>
+ {{/foreach}}
+ {{/if}}
+ </div>
+ </div>
+
+ <div class="vcard-impp form-group">
+ <div class="form-vcard-impp-wrapper">
+ {{if $card.impps}}
+ {{foreach $card.impps as $impp}}
+ <div class="form-group form-vcard-impp">
+ <select name="impp_type[]">
+ <option value=""{{if $impp.type.0 != 'HOME' && $impp.type.0 != 'WORK' && $impp.type.0 != 'OTHER'}} selected="selected"{{/if}}>{{$impp.type.1}}</option>
+ <option value="HOME"{{if $impp.type.0 == 'HOME'}} selected="selected"{{/if}}>{{$home}}</option>
+ <option value="WORK"{{if $impp.type.0 == 'WORK'}} selected="selected"{{/if}}>{{$work}}</option>
+ <option value="OTHER"{{if $impp.type.0 == 'OTHER'}} selected="selected"{{/if}}>{{$other}}</option>
+ </select>
+ <input type="text" name="impp[]" value="{{$impp.address}}" size="{{$impp.address|count_characters:true}}" placeholder="{{$impp_label}}">
+ <i data-remove="vcard-impp" data-id="{{$card.id}}" class="fa fa-trash-o remove-field drop-icons fakelink"></i>
+ </div>
+ {{/foreach}}
+ {{/if}}
+ </div>
+ </div>
+
+ <div class="vcard-url form-group">
+ <div class="form-vcard-url-wrapper">
+ {{if $card.urls}}
+ {{foreach $card.urls as $url}}
+ <div class="form-group form-vcard-url">
+ <select name="url_type[]">
+ <option value=""{{if $url.type.0 != 'HOME' && $url.type.0 != 'WORK' && $url.type.0 != 'OTHER'}} selected="selected"{{/if}}>{{$url.type.1}}</option>
+ <option value="HOME"{{if $url.type.0 == 'HOME'}} selected="selected"{{/if}}>{{$home}}</option>
+ <option value="WORK"{{if $url.type.0 == 'WORK'}} selected="selected"{{/if}}>{{$work}}</option>
+ <option value="OTHER"{{if $url.type.0 == 'OTHER'}} selected="selected"{{/if}}>{{$other}}</option>
+ </select>
+ <input type="text" name="url[]" value="{{$url.address}}" size="{{$url.address|count_characters:true}}" placeholder="{{$url_label}}">
+ <i data-remove="vcard-url" data-id="{{$card.id}}" class="fa fa-trash-o remove-field drop-icons fakelink"></i>
+ </div>
+ {{/foreach}}
+ {{/if}}
+ </div>
+ </div>
+
+ <div class="vcard-adr form-group">
+ <div class="form-vcard-adr-wrapper">
+ {{if $card.adrs}}
+ {{foreach $card.adrs as $adr}}
+ <div class="form-group form-vcard-adr">
+ <div class="form-group">
+ <label>{{$adr_label}}</label>
+ <select name="adr_type[]">
+ <option value=""{{if $adr.type.0 != 'HOME' && $adr.type.0 != 'WORK' && $adr.type.0 != 'OTHER'}} selected="selected"{{/if}}>{{$adr.type.1}}</option>
+ <option value="HOME"{{if $adr.type.0 == 'HOME'}} selected="selected"{{/if}}>{{$home}}</option>
+ <option value="WORK"{{if $adr.type.0 == 'WORK'}} selected="selected"{{/if}}>{{$work}}</option>
+ <option value="OTHER"{{if $adr.type.0 == 'OTHER'}} selected="selected"{{/if}}>{{$other}}</option>
+ </select>
+ <i data-remove="vcard-adr" data-id="{{$card.id}}" class="fa fa-trash-o remove-field drop-icons fakelink"></i>
+ </div>
+ <div class="form-group">
+ <input type="text" name="adr[{{$adr@index}}][]" value="{{$adr.address.0}}" size="{{$adr.address.0|count_characters:true}}" placeholder="{{$po_box}}">
+ </div>
+ <div class="form-group">
+ <input type="text" name="adr[{{$adr@index}}][]" value="{{$adr.address.1}}" size="{{$adr.address.1|count_characters:true}}" placeholder="{{$extra}}">
+ </div>
+ <div class="form-group">
+ <input type="text" name="adr[{{$adr@index}}][]" value="{{$adr.address.2}}" size="{{$adr.address.2|count_characters:true}}" placeholder="{{$street}}">
+ </div>
+ <div class="form-group">
+ <input type="text" name="adr[{{$adr@index}}][]" value="{{$adr.address.3}}" size="{{$adr.address.3|count_characters:true}}" placeholder="{{$locality}}">
+ </div>
+ <div class="form-group">
+ <input type="text" name="adr[{{$adr@index}}][]" value="{{$adr.address.4}}" size="{{$adr.address.4|count_characters:true}}" placeholder="{{$region}}">
+ </div>
+ <div class="form-group">
+ <input type="text" name="adr[{{$adr@index}}][]" value="{{$adr.address.5}}" size="{{$adr.address.5|count_characters:true}}" placeholder="{{$zip_code}}">
+ </div>
+ <div class="form-group">
+ <input type="text" name="adr[{{$adr@index}}][]" value="{{$adr.address.6}}" size="{{$adr.address.6|count_characters:true}}" placeholder="{{$country}}">
+ </div>
+ </div>
+ {{/foreach}}
+ {{/if}}
+ </div>
+ </div>
+
+ <div class="vcard-note form-group form-vcard-note">
+ <div class="form-vcard-note-wrapper">
+ {{if $card.note}}
+ <label>{{$note_label}}</label>
+ <i data-remove="vcard-note" data-id="{{$card.id}}" class="fa fa-trash-o remove-field drop-icons fakelink"></i>
+ <textarea name="note" class="form-control">{{$card.note}}</textarea>
+ {{/if}}
+ </div>
+ </div>
+
+
+ <button type="submit" name="update" value="update_card" class="btn btn-primary btn-sm pull-right">{{$update}}</button>
+ <button type="submit" name="delete" value="delete_card" class="btn btn-danger btn-sm">{{$delete}}</button>
+ <button type="button" class="btn btn-outline-secondary btn-sm vcard-cancel-btn" data-id="{{$card.id}}" data-action="cancel">{{$cancel}}</button>
+ <div class="clear"></div>
+ </div>
+ </form>
+ {{/foreach}}
+</div>
diff --git a/view/tpl/cdav_calendar.tpl b/view/tpl/cdav_calendar.tpl
new file mode 100644
index 000000000..5d683d751
--- /dev/null
+++ b/view/tpl/cdav_calendar.tpl
@@ -0,0 +1,349 @@
+<script>
+
+var new_event = [];
+var new_event_id = Math.random().toString(36).substring(7);
+var views = {'month' : '{{$month}}', 'agendaWeek' : '{{$week}}', 'agendaDay' : '{{$day}}', 'listMonth' : '{{$list_month}}', 'listWeek' : '{{$list_week}}', 'listDay' : '{{$list_day}}'};
+
+$(document).ready(function() {
+ $('#calendar').fullCalendar({
+ eventSources: [ {{$sources}} ],
+
+ header: false,
+ eventTextColor: 'white',
+
+ lang: '{{$lang}}',
+ firstDay: {{$first_day}},
+
+ monthNames: aStr['monthNames'],
+ monthNamesShort: aStr['monthNamesShort'],
+ dayNames: aStr['dayNames'],
+ dayNamesShort: aStr['dayNamesShort'],
+ allDayText: aStr['allday'],
+
+ timeFormat: 'HH:mm',
+ timezone: 'local',
+
+ defaultTimedEventDuration: '01:00:00',
+ snapDuration: '00:15:00',
+
+ dayClick: function(date, jsEvent, view) {
+
+ if(new_event.length)
+ $('#calendar').fullCalendar( 'removeEventSource', new_event);
+
+ $('#event_uri').val('');
+ $('#id_title').val('New event');
+ $('#calendar_select').val($("#calendar_select option:first").val()).attr('disabled', false);
+ $('#id_dtstart').val(date.format());
+ $('#id_dtend').val(date.hasTime() ? date.add(1, 'hours').format() : date.add(1, 'days').format());
+ $('#id_description').val('');
+ $('#id_location').val('');
+ $('#event_submit').val('create_event').html('Create');
+ $('#event_delete').hide();
+
+ new_event = [{ id: new_event_id, title : 'New event', start: $('#id_dtstart').val(), end: $('#id_dtend').val(), editable: true, color: '#bbb' }]
+ $('#calendar').fullCalendar( 'addEventSource', new_event);
+ },
+
+ eventClick: function(event, jsEvent, view) {
+
+ if(event.id == new_event_id) {
+ $(window).scrollTop(0);
+ $('.section-content-tools-wrapper, #event_form_wrapper').show();
+ $('#recurrence_warning').hide();
+ $('#id_title').focus().val('');
+ return false;
+ }
+
+ if($('main').hasClass('fullscreen') && view.type !== 'month' && event.rw)
+ $('#calendar').fullCalendar('option', 'height', 'auto');
+
+ if(new_event.length && event.rw) {
+ $('#calendar').fullCalendar( 'removeEventSource', new_event);
+ }
+
+ if(!event.recurrent && event.rw) {
+ var start_clone = moment(event.start);
+ var noend_allday = start_clone.add(1, 'day').format('YYYY-MM-DD');
+
+ $(window).scrollTop(0);
+ $('.section-content-tools-wrapper, #event_form_wrapper').show();
+ $('#recurrence_warning').hide();
+ $('#id_title').focus();
+
+ $('#event_uri').val(event.uri);
+ $('#id_title').val(event.title);
+ $('#calendar_select').val(event.calendar_id[0] + ':' + event.calendar_id[1]).attr('disabled', true);
+ $('#id_dtstart').val(event.start.format());
+ $('#id_dtend').val(event.end ? event.end.format() : event.start.hasTime() ? '' : noend_allday);
+ $('#id_description').val(event.description);
+ $('#id_location').val(event.location);
+ $('#event_submit').val('update_event').html('Update');
+ $('#event_delete').show();
+ }
+ else if(event.recurrent && event.rw) {
+ $('.section-content-tools-wrapper, #recurrence_warning').show();
+ $('#event_form_wrapper').hide();
+ $('#event_uri').val(event.uri);
+ $('#calendar_select').val(event.calendar_id[0] + ':' + event.calendar_id[1]).attr('disabled', true);
+ }
+ },
+
+ eventResize: function(event, delta, revertFunc) {
+
+ $('#id_title').val(event.title);
+ $('#id_dtstart').val(event.start.format());
+ $('#id_dtend').val(event.end.format());
+
+ $.post( 'cdav/calendar', {
+ 'update': 'resize',
+ 'id[]': event.calendar_id,
+ 'uri': event.uri,
+ 'dtstart': event.start ? event.start.format() : '',
+ 'dtend': event.end ? event.end.format() : ''
+ })
+ .fail(function() {
+ revertFunc();
+ });
+ },
+
+ eventDrop: function(event, delta, revertFunc) {
+
+ var start_clone = moment(event.start);
+ var noend_allday = start_clone.add(1, 'day').format('YYYY-MM-DD');
+
+ $('#id_title').val(event.title);
+ $('#id_dtstart').val(event.start.format());
+ $('#id_dtend').val(event.end ? event.end.format() : event.start.hasTime() ? '' : noend_allday);
+
+ $.post( 'cdav/calendar', {
+ 'update': 'drop',
+ 'id[]': event.calendar_id,
+ 'uri': event.uri,
+ 'dtstart': event.start ? event.start.format() : '',
+ 'dtend': event.end ? event.end.format() : event.start.hasTime() ? '' : noend_allday
+ })
+ .fail(function() {
+ revertFunc();
+ });
+ },
+
+ loading: function(isLoading, view) {
+ $('#events-spinner').spin('tiny');
+ $('#events-spinner > i').css('color', 'transparent');
+ if(!isLoading) {
+ $('#events-spinner').spin(false);
+ $('#events-spinner > i').css('color', '');
+ }
+ }
+ });
+
+ // echo the title
+ var view = $('#calendar').fullCalendar('getView');
+
+ $('#title').text(view.title);
+
+ $('#view_selector').html(views[view.name]);
+
+ $('.color-edit').colorpicker({ input: '.color-edit-input' });
+
+ $(document).on('click','#fullscreen-btn', on_fullscreen);
+ $(document).on('click','#inline-btn', on_inline);
+
+ $(document).on('click','#event_submit', on_submit);
+ $(document).on('click','#event_more', on_more);
+ $(document).on('click','#event_cancel, #event_cancel_recurrent', reset_form);
+ $(document).on('click','#event_delete, #event_delete_recurrent', on_delete);
+
+});
+
+function changeView(action, viewName) {
+ $('#calendar').fullCalendar(action, viewName);
+ var view = $('#calendar').fullCalendar('getView');
+
+ if($('main').hasClass('fullscreen'))
+ if(view.name !== 'month')
+ $('.section-content-tools-wrapper').css('display') === 'none' ? on_fullscreen() : on_inline() ;
+ else
+ on_fullscreen();
+ else
+ on_inline();
+
+ $('#title').text(view.title);
+ $('#view_selector').html(views[view.name]);
+}
+
+function add_remove_json_source(source, color, editable, status) {
+
+ if(status === undefined)
+ status = 'fa-calendar-check-o';
+
+ if(status === 'drop') {
+ reset_form();
+ $('#calendar').fullCalendar( 'removeEventSource', source );
+ return;
+ }
+
+ var parts = source.split('/');
+ var id = parts[4];
+
+ var selector = '#calendar-btn-' + id;
+
+ if($(selector).hasClass('fa-calendar-o')) {
+ $('#calendar').fullCalendar( 'addEventSource', { url: source, color: color, editable: editable });
+ $(selector).removeClass('fa-calendar-o');
+ $(selector).addClass(status);
+ $.get('/cdav/calendar/switch/' + id + '/1');
+ }
+ else {
+ $('#calendar').fullCalendar( 'removeEventSource', source );
+ $(selector).removeClass(status);
+ $(selector).addClass('fa-calendar-o');
+ $.get('/cdav/calendar/switch/' + id + '/0');
+ }
+}
+
+function on_fullscreen() {
+ var view = $('#calendar').fullCalendar('getView');
+ if(($('.section-content-tools-wrapper').css('display') === 'none') || ($('.section-content-tools-wrapper').css('display') !== 'none' && view.type === 'month'))
+ $('#calendar').fullCalendar('option', 'height', $(window).height() - $('.section-title-wrapper').outerHeight(true) - 2); // -2 is for border width (.generic-content-wrapper top and bottom) of .generic-content-wrapper
+}
+
+function on_inline() {
+ var view = $('#calendar').fullCalendar('getView');
+ ((view.type === 'month') ? $('#calendar').fullCalendar('option', 'height', '') : $('#calendar').fullCalendar('option', 'height', 'auto'));
+}
+
+function on_submit() {
+ $.post( 'cdav/calendar', {
+ 'submit': $('#event_submit').val(),
+ 'target': $('#calendar_select').val(),
+ 'uri': $('#event_uri').val(),
+ 'title': $('#id_title').val(),
+ 'dtstart': $('#id_dtstart').val(),
+ 'dtend': $('#id_dtend').val(),
+ 'description': $('#id_description').val(),
+ 'location': $('#id_location').val()
+ })
+ .done(function() {
+ $('#calendar').fullCalendar( 'refetchEventSources', [ {{$sources}} ] );
+ reset_form();
+ });
+}
+
+function on_delete() {
+ $.post( 'cdav/calendar', {
+ 'delete': 'delete',
+ 'target': $('#calendar_select').val(),
+ 'uri': $('#event_uri').val(),
+ })
+ .done(function() {
+ $('#calendar').fullCalendar( 'refetchEventSources', [ {{$sources}} ] );
+ reset_form();
+ });
+}
+
+function reset_form() {
+ $('.section-content-tools-wrapper, #event_form_wrapper, #recurrence_warning').hide();
+
+ $('#event_submit').val('');
+ $('#calendar_select').val('');
+ $('#event_uri').val('');
+ $('#id_title').val('');
+ $('#id_dtstart').val('');
+ $('#id_dtend').val('');
+
+ if(new_event.length)
+ $('#calendar').fullCalendar( 'removeEventSource', new_event);
+
+ if($('#more_block').hasClass('open'))
+ on_more();
+
+ if($('main').hasClass('fullscreen'))
+ on_fullscreen();
+}
+
+function on_more() {
+ if($('#more_block').hasClass('open')) {
+ $('#event_more').html('<i class="fa fa-caret-down"></i> {{$more}}');
+ $('#more_block').removeClass('open').hide();
+ }
+ else {
+ $('#event_more').html('<i class="fa fa-caret-up"></i> {{$less}}');
+ $('#more_block').addClass('open').show();
+ }
+}
+
+</script>
+
+<div class="generic-content-wrapper">
+ <div class="section-title-wrapper">
+ <div class="float-right">
+ <div class="dropdown">
+ <button id="view_selector" type="button" class="btn btn-outline-secondary btn-sm dropdown-toggle" data-toggle="dropdown"></button>
+ <div class="dropdown-menu">
+ <a class="dropdown-item" href="#" onclick="changeView('changeView', 'month'); return false;">{{$month}}</a></li>
+ <a class="dropdown-item" href="#" onclick="changeView('changeView', 'agendaWeek'); return false;">{{$week}}</a></li>
+ <a class="dropdown-item" href="#" onclick="changeView('changeView', 'agendaDay'); return false;">{{$day}}</a></li>
+ <div class="dropdown-divider"></div>
+ <a class="dropdown-item" href="#" onclick="changeView('changeView', 'listMonth'); return false;">{{$list_month}}</a></li>
+ <a class="dropdown-item" href="#" onclick="changeView('changeView', 'listWeek'); return false;">{{$list_week}}</a></li>
+ <a class="dropdown-item" href="#" onclick="changeView('changeView', 'listDay'); return false;">{{$list_day}}</a></li>
+ </div>
+ <div class="btn-group">
+ <button class="btn btn-outline-secondary btn-sm" onclick="changeView('prev', false);" title="{{$prev}}"><i class="fa fa-backward"></i></button>
+ <button id="events-spinner" class="btn btn-outline-secondary btn-sm" onclick="changeView('today', false);" title="{{$today}}"><i class="fa fa-bullseye"></i></button>
+ <button class="btn btn-outline-secondary btn-sm" onclick="changeView('next', false);" title="{{$next}}"><i class="fa fa-forward"></i></button>
+ </div>
+ <button id="fullscreen-btn" type="button" class="btn btn-outline-secondary btn-sm" onclick="makeFullScreen();"><i class="fa fa-expand"></i></button>
+ <button id="inline-btn" type="button" class="btn btn-outline-secondary btn-sm" onclick="makeFullScreen(false);"><i class="fa fa-compress"></i></button>
+ </div>
+ </div>
+ <h2 id="title"></h2>
+ <div class="clear"></div>
+ </div>
+ <div class="section-content-tools-wrapper" style="display: none">
+ <div id="recurrence_warning" style="display: none">
+ <div class="section-content-warning-wrapper">
+ {{$recurrence_warning}}
+ </div>
+ <div>
+ <button id="event_delete_recurrent" type="button" class="btn btn-danger btn-sm">{{$delete_all}}</button>
+ <button id="event_cancel_recurrent" type="button" class="btn btn-outline-secondary btn-sm">{{$cancel}}</button>
+ </div>
+ </div>
+ <div id="event_form_wrapper" style="display: none">
+ <form id="event_form" method="post" action="">
+ <input id="event_uri" type="hidden" name="uri" value="">
+ {{include file="field_input.tpl" field=$title}}
+ <label for="calendar_select">{{$calendar_select_label}}</label>
+ <select id="calendar_select" name="target" class="form-control form-group">
+ {{foreach $writable_calendars as $writable_calendar}}
+ <option value="{{$writable_calendar.id.0}}:{{$writable_calendar.id.1}}">{{$writable_calendar.displayname}}{{if $writable_calendar.sharer}} ({{$writable_calendar.sharer}}){{/if}}</option>
+ {{/foreach}}
+ </select>
+ <div id="more_block" style="display: none;">
+ {{include file="field_input.tpl" field=$dtstart}}
+ {{include file="field_input.tpl" field=$dtend}}
+ {{include file="field_textarea.tpl" field=$description}}
+ {{include file="field_textarea.tpl" field=$location}}
+ </div>
+ <div class="form-group">
+ <div class="pull-right">
+ <button id="event_more" type="button" class="btn btn-outline-secondary btn-sm"><i class="fa fa-caret-down"></i> {{$more}}</button>
+ <button id="event_submit" type="button" value="" class="btn btn-primary btn-sm"></button>
+
+ </div>
+ <div>
+ <button id="event_delete" type="button" class="btn btn-danger btn-sm">{{$delete}}</button>
+ <button id="event_cancel" type="button" class="btn btn-outline-secondary btn-sm">{{$cancel}}</button>
+ </div>
+ <div class="clear"></div>
+ </div>
+ </form>
+ </div>
+ </div>
+ <div class="section-content-wrapper-np">
+ <div id="calendar"></div>
+ </div>
+</div>
diff --git a/view/tpl/cdav_widget_addressbook.tpl b/view/tpl/cdav_widget_addressbook.tpl
new file mode 100644
index 000000000..80b5feaf6
--- /dev/null
+++ b/view/tpl/cdav_widget_addressbook.tpl
@@ -0,0 +1,67 @@
+<div class="widget">
+ <h3>{{$addressbooks_label}}</h3>
+ {{foreach $addressbooks as $addressbook}}
+ <div id="addressbook-{{$addressbook.id}}" class="ml-3">
+ <div class="form-group">
+ <i class="fa fa-user generic-icons"></i><a href="/cdav/addressbook/{{$addressbook.id}}">{{$addressbook.displayname}}</a>
+ <div class="float-right">
+ <i id="edit-icon" class="fa fa-pencil fakelink generic-icons" onclick="openClose('edit-addressbook-{{$addressbook.id}}')"></i>
+ <a href="/cdav/addressbooks/{{$addressbook.ownernick}}/{{$addressbook.uri}}/?export"><i id="download-icon" class="fa fa-cloud-download fakelink generic-icons"></i></a>
+ <a href="#" onclick="dropItem('/cdav/addressbook/drop/{{$addressbook.id}}', '#addressbook-{{$addressbook.id}}'); return false;"><i class="fa fa-trash-o drop-icons"></i></a>
+ </div>
+ </div>
+ <div id="edit-addressbook-{{$addressbook.id}}" class="sub-menu" style="display: none;">
+ <form id="edit-addressbook-{{$addressbook.id}}" method="post" action="">
+ <label for="edit-{{$addressbook.id}}">{{$edit_label}}</label>
+ <div id="edit-form-{{$addressbook.id}}" class="form-group">
+ <input id="id-{{$addressbook.id}}" name="id" type="hidden" value="{{$addressbook.id}}">
+ <input id="edit-{{$addressbook.id}}" name="{DAV:}displayname" type="text" value="{{$addressbook.displayname}}" class="form-control">
+ </div>
+ <div class="form-group">
+ <button type="submit" name="edit" value="edit" class="btn btn-primary btn-sm">{{$edit}}</button>
+ </div>
+ </form>
+ </div>
+ </div>
+ {{/foreach}}
+</div>
+
+<div class="widget">
+ <h3>{{$tools_label}}</h3>
+ <ul class="nav nav-pills flex-column">
+ <li class="nav-item">
+ <a class="nav-link" href="#" onclick="openClose('create-addressbook'); return false;"><i class="fa fa-user-plus generic-icons"></i> {{$create_label}}</a>
+ </li>
+ <div id="create-addressbook" class="sub-menu-wrapper">
+ <div class="sub-menu">
+ <form method="post" action="">
+ <div class="form-group">
+ <input id="create" name="{DAV:}displayname" type="text" placeholder="{{$create_placeholder}}" class="form-control form-group">
+ <button type="submit" name="create" value="create" class="btn btn-primary btn-sm">{{$create}}</button>
+ </div>
+ </form>
+ </div>
+ </div>
+ <li class="nav-item">
+ <a class="nav-link" href="#" onclick="openClose('upload-form'); return false;"><i class="fa fa-cloud-upload generic-icons"></i> {{$import_label}}</a>
+ </li>
+ <div id="upload-form" class="sub-menu-wrapper">
+ <div class="sub-menu">
+ <form enctype="multipart/form-data" method="post" action="">
+ <div class="form-group">
+ <select id="import" name="target" class="form-control">
+ <option value="">{{$import_placeholder}}</option>
+ {{foreach $addressbooks as $addressbook}}
+ <option value="{{$addressbook.id}}">{{$addressbook.displayname}}</option>
+ {{/foreach}}
+ </select>
+ </div>
+ <div class="form-group">
+ <input class="form-control-file w-100" id="addressbook-upload-choose" type="file" name="userfile" />
+ </div>
+ <button class="btn btn-primary btn-sm" type="submit" name="a_upload" value="a_upload">{{$upload}}</button>
+ </form>
+ </div>
+ </div>
+ </ul>
+</div>
diff --git a/view/tpl/cdav_widget_calendar.tpl b/view/tpl/cdav_widget_calendar.tpl
new file mode 100644
index 000000000..ec2257a19
--- /dev/null
+++ b/view/tpl/cdav_widget_calendar.tpl
@@ -0,0 +1,121 @@
+{{if $my_calendars}}
+<div class="widget">
+ <h3>{{$my_calendars_label}}</h3>
+ {{foreach $my_calendars as $calendar}}
+ <div id="calendar-{{$calendar.calendarid}}">
+ <div class="ml-3{{if !$calendar@last}} form-group{{/if}}">
+ <i id="calendar-btn-{{$calendar.calendarid}}" class="fa {{if $calendar.switch}}fa-calendar-check-o{{else}}fa-calendar-o{{/if}} generic-icons fakelink" onclick="add_remove_json_source('{{$calendar.json_source}}', '{{$calendar.color}}', {{$calendar.editable}})" style="color: {{$calendar.color}};"></i>{{$calendar.displayname}}
+ <div class="float-right">
+ <i id="edit-icon" class="fa fa-pencil fakelink generic-icons" onclick="openClose('edit-calendar-{{$calendar.calendarid}}')"></i>
+ <a href="/cdav/calendars/{{$calendar.ownernick}}/{{$calendar.uri}}/?export"><i id="download-icon" class="fa fa-cloud-download fakelink generic-icons"></i></a>
+ <i id="share-icon" class="fa fa-share-alt fakelink generic-icons" onclick="openClose('share-calendar-{{$calendar.calendarid}}')"></i>
+ <a href="#" onclick="var drop = dropItem('/cdav/calendar/drop/{{$calendar.calendarid}}/{{$calendar.instanceid}}', '#calendar-{{$calendar.calendarid}}'); if(drop) { add_remove_json_source('{{$calendar.json_source}}', '{{$calendar.color}}', {{$calendar.editable}}, 'drop'); } return false;"><i class="fa fa-trash-o drop-icons"></i></a>
+ </div>
+ <div id="share-calendar-{{$calendar.calendarid}}" class="sub-menu" style="display: none; border-color: {{$calendar.color}};">
+ {{if $calendar.sharees}}
+ {{foreach $calendar.sharees as $sharee}}
+ <div id="sharee-{{$calendar.calendarid}}" class="form-group">
+ <i class="fa fa-share generic-icons"></i>{{$sharee.name}}&nbsp;{{$sharee.access}}
+ <div class="pull-right">
+ <a href="#" onclick="dropItem('/cdav/calendar/dropsharee/{{$calendar.calendarid}}/{{$calendar.instanceid}}/{{$sharee.hash}}', '#sharee-{{$calendar.calendarid}}'); return false;"><i class="fa fa-trash-o drop-icons"></i></a>
+ </div>
+ </div>
+ {{/foreach}}
+ {{/if}}
+ <form method="post" action="">
+ <label for="share-{{$calendar.calendarid}}">{{$share_label}}</label>
+ <input name="calendarid" type="hidden" value="{{$calendar.calendarid}}">
+ <input name="instanceid" type="hidden" value="{{$calendar.instanceid}}">
+ <div class="form-group">
+ <select id="share-{{$calendar.calendarid}}" name="sharee" class="form-control">
+ {{$sharee_options}}
+ </select>
+ </div>
+ <div class="form-group">
+ <select name="access" class="form-control">
+ {{$access_options}}
+ </select>
+ </div>
+ <div class="form-group">
+ <button type="submit" name="share" value="share" class="btn btn-primary btn-sm">{{$share}}</button>
+ </div>
+ </form>
+ </div>
+ <div id="edit-calendar-{{$calendar.calendarid}}" class="sub-menu" style="display: none; border-color: {{$calendar.color}};">
+ <form id="edit-calendar-{{$calendar.calendarid}}" method="post" action="" class="colorpicker-component color-edit">
+ <input id="id-{{$calendar.calendarid}}" name="id" type="hidden" value="{{$calendar.calendarid}}:{{$calendar.instanceid}}">
+ <input id="color-{{$calendar.calendarid}}" name="color" type="hidden" value="{{$calendar.color}}" class="color-edit-input">
+ <label for="edit-form-{{$calendar.calendarid}}">{{$edit_label}}</label>
+ <div id="edit-form-{{$calendar.calendarid}}" class="input-group form-group">
+ <input id="create-{{$calendar.calendarid}}" name="{DAV:}displayname" type="text" value="{{$calendar.displayname}}" class="form-control">
+ <span class="input-group-addon"><i></i></span>
+ </div>
+ <div class="form-group">
+ <button type="submit" name="edit" value="edit" class="btn btn-primary btn-sm">{{$edit}}</button>
+ </div>
+ </form>
+ </div>
+ </div>
+ </div>
+ {{/foreach}}
+</div>
+{{/if}}
+
+{{if $shared_calendars}}
+<div class="widget">
+ <h3>{{$shared_calendars_label}}</h3>
+ {{foreach $shared_calendars as $calendar}}
+ <div id="shared-calendar-{{$calendar.calendarid}}" class="ml-3{{if !$calendar@last}} form-group{{/if}}">
+ <i id="calendar-btn-{{$calendar.calendarid}}" class="fa {{if $calendar.switch}}{{if $calendar.access == 'read-write'}}fa-calendar-check-o{{else}}fa-calendar-times-o{{/if}}{{else}}fa-calendar-o{{/if}} generic-icons fakelink" onclick="add_remove_json_source('{{$calendar.json_source}}', '{{$calendar.color}}', {{$calendar.editable}}, {{if $calendar.access == 'read-write'}}'fa-calendar-check-o'{{else}}'fa-calendar-times-o'{{/if}})" style="color: {{$calendar.color}};"></i>{{$calendar.displayname}} ({{$calendar.sharer}})
+ <div class="pull-right">
+ <a href="/cdav/calendars/{{$calendar.ownernick}}/{{$calendar.uri}}/?export"><i id="download-icon" class="fa fa-cloud-download fakelink generic-icons"></i></a>
+ <a href="#" onclick="var drop = dropItem('/cdav/calendar/drop/{{$calendar.calendarid}}/{{$calendar.instanceid}}', '#shared-calendar-{{$calendar.calendarid}}'); if(drop) { add_remove_json_source('{{$calendar.json_source}}', '{{$calendar.color}}', {{$calendar.editable}}, 'drop'); } return false;"><i class="fa fa-trash-o drop-icons"></i></a>
+ </div>
+ </div>
+ {{/foreach}}
+</div>
+{{/if}}
+
+<div class="widget">
+ <h3>{{$tools_label}}</h3>
+ <div class="nav nav-pills flex-column">
+ <li class="nav-item">
+ <a class="nav-link" href="#" onclick="openClose('create-calendar'); return false;"><i class="fa fa-calendar-plus-o generic-icons"></i> {{$create_label}}</a>
+ </li>
+ <div id="create-calendar" class="sub-menu-wrapper">
+ <div class="sub-menu">
+ <form method="post" action="" class="colorpicker-component color-edit">
+ <input id="color" name="color" type="hidden" value="#3a87ad" class="color-edit-input">
+ <div id="create-form" class="input-group form-group">
+ <input id="create" name="{DAV:}displayname" type="text" placeholder="{{$create_placeholder}}" class="form-control">
+ <span class="input-group-addon"><i></i></span>
+ </div>
+ <div class="form-group">
+ <button type="submit" name="create" value="create" class="btn btn-primary btn-sm">{{$create}}</button>
+ </div>
+ </form>
+ </div>
+ </div>
+ <li class="nav-item">
+ <a class="nav-link" href="#" onclick="openClose('upload-form'); return false;"><i class="fa fa-cloud-upload generic-icons"></i> {{$import_label}}</a>
+ </li>
+ <div id="upload-form" class="sub-menu-wrapper">
+ <div class="sub-menu">
+ <form enctype="multipart/form-data" method="post" action="">
+ <div class="form-group">
+ <select id="import" name="target" class="form-control">
+ <option value="">{{$import_placeholder}}</option>
+ {{foreach $writable_calendars as $writable_calendar}}
+ <option value="{{$writable_calendar.id.0}}:{{$writable_calendar.id.1}}">{{$writable_calendar.displayname}}</option>
+ {{/foreach}}
+ </select>
+ </div>
+ <div class="form-group">
+ <input class="form-control-file w-100" id="event-upload-choose" type="file" name="userfile" />
+ </div>
+ <button class="btn btn-primary btn-sm" type="submit" name="c_upload" value="c_upload">{{$upload}}</button>
+ </form>
+ </div>
+ </div>
+ </div>
+</div>
diff --git a/view/tpl/channel.tpl b/view/tpl/channel.tpl
index 1a84f1e66..63e09ec05 100755
--- a/view/tpl/channel.tpl
+++ b/view/tpl/channel.tpl
@@ -17,7 +17,7 @@
</div>
<h3>
{{if $selected == $channel.channel_id}}
- <i class="selected-channel fa fa-circle" title="{{$msg_selected}}"></i>
+ <i class="fa fa-circle text-success" title="{{$msg_selected}}"></i>
{{/if}}
{{if $channel.delegate}}
<i class="fa fa-arrow-circle-right" title="{{$delegated_desc}}"></i>
@@ -37,11 +37,11 @@
<div class="channel-notifications-wrapper">
{{if !$channel.delegate}}
<div class="channel-notification">
- <i class="fa fa-envelope{{if $channel.mail != 0}} new-notification{{/if}}"></i>
+ <i class="fa fa-fw fa-envelope{{if $channel.mail != 0}} text-danger{{/if}}"></i>
{{if $channel.mail != 0}}<a href="manage/{{$channel.channel_id}}/mail/combined">{{/if}}{{$channel.mail|string_format:$mail_format}}{{if $channel.mail != 0}}</a>{{/if}}
</div>
<div class="channel-notification">
- <i class="fa fa-user{{if $channel.intros != 0}} new-notification{{/if}}"></i>
+ <i class="fa fa-fw fa-user{{if $channel.intros != 0}} text-danger{{/if}}"></i>
{{if $channel.intros != 0}}<a href='manage/{{$channel.channel_id}}/connections/ifpending'>{{/if}}{{$channel.intros|string_format:$intros_format}}{{if $channel.intros != 0}}</a>{{/if}}
</div>
{{/if}}
diff --git a/view/tpl/chatrooms.tpl b/view/tpl/chatrooms.tpl
index d3eeed24f..0e6847608 100644
--- a/view/tpl/chatrooms.tpl
+++ b/view/tpl/chatrooms.tpl
@@ -27,7 +27,7 @@
<ul id="panel-{{$room.cr_id}}" class="lockview-panel dropdown-menu"></ul>
{{/if}}
</td>
- <td><span class="badge badge-default">{{$room.cr_inroom}}</span></td>
+ <td><span class="badge badge-secondary">{{$room.cr_inroom}}</span></td>
</tr>
{{/foreach}}
</table>
diff --git a/view/tpl/comment_item.tpl b/view/tpl/comment_item.tpl
index bd5176c83..02b0c527c 100755
--- a/view/tpl/comment_item.tpl
+++ b/view/tpl/comment_item.tpl
@@ -10,6 +10,14 @@
<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" />
+ {{if $anoncomments && ! $observer}}
+ <div id="comment-edit-anon-{{$id}}" style="display: none;" >
+ {{include file="field_input.tpl" field=$anonname}}
+ {{include file="field_input.tpl" field=$anonmail}}
+ {{include file="field_input.tpl" field=$anonurl}}
+ {{$anon_extras}}
+ </div>
+ {{/if}}
<textarea id="comment-edit-text-{{$id}}" class="comment-edit-text-empty" name="body" onFocus="commentOpenUI(this,{{$id}});" onBlur="commentCloseUI(this,{{$id}});" ondragenter="linkdropper(event);" ondragleave="linkdropexit(event);" ondragover="linkdropper(event);" ondrop="linkdrop(event);" >{{$comment}}</textarea>
{{if $qcomment}}
<select id="qcomment-select-{{$id}}" name="qcomment-{{$id}}" class="qcomment" onchange="qCommentInsert(this,{{$id}});" >
diff --git a/view/tpl/connection_template.tpl b/view/tpl/connection_template.tpl
index 16915abda..8e49c9e27 100755
--- a/view/tpl/connection_template.tpl
+++ b/view/tpl/connection_template.tpl
@@ -8,8 +8,8 @@
<a href="connedit/{{$contact.id}}/ignore" class="btn btn-warning btn-sm" title="{{$contact.ignore_hover}}"><i class="fa fa-ban"></i> {{$contact.ignore}}</a>
{{/if}}
- <a href="#" class="btn btn-danger btn-sm" title="{{$contact.delete_hover}}" onclick="dropItem('{{$contact.deletelink}}', '#contact-entry-wrapper-{{$contact.id}}'); return false;"><i class="fa fa-trash-o"></i> {{$contact.delete}}</a>
- <a href="{{$contact.link}}" class="btn btn-outline-secondary btn-sm" title="{{$contact.edit_hover}}"><i class="fa fa-pencil"></i></a>
+ <a href="#" class="btn btn-danger btn-sm contact-delete-btn" title="{{$contact.delete_hover}}" onclick="dropItem('{{$contact.deletelink}}', '#contact-entry-wrapper-{{$contact.id}}'); return false;"><i class="fa fa-trash-o"></i> {{$contact.delete}}</a>
+ <a href="{{$contact.link}}" class="btn btn-outline-secondary btn-sm" title="{{$contact.edit_hover}}"><i class="fa fa-pencil"></i> {{$contact.edit}}</a>
{{if $contact.approve}}
</form>
{{/if}}
diff --git a/view/tpl/contact_slider.tpl b/view/tpl/contact_slider.tpl
index 550abc147..0848df673 100755
--- a/view/tpl/contact_slider.tpl
+++ b/view/tpl/contact_slider.tpl
@@ -4,10 +4,10 @@ $(document).ready(function() {
// The slider does not render correct if width is given in % and
// the slider container is hidden (display: none) during rendering.
// So let's unhide it to render and hide again afterwards.
- if(!$("#affinity-tool-collapse").hasClass("in")) {
- $("#affinity-tool-collapse").addClass("in");
+ if(!$("#affinity-tool-collapse").hasClass("show")) {
+ $("#affinity-tool-collapse").addClass("show");
makeContactSlider();
- $("#affinity-tool-collapse").removeClass("in");
+ $("#affinity-tool-collapse").removeClass("show");
}
else {
makeContactSlider();
diff --git a/view/tpl/conv_item.tpl b/view/tpl/conv_item.tpl
index 2d51af4ff..36cb4cc83 100755
--- a/view/tpl/conv_item.tpl
+++ b/view/tpl/conv_item.tpl
@@ -84,9 +84,9 @@
</div>
{{/if}}
<div class="p-2 clearfix wall-item-tools">
- <div class="wall-item-tools-right pull-right">
+ <div class="float-right wall-item-tools-right">
{{if $item.toplevel && $item.emojis && $item.reactions}}
- <div class="btn-group dropdown">
+ <div class="btn-group">
<button type="button" class="btn btn-outline-secondary btn-sm dropdown-toggle" data-toggle="dropdown" id="wall-item-react-{{$item.id}}">
<i class="fa fa-smile-o"></i>
</button>
@@ -97,7 +97,7 @@
</div>
</div>
{{/if}}
- <div class="btn-group dropdown">
+ <div class="btn-group">
{{if $item.like}}
<button type="button" title="{{$item.like.0}}" class="btn btn-outline-secondary btn-sm" onclick="dolike({{$item.id}},'like'); return false;">
<i class="fa fa-thumbs-o-up{{if $item.my_responses.like}} ivoted{{/if}}" ></i>
@@ -109,11 +109,11 @@
</button>
{{/if}}
{{if $item.isevent}}
- <div class="btn-group dropdown">
+ <div class="btn-group">
<button type="button" class="btn btn-outline-secondary btn-sm dropdown-toggle" data-toggle="dropdown" id="wall-item-attend-menu-{{$item.id}}" title="{{$item.attend_title}}">
<i class="fa fa-calendar-check-o"></i>
</button>
- <div class="dropdown-menu">
+ <div class="dropdown-menu dropdown-menu-right">
<a class="dropdown-item" href="#" title="{{$item.attend.0}}" onclick="itemAddToCal({{$item.id}}); dolike({{$item.id}},'attendyes'); return false;">
<i class="item-act-list fa fa-check{{if $item.my_responses.attend}} ivoted{{/if}}" ></i> {{$item.attend.0}}
</a>
@@ -127,11 +127,11 @@
</div>
{{/if}}
{{if $item.canvote}}
- <div class="btn-group dropdown">
+ <div class="btn-group">
<button type="button" class="btn btn-outline-secondary btn-sm dropdown-toggle" data-toggle="dropdown" id="wall-item-consensus-menu-{{$item.id}}" title="{{$item.vote_title}}">
<i class="fa fa-check-square-o"></i>
</button>
- <div class="dropdown-menu" role="menu" aria-labelledby="wall-item-consensus-menu-{{$item.id}}">
+ <div class="dropdown-menu dropdown-menu-right" role="menu" aria-labelledby="wall-item-consensus-menu-{{$item.id}}">
<a class="dropdown-item" href="#" title="{{$item.conlabels.0}}" onclick="dolike({{$item.id}},'agree'); return false;">
<i class="item-act-list fa fa-check{{if $item.my_responses.agree}} ivoted{{/if}}" ></i> {{$item.conlabels.0}}
</a>
@@ -144,51 +144,53 @@
</div>
</div>
{{/if}}
- <button type="button" class="btn btn-outline-secondary btn-sm dropdown-toggle" data-toggle="dropdown" id="wall-item-menu-{{$item.id}}">
- <i class="fa fa-cog"></i>
- </button>
- <div class="dropdown-menu dropdown-menu-right" role="menu" aria-labelledby="wall-item-menu-{{$item.id}}">
- {{if $item.share}}
- <a class="dropdown-item" href="#" onclick="jotShare({{$item.id}}); return false"><i class="generic-icons-nav fa fa-fw fa-retweet" title="{{$item.share.0}}"></i>{{$item.share.0}}</a>
- {{/if}}
- {{if $item.plink}}
- <a class="dropdown-item" href="{{$item.plink.href}}" title="{{$item.plink.title}}" class="u-url"><i class="generic-icons-nav fa fa-fw fa-external-link"></i>{{$item.plink.title}}</a>
- {{/if}}
- {{if $item.edpost}}
- <a class="dropdown-item" href="{{$item.edpost.0}}" title="{{$item.edpost.1}}"><i class="generic-icons-nav fa fa-fw fa-pencil"></i>{{$item.edpost.1}}</a>
- {{/if}}
- {{if $item.tagger}}
- <a class="dropdown-item" href="#" onclick="itemTag({{$item.id}}); return false;"><i id="tagger-{{$item.id}}" class="generic-icons-nav fa fa-fw fa-tag" title="{{$item.tagger.tagit}}"></i>{{$item.tagger.tagit}}</a>
- {{/if}}
- {{if $item.filer}}
- <a class="dropdown-item" href="#" onclick="itemFiler({{$item.id}}); return false;"><i id="filer-{{$item.id}}" class="generic-icons-nav fa fa-fw fa-folder-open" title="{{$item.filer}}"></i>{{$item.filer}}</a>
- {{/if}}
- {{if $item.bookmark}}
- <a class="dropdown-item" href="#" onclick="itemBookmark({{$item.id}}); return false;"><i id="bookmarker-{{$item.id}}" class="generic-icons-nav fa fa-fw fa-bookmark" title="{{$item.bookmark}}"></i>{{$item.bookmark}}</a>
- {{/if}}
- {{if $item.addtocal}}
- <a class="dropdown-item" href="#" onclick="itemAddToCal({{$item.id}}); return false;"><i id="addtocal-{{$item.id}}" class="generic-icons-nav fa fa-fw fa-calendar" title="{{$item.addtocal}}"></i>{{$item.addtocal}}</a>
- {{/if}}
- {{if $item.star}}
- <a class="dropdown-item" href="#" onclick="dostar({{$item.id}}); return false;"><i id="starred-{{$item.id}}" class="generic-icons-nav fa fa-fw fa-star {{$item.star.isstarred}}" title="{{$item.star.toggle}}"></i>{{$item.star.toggle}}</a>
- {{/if}}
- {{if $item.thread_action_menu}}
- {{foreach $item.thread_action_menu as $mitem}}
- <a class="dropdown-item" {{if $mitem.href}}href="{{$mitem.href}}"{{/if}} {{if $mitem.action}}onclick="{{$mitem.action}}"{{/if}} {{if $mitem.title}}title="{{$mitem.title}}"{{/if}} ><i class="generic-icons-nav fa fa-fw fa-{{$mitem.icon}}"></i>{{$mitem.title}}</a>
- {{/foreach}}
- {{/if}}
- {{if $item.drop.dropping}}
- <a class="dropdown-item" href="#" onclick="dropItem('item/drop/{{$item.id}}', '#thread-wrapper-{{$item.id}}'); return false;" title="{{$item.drop.delete}}" ><i class="generic-icons-nav fa fa-fw fa-trash-o"></i>{{$item.drop.delete}}</a>
- {{/if}}
- {{if $item.thread_author_menu}}
- <div class="dropdown-divider"></div>
- {{foreach $item.thread_author_menu as $mitem}}
- <a class="dropdown-item" {{if $mitem.href}}href="{{$mitem.href}}"{{/if}} {{if $mitem.action}}onclick="{{$mitem.action}}"{{/if}} {{if $mitem.title}}title="{{$mitem.title}}"{{/if}} >{{$mitem.title}}</a>
- {{/foreach}}
- {{/if}}
- {{if $item.edpost && $item.dreport}}
- <a class="dropdown-item" href="dreport/{{$item.mid}}">{{$item.dreport}}</a>
- {{/if}}
+ <div class="btn-group">
+ <button type="button" class="btn btn-outline-secondary btn-sm dropdown-toggle" data-toggle="dropdown" id="wall-item-menu-{{$item.id}}">
+ <i class="fa fa-cog"></i>
+ </button>
+ <div class="dropdown-menu dropdown-menu-right" role="menu" aria-labelledby="wall-item-menu-{{$item.id}}">
+ {{if $item.share}}
+ <a class="dropdown-item" href="#" onclick="jotShare({{$item.id}}); return false"><i class="generic-icons-nav fa fa-fw fa-retweet" title="{{$item.share.0}}"></i>{{$item.share.0}}</a>
+ {{/if}}
+ {{if $item.plink}}
+ <a class="dropdown-item" href="{{$item.plink.href}}" title="{{$item.plink.title}}" class="u-url"><i class="generic-icons-nav fa fa-fw fa-external-link"></i>{{$item.plink.title}}</a>
+ {{/if}}
+ {{if $item.edpost}}
+ <a class="dropdown-item" href="{{$item.edpost.0}}" title="{{$item.edpost.1}}"><i class="generic-icons-nav fa fa-fw fa-pencil"></i>{{$item.edpost.1}}</a>
+ {{/if}}
+ {{if $item.tagger}}
+ <a class="dropdown-item" href="#" onclick="itemTag({{$item.id}}); return false;"><i id="tagger-{{$item.id}}" class="generic-icons-nav fa fa-fw fa-tag" title="{{$item.tagger.tagit}}"></i>{{$item.tagger.tagit}}</a>
+ {{/if}}
+ {{if $item.filer}}
+ <a class="dropdown-item" href="#" onclick="itemFiler({{$item.id}}); return false;"><i id="filer-{{$item.id}}" class="generic-icons-nav fa fa-fw fa-folder-open" title="{{$item.filer}}"></i>{{$item.filer}}</a>
+ {{/if}}
+ {{if $item.bookmark}}
+ <a class="dropdown-item" href="#" onclick="itemBookmark({{$item.id}}); return false;"><i id="bookmarker-{{$item.id}}" class="generic-icons-nav fa fa-fw fa-bookmark" title="{{$item.bookmark}}"></i>{{$item.bookmark}}</a>
+ {{/if}}
+ {{if $item.addtocal}}
+ <a class="dropdown-item" href="#" onclick="itemAddToCal({{$item.id}}); return false;"><i id="addtocal-{{$item.id}}" class="generic-icons-nav fa fa-fw fa-calendar" title="{{$item.addtocal}}"></i>{{$item.addtocal}}</a>
+ {{/if}}
+ {{if $item.star}}
+ <a class="dropdown-item" href="#" onclick="dostar({{$item.id}}); return false;"><i id="starred-{{$item.id}}" class="generic-icons-nav fa fa-fw fa-star {{$item.star.isstarred}}" title="{{$item.star.toggle}}"></i>{{$item.star.toggle}}</a>
+ {{/if}}
+ {{if $item.thread_action_menu}}
+ {{foreach $item.thread_action_menu as $mitem}}
+ <a class="dropdown-item" {{if $mitem.href}}href="{{$mitem.href}}"{{/if}} {{if $mitem.action}}onclick="{{$mitem.action}}"{{/if}} {{if $mitem.title}}title="{{$mitem.title}}"{{/if}} ><i class="generic-icons-nav fa fa-fw fa-{{$mitem.icon}}"></i>{{$mitem.title}}</a>
+ {{/foreach}}
+ {{/if}}
+ {{if $item.drop.dropping}}
+ <a class="dropdown-item" href="#" onclick="dropItem('item/drop/{{$item.id}}', '#thread-wrapper-{{$item.id}}'); return false;" title="{{$item.drop.delete}}" ><i class="generic-icons-nav fa fa-fw fa-trash-o"></i>{{$item.drop.delete}}</a>
+ {{/if}}
+ {{if $item.thread_author_menu}}
+ <div class="dropdown-divider"></div>
+ {{foreach $item.thread_author_menu as $mitem}}
+ <a class="dropdown-item" {{if $mitem.href}}href="{{$mitem.href}}"{{/if}} {{if $mitem.action}}onclick="{{$mitem.action}}"{{/if}} {{if $mitem.title}}title="{{$mitem.title}}"{{/if}} >{{$mitem.title}}</a>
+ {{/foreach}}
+ {{/if}}
+ {{if $item.edpost && $item.dreport}}
+ <a class="dropdown-item" href="dreport/{{$item.mid}}">{{$item.dreport}}</a>
+ {{/if}}
+ </div>
</div>
</div>
</div>
diff --git a/view/tpl/conv_list.tpl b/view/tpl/conv_list.tpl
index 59153e41f..e442dd3cc 100755
--- a/view/tpl/conv_list.tpl
+++ b/view/tpl/conv_list.tpl
@@ -84,9 +84,9 @@
</div>
{{/if}}
<div class="p-2 clearfix wall-item-tools">
- <div class="wall-item-tools-right pull-right">
+ <div class="float-right wall-item-tools-right">
{{if $item.toplevel && $item.emojis && $item.reactions}}
- <div class="btn-group dropdown">
+ <div class="btn-group">
<button type="button" class="btn btn-outline-secondary btn-sm dropdown-toggle" data-toggle="dropdown" id="wall-item-react-{{$item.id}}">
<i class="fa fa-smile-o"></i>
</button>
@@ -97,7 +97,7 @@
</div>
</div>
{{/if}}
- <div class="btn-group dropdown">
+ <div class="btn-group">
{{if $item.like}}
<button type="button" title="{{$item.like.0}}" class="btn btn-outline-secondary btn-sm" onclick="dolike({{$item.id}},'like'); return false;">
<i class="fa fa-thumbs-o-up{{if $item.my_responses.like}} ivoted{{/if}}" ></i>
@@ -109,7 +109,7 @@
</button>
{{/if}}
{{if $item.isevent}}
- <div class="btn-group dropdown">
+ <div class="btn-group">
<button type="button" class="btn btn-outline-secondary btn-sm dropdown-toggle" data-toggle="dropdown" id="wall-item-attend-menu-{{$item.id}}" title="{{$item.attend_title}}">
<i class="fa fa-calendar-check-o"></i>
</button>
@@ -127,7 +127,7 @@
</div>
{{/if}}
{{if $item.canvote}}
- <div class="btn-group dropdown">
+ <div class="btn-group">
<button type="button" class="btn btn-outline-secondary btn-sm dropdown-toggle" data-toggle="dropdown" id="wall-item-consensus-menu-{{$item.id}}" title="{{$item.vote_title}}">
<i class="fa fa-check-square-o"></i>
</button>
@@ -144,51 +144,53 @@
</div>
</div>
{{/if}}
- <button type="button" class="btn btn-outline-secondary btn-sm dropdown-toggle" data-toggle="dropdown" id="wall-item-menu-{{$item.id}}">
- <i class="fa fa-cog"></i>
- </button>
- <div class="dropdown-menu dropdown-menu-right" role="menu" aria-labelledby="wall-item-menu-{{$item.id}}">
- {{if $item.share}}
- <a class="dropdown-item" href="#" onclick="jotShare({{$item.id}}); return false"><i class="generic-icons-nav fa fa-fw fa-retweet" title="{{$item.share.0}}"></i>{{$item.share.0}}</a>
- {{/if}}
- {{if $item.plink}}
- <a class="dropdown-item" href="{{$item.plink.href}}" title="{{$item.plink.title}}" class="u-url"><i class="generic-icons-nav fa fa-fw fa-external-link"></i>{{$item.plink.title}}</a>
- {{/if}}
- {{if $item.edpost}}
- <a class="dropdown-item" href="{{$item.edpost.0}}" title="{{$item.edpost.1}}"><i class="generic-icons-nav fa fa-fw fa-pencil"></i>{{$item.edpost.1}}</a>
- {{/if}}
- {{if $item.tagger}}
- <a class="dropdown-item" href="#" onclick="itemTag({{$item.id}}); return false;"><i id="tagger-{{$item.id}}" class="generic-icons-nav fa fa-fw fa-tag" title="{{$item.tagger.tagit}}"></i>{{$item.tagger.tagit}}</a>
- {{/if}}
- {{if $item.filer}}
- <a class="dropdown-item" href="#" onclick="itemFiler({{$item.id}}); return false;"><i id="filer-{{$item.id}}" class="generic-icons-nav fa fa-fw fa-folder-open" title="{{$item.filer}}"></i>{{$item.filer}}</a>
- {{/if}}
- {{if $item.bookmark}}
- <a class="dropdown-item" href="#" onclick="itemBookmark({{$item.id}}); return false;"><i id="bookmarker-{{$item.id}}" class="generic-icons-nav fa fa-fw fa-bookmark" title="{{$item.bookmark}}"></i>{{$item.bookmark}}</a>
- {{/if}}
- {{if $item.addtocal}}
- <a class="dropdown-item" href="#" onclick="itemAddToCal({{$item.id}}); return false;"><i id="addtocal-{{$item.id}}" class="generic-icons-nav fa fa-fw fa-calendar" title="{{$item.addtocal}}"></i>{{$item.addtocal}}</a>
- {{/if}}
- {{if $item.star}}
- <a class="dropdown-item" href="#" onclick="dostar({{$item.id}}); return false;"><i id="starred-{{$item.id}}" class="generic-icons-nav fa fa-fw fa-star {{$item.star.isstarred}}" title="{{$item.star.toggle}}"></i>{{$item.star.toggle}}</a>
- {{/if}}
- {{if $item.thread_action_menu}}
- {{foreach $item.thread_action_menu as $mitem}}
- <a class="dropdown-item" {{if $mitem.href}}href="{{$mitem.href}}"{{/if}} {{if $mitem.action}}onclick="{{$mitem.action}}"{{/if}} {{if $mitem.title}}title="{{$mitem.title}}"{{/if}} ><i class="generic-icons-nav fa fa-fw fa-{{$mitem.icon}}"></i>{{$mitem.title}}</a>
- {{/foreach}}
- {{/if}}
- {{if $item.drop.dropping}}
- <a class="dropdown-item" href="#" onclick="dropItem('item/drop/{{$item.id}}', '#thread-wrapper-{{$item.id}}'); return false;" title="{{$item.drop.delete}}" ><i class="generic-icons-nav fa fa-fw fa-trash-o"></i>{{$item.drop.delete}}</a>
- {{/if}}
- {{if $item.thread_author_menu}}
- <div class="dropdown-divider"></div>
- {{foreach $item.thread_author_menu as $mitem}}
- <a class="dropdown-item" {{if $mitem.href}}href="{{$mitem.href}}"{{/if}} {{if $mitem.action}}onclick="{{$mitem.action}}"{{/if}} {{if $mitem.title}}title="{{$mitem.title}}"{{/if}} >{{$mitem.title}}</a>
- {{/foreach}}
- {{/if}}
- {{if $item.edpost && $item.dreport}}
- <a class="dropdown-item" href="dreport/{{$item.mid}}">{{$item.dreport}}</a>
- {{/if}}
+ <div class="btn-group">
+ <button type="button" class="btn btn-outline-secondary btn-sm dropdown-toggle" data-toggle="dropdown" id="wall-item-menu-{{$item.id}}">
+ <i class="fa fa-cog"></i>
+ </button>
+ <div class="dropdown-menu dropdown-menu-right" role="menu" aria-labelledby="wall-item-menu-{{$item.id}}">
+ {{if $item.share}}
+ <a class="dropdown-item" href="#" onclick="jotShare({{$item.id}}); return false"><i class="generic-icons-nav fa fa-fw fa-retweet" title="{{$item.share.0}}"></i>{{$item.share.0}}</a>
+ {{/if}}
+ {{if $item.plink}}
+ <a class="dropdown-item" href="{{$item.plink.href}}" title="{{$item.plink.title}}" class="u-url"><i class="generic-icons-nav fa fa-fw fa-external-link"></i>{{$item.plink.title}}</a>
+ {{/if}}
+ {{if $item.edpost}}
+ <a class="dropdown-item" href="{{$item.edpost.0}}" title="{{$item.edpost.1}}"><i class="generic-icons-nav fa fa-fw fa-pencil"></i>{{$item.edpost.1}}</a>
+ {{/if}}
+ {{if $item.tagger}}
+ <a class="dropdown-item" href="#" onclick="itemTag({{$item.id}}); return false;"><i id="tagger-{{$item.id}}" class="generic-icons-nav fa fa-fw fa-tag" title="{{$item.tagger.tagit}}"></i>{{$item.tagger.tagit}}</a>
+ {{/if}}
+ {{if $item.filer}}
+ <a class="dropdown-item" href="#" onclick="itemFiler({{$item.id}}); return false;"><i id="filer-{{$item.id}}" class="generic-icons-nav fa fa-fw fa-folder-open" title="{{$item.filer}}"></i>{{$item.filer}}</a>
+ {{/if}}
+ {{if $item.bookmark}}
+ <a class="dropdown-item" href="#" onclick="itemBookmark({{$item.id}}); return false;"><i id="bookmarker-{{$item.id}}" class="generic-icons-nav fa fa-fw fa-bookmark" title="{{$item.bookmark}}"></i>{{$item.bookmark}}</a>
+ {{/if}}
+ {{if $item.addtocal}}
+ <a class="dropdown-item" href="#" onclick="itemAddToCal({{$item.id}}); return false;"><i id="addtocal-{{$item.id}}" class="generic-icons-nav fa fa-fw fa-calendar" title="{{$item.addtocal}}"></i>{{$item.addtocal}}</a>
+ {{/if}}
+ {{if $item.star}}
+ <a class="dropdown-item" href="#" onclick="dostar({{$item.id}}); return false;"><i id="starred-{{$item.id}}" class="generic-icons-nav fa fa-fw fa-star {{$item.star.isstarred}}" title="{{$item.star.toggle}}"></i>{{$item.star.toggle}}</a>
+ {{/if}}
+ {{if $item.thread_action_menu}}
+ {{foreach $item.thread_action_menu as $mitem}}
+ <a class="dropdown-item" {{if $mitem.href}}href="{{$mitem.href}}"{{/if}} {{if $mitem.action}}onclick="{{$mitem.action}}"{{/if}} {{if $mitem.title}}title="{{$mitem.title}}"{{/if}} ><i class="generic-icons-nav fa fa-fw fa-{{$mitem.icon}}"></i>{{$mitem.title}}</a>
+ {{/foreach}}
+ {{/if}}
+ {{if $item.drop.dropping}}
+ <a class="dropdown-item" href="#" onclick="dropItem('item/drop/{{$item.id}}', '#thread-wrapper-{{$item.id}}'); return false;" title="{{$item.drop.delete}}" ><i class="generic-icons-nav fa fa-fw fa-trash-o"></i>{{$item.drop.delete}}</a>
+ {{/if}}
+ {{if $item.thread_author_menu}}
+ <div class="dropdown-divider"></div>
+ {{foreach $item.thread_author_menu as $mitem}}
+ <a class="dropdown-item" {{if $mitem.href}}href="{{$mitem.href}}"{{/if}} {{if $mitem.action}}onclick="{{$mitem.action}}"{{/if}} {{if $mitem.title}}title="{{$mitem.title}}"{{/if}} >{{$mitem.title}}</a>
+ {{/foreach}}
+ {{/if}}
+ {{if $item.edpost && $item.dreport}}
+ <a class="dropdown-item" href="dreport/{{$item.mid}}">{{$item.dreport}}</a>
+ {{/if}}
+ </div>
</div>
</div>
</div>
diff --git a/view/tpl/diaspora_vcard.tpl b/view/tpl/diaspora_vcard.tpl
deleted file mode 100644
index 017eb555c..000000000
--- a/view/tpl/diaspora_vcard.tpl
+++ /dev/null
@@ -1,69 +0,0 @@
-<div style="display:none;">
- <dl class="entity_uid">
- <dt>Uid</dt>
- <dd>
- <span class="uid p-uid">{{$diaspora.guid}}</span>
- </dd>
- </dl>
- <dl class='entity_nickname'>
- <dt>Nickname</dt>
- <dd>
- <span class="nickname p-nickname">{{$diaspora.nickname}}</span>
- </dd>
- </dl>
- <dl class='entity_full_name'>
- <dt>Full name</dt>
- <dd>
- <span class='fn p-name'>{{$diaspora.fullname}}</span>
- </dd>
- </dl>
-
- <dl class='entity_first_name'>
- <dt>First name</dt>
- <dd>
- <span class='given_name p-given-name'>{{$diaspora.firstname}}</span>
- </dd>
- </dl>
- <dl class='entity_family_name'>
- <dt>Family name</dt>
- <dd>
- <span class='family_name p-family-name'>{{$diaspora.lastname}}</span>
- </dd>
- </dl>
- <dl class="entity_url">
- <dt>URL</dt>
- <dd>
- <a href="{{$diaspora.podloc}}/" id="pod_location" class="url" rel="me" >{{$diaspora.podloc}}/</a>
- </dd>
- </dl>
- <dl class="entity_photo">
- <dt>Photo</dt>
- <dd>
- <img class="photo u-photo avatar" height="300" width="300" src="{{$diaspora.photo300}}" />
- </dd>
- </dl>
- <dl class="entity_photo_medium">
- <dt>Photo</dt>
- <dd>
- <img class="photo u-photo avatar" height="100" width="100" src="{{$diaspora.photo100}}" />
- </dd>
- </dl>
- <dl class="entity_photo_small">
- <dt>Photo</dt>
- <dd>
- <img class="photo u-photo avatar" height="50" width="50" src="{{$diaspora.photo50}}" />
- </dd>
- </dl>
- <dl class="entity_searchable">
- <dt>Searchable</dt>
- <dd>
- <span class="searchable">{{$diaspora.searchable}}</span>
- </dd>
- </dl>
- <dl class="entity_key">
- <dt>Key</dt>
- <dd>
- <pre class="key">{{$diaspora.pubkey}}</pre>
- </dd>
- </dl>
-</div>
diff --git a/view/tpl/install.tpl b/view/tpl/install.tpl
index 0e77aa97b..5ab722b12 100755
--- a/view/tpl/install.tpl
+++ b/view/tpl/install.tpl
@@ -1,9 +1,15 @@
-<h1>{{$title}}</h1>
-<h2>{{$pass}}</h2>
+<div class="container mt-4 mb-4">
+ <div class="jumbotron">
+ <h1>{{$title}}</h1>
+ <hr class="my-4">
+ <h2><i class="fa fa-{{$icon}}"></i>&nbsp; {{$pass}}</h2>
+ </div>
+ {{if $status}}
+ <div class="alert alert-danger">{{$status}}</div>
+ {{/if}}
-{{if $status}}
-<h3 class="error-message">{{$status}}</h3>
-{{/if}}
-
-{{$text}}
+ <div class="alert alert-info">{{$text}}</div>
+ <br>
+ {{$what_next}}
+</div>
diff --git a/view/tpl/install_checks.tpl b/view/tpl/install_checks.tpl
index ad0aef6a3..8bbb9f26d 100755
--- a/view/tpl/install_checks.tpl
+++ b/view/tpl/install_checks.tpl
@@ -1,24 +1,29 @@
-<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><i class="fa {{if $check.status}}fa-check-square-o{{else}}{{if $check.required}}fa-square-o{{else}}fa-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>
+<div class="container mt-4 mb-4">
+ <div class="jumbotron">
+ <h1>{{$title}}</h1>
+ <hr class="my-4">
+ <h2><i class="fa fa-heartbeat"></i>&nbsp; {{$pass}}</h2>
+ </div>
+ <form action="{{$baseurl}}/index.php?q=setup" method="post">
+ <table class="table">
+ {{foreach $checks as $check}}
+ <tr><td{{if ! $check.status}} class="text-danger"{{/if}}>{{$check.title}}</td><td><i class="fa {{if $check.status}}fa-check-square-o{{else}}{{if $check.required}}fa-square-o{{else}}fa-exclamation text-danger{{/if}}{{/if}}"></i></td><td>{{if $check.required}}(required){{/if}}</td></tr>
+ {{if $check.help}}
+ <tr><td colspan="3" class="border-top-0 pt-0 pb-0"><div class="alert alert-info">{{$check.help}}</div></td></tr>
+ {{/if}}
+ {{/foreach}}
+ </table>
-{{if $phpath}}
- <input type="hidden" name="phpath" value="{{$phpath}}">
-{{/if}}
+ {{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>
+ {{if $passed}}
+ <input type="hidden" name="pass" value="2">
+ <button class="btn btn-success" type="submit"><i class="fa fa-check"></i> {{$next}}</button>
+ {{else}}
+ <input type="hidden" name="pass" value="1">
+ <button class="btn btn-warning" type="submit"><i class="fa fa-refresh"></i> {{$reload}}</button>
+ {{/if}}
+ </form>
+</div>
diff --git a/view/tpl/install_db.tpl b/view/tpl/install_db.tpl
index 1a58de129..8b9023443 100755
--- a/view/tpl/install_db.tpl
+++ b/view/tpl/install_db.tpl
@@ -1,30 +1,31 @@
-<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=$dbport}}
-{{include file="field_input.tpl" field=$dbuser}}
-{{include file="field_password.tpl" field=$dbpass}}
-{{include file="field_input.tpl" field=$dbdata}}
-{{include file="field_select.tpl" field=$dbtype}}
-
-<input id="install-submit" type="submit" name="submit" value="{{$submit}}" />
-
-</form>
+<div class="container mt-4 mb-4">
+ <div class="jumbotron">
+ <h1>{{$title}}</h1>
+ <hr class="my-4">
+ <h2><i class="fa fa-database"></i>&nbsp; {{$pass}}</h2>
+ </div>
+ <div class="alert alert-info">
+ {{$info_01}}<br>
+ {{$info_02}}<br>
+ {{$info_03}}
+ </div>
+
+ {{if $status}}
+ <div class="alert alert-danger">{{$status}}</div>
+ {{/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=$dbport}}
+ {{include file="field_input.tpl" field=$dbuser}}
+ {{include file="field_password.tpl" field=$dbpass}}
+ {{include file="field_input.tpl" field=$dbdata}}
+ {{include file="field_select.tpl" field=$dbtype}}
+
+ <button class="btn btn-primary" id="install-submit" type="submit" name="submit" value="{{$submit}}">{{$submit}}</button>
+ </form>
+</div>
diff --git a/view/tpl/install_settings.tpl b/view/tpl/install_settings.tpl
index f7a0108a8..b62f8508b 100755
--- a/view/tpl/install_settings.tpl
+++ b/view/tpl/install_settings.tpl
@@ -1,29 +1,28 @@
-<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="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="dbtype" value="{{$dbtype}}" />
-<input type="hidden" name="pass" value="4" />
-
-{{include file="field_input.tpl" field=$adminmail}}
-{{include file="field_input.tpl" field=$siteurl}}
-{{include file="field_select.tpl" field=$server_role}}
-
-{{include file="field_select_grouped.tpl" field=$timezone}}
-
-<input id="install-submit" type="submit" name="submit" value="{{$submit}}" />
-
-</form>
-
+<div class="container mt-4 mb-4">
+ <div class="jumbotron">
+ <h1>{{$title}}</h1>
+ <hr class="my-4">
+ <h2><i class="fa fa-cogs"></i>&nbsp; {{$pass}}</h2>
+ </div>
+
+ {{if $status}}
+ <div class="alert alert-danger">{{$status}}</div>
+ {{/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="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="dbtype" value="{{$dbtype}}" />
+ <input type="hidden" name="pass" value="4" />
+
+ {{include file="field_input.tpl" field=$adminmail}}
+ {{include file="field_input.tpl" field=$siteurl}}
+ {{include file="field_select_grouped.tpl" field=$timezone}}
+
+ <button class="btn btn-primary" id="install-submit" type="submit" name="submit" value="{{$submit}}">{{$submit}}</button>
+ </form>
+</div>
diff --git a/view/tpl/item_binary.tpl b/view/tpl/item_binary.tpl
new file mode 100644
index 000000000..b19f7e7dd
--- /dev/null
+++ b/view/tpl/item_binary.tpl
@@ -0,0 +1,3 @@
+<p>
+<center><a class="zrl" href="{{$url}}"><button class="btn btn-warning fakelink">{{$download}}</button></a></center>
+</p>
diff --git a/view/tpl/item_categories.tpl b/view/tpl/item_categories.tpl
index e1b183c0d..fa07fa39f 100644
--- a/view/tpl/item_categories.tpl
+++ b/view/tpl/item_categories.tpl
@@ -1,7 +1,7 @@
{{if $categories}}
<!--div class="categorytags"-->
{{foreach $categories as $cat}}
-<span class="item-category badge badge-pill badge-warning"><i class="fa fa-asterisk"></i>&nbsp;{{if $cat.url}}<a class="text-white" href="{{$cat.url}}">{{$cat.term}}</a>{{else}}{{$cat.term}}{{/if}}</span>
+<span class="item-category badge badge-pill badge-warning"><i class="fa fa-asterisk"></i>&nbsp;{{if $cat.url}}<a class="text-dark" href="{{$cat.url}}">{{$cat.term}}</a>{{else}}{{$cat.term}}{{/if}}</span>
{{/foreach}}
<!--/div-->
{{/if}}
diff --git a/view/tpl/jot-header.tpl b/view/tpl/jot-header.tpl
index 1cc5a898a..d8f296aa4 100755
--- a/view/tpl/jot-header.tpl
+++ b/view/tpl/jot-header.tpl
@@ -100,77 +100,44 @@ function enableOnUser(){
initEditor();
}
</script>
-<script type="text/javascript" src="{{$baseurl}}/view/js/ajaxupload.js" ></script>
+
+<script src="library/blueimp_upload/js/vendor/jquery.ui.widget.js"></script>
+<script src="library/blueimp_upload/js/jquery.iframe-transport.js"></script>
+<script src="library/blueimp_upload/js/jquery.fileupload.js"></script>
+
<script>
$(document).ready(function() {
/* enable tinymce on focus and click */
$("#profile-jot-text").focus(enableOnUser);
$("#profile-jot-text").click(enableOnUser);
- var upload_title = $('#wall-image-upload').attr('title');
- var attach_title = $('#wall-file-upload').attr('title');
- try {
- var uploader = new window.AjaxUpload('wall-image-upload',
- { action: '{{$baseurl}}/wall_upload/{{$nickname}}',
- name: 'userfile',
- title: upload_title,
- onSubmit: function(file,ext) { $('#profile-rotator').spin('tiny'); },
- onComplete: function(file,response) {
- addeditortext(response);
- $('#jot-media').val($('#jot-media').val() + response);
- $('#profile-rotator').spin(false);
- }
- });
- } catch (e) {
- }
- try {
- var uploader_sub = new window.AjaxUpload('wall-image-upload-sub',
- { action: '{{$baseurl}}/wall_upload/{{$nickname}}',
- name: 'userfile',
- title: upload_title,
- onSubmit: function(file,ext) { $('#profile-rotator').spin('tiny'); },
- onComplete: function(file,response) {
- addeditortext(response);
- $('#jot-media').val($('#jot-media').val() + response);
- $('#profile-rotator').spin(false);
- }
- });
- } catch(e) {
- }
- try {
- var file_uploader = new window.AjaxUpload('wall-file-upload',
- { action: '{{$baseurl}}/wall_attach/{{$nickname}}',
- name: 'userfile',
- title: attach_title,
- onSubmit: function(file,ext) { $('#profile-rotator').spin('tiny'); },
- onComplete: function(file,response) {
- addeditortext(response);
- $('#jot-media').val($('#jot-media').val() + response);
- $('#profile-rotator').spin(false);
- }
- });
- } catch(e) {
- }
- try {
- var file_uploader_sub = new window.AjaxUpload('wall-file-upload-sub',
- { action: '{{$baseurl}}/wall_attach/{{$nickname}}',
- name: 'userfile',
- title: attach_title,
- onSubmit: function(file,ext) { $('#profile-rotator').spin('tiny'); },
- onComplete: function(file,response) {
- addeditortext(response);
- $('#jot-media').val($('#jot-media').val() + response);
- $('#profile-rotator').spin(false);
- }
- });
- } catch(e) {
- }
-
-
+
+ $('#invisible-wall-file-upload').fileupload({
+ url: 'wall_attach/{{$nickname}}',
+ dataType: 'json',
+ dropZone: $('#profile-jot-text'),
+ maxChunkSize: 4 * 1024 * 1024,
+ add: function(e,data) {
+ $('#profile-rotator').spin('tiny');
+ data.submit();
+ },
+ done: function(e,data) {
+ addeditortext(data.result.message);
+ $('#jot-media').val($('#jot-media').val() + data.result.message);
+ },
+ stop: function(e,data) {
+ $('#profile-rotator').spin(false);
+ },
+ });
+
+ $('#wall-file-upload').click(function(event) { event.preventDefault(); $('#invisible-wall-file-upload').trigger('click'); return false;});
+ $('#wall-file-upload-sub').click(function(event) { event.preventDefault(); $('#invisible-wall-file-upload').trigger('click'); return false;});
+
// call initialization file
if (window.File && window.FileList && window.FileReader) {
DragDropUploadInit();
}
+
});
function deleteCheckedItems() {
@@ -291,15 +258,17 @@ function enableOnUser(){
function linkdrop(event) {
var reply = event.dataTransfer.getData("text/uri-list");
- event.preventDefault();
- var editwin = '#' + event.target.id;
- var commentwin = false;
- if(editwin) {
- commentwin = ((editwin.indexOf('comment') >= 0) ? true : false);
- if(commentwin) {
- var commentid = editwin.substring(editwin.lastIndexOf('-') + 1);
- commentOpen(document.getElementById(event.target.id),commentid);
+ if(reply) {
+ event.preventDefault();
+ var editwin = '#' + event.target.id;
+ var commentwin = false;
+ if(editwin) {
+ commentwin = ((editwin.indexOf('comment') >= 0) ? true : false);
+ if(commentwin) {
+ var commentid = editwin.substring(editwin.lastIndexOf('-') + 1);
+ commentOpen(document.getElementById(event.target.id),commentid);
+ }
}
}
@@ -353,8 +322,6 @@ function enableOnUser(){
commentBusy = true;
$('body').css('cursor', 'wait');
$.get('{{$baseurl}}/filer/' + id + '?term=' + reply, NavUpdate);
-// if(timer) clearTimeout(timer);
-// timer = setTimeout(NavUpdate,3000);
liking = 1;
$('#item-filer-dialog').modal('hide');
}
@@ -499,32 +466,20 @@ function enableOnUser(){
};
//
- // initialize
+ // initialize drag-drop
function DragDropUploadInit() {
var filedrag = $("#profile-jot-text");
- // is XHR2 available?
- var xhr = new XMLHttpRequest();
- if (xhr.upload) {
-
- // file drop
+ // file drop
filedrag.on("dragover", DragDropUploadFileHover);
filedrag.on("dragleave", DragDropUploadFileHover);
filedrag.on("drop", DragDropUploadFileSelectHandler);
- }
-
- window.filesToUpload = 0;
- window.fileUploadsCompleted = 0;
-
-
}
// file drag hover
function DragDropUploadFileHover(e) {
- e.stopPropagation();
- e.preventDefault();
e.target.className = (e.type == "dragover" ? "hover" : "");
}
@@ -533,49 +488,12 @@ function enableOnUser(){
// cancel event and hover styling
DragDropUploadFileHover(e);
- if (!editor) $("#profile-jot-text").val("");
-
-
- // fetch FileList object
- var files = e.target.files || e.originalEvent.dataTransfer.files;
- // process all File objects
- for (var i = 0, f; f = files[i]; i++) {
- DragDropUploadFile(f, i);
- }
-
- }
-
- // upload files
- function DragDropUploadFile(file, idx) {
-
- window.filesToUpload = window.filesToUpload + 1;
-
- var xhr = new XMLHttpRequest();
- xhr.withCredentials = true; // Include the SESSION cookie info for authentication
- (xhr.upload || xhr).addEventListener('progress', function (e) {
- $('#profile-rotator').spin('tiny');
- });
- xhr.addEventListener('load', function (e) {
- //console.log('xhr upload complete', e);
- window.fileUploadsCompleted = window.fileUploadsCompleted + 1;
-
- initEditor(function() {
- addeditortext(xhr.responseText);
- });
-
- $('#jot-media').val($('#jot-media').val() + xhr.responseText);
- // When all the uploads have completed, refresh the page
- if (window.filesToUpload > 0 && window.fileUploadsCompleted === window.filesToUpload) {
- $('#profile-rotator').spin(false);
- window.fileUploadsCompleted = window.filesToUpload = 0;
- }
- });
- // POST to the wall_upload endpoint
- xhr.open('post', '{{$baseurl}}/wall_attach/{{$nickname}}', true);
+ // open editor if it isn't yet initialised
+ if (!editor) {
+ initEditor();
+ }
+ linkdrop(e);
- var data = new FormData();
- data.append('userfile', file);
- xhr.send(data);
}
</script>
diff --git a/view/tpl/jot.tpl b/view/tpl/jot.tpl
index dbbb470c5..cf99ede42 100755
--- a/view/tpl/jot.tpl
+++ b/view/tpl/jot.tpl
@@ -1,3 +1,4 @@
+<input id="invisible-wall-file-upload" type="file" name="files" style="visibility:hidden;position:absolute;top:-50;left:-50;width:0;height:0;" multiple>
<form id="profile-jot-form" action="{{$action}}" method="post" class="acl-form" data-form_id="profile-jot-form" data-allow_cid='{{$allow_cid}}' data-allow_gid='{{$allow_gid}}' data-deny_cid='{{$deny_cid}}' data-deny_gid='{{$deny_gid}}'>
{{$mimeselect}}
{{$layoutselect}}
@@ -39,7 +40,7 @@
</div>
{{/if}}
<div id="jot-text-wrap">
- <textarea class="profile-jot-text" id="profile-jot-text" name="body" tabindex="2" placeholder="{{$share}}" ondragenter="linkdropper(event);" ondragover="linkdropper(event);" ondrop="linkdrop(event);" >{{$content}}</textarea>
+ <textarea class="profile-jot-text" id="profile-jot-text" name="body" tabindex="2" placeholder="{{$share}}" >{{$content}}</textarea>
</div>
{{if $attachment}}
<div id="jot-attachment-wrap">
diff --git a/view/tpl/mail_list.tpl b/view/tpl/mail_list.tpl
index 827c7628f..65d8dcdb4 100755
--- a/view/tpl/mail_list.tpl
+++ b/view/tpl/mail_list.tpl
@@ -1,6 +1,6 @@
<li class="nav-item">
<a href="mail/{{$message.mailbox}}/{{$message.id}}" class="nav-link{{if $message.selected}} active{{/if}}">
- <span class="{{if $message.seen}}seen{{else}}unseen{{/if}}">{{$message.subject}}</span><br>
+ <span class="{{if ! $message.seen || $message.selected}}font-weight-bold{{/if}}">{{$message.subject}}</span><br>
<span class="conv-participants">{{$message.from_name}} > {{$message.to_name}}</span><br>
<span class="wall-item-ago autotime" title="{{$message.date}}">{{$message.date}}</span>
</a>
diff --git a/view/tpl/msg-header.tpl b/view/tpl/msg-header.tpl
index 013e1cfdc..0e8fb0389 100755
--- a/view/tpl/msg-header.tpl
+++ b/view/tpl/msg-header.tpl
@@ -1,34 +1,31 @@
-<script type="text/javascript" src="view/js/ajaxupload.js" ></script>
-<script language="javascript" type="text/javascript">
-
- $("#prvmail-text").editor_autocomplete(baseurl+"/acl");
-
-
+<script src="library/blueimp_upload/js/vendor/jquery.ui.widget.js"></script>
+<script src="library/blueimp_upload/js/jquery.iframe-transport.js"></script>
+<script src="library/blueimp_upload/js/jquery.fileupload.js"></script>
+<script>
$(document).ready(function() {
- var file_uploader = new window.AjaxUpload(
- 'prvmail-attach-wrapper',
- { action: 'wall_attach/{{$nickname}}',
- name: 'userfile',
- onSubmit: function(file,ext) { $('#prvmail-rotator').spin('tiny'); },
- onComplete: function(file,response) {
- addmailtext(response);
- $('#prvmail-rotator').spin(false);
- }
- }
- );
+ $("#prvmail-text").editor_autocomplete(baseurl+"/acl");
+
+ $('#invisible-wall-file-upload').fileupload({
+ url: 'wall_attach/{{$nickname}}',
+ dataType: 'json',
+ dropZone: $('#prvmail-text'),
+ maxChunkSize: 4 * 1024 * 1024,
+ add: function(e,data) {
+ $('#prvmail-rotator').spin('tiny');
+ data.submit();
+ },
+ done: function(e,data) {
+ addmailtext(data.result.message);
+ $('#jot-media').val($('#jot-media').val() + data.result.message);
+ },
+ stop: function(e,data) {
+ $('#prvmail-rotator').spin(false);
+ },
+ });
- var file_uploader_sub = new window.AjaxUpload(
- 'prvmail-attach-sub',
- { action: 'wall_attach/{{$nickname}}',
- name: 'userfile',
- onSubmit: function(file,ext) { $('#prvmail-rotator').spin('tiny'); },
- onComplete: function(file,response) {
- addmailtext(response);
- $('#prvmail-rotator').spin(false);
- }
- }
- );
+ $('#prvmail-attach-wrapper').click(function(event) { event.preventDefault(); $('#invisible-wall-file-upload').trigger('click'); return false;});
+ $('#prvmail-attach-wrapper-sub').click(function(event) { event.preventDefault(); $('#invisible-wall-file-upload').trigger('click'); return false;});
});
diff --git a/view/tpl/nav.tpl b/view/tpl/nav.tpl
index 5c301b4d2..f480ce994 100755
--- a/view/tpl/nav.tpl
+++ b/view/tpl/nav.tpl
@@ -1,10 +1,10 @@
{{if $nav.login && !$userinfo}}
-<div class="d-md-none p-1">
+<div class="d-md-none pt-1 pb-1">
<a class="btn btn-primary btn-sm text-white" href="#" title="{{$nav.loginmenu.1.3}}" id="{{$nav.loginmenu.1.4}}_collapse" data-toggle="modal" data-target="#nav-login">
{{$nav.loginmenu.1.1}}
</a>
{{if $nav.register}}
- <a class="btn btn-warning btn-sm text-white" href="{{$nav.register.0}}" title="{{$nav.register.3}}" id="{{$nav.register.4}}" >
+ <a class="btn btn-warning btn-sm text-dark" href="{{$nav.register.0}}" title="{{$nav.register.3}}" id="{{$nav.register.4}}" >
{{$nav.register.1}}
</a>
{{/if}}
@@ -16,17 +16,17 @@
<img id="avatar" src="{{$userinfo.icon}}" alt="{{$userinfo.name}}">
<i class="fa fa-caret-down"></i>
</div>
- {{if $localuser}}
+ {{if $is_owner}}
<div class="dropdown-menu">
{{foreach $nav.usermenu as $usermenu}}
- <a class="dropdown-item" href="{{$usermenu.0}}" title="{{$usermenu.3}}" role="menuitem" id="{{$usermenu.4}}">{{$usermenu.1}}</a>
+ <a class="dropdown-item{{if $usermenu.2}} active{{/if}}" href="{{$usermenu.0}}" title="{{$usermenu.3}}" role="menuitem" id="{{$usermenu.4}}">{{$usermenu.1}}</a>
{{/foreach}}
{{if $nav.manage}}
- <a class="dropdown-item" href="{{$nav.manage.0}}" title="{{$nav.manage.3}}" role="menuitem" id="{{$nav.manage.4}}">{{$nav.manage.1}}</a>
+ <a class="dropdown-item{{if $sel.active == Manage}} active{{/if}}" href="{{$nav.manage.0}}" title="{{$nav.manage.3}}" role="menuitem" id="{{$nav.manage.4}}">{{$nav.manage.1}}</a>
{{/if}}
{{if $nav.channels}}
{{foreach $nav.channels as $chan}}
- <a class="dropdown-item" href="manage/{{$chan.channel_id}}" title="{{$chan.channel_name}}" role="menuitem">{{$chan.channel_name}}</a>
+ <a class="dropdown-item" href="manage/{{$chan.channel_id}}" title="{{$chan.channel_name}}" role="menuitem"><i class="fa fa-circle{{if $localuser == $chan.channel_id}} text-success{{else}} invisible{{/if}}"></i> {{$chan.channel_name}}</a>
{{/foreach}}
{{/if}}
{{if $nav.profiles}}
@@ -34,25 +34,24 @@
{{/if}}
{{if $nav.settings}}
<div class="dropdown-divider"></div>
- <a class="dropdown-item" href="{{$nav.settings.0}}" title="{{$nav.settings.3}}" role="menuitem" id="{{$nav.settings.4}}">{{$nav.settings.1}}</a>
+ <a class="dropdown-item{{if $sel.active == Settings}} active{{/if}}" href="{{$nav.settings.0}}" title="{{$nav.settings.3}}" role="menuitem" id="{{$nav.settings.4}}">{{$nav.settings.1}}</a>
{{/if}}
{{if $nav.admin}}
<div class="dropdown-divider"></div>
- <a class="dropdown-item" href="{{$nav.admin.0}}" title="{{$nav.admin.3}}" role="menuitem" id="{{$nav.admin.4}}">{{$nav.admin.1}}</a>
+ <a class="dropdown-item{{if $sel.active == Admin}} active{{/if}}" href="{{$nav.admin.0}}" title="{{$nav.admin.3}}" role="menuitem" id="{{$nav.admin.4}}">{{$nav.admin.1}}</a>
{{/if}}
{{if $nav.logout}}
<div class="dropdown-divider"></div>
<a class="dropdown-item" href="{{$nav.logout.0}}" title="{{$nav.logout.3}}" role="menuitem" id="{{$nav.logout.4}}">{{$nav.logout.1}}</a>
{{/if}}
</div>
- {{else}}
- {{if $nav.rusermenu}}
+ {{/if}}
+ {{if ! $is_owner}}
<div class="dropdown-menu" role="menu" aria-labelledby="avatar">
<a class="dropdown-item" href="{{$nav.rusermenu.0}}" role="menuitem">{{$nav.rusermenu.1}}</a>
<a class="dropdown-item" href="{{$nav.rusermenu.2}}" role="menuitem">{{$nav.rusermenu.3}}</a>
</div>
{{/if}}
- {{/if}}
</div>
{{/if}}
<div class="navbar-toggler-right">
@@ -69,7 +68,7 @@
<i class="fa fa-exclamation-circle"></i>
</button>
{{/if}}
- <button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbar-collapse-2">
+ <button id="menu-btn" class="navbar-toggler border-0" type="button" data-toggle="collapse" data-target="#navbar-collapse-2">
<i class="fa fa-bars"></i>
</button>
</div>
@@ -79,11 +78,11 @@
<li class="nav-item dropdown net-button" style="display: none;">
<a class="nav-link" href="#" title="{{$nav.network.3}}" id="{{$nav.network.4}}" data-toggle="dropdown" rel="#nav-network-menu">
<i class="fa fa-fw fa-th"></i>
- <span class="badge badge-pill badge-default net-update"></span>
+ <span class="badge badge-pill badge-secondary net-update"></span>
</a>
<div id="nav-network-menu" class="dropdown-menu" rel="network">
<a class="dropdown-item" id="nav-network-see-all" href="{{$nav.network.all.0}}">{{$nav.network.all.1}}</a>
- <a class="dropdown-item" id="nav-network-mark-all"href="#" onclick="markRead('network'); return false;">{{$nav.network.mark.1}}</a>
+ <a class="dropdown-item" id="nav-network-mark-all" href="#" onclick="markRead('network'); return false;">{{$nav.network.mark.1}}</a>
{{$emptynotifications}}
</div>
</li>
@@ -118,7 +117,7 @@
<li class="nav-item dropdown all_events-button" style="display: none;">
<a class="nav-link" href="#" title="{{$nav.all_events.3}}" id="{{$nav.all_events.4}}" data-toggle="dropdown" rel="#nav-all_events-menu">
<i class="fa fa-fw fa-calendar"></i>
- <span class="badge badge-pill badge-default all_events-update"></span>
+ <span class="badge badge-pill badge-secondary all_events-update"></span>
</a>
<div id="nav-all_events-menu" class="dropdown-menu" rel="all_events">
<a class="dropdown-item" id="nav-all_events-see-all" href="{{$nav.all_events.all.0}}">{{$nav.all_events.all.1}}</a>
@@ -204,9 +203,10 @@
{{if $channel_apps.0}}
</div>
{{/if}}
- {{if $localuser}}
+ {{if $is_owner}}
<div class="dropdown-divider"></div>
<a class="dropdown-item" href="/apps"><i class="generic-icons-nav fa fa-fw fa-plus-circle"></i>{{$addapps}}</a>
+ <a class="dropdown-item" href="/apporder"><i class="generic-icons-nav fa fa-fw fa-sort"></i>{{$orderapps}}</a>
{{/if}}
</div>
</li>
@@ -229,9 +229,10 @@
{{if $channel_apps.0}}
</div>
{{/if}}
- {{if $localuser}}
+ {{if $is_owner}}
<div class="dropdown-divider"></div>
<a class="nav-link" href="/apps"><i class="generic-icons-nav fa fa-fw fa-plus-circle"></i>{{$addapps}}</a>
+ <a class="nav-link" href="/apporder"><i class="generic-icons-nav fa fa-fw fa-sort"></i>{{$orderapps}}</a>
{{/if}}
</div>
</div>
diff --git a/view/tpl/photo_album.tpl b/view/tpl/photo_album.tpl
index 8bacb1575..89b169f58 100755
--- a/view/tpl/photo_album.tpl
+++ b/view/tpl/photo_album.tpl
@@ -28,5 +28,8 @@
</div>
</div>
<div class="photos-end"></div>
-<script>$(document).ready(function() { loadingPage = false; justifyPhotos('photo-album-contents-{{$album_id}}'); });</script>
+<script>
+ loadingPage = false;
+ justifyPhotos('photo-album-contents-{{$album_id}}');
+</script>
<div id="page-spinner"></div>
diff --git a/view/tpl/photo_album_portfolio.tpl b/view/tpl/photo_album_portfolio.tpl
new file mode 100755
index 000000000..7aadbc7e0
--- /dev/null
+++ b/view/tpl/photo_album_portfolio.tpl
@@ -0,0 +1,11 @@
+<div class="row column">
+ <div id="photo-album-contents-{{$album_id}}">
+ {{foreach $photos as $photo}}
+ {{include file="photo_portfolio.tpl"}}
+ {{/foreach}}
+ <div id="page-end"></div>
+ </div>
+<div class="photos-end"></div>
+<script>$(document).ready(function() { loadingPage = false; justifyPhotos('photo-album-contents-{{$album_id}}'); });</script>
+<div id="page-spinner"></div>
+</div> \ No newline at end of file
diff --git a/view/tpl/photo_albums.tpl b/view/tpl/photo_albums.tpl
index a238e61bc..83bdd95e7 100755
--- a/view/tpl/photo_albums.tpl
+++ b/view/tpl/photo_albums.tpl
@@ -5,7 +5,7 @@
{{if $albums}}
{{foreach $albums as $al}}
{{if $al.shorttext}}
- <li class="nav-item"><a class="nav-link" href="{{$baseurl}}/photos/{{$nick}}/album/{{$al.bin2hex}}"><span class="badge badge-default float-right">{{$al.total}}</span>{{$al.shorttext}}</a></li>
+ <li class="nav-item"><a class="nav-link" href="{{$baseurl}}/photos/{{$nick}}/album/{{$al.bin2hex}}"><span class="badge badge-secondary float-right">{{$al.total}}</span>{{$al.shorttext}}</a></li>
{{/if}}
{{/foreach}}
{{/if}}
diff --git a/view/tpl/photo_portfolio.tpl b/view/tpl/photo_portfolio.tpl
new file mode 100755
index 000000000..cbc8ea214
--- /dev/null
+++ b/view/tpl/photo_portfolio.tpl
@@ -0,0 +1,13 @@
+
+
+ <a data-open="portfolioModal-{{$photo.resource_id}}" aria-controls="portfolioModal-{{$photo.resource_id}}" aria-haspopup="true" tabindex="0">
+ <img class="thumbnail" src="{{$photo.src}}" alt="{{if $photo.album.name}}{{$photo.album.name}}{{elseif $photo.desc}}{{$photo.desc}}{{elseif $photo.alt}}{{$photo.alt}}{{else}}{{$photo.unknown}}{{/if}}" title="{{$photo.desc}}" id="photo-top-photo-{{$photo.resource_id}}">
+ </a>
+
+ <div class="full reveal without-overlay" id="portfolioModal-{{$photo.resource_id}}" data-reveal="f175mw-reveal" role="dialog" aria-hidden="true" data-yeti-box="portfolioModal-{{$photo.resource_id}}" data-resize="portfolioModal-{{$photo.resource_id}}">
+ <h5>{{$photo.desc}}</h5>
+ <img class="thumbnail" src="{{$photo.fullsrc}}" alt="{{if $photo.album.name}}{{$photo.album.name}}{{elseif $photo.desc}}{{$photo.desc}}{{elseif $photo.alt}}{{$photo.alt}}{{else}}{{$photo.unknown}}{{/if}}" title="{{$photo.desc}}" id="photo-top-photo-{{$photo.resource_id}}x">
+ <button class="close-button" data-close="" aria-label="Close reveal" type="button">
+ <span aria-hidden="true">×</span>
+ </button>
+ </div>
diff --git a/view/tpl/photos_recent.tpl b/view/tpl/photos_recent.tpl
index 8fe631ca6..c6a9067c1 100755
--- a/view/tpl/photos_recent.tpl
+++ b/view/tpl/photos_recent.tpl
@@ -19,5 +19,8 @@
</div>
</div>
<div class="photos-end"></div>
-<script>$(document).ready(function() { loadingPage = false; justifyPhotos('photo-album-contents-{{$album_id}}'); });</script>
+<script>
+ loadingPage = false;
+ justifyPhotos('photo-album-contents-{{$album_id}}');
+</script>
<div id="page-spinner"></div>
diff --git a/view/tpl/profile_vcard.tpl b/view/tpl/profile_vcard.tpl
index 9bd534fd8..f51f0719c 100755
--- a/view/tpl/profile_vcard.tpl
+++ b/view/tpl/profile_vcard.tpl
@@ -43,18 +43,15 @@
</dl>
{{/if}}
- {{if $gender}}<dl class="mf"><dt class="gender-label">{{$gender}}</dt> <dd class="p-gender">{{$profile.gender}}</dd></dl>{{/if}}
+ {{if $gender}}<dl class="mf"><dt class="gender-label">{{$gender}}</dt> <dd class="p-gender">{{if $profile.gender_icon}}<i class="fa fa-{{$profile.gender_icon}}"></i>&nbsp;{{/if}}{{$profile.gender}}</dd></dl>{{/if}}
{{if $marital}}<dl class="marital"><dt class="marital-label"><span class="heart"><i class="fa fa-heart"></i>&nbsp;</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 u-url">{{$profile.homepage}}</dd></dl>{{/if}}
- {{if $diaspora}}
- {{include file="diaspora_vcard.tpl"}}
- {{/if}}
-
+<div class="hcard-addon"></div>
</div>
-<div id="clear"></div>
+<div class="clear"></div>
{{$rating}}
diff --git a/view/tpl/profile_vcard_short.tpl b/view/tpl/profile_vcard_short.tpl
index 0984a4e5f..5d87d52c6 100755
--- a/view/tpl/profile_vcard_short.tpl
+++ b/view/tpl/profile_vcard_short.tpl
@@ -30,10 +30,6 @@
{{if $homepage}}<dl class="homepage"><dt class="homepage-label">{{$homepage}}</dt><dd class="homepage-url">{{$profile.homepage}}</dd></dl>{{/if}}
- {{if $diaspora}}
- {{include file="diaspora_vcard.tpl"}}
- {{/if}}
-
<div id="clear"></div>
{{$chanmenu}}
diff --git a/view/tpl/prv_message.tpl b/view/tpl/prv_message.tpl
index 925447ff2..af6315c7e 100755
--- a/view/tpl/prv_message.tpl
+++ b/view/tpl/prv_message.tpl
@@ -6,6 +6,7 @@
<div class="section-content-wrapper">
{{/if}}
<div id="prvmail-wrapper" >
+ <input id="invisible-wall-file-upload" type="file" name="files" style="visibility:hidden;position:absolute;top:-50;left:-50;width:0;height:0;" multiple>
<form id="prvmail-form" action="mail" method="post" >
<input type="hidden" id="inp-prvmail-expires" name="expires" value="{{$defexpire}}" />
<input type="hidden" name="media_str" id="jot-media" value="" />
diff --git a/view/tpl/search_item.tpl b/view/tpl/search_item.tpl
index 66618a216..aaafe9797 100755
--- a/view/tpl/search_item.tpl
+++ b/view/tpl/search_item.tpl
@@ -102,6 +102,17 @@
<div class="dropdown-menu">{{$item.attachments}}</div>
</div>
{{/if}}
+ {{if $item.mode === 'moderate'}}
+
+ <div class="wall-item-tools-left btn-group">
+ <a href="moderate/{{$item.id}}/approve" class="btn btn-success btn-sm">{{$item.approve}}</a>
+ <a href="moderate/{{$item.id}}/drop" class="btn btn-danger btn-sm">{{$item.delete}}</a>
+
+ </div>
+
+
+
+ {{/if}}
</div>
</div>
{{if $item.conv}}
diff --git a/view/tpl/settings.tpl b/view/tpl/settings.tpl
index dd5fecb43..6673e5815 100755
--- a/view/tpl/settings.tpl
+++ b/view/tpl/settings.tpl
@@ -1,6 +1,6 @@
<div class="generic-content-wrapper">
<div class="section-title-wrapper">
- {{if $server_role != 'basic'}}<a title="{{$removechannel}}" class="btn btn-danger btn-sm pull-right" href="removeme"><i class="fa fa-trash-o"></i>&nbsp;{{$removeme}}</a>{{/if}}
+ <a title="{{$removechannel}}" class="btn btn-danger btn-sm pull-right" href="removeme"><i class="fa fa-trash-o"></i>&nbsp;{{$removeme}}</a>
<h2>{{$ptitle}}</h2>
<div class="clear"></div>
</div>
@@ -44,12 +44,9 @@
</div>
<div id="privacy-settings-collapse" class="collapse" role="tabpanel" aria-labelledby="privacy-settings">
<div class="section-content-tools-wrapper">
- {{if $server_role != 'basic'}}
{{include file="field_select_grouped.tpl" field=$role}}
- {{/if}}
- <div id="advanced-perm" style="display:{{if $permissions_set && $server_role != 'basic' }}none{{else}}block{{/if}};">
+ <div id="advanced-perm" style="display:{{if $permissions_set}}none{{else}}block{{/if}};">
- {{if $server_role != 'basic'}}
<div class="form-group">
<button type="button" class="btn btn-outline-secondary" data-toggle="modal" data-target="#apsModal">{{$lbl_p2macro}}</button>
</div>
@@ -71,7 +68,7 @@
</div><!-- /.modal-content -->
</div><!-- /.modal-dialog -->
</div><!-- /.modal -->
- {{/if}}
+
<div id="settings-default-perms" class="form-group" >
<button type="button" class="btn btn-outline-secondary" data-toggle="modal" data-target="#aclModal"><i id="jot-perms-icon" class="fa"></i>&nbsp;{{$permissions}}</button>
</div>
diff --git a/view/tpl/settings_account.tpl b/view/tpl/settings_account.tpl
index b7fdfb9a9..dd1d0d0c9 100755
--- a/view/tpl/settings_account.tpl
+++ b/view/tpl/settings_account.tpl
@@ -12,7 +12,7 @@
{{include file="field_password.tpl" field=$password1}}
{{include file="field_password.tpl" field=$password2}}
- {{if $z_server_role == 'pro' && ! $techlock}}
+ {{if ! $techlock}}
{{include file="field_select.tpl" field=$techlevel}}
{{else}}
<input type="hidden" name="techlevel" value="{{$techlevel.2}}" />
diff --git a/view/tpl/webpagelist.tpl b/view/tpl/webpagelist.tpl
index fcf9de75a..1c909b9b8 100644
--- a/view/tpl/webpagelist.tpl
+++ b/view/tpl/webpagelist.tpl
@@ -31,7 +31,7 @@
<tr id="webpage-list-item-{{$item.url}}">
<td>
{{if $view}}
- <a href="page/{{$channel}}/{{$item.pagetitle}}" title="{{$view}}">{{$item.pagetitle}}</a>
+ <a href="page/{{$channel}}/{{$item.pageurl}}" title="{{$view}}">{{$item.pagetitle}}</a>
{{else}}
{{$item.pagetitle}}
{{/if}}
diff --git a/view/tpl/xrd_diaspora.tpl b/view/tpl/xrd_diaspora.tpl
deleted file mode 100644
index aa0d8c740..000000000
--- a/view/tpl/xrd_diaspora.tpl
+++ /dev/null
@@ -1,3 +0,0 @@
- <Link rel="http://joindiaspora.com/seed_location" type="text/html" href="{{$baseurl}}/" />
- <Link rel="http://joindiaspora.com/guid" type="text/html" href="{{$dspr_guid}}" />
- <Link rel="diaspora-public-key" type="RSA" href="{{$dspr_key}}" />
diff --git a/view/tpl/xrd_person.tpl b/view/tpl/xrd_person.tpl
index 93fdcb1df..52adb54e3 100755
--- a/view/tpl/xrd_person.tpl
+++ b/view/tpl/xrd_person.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>{{$accturi}}</Subject>
+ <Subject>{{$subject}}</Subject>
{{if $aliases}}{{foreach $aliases as $a}}
<Alias>{{$a}}</Alias>
{{/foreach}}{{/if}}
@@ -22,10 +22,7 @@
href="{{$hcard_url}}" />
<Link rel="http://ostatus.org/schema/1.0/subscribe"
template="{{$subscribe}}" />
-
- <Link rel="magic-public-key"
+ <Link rel="magic-public-key"
href="{{$modexp}}" />
- {{$dspr}}
-
</XRD>